Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

BattleLogic.cs

Joined
Sep 10, 2007
Messages
970
Reaction score
815
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Viral
{
    class DeathMatchLogic : IBattleLogic
    {
        public void OnBattleInitialStart(Client client) {
            client.Stage.State = StageState.Standby;
            client.Stage.RoundState = RoundState.Prepare;
            client.Stage.Team1Score = 0;
            client.Stage.Team2Score = 0;

            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet2 = new Packet(Operation.StageLaunch);
            packet2.Write(client.Stage.ID);
            packet2.Write(client.Stage.MapName);

            foreach (Client c in clients)
            {
                Helper.RegisterGenericBattleCallbacks(c);
                c.KillCount = 0;
                c.DeathCount = 0;
                c.InBattle = true;
                c.EnteredBattle = false;
                c.RequestedBattleInfo = false;
                c.Alive = false;
                // c.Send(packet);  /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
                c.Send(packet2);
            }
        }
        public void OnBattleJoin(Client client) {
            client.InBattle = true;
            client.Alive = false;
            client.LateJoin = true;
            // check state // maybe set a bool marking them as a newbie
            CheckBattleState(client);
        }
        public void OnBattleLeave(Client client) {
            List<Client> clis = null;
            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
            pStageLeaveBattle.Write(client.SessionID);
            pStageLeaveBattle.Write(client.Stage.ID);

            foreach (Client cli in clis)
                cli.Send(pStageLeaveBattle);

            client.InBattle = false;
            client.EnteredBattle = false;
            client.RequestedBattleInfo = false;
            client.Alive = false;
            Helper.UnregisterAllBattleCallbacks(client);
            CheckBattleState(client);
            
        }
        public void OnBattleKill(Client client, Client killer) {

            client.Alive = false;
            List<Client> clis = null;

            Packet packetdead = new Packet(Operation.GameDead);
            packetdead.Write(killer.SessionID);
            packetdead.Write((UInt32)0x0);
            packetdead.Write(client.SessionID);
            packetdead.Write((UInt32)0x0);

            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            foreach (Client cli in clis)
                cli.Send(packetdead);

            client.DeathCount++;
            client.RoundDeaths++;
            if (killer.SessionID != client.SessionID)
            {
                killer.KillCount++;
                killer.RoundKills++;
            }
            CheckBattleState(client);
            // check win state.
        }
        public void OnBattleSuicide(Client client) { 

        }
        public void OnBattleLoaded(Client client) {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = new List<Client>(client.Stage.Clients);
            client.Loaded = true;
            Packet packet = new Packet(Operation.StageLoaded);
            packet.Write(client.SessionID);
            packet.Write((UInt32)0x64);
            foreach (Client cli in clients)
                cli.Send(packet);
            CheckBattleState(client);
        }
        public void OnBattleInfoRequest(Client client) {
            client.RequestedBattleInfo = true;
            if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
            { 
                
            }
            CheckBattleState(client);
        }
        public void OnBattleEnterRequest(Client client) {
            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet = new Packet(Operation.StageEnterBattleResponse);

            if (client.Stage.State == StageState.Standby)
                packet.Write(Convert.ToByte(0));
            else
                packet.Write(Convert.ToByte(1));
            packet.Write(166, 1);

            /* possible loop entire client stage list in one packet */
            Client c = client;
            packet.Write(c.SessionID);
            if (c.Bridge != null)
            {
                packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
                packet.Write(c.Bridge.Port);
            }
            else
            {
                packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
                packet.Write((int)0x00);
            }
            packet.Write(c.Character.Name, 32);
            packet.Write(c.Character.ClanName, 16);
            packet.Write((Int32)c.Character.ClanRank);
            packet.Write(c.Character.ClanPoints);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(c.Character.Level));
            packet.Write((byte)c.Character.Gender);
            packet.Write((byte)c.Character.Hair);
            packet.Write((byte)c.Character.Face);
            packet.Write(c.Character.Experience);
            packet.Write(c.Character.Bounty);
            packet.Write(c.Character.Bonus);
            packet.Write(c.Character.Prize);
            packet.Write(c.Character.Health);
            packet.Write(c.Character.Armor);
            packet.Write(c.Character.MaxWeight);
            packet.Write(c.Character.SafeFalls);
            packet.Write(c.Character.FR);
            packet.Write(c.Character.CR);
            packet.Write(c.Character.ER);
            packet.Write(c.Character.WR);
            foreach (Int32 rentalid in c.Character.Equipment)
            {
                if (rentalid == 0) packet.Write((Int32)0);
                else packet.Write(c.Character.Inventory[rentalid].ItemID);
            }
            packet.Write((Int32)c.Account.Access);
            packet.Write(c.Character.ClanID);
            packet.Write((byte)c.Team);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(0));

            foreach (Client cli in clients)
                cli.Send(packet);

          
            client.EnteredBattle = true;

            // Check round state
            
            if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
            {
               // taking this out leaves them zoomed around the map.
                packet = new Packet(Operation.BattleRoundStateUpdate);
                packet.Write(client.Stage.ID);
                packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                packet.Write((Int32)client.Stage.RoundState);
                packet.Write(Convert.ToInt32(0));
                client.Send(packet);
            }
            client.LateJoin = false;
            CheckBattleState(client);
        }
        private void CheckBattleState(Client client)
        {
            List<Client> clients = null;
            lock(client.Stage.Clients)
                clients = client.Stage.Clients.ToList();

            if (client.Stage.State == StageState.Standby) { // Initial round not yet loaded
                if (client.Stage.RoundState == RoundState.Prepare && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
                
                {
                    client.Stage.State = StageState.Run;
                    client.Stage.RoundState = RoundState.Play;

                    foreach (Client cli in clients)
                    {
                        cli.RequestedBattleInfo = false;
                        cli.Alive = true;
                    }
                    Helper.UpdateChannelStages(client.Channel,null);

                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(client.Stage.ID);
                    packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                    packet.Write((Int32)client.Stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) 
                        c.Send(packet);
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
            }
            else if (client.Stage.State == StageState.Run) { // Game Running
                if (client.Stage.RoundState == RoundState.Prepare)
                {
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Prepare", client.Stage.ID);
                    return;
                }
                else if (client.Stage.RoundState == RoundState.Countdown) {
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Countdown", client.Stage.ID);
                    return;
                }
                else if (client.Stage.RoundState == RoundState.Play) {
                    CheckWinCondition(client);
                    return;
                }
            }
        }
        private void CheckWinCondition(Client client)
        {
            Stage stage = client.Stage;
            Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            if (stage.RoundState == RoundState.Play)
            {
                List<Client> clis = null;
                lock (stage.Clients)
                    clis = stage.Clients.FindAll(c => c.InBattle == true);

               bool GameOver = false;
               foreach (Client cli in clis)
               {
                   if (cli.RoundKills >= stage.Rounds)
                   {
                       GameOver = true;
                       break;
                   }
               }
               if (GameOver == true)
               {
                   stage.CurrentRound = 0;
                   stage.Team1Score = 0;
                   stage.Team2Score = 0;
                   stage.State = StageState.Standby;
                   stage.RoundState = RoundState.Prepare;
                   Packet pGameOver = new Packet(Operation.BattleRoundStateUpdate);
                   pGameOver.Write(stage.ID);
                   pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
                   pGameOver.Write((Int32)RoundState.Finish);
                   pGameOver.Write(Convert.ToInt32(0));
                   foreach (Client cli in clis)
                       cli.Send(pGameOver);
                   pGameOver = new Packet(Operation.BattleRoundStateUpdate);
                   pGameOver.Write(stage.ID);
                   pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
                   pGameOver.Write((Int32)RoundState.Exit);
                   pGameOver.Write(Convert.ToInt32(0));
                   foreach (Client cli in clis)
                      cli.Send(pGameOver);
                   pGameOver = new Packet(Operation.StageFinish);
                   pGameOver.Write(stage.ID);
                   foreach (Client cli in clis)
                       cli.Send(pGameOver);
                   foreach (Client cli in clis)
                   {
                       cli.InBattle = false;
                       cli.Alive = false;
                       cli.RequestedBattleInfo = false;
                       cli.RoundDeaths = 0;
                       cli.RoundKills = 0;
                   }


                }
            }
        }
    }

    class GladiatorMatchLogic : IBattleLogic
    {
        public void OnBattleInitialStart(Client client)
        {
            client.Stage.State = StageState.Standby;
            client.Stage.RoundState = RoundState.Prepare;
            client.Stage.Team1Score = 0;
            client.Stage.Team2Score = 0;

            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet2 = new Packet(Operation.StageLaunch);
            packet2.Write(client.Stage.ID);
            packet2.Write(client.Stage.MapName);

            foreach (Client c in clients)
            {
                Helper.RegisterGenericBattleCallbacks(c);
                c.KillCount = 0;
                c.DeathCount = 0;
                c.InBattle = true;
                c.EnteredBattle = false;
                c.RequestedBattleInfo = false;
                c.Alive = false;
                // c.Send(packet);  /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
                c.Send(packet2);
            }
        }
        public void OnBattleJoin(Client client)
        {
            client.InBattle = true;
            client.Alive = false;
            client.LateJoin = true;
            // check state // maybe set a bool marking them as a newbie
            CheckBattleState(client);
        }
        public void OnBattleLeave(Client client)
        {
            List<Client> clis = null;
            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
            pStageLeaveBattle.Write(client.SessionID);
            pStageLeaveBattle.Write(client.Stage.ID);

            foreach (Client cli in clis)
                cli.Send(pStageLeaveBattle);

            client.InBattle = false;
            client.EnteredBattle = false;
            client.RequestedBattleInfo = false;
            client.Alive = false;
            Helper.UnregisterAllBattleCallbacks(client);
            CheckBattleState(client);

        }
        public void OnBattleKill(Client client, Client killer)
        {

            client.Alive = false;
            List<Client> clis = null;

            Packet packetdead = new Packet(Operation.GameDead);
            packetdead.Write(killer.SessionID);
            packetdead.Write((UInt32)0x0);
            packetdead.Write(client.SessionID);
            packetdead.Write((UInt32)0x0);

            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            foreach (Client cli in clis)
                cli.Send(packetdead);

            client.DeathCount++;
            client.RoundDeaths++;
            if (killer.SessionID != client.SessionID)
            {
                killer.KillCount++;
                killer.RoundKills++;
            }
            CheckBattleState(client);
            // check win state.
        }
        public void OnBattleSuicide(Client client)
        {

        }
        public void OnBattleLoaded(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = new List<Client>(client.Stage.Clients);
            client.Loaded = true;
            Packet packet = new Packet(Operation.StageLoaded);
            packet.Write(client.SessionID);
            packet.Write((UInt32)0x64);
            foreach (Client cli in clients)
                cli.Send(packet);
            CheckBattleState(client);
        }
        public void OnBattleInfoRequest(Client client)
        {
            client.RequestedBattleInfo = true;
            if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
            {

            }
            CheckBattleState(client);
        }
        public void OnBattleEnterRequest(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet = new Packet(Operation.StageEnterBattleResponse);

            if (client.Stage.State == StageState.Standby)
                packet.Write(Convert.ToByte(0));
            else
                packet.Write(Convert.ToByte(1));
            packet.Write(166, 1);

            /* possible loop entire client stage list in one packet */
            Client c = client;
            packet.Write(c.SessionID);
            if (c.Bridge != null)
            {
                packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
                packet.Write(c.Bridge.Port);
            }
            else
            {
                packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
                packet.Write((int)0x00);
            }
            packet.Write(c.Character.Name, 32);
            packet.Write(c.Character.ClanName, 16);
            packet.Write((Int32)c.Character.ClanRank);
            packet.Write(c.Character.ClanPoints);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(c.Character.Level));
            packet.Write((byte)c.Character.Gender);
            packet.Write((byte)c.Character.Hair);
            packet.Write((byte)c.Character.Face);
            packet.Write(c.Character.Experience);
            packet.Write(c.Character.Bounty);
            packet.Write(c.Character.Bonus);
            packet.Write(c.Character.Prize);
            packet.Write(c.Character.Health);
            packet.Write(c.Character.Armor);
            packet.Write(c.Character.MaxWeight);
            packet.Write(c.Character.SafeFalls);
            packet.Write(c.Character.FR);
            packet.Write(c.Character.CR);
            packet.Write(c.Character.ER);
            packet.Write(c.Character.WR);
            foreach (Int32 rentalid in c.Character.Equipment)
            {
                if (rentalid == 0) packet.Write((Int32)0);
                else if (rentalid == (Int32)RentalSlot.PrimaryWeapon - 1 || rentalid == (Int32)RentalSlot.SecondaryWeapon - 1 ||
                         rentalid == (Int32)RentalSlot.Custom1 - 1 || rentalid == (Int32)RentalSlot.Custom2 - 1) packet.Write((Int32)0);
                else packet.Write(c.Character.Inventory[rentalid].ItemID);
            }
            packet.Write((Int32)c.Account.Access);
            packet.Write(c.Character.ClanID);
            packet.Write((byte)c.Team);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(0));

            foreach (Client cli in clients)
                cli.Send(packet);


            client.EnteredBattle = true;

            // Check round state

            if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
            {
                // taking this out leaves them zoomed around the map.
                packet = new Packet(Operation.BattleRoundStateUpdate);
                packet.Write(client.Stage.ID);
                packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                packet.Write((Int32)client.Stage.RoundState);
                packet.Write(Convert.ToInt32(0));
                client.Send(packet);
            }
            client.LateJoin = false;
            CheckBattleState(client);
        }
        private void CheckBattleState(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = client.Stage.Clients.ToList();

            if (client.Stage.State == StageState.Standby)
            { // Initial round not yet loaded
                if (client.Stage.RoundState == RoundState.Prepare && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
                {
                    client.Stage.State = StageState.Run;
                    client.Stage.RoundState = RoundState.Play;

                    foreach (Client cli in clients)
                    {
                        cli.RequestedBattleInfo = false;
                        cli.Alive = true;
                    }
                    Helper.UpdateChannelStages(client.Channel, null);

                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(client.Stage.ID);
                    packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                    packet.Write((Int32)client.Stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients)
                        c.Send(packet);
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
            }
            else if (client.Stage.State == StageState.Run)
            { // Game Running
                if (client.Stage.RoundState == RoundState.Prepare)
                {
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Prepare", client.Stage.ID);
                    return;
                }
                else if (client.Stage.RoundState == RoundState.Countdown)
                {
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Countdown", client.Stage.ID);
                    return;
                }
                else if (client.Stage.RoundState == RoundState.Play)
                {
                    CheckWinCondition(client);
                    return;
                }
            }
        }
        private void CheckWinCondition(Client client)
        {
            Stage stage = client.Stage;
            Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            if (stage.RoundState == RoundState.Play)
            {
                List<Client> clis = null;
                lock (stage.Clients)
                    clis = stage.Clients.FindAll(c => c.InBattle == true);

                bool GameOver = false;
                foreach (Client cli in clis)
                {
                    if (cli.RoundKills >= stage.Rounds)
                    {
                        GameOver = true;
                        break;
                    }
                }
                if (GameOver == true)
                {
                    stage.CurrentRound = 0;
                    stage.Team1Score = 0;
                    stage.Team2Score = 0;
                    stage.State = StageState.Standby;
                    stage.RoundState = RoundState.Prepare;
                    Packet pGameOver = new Packet(Operation.BattleRoundStateUpdate);
                    pGameOver.Write(stage.ID);
                    pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
                    pGameOver.Write((Int32)RoundState.Finish);
                    pGameOver.Write(Convert.ToInt32(0));
                    foreach (Client cli in clis)
                        cli.Send(pGameOver);
                    pGameOver = new Packet(Operation.BattleRoundStateUpdate);
                    pGameOver.Write(stage.ID);
                    pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
                    pGameOver.Write((Int32)RoundState.Exit);
                    pGameOver.Write(Convert.ToInt32(0));
                    foreach (Client cli in clis)
                        cli.Send(pGameOver);
                    pGameOver = new Packet(Operation.StageFinish);
                    pGameOver.Write(stage.ID);
                    foreach (Client cli in clis)
                        cli.Send(pGameOver);
                    foreach (Client cli in clis)
                    {
                        cli.InBattle = false;
                        cli.Alive = false;
                        cli.RequestedBattleInfo = false;
                        cli.RoundDeaths = 0;
                        cli.RoundKills = 0;
                    }


                }
            }
        }
    }

    class TeamDeathMatchLogic : IBattleLogic
    {
        public void OnBattleInitialStart(Client client)
        {
            client.Stage.State = StageState.Standby;
            client.Stage.RoundState = RoundState.Prepare;
            client.Stage.Team1Score = 0;
            client.Stage.Team2Score = 0;

            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet2 = new Packet(Operation.StageLaunch);
            packet2.Write(client.Stage.ID);
            packet2.Write(client.Stage.MapName);

            foreach (Client c in clients)
            {
                Helper.RegisterGenericBattleCallbacks(c);
                c.KillCount = 0;
                c.DeathCount = 0;
                c.InBattle = true;
                c.EnteredBattle = false;
                c.RequestedBattleInfo = false;
                c.Alive = false;
                // c.Send(packet);  /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
                c.Send(packet2);
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Initial Start", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
        }
        public void OnBattleJoin(Client client)
        {
            client.InBattle = true;
            client.Alive = false;
            client.LateJoin = true;
            // check state // maybe set a bool marking them as a newbie
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} :  Late Join ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleLeave(Client client)
        {
            List<Client> clis = null;
            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
            pStageLeaveBattle.Write(client.SessionID);
            pStageLeaveBattle.Write(client.Stage.ID);

            foreach (Client cli in clis)
                cli.Send(pStageLeaveBattle);

            client.InBattle = false;
            client.EnteredBattle = false;
            client.RequestedBattleInfo = false;
            client.Alive = false;
            Helper.UnregisterAllBattleCallbacks(client);
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Battle leaving..", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);

        }
        public void OnBattleKill(Client client, Client killer)
        {

            client.Alive = false;
            List<Client> clis = null;

            Packet packetdead = new Packet(Operation.GameDead);
            packetdead.Write(killer.SessionID);
            packetdead.Write((UInt32)0x0);
            packetdead.Write(client.SessionID);
            packetdead.Write((UInt32)0x0);

            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            foreach (Client cli in clis)
                cli.Send(packetdead);

            client.DeathCount++;
            client.RoundDeaths++;
            if (killer.SessionID != client.SessionID)
            {
                killer.KillCount++;
                killer.RoundKills++;
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone died ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
            // check win state.
        }
        public void OnBattleSuicide(Client client)
        {

        }
        public void OnBattleLoaded(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = new List<Client>(client.Stage.Clients);
            client.Loaded = true;
            Packet packet = new Packet(Operation.StageLoaded);
            packet.Write(client.SessionID);
            packet.Write((UInt32)0x64);
            foreach (Client cli in clients)
                cli.Send(packet);
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone loaded ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleInfoRequest(Client client)
        {
            client.RequestedBattleInfo = true;
            if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
            {
                // late join code??
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Info Requested ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleEnterRequest(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet = new Packet(Operation.StageEnterBattleResponse);

            if (client.Stage.State == StageState.Standby)
                packet.Write(Convert.ToByte(0));
            else
                packet.Write(Convert.ToByte(1));
            packet.Write(166, 1);

            /* possible loop entire client stage list in one packet */
            Client c = client;
            packet.Write(c.SessionID);
            if (c.Bridge != null)
            {
                packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
                packet.Write(c.Bridge.Port);
            }
            else
            {
                packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
                packet.Write((int)0x00);
            }
            packet.Write(c.Character.Name, 32);
            packet.Write(c.Character.ClanName, 16);
            packet.Write((Int32)c.Character.ClanRank);
            packet.Write(c.Character.ClanPoints);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(c.Character.Level));
            packet.Write((byte)c.Character.Gender);
            packet.Write((byte)c.Character.Hair);
            packet.Write((byte)c.Character.Face);
            packet.Write(c.Character.Experience);
            packet.Write(c.Character.Bounty);
            packet.Write(c.Character.Bonus);
            packet.Write(c.Character.Prize);
            packet.Write(c.Character.Health);
            packet.Write(c.Character.Armor);
            packet.Write(c.Character.MaxWeight);
            packet.Write(c.Character.SafeFalls);
            packet.Write(c.Character.FR);
            packet.Write(c.Character.CR);
            packet.Write(c.Character.ER);
            packet.Write(c.Character.WR);
            foreach (Int32 rentalid in c.Character.Equipment)
            {
                if (rentalid == 0) packet.Write((Int32)0);
                else packet.Write(c.Character.Inventory[rentalid].ItemID);
            }
            packet.Write((Int32)c.Account.Access);
            packet.Write(c.Character.ClanID);
            packet.Write((byte)c.Team);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(0));

            foreach (Client cli in clients)
                cli.Send(packet);


            client.EnteredBattle = true;

            // Check round state

            if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
            {
                
                packet = new Packet(Operation.BattleRoundStateUpdate);
                packet.Write(client.Stage.ID);
                packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                packet.Write((Int32)client.Stage.RoundState);
                packet.Write(Convert.ToInt32(2));                       // hopefully this keeps them from spawning in
                client.Send(packet);
            }
            client.LateJoin = false;
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Enter Battle ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        private void CheckBattleState(Client client)
        {
            List<Client> clients = null;
            Stage stage = client.Stage;
            lock (stage.Clients)
                clients = stage.Clients.ToList().FindAll(c => c.InBattle);
            if ((stage.RoundState == RoundState.Prepare || stage.RoundState == RoundState.Countdown) && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
            {
               
                List<Client> team1 = clients.FindAll(c => c.Team == Team.Team1);
                if (team1.Count != clients.Count)
                {
                    if (stage.RoundState == RoundState.Prepare)
                        stage.RoundState = RoundState.Countdown;
                    else
                        stage.RoundState = RoundState.Play;

                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(stage.ID);
                    packet.Write(Convert.ToInt32(stage.CurrentRound));
                    packet.Write((Int32)stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    if (stage.RoundState != RoundState.Play)
                    {
                        if (stage.State != StageState.Run)
                            stage.State = StageState.Run;
                        stage.RoundState = RoundState.Play;
                        packet = new Packet(Operation.BattleRoundStateUpdate);
                        packet.Write(stage.ID);
                        packet.Write(Convert.ToInt32(stage.CurrentRound));
                        packet.Write((Int32)stage.RoundState);
                        packet.Write(Convert.ToInt32(0));
                        foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    }
                    Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Checked prepare countdown ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
                else
                {
                    stage.RoundState = RoundState.Free;
                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(stage.ID);
                    packet.Write(Convert.ToInt32(stage.CurrentRound));
                    packet.Write((Int32)stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Going to free mode ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
            }
            else if (stage.RoundState == RoundState.Play) {
                CheckWinCondition(client);
                Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : After check win condition. ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            }
        }
        private void CheckWinCondition(Client client)
        {
            Stage stage = client.Stage;
            List<Client> clis = null;
            lock (stage.Clients)
                clis = stage.Clients.ToList().FindAll(c => c.InBattle);
            Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            int winner = 0;
            if (clis.FindAll(c => c.Team == Team.Team1).All(c => !c.Alive))
                winner = 2;
            else if (clis.FindAll(c => c.Team == Team.Team2).All(c => !c.Alive))
                winner = 1;

            if (winner == 0)
                return;
            // one team one.
            stage.RoundState = RoundState.Finish;
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(winner));
            foreach (Client cli in clis)
                cli.Send(pRoundFinish);
            stage.CurrentRound++;
            

            List<Client> temp =null;
            temp = clis.FindAll(c => c.Team == Team.Team1);
            if (temp.Count == clis.Count)
            {
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartIdleRound), stage);
            }
            else {
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartNextRound), stage);
            }
        }
        private void StartNextRound(Object obj)
        {
            List<Client> clis = null;
            Stage stage = (Stage)obj;
            lock (stage.Clients) clis = stage.Clients.ToList();
            stage.RoundState = RoundState.Prepare;
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0));

            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = false;
                cli.RequestedBattleInfo = false;
            }
            stage.RoundState = RoundState.Countdown;
            pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0x0));
            System.Threading.Thread.Sleep(500);
            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
            }
            //if (clis.All(c => c.RequestedBattleInfo == true ))
            //{
            stage.RoundState = RoundState.Play;
            pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0x0));
            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = true;
            }
            //}

        }
        private void StartIdleRound(Object obj)
        {
            
            List<Client> clis = null;
            Stage stage = (Stage)obj;
            lock (stage.Clients) clis = stage.Clients;
            stage.RoundState = RoundState.Free;
            System.Threading.Thread.Sleep(500);
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0));

            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = false;
                cli.RequestedBattleInfo = false;
            }
           

        }
    }

    class TeamGladiatorLogic : IBattleLogic
    {
        public void OnBattleInitialStart(Client client)
        {
            client.Stage.State = StageState.Standby;
            client.Stage.RoundState = RoundState.Prepare;
            client.Stage.Team1Score = 0;
            client.Stage.Team2Score = 0;

            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet2 = new Packet(Operation.StageLaunch);
            packet2.Write(client.Stage.ID);
            packet2.Write(client.Stage.MapName);

            foreach (Client c in clients)
            {
                Helper.RegisterGenericBattleCallbacks(c);
                c.KillCount = 0;
                c.DeathCount = 0;
                c.InBattle = true;
                c.EnteredBattle = false;
                c.RequestedBattleInfo = false;
                c.Alive = false;
                // c.Send(packet);  /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
                c.Send(packet2);
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Initial Start", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
        }
        public void OnBattleJoin(Client client)
        {
            client.InBattle = true;
            client.Alive = false;
            client.LateJoin = true;
            // check state // maybe set a bool marking them as a newbie
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} :  Late Join ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleLeave(Client client)
        {
            List<Client> clis = null;
            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
            pStageLeaveBattle.Write(client.SessionID);
            pStageLeaveBattle.Write(client.Stage.ID);

            foreach (Client cli in clis)
                cli.Send(pStageLeaveBattle);

            client.InBattle = false;
            client.EnteredBattle = false;
            client.RequestedBattleInfo = false;
            client.Alive = false;
            Helper.UnregisterAllBattleCallbacks(client);
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Battle leaving..", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);

        }
        public void OnBattleKill(Client client, Client killer)
        {

            client.Alive = false;
            List<Client> clis = null;

            Packet packetdead = new Packet(Operation.GameDead);
            packetdead.Write(killer.SessionID);
            packetdead.Write((UInt32)0x0);
            packetdead.Write(client.SessionID);
            packetdead.Write((UInt32)0x0);

            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            foreach (Client cli in clis)
                cli.Send(packetdead);

            client.DeathCount++;
            client.RoundDeaths++;
            if (killer.SessionID != client.SessionID)
            {
                killer.KillCount++;
                killer.RoundKills++;
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone died ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
            // check win state.
        }
        public void OnBattleSuicide(Client client)
        {

        }
        public void OnBattleLoaded(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = new List<Client>(client.Stage.Clients);
            client.Loaded = true;
            Packet packet = new Packet(Operation.StageLoaded);
            packet.Write(client.SessionID);
            packet.Write((UInt32)0x64);
            foreach (Client cli in clients)
                cli.Send(packet);
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone loaded ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleInfoRequest(Client client)
        {
            client.RequestedBattleInfo = true;
            if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
            {
                // late join code??
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Info Requested ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleEnterRequest(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet = new Packet(Operation.StageEnterBattleResponse);

            if (client.Stage.State == StageState.Standby)
                packet.Write(Convert.ToByte(0));
            else
                packet.Write(Convert.ToByte(1));
            packet.Write(166, 1);

            /* possible loop entire client stage list in one packet */
            Client c = client;
            packet.Write(c.SessionID);
            if (c.Bridge != null)
            {
                packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
                packet.Write(c.Bridge.Port);
            }
            else
            {
                packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
                packet.Write((int)0x00);
            }
            packet.Write(c.Character.Name, 32);
            packet.Write(c.Character.ClanName, 16);
            packet.Write((Int32)c.Character.ClanRank);
            packet.Write(c.Character.ClanPoints);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(c.Character.Level));
            packet.Write((byte)c.Character.Gender);
            packet.Write((byte)c.Character.Hair);
            packet.Write((byte)c.Character.Face);
            packet.Write(c.Character.Experience);
            packet.Write(c.Character.Bounty);
            packet.Write(c.Character.Bonus);
            packet.Write(c.Character.Prize);
            packet.Write(c.Character.Health);
            packet.Write(c.Character.Armor);
            packet.Write(c.Character.MaxWeight);
            packet.Write(c.Character.SafeFalls);
            packet.Write(c.Character.FR);
            packet.Write(c.Character.CR);
            packet.Write(c.Character.ER);
            packet.Write(c.Character.WR);
            foreach (Int32 rentalid in c.Character.Equipment)
            {
                if (rentalid == 0) packet.Write((Int32)0);
                else if (rentalid == (Int32)RentalSlot.PrimaryWeapon - 1 || rentalid == (Int32)RentalSlot.SecondaryWeapon - 1 ||
                         rentalid == (Int32)RentalSlot.Custom1 - 1 || rentalid == (Int32)RentalSlot.Custom2 - 1) packet.Write((Int32)0);
                else packet.Write(c.Character.Inventory[rentalid].ItemID);
            }
            packet.Write((Int32)c.Account.Access);
            packet.Write(c.Character.ClanID);
            packet.Write((byte)c.Team);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(0));

            foreach (Client cli in clients)
                cli.Send(packet);


            client.EnteredBattle = true;

            // Check round state

            if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
            {

                packet = new Packet(Operation.BattleRoundStateUpdate);
                packet.Write(client.Stage.ID);
                packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                packet.Write((Int32)client.Stage.RoundState);
                packet.Write(Convert.ToInt32(2));                       // hopefully this keeps them from spawning in
                client.Send(packet);
            }
            client.LateJoin = false;
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Enter Battle ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        private void CheckBattleState(Client client)
        {
            List<Client> clients = null;
            Stage stage = client.Stage;
            lock (stage.Clients)
                clients = stage.Clients.ToList().FindAll(c => c.InBattle);
            if ((stage.RoundState == RoundState.Prepare || stage.RoundState == RoundState.Countdown) && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
            {

                List<Client> team1 = clients.FindAll(c => c.Team == Team.Team1);
                if (team1.Count != clients.Count)
                {
                    if (stage.RoundState == RoundState.Prepare)
                        stage.RoundState = RoundState.Countdown;
                    else
                        stage.RoundState = RoundState.Play;

                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(stage.ID);
                    packet.Write(Convert.ToInt32(stage.CurrentRound));
                    packet.Write((Int32)stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    if (stage.RoundState != RoundState.Play)
                    {
                        if (stage.State != StageState.Run)
                            stage.State = StageState.Run;
                        stage.RoundState = RoundState.Play;
                        packet = new Packet(Operation.BattleRoundStateUpdate);
                        packet.Write(stage.ID);
                        packet.Write(Convert.ToInt32(stage.CurrentRound));
                        packet.Write((Int32)stage.RoundState);
                        packet.Write(Convert.ToInt32(0));
                        foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    }
                    Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Checked prepare countdown ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
                else
                {
                    stage.RoundState = RoundState.Free;
                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(stage.ID);
                    packet.Write(Convert.ToInt32(stage.CurrentRound));
                    packet.Write((Int32)stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Going to free mode ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
            }
            else if (stage.RoundState == RoundState.Play)
            {
                CheckWinCondition(client);
                Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : After check win condition. ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            }
        }
        private void CheckWinCondition(Client client)
        {
            Stage stage = client.Stage;
            List<Client> clis = null;
            lock (stage.Clients)
                clis = stage.Clients.ToList().FindAll(c => c.InBattle);
            Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            int winner = 0;
            if (clis.FindAll(c => c.Team == Team.Team1).All(c => !c.Alive))
                winner = 2;
            else if (clis.FindAll(c => c.Team == Team.Team2).All(c => !c.Alive))
                winner = 1;

            if (winner == 0)
                return;
            // one team one.
            stage.RoundState = RoundState.Finish;
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(winner));
            foreach (Client cli in clis)
                cli.Send(pRoundFinish);
            stage.CurrentRound++;


            List<Client> temp = null;
            temp = clis.FindAll(c => c.Team == Team.Team1);
            if (temp.Count == clis.Count)
            {
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartIdleRound), stage);
            }
            else
            {
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartNextRound), stage);
            }
        }
        private void StartNextRound(Object obj)
        {
            List<Client> clis = null;
            Stage stage = (Stage)obj;
            lock (stage.Clients) clis = stage.Clients.ToList();
            stage.RoundState = RoundState.Prepare;
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0));

            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = false;
                cli.RequestedBattleInfo = false;
            }
            stage.RoundState = RoundState.Countdown;
            pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0x0));
            System.Threading.Thread.Sleep(500);
            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
            }
            //if (clis.All(c => c.RequestedBattleInfo == true ))
            //{
            stage.RoundState = RoundState.Play;
            pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0x0));
            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = true;
            }
            //}

        }
        private void StartIdleRound(Object obj)
        {

            List<Client> clis = null;
            Stage stage = (Stage)obj;
            lock (stage.Clients) clis = stage.Clients;
            stage.RoundState = RoundState.Free;
            System.Threading.Thread.Sleep(500);
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0));

            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = false;
                cli.RequestedBattleInfo = false;
            }


        }
    }

    class AssassinMatchLogic : IBattleLogic
    {
        public void OnBattleInitialStart(Client client)
        {
            client.Stage.State = StageState.Standby;
            client.Stage.RoundState = RoundState.Prepare;
            client.Stage.Team1Score = 0;
            client.Stage.Team2Score = 0;

            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet2 = new Packet(Operation.StageLaunch);
            packet2.Write(client.Stage.ID);
            packet2.Write(client.Stage.MapName);

            foreach (Client c in clients)
            {
                Helper.RegisterGenericBattleCallbacks(c);
                c.KillCount = 0;
                c.DeathCount = 0;
                c.InBattle = true;
                c.EnteredBattle = false;
                c.RequestedBattleInfo = false;
                c.Alive = false;
                c.Commander = false;
                // c.Send(packet);  /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
                c.Send(packet2);
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Initial Start", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
        }
        public void OnBattleJoin(Client client)
        {
            client.InBattle = true;
            client.Alive = false;
            client.LateJoin = true;
            // check state // maybe set a bool marking them as a newbie
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} :  Late Join ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleLeave(Client client)
        {
            List<Client> clis = null;
            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
            pStageLeaveBattle.Write(client.SessionID);
            pStageLeaveBattle.Write(client.Stage.ID);

            foreach (Client cli in clis)
                cli.Send(pStageLeaveBattle);

            client.InBattle = false;
            client.EnteredBattle = false;
            client.RequestedBattleInfo = false;
            client.Alive = false;
            Helper.UnregisterAllBattleCallbacks(client);
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Battle leaving..", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);

        }
        public void OnBattleKill(Client client, Client killer)
        {

            client.Alive = false;
            List<Client> clis = null;

            Packet packetdead = new Packet(Operation.GameDead);
            packetdead.Write(killer.SessionID);
            packetdead.Write((UInt32)0x0);
            packetdead.Write(client.SessionID);
            packetdead.Write((UInt32)0x0);

            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            foreach (Client cli in clis)
                cli.Send(packetdead);

            client.DeathCount++;
            client.RoundDeaths++;
            if (killer.SessionID != client.SessionID)
            {
                killer.KillCount++;
                killer.RoundKills++;
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone died ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
            // check win state.
        }
        public void OnBattleSuicide(Client client)
        {

        }
        public void OnBattleLoaded(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = new List<Client>(client.Stage.Clients);
            client.Loaded = true;
            Packet packet = new Packet(Operation.StageLoaded);
            packet.Write(client.SessionID);
            packet.Write((UInt32)0x64);
            foreach (Client cli in clients)
                cli.Send(packet);
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone loaded ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleInfoRequest(Client client)
        {
            client.RequestedBattleInfo = true;
            if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
            {
                // late join code??
            }
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Info Requested ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        public void OnBattleEnterRequest(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet = new Packet(Operation.StageEnterBattleResponse);

            if (client.Stage.State == StageState.Standby)
                packet.Write(Convert.ToByte(0));
            else
                packet.Write(Convert.ToByte(1));
            packet.Write(166, 1);

            /* possible loop entire client stage list in one packet */
            Client c = client;
            packet.Write(c.SessionID);
            if (c.Bridge != null)
            {
                packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
                packet.Write(c.Bridge.Port);
            }
            else
            {
                packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
                packet.Write((int)0x00);
            }
            packet.Write(c.Character.Name, 32);
            packet.Write(c.Character.ClanName, 16);
            packet.Write((Int32)c.Character.ClanRank);
            packet.Write(c.Character.ClanPoints);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(c.Character.Level));
            packet.Write((byte)c.Character.Gender);
            packet.Write((byte)c.Character.Hair);
            packet.Write((byte)c.Character.Face);
            packet.Write(c.Character.Experience);
            packet.Write(c.Character.Bounty);
            packet.Write(c.Character.Bonus);
            packet.Write(c.Character.Prize);
            packet.Write(c.Character.Health);
            packet.Write(c.Character.Armor);
            packet.Write(c.Character.MaxWeight);
            packet.Write(c.Character.SafeFalls);
            packet.Write(c.Character.FR);
            packet.Write(c.Character.CR);
            packet.Write(c.Character.ER);
            packet.Write(c.Character.WR);
            foreach (Int32 rentalid in c.Character.Equipment)
            {
                if (rentalid == 0) packet.Write((Int32)0);
                else packet.Write(c.Character.Inventory[rentalid].ItemID);
            }
            packet.Write((Int32)c.Account.Access);
            packet.Write(c.Character.ClanID);
            packet.Write((byte)c.Team);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(0));

            foreach (Client cli in clients)
                cli.Send(packet);


            client.EnteredBattle = true;

            // Check round state

            if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
            {

                packet = new Packet(Operation.BattleRoundStateUpdate);
                packet.Write(client.Stage.ID);
                packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                packet.Write((Int32)client.Stage.RoundState);
                packet.Write(Convert.ToInt32(2));                       // hopefully this keeps them from spawning in
                client.Send(packet);
            }
            client.LateJoin = false;
            Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Enter Battle ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            CheckBattleState(client);
        }
        private void CheckBattleState(Client client)
        {
            List<Client> clients = null;
            Stage stage = client.Stage;
            lock (stage.Clients)
                clients = stage.Clients.ToList().FindAll(c => c.InBattle);
            if ((stage.RoundState == RoundState.Prepare || stage.RoundState == RoundState.Countdown) && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
            {

                List<Client> team1 = clients.FindAll(c => c.Team == Team.Team1);
                if (team1.Count != clients.Count)
                {
                    if (stage.RoundState == RoundState.Prepare)
                        stage.RoundState = RoundState.Countdown;
                    else
                        stage.RoundState = RoundState.Play;

                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(stage.ID);
                    packet.Write(Convert.ToInt32(stage.CurrentRound));
                    packet.Write((Int32)stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    if (stage.RoundState != RoundState.Play)
                    {
                        if (stage.State != StageState.Run)
                            stage.State = StageState.Run;
                        stage.RoundState = RoundState.Play;
                        packet = new Packet(Operation.BattleRoundStateUpdate);
                        packet.Write(stage.ID);
                        packet.Write(Convert.ToInt32(stage.CurrentRound));
                        packet.Write((Int32)stage.RoundState);
                        packet.Write(Convert.ToInt32(0));
                        foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    }
                    Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Checked prepare countdown ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
                else
                {
                    stage.RoundState = RoundState.Free;
                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(stage.ID);
                    packet.Write(Convert.ToInt32(stage.CurrentRound));
                    packet.Write((Int32)stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
                    Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Going to free mode ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
            }
            else if (stage.RoundState == RoundState.Play)
            {
                CheckWinCondition(client);
                Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : After check win condition. ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            }
        }
        private void CheckWinCondition(Client client)
        {
            Stage stage = client.Stage;
            List<Client> clis = null;
            lock (stage.Clients)
                clis = stage.Clients.ToList().FindAll(c => c.InBattle);
            Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            int winner = 0;
            if (clis.FindAll(c => c.Team == Team.Team1).Any(c => !c.Alive) && clis.FindAll(c => c.Team == Team.Team1).Any(c => c.Commander))
            {
                winner = 2;
                client.Log(LogLevel.Debug, "Winner: {0}", winner);
            }
            if (clis.FindAll(c => c.Team == Team.Team2).Any(c => !c.Alive) && clis.FindAll(c => c.Team == Team.Team2).Any(c => c.Commander))
            {
                winner = 1;
                client.Log(LogLevel.Debug, "Winner2: {0}", winner);
            }

            if (winner == (int)Team.Solo)
                return;
            // one team one.
            stage.RoundState = RoundState.Finish;
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(winner));
            foreach (Client cli in clis)
                cli.Send(pRoundFinish);
            stage.CurrentRound++;


            List<Client> temp = null;
            temp = clis.FindAll(c => c.Team == Team.Team1);
            if (temp.Count == clis.Count)
            {
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartIdleRound), stage);
            }
            else
            {
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartNextRound), stage);
            }
        }
        private void StartNextRound(Object obj)
        {
            List<Client> clis = null;
            Stage stage = (Stage)obj;
            lock (stage.Clients) clis = stage.Clients.ToList();
            stage.RoundState = RoundState.Prepare;
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0));

            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = false;
                cli.RequestedBattleInfo = false;
            }
            stage.RoundState = RoundState.Countdown;
            pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0x0));
            System.Threading.Thread.Sleep(500);
            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
            }
            //if (clis.All(c => c.RequestedBattleInfo == true ))
            //{
            stage.RoundState = RoundState.Play;
            pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0x0));
            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = true;
            }

            List<Client>Clist = clis.FindAll(c => c.Team == Team.Team1);
            List<Client> Clist2 = clis.FindAll(c => c.Team == Team.Team2);
            Random r = new Random();
            int rCommanderIndex = r.Next(Clist.Count());
            int bCommanderIndex = r.Next(Clist2.Count());
            Clist[rCommanderIndex].Commander = true;
            Clist2[bCommanderIndex].Commander = true;

            Packet cPacket = new Packet(Operation.AssignCommander);
            cPacket.Write(Clist[rCommanderIndex].SessionID);
            cPacket.Write(Clist2[bCommanderIndex].SessionID);
            foreach (Client cli in clis) cli.Send(cPacket);
            
            //}

        }
        private void StartIdleRound(Object obj)
        {

            List<Client> clis = null;
            Stage stage = (Stage)obj;
            lock (stage.Clients) clis = stage.Clients;
            stage.RoundState = RoundState.Free;
            System.Threading.Thread.Sleep(500);
            Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
            pRoundFinish.Write(stage.ID);
            pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
            pRoundFinish.Write((Int32)stage.RoundState);
            pRoundFinish.Write(Convert.ToInt32(0));

            foreach (Client cli in clis)
            {
                cli.Send(pRoundFinish);
                cli.Alive = false;
                cli.RequestedBattleInfo = false;
            }


        }
    }

    class BerserkerMatchLogic : IBattleLogic
    {
        public void OnBattleInitialStart(Client client)
        {
            client.Stage.State = StageState.Standby;
            client.Stage.RoundState = RoundState.Prepare;
            client.Stage.Team1Score = 0;
            client.Stage.Team2Score = 0;

            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet2 = new Packet(Operation.StageLaunch);
            packet2.Write(client.Stage.ID);
            packet2.Write(client.Stage.MapName);

            foreach (Client c in clients)
            {
                Helper.RegisterGenericBattleCallbacks(c);
                c.KillCount = 0;
                c.DeathCount = 0;
                c.InBattle = true;
                c.EnteredBattle = false;
                c.RequestedBattleInfo = false;
                c.Berserker = false;
                c.Alive = false;
                // c.Send(packet);  /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
                c.Send(packet2);
            }
        }
        public void OnBattleJoin(Client client)
        {
            client.InBattle = true;
            client.Alive = false;
            client.LateJoin = true;
            // check state // maybe set a bool marking them as a newbie
            CheckBattleState(client);
        }
        public void OnBattleLeave(Client client)
        {
            List<Client> clis = null;
            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
            pStageLeaveBattle.Write(client.SessionID);
            pStageLeaveBattle.Write(client.Stage.ID);

            foreach (Client cli in clis)
                cli.Send(pStageLeaveBattle);

            client.InBattle = false;
            client.EnteredBattle = false;
            client.RequestedBattleInfo = false;
            client.Alive = false;
            Helper.UnregisterAllBattleCallbacks(client);
            CheckBattleState(client);

        }
        public void OnBattleKill(Client client, Client killer)
        {

            client.Alive = false;
            List<Client> clis = null;

            Packet packetdead = new Packet(Operation.GameDead);
            packetdead.Write(killer.SessionID);
            packetdead.Write((UInt32)0x0);
            packetdead.Write(client.SessionID);
            packetdead.Write((UInt32)0x0);

            lock (client.Stage.Clients)
                clis = client.Stage.Clients.ToList();
            foreach (Client cli in clis)
                cli.Send(packetdead);

            client.DeathCount++;
            client.RoundDeaths++;
            if (killer.SessionID != client.SessionID)
            {
                killer.KillCount++;
                killer.RoundKills++;
            }
            bool bFound = false;
            foreach (Client cli in clis)
                if (cli.Berserker == true)
                    bFound = true;
            if (client.Berserker == true || bFound == false)
            {
                Packet packetserk = new Packet(Operation.AssignBerserker);
                packetserk.Write(killer.SessionID);
                foreach (Client cl in clis) cl.Send(packetserk);
                client.Berserker = false;
                killer.Berserker = true;
            }

            CheckBattleState(client);
            // check win state.
        }
        public void OnBattleSuicide(Client client)
        {

        }
        public void OnBattleLoaded(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = new List<Client>(client.Stage.Clients);
            client.Loaded = true;
            Packet packet = new Packet(Operation.StageLoaded);
            packet.Write(client.SessionID);
            packet.Write((UInt32)0x64);
            foreach (Client cli in clients)
                cli.Send(packet);
            CheckBattleState(client);
        }
        public void OnBattleInfoRequest(Client client)
        {
            client.RequestedBattleInfo = true;
            if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
            {

            }
            CheckBattleState(client);
        }
        public void OnBattleEnterRequest(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);

            Packet packet = new Packet(Operation.StageEnterBattleResponse);

            if (client.Stage.State == StageState.Standby)
                packet.Write(Convert.ToByte(0));
            else
                packet.Write(Convert.ToByte(1));
            packet.Write(166, 1);

            /* possible loop entire client stage list in one packet */
            Client c = client;
            packet.Write(c.SessionID);
            if (c.Bridge != null)
            {
                packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
                packet.Write(c.Bridge.Port);
            }
            else
            {
                packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
                packet.Write((int)0x00);
            }
            packet.Write(c.Character.Name, 32);
            packet.Write(c.Character.ClanName, 16);
            packet.Write((Int32)c.Character.ClanRank);
            packet.Write(c.Character.ClanPoints);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(c.Character.Level));
            packet.Write((byte)c.Character.Gender);
            packet.Write((byte)c.Character.Hair);
            packet.Write((byte)c.Character.Face);
            packet.Write(c.Character.Experience);
            packet.Write(c.Character.Bounty);
            packet.Write(c.Character.Bonus);
            packet.Write(c.Character.Prize);
            packet.Write(c.Character.Health);
            packet.Write(c.Character.Armor);
            packet.Write(c.Character.MaxWeight);
            packet.Write(c.Character.SafeFalls);
            packet.Write(c.Character.FR);
            packet.Write(c.Character.CR);
            packet.Write(c.Character.ER);
            packet.Write(c.Character.WR);
            foreach (Int32 rentalid in c.Character.Equipment)
            {
                if (rentalid == 0) packet.Write((Int32)0);
                else packet.Write(c.Character.Inventory[rentalid].ItemID);
            }
            packet.Write((Int32)c.Account.Access);
            packet.Write(c.Character.ClanID);
            packet.Write((byte)c.Team);
            packet.Write(Convert.ToByte(0));
            packet.Write(Convert.ToInt16(0));

            foreach (Client cli in clients)
                cli.Send(packet);


            client.EnteredBattle = true;

            // Check round state

            if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
            {
                // taking this out leaves them zoomed around the map.
                packet = new Packet(Operation.BattleRoundStateUpdate);
                packet.Write(client.Stage.ID);
                packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                packet.Write((Int32)client.Stage.RoundState);
                packet.Write(Convert.ToInt32(0));
                client.Send(packet);
            }
            client.LateJoin = false;
            CheckBattleState(client);
        }
        private void CheckBattleState(Client client)
        {
            List<Client> clients = null;
            lock (client.Stage.Clients)
                clients = client.Stage.Clients.ToList();

            if (client.Stage.State == StageState.Standby)
            { // Initial round not yet loaded
                if (client.Stage.RoundState == RoundState.Prepare && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
                {
                    client.Stage.State = StageState.Run;
                    client.Stage.RoundState = RoundState.Play;

                    foreach (Client cli in clients)
                    {
                        cli.RequestedBattleInfo = false;
                        cli.Alive = true;
                    }
                    Helper.UpdateChannelStages(client.Channel, null);

                    Packet packet = new Packet(Operation.BattleRoundStateUpdate);
                    packet.Write(client.Stage.ID);
                    packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
                    packet.Write((Int32)client.Stage.RoundState);
                    packet.Write(Convert.ToInt32(0));
                    foreach (Client c in clients)
                        c.Send(packet);
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
                }
            }
            else if (client.Stage.State == StageState.Run)
            { // Game Running
                if (client.Stage.RoundState == RoundState.Prepare)
                {
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Prepare", client.Stage.ID);
                    return;
                }
                else if (client.Stage.RoundState == RoundState.Countdown)
                {
                    Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Countdown", client.Stage.ID);
                    return;
                }
                else if (client.Stage.RoundState == RoundState.Play)
                {
                    CheckWinCondition(client);
                    return;
                }
            }
        }
        private void CheckWinCondition(Client client)
        {
            Stage stage = client.Stage;
            Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
            if (stage.RoundState == RoundState.Play)
            {
                List<Client> clis = null;
                lock (stage.Clients)
                    clis = stage.Clients.FindAll(c => c.InBattle == true);

                bool GameOver = false;
                foreach (Client cli in clis)
                {
                    if (cli.RoundKills >= stage.Rounds)
                    {
                        GameOver = true;
                        break;
                    }
                }
                if (GameOver == true)
                {
                    stage.CurrentRound = 0;
                    stage.Team1Score = 0;
                    stage.Team2Score = 0;
                    stage.State = StageState.Standby;
                    stage.RoundState = RoundState.Prepare;
                    Packet pGameOver = new Packet(Operation.BattleRoundStateUpdate);
                    pGameOver.Write(stage.ID);
                    pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
                    pGameOver.Write((Int32)RoundState.Finish);
                    pGameOver.Write(Convert.ToInt32(0));
                    foreach (Client cli in clis)
                        cli.Send(pGameOver);
                    pGameOver = new Packet(Operation.BattleRoundStateUpdate);
                    pGameOver.Write(stage.ID);
                    pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
                    pGameOver.Write((Int32)RoundState.Exit);
                    pGameOver.Write(Convert.ToInt32(0));
                    foreach (Client cli in clis)
                        cli.Send(pGameOver);
                    pGameOver = new Packet(Operation.StageFinish);
                    pGameOver.Write(stage.ID);
                    foreach (Client cli in clis)
                        cli.Send(pGameOver);
                    foreach (Client cli in clis)
                    {
                        cli.InBattle = false;
                        cli.Alive = false;
                        cli.RequestedBattleInfo = false;
                        cli.RoundDeaths = 0;
                        cli.RoundKills = 0;
                    }


                }
            }
        }
    }
}
 
