/// <summary>
        /// Writes a scorechart element to a memory stream
        /// </summary>
        static private bool writeElementToBuffer(Data.DB.stats stat, MemoryStream stream)
        {
            try
            {
                Data.DB.player player = stat.players.SingleOrDefault(s => s.stats1.id == stat.id);
                if (player == null)
                {       //Make a note
                    Log.write(TLog.Warning, "No player found for stat ID {0}.", stat.id);
                    return(false);
                }

                BinaryWriter bw = new BinaryWriter(stream);

                bw.Write(player.alias1.name.ToCharArray());
                bw.Write((byte)0);

                Data.DB.squad squad     = player.squad1;
                string        squadname = "";
                if (squad != null)
                {
                    squadname = squad.name;
                }

                bw.Write(squadname.ToCharArray());
                bw.Write((byte)0);

                bw.Write((short)2);
                bw.Write(stat.vehicleDeaths);
                bw.Write(stat.vehicleKills);
                bw.Write(stat.killPoints);
                bw.Write(stat.deathPoints);
                //bw.Write((int)0); //-Assist Points
                bw.Write(stat.assistPoints);
                bw.Write(stat.bonusPoints);
                bw.Write(stat.kills);
                bw.Write(stat.deaths);
                bw.Write((int)0);
                bw.Write(stat.playSeconds);
                bw.Write(stat.zonestat1);
                bw.Write(stat.zonestat2);
                bw.Write(stat.zonestat3);
                bw.Write(stat.zonestat4);
                bw.Write(stat.zonestat5);
                bw.Write(stat.zonestat6);
                bw.Write(stat.zonestat7);
                bw.Write(stat.zonestat8);
                bw.Write(stat.zonestat9);
                bw.Write(stat.zonestat10);
                bw.Write(stat.zonestat11);
                bw.Write(stat.zonestat12);
            }

            catch (Exception e)
            {
                Log.write(TLog.Warning, "WriteElementToBuffer stat.id " + stat.id + ":" + e);
                return(false);
            }

            return(true);
        }
        /// <summary>
        /// Handles a player update request
        /// </summary>
        static public void Handle_CS_SquadMatch(CS_SquadMatch <Zone> pkt, Zone zone)
        {
            using (InfantryDataContext db = zone._server.getContext())
            {
                Data.DB.squad winner = db.squads.FirstOrDefault(s => s.id == pkt.winner);
                Data.DB.squad loser  = db.squads.FirstOrDefault(s => s.id == pkt.loser);

                //Try to trick me, I dare you, do it.
                if (winner == null || loser == null)
                {
                    return;
                }

                Data.DB.squadstats wStats = db.squadstats.FirstOrDefault(s => s.squad == winner.id);
                Data.DB.squadstats lStats = db.squadstats.FirstOrDefault(s => s.squad == loser.id);

                //Again, try it!
                if (wStats == null || lStats == null)
                {
                    return;
                }

                //Update our winners!
                wStats.kills  += pkt.wStats.kills;
                wStats.deaths += pkt.wStats.deaths;
                wStats.points += pkt.wStats.points;
                wStats.wins++;

                //Update our losers!
                lStats.kills  += pkt.wStats.kills;
                lStats.deaths += pkt.wStats.deaths;
                lStats.points += pkt.wStats.points;
                lStats.losses++; //Sad trombone.....

                //Grab our associated match.
                Data.DB.squadmatch match = db.squadmatches.FirstOrDefault(m => m.squad1 == winner.id | m.squad2 == winner.id | m.squad1 == loser.id | m.squad2 == loser.id && m.winner == null);

                //Update it
                match.winner  = pkt.winner;
                match.loser   = pkt.loser;
                match.dateEnd = DateTime.Now;

                //Submit
                db.SubmitChanges();
            }
        }
