示例#1
0
        public PlayerSaver AddPlayer(CSCommon.Data.PlayerDataEx roleId)
        {
            PlayerSaver       saver    = null;
            PlayerSaverThread thread   = null;
            Int32             mincount = Int32.MaxValue;

            foreach (var i in mSaveThreads)
            {
                int count = i.GetPlayerCount();
                if (count < mincount)
                {
                    mincount = count;
                    thread   = i;
                }
                saver = i.FindPlayerSaver(roleId);
                if (saver != null)
                {
                    return(saver);
                }
            }

            if (thread == null)
            {
                Log.Log.Common.Print("AddPlayer thread is null");
            }

            saver = thread.AddPlayer(roleId);
            return(saver);
        }
示例#2
0
        public void PushExecuter(CSCommon.Data.PlayerDataEx roleId, ServerFrame.DB.AsyncExecuter exec)
        {
            PlayerSaver       saver    = null;
            PlayerSaverThread thread   = null;
            Int32             mincount = Int32.MaxValue;

            foreach (var i in mSaveThreads)
            {
                int count = i.GetPlayerCount();
                if (count < mincount)
                {
                    mincount = count;
                    thread   = i;
                }
                saver = i.FindPlayerSaver(roleId);
                if (saver != null)
                {
                    break;
                }
            }
            if (saver == null)
            {
                saver = thread.AddPlayer(roleId);
            }
            ServerFrame.DB.DBOperator sqlAtom = new ServerFrame.DB.DBOperator();
            sqlAtom.Executer = exec;
            saver.Push(sqlAtom);
            saver.mWaitRemove = false;//只要有数据重新要存储,说明他又登陆进来了,不需要remove了
        }
示例#3
0
        public PlayerSaver AddPlayer(CSCommon.Data.PlayerDataEx player)
        {
            PlayerSaver saver;

            lock (this)
            {
                saver = FindPlayerSaver(player);
                if (saver != null)
                {
                    return(saver);
                }
                saver = new PlayerSaver();
                saver.mPlayerDataEx = player;
                if (player == null || player.RoleDetail == null)
                {
                    Log.Log.Common.Print("player  is null");
                }
                if (player.mSaverThread != null)
                {
                    Log.Log.Common.Print("AddPlayer mSaverThread is null");
                }
                player.mSaverThread = this;
                mPushPlayers.Add(player, saver);
            }

            return(saver);
        }
示例#4
0
 public bool IsConditionOK(CSCommon.Data.PlayerDataEx player)
 {
     /*foreach (var i in player.TaskMgr.AcceptTavernTasks)
      * {
      *  if (i.Finished == true)
      *      return true;
      * }*/
     return(false);
 }
示例#5
0
 public void InvalidLinkerWhenRoleExit()
 {
     mPlayerData                     = null;
     mForwardInfo.RoleId             = 0;
     mForwardInfo.MapIndexInServer   = UInt16.MaxValue;
     mForwardInfo.PlayerIndexInMap   = UInt16.MaxValue;
     mForwardInfo.Gate2PlanesConnect = null;
     mLandStep = Gate.LandStep.SelectRole;
 }
示例#6
0
        public void PushSave(CSCommon.Data.PlayerDataEx roleId, string SqlCode, SqlExeType ExeType)
        {
            PlayerSaver saver = AddPlayer(roleId);

            ServerFrame.DB.DBOperator sqlAtom = new ServerFrame.DB.DBOperator();
            sqlAtom.SqlCode = SqlCode;
            sqlAtom.ExeType = ExeType;
            saver.Push(sqlAtom);
            saver.mWaitRemove = false;//只要有数据重新要存储,说明他又登陆进来了,不需要remove了
        }
示例#7
0
 public MapConnectInfo GetMapConnectInfo(CSCommon.Data.PlayerDataEx pd, ushort planesId, ushort mapSourceId, ulong mapInstanceId)
 {
     if (IsInstanceMap(mapSourceId))
     {
         return(GetInstanceMapConnectInfo(pd, mapSourceId, mapInstanceId));
     }
     else
     {
         return(GetGlobalMapConnectInfo(planesId, mapSourceId));
     }
 }
示例#8
0
        public void _ClearSaver(CSCommon.Data.PlayerDataEx roleId)
        {
            PlayerSaver saver = null;

            foreach (var i in mSaveThreads)
            {
                saver = i.FindPlayerSaver(roleId);
                if (saver != null)
                {
                    saver.Clear();
                }
            }
        }
