Esempio n. 1
0
        public static void ProcessDeleteChar(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadMuid();
            var index = packetReader.ReadInt32();
            var name = packetReader.ReadString();
            var result = Results.Accepted;

            if (uid != client.GetMuid() || !Globals.AcceptedString.IsMatch(name) || index < 0 || index > 4)
            {
                client.Disconnect();
                return;
            }

            var cid = Globals.GunzDatabase.GetCid(client.ClientPlayer.PlayerAccount.AccountId, index);
            if (cid == 0)
            {
                result = Results.CharacterDeleteDisabled;
            }
            else
            {
                Globals.GunzDatabase.DeleteCharacter(client.ClientPlayer.PlayerAccount.AccountId, cid);
            }

            Match.ResponseDeleteCharacter(client, result);
        }
Esempio n. 2
0
        public static void ProcessCreateChar(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadMuid();
            var index = packetReader.ReadInt32();
            var name = packetReader.ReadString();
            var sex = packetReader.ReadInt32();
            var hair = packetReader.ReadInt32();
            var face = packetReader.ReadInt32();
            var costume = packetReader.ReadInt32();
            var result = Results.Accepted;

            if (uid != client.GetMuid() || index < 0 || index > 4 || sex < 0 || sex > 1)
            {
                client.Disconnect();
                return;
            }

            if (!Globals.AcceptedString.IsMatch(name))
                result = Results.CharacterEnterName;
            else if (Globals.GunzDatabase.GetCharacterCount(client.ClientPlayer.PlayerAccount.AccountId) >= 4)
                result = Results.CharacterNameNonExistant;
            else if (Globals.GunzDatabase.CharacterExists(name))
                result = Results.CharacterNameInUse;
            else if (!Globals.GunzDatabase.CreateCharacter(client.ClientPlayer.PlayerAccount.AccountId, (byte)index, name, sex, hair, face, costume))
                result = Results.CharacterInvalidName;

            Match.ResponseCreateChar(client, result, name);
        }
Esempio n. 3
0
        public static void ProcessAdminAnnounce(Client client, PacketReader packetReader)
        {
            var adminId = packetReader.ReadMuid();
            var message = packetReader.ReadString();

            if (client.ClientPlayer.PlayerAccount.Access == UGradeId.Administrator
                || client.ClientPlayer.PlayerAccount.Access == UGradeId.Developer
                || client.ClientPlayer.PlayerAccount.Access == UGradeId.EventMaster)
            {
                Match.Announce(client, message);
                return;
            }

            client.Disconnect();
            return;
        }
Esempio n. 4
0
        public static void ProcessCharInfo(Client client, PacketReader packetReader)
        {
            var index = packetReader.ReadByte();

            if (index < 0 || index > 4)
            {
                client.Disconnect();
                return;
            }

            client.GetCharacter().CharNum = index;
            client.GetCharacter().UGrade = client.ClientPlayer.PlayerAccount.Access;
            Globals.GunzDatabase.GetCharacter(client.ClientPlayer.PlayerAccount.AccountId, index, client.GetCharacter());

            Match.ResponseCharInfo(client);
        }
Esempio n. 5
0
        public static void ProcessChannelList(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadUInt64();
            var type = packetReader.ReadInt32();

            if (!Enum.IsDefined(typeof (ChannelType), (byte) type))
            {
                client.Disconnect();
                return;
            }

            var channels = ChannelList.GetList((ChannelType)type);
            if (channels.Count == 0)
                return;

            ChannelPackets.ResponseChannelList(client, channels);
        }
Esempio n. 6
0
        public static void ProcessEquipItem(Client client, PacketReader packetReader)
        {
            var uidChar = packetReader.ReadUInt64();
            var nItemLow = packetReader.ReadInt32();
            var nItemHigh = packetReader.ReadInt32();
            var nItemSlot = packetReader.ReadInt32();
            Results result = Results.Accepted;

            if (!Enum.IsDefined(typeof(ItemSlotType), nItemSlot))
            {
                client.Disconnect();
                return;
            }

            Items.Item nItem = client.GetCharacter().Items.Find(i => i.ItemCid == nItemHigh);
            if (nItem == null)
                result = Results.ShopItemNonExistant;
            else if (nItem.Level > client.GetCharacter().Level)
            {
                result = Results.ShopLevelTooLow;
            }
            else if ((ItemSlotType)nItemSlot == ItemSlotType.primary_slot && nItem.ItemId == client.GetCharacter().EquippedItems[(int)ItemSlotType.secondary_slot].ItemId)
            {
                result = Results.ShopInvalidItem;
            }
            else if ((ItemSlotType)nItemSlot == ItemSlotType.secondary_slot && nItem.ItemId == client.GetCharacter().EquippedItems[(int)ItemSlotType.primary_slot].ItemId)
            {
                result = Results.ShopInvalidItem;
            }
            else
            {
                client.GetCharacter().EquippedItems[nItemSlot].ItemCid = nItemHigh;
                client.GetCharacter().EquippedItems[nItemSlot].ItemId = nItem.ItemId;
                Globals.GunzDatabase.UpdateSlot(client.GetCharacter().CharacterId, (ItemSlotType)nItemSlot, nItemHigh);
            }

            Match.ResponseEquipItem(client, result);
            Match.ResponseCharacterItemList(client);
        }
