/// <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 player's update stat request /// </summary> static public void Handle_CS_StatsUpdate(CS_StatsUpdate <Zone> pkt, Zone zone) { //Find player Zone.Player player = zone.getPlayer(pkt.player.id); if (player == null) { Log.write(TLog.Warning, "Ignoring stat update for id {0}, not present in zone mirror.", pkt.player.id); return; } using (InfantryDataContext db = zone._server.getContext()) { //Get player entry Data.DB.player dbplayer = db.players.SingleOrDefault(p => p.id == player.dbid); if (dbplayer == null) { Log.write(TLog.Warning, "Ignoring stat update for {0}, not present in database.", player.alias); return; } DateTime today = DateTime.Today; switch (pkt.scoreType) { case CS_StatsUpdate <Zone> .ScoreType.ScoreDaily: { //Add to the database Data.DB.statsDaily daily = new Data.DB.statsDaily(); daily.experience = pkt.stats.experience; daily.experienceTotal = pkt.stats.experienceTotal; daily.kills = pkt.stats.kills; daily.deaths = pkt.stats.deaths; daily.killPoints = pkt.stats.killPoints; daily.deathPoints = pkt.stats.deathPoints; daily.assistPoints = pkt.stats.assistPoints; daily.bonusPoints = pkt.stats.bonusPoints; daily.vehicleKills = pkt.stats.vehicleKills; daily.vehicleDeaths = pkt.stats.vehicleDeaths; daily.playSeconds = pkt.stats.playSeconds; daily.zone = zone._zone.id; daily.date = pkt.date; db.SubmitChanges(); } break; case CS_StatsUpdate <Zone> .ScoreType.ScoreWeekly: { //Add to the database Data.DB.statsWeekly weekly = new Data.DB.statsWeekly(); weekly.experience = pkt.stats.experience; weekly.experienceTotal = pkt.stats.experienceTotal; weekly.kills = pkt.stats.kills; weekly.deaths = pkt.stats.deaths; weekly.killPoints = pkt.stats.killPoints; weekly.deathPoints = pkt.stats.deathPoints; weekly.assistPoints = pkt.stats.assistPoints; weekly.bonusPoints = pkt.stats.bonusPoints; weekly.vehicleKills = pkt.stats.vehicleKills; weekly.vehicleDeaths = pkt.stats.vehicleDeaths; weekly.playSeconds = pkt.stats.playSeconds; weekly.zone = zone._zone.id; weekly.date = pkt.date; db.SubmitChanges(); } break; case CS_StatsUpdate <Zone> .ScoreType.ScoreMonthly: { //Add to the database Data.DB.statsMonthly monthly = new Data.DB.statsMonthly(); monthly.experience = pkt.stats.experience; monthly.experienceTotal = pkt.stats.experienceTotal; monthly.kills = pkt.stats.kills; monthly.deaths = pkt.stats.deaths; monthly.killPoints = pkt.stats.killPoints; monthly.deathPoints = pkt.stats.deathPoints; monthly.assistPoints = pkt.stats.assistPoints; monthly.bonusPoints = pkt.stats.bonusPoints; monthly.vehicleKills = pkt.stats.vehicleKills; monthly.vehicleDeaths = pkt.stats.vehicleDeaths; monthly.playSeconds = pkt.stats.playSeconds; monthly.zone = zone._zone.id; monthly.date = pkt.date; db.SubmitChanges(); } break; case CS_StatsUpdate <Zone> .ScoreType.ScoreYearly: { //Add to the database Data.DB.statsYearly yearly = new Data.DB.statsYearly(); yearly.experience = pkt.stats.experience; yearly.experienceTotal = pkt.stats.experienceTotal; yearly.kills = pkt.stats.kills; yearly.deaths = pkt.stats.deaths; yearly.killPoints = pkt.stats.killPoints; yearly.deathPoints = pkt.stats.deathPoints; yearly.assistPoints = pkt.stats.assistPoints; yearly.bonusPoints = pkt.stats.bonusPoints; yearly.vehicleKills = pkt.stats.vehicleKills; yearly.vehicleDeaths = pkt.stats.vehicleDeaths; yearly.playSeconds = pkt.stats.playSeconds; yearly.zone = zone._zone.id; yearly.date = pkt.date; db.SubmitChanges(); } break; } } }