Exemple #1
0
        public static void ProccessLateJoin(Client client, PacketReader packet)
        {
            if (client.GetStage() == null)
                return;

            Battle.ResponseLateJoin(client);
            client.GetStage().GetTraits().Ruleset.GameLateJoinCallback(client);
        }
Exemple #2
0
 public static void ProcessBattleInfo(Client client, PacketReader packetReader)
 {
     if (client.GetStage() == null)
     {
         Log.Write("NULL Stage?");
         return;
     }
     client.GetStage().GetTraits().Ruleset.GameInfoCallback(client);
 }
Exemple #3
0
        public static void BattleResponseInfo(Client client, int red, int blue, List<Client> players)
        {
            using (var packet = new PacketWriter(Operation.BattleResponseInfo, CryptFlags.Encrypt))
            {
                var traits = client.GetStage().GetTraits();

                packet.Write(traits.StageId);
                packet.Write(1, 6);
                packet.Write((byte)red);
                packet.Write((byte)blue);
                packet.Write(0);

                //TODO: Add rulesets here.
                if (!traits.Ruleset.IsBerserker() || !traits.Ruleset.IsAssassination() || ((Berserker)traits.Ruleset).CurrentBerserker == null)
                {
                    packet.Write(0, 0);
                }
                else if (traits.Ruleset.IsBerserker())
                {
                    var berserker = traits.Ruleset as Berserker;

                    if (berserker != null && berserker.CurrentBerserker != null)
                    {
                        packet.Write(1, 9);
                        packet.Write((byte)8);
                        packet.Write(berserker.CurrentBerserker.GetMuid());
                    }
                }
                else if (traits.Ruleset.IsAssassination())
                {
                    var rule = traits.Ruleset as Assassination;

                    if (rule.RedVip != null && rule.BlueVip != null)
                    {
                        packet.Write(1, 17);
                        packet.Write((byte) ObjectStageGameType.Assassination);
                        packet.Write(rule.RedVip.GetMuid());
                        packet.Write(rule.BlueVip.GetMuid());
                    }
                    else
                    {
                        packet.Write(0,0);
                    }
                }

                packet.Write(players.Count, 17);
                foreach (var c in players)
                {
                    packet.Write(c.GetMuid());
                    packet.Write(c.ClientPlayer.PlayerStats.Spawned);
                    packet.Write(c.ClientPlayer.PlayerStats.Kills);
                    packet.Write(c.ClientPlayer.PlayerStats.Deaths);
                }

                client.Send(packet);
            }
        }
Exemple #4
0
        public static void ProcessPeerRelay(Client client, PacketReader packetReader)
        {
            if (client.GetStage() == null)
                return;

            var charId = packetReader.ReadMuid();
            var peerId = packetReader.ReadMuid();

            //Now attempt to bind them!
            if (Globals.NatAgent != null)
            {
                AgentPackets.RelayPeer(Globals.NatAgent, new Tuple<Muid, Muid, Muid>(charId, peerId, client.GetStage().GetTraits().StageId));
                Log.Write("Binding player to NAT");
            }
            else
            {
                AgentPackets.AgentError(client, 10001);
            }
        }
Exemple #5
0
        public static void ProcessGameKill(Client client, PacketReader packet)
        {
            if (client.GetStage() == null)
            {
                Log.Write("Client doesn't have a stage...?");
                return;
            }

            var uidKiller = packet.ReadMuid();
            Client killer;

            lock (client.GetStage().ObjectLock)
            {
                killer =
                    client.GetStage().GetTraits().Players.Find(c => c.GetMuid() == uidKiller);
            }

            if (killer != null)
                client.GetStage().GetTraits().Ruleset.GameKillCallback(killer, client);
            else
            {
                Log.Write("Invalid killer");
            }
        }
Exemple #6
0
        public static void ResponseStageChat(Client client, PacketReader packetReader)
        {
            var uidChar = packetReader.ReadUInt64();
            var uidStage = packetReader.ReadUInt64();
            var message = packetReader.ReadString();

            if (client.GetStage() != null)
                client.GetStage().Chat(client, message);
        }