示例#9
0
        private MapConnectInfo GetInstanceMapConnectInfo(CSCommon.Data.PlayerDataEx pd, ushort mapSourceId, ulong mapId)
        {
            MapConnectInfo cinfo;

            if (false == mInstanceMaps.TryGetValue(mapId, out cinfo))
            {
                //评估一个压力小的服务器
                var              planesServers   = IDataServer.Instance.PlanesServers;
                Int32            minPlanesNumber = Int32.MaxValue;
                PlanesServerInfo selected        = null;
                foreach (var kv in planesServers)
                {
                    if (kv.Value.PlanesNumber < minPlanesNumber)
                    {
                        selected        = kv.Value;
                        minPlanesNumber = kv.Value.PlanesNumber;
                    }
                }
                cinfo = new MapConnectInfo();
                cinfo.PlanesPlayerManager = null;
                cinfo.mConnect            = selected.EndPoint;
                cinfo.MapSourceId         = mapSourceId;
                cinfo.MapInstanceId       = mapId;

                cinfo.InstanceCreator = pd.RoleDetail.RoleId;//如果是组队副本,这个地方存队伍Id

//                 var mapInit = Planes.MapInstanceManager.GetMapInitBySourceId(mapSourceId);
//                 if (mapInit != null)
//                 {
//                     switch ((CSCommon.eMapType)mapInit.MapData.mapType)
//                     {
//                         case CSCommon.eMapType.Master:
//                             cinfo.InstanceCreator = pd.RoleDetail.RoleId;//单人副本
//                             break;
//                         //case CSCommon.eMapType.TeamInstance:
//                         //cinfo.InstanceCreator = pd.RoleDetail.TeamId;//组队副本
//                         //   break;
//                     }
//                 }

                mInstanceMaps.Add(mapId, cinfo);
            }
            else
            {
                if (cinfo.MapSourceId != mapSourceId)
                {
                    Log.Log.Server.Info("副本Id错了 {0}:{1}!", mapSourceId, mapId);
                }
            }
            return(cinfo);
        }
示例#10
0
        public bool InPool(CSCommon.Data.PlayerDataEx roleId)
        {
            PlayerSaver saver = null;

            foreach (var i in mSaveThreads)
            {
                saver = i.FindPlayerSaver(roleId);
                if (saver != null)
                {
                    return(true);
                }
            }
            return(false);
        }
示例#11
0
        public PlayerSaver FindPlayerSaver(CSCommon.Data.PlayerDataEx roleId)
        {
            PlayerSaver saver;

            if (mPushPlayers.TryGetValue(roleId, out saver))
            {
                return(saver);
            }
            else if (mPlayers.TryGetValue(roleId, out saver))
            {
                return(saver);
            }
            return(null);
        }
示例#12
0
        public void RemovePlayer(CSCommon.Data.PlayerDataEx roleId)
        {
            PlayerSaver saver = null;

            foreach (var i in mSaveThreads)
            {
                saver = i.FindPlayerSaver(roleId);
                if (saver != null)
                {
                    break;
                }
            }
            if (saver != null)
            {
                saver.mWaitRemove = true;
            }
        }
示例#13
0
        public void PushSave(CSCommon.Data.PlayerDataEx roleId, ServerFrame.DB.DBOperator dbOp)
        {
            if (dbOp == null)
            {
                return;
            }
            if (roleId == null)
            {
                //走到这里说明DataServer已经重启过了,之前的在线玩家需要存盘,放到一个特殊线程处理就好了
                switch (dbOp.ExeType)
                {
                case SqlExeType.Update:
                {
                    PlayerEnterThread.Instance.DBConnect._ExecuteUpdate(dbOp);
                }
                break;

                case SqlExeType.Insert:
                {
                    PlayerEnterThread.Instance.DBConnect._ExecuteInsert(dbOp);
                }
                break;

                case SqlExeType.Delete:
                {
                    PlayerEnterThread.Instance.DBConnect._ExecuteDelete(dbOp);
                }
                break;

                case SqlExeType.Destroy:
                {
                    PlayerEnterThread.Instance.DBConnect._ExecuteDestroy(dbOp);
                }
                break;
                }
                return;
            }
            PlayerSaver saver = AddPlayer(roleId);

            saver.Push(dbOp);
            saver.mWaitRemove = false;//只要有数据重新要存储,说明他又登陆进来了,不需要remove了
        }
示例#14
0
 public void AddPlayer(CSCommon.Data.PlayerDataEx pd)
 {
     mGuidDict[pd.RoleDetail.RoleId]   = pd;
     mNameDict[pd.RoleDetail.RoleName] = pd;
     pd.CurMap = this;
 }
