Esempio n. 1
0
        internal World Next(ServerConstants.ServerType type)
        {
            lock (this)
            {
                foreach (World loopWorld in this)
                {
                    if (type == ServerConstants.ServerType.Channel && loopWorld.IsFull)
                    {
                        continue;
                    }

                    if (type == ServerConstants.ServerType.Shop && loopWorld.HasShop)
                    {
                        continue;
                    }

                    return(loopWorld);
                }

                return(null);
            }
        }
Esempio n. 2
0
        private void Register(Packet inPacket)
        {
            ServerConstants.ServerType type = (ServerConstants.ServerType)inPacket.ReadByte();
            string securityCode             = inPacket.ReadString();

            bool valid = true;

            using (Packet Packet = new Packet(InteroperabilityOperationCode.RegistrationResponse))
            {
                if (!Enum.IsDefined(typeof(ServerConstants.ServerType), type))
                {
                    Packet.WriteByte((byte)ServerRegsitrationResponse.InvalidType);

                    valid = false;
                }
                else if (securityCode != SecurityCode)
                {
                    Packet.WriteByte((byte)ServerRegsitrationResponse.InvalidCode);

                    valid = false;
                }
                else
                {
                    switch (type)
                    {
                    case ServerConstants.ServerType.Login:
                    {
                        if (WvsCenter.Login != null)
                        {
                            Packet.WriteByte((byte)ServerRegsitrationResponse.Full);

                            valid = false;
                        }
                        else
                        {
                            Packet.WriteByte((byte)ServerRegsitrationResponse.Valid);

                            WvsCenter.Login = this;
                        }
                    }
                    break;

                    case ServerConstants.ServerType.Channel:
                    case ServerConstants.ServerType.Shop:
                    {
                        World world = WvsCenter.Worlds.Next(type);

                        if (world == null)
                        {
                            Packet.WriteByte((byte)ServerRegsitrationResponse.Full);

                            valid = false;
                        }
                        else
                        {
                            World = world;

                            switch (type)
                            {
                            case ServerConstants.ServerType.Channel:
                                World.Add(this);
                                break;

                            case ServerConstants.ServerType.Shop:
                                World.Shop = this;
                                break;
                            }

                            Packet.WriteByte((byte)ServerRegsitrationResponse.Valid);
                            Packet.WriteByte(World.ID);
                            Packet.WriteString(World.Name);

                            if (type == ServerConstants.ServerType.Channel)
                            {
                                Packet.WriteString(World.TickerMessage);
                                Packet.WriteByte(ID);
                            }

                            Packet.WriteUShort(Port);

                            if (type == ServerConstants.ServerType.Channel)
                            {
                                Packet.WriteBool(World.AllowMultiLeveling);
                                Packet.WriteInt(World.ExperienceRate);
                                Packet.WriteInt(World.QuestExperienceRate);
                                Packet.WriteInt(World.PartyQuestExperienceRate);
                                Packet.WriteInt(World.MesoRate);
                                Packet.WriteInt(World.DropRate);
                            }
                        }
                    }
                    break;

                    case ServerConstants.ServerType.None:
                        break;

                    case ServerConstants.ServerType.ITC:
                        break;

                    default:
                        Log.SkipLine();
                        Log.Warn(" Unhandled Registration request!" +
                                 " \n Argument: {0}", Type);
                        Log.SkipLine();
                        break;
                    }
                }

                Send(Packet);
            }

            if (valid)
            {
                Type = type;

                switch (type)
                {
                case ServerConstants.ServerType.Login:
                {
                    byte count = inPacket.ReadByte();

                    for (byte b = 0; b < count; b++)
                    {
                        if (WvsCenter.Worlds.Contains(b))
                        {
                            continue;
                        }

                        WvsCenter.Worlds.Add(new World(inPacket));
                    }

                    foreach (World loopWorld in WvsCenter.Worlds)
                    {
                        foreach (CenterClient loopChannel in loopWorld)
                        {
                            using (Packet Packet = new Packet(InteroperabilityOperationCode.UpdateChannel))
                            {
                                Packet.WriteByte(loopChannel.World.ID);
                                Packet.WriteBool(true);
                                Packet.WriteByte(loopChannel.ID);
                                Packet.WriteUShort(loopChannel.Port);
                                Packet.WriteInt(loopChannel.Population);

                                WvsCenter.Login.Send(Packet);
                            }
                        }
                    }
                    Log.SkipLine();
                    Log.Success("Registered Login Server.");
                    Log.SkipLine();
                }
                break;

                case ServerConstants.ServerType.Channel:
                {
                    using (Packet Packet = new Packet(InteroperabilityOperationCode.UpdateChannel))
                    {
                        Packet.WriteByte(World.ID);
                        Packet.WriteBool(true);
                        Packet.WriteByte(ID);
                        Packet.WriteUShort(Port);
                        Packet.WriteInt(Population);

                        WvsCenter.Login.Send(Packet);
                    }
                    Log.SkipLine();
                    Log.Success("Registered Channel Server ({0}-{1}).", World.Name, (ID + 1));
                    Log.SkipLine();
                }
                break;

                case ServerConstants.ServerType.Shop:
                {
                    Log.SkipLine();
                    Log.Success("Registered Shop Server ({0}).", World.Name);
                    Log.SkipLine();
                }
                break;
                }
            }
        }