Example #3
0
        /// <summary>
        /// Handles a query packet
        /// </summary>
        static public void Handle_CS_ModQuery(CS_ModQuery <Zone> pkt, Zone zone)
        {
            using (InfantryDataContext db = zone._server.getContext())
            {
                switch (pkt.queryType)
                {
                case CS_ModQuery <Zone> .QueryType.aliastransfer:
                {
                    if (string.IsNullOrEmpty(pkt.query) || string.IsNullOrEmpty(pkt.aliasTo))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Who the alias is going to
                    Data.DB.alias paliasTo = db.alias.FirstOrDefault(aTo => string.Compare(aTo.name, pkt.aliasTo, true) == 0);
                    if (paliasTo == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cant find the recipient's alias.");
                        return;
                    }

                    //The alias in question
                    Data.DB.alias  alias   = db.alias.FirstOrDefault(a => string.Compare(a.name, pkt.query, true) == 0);
                    Data.DB.player playerA = db.players.FirstOrDefault(p => string.Compare(p.alias1.name, pkt.query, true) == 0);
                    if (alias == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Can't find the alias in question, maybe its not created yet.");
                        return;
                    }

                    if (playerA == null)
                    {
                        //Since structure doesn't exist, go ahead and transfer
                        alias.IPAddress  = paliasTo.IPAddress.Trim();
                        alias.timeplayed = 0;
                        alias.account    = paliasTo.account;
                        alias.account1   = paliasTo.account1;
                        db.SubmitChanges();
                        zone._server.sendMessage(zone, pkt.sender, "Alias transfer completed.");
                        return;
                    }

                    //Check for a squad
                    if (playerA.squad != null)
                    {
                        IQueryable <Data.DB.player> squadmates = db.players.Where(plyr => plyr.zone == playerA.zone && plyr.squad != null && plyr.squad == playerA.squad);
                        if (playerA.squad1.owner == playerA.id)
                        {
                            if (squadmates.Count() > 1)
                            {
                                Data.DB.player temp = squadmates.FirstOrDefault(p => p.id != playerA.id);
                                //Since the player is the owner, lets just give it to someone else
                                temp.squad1.owner = temp.id;
                            }
                            else if (squadmates.Count() == 1)
                            {
                                //Lets delete the squad
                                db.squads.DeleteOnSubmit(playerA.squad1);
                                db.SubmitChanges();
                            }
                        }
                        playerA.squad1 = null;
                        playerA.squad  = null;
                    }
                    //Lets delete stats/player structures
                    //Note: the server will treat this as a new alias and create structures
                    db.stats.DeleteOnSubmit(playerA.stats1);
                    db.players.DeleteOnSubmit(playerA);

                    //Now lets transfer
                    alias.IPAddress  = paliasTo.IPAddress.Trim();
                    alias.timeplayed = 0;
                    alias.account    = paliasTo.account;
                    alias.account1   = paliasTo.account1;
                    db.SubmitChanges();
                    zone._server.sendMessage(zone, pkt.sender, "Alias transfer completed.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.aliasremove:
                {
                    if (string.IsNullOrEmpty(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Lets get all account related info then delete it
                    Data.DB.alias  palias = db.alias.FirstOrDefault(a => string.Compare(a.name, pkt.query, true) == 0);
                    Data.DB.player player = db.players.FirstOrDefault(p => string.Compare(p.alias1.name, pkt.query, true) == 0);
                    if (palias == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified alias.");
                        return;
                    }

                    if (player == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified player.");
                        return;
                    }

                    //Check for a squad
                    if (player.squad != null)
                    {
                        IQueryable <Data.DB.player> squadmates = db.players.Where(plyr => plyr.zone == player.zone && plyr.squad != null && plyr.squad == player.squad);
                        if (player.squad1.owner == player.id)
                        {
                            if (squadmates.Count() > 1)
                            {
                                Data.DB.player temp = squadmates.FirstOrDefault(p => p.id != player.id);
                                //Since the player is the owner, lets just give it to someone else
                                temp.squad1.owner = temp.id;
                            }
                            else if (squadmates.Count() == 1)
                            {
                                //Lets delete the squad
                                db.squads.DeleteOnSubmit(player.squad1);
                            }
                            db.SubmitChanges();
                        }
                        player.squad1 = null;
                        player.squad  = null;
                    }

                    //Now lets remove stats
                    db.stats.DeleteOnSubmit(player.stats1);
                    //Next the player structure
                    db.players.DeleteOnSubmit(player);
                    //Finally the alias
                    db.alias.DeleteOnSubmit(palias);
                    db.SubmitChanges();
                    zone._server.sendMessage(zone, pkt.sender, "Alias has been deleted.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.aliasrename:
                {
                    if (string.IsNullOrEmpty(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Get all account related info
                    Data.DB.alias paliasTo = db.alias.FirstOrDefault(aTo => string.Compare(aTo.name, pkt.aliasTo, true) == 0);
                    Data.DB.alias alias    = db.alias.FirstOrDefault(a => string.Compare(a.name, pkt.query, true) == 0);
                    //Player even alive?
                    if (paliasTo == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified alias.");
                        return;
                    }

                    string name = paliasTo.name;

                    //Does the payload already exist?
                    if (alias == null)
                    {
                        paliasTo.name = pkt.query;
                        db.SubmitChanges();
                        zone._server.sendMessage(zone, pkt.sender, "Renamed player " + name + " to " + pkt.query + " has been completed.");
                        return;
                    }

                    if (alias.account1 != paliasTo.account1)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "That alias is already being used.");
                        return;
                    }

                    if (alias.id != paliasTo.id)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot change an alias to one already existing on the account.");
                        return;
                    }

                    paliasTo.name = pkt.query;
                    db.SubmitChanges();

                    zone._server.sendMessage(zone, pkt.sender, "Renamed player " + name + " to " + pkt.query + " has been completed.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.mod:
                {
                    if (string.IsNullOrEmpty(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Lets get all account related info
                    Data.DB.alias   palias  = db.alias.FirstOrDefault(a => string.Compare(a.name, pkt.query, true) == 0);
                    Data.DB.account account = db.accounts.FirstOrDefault(p => p.id == palias.account1.id);
                    if (palias == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified alias.");
                        return;
                    }

                    if (account == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified account.");
                        return;
                    }

                    //Lets mod/de-mod them
                    account.permission = pkt.level;
                    db.SubmitChanges();
                    zone._server.sendMessage(zone, pkt.sender, "Changing player " + palias.name + "'s level to " + pkt.level + " has been completed.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.dev:
                {
                    if (string.IsNullOrEmpty(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Lets get all account related info
                    Data.DB.player player = (from plyr in db.players
                                             where string.Compare(plyr.alias1.name, pkt.query, true) == 0 && plyr.zone1 == zone._zone
                                             select plyr).FirstOrDefault();
                    if (player == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified alias.");
                        return;
                    }

                    //Lets mod/de-mod them
                    player.permission = (short)pkt.level;

                    db.SubmitChanges();
                    zone._server.sendMessage(zone, pkt.sender, "Changing player " + player.alias1.name + "'s dev level to " + pkt.level + " has been completed.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.squadtransfer:
                {
                    if (string.IsNullOrEmpty(pkt.aliasTo) || string.IsNullOrEmpty(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Lets find the player first
                    Data.DB.player dbplayer = db.zones.First(z => z.id == zone._zone.id).players.FirstOrDefault(p => string.Compare(p.alias1.name, pkt.aliasTo, true) == 0);
                    if (dbplayer == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the player.");
                        return;
                    }

                    //Lets find the squad in question
                    Data.DB.squad squad = db.squads.First(s => string.Compare(s.name, pkt.query, true) == 0 && s.zone == zone._zone.id);
                    if (squad == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified squad.");
                        return;
                    }

                    //Are they in a squad?
                    if (dbplayer.squad != null)
                    {
                        //Is it the same squad?
                        if (dbplayer.squad != squad.id)
                        {
                            zone._server.sendMessage(zone, pkt.sender, "That player isn't on the same squad.");
                            return;
                        }
                        //Transfer
                        dbplayer.squad1.owner = dbplayer.id;
                    }
                    else
                    {
                        dbplayer.squad        = squad.id;
                        dbplayer.squad1.owner = dbplayer.id;
                    }
                    db.SubmitChanges();
                    zone._server.sendMessage(zone, dbplayer.alias1.name, "You have been promoted to squad captain of " + dbplayer.squad1.name);
                    zone._server.sendMessage(zone, dbplayer.alias1.name, "Please relog to complete the process.");
                    zone._server.sendMessage(zone, pkt.sender, "Squad transferring is complete.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.squadjoin:
                {
                    if (string.IsNullOrWhiteSpace(pkt.aliasTo) || string.IsNullOrWhiteSpace(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Wrong format typed.");
                        return;
                    }

                    //Lets find the player first
                    Data.DB.player dbplayer = db.zones.First(z => z.id == zone._zone.id).players.FirstOrDefault(p => string.Compare(p.alias1.name, pkt.aliasTo, true) == 0);
                    if (dbplayer == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the player.");
                        return;
                    }

                    //Lets find the squad in question
                    Data.DB.squad squad = db.squads.FirstOrDefault(s => string.Compare(s.name, pkt.query, true) == 0 && s.zone == zone._zone.id);
                    if (squad == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified squad.");
                        return;
                    }

                    //Already squad joined somewhere?
                    if (dbplayer.squad != null)
                    {
                        //Get his squad brothers! (if any...)
                        IQueryable <Data.DB.player> squadmates = db.players.Where(p => p.zone == dbplayer.zone && p.squad != null && p.squad == dbplayer.squad);

                        //Is he the captain?
                        if (dbplayer.squad1.owner == dbplayer.id)
                        {           //We might need to dissolve the team!
                            if (squadmates.Count() == 1)
                            {       //He's the only one left on the squad... dissolve it!
                                db.squads.DeleteOnSubmit(dbplayer.squad1);
                                db.SubmitChanges();
                                dbplayer.squad1 = null;
                                dbplayer.squad  = null;
                            }
                            else
                            {           //There are other people on the squad, transfer it to someone
                                Data.DB.player transferPlayer = squadmates.FirstOrDefault(p => p.id != dbplayer.id);
                                dbplayer.squad1.owner = transferPlayer.id;
                                db.SubmitChanges();
                                zone._server.sendMessage(zone, transferPlayer.alias1.name, "You have been promoted to squad captain of " + transferPlayer.squad1.name);
                            }
                        }
                    }

                    dbplayer.squad = squad.id;
                    db.SubmitChanges();
                    zone._server.sendMessage(zone, dbplayer.alias1.name, "You have joined " + squad.name);
                    zone._server.sendMessage(zone, dbplayer.alias1.name, "Please relog to complete the process.");
                    zone._server.sendMessage(zone, pkt.sender, "Squad joining completed.");
                }
                break;

                case CS_ModQuery <Zone> .QueryType.powered:
                {
                    if (string.IsNullOrWhiteSpace(pkt.query))
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Payload cannot be empty.");
                        return;
                    }

                    if (pkt.query.Equals("list"))
                    {
                        Data.DB.player sender = db.players.FirstOrDefault(p => string.Compare(p.alias1.name, pkt.sender, true) == 0 && p.zone == zone._zone.id);
                        if (sender == null)
                        {
                            return;
                        }

                        SortedDictionary <string, string> powered = new SortedDictionary <string, string>();
                        string pAlias;
                        foreach (Zone z in zone._server._zones)
                        {
                            foreach (KeyValuePair <int, Zone.Player> Player in z._players)
                            {
                                pAlias = Player.Value.alias;
                                var alias = db.alias.SingleOrDefault(p => string.Compare(p.name, pAlias, true) == 0);
                                if (alias == null)
                                {
                                    continue;
                                }
                                if (alias.name == pkt.sender)
                                {
                                    continue;
                                }
                                //Are they a global mod?
                                if (alias.account1.permission > 0)
                                {
                                    //Are they higher than us?
                                    if (alias.account1.permission > sender.alias1.account1.permission &&
                                        alias.account1.permission > sender.permission)
                                    {
                                        continue;
                                    }
                                    powered.Add(pAlias, string.Format("*{0} - Lvl({1})", pAlias, alias.account1.permission.ToString()));
                                }
                                else
                                {
                                    var player = db.zones.First(zones => zones.id == z._zone.id).players.First(p => p.alias1 == alias);
                                    if (player != null && player.permission > 0)
                                    {
                                        //Are they higher than us?
                                        if (player.permission > sender.permission &&
                                            player.alias1.account1.permission > sender.alias1.account1.permission)
                                        {
                                            continue;
                                        }
                                        powered.Add(pAlias, string.Format("*{0} - Lvl({1})(dev)", pAlias, player.permission.ToString()));
                                    }
                                }
                            }
                        }

                        //Now send it!
                        if (powered.Count > 0)
                        {
                            foreach (string str in powered.Values)
                            {
                                zone._server.sendMessage(zone, pkt.sender, str);
                            }
                        }
                        else
                        {
                            zone._server.sendMessage(zone, pkt.sender, "Empty.");
                        }
                    }
                }
                break;

                case CS_ModQuery <Zone> .QueryType.find:
                {
                    zone._server.sendMessage(zone, pkt.sender, "&Search Results:");

                    Data.DB.alias alias = db.alias.SingleOrDefault(ali => string.Compare(ali.name, pkt.query, true) == 0);
                    if (alias == null)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified alias.");
                        return;
                    }

                    bool found = false;
                    IQueryable <Data.DB.alias> foundAlias = db.alias.Where(d => (d.IPAddress.Equals(alias.IPAddress) || d.account == alias.account));
                    foreach (KeyValuePair <string, Zone.Player> player in zone._server._players)
                    {
                        foreach (Data.DB.alias p in foundAlias)
                        {
                            if (player.Value.alias.Equals(p.name))
                            {
                                zone._server.sendMessage(zone, pkt.sender, string.Format("*Found: {0} Zone: {1} Arena: {2}", p.name, player.Value.zone._zone.name, !String.IsNullOrWhiteSpace(player.Value.arena) ? player.Value.arena : "Unknown Arena"));
                                found = true;
                            }
                        }
                    }
                    if (!found)
                    {
                        zone._server.sendMessage(zone, pkt.sender, "Cannot find the specified alias.");
                    }
                }
                break;
                }
            }
        }
        /// <summary>
        /// Handles a player stat request
        /// </summary>
        static public void Handle_CS_PlayerStatsRequest(CS_PlayerStatsRequest <Zone> pkt, Zone zone)
        {       //Attempt to find the player in question
            Zone.Player player = zone.getPlayer(pkt.player.id);
            if (player == null)
            {   //Make a note
                Log.write(TLog.Warning, "Ignoring player stats request for #{0}, not present in zone mirror.", pkt.player.id);
                return;
            }

            using (InfantryDataContext db = zone._server.getContext())
            {   //What sort of request are we dealing with?
                switch (pkt.type)
                {
                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreLifetime:
                {               //Get the top100 stats sorted by points
                    var stats = (from st in db.stats
                                 where st.zone1 == zone._zone
                                 orderby st.assistPoints + st.bonusPoints + st.killPoints descending
                                 select st).Take(100);

                    MemoryStream stream = new MemoryStream();
                    foreach (Data.DB.stats lifetime in stats)
                    {
                        if (lifetime != null && writeElementToBuffer(lifetime, stream) == false)
                        {
                            continue;
                        }
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreLifetime;
                    response.columns = "Top100 Lifetime Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreDaily:
                {
                    DateTime now = DateTime.Today;

                    //Get the top100 stats sorted by points
                    //For today's date
                    var daily = (from dt in db.statsDailies
                                 where dt.zone1 == zone._zone && dt.date >= now
                                 orderby dt.assistPoints + dt.bonusPoints + dt.killPoints descending
                                 select dt).Take(100);

                    //Are they requesting a specific date?
                    if (pkt.options != "")
                    {
                        //Player wants to see yesterday's date
                        if (pkt.options.Equals("-1"))
                        {
                            DateTime today = now;
                            now   = now.AddDays(-1);
                            daily = (from dt in db.statsDailies
                                     where dt.zone1 == zone._zone && dt.date >= now && dt.date < today
                                     orderby dt.assistPoints + dt.bonusPoints + dt.killPoints descending
                                     select dt).Take(100);
                        }
                        else         //Specific date
                        {
                            string[] args  = pkt.options.Split('-');
                            string   final = string.Join("/", args);
                            try
                            {
                                now = DateTime.Parse(final, System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                            }
                            catch (FormatException)
                            {
                                //Wrong format, use yesterday as default
                                now = (now.AddDays(-1));
                            }
                            DateTime add = now.AddDays(1);

                            daily = (from dt in db.statsDailies
                                     where dt.zone1 == zone._zone && dt.date >= now && dt.date < add
                                     orderby dt.assistPoints + dt.bonusPoints + dt.killPoints descending
                                     select dt).Take(100);
                        }
                    }

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsDaily day in daily)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(day.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = day.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(day.vehicleDeaths);
                            bw.Write(day.vehicleKills);
                            bw.Write(day.killPoints);
                            bw.Write(day.deathPoints);
                            bw.Write(day.assistPoints);
                            bw.Write(day.bonusPoints);
                            bw.Write(day.kills);
                            bw.Write(day.deaths);
                            bw.Write((int)0);
                            bw.Write(day.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementDaily " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreDaily;
                    response.columns = "Top100 Daily Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreWeekly:
                {
                    DateTime now = DateTime.Today;
                    if (((int)now.DayOfWeek) > 0)
                    {
                        now = now.AddDays(-((int)now.DayOfWeek));
                    }

                    //Get the top100 stats sorted by points
                    //For this week
                    var weekly = (from wt in db.statsWeeklies
                                  where wt.zone1 == zone._zone && wt.date >= now
                                  orderby wt.assistPoints + wt.bonusPoints + wt.killPoints descending
                                  select wt).Take(100);

                    //Are they requesting a specific date?
                    if (pkt.options != "")
                    {
                        //Player wants to see last week's date
                        if (pkt.options.Equals("-1"))
                        {
                            DateTime today = now;
                            now    = now.AddDays(-7);
                            weekly = (from wt in db.statsWeeklies
                                      where wt.zone1 == zone._zone && wt.date >= now && wt.date < today
                                      orderby wt.assistPoints + wt.bonusPoints + wt.killPoints descending
                                      select wt).Take(100);
                        }
                        else         //Specific date
                        {
                            string[] args  = pkt.options.Split('-');
                            string   final = string.Join("/", args);
                            try
                            {
                                now = DateTime.Parse(final, System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                            }
                            catch (FormatException)
                            {
                                //Wrong format, use last week as default
                                now = (now.AddDays(-7));
                            }
                            DateTime add = now.AddDays(7);

                            weekly = (from wt in db.statsWeeklies
                                      where wt.zone1 == zone._zone && wt.date >= now && wt.date < add
                                      orderby wt.assistPoints + wt.bonusPoints + wt.killPoints descending
                                      select wt).Take(100);
                        }
                    }

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsWeekly week in weekly)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(week.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = week.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(week.vehicleDeaths);
                            bw.Write(week.vehicleKills);
                            bw.Write(week.killPoints);
                            bw.Write(week.deathPoints);
                            bw.Write(week.assistPoints);
                            bw.Write(week.bonusPoints);
                            bw.Write(week.kills);
                            bw.Write(week.deaths);
                            bw.Write((int)0);
                            bw.Write(week.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementWeekly " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreWeekly;
                    response.columns = "Top100 Weekly Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreMonthly:
                {
                    DateTime now = DateTime.Today;
                    if (((int)now.Day - 1) > 1)
                    {
                        now = now.AddDays(-(((int)now.Day) - 1));
                    }

                    //Get the top100 stats sorted by points
                    //For this month
                    var monthly = (from mt in db.statsMonthlies
                                   where mt.zone1 == zone._zone && mt.date >= now
                                   orderby mt.assistPoints + mt.bonusPoints + mt.killPoints descending
                                   select mt).Take(100);

                    //Are they requesting a specific date?
                    if (pkt.options != "")
                    {
                        //Player wants to see last month's date
                        if (pkt.options.Equals("-1"))
                        {
                            DateTime today = now;
                            now     = now.AddMonths(-1);
                            monthly = (from mt in db.statsMonthlies
                                       where mt.zone1 == zone._zone && mt.date >= now && mt.date < today
                                       orderby mt.assistPoints + mt.bonusPoints + mt.killPoints descending
                                       select mt).Take(100);
                        }
                        else         //Specific date
                        {
                            string[] args  = pkt.options.Split('-');
                            string   final = string.Join("/", args);
                            //Since the client only gives month/year, lets start from day 1
                            final = String.Format("{0}/01", final);
                            try
                            {
                                now = DateTime.Parse(final, System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                            }
                            catch (FormatException)
                            {
                                //Wrong format, use last month as default
                                now = (now.AddMonths(-1));
                            }
                            DateTime add = now.AddMonths(1);

                            monthly = (from mt in db.statsMonthlies
                                       where mt.zone1 == zone._zone && mt.date >= now && mt.date < add
                                       orderby mt.assistPoints + mt.bonusPoints + mt.killPoints descending
                                       select mt).Take(100);
                        }
                    }

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsMonthly month in monthly)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(month.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = month.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(month.vehicleDeaths);
                            bw.Write(month.vehicleKills);
                            bw.Write(month.killPoints);
                            bw.Write(month.deathPoints);
                            bw.Write(month.assistPoints);
                            bw.Write(month.bonusPoints);
                            bw.Write(month.kills);
                            bw.Write(month.deaths);
                            bw.Write((int)0);
                            bw.Write(month.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementMonthly " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreMonthly;
                    response.columns = "Top100 Monthly Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreYearly:
                {
                    DateTime now = DateTime.Today;
                    if (((int)now.Month) > 1)
                    {
                        now = now.AddMonths(-((int)DateTime.Now.Month));
                    }

                    //Get the top100 stats sorted by points
                    var yearly = (from yt in db.statsYearlies
                                  where yt.zone1 == zone._zone && yt.date >= now
                                  orderby yt.assistPoints + yt.bonusPoints + yt.killPoints descending
                                  select yt).Take(100);

                    //Are they requesting a specific date?
                    if (pkt.options != "")
                    {
                        //Player wants to see last years date
                        if (pkt.options.Equals("-1"))
                        {
                            now    = now.AddYears(-1);
                            yearly = (from yt in db.statsYearlies
                                      where yt.zone1 == zone._zone && yt.date >= now
                                      orderby yt.assistPoints + yt.bonusPoints + yt.killPoints descending
                                      select yt).Take(100);
                        }
                        else         //Specific date
                        {
                            //Since the client only gives the year, lets start from jan 1st
                            string final = String.Format("{0}/01/01", pkt.options);
                            try
                            {
                                now = DateTime.Parse(final, System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                            }
                            catch (FormatException)
                            {
                                //Wrong format, use last year as default
                                now = (now.AddYears(-1));
                            }
                            DateTime add = now.AddYears(1);

                            yearly = (from yt in db.statsYearlies
                                      where yt.zone1 == zone._zone && yt.date >= now && yt.date <= add
                                      orderby yt.assistPoints + yt.bonusPoints + yt.killPoints descending
                                      select yt).Take(100);
                        }
                    }

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsYearly year in yearly)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(year.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = year.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(year.vehicleDeaths);
                            bw.Write(year.vehicleKills);
                            bw.Write(year.killPoints);
                            bw.Write(year.deathPoints);
                            bw.Write(year.assistPoints);
                            bw.Write(year.bonusPoints);
                            bw.Write(year.kills);
                            bw.Write(year.deaths);
                            bw.Write((int)0);
                            bw.Write(year.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementYear " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreYearly;
                    response.columns = "Top100 Yearly Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryDaily:
                {
                    Data.DB.alias  getAlias  = db.alias.FirstOrDefault(a => a.name.Equals(pkt.options));
                    Data.DB.player getPlayer = db.players.FirstOrDefault(p => p.alias1 == getAlias && p.zone == zone._zone.id);
                    if (getPlayer == null)
                    {
                        return;
                    }

                    //Lets give them a year's worth
                    DateTime now = DateTime.Today;
                    if (((int)now.DayOfYear - 1) > 1)
                    {
                        now = now.AddDays(-(((int)now.DayOfYear) - 1));
                    }

                    DateTime today = DateTime.Today;
                    var      daily = (from dt in db.statsDailies
                                      where dt.zone1 == zone._zone && dt.date >= now && dt.date < today
                                      orderby dt.date descending
                                      select dt);

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsDaily day in daily)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(day.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = day.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(day.vehicleDeaths);
                            bw.Write(day.vehicleKills);
                            bw.Write(day.killPoints);
                            bw.Write(day.deathPoints);
                            bw.Write(day.assistPoints);
                            bw.Write(day.bonusPoints);
                            bw.Write(day.kills);
                            bw.Write(day.deaths);
                            bw.Write((int)0);
                            bw.Write(day.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementHistoryDailly " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryDaily;
                    response.columns = "ScoreHistory Daily Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryWeekly:
                {
                    Data.DB.alias  getAlias  = db.alias.FirstOrDefault(a => a.name.Equals(pkt.options));
                    Data.DB.player getPlayer = db.players.FirstOrDefault(p => p.alias1 == getAlias && p.zone == zone._zone.id);
                    if (getPlayer == null)
                    {
                        return;
                    }

                    //Lets give them a year's worth
                    DateTime now = DateTime.Today;
                    if (((int)now.DayOfWeek) > 0)
                    {
                        now = now.AddDays(-(((int)now.DayOfWeek) - 1));
                    }
                    DateTime today = now;
                    now = now.AddMonths(-((int)now.Month - 1));

                    var weekly = (from wt in db.statsWeeklies
                                  where wt.zone1 == zone._zone && wt.date >= now && wt.date < today
                                  orderby wt.date descending
                                  select wt);

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsWeekly week in weekly)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(week.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = week.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(week.vehicleDeaths);
                            bw.Write(week.vehicleKills);
                            bw.Write(week.killPoints);
                            bw.Write(week.deathPoints);
                            bw.Write(week.assistPoints);
                            bw.Write(week.bonusPoints);
                            bw.Write(week.kills);
                            bw.Write(week.deaths);
                            bw.Write((int)0);
                            bw.Write(week.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementHistoryWeekly " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryWeekly;
                    response.columns = "ScoreHistory Weekly Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryMonthly:
                {
                    Data.DB.alias  getAlias  = db.alias.FirstOrDefault(a => a.name.Equals(pkt.options));
                    Data.DB.player getPlayer = db.players.FirstOrDefault(p => p.alias1 == getAlias && p.zone == zone._zone.id);
                    if (getPlayer == null)
                    {
                        return;
                    }

                    //Lets give them a year's worth
                    DateTime now = DateTime.Today;
                    if (((int)now.Day - 1) > 1)
                    {
                        now = now.AddDays(-(((int)now.Day) - 1));
                    }
                    DateTime today = now;
                    now = now.AddMonths(-((int)now.Month - 1));

                    var monthly = (from mt in db.statsMonthlies
                                   where mt.zone1 == zone._zone && mt.date >= now && mt.date < today
                                   orderby mt.date descending
                                   select mt);

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsMonthly month in monthly)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(month.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = month.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(month.vehicleDeaths);
                            bw.Write(month.vehicleKills);
                            bw.Write(month.killPoints);
                            bw.Write(month.deathPoints);
                            bw.Write(month.assistPoints);
                            bw.Write(month.bonusPoints);
                            bw.Write(month.kills);
                            bw.Write(month.deaths);
                            bw.Write((int)0);
                            bw.Write(month.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementHistoryMonthly " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryMonthly;
                    response.columns = "ScoreHistory Monthly Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;

                case CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryYearly:
                {
                    Data.DB.alias  getAlias  = db.alias.FirstOrDefault(a => a.name.Equals(pkt.options));
                    Data.DB.player getPlayer = db.players.FirstOrDefault(p => p.alias1 == getAlias && p.zone == zone._zone.id);
                    if (getPlayer == null)
                    {
                        return;
                    }

                    //Lets give them a year's worth
                    DateTime now = DateTime.Today;
                    if (((int)now.Day - 1) > 1)
                    {
                        now = now.AddDays(-(((int)now.Day) - 1));
                    }
                    DateTime today = now;
                    now = now.AddMonths(-((int)now.Month - 1));

                    var yearly = (from yt in db.statsYearlies
                                  where yt.zone1 == zone._zone && yt.date >= now && yt.date < today
                                  orderby yt.date descending
                                  select yt);

                    MemoryStream stream = new MemoryStream();
                    try
                    {
                        foreach (Data.DB.statsYearly year in yearly)
                        {
                            BinaryWriter bw = new BinaryWriter(stream);
                            bw.Write(year.players[0].alias1.name.ToCharArray());
                            bw.Write((byte)0);

                            Data.DB.squad squad     = year.players[0].squad1;
                            string        squadname = "";
                            if (squad != null)
                            {
                                squadname = squad.name;
                            }

                            bw.Write(squadname.ToCharArray());
                            bw.Write((byte)0);

                            bw.Write((short)2);
                            bw.Write(year.vehicleDeaths);
                            bw.Write(year.vehicleKills);
                            bw.Write(year.killPoints);
                            bw.Write(year.deathPoints);
                            bw.Write(year.assistPoints);
                            bw.Write(year.bonusPoints);
                            bw.Write(year.kills);
                            bw.Write(year.deaths);
                            bw.Write((int)0);
                            bw.Write(year.playSeconds);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.write(TLog.Warning, "WriteElementHistoryYearly " + e);
                    }

                    SC_PlayerStatsResponse <Zone> response = new SC_PlayerStatsResponse <Zone>();

                    response.player  = pkt.player;
                    response.type    = CS_PlayerStatsRequest <Zone> .ChartType.ScoreHistoryYearly;
                    response.columns = "ScoreHistory Yearly Score,Name,Squad";
                    response.data    = stream.ToArray();

                    zone._client.sendReliable(response, 1);
                }
                break;
                }
            }
        }
Example #5
0
        /// <summary>
        /// Indicates that a player has joined the zone server
        /// </summary>
        public bool newPlayer(int id, string alias, Data.DB.player dbplayer)
        {
            if (string.IsNullOrWhiteSpace(alias))
            {
                Log.write(TLog.Error, "Zone.newPlayer(): Called with no alias.");
                return(false);
            }
            if (id == 0)
            {
                Log.write(TLog.Error, "Zone.newPlayer(): ID was 0 for player '{0}.", alias);
            }
            if (dbplayer == null)
            {
                Log.write(TLog.Error, "Zone.getPlayer(): Called with null dbplayer for '{0}'.", alias);
                return(false);
            }

            Player player = new Player();

            player.acctid     = dbplayer.alias1.account1.id;
            player.aliasid    = dbplayer.alias1.id;
            player.IPAddress  = dbplayer.alias1.IPAddress;
            player.dbid       = dbplayer.id;
            player.alias      = alias;
            player.permission = dbplayer.permission;
            player.zone       = this;
            player.arena      = "";
            player.chats      = new List <string>();

            // Add them to the Zone players list
            try
            {
                _players.Add(id, player);
            }
            catch
            {
                Log.write(TLog.Error, "Zone.newPlayer(): Key '{0}' already exists for player '{1}'.", id, alias);
                return(false);
            }

            // And the global list
            if (!_server.newPlayer(player))
            {
                // Back out of the zone list
                _players.Remove(id);

                return(false);
            }

            // Squad shit
            using (Data.InfantryDataContext db = _server.getContext())
            {
                Data.DB.squad pSquad = db.squads.FirstOrDefault(s => s.id == dbplayer.squad);

                //Is he in a squad?
                if (pSquad != null)
                {
                    //Check for any scheduled matches this squad may have
                    IQueryable <Data.DB.squadmatch> matches = db.squadmatches.Where
                                                                  (m => m.squad1 == pSquad.id || m.squad2 == pSquad.id);


                    if (matches.Count() > 0)
                    {
                        foreach (Data.DB.squadmatch match in matches)
                        {
                            Data.DB.squad squad1 = db.squads.FirstOrDefault(s => s.id == match.squad1);
                            Data.DB.squad squad2 = db.squads.FirstOrDefault(s => s.id == match.squad2);
                            _server.sendMessage(this, alias, string.Format("Your squad has a scheduled match at {0} ({1} vs {2})",
                                                                           match.dateBegin.ToString(), squad1.name, squad2.name));
                        }
                    }
                }
            }

            return(true);
        }