Esempio n. 7
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);
        }
Esempio n. 8
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);
        }
Esempio n. 9
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);
        }
Esempio n. 10
0
        public static void ProcessRequestProposal(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadMuid();
            var mode = packetReader.ReadInt32();
            var request = packetReader.ReadInt32();
            var memberCount = packetReader.ReadInt32();
            var totalSize = packetReader.ReadInt32();
            var blobSize = packetReader.ReadInt32();
            var blobCount = packetReader.ReadInt32();
            List<byte[]> blob = new List<byte[]>();

            if (memberCount == blobCount)
            {
                for (int i = 0; i < blobCount; ++i)
                {
                    var temp = new byte[blobSize];
                    packetReader.Read(temp, 0, blobSize);
                    blob.Add(temp);
                }
            }
            else
            {
                client.Disconnect();
                return;
            }

            List<Client> requests = new List<Client>();

            foreach (byte[] b in blob)
            {
                string s = System.Text.ASCIIEncoding.ASCII.GetString(b);
                s = s.Substring(0, s.IndexOf('\0'));
                requests.Add(TcpServer.GetClientFromName(s));
            }

            if (requests.FindAll(c => c.GetCharacter().ClanId == client.GetCharacter().ClanId).Count == memberCount)
            {
                List<Pair<Client, bool>> list = new List<Pair<Client, bool>>();

                foreach (Client c in requests)
                {
                    list.Add(new Pair<Client, bool>(c, false));
                }
                list.Add(new Pair<Client, bool>(client, true));

                ClanPackets.AskAgreement(requests, client, mode, request);
                ClanPackets.ResponseProposal(client, 0, mode, request);

                PendingClanWarRequest pc = new PendingClanWarRequest();
                pc.RequestId = request;
                pc.Players = list;
                pc.ClanName = client.GetCharacter().ClanName;
                pc.Requester = client;
                pc.RequestMode = mode;

                lock(Globals.PendingClanWar)
                    Globals.PendingClanWar.Add(pc);

                var responsetimer = new Timer(30000);
                responsetimer.Elapsed += (s, o) => CancelClanWarRequest(client, pc, responsetimer);
                responsetimer.Start();
            }
        }
Esempio n. 11
0
        public static void ProcessPromoteMember(Client client, PacketReader packetReader)
        {
            if (client.GetCharacter().ClanId < 1 || client.GetCharacter().ClanGrade != ClanGrade.Master)
                return;

            var sender = packetReader.ReadMuid();
            var member = packetReader.ReadString();
            var rank = packetReader.ReadInt32();

            if (!Enum.IsDefined(typeof(ClanGrade), rank))
            {
                client.Disconnect();
                return;
            }

            Client memberClient = TcpServer.GetClientFromName(member);

            if (memberClient != null)
            {
                memberClient.GetCharacter().ClanGrade = (ClanGrade)rank;
                Globals.GunzDatabase.UpdateMember(memberClient.GetCharacter().CharacterId, rank);
            }

            ClanPackets.ResponseChangeGrade(client);
            ClanPackets.UpdateClanCharInfo(memberClient);
            ClanPackets.SendMemberList(client);
        }
Esempio n. 12
0
        public static void ProcessSelectChar(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadMuid();
            var index = packetReader.ReadInt32();

            if (uid != client.GetMuid() || index < 0 || index > 4)
            {
                client.Disconnect();
                return;
            }

            client.ClientFlags = PacketFlags.Character;
            Globals.GunzDatabase.GetCharacter(client.ClientPlayer.PlayerAccount.AccountId, (byte)index, client.GetCharacter());
            Match.ResponseSelectCharacter(client);
        }