Exemple #7
0
        public static void ResponseSpawnWorldItem(Client client, PacketReader packet)
        {
            var charId = packet.ReadMuid();
            var itemId = packet.ReadInt32();
            var X = packet.ReadSingle();
            var Y = packet.ReadSingle();
            var Z = packet.ReadSingle();

            var spawn = new ItemSpawn();
            spawn.Position.X = X;
            spawn.Position.Y = Y;
            spawn.Position.Z = Z;
            spawn.ItemId = (ushort)itemId;
            spawn.Taken = false;
            spawn.ItemUid = client.GetStage().GetTraits().WorldItemUid;
            spawn.NextSpawn = DateTime.Now.AddMilliseconds(WorldItemManager.GetTime(itemId));

            Interlocked.Increment(ref client.GetStage().GetTraits().WorldItemUid);

            lock (client.GetStage().GetTraits().WorldItems)
                client.GetStage().GetTraits().WorldItems.Add(spawn);

            lock (client.GetStage().ObjectLock)
                Battle.SpawnWorldItem(client.GetStage().GetTraits().Players,
                                       spawn);
        }
Exemple #8
0
 public static void ProcessStageSettings(Client client, PacketReader packet)
 {
     if (client.GetStage() != null)
         client.GetStage().Settings(client, true);
 }
Exemple #9
0
        public static void ProcessStageStart(Client client, PacketReader packetReader)
        {
            if (client.GetStage() == null || client.GetStage().GetTraits().Master != client)
                return;

            client.GetStage().Start(client);
        }
Exemple #10
0
        public static void ResponseStageJoin(Client client, Results result)
        {
            using (var packet = new PacketWriter(Operation.StageJoin, CryptFlags.Encrypt))
            {
                packet.Write(client.GetMuid());
                packet.Write(client.GetStage().GetTraits().StageId);
                packet.Write(client.GetStage().GetTraits().StageIndex);
                packet.Write(client.GetStage().GetTraits().Name);

                client.Send(packet);
            }
        }
Exemple #11
0
 public static void ProcessEnterBattle(Client client, PacketReader packetReader)
 {
     if (client.GetStage() == null) return;
     client.GetStage().GetTraits().Ruleset.GameEnterCallback(client);
 }
Exemple #12
0
        public static void ProcessGameSpawn(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadUInt64();
            var xpos = packetReader.ReadSingle();
            var ypos = packetReader.ReadSingle();
            var zpos = packetReader.ReadSingle();
            var xdir = packetReader.ReadSingle();
            var ydir = packetReader.ReadSingle();
            var zdir = packetReader.ReadSingle();

            if (client.GetStage() != null)
            {
                var traits = client.GetStage().GetTraits();

                if (traits.Ruleset.IsDuel())
                {
                    if (traits.DuelQueue.Challenger != client && traits.DuelQueue.Champion != client)
                        return;
                }
                if (traits.Ruleset.IsTeam())
                    return;

                var position = new Position();
                var direction = new Direction();

                position.X = xpos;
                position.Y = ypos;
                position.Z = zpos;

                direction.X = xdir;
                direction.Y = ydir;
                direction.Z = zdir;
                lock (client.GetStage().ObjectLock)
                {
                    Battle.GameSpawn(client.GetStage().GetTraits().Players, client.GetMuid(),
                                     position, direction);
                }
            }
        }
Exemple #13
0
 public static void ProcessLeaveBattle(Client client, PacketReader packet)
 {
     if (client.GetStage() != null)
     {
         client.ClientPlayer.PlayerLocation = Place.Stage;
         client.GetStage().GetTraits().Ruleset.GameLeaveBattle(client);
     }
 }
Exemple #14
0
        public static void ProcessStageCreate(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadMuid();
            var name = packetReader.ReadString();
            var locked = packetReader.ReadBoolean();
            var password = packetReader.ReadString();

            if (uid != client.GetMuid())
            {
                client.Disconnect();
                return;
            }

            var traits = new StageTraits();
            traits.StageId = Globals.StageCounter.GetNext();
            traits.Name = name;
            traits.Locked = locked;
            traits.Password = password;
            traits.Master = client;

            client.ClientPlayer.PlayerStage = client.GetChannel().Add(traits);
            client.GetStage().Join(client);
        }
