/// <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); } } }
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); }
/// <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)}"); } }