//通知进入场景 public void NotifyEnterScene(CharacterSceneInfo info, int changeType, SceneParam sp) { PlayerLog.WriteLog(888, "NotifyEnterScene characterId={0},SceneId={1},newScene={2}", info.CharacterId, info.SceneInfo.SceneId, info.SceneInfo.SceneGuid); mLogger.Info("Enter Game {0} - NotifyEnterScene - 1 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); mLogger.Info("NotifyEnterScene {0}, {1}.", info.CharacterId, info.SceneInfo.Server.RemoteEndPoint); var content = new __RPC_Scene_SSEnterScene_ARG_uint64_characterId_uint64_guid_uint64_applyGuid_int32_changeType_SceneParam_sceneParam__ (); content.CharacterId = info.CharacterId; content.Guid = info.SceneInfo.SceneGuid; content.ChangeType = changeType; content.SceneParam = sp; var message = new ServiceDesc(); message.FuncId = 3055; message.ServiceType = (int)ServiceType.Scene; message.PacketId = mBroker.GetUniquePacketId(); message.Data = ProtocolExtension.Serialize(content); message.Type = (int)MessageType.SS; message.CharacterId = info.CharacterId; info.SceneInfo.Server.SendMessage(message); }
public override CharacterInfo CreateCharacter(ulong CharacterId) { var character = new CharacterSceneInfo(); character.CharacterId = CharacterId; return(character); }
//通知进入场景 public void NotifyLoginEnterScene(ServerClient client, CharacterSceneInfo info, ulong sceneGuid, ServiceDesc desc) { Logger.Info("Enter Game {0} - NotifyEnterScene - 1 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); Logger.Info("NotifyEnterScene {0}, {1}.", info.CharacterId, info.SceneInfo.Server.RemoteEndPoint); var content = new __RPC_Scene_PrepareDataForEnterGame_RET_uint64__(); content.ReturnValue = sceneGuid; var message = new ServiceDesc(); message.FuncId = 3051; message.ServiceType = (int)ServiceType.Login; message.PacketId = desc.PacketId; message.Data = ProtocolExtension.Serialize(content); message.Type = desc.Type; message.CharacterId = desc.CharacterId; message.ClientId = desc.ClientId; client.SendMessage(message); }
//查询 public CharacterSceneInfo GetCharacter(ulong characterId) { CharacterSceneInfo characterInfo = null; if (mCharacterInfo.TryGetValue(characterId, out characterInfo)) { return(characterInfo); } return(null); }
//创建 public bool CreateCharacter(ulong characterId, out CharacterSceneInfo characterInfo) { if (mCharacterInfo.TryGetValue(characterId, out characterInfo)) { return(false); //说明之前已经有这个人了,这次create是失败的 } characterInfo = new CharacterSceneInfo(characterId); mCharacterInfo[characterId] = characterInfo; return(true); }
/// <summary> /// 切换到目标场景 /// </summary> /// <param name="info">角色信息</param> /// <param name="oldScene">角色之前的场景信息</param> /// <param name="newScene">角色要去的新场景信息</param> /// <param name="callback">完成后的回调,bool类型的参数表示是否切换了机器</param> private void ChangeSceneOver(CharacterSceneInfo info, SceneInfo oldScene, SceneInfo newScene, Action <bool> callback) { DebugCounter[8]++; PlayerLog.WriteLog(888, "ChangeSceneStart characterId={0},oldScene={1},newScene={2}", info.CharacterId, oldScene.SceneGuid, newScene.SceneGuid); //Logger.Info("Enter Game {0} - ChangeSceneOver - 1 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); //Logger.Info("Enter Game {0} - ChangeSceneOver - 2 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); // 如果不在同一台机器上,则通知上一台机器下线,然后通知下一台机器上线 if (oldScene.Server != newScene.Server) { DebugCounter[10]++; //Logger.Info("Enter Game {0} - ChangeSceneOver - 3 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); UnloadData(info.CharacterId, oldScene, serviceDesc2 => { DebugCounter[11]++; NotifyConnect(info, serviceDesc => { DebugCounter[14]++; if (callback != null) { callback(true); } }); //Logger.Info("Enter Game {0} - ChangeSceneOver - 4 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); //ChangeTheShortCut(info, () => //{ // Logger.Info("Enter Game {0} - ChangeSceneOver - 5 - {1},{2} - {3}", info.CharacterId, // oldScene.Server.RemoteEndPoint, newScene.Server.RemoteEndPoint, TimeManager.Timer.ElapsedMilliseconds); //}); }); } else { Logger.Info("Enter Game {0} - ChangeSceneOver - 2 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); DebugCounter[12]++; info.SceneInfo = newScene; if (callback != null) { callback(false); } } }
private void NotifyConnect(CharacterSceneInfo info, Action <ServiceDesc> callback) { ConnectLostLogger.Info("client {0} - {1} SceneBroker NotifyConnect 1", info.ClientId, info.CharacterId); Logger.Info("NotifyConnect {0}, {1}.", info.CharacterId, info.SceneInfo.Server.RemoteEndPoint); var desc = new ServiceDesc(); desc.Type = (int)MessageType.SS; desc.FuncId = 3501; desc.CharacterId = info.CharacterId; desc.ClientId = info.ClientId; desc.PacketId = GetUniquePacketId(); var content = new __RPC_Scene_SSNotifyCharacterOnConnet_ARG_uint64_clientId_uint64_characterId__(); content.CharacterId = info.CharacterId; content.ClientId = info.ClientId; desc.Data = ProtocolExtension.Serialize(content); var act = new Action <bool, ServiceDesc>((b, item) => { if (b) { if (item.Error == 0) { ConnectLostLogger.Info("client {0} - {1} SceneBroker NotifyConnect 3", info.ClientId, info.CharacterId); Logger.Info("Scene server Connected replied {0}", info.CharacterId); callback(item); } else { ConnectLostLogger.Error("client {0} - {1} SceneBroker NotifyConnect 4", info.ClientId, info.CharacterId); Logger.Error("NotifyConnect failed {0}....", item.Error); } } else { ConnectLostLogger.Error("client {0} - {1} SceneBroker NotifyConnect 5", info.ClientId, info.CharacterId); Logger.Error("NotifyConnect timeout...."); } }); ConnectLostLogger.Info("client {0} - {1} SceneBroker NotifyConnect 2", info.ClientId, info.CharacterId); RegisterCallback(desc.PacketId, act); info.SceneInfo.Server.SendMessage(desc); }
private void ChangeTheShortCut(CharacterSceneInfo info, Action callback) { // 获得GateId var gateId = ((info.ClientId & 0xFFFF000000000000UL) >> 48); Logger.Info("Enter Game {0} {1} - ChangeTheShortCut - 1 - {2}", info.CharacterId, gateId, TimeManager.Timer.ElapsedMilliseconds); GateProxy gate; if (mGates.TryGetValue((int)gateId, out gate)) { Logger.Info("Enter Game {0} - ChangeTheShortCut - 2 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); var gateDesc = new ServiceDesc(); gateDesc.Type = 20; gateDesc.CharacterId = info.CharacterId; gateDesc.ServiceType = (int)ServiceType.Scene; gateDesc.ClientId = info.ClientId; gateDesc.Routing.Add(gateId); gateDesc.PacketId = GetUniquePacketId(); Action <bool, ServiceDesc> act = (b, desc) => { if (b) { Logger.Info("Enter Game {0} - ChangeTheShortCut - 3 - {1}", info.CharacterId, TimeManager.Timer.ElapsedMilliseconds); callback(); } else { Logger.Error("ChangeTheShortCut {0} error.", info.CharacterId); } }; RegisterCallback(gateDesc.PacketId, act); info.SceneInfo.Server.SendMessage(gateDesc); } else { Logger.Error("Can not find gate {0}.", gateId); } }
//判断 【场景】 【玩家】 是否一个机器 private bool CheckSameMachine(SceneInfo sceneInfo1, CharacterSceneInfo info) { return(sceneInfo1.Server == info.SceneInfo.Server); }
//把玩家装进scene private void PutCharacterIntoScene(SceneInfo sceneInfo, CharacterSceneInfo characterInfo) { characterInfo.SceneInfo = sceneInfo; }