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); } }
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; } } }