public TradePartner(Character pOwner, DbBusiness dbBusiness)
 {
     m_pOwner     = pOwner;
     m_dbObj      = dbBusiness;
     m_dwIdentity = dbBusiness.Business;
     m_szName     = dbBusiness.Name;
     m_dwAddDate  = dbBusiness.Date;
     m_pPacket    = new MsgTradeBuddy
     {
         Identity  = m_dwIdentity,
         Name      = m_szName,
         HoursLeft = HoursLeft,
         Online    = TargetOnline
     };
 }
        public bool Create(uint idTarget)
        {
            Client target;

            if (!ServerKernel.Players.TryGetValue(idTarget, out target))
            {
                //m_pOwner.Send("The target is not online.");
                return(false);
            }

            if (target.Character == null)
            {
                return(false);
            }

            m_dwIdentity = target.Character.Identity;
            m_szName     = target.Character.Name;
            m_dwAddDate  = (uint)UnixTimestamp.Timestamp();

            new BusinessRepository().SaveOrUpdate(new DbBusiness
            {
                Userid   = m_pOwner.Identity,
                Business = m_dwIdentity,
                Date     = m_dwAddDate,
                Name     = m_szName // target name
            });

            m_pOwner.TradePartners.TryAdd(idTarget, this);

            m_pPacket = new MsgTradeBuddy
            {
                Identity  = m_dwIdentity,
                Name      = m_szName,
                HoursLeft = (int)(((UnixTimestamp.Timestamp() + UnixTimestamp.TIME_SECONDS_DAY * 3) - m_dwAddDate) / 60 / 60),
                Type      = TradePartnerType.ADD_PARTNER,
                Online    = TargetOnline
            };
            m_pOwner.Send(m_pPacket);
            return(true);
        }
        public static void HandleTradeBuddy(Character pRole, MsgTradeBuddy pMsg)
        {
            switch (pMsg.Type)
            {
                #region Request Partnership
            case TradePartnerType.REQUEST_PARTNERSHIP:
            {
                Client pTargetUser;
                if (!ServerKernel.Players.TryGetValue(pMsg.Identity, out pTargetUser))
                {
                    pRole.Send(ServerString.STR_TRADE_BUDDY_NOT_FOUND);
                    return;
                }

                Character pRoleTarget = pTargetUser.Character;
                if (pRoleTarget == null)
                {
                    return;
                }

                if (pRole.FetchTradeBuddyRequest(pRoleTarget.Identity))
                {
                    if (pRoleTarget.TradePartners.ContainsKey(pRole.Identity) ||
                        pRole.TradePartners.ContainsKey(pRoleTarget.Identity))
                    {
                        pRole.Send(ServerString.STR_TRADE_BUDDY_ALREADY_ADDED);
                        return;
                    }

                    var pSender = new TradePartner(pRole);
                    var pTarget = new TradePartner(pRoleTarget);
                    if (!pSender.Create(pRoleTarget.Identity) ||
                        !pTarget.Create(pRole.Identity))
                    {
                        pRole.Send(ServerString.STR_TRADE_BUDDY_SOMETHING_WRONG);
                        return;
                    }

                    pRole.Screen.Send(string.Format("{0} and {1} accepted a trade partnership that will be approved within 3 days.", pRole.Name, pRoleTarget.Name), true);
                }
                else
                {
                    pRoleTarget.SetTradeBuddyRequest(pRole.Identity);
                    pMsg.Identity = pRole.Identity;
                    pMsg.Name     = pRole.Name;
                    pTargetUser.Send(pMsg);
                    pTargetUser.Character.SendRelation(pRole);
                }
                break;
            }

                #endregion
                #region Reject Request
            case TradePartnerType.REJECT_REQUEST:
            {
                Client pTarget;
                if (ServerKernel.Players.TryGetValue(pMsg.Identity, out pTarget))
                {
                    pMsg.Identity = pRole.Identity;
                    pMsg.Name     = pRole.Name;
                    pMsg.Online   = true;
                    pTarget.Character.Send(pMsg);
                }
                break;
            }

                #endregion
                #region Break partnership
            case TradePartnerType.BREAK_PARTNERSHIP:
            {
                TradePartner pTarget;
                if (pRole.TradePartners.TryRemove(pMsg.Identity, out pTarget))
                {
                    pTarget.Delete();
                    if (pTarget.TargetOnline)
                    {
                        TradePartner trash;
                        pTarget.Owner.TradePartners.TryRemove(pRole.Identity, out trash);
                        trash.Delete();
                        pTarget.Owner.Send(string.Format(ServerString.STR_TRADE_BUDDY_BROKE_PARTNERSHIP0, pRole.Name));
                    }
                    else
                    {
                        new BusinessRepository().DeleteBusiness(pRole.Identity, pTarget.OwnerIdentity);
                    }
                    pRole.Send(string.Format(ServerString.STR_TRADE_BUDDY_BROKE_PARTNERSHIP1, pTarget.Name));
                }
                break;
            }

                #endregion
            default:
            {
                ServerKernel.Log.SaveLog("Missing packet handler for type 2046:" + pMsg.Type, true, LogType.WARNING);
                GamePacketHandler.Report(pMsg);
                break;
            }
            }
        }
 public TradePartner(Character pOwner)
 {
     m_pOwner  = pOwner;
     m_pPacket = new MsgTradeBuddy();
 }