示例#15
0
        public void GotoMap(ulong roleId, ushort planesId, ushort mapSourceId, SlimDX.Vector3 pos, UInt16 cltHandle, Iocp.NetConnection connect, RPC.RPCForwardInfo fwd)
        {
            UInt16 returnSerialId = fwd.ReturnSerialId;

            var mapInit = Planes.MapInstanceManager.GetMapInitBySourceId(mapSourceId);

            if (mapInit == null)
            {
                RPC.PackageWriter retPkg = new RPC.PackageWriter();
                retPkg.Write((sbyte)(eRet_GotoMap.GetMapInitFailed));
                retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId);
                return;
            }

            CSCommon.Data.PlayerDataEx pd = IDataServer.Instance.PlayerManager.FindPlayerData(roleId);
            if (pd == null)
            {
                RPC.PackageWriter retPkg = new RPC.PackageWriter();
                retPkg.Write((sbyte)(eRet_GotoMap.NoPlayerData));
                retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId);
                return;
            }

            switch ((CSCommon.eMapType)mapInit.MapData.mapType)
            {
            case CSCommon.eMapType.Master:
                break;
//                case CSCommon.eMapType.TeamInstance:
//                     if (pd.RoleDetail.TeamId == Guid.Empty)
//                     {
//                         RPC.PackageWriter retPkg = new RPC.PackageWriter();
//                         retPkg.Write((sbyte)(-5));//没有组队不能进组队副本
//                         retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId);
//                         return;
//                     }
                break;
            }

            var mapInstanceId = AllMapManager.Instance.GetInstanceMapId(pd, mapSourceId);
            var account       = pd.mAccountInfo;

            PlayerManager.LogoutCurPlayer(account, null);

            account.CurPlayer = pd;
            var mapInfo = AllMapManager.Instance.GetMapConnectInfo(pd, planesId, mapSourceId, mapInstanceId);

            PlayerManager.LoginCurPlayer(account, mapInfo);

            var nep = mapInfo.mConnect;

            if (mapInfo == null || nep == null)
            {
                RPC.PackageWriter retPkg = new RPC.PackageWriter();
                retPkg.Write((sbyte)(eRet_GotoMap.NoConnectInfo));
                retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId);
                return;
            }

            if (connect == nep.Connect)
            {//目的地就在原来服务器
                pd.mPlanesConnect = nep.Connect as Iocp.TcpConnect;

                RPC.PackageWriter retPkg = new RPC.PackageWriter();
                retPkg.Write((sbyte)eRet_GotoMap.SamePlane);
                if (mapInfo.PlanesPlayerManager != null)
                {
                    retPkg.Write(mapInfo.PlanesPlayerManager.PlanesData);
                }
                else
                {
                    retPkg.Write(new CSCommon.Data.PlanesData());
                }
                retPkg.Write(mapInstanceId);
                retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId);
                return;
            }
            else
            {
                RPC.PackageWriter pkg1 = new RPC.PackageWriter();

                H_RPCRoot.smInstance.HGet_GateServer(pkg1).OtherPlane_EnterMap(pkg1, nep.Id, cltHandle, pd, mapInfo.PlanesPlayerManager.PlanesData, mapSourceId, mapInstanceId, pos);
                pkg1.WaitDoCommand(pd.mGateConnect, RPC.CommandTargetType.DefaultType, new System.Diagnostics.StackTrace(1, true)).OnFarCallFinished = delegate(RPC.PackageProxy _io1, bool bTimeOut)
                {
                    sbyte successed = -1;
                    _io1.Read(out successed);
                    switch (successed)
                    {
                    case (sbyte)eRet_GotoMap.EnterMap:
                    {
                        pd.mPlanesConnect = nep.Connect as Iocp.TcpConnect;
                        RPC.PackageWriter retPkg = new RPC.PackageWriter();
                        retPkg.Write((sbyte)((sbyte)eRet_GotoMap.OtherPlane));        //需要跳转物理服务器
                        retPkg.DoReturnCommand2(connect, returnSerialId);
                    }
                    break;

                    default:
                    {
                        pd.mPlanesConnect = nep.Connect as Iocp.TcpConnect;
                        RPC.PackageWriter retPkg = new RPC.PackageWriter();
                        retPkg.Write((sbyte)(eRet_GotoMap.FailedEnterMap));
                        retPkg.DoReturnCommand2(connect, returnSerialId);
                        Log.Log.Server.Warning("跨plane,地图跳转失败!");
                    }
                    break;
                    }
                };
            }
        }