Exemple #15
0
        public static void ResponseStageState(Client client, PacketReader packetReader)
        {
            var charId = packetReader.ReadMuid();
            var stageId = packetReader.ReadMuid();
            var state = packetReader.ReadInt32();

            if (!Enum.IsDefined(typeof(ObjectStageState), state) || client.GetStage() == null)
            {
                client.Disconnect();
                return;
            }

            client.ClientPlayer.PlayerState = (ObjectStageState)state;
            client.GetStage().PlayerState(client);
        }
Exemple #16
0
        public static void ProcessRequestUseTrap2(Client pClient, PacketReader pPacket)
        {
            var id = pPacket.ReadInt16();
            var x = pPacket.ReadInt16();
            var y = pPacket.ReadInt16();
            var z = pPacket.ReadInt16();

            Log.Write("Trap2? {0} X: {1} Y: {2} Z:{3}", id, x, y, z);

            using (var p = new PacketWriter(Operation.MatchRequestUseTrap2, CryptFlags.Encrypt))
            {
                p.Write(id);
                p.Write(x);
                p.Write(y);
                p.Write(z);

                pClient.GetStage().GetTraits().Players.ForEach(c => c.Send(p));
            }
        }
Exemple #17
0
        public static void ProcessRelayMap(Client pClient, PacketReader pPacket)
        {
            var uid = pPacket.ReadMuid();
            var type = pPacket.ReadInt32();
            var count = pPacket.ReadInt32();
            var totalSize = pPacket.ReadInt32();
            var elementSize = pPacket.ReadInt32();
            var elementCount = pPacket.ReadInt32();

            if (elementCount < 0)
                return;

            var stage = pClient.GetStage().GetTraits();

            stage.RelayMaps = new RelayMapInfo();
            stage.RelayMaps.RepeatCount = count;
            stage.RelayMaps.RelayType = type;

            stage.RelayMaps.Maps = new List<RelayMaps>();
            for (var i = 0; i < elementCount; ++i)
            {
                var map = pPacket.ReadInt32();
                Log.Write("Found map: {0}", (RelayMaps)map);
                stage.RelayMaps.Maps.Add((RelayMaps)map);
            }
            stage.Map = (stage.RelayMaps.Maps[0]).ToString();
            stage.CurrentMap = Globals.Maps.GetMap(stage.RelayMaps.Maps[0].ToString());
        }
Exemple #18
0
 public static void ProcessLoading(Client client, PacketReader packetReader)
 {
     if (client.GetStage() == null) return;
     client.ClientFlags = PacketFlags.Battle;
     client.GetStage().GetTraits().Ruleset.GameLoadedCallback(client);
 }
Exemple #19
0
 public static void ProcessPeerList(Client client, PacketReader packet)
 {
     if (client.GetStage() != null)
     {
         lock (client.GetStage().ObjectLock)
             Battle.ResponsePeerList(client, client.GetStage().GetTraits().Players);
     }
 }
Exemple #20
0
        public static void ProcessObtainWorldItem(Client client, PacketReader packet)
        {
            var uidChar = packet.ReadMuid();
            var nItem = packet.ReadInt32();

            lock (client.GetStage().GetTraits().CurrentMap)
            {
                var i =
                    client.GetStage().GetTraits().CurrentMap.DeathMatchItems.Find(
                        ii => ii.ItemUid == nItem);

                if (i != null)
                {
                    i.Taken = true;
                    i.NextSpawn = DateTime.Now.AddSeconds(i.SpawnTime);
                    Log.Write("Spawning item: {0}. Next Spawn: {1}", i.ItemId, DateTime.Now.AddSeconds(i.SpawnTime / 1000));
                }
                else
                {
                    lock (client.GetStage().GetTraits().WorldItems)
                    {
                        i = client.GetStage().GetTraits().WorldItems.Find(ii => ii.ItemUid == nItem);

                        if (i != null)
                        {
                            client.GetStage().GetTraits().WorldItems.Remove(i);
                        }
                        else
                        {
                            return;
                        }
                    }
                }

                lock (client.GetStage().ObjectLock)
                    Battle.ObtainWorldItem(client.GetStage().GetTraits().Players,
                                           client.GetMuid(), nItem);
            }
        }
