Esempio n. 1
0
        /// <summary>
        /// 인자로 받은 아바타에 대한 상태 변경자를 더한다.
        /// </summary>
        /// <param name="avatarAddress"></param>
        /// <param name="modifier"></param>
        public void Add(Address avatarAddress, AvatarStateModifier modifier)
        {
            // FIXME: 다른 Add() 오버로드와 겹치는 로직이 아주 많음.
            if (modifier is null ||
                modifier.IsEmpty)
            {
                return;
            }

            var modifierInfo = _avatarModifierInfo?.Address.Equals(avatarAddress) ?? false
                ? _avatarModifierInfo
                : null;

            if (!(modifierInfo is null))
            {
                var modifiers = modifierInfo.Modifiers;
                if (TryGetSameTypeModifier(modifier, modifiers, out var outModifier))
                {
                    outModifier.Add(modifier);
                    if (outModifier.IsEmpty)
                    {
                        modifiers.Remove(outModifier);
                    }
                }
                else
                {
                    modifiers.Add(modifier);
                }
            }
        }
Esempio n. 2
0
        private static void RemoveItemInternal(Address avatarAddress, AvatarStateModifier modifier)
        {
            if (!TryGetLoadedAvatarState(
                    avatarAddress,
                    out var outAvatarState,
                    out _,
                    out var isCurrentAvatarState)
                )
            {
                return;
            }

            outAvatarState = modifier.Modify(outAvatarState);

            if (!isCurrentAvatarState)
            {
                return;
            }

            ReactiveAvatarState.Inventory.SetValueAndForceNotify(outAvatarState.inventory);
        }
Esempio n. 3
0
        /// <summary>
        /// 인자로 받은 아바타에 대한 상태 변경자를 뺀다.
        /// </summary>
        /// <param name="avatarAddress"></param>
        /// <param name="modifier"></param>
        public void Remove(Address avatarAddress, AvatarStateModifier modifier)
        {
            if (modifier is null ||
                modifier.IsEmpty)
            {
                return;
            }

            var modifierInfo = _avatarModifierInfo?.Address.Equals(avatarAddress) ?? false
                ? _avatarModifierInfo
                : null;

            if (!(modifierInfo is null))
            {
                var modifiers = modifierInfo.Modifiers;
                if (TryGetSameTypeModifier(modifier, modifiers, out var outModifier))
                {
                    outModifier.Remove(modifier);
                    if (outModifier.IsEmpty)
                    {
                        modifiers.Remove(outModifier);
                    }

                    modifier = outModifier;
                }
                else
                {
                    modifier = null;
                }
            }

            if (modifier is null)
            {
                Debug.LogWarning(
                    $"[{nameof(LocalLayer)}] No found {nameof(modifier)} of {nameof(avatarAddress)}");
            }
        }