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;
|
||||
|
||||
// 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);
|
||||
CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, quantity);
|
||||
|
||||
@ -745,6 +746,7 @@ public class ContentController : Controller {
|
||||
public IActionResult PurchaseItems(Viking viking, [FromForm] string purchaseItemRequest) {
|
||||
PurchaseStoreItemRequest request = XmlUtil.DeserializeXml<PurchaseStoreItemRequest>(purchaseItemRequest);
|
||||
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
||||
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||
for (int i = 0; i < request.Items.Length; i++) {
|
||||
int itemId = request.Items[i];
|
||||
if (request.AddMysteryBoxToInventory) {
|
||||
@ -760,7 +762,7 @@ public class ContentController : Controller {
|
||||
}
|
||||
} else {
|
||||
// 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) {
|
||||
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
||||
}
|
||||
@ -784,8 +786,9 @@ public class ContentController : Controller {
|
||||
public IActionResult PurchaseItemsV1(Viking viking, [FromForm] string itemIDArrayXml) {
|
||||
int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml);
|
||||
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
||||
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||
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) {
|
||||
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.
|
||||
@ -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
|
||||
|
||||
var resItemList = new List<InventoryItemStatsMap>();
|
||||
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
|
||||
foreach (BluePrintSpecification output in blueprintItem.BluePrint.Outputs) {
|
||||
if (output.ItemID is null)
|
||||
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) {
|
||||
resItemList.Add(
|
||||
inventoryService.AddBattleItemToInventory(viking, newItemId, (int)output.Tier)
|
||||
@ -1295,7 +1299,7 @@ public class ContentController : Controller {
|
||||
if (itemService.ItemHasCategory(rewardItem, 651) || rewardItem.PossibleStatsMap is null) {
|
||||
// blueprint or no battle item (including box)
|
||||
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) {
|
||||
standardItems.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
|
||||
// NOTE: client require single quantity items
|
||||
|
@ -45,7 +45,7 @@ namespace sodoff.Services {
|
||||
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();
|
||||
int totalWeight = boxRewards.Sum(e => e.Weight);
|
||||
if (totalWeight == 0) {
|
||||
@ -55,22 +55,27 @@ namespace sodoff.Services {
|
||||
int win = random.Next(0, totalWeight);
|
||||
foreach (var reward in boxRewards) {
|
||||
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 null;
|
||||
}
|
||||
|
||||
public void OpenBox(int boxItemId, out int itemId, out int quantity) {
|
||||
var reward = OpenBox(items[boxItemId]);
|
||||
public void OpenBox(int boxItemId, Gender gender, out int itemId, out int quantity) {
|
||||
var reward = OpenBox(items[boxItemId], gender);
|
||||
itemId = reward.ItemId;
|
||||
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)) {
|
||||
OpenBox(boxItemId, out itemId, out quantity);
|
||||
OpenBox(boxItemId, gender, out itemId, out quantity);
|
||||
} else {
|
||||
itemId = boxItemId;
|
||||
quantity = 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user