Exemple #21
0
        public static void ResponseStageTeam(Client client, PacketReader packetReader)
        {
            var charId = packetReader.ReadMuid();
            var stageId = packetReader.ReadMuid();
            var team = packetReader.ReadInt32();

            if (!Enum.IsDefined(typeof(Team), team) || client.GetStage() == null)
            {
                client.Disconnect();
                return;
            }

            client.ClientPlayer.PlayerTeam = (Team) team;
            client.GetStage().Team(client);
        }
Exemple #22
0
 public static void ProcessStageLeave(Client client, PacketReader packet)
 {
     client.ClientPlayer.PlayerLocation = Place.Lobby;
     if (client.GetStage() != null)
         client.GetStage().Leave(client);
 }
Exemple #23
0
        public static void GameEnterBattle(List<Client> clients, Client client)
        {
            var stage = client.GetStage().GetTraits();

            using (var packet = new PacketWriter(Operation.StageEnterBattle, CryptFlags.Encrypt))
            {
                if (stage.State == StageState.Standby)
                    packet.Write((byte)0);
                else
                    packet.Write((byte)1);

                //really hate constants :(.
                packet.Write(1, 394);
                packet.Write(client.GetMuid());

                if (client.PeerEnd == null)
                {
                    packet.Write(new byte[4], 0, 4);
                    packet.Write(0);
                }
                else
                {
                    packet.Write(client.PeerEnd.Address.GetAddressBytes(), 0, 4);
                    packet.Write(client.PeerEnd.Port);
                }

                packet.Write(client.GetCharacter().Name, 32);
                packet.Write(client.GetCharacter().ClanName, 16);
                packet.Write((Int32)client.GetCharacter().ClanGrade);//clan rank
                packet.Write(client.GetCharacter().ClanPoint);//clan points
                packet.Write((byte)0);//?
                packet.Write(client.GetCharacter().Level);
                packet.Write(client.GetCharacter().Sex);
                packet.Write(client.GetCharacter().Hair);
                packet.Write(client.GetCharacter().Face);
                packet.Write(client.GetCharacter().Xp);
                packet.Write(client.GetCharacter().Bp);
                packet.Write(client.GetCharacter().BonusRate);
                packet.Write(client.GetCharacter().Prize);
                packet.Write(client.GetCharacter().Hp);
                packet.Write(client.GetCharacter().Ap);
                packet.Write(client.GetCharacter().MaxWeight);
                packet.Write(client.GetCharacter().SafeFalls);
                packet.Write(client.GetCharacter().Fr);
                packet.Write(client.GetCharacter().Cr);
                packet.Write(client.GetCharacter().Er);
                packet.Write(client.GetCharacter().Wr);
                foreach (Item nItem in client.GetCharacter().EquippedItems)
                    packet.Write(nItem.ItemId);

                packet.Write((Int32)client.ClientPlayer.PlayerAccount.Access);
                packet.Write(client.GetCharacter().ClanId);
                packet.Write(client.GetCharacter().DuelRank); // duel tourney

                byte[] obfuscation = new byte[] {
                    0x00, 0x00, 0x00, 0x00,  //head
                    0x79, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //chest
                    0x7B, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //hands
                    0x6E, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //legs
                    0x6D, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //feet
                    0x6C, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //fingerL
                    0x49, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //fingerR
                    0x48, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //melee
                    0x4B, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //primary
                    0x72, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //secondary
                    0x4C, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //custom1
                    0x7F, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //custom2
                    0x4A, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //avatar
                    0x80, 0xF5, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //community1
                    0x00, 0x00, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //community2
                    0x00, 0x00, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //long buff1
                    0x00, 0x00, 0x00, 0x00,

                    0x00, 0x00, 0x00, 0x00, //long buff2
                    0x00, 0x00, 0x00, 0x00,

                    0x01, 0x00, 0x00, 0x00, //head quantity

                    0x01, 0x00, 0x00, 0x00, //chest quantity

                    0x01, 0x00, 0x00, 0x00, //hands quantity

                    0x01, 0x00, 0x00, 0x00, //legs quantity

                    0x01, 0x00, 0x00, 0x00, //feet quantity

                    0x01, 0x00, 0x00, 0x00, //fingerL quantity

                    0x01, 0x00, 0x00, 0x00, //fingerR quantity

                    0x01, 0x00, 0x00, 0x00, //melee quantity

                    0x01, 0x00, 0x00, 0x00, //primary quantity

                    0x01, 0x00, 0x00, 0x00, //secondary quantity

                    0x4C, 0x00, 0x00, 0x00, //custom1 quantity

                    0x01, 0x00, 0x00, 0x00, //custom2 quantity

                    0x01, 0x00, 0x00, 0x00, //vatar quantity

                    0x00, 0x00, 0x00, 0x00, //community1 quantity

                    0x00, 0x00, 0x00, 0x00, //community2 quantity

                    0x00, 0x00, 0x00, 0x00, //longbuff1 quantity

                    0x00, 0x00, 0x00, 0x00 //longbuff2 quantity
                };
                packet.Write(obfuscation);

                packet.Write((byte)client.ClientPlayer.PlayerTeam);
                packet.Write((byte)0);
                packet.Write((Int16)0);
                clients.ForEach(c => c.Send(packet));

            }
        }