Esempio n. 13
0
        public static void ResponseChannelJoinFromName(Client client, PacketReader packetReader)
        {
            var uid = packetReader.ReadUInt64();
            var type = packetReader.ReadInt32();
            var name = packetReader.ReadString();

            if (!Enum.IsDefined(typeof(ChannelType), (byte)type))
            {
                client.Disconnect();
                return;
            }

            Channels.Channel c = ChannelList.Find((ChannelType) type, name);
            if (c == null)
            {
                var channel = new ChannelTraits();
                channel.ChannelName = name;
                channel.Rule = ChannelRule.Elite;
                channel.Type = (ChannelType)type;
                channel.MaxLevel = 100;
                channel.MinLevel = 0;
                channel.MaxUsers = 100;

                ChannelList.AddAndJoin(client, channel);
                return;
            }
            client.ClientPlayer.PlayerChannel = c;
            c.Join(client);
        }
Esempio n. 14
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);
        }
Esempio n. 15
0
        public static void ProcessLoginRequest(Client client, PacketReader packetReader)
        {
            var user = packetReader.ReadString();
            var pass = packetReader.ReadString();
            var version = packetReader.ReadInt32();
            var checksum = packetReader.ReadInt32();
            var totalSize = packetReader.ReadInt32();
            var blobSize = packetReader.ReadInt32();
            var blobCount = packetReader.ReadInt32();
            var md5 = new byte[blobSize*blobCount];

            packetReader.Read(md5, 0, blobSize);

            if (blobSize > 32)
            {
                client.Disconnect();
                return;
            }

            if (!Globals.AcceptedString.IsMatch(user) || !Globals.AcceptedString.IsMatch(pass))
            {
                Match.ResponseLogin(client, Results.LoginAuthenticationFailed, user, UGradeId.Guest, PGradeId.Free, new Muid(0,0));
                client.Disconnect();
                return;
            }

            if (Globals.Config.Server.AutoRegistration)
            {
                if (user.StartsWith("!r"))
                {
                    user = user.Substring(2);
                    if (!Globals.GunzDatabase.AccountExists(user))
                        Globals.GunzDatabase.CreateAccount(user, pass, ref client.ClientPlayer.PlayerAccount);
                    else
                    {
                        Match.ResponseNotify(client, "That account is already in use!", 1);
                        client.Disconnect();
                        return;
                    }
                }
                else
                    Globals.GunzDatabase.GetAccount(user, pass, ref client.ClientPlayer.PlayerAccount);
            }
            else
                Globals.GunzDatabase.GetAccount(user, pass, ref client.ClientPlayer.PlayerAccount);

            if (client.ClientPlayer.PlayerAccount.AccountId == 0)
            {
                Match.ResponseLogin(client, Results.LoginIncorrectPassword, user, UGradeId.Guest, PGradeId.Free, new Muid(0, 0));
                client.Disconnect();
                return;
            }

            if (client.ClientPlayer.PlayerAccount.Access == UGradeId.Banned || client.ClientPlayer.PlayerAccount.Access == UGradeId.Criminal)
            {
                Match.ResponseLogin(client, Results.LoginBannedId, user, UGradeId.Guest, PGradeId.Free, new Muid(0, 0));
                client.Disconnect();
                return;
            }

            if (version != Globals.Config.Client.Version)
            {
                Match.ResponseLogin(client, Results.LoginInvalidVersion, user, UGradeId.Guest, PGradeId.Free, new Muid(0, 0));
                return;
            }

            if (Globals.Config.Client.UseCrc)
            {
                if ((checksum^0) != Globals.Config.Client.FileList)
                {
                    Match.ResponseLogin(client, Results.LoginInvalidVersion, user, UGradeId.Guest, PGradeId.Free, new Muid(0, 0));
                    client.Disconnect();
                    return;
                }
            }

            var inuse = TcpServer.GetClientFromAid(client.ClientPlayer.PlayerAccount.AccountId);

            if (inuse != null && inuse != client)
            {
                inuse.Disconnect();
            }

            client.ClientFlags = PacketFlags.Login;
            Match.ResponseLogin(client, Results.Accepted, user, client.ClientPlayer.PlayerAccount.Access, PGradeId.Free, client.GetMuid());
        }
Esempio n. 16
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);
        }
Esempio n. 17
0
        public static void ProcessTakeOffItem(Client client, PacketReader packetReader)
        {
            var uidChar = packetReader.ReadUInt64();
            var nItemSlot = packetReader.ReadInt32();

            if (!Enum.IsDefined(typeof(ItemSlotType), nItemSlot))
            {
                client.Disconnect();
                return;
            }
            client.GetCharacter().EquippedItems[nItemSlot].ItemCid = 0;
            client.GetCharacter().EquippedItems[nItemSlot].ItemId = 0;
            Globals.GunzDatabase.UpdateSlot(client.GetCharacter().CharacterId, (ItemSlotType)nItemSlot, 0);

            Match.ResponseTakeOffItem(client);
            Match.ResponseCharacterItemList(client);
        }