public void Read(CombinationMail mail) { var avatarAddress = States.Instance.CurrentAvatarState.address; var attachment = (CombinationConsumable.ResultModel)mail.attachment; var itemBase = attachment.itemUsable ?? (ItemBase)attachment.costume; var nonFungibleItem = attachment.itemUsable ?? (INonFungibleItem)attachment.costume; var popup = Find <CombinationResultPopup>(); var materialItems = attachment.materials .Select(pair => new { pair, item = pair.Key }) .Select(t => new CombinationMaterial( t.item, t.pair.Value, t.pair.Value, t.pair.Value)) .ToList(); var model = new UI.Model.CombinationResultPopup(new CountableItem(itemBase, 1)) { isSuccess = true, materialItems = materialItems }; model.OnClickSubmit.Subscribe(_ => { LocalLayerModifier.AddItem(avatarAddress, nonFungibleItem.ItemId, false); LocalLayerModifier.RemoveNewAttachmentMail(avatarAddress, mail.id, false); LocalLayerModifier.RemoveAttachmentResult(avatarAddress, mail.id); LocalLayerModifier.ModifyAvatarItemRequiredIndex( avatarAddress, nonFungibleItem.ItemId, Game.Game.instance.Agent.BlockIndex); }); popup.Pop(model); }
public void Read(SellCancelMail mail) { var avatarAddress = States.Instance.CurrentAvatarState.address; var attachment = (SellCancellation.Result)mail.attachment; var itemBase = attachment.itemUsable ?? (ItemBase)attachment.costume; var nonFungibleItem = attachment.itemUsable ?? (INonFungibleItem)attachment.costume; //TODO 관련 기획이 끝나면 별도 UI를 생성 var popup = Find <ItemCountAndPricePopup>(); var model = new UI.Model.ItemCountAndPricePopup(); model.TitleText.Value = L10nManager.Localize("UI_RETRIEVE"); model.InfoText.Value = L10nManager.Localize("UI_SELL_CANCEL_INFO"); model.PriceInteractable.Value = false; model.Price.Value = attachment.shopItem.Price; model.CountEnabled.Value = false; model.Item.Value = new CountEditableItem(itemBase, 1, 1, 1); model.OnClickSubmit.Subscribe(_ => { LocalLayerModifier.AddItem(avatarAddress, nonFungibleItem.ItemId, false); LocalLayerModifier.RemoveNewAttachmentMail(avatarAddress, mail.id); popup.Close(); }).AddTo(gameObject); model.OnClickCancel.Subscribe(_ => { //TODO 재판매 처리추가되야함\ LocalLayerModifier.AddItem(avatarAddress, nonFungibleItem.ItemId, false); LocalLayerModifier.RemoveNewAttachmentMail(avatarAddress, mail.id); popup.Close(); }).AddTo(gameObject); popup.Pop(model); }
private static void UpdateLocalState(int questId, Dictionary <int, int> rewards) { if (rewards is null) { var sb = new StringBuilder($"[{nameof(CelebratesPopup)}]"); sb.Append($"Argument {nameof(rewards)} is null."); Debug.LogError(sb.ToString()); return; } var avatarAddress = States.Instance.CurrentAvatarState.address; foreach (var reward in rewards) { var materialRow = Game.Game.instance.TableSheets.MaterialItemSheet .First(pair => pair.Key == reward.Key); LocalLayerModifier.AddItem( avatarAddress, materialRow.Value.ItemId, reward.Value, false); } LocalLayerModifier.RemoveReceivableQuest(avatarAddress, questId); }
private void ResponseUnrenderItemEnhancement(ActionBase.ActionEvaluation <ItemEnhancement5> eval) { var agentAddress = eval.Signer; var avatarAddress = eval.Action.avatarAddress; var slot = eval.OutputStates.GetCombinationSlotState(avatarAddress, eval.Action.slotIndex); var result = (ItemEnhancement.ResultModel)slot.Result; var itemUsable = result.itemUsable; var avatarState = eval.OutputStates.GetAvatarState(avatarAddress); // NOTE: 사용한 자원에 대한 레이어 다시 추가하기. LocalLayerModifier.ModifyAgentGold(agentAddress, -result.gold); LocalLayerModifier.RemoveItem(avatarAddress, itemUsable.ItemId); foreach (var itemId in result.materialItemIdList) { // NOTE: 최종적으로 UpdateCurrentAvatarState()를 호출한다면, 그곳에서 상태를 새로 설정할 것이다. LocalLayerModifier.RemoveItem(avatarAddress, itemId); } // NOTE: 메일 레이어 다시 없애기. LocalLayerModifier.AddItem(avatarAddress, itemUsable.ItemId, false); LocalLayerModifier.RemoveNewAttachmentMail(avatarAddress, result.id); // NOTE: 워크샵 슬롯의 모든 휘발성 상태 변경자를 다시 추가하기. var otherItemId = result.materialItemIdList.First(); LocalLayerModifier.ModifyCombinationSlotItemEnhancement( itemUsable.ItemId, otherItemId, eval.Action.slotIndex); UpdateAgentState(eval); UpdateCurrentAvatarState(eval); UpdateCombinationSlotState(slot); UnrenderQuest(avatarAddress, avatarState.questList.completedQuestIds); }
private void ResponseItemEnhancement(ActionBase.ActionEvaluation <ItemEnhancement> eval) { if (eval.Exception is null) { var agentAddress = eval.Signer; var avatarAddress = eval.Action.avatarAddress; var slot = eval.OutputStates.GetCombinationSlotState(avatarAddress, eval.Action.slotIndex); var result = (ItemEnhancement.ResultModel)slot.Result; var itemUsable = result.itemUsable; var avatarState = eval.OutputStates.GetAvatarState(avatarAddress); // NOTE: 사용한 자원에 대한 레이어 벗기기. LocalLayerModifier.ModifyAgentGold(agentAddress, result.gold); LocalLayerModifier.AddItem(avatarAddress, itemUsable.ItemId, false); foreach (var itemId in result.materialItemIdList) { // NOTE: 최종적으로 UpdateCurrentAvatarState()를 호출한다면, 그곳에서 상태를 새로 설정할 것이다. LocalLayerModifier.AddItem(avatarAddress, itemId, false); } // NOTE: 메일 레이어 씌우기. LocalLayerModifier.RemoveItem(avatarAddress, itemUsable.ItemId); LocalLayerModifier.AddNewAttachmentMail(avatarAddress, result.id); // NOTE: 워크샵 슬롯의 모든 휘발성 상태 변경자를 제거하기. LocalLayerModifier.ResetCombinationSlot(slot); // NOTE: 노티 예약 걸기. var format = L10nManager.Localize("NOTIFICATION_ITEM_ENHANCEMENT_COMPLETE"); UI.Notification.Reserve( MailType.Workshop, string.Format(format, result.itemUsable.GetLocalizedName()), slot.UnlockBlockIndex, result.itemUsable.ItemId); //[TentuPlay] 장비강화, 골드사용 //Local에서 변경하는 States.Instance 보다는 블락에서 꺼내온 eval.OutputStates를 사용 if (eval.OutputStates.TryGetGoldBalance(agentAddress, GoldCurrency, out var outAgentBalance)) { var total = outAgentBalance - new FungibleAssetValue(outAgentBalance.Currency, result.gold, 0); new TPStashEvent().CharacterCurrencyUse( player_uuid: agentAddress.ToHex(), character_uuid: States.Instance.CurrentAvatarState.address.ToHex().Substring(0, 4), currency_slug: "gold", currency_quantity: (float)result.gold, currency_total_quantity: float.Parse(total.GetQuantityString()), reference_entity: entity.Items, //강화가 가능하므로 장비 reference_category_slug: "item_enhancement", reference_slug: itemUsable.Id.ToString()); } UpdateAgentState(eval); UpdateCurrentAvatarState(eval); UpdateCombinationSlotState(slot); RenderQuest(avatarAddress, avatarState.questList.completedQuestIds); } }
private void ResponseCombinationConsumable(ActionBase.ActionEvaluation <CombinationConsumable> eval) { if (eval.Exception is null) { var agentAddress = eval.Signer; var avatarAddress = eval.Action.AvatarAddress; var slot = eval.OutputStates.GetCombinationSlotState(avatarAddress, eval.Action.slotIndex); var result = (CombinationConsumable.ResultModel)slot.Result; var itemUsable = result.itemUsable; var avatarState = eval.OutputStates.GetAvatarState(avatarAddress); LocalLayerModifier.ModifyAgentGold(agentAddress, result.gold); LocalLayerModifier.ModifyAvatarActionPoint(avatarAddress, result.actionPoint); foreach (var pair in result.materials) { // NOTE: 최종적으로 UpdateCurrentAvatarState()를 호출한다면, 그곳에서 상태를 새로 설정할 것이다. LocalLayerModifier.AddItem(avatarAddress, pair.Key.ItemId, pair.Value, false); } LocalLayerModifier.RemoveItem(avatarAddress, itemUsable.ItemId); LocalLayerModifier.AddNewAttachmentMail(avatarAddress, result.id); LocalLayerModifier.ResetCombinationSlot(slot); var format = L10nManager.Localize("NOTIFICATION_COMBINATION_COMPLETE"); UI.Notification.Reserve( MailType.Workshop, string.Format(format, result.itemUsable.GetLocalizedName()), slot.UnlockBlockIndex, result.itemUsable.ItemId ); AnalyticsManager.Instance.OnEvent(AnalyticsManager.EventName.ActionCombinationSuccess); //[TentuPlay] Consumable 합성에 사용한 골드 기록 //Local에서 변경하는 States.Instance 보다는 블락에서 꺼내온 eval.OutputStates를 사용 if (eval.OutputStates.TryGetGoldBalance(agentAddress, GoldCurrency, out var balance)) { var total = balance - new FungibleAssetValue(balance.Currency, result.gold, 0); new TPStashEvent().CharacterCurrencyUse( player_uuid: agentAddress.ToHex(), character_uuid: States.Instance.CurrentAvatarState.address.ToHex().Substring(0, 4), currency_slug: "gold", currency_quantity: (float)result.gold, currency_total_quantity: float.Parse(total.GetQuantityString()), reference_entity: entity.Items, reference_category_slug: "consumables_combination", reference_slug: result.itemUsable.Id.ToString()); } UpdateAgentState(eval); UpdateCurrentAvatarState(eval); UpdateCombinationSlotState(slot); RenderQuest(avatarAddress, avatarState.questList.completedQuestIds); } }
private void ResponseChargeActionPoint(ActionBase.ActionEvaluation <ChargeActionPoint> eval) { if (eval.Exception is null) { var avatarAddress = eval.Action.avatarAddress; LocalLayerModifier.ModifyAvatarActionPoint(avatarAddress, -States.Instance.GameConfigState.ActionPointMax); var row = Game.Game.instance.TableSheets.MaterialItemSheet.Values.First(r => r.ItemSubType == ItemSubType.ApStone); LocalLayerModifier.AddItem(avatarAddress, row.ItemId, 1); UpdateCurrentAvatarState(eval); } }
private void ResponseSellCancellation(ActionBase.ActionEvaluation <SellCancellation4> eval) { if (!(eval.Exception is null)) { return; } var result = eval.Action.result; var nonFungibleItem = result.itemUsable ?? (INonFungibleItem)result.costume; var avatarAddress = eval.Action.sellerAvatarAddress; var itemId = nonFungibleItem.ItemId; LocalLayerModifier.AddItem(avatarAddress, itemId); UpdateCurrentAvatarState(eval); }
private void ResponseDailyReward(ActionBase.ActionEvaluation <DailyReward> eval) { if (!(eval.Exception is null)) { return; } var avatarAddress = eval.Action.avatarAddress; var itemId = eval.Action.dailyRewardResult.materials.First().Key.ItemId; var itemCount = eval.Action.dailyRewardResult.materials.First().Value; LocalLayerModifier.AddItem(avatarAddress, itemId, itemCount); UpdateCurrentAvatarState(eval); WidgetHandler.Instance.Menu.SetActiveActionPointLoading(true); }
private void ResponseBuy(ActionBase.ActionEvaluation <Buy4> eval) { if (!(eval.Exception is null)) { return; } var buyerAvatarAddress = eval.Action.buyerAvatarAddress; var price = eval.Action.sellerResult.shopItem.Price; Address renderQuestAvatarAddress; List <int> renderQuestCompletedQuestIds; if (buyerAvatarAddress == States.Instance.CurrentAvatarState.address) { var buyerAgentAddress = States.Instance.AgentState.address; var result = eval.Action.buyerResult; var itemId = result.itemUsable?.ItemId ?? result.costume.ItemId; var buyerAvatar = eval.OutputStates.GetAvatarState(buyerAvatarAddress); LocalLayerModifier.ModifyAgentGold(buyerAgentAddress, -price); LocalLayerModifier.AddItem(buyerAvatarAddress, itemId); LocalLayerModifier.RemoveNewAttachmentMail(buyerAvatarAddress, result.id); renderQuestAvatarAddress = buyerAvatarAddress; renderQuestCompletedQuestIds = buyerAvatar.questList.completedQuestIds; } else { var sellerAvatarAddress = eval.Action.sellerAvatarAddress; var sellerAgentAddress = eval.Action.sellerAgentAddress; var result = eval.Action.sellerResult; var gold = result.gold; var sellerAvatar = eval.OutputStates.GetAvatarState(sellerAvatarAddress); LocalLayerModifier.ModifyAgentGold(sellerAgentAddress, gold); LocalLayerModifier.RemoveNewAttachmentMail(sellerAvatarAddress, result.id); renderQuestAvatarAddress = sellerAvatarAddress; renderQuestCompletedQuestIds = sellerAvatar.questList.completedQuestIds; } UpdateAgentState(eval); UpdateCurrentAvatarState(eval); UnrenderQuest(renderQuestAvatarAddress, renderQuestCompletedQuestIds); }
public void Read(DailyRewardMail dailyRewardMail) { var avatarAddress = States.Instance.CurrentAvatarState.address; var attachment = (DailyReward.DailyRewardResult)dailyRewardMail.attachment; var popup = Find <DailyRewardItemPopup>(); var materials = attachment.materials; var material = materials.First(); var model = new UI.Model.ItemCountConfirmPopup(); model.TitleText.Value = L10nManager.Localize("UI_DAILY_REWARD_POPUP_TITLE"); model.Item.Value = new CountEditableItem(material.Key, material.Value, material.Value, material.Value); model.OnClickSubmit.Subscribe(_ => { LocalLayerModifier.AddItem(avatarAddress, material.Key.ItemId, material.Value, false); LocalLayerModifier.RemoveNewAttachmentMail(avatarAddress, dailyRewardMail.id); popup.Close(); }).AddTo(gameObject); popup.Pop(model); }
public void Read(ItemEnhanceMail itemEnhanceMail) { var avatarAddress = States.Instance.CurrentAvatarState.address; var attachment = (ItemEnhancement.ResultModel)itemEnhanceMail.attachment; var popup = Find <CombinationResultPopup>(); var itemBase = attachment.itemUsable ?? (ItemBase)attachment.costume; var nonFungibleItem = attachment.itemUsable ?? (INonFungibleItem)attachment.costume; var model = new UI.Model.CombinationResultPopup(new CountableItem(itemBase, 1)) { isSuccess = true, materialItems = new List <CombinationMaterial>() }; model.OnClickSubmit.Subscribe(_ => { LocalLayerModifier.AddItem(avatarAddress, nonFungibleItem.ItemId, false); LocalLayerModifier.RemoveNewAttachmentMail(avatarAddress, itemEnhanceMail.id); }); popup.Pop(model); }
private void ResponseRapidCombination(ActionBase.ActionEvaluation <RapidCombination2> eval) { var avatarAddress = eval.Action.avatarAddress; var slot = eval.OutputStates.GetCombinationSlotState(avatarAddress, eval.Action.slotIndex); var result = (RapidCombination.ResultModel)slot.Result; foreach (var pair in result.cost) { // NOTE: 최종적으로 UpdateCurrentAvatarState()를 호출한다면, 그곳에서 상태를 새로 설정할 것이다. LocalLayerModifier.AddItem(avatarAddress, pair.Key.ItemId, pair.Value, false); } LocalLayerModifier.RemoveAvatarItemRequiredIndex(avatarAddress, result.itemUsable.ItemId); LocalLayerModifier.ResetCombinationSlot(slot); AnalyticsManager.Instance.OnEvent(AnalyticsManager.EventName.ActionCombinationSuccess); //[TentuPlay] RapidCombinationConsumable 합성에 사용한 골드 기록 //Local에서 변경하는 States.Instance 보다는 블락에서 꺼내온 eval.OutputStates를 사용 var agentAddress = eval.Signer; var qty = eval.OutputStates.GetAvatarState(avatarAddress).inventory.Materials .Count(i => i.ItemSubType == ItemSubType.Hourglass); var prevQty = eval.PreviousStates.GetAvatarState(avatarAddress).inventory.Materials .Count(i => i.ItemSubType == ItemSubType.Hourglass); new TPStashEvent().CharacterItemUse( player_uuid: agentAddress.ToHex(), character_uuid: States.Instance.CurrentAvatarState.address.ToHex().Substring(0, 4), item_category: itemCategory.Consumable, item_slug: "hourglass", item_quantity: (float)(prevQty - qty), reference_entity: entity.Items, reference_category_slug: "consumables_rapid_combination", reference_slug: slot.Result.itemUsable.Id.ToString() ); UpdateAgentState(eval); UpdateCurrentAvatarState(eval); UpdateCombinationSlotState(slot); }
private void ResponseSell(ActionBase.ActionEvaluation <Sell> eval) { if (eval.Exception is null) { var avatarAddress = eval.Action.sellerAvatarAddress; var itemId = eval.Action.itemId; // NOTE: 최종적으로 UpdateCurrentAvatarState()를 호출한다면, 그곳에서 상태를 새로 설정할 것이다. LocalLayerModifier.AddItem(avatarAddress, itemId, false); var format = L10nManager.Localize("NOTIFICATION_SELL_COMPLETE"); var shopState = new ShopState((Dictionary)eval.OutputStates.GetState(ShopState.Address)); var shopItem = shopState.Products.Values.First(r => { var nonFungibleItem = r.ItemUsable ?? (INonFungibleItem)r.Costume; return(nonFungibleItem.ItemId == itemId); }); var itemBase = shopItem.ItemUsable ?? (ItemBase)shopItem.Costume; UI.Notification.Push(MailType.Auction, string.Format(format, itemBase.GetLocalizedName())); UpdateCurrentAvatarState(eval); } }
private void ResponseCombinationEquipment(ActionBase.ActionEvaluation <CombinationEquipment> eval) { if (eval.Exception is null) { var agentAddress = eval.Signer; var avatarAddress = eval.Action.AvatarAddress; var slot = eval.OutputStates.GetCombinationSlotState(avatarAddress, eval.Action.SlotIndex); var result = (CombinationConsumable.ResultModel)slot.Result; var avatarState = eval.OutputStates.GetAvatarState(avatarAddress); // NOTE: 사용한 자원에 대한 레이어 벗기기. LocalLayerModifier.ModifyAgentGold(agentAddress, result.gold); LocalLayerModifier.ModifyAvatarActionPoint(avatarAddress, result.actionPoint); foreach (var pair in result.materials) { // NOTE: 최종적으로 UpdateCurrentAvatarState()를 호출한다면, 그곳에서 상태를 새로 설정할 것이다. LocalLayerModifier.AddItem(avatarAddress, pair.Key.ItemId, pair.Value, false); } // NOTE: 메일 레이어 씌우기. LocalLayerModifier.RemoveItem(avatarAddress, result.itemUsable.ItemId); LocalLayerModifier.AddNewAttachmentMail(avatarAddress, result.id); LocalLayerModifier.ResetCombinationSlot(slot); // NOTE: 노티 예약 걸기. var format = L10nManager.Localize("NOTIFICATION_COMBINATION_COMPLETE"); UI.Notification.Reserve( MailType.Workshop, string.Format(format, result.itemUsable.GetLocalizedName()), slot.UnlockBlockIndex, result.itemUsable.ItemId); AnalyticsManager.Instance.OnEvent(AnalyticsManager.EventName.ActionCombinationSuccess); //[TentuPlay] Equipment 합성에 사용한 골드 기록 //Local에서 변경하는 States.Instance 보다는 블락에서 꺼내온 eval.OutputStates를 사용 if (eval.OutputStates.TryGetGoldBalance(agentAddress, GoldCurrency, out var balance)) { var total = balance - new FungibleAssetValue(balance.Currency, result.gold, 0); new TPStashEvent().CharacterCurrencyUse( player_uuid: agentAddress.ToHex(), character_uuid: States.Instance.CurrentAvatarState.address.ToHex().Substring(0, 4), currency_slug: "gold", currency_quantity: (float)result.gold, currency_total_quantity: float.Parse(total.GetQuantityString()), reference_entity: entity.Items, reference_category_slug: "equipments_combination", reference_slug: result.itemUsable.Id.ToString()); } var gameInstance = Game.Game.instance; var nextQuest = gameInstance.States.CurrentAvatarState.questList? .OfType <CombinationEquipmentQuest>() .Where(x => !x.Complete) .OrderBy(x => x.StageId) .FirstOrDefault(x => gameInstance.TableSheets.EquipmentItemRecipeSheet.TryGetValue(x.RecipeId, out _)); UpdateAgentState(eval); UpdateCurrentAvatarState(eval); RenderQuest(avatarAddress, avatarState.questList.completedQuestIds); UpdateCombinationSlotState(slot); if (!(nextQuest is null)) { var isRecipeMatch = nextQuest.RecipeId == eval.Action.RecipeId; if (isRecipeMatch) { var celebratesPopup = Widget.Find <CelebratesPopup>(); celebratesPopup.Show(nextQuest); celebratesPopup.OnDisableObservable .First() .Subscribe(_ => { var menu = Widget.Find <Menu>(); if (menu.isActiveAndEnabled) { menu.UpdateGuideQuest(avatarState); } var combination = Widget.Find <Combination>(); if (combination.isActiveAndEnabled) { combination.UpdateRecipe(); } }); } } } }