/// <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 a query packet /// </summary> static public void Handle_CS_Ban(CS_Ban <Zone> pkt, Zone zone) { using (InfantryDataContext db = zone._server.getContext()) { Data.DB.alias dbplayer = db.alias.First(p => string.Compare(p.name, pkt.alias, true) == 0); //Lets check to see if they are banned already foreach (Data.DB.ban b in db.bans.Where(b => b.account == dbplayer.account1.id)) { //Same type? if (b.type != (short)pkt.banType) { continue; } //Zone ban? if ((short)pkt.banType == (int)Logic_Bans.Ban.BanType.ZoneBan) { if (b.zone == null) { continue; } if (b.zone != zone._zone.id) { continue; } } if (pkt.time != 0) { //Dont update old bans if (DateTime.Now > b.expires) { continue; } b.expires = b.expires.AddMinutes(pkt.time); } //Are we unbanning them? else if (pkt.time == 0) { b.expires = DateTime.Now; } b.reason = b.reason.ToString(); db.SubmitChanges(); return; } Data.DB.ban newBan = new Data.DB.ban(); switch (pkt.banType) { case CS_Ban <Zone> .BanType.zone: { //Check for updating the ban newBan.type = (short)Logic_Bans.Ban.BanType.ZoneBan; if (pkt.time == 0) { newBan.expires = DateTime.Now; } else { newBan.expires = DateTime.Now.AddMinutes(pkt.time); } newBan.created = DateTime.Now; newBan.uid1 = pkt.UID1; newBan.uid2 = pkt.UID2; newBan.uid3 = pkt.UID3; newBan.account = dbplayer.account; newBan.IPAddress = dbplayer.IPAddress; newBan.zone = zone._zone.id; newBan.reason = pkt.reason; newBan.name = dbplayer.name; } break; case CS_Ban <Zone> .BanType.account: { newBan.type = (short)Logic_Bans.Ban.BanType.AccountBan; if (pkt.time == 0) { newBan.expires = DateTime.Now; } else { newBan.expires = DateTime.Now.AddMinutes(pkt.time); } newBan.created = DateTime.Now; newBan.uid1 = pkt.UID1; newBan.uid2 = pkt.UID2; newBan.uid3 = pkt.UID3; newBan.account = dbplayer.account; newBan.IPAddress = dbplayer.IPAddress; newBan.reason = pkt.reason; newBan.name = dbplayer.name; } break; case CS_Ban <Zone> .BanType.ip: { newBan.type = (short)Logic_Bans.Ban.BanType.IPBan; if (pkt.time == 0) { newBan.expires = DateTime.Now; } else { newBan.expires = DateTime.Now.AddMinutes(pkt.time); } newBan.created = DateTime.Now; newBan.uid1 = pkt.UID1; newBan.uid2 = pkt.UID2; newBan.uid3 = pkt.UID3; newBan.account = dbplayer.account; newBan.IPAddress = dbplayer.IPAddress; newBan.reason = pkt.reason; newBan.name = dbplayer.name; } break; case CS_Ban <Zone> .BanType.global: { newBan.type = (short)Logic_Bans.Ban.BanType.GlobalBan; if (pkt.time == 0) { newBan.expires = DateTime.Now; } else { newBan.expires = DateTime.Now.AddMinutes(pkt.time); } newBan.created = DateTime.Now; newBan.uid1 = pkt.UID1; newBan.uid2 = pkt.UID2; newBan.uid3 = pkt.UID3; newBan.account = dbplayer.account; newBan.IPAddress = dbplayer.IPAddress; newBan.reason = pkt.reason; newBan.name = dbplayer.name; } break; } db.bans.InsertOnSubmit(newBan); db.SubmitChanges(); } }