Exemple #24
0
        public static void ProcessStageMap(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadMuid();
            var map = packetReader.ReadString();

            if (map.Length > 127 || client.GetStage() == null || client.GetStage().GetTraits().Master != client)
            {
                client.Disconnect();
                return;
            }

            if (map != "RelayMap")
            {
                client.GetStage().GetTraits().RelayEnabled = false;
                client.GetStage().GetTraits().Map = map;
                try
                {
                    client.GetStage().GetTraits().CurrentMap = Globals.Maps.GetMap(map);
                }
                catch
                {
                    Log.Write("Unable to load map: {0}. Defaulting to Mansion", map);
                    client.GetStage().GetTraits().CurrentMap = Globals.Maps.GetMap("Mansion");
                }
            }
            else
            {
                client.GetStage().GetTraits().RelayEnabled = true;
            }
            client.GetStage().Settings(client, true);
            Channel.Refresh(client);
        }
Exemple #25
0
        public static void ResponsePeerList(Client client, List<Client> clients)
        {
            using (var packet = new PacketWriter(Operation.StageResponsePeerList, CryptFlags.Encrypt))
            {
                packet.Write(client.GetStage().GetTraits().StageId);

                packet.Write(clients.Count, 394);
                foreach (var c in clients)
                {
                    packet.Write(c.GetMuid());

                    if (c.PeerEnd == null)
                    {
                        packet.Write(new byte[4], 0, 4);
                        packet.Write(0);
                    }
                    else
                    {
                        packet.Write(c.PeerEnd.Address.GetAddressBytes(), 0, 4);
                        packet.Write(c.PeerEnd.Port);
                    }

                    packet.Write(c.GetCharacter().Name, 32);
                    packet.Write(c.GetCharacter().ClanName, 16);
                    packet.Write((Int32)c.GetCharacter().ClanGrade);//clan rank
                    packet.Write(c.GetCharacter().ClanPoint);//clan points
                    packet.Write((byte)0);//?
                    packet.Write(c.GetCharacter().Level);
                    packet.Write(c.GetCharacter().Sex);
                    packet.Write(c.GetCharacter().Hair);
                    packet.Write(c.GetCharacter().Face);
                    packet.Write(c.GetCharacter().Xp);
                    packet.Write(c.GetCharacter().Bp);
                    packet.Write(c.GetCharacter().BonusRate);
                    packet.Write(c.GetCharacter().Prize);
                    packet.Write(c.GetCharacter().Hp);
                    packet.Write(c.GetCharacter().Ap);
                    packet.Write(c.GetCharacter().MaxWeight);
                    packet.Write(c.GetCharacter().SafeFalls);
                    packet.Write(c.GetCharacter().Fr);
                    packet.Write(c.GetCharacter().Cr);
                    packet.Write(c.GetCharacter().Er);
                    packet.Write(c.GetCharacter().Wr);
                    foreach (var nItem in c.GetCharacter().EquippedItems)
                        packet.Write(nItem.ItemId);

                    packet.Write((Int32)c.ClientPlayer.PlayerAccount.Access);
                    packet.Write(c.GetCharacter().ClanId);
                    packet.Write(c.GetCharacter().DuelRank); // duel tourney

                    byte[] obfuscation = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x79, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
                    packet.Write(obfuscation);
                    packet.Write((byte)c.ClientPlayer.PlayerTeam);
                    packet.Write((byte)0);
                    packet.Write((Int16)0);
                }

                client.Send(packet);
            }
        }