Custom Title Activated
Loyal Member
Joined
Nov 5, 2006
Messages
1,358
Reaction score
15
Wow, this looks like some part of code for a matchserver emulator that would handle stages(games)

Thank you very much.
 
WowIwasSuperCringeB4
Loyal Member
Joined
Jun 21, 2008
Messages
1,297
Reaction score
226
C# FTW =)
what is this for ;P

HAHAHAHA that's exactly what I was gonna say..

so...
C# FTW :p
But ya what is this for?
Is this like a part of the server files that will get added on? or on the client?

Wow, this looks like some part of code for a matchserver emulator that would handle stages(games)

Thank you very much.

Mmm, well don't say thanks yet lol its in development section

Yes i am, someone have changed the password and the email of my Lambda account ._.

That blows :O
 
Experienced Elementalist
Joined
Mar 15, 2009
Messages
219
Reaction score
39
It's code from a server emulator to handle the logic for determining things like if someone has won a match, who won it, increasing kill and death counts, etc.
 
Custom Title Activated
Loyal Member
Joined
Nov 5, 2006
Messages
1,358
Reaction score
15
Yeah, and it seems very well coded. Ahhh, I looove C#. Thank god you didn't do this in C++.
 
Custom Title Activated
Loyal Member
Joined
Nov 5, 2006
Messages
1,358
Reaction score
15
I dislike C++'s syntax, but thats just a matter or preference.
 
