mirror of
https://github.com/SoDOff-Project/sodoff.git
synced 2025-10-11 08:18:49 -07:00
support for mystery boxes and bundles
This commit is contained in:
parent
656f39398f
commit
5dbd28e83c
@ -83,6 +83,7 @@ Then run School of Dragons.
|
|||||||
- FuseItems
|
- FuseItems
|
||||||
- AddBattleItems
|
- AddBattleItems
|
||||||
- SetAchievementByEntityIDs
|
- SetAchievementByEntityIDs
|
||||||
|
- RedeemMysteryBoxItems
|
||||||
|
|
||||||
#### Implemented enough (probably)
|
#### Implemented enough (probably)
|
||||||
- GetRules (doesn't return any rules, probably doesn't need to)
|
- GetRules (doesn't return any rules, probably doesn't need to)
|
||||||
|
@ -80,6 +80,7 @@ methods = [
|
|||||||
'SetUserAchievementAndGetReward',
|
'SetUserAchievementAndGetReward',
|
||||||
'ProcessRewardedItems',
|
'ProcessRewardedItems',
|
||||||
'ApplyPayout',
|
'ApplyPayout',
|
||||||
|
'RedeemMysteryBoxItems',
|
||||||
]
|
]
|
||||||
|
|
||||||
def routable(path):
|
def routable(path):
|
||||||
|
@ -607,22 +607,73 @@ public class ContentController : Controller {
|
|||||||
return Ok(new BuddyList { Buddy = new Buddy[0] });
|
return Ok(new BuddyList { Buddy = new Buddy[0] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[Produces("application/xml")]
|
||||||
|
[Route("/ContentWebService.asmx/RedeemMysteryBoxItems")]
|
||||||
|
[VikingSession]
|
||||||
|
public IActionResult RedeemMysteryBoxItems(Viking viking, [FromForm] string request) {
|
||||||
|
var req = XmlUtil.DeserializeXml<RedeemRequest>(request);
|
||||||
|
|
||||||
|
// get and reduce quantity of box item
|
||||||
|
InventoryItem? invItem = viking.Inventory.InventoryItems.FirstOrDefault(e => e.ItemId == req.ItemID);
|
||||||
|
if (invItem is null || invItem.Quantity < 1) {
|
||||||
|
return Ok(new CommonInventoryResponse{ Success = false });
|
||||||
|
}
|
||||||
|
--invItem.Quantity;
|
||||||
|
|
||||||
|
// get real item id (from box) and add it to inventory
|
||||||
|
ItemData boxItem = itemService.GetItem(req.ItemID);
|
||||||
|
ItemData newItem = itemService.GetItem(itemService.OpenBox(boxItem).ItemId);
|
||||||
|
CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, 1);
|
||||||
|
|
||||||
|
// prepare list of possible rewards for response
|
||||||
|
List<ItemData> prizeItems = new List<ItemData>();
|
||||||
|
prizeItems.Add(newItem);
|
||||||
|
foreach (var reward in boxItem.Relationship.Where(e => e.Type == "Prize")) {
|
||||||
|
if (prizeItems.Count >= req.RedeemItemFetchCount)
|
||||||
|
break;
|
||||||
|
prizeItems.Add(itemService.GetItem(reward.ItemId));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(new CommonInventoryResponse{
|
||||||
|
Success = true,
|
||||||
|
CommonInventoryIDs = new CommonInventoryResponseItem[]{ newInvItem },
|
||||||
|
PrizeItems = new List<PrizeItemResponse>{ new PrizeItemResponse{
|
||||||
|
ItemID = req.ItemID,
|
||||||
|
PrizeItemID = newItem.ItemID,
|
||||||
|
MysteryPrizeItems = prizeItems,
|
||||||
|
}}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Produces("application/xml")]
|
[Produces("application/xml")]
|
||||||
[Route("V2/ContentWebService.asmx/PurchaseItems")]
|
[Route("V2/ContentWebService.asmx/PurchaseItems")]
|
||||||
[VikingSession]
|
[VikingSession]
|
||||||
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);
|
||||||
CommonInventoryResponseItem[] items = new CommonInventoryResponseItem[request.Items.Length];
|
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
|
||||||
for (int i = 0; i < request.Items.Length; i++) {
|
for (int i = 0; i < request.Items.Length; i++) {
|
||||||
items[i] = inventoryService.AddItemToInventoryAndGetResponse(viking, request.Items[i], 1);
|
int itemId = request.Items[i];
|
||||||
|
if (itemService.IsBundleItem(itemId) && !request.AddMysteryBoxToInventory) {
|
||||||
|
ItemData bundleItem = itemService.GetItem(itemId);
|
||||||
|
foreach (var reward in bundleItem.Relationship.Where(e => e.Type == "Bundle")) {
|
||||||
|
int quantity = reward.Quantity;
|
||||||
|
if (quantity == 0)
|
||||||
|
quantity = 1;
|
||||||
|
for (int j=0; j<quantity; ++j)
|
||||||
|
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, reward.ItemId, 1));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
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.
|
||||||
// Call AddItemToInventoryAndGetResponse with Quantity == 1 we get response with quantity == 0.
|
// Call AddItemToInventoryAndGetResponse with Quantity == 1 we get response with quantity == 0.
|
||||||
}
|
}
|
||||||
|
|
||||||
CommonInventoryResponse response = new CommonInventoryResponse {
|
CommonInventoryResponse response = new CommonInventoryResponse {
|
||||||
Success = true,
|
Success = true,
|
||||||
CommonInventoryIDs = items,
|
CommonInventoryIDs = items.ToArray(),
|
||||||
UserGameCurrency = achievementService.GetUserCurrency(viking)
|
UserGameCurrency = achievementService.GetUserCurrency(viking)
|
||||||
};
|
};
|
||||||
return Ok(response);
|
return Ok(response);
|
||||||
@ -636,7 +687,11 @@ public class ContentController : Controller {
|
|||||||
int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml);
|
int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml);
|
||||||
CommonInventoryResponseItem[] items = new CommonInventoryResponseItem[itemIdArr.Length];
|
CommonInventoryResponseItem[] items = new CommonInventoryResponseItem[itemIdArr.Length];
|
||||||
for (int i = 0; i < itemIdArr.Length; i++) {
|
for (int i = 0; i < itemIdArr.Length; i++) {
|
||||||
items[i] = inventoryService.AddItemToInventoryAndGetResponse(viking, itemIdArr[i], 1);
|
int itemId = itemIdArr[i];
|
||||||
|
if (itemService.IsBoxItem(itemId)) {
|
||||||
|
itemId = itemService.OpenBox(itemId).ItemId;
|
||||||
|
}
|
||||||
|
items[i] = 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.
|
||||||
// Call AddItemToInventoryAndGetResponse with Quantity == 1 we get response with quantity == 0.
|
// Call AddItemToInventoryAndGetResponse with Quantity == 1 we get response with quantity == 0.
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,18 @@ namespace sodoff.Services {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ItemDataRelationship OpenBox(int boxItemId) {
|
||||||
|
return OpenBox(items[boxItemId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsBoxItem(int itemId) {
|
||||||
|
return items[itemId].Relationship?.FirstOrDefault(e => e.Type == "Prize") != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsBundleItem(int itemId) {
|
||||||
|
return items[itemId].Relationship?.FirstOrDefault(e => e.Type == "Bundle") != null;
|
||||||
|
}
|
||||||
|
|
||||||
public bool CheckItemGender(ItemData itemData, Gender gender) {
|
public bool CheckItemGender(ItemData itemData, Gender gender) {
|
||||||
string? itemGender = itemData.Attribute?.FirstOrDefault(e => e.Key == "Gender")?.Value;
|
string? itemGender = itemData.Attribute?.FirstOrDefault(e => e.Key == "Gender")?.Value;
|
||||||
if (itemGender != null) {
|
if (itemGender != null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user