Beispiel #1
0
 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;
         }
     }
 }
Beispiel #2
0
        /// <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;
                    }
                }
            }
        }
Beispiel #3
0
 public AuthoryMapServer GetMapServerByPort(int port)
 {
     return(MapServers.Find(x => x.Port == port));
 }
Beispiel #4
0
 public void AddMapServer(AuthoryMapServer mapServer)
 {
     MapServers.Add(mapServer);
     Console.WriteLine($"Added MapServer:\n{mapServer} to Node:\n{this}");
 }