Extreme Coder - Delphi
Loyal Member
Joined
Sep 8, 2007
Messages
1,381
Reaction score
39
Well if he manages to make this then we can add custom stuff ingame such as story mode etc..?
 
Custom Title Activated
Loyal Member
Joined
Nov 5, 2006
Messages
1,358
Reaction score
15
The syntax is the same minus the keywords that don't appear in one or the other. Great opinion :)
I'm sorry, but it is my opinion. Stop thinking you're smarter then everyone, you're not.
 
Mythic Archon
Joined
Apr 8, 2007
Messages
759
Reaction score
21
This is really nice.

I'm sorry, but it is my opinion. Stop thinking you're smarter then everyone, you're not.

He sure is smarter than you. C++ and C# has practically the same syntax. I believe you meant that C# is higher level, and more readable.
 
Custom Title Activated
Loyal Member
Joined
Nov 5, 2006
Messages
1,358
Reaction score
15
I mean I hate to write in C++. And who the hell are you to judge about both my and his intelligence. This is not about who's smarter. It's a matter of opinion. I dislike cpp. End of story.
 
DRGunZ 2 Creator
Loyal Member
Joined
Jan 21, 2007
Messages
4,493
Reaction score
161
Lucifer just likes to flame people as peaceofpi likes to try and be smarter than people :p
analogys rule xD
 
Extreme Coder - Delphi
Loyal Member
Joined
Sep 8, 2007
Messages
1,381
Reaction score
39
Kochon seirously someday you will need to move to cpp...
 
Extreme Coder - Delphi
Loyal Member
Joined
Sep 8, 2007
Messages
1,381
Reaction score
39
come to delphi, i moved from C# to delphi, and it opens a wider range of coding :p
 
Back
Top