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); }
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了 }
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); }
public bool IsConditionOK(CSCommon.Data.PlayerDataEx player) { /*foreach (var i in player.TaskMgr.AcceptTavernTasks) * { * if (i.Finished == true) * return true; * }*/ return(false); }
public void InvalidLinkerWhenRoleExit() { mPlayerData = null; mForwardInfo.RoleId = 0; mForwardInfo.MapIndexInServer = UInt16.MaxValue; mForwardInfo.PlayerIndexInMap = UInt16.MaxValue; mForwardInfo.Gate2PlanesConnect = null; mLandStep = Gate.LandStep.SelectRole; }
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了 }
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)); } }
public void _ClearSaver(CSCommon.Data.PlayerDataEx roleId) { PlayerSaver saver = null; foreach (var i in mSaveThreads) { saver = i.FindPlayerSaver(roleId); if (saver != null) { saver.Clear(); } } }
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); }
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); }
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); }
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; } }
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了 }
public void AddPlayer(CSCommon.Data.PlayerDataEx pd) { mGuidDict[pd.RoleDetail.RoleId] = pd; mNameDict[pd.RoleDetail.RoleName] = pd; pd.CurMap = this; }
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; } }; } }