public override IAccountStateDelta Execute(IActionContext context) { IActionContext ctx = context; var states = ctx.PreviousStates; if (ctx.Rehearsal) { return(states.SetState(avatarAddress, MarkChanged)); } CheckObsolete(BlockChain.Policy.BlockPolicySource.V100080ObsoleteIndex, context); var addressesHex = GetSignerAndOtherAddressesHex(context, avatarAddress); if (!states.TryGetAgentAvatarStates(ctx.Signer, avatarAddress, out _, out AvatarState avatarState)) { throw new FailedLoadStateException($"{addressesHex}Aborted as the avatar state of the signer was failed to load."); } var gameConfigState = states.GetGameConfigState(); if (gameConfigState is null) { throw new FailedLoadStateException($"{addressesHex}Aborted as the game config was failed to load."); } if (ctx.BlockIndex - avatarState.dailyRewardReceivedIndex >= gameConfigState.DailyRewardInterval) { avatarState.dailyRewardReceivedIndex = ctx.BlockIndex; avatarState.actionPoint = gameConfigState.ActionPointMax; } // create item var materialSheet = states.GetSheet <MaterialItemSheet>(); var materials = new Dictionary <Material, int>(); var material = ItemFactory.CreateMaterial(materialSheet, rewardItemId); materials[material] = rewardItemCount; var result = new DailyRewardResult { materials = materials, }; // create mail var mail = new DailyRewardMail(result, ctx.BlockIndex, ctx.Random.GenerateRandomGuid(), ctx.BlockIndex); result.id = mail.id; dailyRewardResult = result; avatarState.Update(mail); avatarState.UpdateFromAddItem2(material, rewardItemCount, false); return(states.SetState(avatarAddress, avatarState.Serialize())); }
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); }