public virtual void ExchangeDealingItemsAndGold()
        {
            if (CoCharacter == null)
            {
                return;
            }
            var tempDealingItems = new List <DealingCharacterItem>(DealingItems);

            for (var i = nonEquipItems.Count - 1; i >= 0; --i)
            {
                var nonEquipItem = nonEquipItems[i];
                for (var j = tempDealingItems.Count - 1; j >= 0; --j)
                {
                    var dealingItem = tempDealingItems[j];
                    if (dealingItem.nonEquipIndex == i && nonEquipItem.amount >= dealingItem.amount)
                    {
                        nonEquipItem.amount -= dealingItem.amount;
                        if (nonEquipItem.amount == 0)
                        {
                            nonEquipItems.RemoveAt(i);
                        }
                        else
                        {
                            nonEquipItems[i] = nonEquipItem;
                        }
                        CoCharacter.IncreaseItems(dealingItem.dataId, dealingItem.level, dealingItem.amount, dealingItem.durability);
                        tempDealingItems.RemoveAt(j);
                        break;
                    }
                }
            }
            Gold             -= DealingGold;
            CoCharacter.Gold += DealingGold;
        }
 protected virtual void StopDealing()
 {
     if (CoCharacter == null)
     {
         ClearDealingData();
         return;
     }
     // Set dealing state/data for co player character entity
     CoCharacter.ClearDealingData();
     CoCharacter.CoCharacter = null;
     // Set dealing state/data for player character entity
     ClearDealingData();
     CoCharacter = null;
 }
 protected virtual void NetFuncConfirmDealing()
 {
     if (DealingState != DealingState.LockDealing || !(CoCharacter.DealingState == DealingState.LockDealing || CoCharacter.DealingState == DealingState.ConfirmDealing))
     {
         GameManager.SendServerGameMessage(ConnectionId, GameMessage.Type.InvalidDealingState);
         return;
     }
     DealingState = DealingState.ConfirmDealing;
     if (DealingState == DealingState.ConfirmDealing && CoCharacter.DealingState == DealingState.ConfirmDealing)
     {
         ExchangeDealingItemsAndGold();
         CoCharacter.ExchangeDealingItemsAndGold();
         StopDealing();
     }
 }
 protected virtual void NetFuncAcceptDealingRequest()
 {
     if (CoCharacter == null)
     {
         GameManager.SendServerGameMessage(ConnectionId, GameMessage.Type.CannotAcceptDealingRequest);
         StopDealing();
         return;
     }
     if (Vector3.Distance(CacheTransform.position, CoCharacter.CacheTransform.position) > GameInstance.conversationDistance)
     {
         GameManager.SendServerGameMessage(ConnectionId, GameMessage.Type.CharacterIsTooFar);
         StopDealing();
         return;
     }
     // Set dealing state/data for co player character entity
     CoCharacter.ClearDealingData();
     CoCharacter.DealingState = DealingState.Dealing;
     CoCharacter.RequestAcceptedDealingRequest(ObjectId);
     // Set dealing state/data for player character entity
     ClearDealingData();
     DealingState = DealingState.Dealing;
     RequestAcceptedDealingRequest(CoCharacter.ObjectId);
 }
        protected virtual void NetFuncSendDealingRequest(PackedUInt objectId)
        {
            BasePlayerCharacterEntity targetCharacterEntity = null;

            if (!TryGetEntityByObjectId(objectId, out targetCharacterEntity))
            {
                GameManager.SendServerGameMessage(ConnectionId, GameMessage.Type.NotFoundCharacter);
                return;
            }
            if (targetCharacterEntity.CoCharacter != null)
            {
                GameManager.SendServerGameMessage(ConnectionId, GameMessage.Type.CharacterIsInAnotherDeal);
                return;
            }
            if (Vector3.Distance(CacheTransform.position, targetCharacterEntity.CacheTransform.position) > GameInstance.conversationDistance)
            {
                GameManager.SendServerGameMessage(ConnectionId, GameMessage.Type.CharacterIsTooFar);
                return;
            }
            CoCharacter = targetCharacterEntity;
            targetCharacterEntity.CoCharacter = this;
            // Send receive dealing request to player
            CoCharacter.RequestReceiveDealingRequest(ObjectId);
        }