public void RemoveMapServer(int mapPort, int mapIndex, string mapName) { for (int i = MapServers.Count - 1; i >= 0; i--) { AuthoryMapServer mapServer = MapServers[i]; if (mapServer.Port == mapPort && mapServer.AuthoryMap.MapIndex == mapIndex) { MapServers.RemoveAt(i); Console.WriteLine($"Removed MapServer:\n{mapServer} from Node:\n{this}"); return; } } }
/// <summary> ///Read messages from MasterServer /// </summary> private void ReadMaster() { NetIncomingMessage msgIn; MasterMessageType msgType; while ((msgIn = masterClient.ReadMessage()) != null) { if (msgIn.MessageType == NetIncomingMessageType.Data) { msgType = (MasterMessageType)msgIn.ReadByte(); Console.WriteLine(msgType.ToString()); switch (msgType) { case MasterMessageType.RequestMap: { int latestPort = msgIn.ReadInt32(); if (latestPort < 1000) { latestPort = (int)defaultServerPort++; } int mapIndex = msgIn.ReadInt32(); string mapName = msgIn.ReadString(); //int serverId = msgIn.ReadInt32(); AuthoryServer server = new AuthoryServer(MapServers.Count, defaultMapsFolderPath); MapServers.Add(server); Console.WriteLine("Requested port: " + latestPort); server.Init(latestPort++, defaultAuthoryServerAuthString, mapName, mapIndex); server.Start(); NetOutgoingMessage msgOut = masterClient.CreateMessage(); msgOut.Write((byte)MasterMessageType.MapCreated); msgOut.Write(server.NetServer.Port); msgOut.Write(server.MapIndex); msgOut.Write(server.MapName); masterClient.SendMessage(msgOut, NetDeliveryMethod.ReliableOrdered); nodeUp = true; } break; case MasterMessageType.RequestMaps: { int latestPort = msgIn.ReadInt32(); int infoCount = msgIn.ReadInt32(); for (int i = 0; i < infoCount; i++) { int mapIndex = msgIn.ReadInt32(); string mapName = msgIn.ReadString(); AuthoryServer server = new AuthoryServer(MapServers.Count, defaultMapsFolderPath); MapServers.Add(server); if (latestPort < 1000) { latestPort = (int)defaultServerPort++; } Console.WriteLine("Requested port: " + latestPort); server.Init(latestPort++, defaultAuthoryServerAuthString, mapName, mapIndex); server.Start(); NetOutgoingMessage msgOut = masterClient.CreateMessage(); msgOut.Write((byte)MasterMessageType.MapCreated); msgOut.Write(server.NetServer.Port); msgOut.Write(server.MapIndex); msgOut.Write(server.MapName); masterClient.SendMessage(msgOut, NetDeliveryMethod.ReliableOrdered); } nodeUp = true; } break; case MasterMessageType.CharacterInfo: { int serverPort = msgIn.ReadInt32(); AuthoryServer mapServer = null; foreach (var server in MapServers) { if (server.NetServer.Port == serverPort) { mapServer = server; } } string accountName = msgIn.ReadString(); string characterName = msgIn.ReadString(); int accountId = msgIn.ReadInt32(); int characterId = msgIn.ReadInt32(); int health = msgIn.ReadInt32(); int mana = msgIn.ReadInt32(); long experience = msgIn.ReadInt64(); byte level = msgIn.ReadByte(); ModelType modelType = (ModelType)msgIn.ReadByte(); float posX = msgIn.ReadFloat(); float posZ = msgIn.ReadFloat(); long uid = msgIn.ReadInt64(); PlayerEntity playerEntity = new PlayerEntity(characterName, modelType, level, new Vector3(posX, 0, posZ), null, mapServer, characterId, accountId); playerEntity.Experience = experience; playerEntity.Health.Value = health; playerEntity.Mana.Value = mana; Console.WriteLine(playerEntity); playerEntity.SetId((ushort)(mapServer.Data.GetNextPlayerId())); mapServer.Data.AwaitingConnections.TryAdd(uid, playerEntity); NetOutgoingMessage msgOut = masterClient.CreateMessage(); msgOut.Write((byte)MasterMessageType.ConnectionApproved); msgOut.Write(serverPort); msgOut.Write(accountId); msgOut.Write(characterId); msgOut.Write(uid); msgOut.Write(playerEntity.Id); masterClient.SendMessage(msgOut, NetDeliveryMethod.ReliableOrdered); } break; case MasterMessageType.RequestCharacterInfo: { int port = msgIn.ReadInt32(); int characterId = msgIn.ReadInt32(); foreach (var server in MapServers) { foreach (var player in server.Data.PlayersById.Values) { if (player.CharacterId == characterId) { SendBackCharacterInfo(server, player); return; } } if (server.NetServer.Port == port) { if (server.Data.RecentlyOnlinePlayers.TryRemove(characterId, out PlayerEntity player)) { SendBackCharacterInfo(server, player); return; } } } } break; case MasterMessageType.Shutdown: { Shutdown(); } break; } } } }
public AuthoryMapServer GetMapServerByPort(int port) { return(MapServers.Find(x => x.Port == port)); }
public void AddMapServer(AuthoryMapServer mapServer) { MapServers.Add(mapServer); Console.WriteLine($"Added MapServer:\n{mapServer} to Node:\n{this}"); }