mirror of
https://github.com/SoDOff-Project/sodoff.git
synced 2025-10-11 08:18:49 -07:00
bugfix: check item gender for mystery box rewards
This commit is contained in:
parent
6b12363dbd
commit
132057911f
@ -714,7 +714,8 @@ public class ContentController : Controller {
|
|||||||
--invItem.Quantity;
|
--invItem.Quantity;
|
||||||
|
|
||||||
// get real item id (from box) add it to inventory
|
// get real item id (from box) add it to inventory
|
||||||
itemService.OpenBox(req.ItemID, out int newItemId, out int quantity);
|
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||||
|
itemService.OpenBox(req.ItemID, gender, out int newItemId, out int quantity);
|
||||||
ItemData newItem = itemService.GetItem(newItemId);
|
ItemData newItem = itemService.GetItem(newItemId);
|
||||||
CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, quantity);
|
CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, quantity);
|
||||||
|
|
||||||
@ -745,6 +746,7 @@ public class ContentController : Controller {
|
|||||||
public IActionResult PurchaseItems(Viking viking, [FromForm] string purchaseItemRequest) {
|
public IActionResult PurchaseItems(Viking viking, [FromForm] string purchaseItemRequest) {
|
||||||
PurchaseStoreItemRequest request = XmlUtil.DeserializeXml<PurchaseStoreItemRequest>(purchaseItemRequest);
|
PurchaseStoreItemRequest request = XmlUtil.DeserializeXml<PurchaseStoreItemRequest>(purchaseItemRequest);
|
||||||
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
||||||
|
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||||
for (int i = 0; i < request.Items.Length; i++) {
|
for (int i = 0; i < request.Items.Length; i++) {
|
||||||
int itemId = request.Items[i];
|
int itemId = request.Items[i];
|
||||||
if (request.AddMysteryBoxToInventory) {
|
if (request.AddMysteryBoxToInventory) {
|
||||||
@ -760,7 +762,7 @@ public class ContentController : Controller {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// check for mystery box ... open if need
|
// check for mystery box ... open if need
|
||||||
itemService.CheckAndOpenBox(itemId, out itemId, out int quantity);
|
itemService.CheckAndOpenBox(itemId, gender, out itemId, out int quantity);
|
||||||
for (int j=0; j<quantity; ++j) {
|
for (int j=0; j<quantity; ++j) {
|
||||||
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
||||||
}
|
}
|
||||||
@ -784,8 +786,9 @@ public class ContentController : Controller {
|
|||||||
public IActionResult PurchaseItemsV1(Viking viking, [FromForm] string itemIDArrayXml) {
|
public IActionResult PurchaseItemsV1(Viking viking, [FromForm] string itemIDArrayXml) {
|
||||||
int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml);
|
int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml);
|
||||||
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
||||||
|
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||||
for (int i = 0; i < itemIdArr.Length; i++) {
|
for (int i = 0; i < itemIdArr.Length; i++) {
|
||||||
itemService.CheckAndOpenBox(itemIdArr[i], out int itemId, out int quantity);
|
itemService.CheckAndOpenBox(itemIdArr[i], gender, out int itemId, out int quantity);
|
||||||
for (int j=0; j<quantity; ++j) {
|
for (int j=0; j<quantity; ++j) {
|
||||||
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
||||||
// NOTE: The quantity of purchased items is always 0 and the items are instead duplicated in both the request and the response.
|
// NOTE: The quantity of purchased items is always 0 and the items are instead duplicated in both the request and the response.
|
||||||
@ -1095,11 +1098,12 @@ public class ContentController : Controller {
|
|||||||
// NOTE: we haven't saved any changes so far ... so we can safely interrupt "fusing" by return in loops above
|
// NOTE: we haven't saved any changes so far ... so we can safely interrupt "fusing" by return in loops above
|
||||||
|
|
||||||
var resItemList = new List<InventoryItemStatsMap>();
|
var resItemList = new List<InventoryItemStatsMap>();
|
||||||
|
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||||
foreach (BluePrintSpecification output in blueprintItem.BluePrint.Outputs) {
|
foreach (BluePrintSpecification output in blueprintItem.BluePrint.Outputs) {
|
||||||
if (output.ItemID is null)
|
if (output.ItemID is null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
itemService.CheckAndOpenBox((int)(output.ItemID), out int newItemId, out int quantity);
|
itemService.CheckAndOpenBox((int)(output.ItemID), gender, out int newItemId, out int quantity);
|
||||||
for (int i=0; i<quantity; ++i) {
|
for (int i=0; i<quantity; ++i) {
|
||||||
resItemList.Add(
|
resItemList.Add(
|
||||||
inventoryService.AddBattleItemToInventory(viking, newItemId, (int)output.Tier)
|
inventoryService.AddBattleItemToInventory(viking, newItemId, (int)output.Tier)
|
||||||
@ -1295,7 +1299,7 @@ public class ContentController : Controller {
|
|||||||
if (itemService.ItemHasCategory(rewardItem, 651) || rewardItem.PossibleStatsMap is null) {
|
if (itemService.ItemHasCategory(rewardItem, 651) || rewardItem.PossibleStatsMap is null) {
|
||||||
// blueprint or no battle item (including box)
|
// blueprint or no battle item (including box)
|
||||||
List<CommonInventoryResponseItem> standardItems = new List<CommonInventoryResponseItem>();
|
List<CommonInventoryResponseItem> standardItems = new List<CommonInventoryResponseItem>();
|
||||||
itemService.CheckAndOpenBox(rewardItem.ItemID, out int itemId, out int quantity);
|
itemService.CheckAndOpenBox(rewardItem.ItemID, gender, out int itemId, out int quantity);
|
||||||
for (int i=0; i<quantity; ++i) {
|
for (int i=0; i<quantity; ++i) {
|
||||||
standardItems.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
standardItems.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
||||||
// NOTE: client require single quantity items
|
// NOTE: client require single quantity items
|
||||||
|
@ -45,7 +45,7 @@ namespace sodoff.Services {
|
|||||||
return random.Next(1, (int)itemData.MaxQuantity + 1);
|
return random.Next(1, (int)itemData.MaxQuantity + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemDataRelationship OpenBox(ItemData boxItem) {
|
public ItemDataRelationship OpenBox(ItemData boxItem, Gender gender) {
|
||||||
var boxRewards = boxItem.Relationship.Where(e => e.Type == "Prize").ToArray();
|
var boxRewards = boxItem.Relationship.Where(e => e.Type == "Prize").ToArray();
|
||||||
int totalWeight = boxRewards.Sum(e => e.Weight);
|
int totalWeight = boxRewards.Sum(e => e.Weight);
|
||||||
if (totalWeight == 0) {
|
if (totalWeight == 0) {
|
||||||
@ -55,22 +55,27 @@ namespace sodoff.Services {
|
|||||||
int win = random.Next(0, totalWeight);
|
int win = random.Next(0, totalWeight);
|
||||||
foreach (var reward in boxRewards) {
|
foreach (var reward in boxRewards) {
|
||||||
cnt += reward.Weight;
|
cnt += reward.Weight;
|
||||||
if (cnt > win) {
|
if (cnt > win && CheckItemGender(items[reward.ItemId], gender)) {
|
||||||
|
return reward;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var reward in boxRewards) { // do again in case high `win` value and CheckItemGender fail
|
||||||
|
if (CheckItemGender(items[reward.ItemId], gender)) {
|
||||||
return reward;
|
return reward;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenBox(int boxItemId, out int itemId, out int quantity) {
|
public void OpenBox(int boxItemId, Gender gender, out int itemId, out int quantity) {
|
||||||
var reward = OpenBox(items[boxItemId]);
|
var reward = OpenBox(items[boxItemId], gender);
|
||||||
itemId = reward.ItemId;
|
itemId = reward.ItemId;
|
||||||
quantity = GetItemQuantity(reward);
|
quantity = GetItemQuantity(reward);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CheckAndOpenBox(int boxItemId, out int itemId, out int quantity) {
|
public void CheckAndOpenBox(int boxItemId, Gender gender, out int itemId, out int quantity) {
|
||||||
if (IsBoxItem(boxItemId)) {
|
if (IsBoxItem(boxItemId)) {
|
||||||
OpenBox(boxItemId, out itemId, out quantity);
|
OpenBox(boxItemId, gender, out itemId, out quantity);
|
||||||
} else {
|
} else {
|
||||||
itemId = boxItemId;
|
itemId = boxItemId;
|
||||||
quantity = 1;
|
quantity = 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user