/// <summary> /// Handles the servers's state packet /// </summary> static public void Handle_SC_State(SC_State pkt, Client client) { //Consider the connection started now, time to send our login info.. Database db = ((client as Client <Database>)._obj); db._syncStart.Set(); //Prepare our login packet CS_Auth <Database> auth = new CS_Auth <Database>(); auth.zoneID = db._config["zoneid"].intValue; auth.password = db._config["password"].Value; auth.zoneName = db._server._config["server/zoneName"].Value; auth.zoneDescription = db._server._config["server/zoneDescription"].Value; auth.zoneIsAdvanced = db._server._config["server/zoneIsAdvanced"].boolValue; auth.zoneIP = db._server._config["server/bindIP"].Value; auth.zonePort = db._server._config["server/bindPort"].intValue; client.sendReliable(auth); }
/// <summary> /// Creates a new packet based on the typeID and the received content /// inside the buffer. The user has to create an own implementation /// of this interface. /// </summary> public PacketBase createPacket(NetworkClient client, ushort typeID, byte[] buffer, int offset, int size) { //Ready our packet base PacketBase packet = null; size--; //Was it a system packet? if (buffer[offset++] == 0) { //Yes, find the appropriate type return(createSystemPacket(typeID, buffer, offset, size)); } //So what was the typeid? switch (typeID) { case CS_Auth <T> .TypeID: packet = new CS_Auth <T>(typeID, buffer, offset, size); break; case CS_PlayerLogin <T> .TypeID: packet = new CS_PlayerLogin <T>(typeID, buffer, offset, size); break; case CS_PlayerUpdate <T> .TypeID: packet = new CS_PlayerUpdate <T>(typeID, buffer, offset, size); break; case CS_PlayerLeave <T> .TypeID: packet = new CS_PlayerLeave <T>(typeID, buffer, offset, size); break; case CS_PlayerBanner <T> .TypeID: packet = new CS_PlayerBanner <T>(typeID, buffer, offset, size); break; case CS_PlayerStatsRequest <T> .TypeID: packet = new CS_PlayerStatsRequest <T>(typeID, buffer, offset, size); break; case CS_Whisper <T> .TypeID: packet = new CS_Whisper <T>(typeID, buffer, offset, size); break; case CS_JoinChat <T> .TypeID: packet = new CS_JoinChat <T>(typeID, buffer, offset, size); break; case CS_LeaveChat <T> .TypeID: packet = new CS_LeaveChat <T>(typeID, buffer, offset, size); break; case CS_PrivateChat <T> .TypeID: packet = new CS_PrivateChat <T>(typeID, buffer, offset, size); break; case CS_ModCommand <T> .TypeID: packet = new CS_ModCommand <T>(typeID, buffer, offset, size); break; case CS_Squads <T> .TypeID: packet = new CS_Squads <T>(typeID, buffer, offset, size); break; case CS_ChatQuery <T> .TypeID: packet = new CS_ChatQuery <T>(typeID, buffer, offset, size); break; case Disconnect <T> .TypeID: packet = new Disconnect <T>(typeID, buffer, offset, size); break; case CS_Ban <T> .TypeID: packet = new CS_Ban <T>(typeID, buffer, offset, size); break; case CS_SquadMatch <T> .TypeID: packet = new CS_SquadMatch <T>(typeID, buffer, offset, size); break; case CS_ModQuery <T> .TypeID: packet = new CS_ModQuery <T>(typeID, buffer, offset, size); break; case CS_ChatCommand <T> .TypeID: packet = new CS_ChatCommand <T>(typeID, buffer, offset, size); break; case CS_StatsUpdate <T> .TypeID: packet = new CS_StatsUpdate <T>(typeID, buffer, offset, size); break; case CS_ArenaUpdate <T> .TypeID: packet = new CS_ArenaUpdate <T>(typeID, buffer, offset, size); break; default: //An undefined packet. packet = new PacketDummy(typeID, buffer, offset, size); break; } return(packet); }
/// <summary> /// Handles the zone login request packet /// </summary> static public void Handle_CS_Auth(CS_Auth <Zone> pkt, Client <Zone> client) { //Note the login request Log.write(TLog.Normal, "Login request from ({0}): {1} / {2}", client._ipe, pkt.zoneID, pkt.password); //Attempt to find the associated zone DBServer server = client._handler as DBServer; Data.DB.zone dbZone; using (InfantryDataContext db = server.getContext()) dbZone = db.zones.SingleOrDefault(z => z.id == pkt.zoneID); //Does the zone exist? if (dbZone == null) { //Reply with failure SC_Auth <Zone> reply = new SC_Auth <Zone>(); reply.result = SC_Auth <Zone> .LoginResult.Failure; reply.message = "Invalid zone."; client.sendReliable(reply); return; } //Are the passwords a match? if (dbZone.password != pkt.password) { //Oh dear. SC_Auth <Zone> reply = new SC_Auth <Zone>(); reply.result = SC_Auth <Zone> .LoginResult.BadCredentials; client.sendReliable(reply); return; } //Great! Escalate our client object to a zone Zone zone = new Zone(client, server, dbZone); client._obj = zone; server._zones.Add(zone); //Called on connection close / timeout zone._client.Destruct += delegate(NetworkClient nc) { zone.destroy(); }; //Success! SC_Auth <Zone> success = new SC_Auth <Zone>(); success.result = SC_Auth <Zone> .LoginResult.Success; success.message = dbZone.notice; client.sendReliable(success); using (InfantryDataContext db = zone._server.getContext()) { //Update and activate the zone for our directory server //TODO: Don't know why it only works like this, //modifying dbZone and submitting changes doesn't reflect //in the database right away Data.DB.zone zoneentry = db.zones.SingleOrDefault(z => z.id == pkt.zoneID); zoneentry.name = pkt.zoneName; zoneentry.description = pkt.zoneDescription; zoneentry.ip = pkt.zoneIP; zoneentry.port = pkt.zonePort; zoneentry.advanced = Convert.ToInt16(pkt.zoneIsAdvanced); zoneentry.active = 1; db.SubmitChanges(); } Log.write("Successful login from {0} ({1})", dbZone.name, client._ipe); }