Exemple #26
0
        public static void ProcessStageSetting(Client client, PacketReader packetReader)
        {
            if (client.GetStage() == null)
                return;

            var stage = client.GetStage().GetTraits();

            var uidChar = packetReader.ReadMuid();
            var uidStage = packetReader.ReadMuid();
            var total = packetReader.ReadInt32();
            var size = packetReader.ReadInt32();
            var count = packetReader.ReadInt32();
            var uidStage2 = packetReader.ReadMuid();
            var map = packetReader.ReadString(32);
            var index = packetReader.ReadInt32();
            var type = packetReader.ReadInt32();
            var rounds = packetReader.ReadInt32();
            var time = packetReader.ReadInt32();
            var level = packetReader.ReadInt32();
            var players = packetReader.ReadInt32();
            var teamkill = packetReader.ReadBoolean();
            var balance = packetReader.ReadBoolean();
            var join = packetReader.ReadBoolean();
            var win = packetReader.ReadBoolean();

            if ((ObjectStageGameType)type != stage.Gametype)
            {
                if (!Enum.IsDefined(typeof(ObjectStageGameType), (byte)type))
                {
                    client.Disconnect();
                    return;
                }

                stage.Gametype = (ObjectStageGameType)type;

            }

            switch ((ObjectStageGameType)type)
            {
                case ObjectStageGameType.DeathMatch:
                    stage.Ruleset = new Deathmatch(client.GetStage());
                    break;
                case ObjectStageGameType.Berserker:
                    stage.Ruleset = new Berserker(client.GetStage());
                    break;
                case ObjectStageGameType.Duel:
                    stage.Ruleset = new Duel(client.GetStage());
                    break;
                case ObjectStageGameType.Gladiator:
                    stage.Ruleset = new Deathmatch(client.GetStage());
                    break;
                case ObjectStageGameType.Training:
                    stage.Ruleset = new Deathmatch(client.GetStage());
                    break;
                case ObjectStageGameType.TeamDeathMatch:
                    stage.Ruleset = new TeamDeathmatch(client.GetStage());
                    break;
                case ObjectStageGameType.TeamGladiator:
                    stage.Ruleset = new TeamDeathmatch(client.GetStage());
                    break;
                case ObjectStageGameType.Assassination:
                    stage.Ruleset = new Assassination(client.GetStage());
                    break;
                case ObjectStageGameType.TeamDeathMatchExtreme:
                    stage.Ruleset = new TeamDeathmatchExtreme(client.GetStage());
                    break;
                default:
                    Log.Write("Unknown ruleset: {0}", type);
                    stage.Ruleset = new Deathmatch(client.GetStage());
                    break;
            }

            stage.RoundCount =  rounds;

            stage.Time = time > Byte.MaxValue ? (byte)0 : Convert.ToByte(time);
            stage.Level = Convert.ToByte(level);
            stage.MaxPlayers = Convert.ToByte(players);
            stage.ForcedEntry = join;
            stage.TeamBalanced = balance;
            stage.TeamKill = teamkill;

            if ((ObjectStageGameType)type == ObjectStageGameType.Duel && type != stage.Type)
            {
                stage.CurrentMap = Globals.Maps.GetMap("Hall");
                stage.Map = "Hall";
            }
            else
            {
                stage.Type = type;
            }

            client.GetStage().Settings(client, true);
            Channel.Refresh(client);
        }