Пример #1
0
        /// <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;
                }
            }
        }