Пример #1
0
        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()));
        }
Пример #2
0
        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);
        }