// Métodos
        public int GetDistance(SPosition other)
        {
            int x = Math.Abs(this.X - other.X);
            int y = Math.Abs(this.Y - other.Y);

            return(x > y ? x : y);
        }
Exemple #2
0
        public static P_36C New(int ClientId, SPosition Src, SPosition Dst, int Type, int Speed, byte[] Directions)
        {
            P_36C tmp = new P_36C
            {
                Header = SHeader.New(0x36C, Marshal.SizeOf <P_36C>(), ClientId),

                Src = Src,

                Type  = Type,
                Speed = Speed,

                Directions = new byte[12],

                Unk1 = new byte[12],

                Dst = Dst,
            };

            if (Directions != null)
            {
                Array.Copy(Directions, tmp.Directions, tmp.Directions.Length);
            }

            return(tmp);
        }
        public static void controller(Client client)
        {
            foreach (InitItem item in Config.InitItemList)
            {
                SItem vaItem = SItem.New(item.ItemId);

                //TODO: nao aparece os objetos descobrir o motivo
                client.Send(P_26E.New(SPosition.New(item.PosX, item.PosY), vaItem, (byte)item.Rotate, Gate.Closed));
            }
        }
        public static P_26E New(SPosition position, SItem item, byte rotate, Gate state)
        {
            P_26E tmp = new P_26E
            {
                Header   = SHeader.New(0x026E, Marshal.SizeOf <P_26E>(), 0),
                Position = position,
                ItemId   = (short)(Config.HeightMap(position) + 10000),
                Item     = item,
                Rotate   = rotate,
                Status   = (byte)state
            };

            return(tmp);
        }
        // Construtores
        public static SMobList New()
        {
            SMobList tmp = new SMobList()
            {
                Mob             = SMob.New(),
                Number          = 0,
                Speed           = 1,
                PositionInicial = SPosition.New(),
                PositionFinal   = SPosition.New(),
                FreqStep        = 1,
                IdGroup         = 0,
                Tab             = ""
            };

            return(tmp);
        }
Exemple #6
0
        public static void Teleport(Client client, SPosition sPosition)
        {
            //Adiciona posição a lista de posições
            client.Character.Positions.Clear();
            client.Character.Positions.Add(client.Character.Mob.LastPosition);

            P_36C p36C = P_36C.New(client.ClientId, client.Character.Mob.LastPosition, sPosition, 1);

            //envia para a nova coordenada
            client.Send(p36C);

            // Atualiza os arredores
            Functions.UpdateFromaWorld(client, p36C);

            client.Character.Positions.Add(sPosition);

            //Atualiza a ultima posicao para o destino
            client.Character.Mob.LastPosition = sPosition;
        }
Exemple #7
0
        public SPosition Dst;     // 48 a 51	= 4

        // Construtores
        public static P_36C New(int ClientId, SPosition Src, SPosition Dst, int Type) => New(ClientId, Src, Dst, Type, 0, null);
 // Métodos
 public static sbyte HeightMap(SPosition P) => _HeightMap[P.X, P.Y];
 public static SPosition New(SPosition p) => New(p.X, p.Y);
Exemple #10
0
        // Controlador
        public static void Controller(Client Client, P_36C Rcv, bool Is36C)
        {
            // Guarda a posição original do personagem
            Coord cur = Client.Map.GetCoord(Client.Character.Mob.LastPosition);

            // Guarda a posição de destino
            Coord dst = Client.Map.GetCoord(Rcv.Dst);

            // Verifica se as posições de origem e destino são a mesma
            if (Client.Character.Mob.LastPosition == Rcv.Dst)
            {
                return;
            }
            // Verifica se o caminho de destino está vaziu
            else if (!dst.CanWalk)
            {
                // Manda cliente de volta pra posição inicial
                Log.Error(0);
                Sendback( );
                return;
            }
            // Verifica se a posição de origem está na lista de posições do personagem
            else if (!Client.Character.Positions.Contains(Rcv.Src))
            {
                // Manda cliente de volta pra posição inicial
                Log.Error(1);
                Sendback( );
                return;
            }

            // Valida o caminho pelo HeightMap
            SPosition        position  = Rcv.Src;
            List <SPosition> positions = new List <SPosition> ( )
            {
                position
            };

            int cHeight = Config.HeightMap(position), oHeight = cHeight;

            // Verifica qual pacote foi enviado
            if (Is36C)
            {
                foreach (byte direction in Rcv.Directions)
                {
                    switch (direction)
                    {
                    case 0: continue;                                            // Chegou ao fim

                    case 49: position.X--; position.Y--; break;                  // -X -Y

                    case 50: position.Y--; break;                                // -Y

                    case 51: position.X++; position.Y--; break;                  // +X -Y

                    case 52: position.X--; break;                                // -X

                    case 54: position.X++; break;                                // +X

                    case 55: position.X--; position.Y++; break;                  // -X +Y

                    case 56: position.Y++; break;                                // +Y

                    case 57: position.X++; position.Y++; break;                  // +X +Y

                    default: Client.Close($"Unk direction: {direction}"); break; // Coordenada inválida
                    }

                    // Guarda a altura do mapa de destino
                    oHeight = Config.HeightMap(position);

                    // Verifica se a mudança de altura é maior que 9
                    if (Math.Abs(cHeight - oHeight) > 9)
                    {
                        // Manda cliente de volta pra posição inicial
                        Log.Error(2);
                        Sendback( );
                        return;
                    }

                    // Atualiza a altura do mapa atual
                    cHeight = oHeight;

                    // Adiciona a posição a lista
                    positions.Add(position);
                }
            }
            else
            {
                // Adiciona a posição a lista
                positions.Add(Rcv.Dst);
                // INCOMPLETO, NADA FEITO AQUI AINDA!!!
            }

            // Atualiza a lista de posições do personagem
            Client.Character.Positions.Clear( );
            Client.Character.Positions.AddRange(positions);

            // Atualiza a posição do personagem
            Client.Character.Mob.LastPosition = Rcv.Dst;

            // Atualiza a posição no mapa
            cur.Client = null;
            dst.Client = Client;

            // Pacote do andar
            P_36C p36C = New(Client.ClientId, Rcv.Src, Rcv.Dst, Rcv.Type, Rcv.Speed, Rcv.Directions);

            // Atualiza os arredores
            Client.Surround.UpdateSurrounds(same => {
                // Varre a lista
                foreach (object o in same)
                {
                    switch (o)
                    {
                    case Client client2: {
                        client2.Send(p36C);
                        break;
                    }
                    }
                }
            }, entered => {
                // Visão do cliente
                P_364 p364    = P_364.New(Client.Character, EnterVision.Normal);
                p364.Position = SPosition.New(cur);

                // Varre a lista
                foreach (object o in entered)
                {
                    switch (o)
                    {
                    case Client client2: {
                        client2.Send(p364);
                        client2.Send(p36C);
                        Client.Send(P_364.New(client2.Character, EnterVision.Normal));
                        break;
                    }
                    }
                }
            }, left => {
                // Visão do cliente
                P_165 p165 = P_165.New(Client.ClientId, LeaveVision.Normal);

                // Varre a lista
                foreach (object o in left)
                {
                    switch (o)
                    {
                    case Client client2: {
                        client2.Send(p36C);
                        client2.Send(p165);
                        Client.Send(P_165.New(client2.ClientId, LeaveVision.Normal));
                        break;
                    }
                    }
                }
            });

            // Funções ajudantes
            void Sendback( )
            {
                Client.Send(New(Client.ClientId, SPosition.New(cur), SPosition.New(cur), 1, 0, null));
            }
        }
Exemple #11
0
        public SPosition Dst;       // 12 a 16	= 4

        public static void Controller(Client client)
        {
            int posX = client.Character.Mob.LastPosition.X;
            int posY = client.Character.Mob.LastPosition.Y;

            if (posX >= 2116 && posY >= 2100 && posX <= 2119 && posY <= 2103) //Armia->Noatum  "X"
            {
                Teleport(client, SPosition.New(1046, 1725));
            }

            else if (posX >= 2140 && posY >= 2068 && posX <= 2143 && posY <= 2071) //Armia -> Campo de Treino
            {
                Teleport(client, SPosition.New(2590, 2096));
            }

            else if (posX >= 1044 && posY >= 1724 && posX <= 1047 && posY <= 1727)  //Noatum->Armia  "X"
            {
                Teleport(client, SPosition.New(2116, 2100));
            }

            else if (posX >= 1052 && posY >= 1708 && posX <= 1055 && posY <= 1711) //Noatum->Gelo  "X"
            {
                Teleport(client, SPosition.New(3649, 3109));
            }

            else if (posX >= 3648 && posY >= 3108 && posX <= 3651 && posY <= 3111) //Gelo->Noatum  "X"
            {
                Teleport(client, SPosition.New(1054, 1710));
            }

            else if (posX >= 1044 && posY >= 1716 && posX <= 1047 && posY <= 1719) //Noatum->Azram  "X"
            {
                Teleport(client, SPosition.New(2480, 1716));
            }

            else if (posX >= 2480 && posY >= 1716 && posX <= 2483 && posY <= 1720) //Azram -> Noatum"X"
            {
                Teleport(client, SPosition.New(1044, 1717));
            }

            else if (posX >= 2468 && posY >= 1716 && posX <= 2471 && posY <= 1719) // Azram -> Chefe de Treino
            {
                Teleport(client, SPosition.New(2250, 1557));
            }

            else if (posX >= 2452 && posY >= 1716 && posX <= 2455 && posY <= 1719) //Azram -> Perto da Agua
            {
                Teleport(client, SPosition.New(1969, 1713));
            }

            else if (posX >= 1044 && posY >= 1708 && posX <= 1047 && posY <= 1711) //Noatum->Erion  "X"
            {
                Teleport(client, SPosition.New(2456, 2016));
            }

            else if (posX >= 2456 && posY >= 2016 && posX <= 2459 && posY <= 2019) //Erion -> Noatum "X"
            {
                Teleport(client, SPosition.New(1044, 1708));
            }

            else if (posX >= 2452 && posY >= 1988 && posX <= 2455 && posY <= 1991) //Erion -> Campo de Erion
            {
                Teleport(client, SPosition.New(1990, 1756));
            }

            else if (posX >= 1056 && posY >= 1724 && posX <= 1059 && posY <= 1728) //Noatum -> Campo Deserto
            {
                Teleport(client, SPosition.New(1157, 1718));
            }
            //Adicionar teleporte para guerra qnd for domingo ao invez de campo de treino

            else if (posX >= 1312 && posY >= 1900 && posX <= 1315 && posY <= 1903) //Deserto->Kefra  "X"
            {
                Teleport(client, SPosition.New(2366, 4072));
            }

            else if (posX >= 2364 && posY >= 4072 && posX <= 2367 && posY <= 4075) //Kefra->Deserto  "X"
            {
                Teleport(client, SPosition.New(1314, 1901));
            }

            else if (posX >= 2364 && posY >= 3924 && posX <= 2367 && posY <= 3927)//Hall do Kefra to City Kefra
            {
                Teleport(client, SPosition.New(3250, 1703));
            }

            else if (posX >= 2362 && posY >= 3892 && posX <= 2370 && posY <= 3895)
            {
                Teleport(client, SPosition.New(2366, 3910));
            }

            else if (posX >= 2452 && posY >= 1716 && posX <= 2455 && posY <= 1719)
            {
                Teleport(client, SPosition.New(1965, 1770));
            }

            else if (posX >= 1108 && posY >= 1980 && posX <= 1111 && posY <= 1983)
            {
                Teleport(client, SPosition.New(3650, 3109));
            }

            else if (posX >= 744 && posY >= 3804 && posX <= 747 && posY <= 3807)
            {
                Teleport(client, SPosition.New(912, 3811));
            }

            else if (posX >= 744 && posY >= 3816 && posX <= 747 && posY <= 3819)
            {
                Teleport(client, SPosition.New(1006, 3993));
            }

            else if (posX >= 912 && posY >= 3808 && posX <= 915 && posY <= 3811) // Dungeon->Dungeon  "X"
            {
                Teleport(client, SPosition.New(747, 3806));
            }

            else if (posX >= 1516 && posY >= 3996 && posX <= 1519 && posY <= 3999)
            {
                client.Send(P_101.New($"Estamos em Construçao Sistema de teleporte  !."));
            }

            else if (posX >= 1056 && posY >= 1724 && posX <= 1059 && posY <= 1727)
            {
                int cHor = DateTime.Now.Hour;

                if (client.Character.Mob.Gold >= 500000)
                {
                    if (cHor >= 18 && cHor <= 19)
                    {
                        if (client.Character.Mob.Gold >= 500000)
                        {
                            client.Character.Mob.Gold -= 500000;
                            Teleport(client, SPosition.New(1160, 1726));
                        }
                        else
                        {
                            client.Send(P_101.New($"Custo do teleporte é de 500.000 gold."));
                        }
                    }
                    else
                    {
                        client.Character.Mob.Gold -= 500000;
                        Teleport(client, SPosition.New(3237, 1691));
                    }
                }
            }
        }
Exemple #12
0
 // Retorna a Coord
 public Coord GetCoord(SPosition pos) => GetCoord(pos.X, pos.Y);
        private static SMob convertMobBinToXml(STRUCT_MOB paMob)
        {
            SMob mob = SMob.New();

            mob.Name       = paMob.name;
            mob.CapaReino  = paMob.Clan;
            mob.Merchant   = paMob.Merchant;
            mob.GuildIndex = paMob.Guild;
            mob.ClassInfo  = paMob.Class > 4 ? ClassInfo.TK : (ClassInfo)paMob.Class;
            mob.AffectInfo = paMob.resistencia;
            mob.QuestInfo  = paMob.Quest;
            mob.Gold       = paMob.gold;
            // mob.Unk1 = new byte[0](paMob.Unk1);
            mob.Exp          = (ulong)paMob.Exp;
            mob.LastPosition = SPosition.New(paMob.SPX, paMob.SPY);
            mob.BaseStatus   = new SStatus();
            mob.GameStatus   = new SStatus();
            mob.Equip        = new SItem[16];
            mob.Inventory    = new SItem[60];
            mob.Andarilho    = new SItem[2];
            //mob.Unk2 = new byte[8];
            mob.Item547     = 0;
            mob.ChaosPoints = 0;
            mob.CurrentKill = 0;
            mob.TotalKill   = 0;
            //mob.Unk3 = new byte[2];
            mob.LearnedSkill = paMob.LearnedSkill;
            mob.StatusPoint  = paMob.ScoreBonus;
            mob.MasterPoint  = paMob.SpecialBonus;
            mob.SkillPoint   = paMob.SkillBonus;
            mob.Critical     = paMob.Critical;
            mob.SaveMana     = paMob.SaveMana;
            mob.SkillBar1    = paMob.SkillBar;

            //mob.Unk4 = new byte[4];
            mob.Resistencia[0] = paMob.Resist[0];
            mob.Resistencia[1] = paMob.Resist[1];
            mob.Resistencia[2] = paMob.Resist[2];
            mob.Resistencia[3] = paMob.Resist[3];
            //mob.Unk5 = new byte[210];
            mob.MagicIncrement = (short)paMob.Magic;
            mob.Tab            = "";


            mob.BaseStatus.Level   = paMob.BaseScore.Level;
            mob.BaseStatus.Defense = paMob.BaseScore.Defesa;
            mob.BaseStatus.Attack  = paMob.BaseScore.Ataque;

            mob.BaseStatus.Merchant  = paMob.BaseScore.Merchante;
            mob.BaseStatus.MobSpeed  = paMob.BaseScore.Speed;
            mob.BaseStatus.Direction = paMob.BaseScore.Direcao;
            mob.BaseStatus.ChaosRate = paMob.BaseScore.ChaosRate;

            mob.BaseStatus.MaxHP = paMob.BaseScore.MaxHP;
            mob.BaseStatus.MaxMP = paMob.BaseScore.MaxMP;
            mob.BaseStatus.CurHP = paMob.BaseScore.HP;
            mob.BaseStatus.CurMP = paMob.BaseScore.MP;

            mob.BaseStatus.Str = paMob.BaseScore.Str;
            mob.BaseStatus.Int = paMob.BaseScore.Int;
            mob.BaseStatus.Dex = paMob.BaseScore.Dex;
            mob.BaseStatus.Con = paMob.BaseScore.Con;



            ///
            mob.GameStatus.Level   = paMob.CurrentScore.Level;
            mob.GameStatus.Defense = paMob.CurrentScore.Defesa;
            mob.GameStatus.Attack  = paMob.CurrentScore.Ataque;

            mob.GameStatus.Merchant  = paMob.CurrentScore.Merchante;
            mob.GameStatus.MobSpeed  = paMob.CurrentScore.Speed;
            mob.GameStatus.Direction = paMob.CurrentScore.Direcao;
            mob.GameStatus.ChaosRate = paMob.CurrentScore.ChaosRate;

            mob.GameStatus.MaxHP = paMob.CurrentScore.MaxHP;
            mob.GameStatus.MaxMP = paMob.CurrentScore.MaxMP;
            mob.GameStatus.CurHP = paMob.CurrentScore.HP;
            mob.GameStatus.CurMP = paMob.CurrentScore.MP;

            mob.GameStatus.Str = paMob.CurrentScore.Str;
            mob.GameStatus.Int = paMob.CurrentScore.Int;
            mob.GameStatus.Dex = paMob.CurrentScore.Dex;
            mob.GameStatus.Con = paMob.CurrentScore.Con;

            mob.Affects = new SAffect[32];

            for (int i = 0; i < paMob.Equip.Length; i++)
            {
                mob.Equip[i].Id = paMob.Equip[i].sIndex;
                mob.Equip[i].Ef = new SItemEF[3];
                for (int a = 0; a < paMob.Equip[i].sEffect.Length; a++)
                {
                    mob.Equip[i].Ef[a].Type  = paMob.Equip[i].sEffect[a].cEfeito;
                    mob.Equip[i].Ef[a].Value = paMob.Equip[i].sEffect[a].cValue;
                }
            }

            try
            {
                for (int i = 0; i < 60; i++)
                {
                    mob.Inventory[i].Id = paMob.Carry[i].sIndex;
                    mob.Inventory[i].Ef = new SItemEF[3];
                    for (int a = 0; a < paMob.Carry[i].sEffect.Length; a++)
                    {
                        mob.Inventory[i].Ef[a].Type  = paMob.Carry[i].sEffect[a].cEfeito;
                        mob.Inventory[i].Ef[a].Value = paMob.Carry[i].sEffect[a].cValue;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);;
            }


            return(mob);
        }
        public void ExecutaAndarMob()
        {
            while (this.Active)
            {
                for (int i = 0; i < Client.Count(); i++)
                {
                    for (int a = 0; a < Client[i].MobView.Where(b => b.Mob.Merchant == 0).Count(); a++)
                    {
                        //if que decide se o mob anda ou não (50% de chance de andar)
                        if (_rand.Next(0, 100) > 50)
                        {
                            SMobList mob = Client[i].MobView[a];
                            int      x, y;

                            //if para evitar erro do random
                            if (mob.PositionInicial.X < mob.PositionFinal.X)
                            {
                                x = _rand.Next(mob.PositionInicial.X, mob.PositionFinal.X);
                            }
                            else
                            {
                                x = _rand.Next(mob.PositionFinal.X, mob.PositionInicial.X);
                            }

                            if (mob.PositionInicial.Y < mob.PositionFinal.Y)
                            {
                                y = _rand.Next(mob.PositionInicial.Y, mob.PositionFinal.Y);
                            }
                            else
                            {
                                y = _rand.Next(mob.PositionFinal.Y, mob.PositionInicial.Y);
                            }


                            // Prepara o pacote de andar dos mobs / npc
                            P_36C p36c = P_36C.New(mob.Mob.ClientId, mob.PositionInicial, SPosition.New(x, y), 0, mob.Speed, new byte[12]);

                            // Envia o pacote de andar
                            Client[i].Send(p36c);
                        }
                    }
                }
                // Mob / Npc anda a cada 5s
                Thread.Sleep(5000);
            }
        }
Exemple #15
0
        // Controlador
        public static void Controller(Client Client, P_36C Rcv)
        {
            // Guarda a posição original do personagem
            Coord cur = Client.Map.GetCoord(Client.Character.Mob.LastPosition);

            // Guarda a posição de destino
            Coord dst = Client.Map.GetCoord(Rcv.Dst);

            // Verifica se as posições de origem e destino são a mesma
            if (Client.Character.Mob.LastPosition == Rcv.Dst)
            {
                return;
            }
            // Verifica se o caminho de destino está vaziu
            else if (!dst.CanWalk)
            {
                // Manda cliente de volta pra posição inicial
                Log.Error("Impossivel de andar");
                return;
            }
            //// Verifica se a posição de origem está na lista de posições do personagem
            //else if ( !Client.Character.Positions.Contains ( Rcv.Src ) ) {
            //	// Manda cliente de volta pra posição inicial
            //	Log.Error ( 1 );
            //	Sendback ( );
            //	return;
            //}

            // Valida o caminho pelo HeightMap
            SPosition        position  = Rcv.Src;
            List <SPosition> positions = new List <SPosition>()
            {
                position
            };

            int cHeight = Config.HeightMap(position), oHeight = cHeight;

            foreach (byte direction in Rcv.Directions)
            {
                if (direction == 0)
                {
                    break;// Chegou ao fim
                }
                switch (direction)
                {
                case 49: position.X--; position.Y--; break;                  // -X -Y

                case 50: position.Y--; break;                                // -Y

                case 51: position.X++; position.Y--; break;                  // +X -Y

                case 52: position.X--; break;                                // -X

                case 54: position.X++; break;                                // +X

                case 55: position.X--; position.Y++; break;                  // -X +Y

                case 56: position.Y++; break;                                // +Y

                case 57: position.X++; position.Y++; break;                  // +X +Y

                default: Client.Close($"Unk direction: {direction}"); break; // Coordenada inválida
                }

                // Guarda a altura do mapa de destino
                oHeight = Config.HeightMap(position);

                // Verifica se a mudança de altura é maior que 9
                if (Math.Abs(cHeight - oHeight) > 9)
                {
                    // Manda cliente de volta pra posição inicial
                    Log.Error(2);
                    Sendback();
                    return;
                }

                // Atualiza a altura do mapa atual
                cHeight = oHeight;

                // Adiciona a posição a lista
                positions.Add(position);
            }

            // Atualiza a lista de posições do personagem
            Client.Character.Positions.Clear();
            Client.Character.Positions.AddRange(positions);

            // Atualiza a posição do personagem
            Client.Character.Mob.LastPosition = Rcv.Dst;

            // Atualiza a posição no mapa
            cur.Client = null;
            dst.Client = Client;

            // Pacote do andar
            P_36C p36C = New(Client.ClientId, Rcv.Src, Rcv.Dst, Rcv.Type, Rcv.Speed, Rcv.Directions);

            // Atualiza os arredores
            Functions.UpdateFromaWorld(Client, p36C);

            // Funções ajudantes
            void Sendback()
            {
                Client.Send(New(Client.ClientId, SPosition.New(cur), SPosition.New(cur), 1, 0, null));
            }
        }
        public static void controller(Client client, P_28B p28b)
        {
            SMob npc = Config.MobList.Where(a => a.Mob.ClientId == p28b.Index).FirstOrDefault().Mob;

            switch (npc.Merchant)
            {
            case 4:     // Dragon Dourado
            {
                break;
            }

            case 10:     // Amuleto Mistico
            {
                break;
            }

            case 11:     // Exploit Leader | testar
            {
                break;
            }

            case 12:     // Jeffi
            {
                break;
            }

            case 13:     // Shama
            {
                break;
            }

            case 14:     // Rei Azul
            {
                break;
            }

            case 15:     // Rei Vermelho
            {
                break;
            }

            case 19:     // Composicao Sephi
            {
                break;
            }

            case 26:     // Rei
            {
                break;
            }

            case 30:     // Zakum
            {
                break;
            }

            case 31:     // Mestre Habilidade
            {
                break;
            }

            case 58:     // Mount Master
            {
                break;
            }

            case 62:     // Dragon Arzan
            {
                break;
            }

            case 68:     // God Government
            {
                break;
            }

            case 72:     // Uxamll
            {
                break;
            }

            case 74:     // Kibita
            {
                break;
            }

            case 76:     // Urnammu
            {
                break;
            }

            case 78:     // Black Oracle
            {
                break;
            }

            case 100:     // Quest Mortal
            {
                int npcGrade = Config.Itemlist[npc.Equip[0].Id].Grade;
                switch (npcGrade)
                {
                case 0:             // Coveiro
                {
                    int levelAtual = client.Character.Mob.GameStatus.Level;
                    if (levelAtual < 39 || levelAtual >= 115)
                    {
                        client.Send(P_333.New(p28b.Index, "Nível Insuficiente. Isto não pode ser utilizado."));
                        break;
                    }

                    // Verifica se existe o ticket de entrada
                    if (client.Character.Mob.Inventory.Where(a => a.Id == 4038).Any())
                    {
                        int slot = 0;
                        // Procura em qual slot o ticket esta
                        for (int i = 0; i < client.Character.Mob.Inventory.Length; i++)
                        {
                            if (client.Character.Mob.Inventory[i].Id == 4038)
                            {
                                break;
                            }
                            else
                            {
                                slot += 1;
                            }
                        }

                        // Remove o ticket
                        client.Character.Mob.RemoveItemToCharacter(client, TypeSlot.Inventory, slot);

                        // Envia o client para a quest
                        P_290.Teleport(client, SPosition.New(new Random().Next(2395, 2398), new Random().Next(2102, 2105)));
                    }
                    else
                    {
                        client.Send(P_333.New(p28b.Index, $"Você deve trazer o item {Config.Itemlist[4038].Name}."));
                    }

                    break;
                }

                case 1:             // Jardineiro
                {
                    int levelAtual = client.Character.Mob.GameStatus.Level;
                    if (levelAtual < 115 || levelAtual >= 190)
                    {
                        client.Send(P_333.New(p28b.Index, "Nível Insuficiente. Isto não pode ser utilizado."));
                        break;
                    }

                    // Verifica se existe o ticket de entrada
                    if (client.Character.Mob.Inventory.Where(a => a.Id == 4039).Any())
                    {
                        int slot = 0;
                        // Procura em qual slot o ticket esta
                        for (int i = 0; i < client.Character.Mob.Inventory.Length; i++)
                        {
                            if (client.Character.Mob.Inventory[i].Id == 4039)
                            {
                                break;
                            }
                            else
                            {
                                slot += 1;
                            }
                        }

                        // Remove o ticket
                        client.Character.Mob.RemoveItemToCharacter(client, TypeSlot.Inventory, slot);

                        // Envia o client para a quest
                        P_290.Teleport(client, SPosition.New(new Random().Next(2232, 2335), new Random().Next(1712, 1716)));
                    }
                    else
                    {
                        client.Send(P_333.New(p28b.Index, $"Você deve trazer o item {Config.Itemlist[4039].Name}."));
                    }
                    break;
                }

                case 2:             // Kaizen
                {
                    int levelAtual = client.Character.Mob.GameStatus.Level;
                    if (levelAtual < 190 || levelAtual >= 265)
                    {
                        client.Send(P_333.New(p28b.Index, "Nível Insuficiente. Isto não pode ser utilizado."));
                        break;
                    }

                    // Verifica se existe o ticket de entrada
                    if (client.Character.Mob.Inventory.Where(a => a.Id == 4040).Any())
                    {
                        int slot = 0;
                        // Procura em qual slot o ticket esta
                        for (int i = 0; i < client.Character.Mob.Inventory.Length; i++)
                        {
                            if (client.Character.Mob.Inventory[i].Id == 4040)
                            {
                                break;
                            }
                            else
                            {
                                slot += 1;
                            }
                        }

                        // Remove o ticket
                        client.Character.Mob.RemoveItemToCharacter(client, TypeSlot.Inventory, slot);

                        // Envia o client para a quest
                        P_290.Teleport(client, SPosition.New(new Random().Next(462, 466), new Random().Next(3900, 3904)));
                    }
                    else
                    {
                        client.Send(P_333.New(p28b.Index, $"Você deve trazer o item {Config.Itemlist[4040].Name}."));
                    }
                    break;
                }

                case 3:             // Hidra
                {
                    int levelAtual = client.Character.Mob.GameStatus.Level;
                    if (levelAtual < 265 || levelAtual >= 320)
                    {
                        client.Send(P_333.New(p28b.Index, "Nível Insuficiente. Isto não pode ser utilizado."));
                        break;
                    }

                    // Verifica se existe o ticket de entrada
                    if (client.Character.Mob.Inventory.Where(a => a.Id == 4041).Any())
                    {
                        int slot = 0;
                        // Procura em qual slot o ticket esta
                        for (int i = 0; i < client.Character.Mob.Inventory.Length; i++)
                        {
                            if (client.Character.Mob.Inventory[i].Id == 4041)
                            {
                                break;
                            }
                            else
                            {
                                slot += 1;
                            }
                        }

                        // Remove o ticket
                        client.Character.Mob.RemoveItemToCharacter(client, TypeSlot.Inventory, slot);

                        // Envia o client para a quest
                        P_290.Teleport(client, SPosition.New(new Random().Next(666, 670), new Random().Next(3754, 3758)));
                    }
                    else
                    {
                        client.Send(P_333.New(p28b.Index, $"Você deve trazer o item {Config.Itemlist[4041].Name}."));
                    }
                    break;
                }

                case 4:             // Elfo
                {
                    int levelAtual = client.Character.Mob.GameStatus.Level;
                    if (levelAtual < 320 || levelAtual >= 350)
                    {
                        client.Send(P_333.New(p28b.Index, "Nível Insuficiente. Isto não pode ser utilizado."));
                        break;
                    }

                    // Verifica se existe o ticket de entrada
                    if (client.Character.Mob.Inventory.Where(a => a.Id == 4042).Any())
                    {
                        int slot = 0;
                        // Procura em qual slot o ticket esta
                        for (int i = 0; i < client.Character.Mob.Inventory.Length; i++)
                        {
                            if (client.Character.Mob.Inventory[i].Id == 4042)
                            {
                                break;
                            }
                            else
                            {
                                slot += 1;
                            }
                        }

                        // Remove o ticket
                        client.Character.Mob.RemoveItemToCharacter(client, TypeSlot.Inventory, slot);

                        // Envia o client para a quest
                        P_290.Teleport(client, SPosition.New(new Random().Next(1320, 1324), new Random().Next(4039, 4043)));
                    }
                    else
                    {
                        client.Send(P_333.New(p28b.Index, $"Você deve trazer o item {Config.Itemlist[4042].Name}."));
                    }
                    break;
                }

                case 5:             // Lider Aprendiz
                {
                    break;
                }

                case 7:             // Persen
                case 8:
                case 9:
                {
                    break;
                }

                case 13:             // Capa do Reino
                {
                    break;
                }

                case 14:             // Capa verde
                {
                    break;
                }

                case 15:             // Molar Gargula
                {
                    break;
                }

                case 16:             // Treinador quest newbie 1
                {
                    break;
                }

                case 17:             // Treinador quest newbie 2
                {
                    break;
                }

                case 18:             // Treinador quest newbie 3
                {
                    break;
                }

                case 19:             // Treinador quest Newbie 4
                {
                    break;
                }

                case 22:             // Sobrevivente
                {
                    break;
                }

                case 30:             // Guarda Real
                {
                    break;
                }
                }
                break;
            }

            case 120:     // Carbuncle buff
            {
                if (client.Character.Mob.GameStatus.Level >= 100)
                {
                    client.Send(P_333.New(p28b.Index, "Nível Insuficiente. Isto não pode ser utilizado."));
                    break;
                }

                int id = 5040;
                //buffa o cliente
                for (int i = 0; i < 4; i++)
                {
                    if (i == 1)
                    {
                        id++;
                    }

                    id++;

                    SSkillList skil = Config.SkilList.Where(a => a.IdSkill == id).FirstOrDefault();
                    client.Character.Mob.Affects[Functions.GetSlotAffect(client, id)].Index = (byte)skil.TipoDeEfeito;
                    client.Character.Mob.Affects[Functions.GetSlotAffect(client, id)].Value = (byte)skil.ValorDoEfeito;
                    client.Character.Mob.Affects[Functions.GetSlotAffect(client, id)].Time  = skil.TempoDoEfeito;
                }

                Functions.GetCurrentScore(client, false);
                client.Send(P_333.New(p28b.Index, $"Sente-se mais forte agora {client.Character.Mob.Name}?"));
                break;
            }
            }
        }
Exemple #17
0
        public byte [] Unk1;            // 16 a 35	= 20

        // Controlador
        public static void Controller(Client client, P_213 rcv)
        {
            if (rcv.Slot < 0 || rcv.Slot > 3)
            {
                client.Close( );
            }
            else
            {
                // Retorna o personagem selecionado
                Character character = client.Account.Characters [rcv.Slot];

                if (character == null)
                {
                    client.Close( );
                }
                else
                {
                    // Retorna um ClientId vaziu
                    short ClientId = client.Channel.GetClientId( );

                    if (ClientId < Config.Values.Clients.MinCid)
                    {
                        client.Send(P_101.New("Parece que este canal está lotado. Tente novamente!"));
                    }
                    else
                    {
                        // Retorna a posição de respawn
                        Coord coord = Functions.GetFreeRespawnCoord(client.Channel.Map, character);

                        if (coord == null)
                        {
                            client.Send(P_101.New("Parece que este o mapa está lotado. Tente novamente!"));
                        }
                        else
                        {
                            // Define o ClientId do cliente
                            client.ClientId = character.Mob.ClientId = ClientId;

                            // Define a posição do mob
                            character.Mob.LastPosition = SPosition.New(coord);

                            // Adiciona posição a lista de posições
                            character.Positions.Clear( );
                            character.Positions.Add(character.Mob.LastPosition);

                            // Define o cliente na coordenada
                            coord.Client = client;

                            // Envia o pacote de entrar no mundo
                            client.Send(P_114.New(character));

                            // Prepara o pacote de visão do cliente
                            P_364 p364 = P_364.New(character, EnterVision.LogIn);

                            // Envia o pacote de visão do cliente pro cliente
                            client.Send(p364);

                            // Altera o status do cliente
                            client.Status = ClientStatus.Game;

                            // Define o mapa, character do cliente e inicia o Surround
                            client.Map       = client.Channel.Map;
                            client.Character = character;
                            client.Surround  = new Surround(client);

                            // Atualiza os arredores e envia a visão para todos e para o cliente
                            client.Surround.UpdateSurrounds(null, entered => {
                                entered.ForEach(a => {
                                    switch (a)
                                    {
                                    case Client client2: {
                                        client.Send(P_364.New(client2.Character, EnterVision.Normal));
                                        client2.Send(p364);
                                        break;
                                    }
                                    }
                                });
                            }, null);

                            // Envia uma mensagem pro cliente
                            client.Send(P_101.New("Seja bem-vindo ao mundo do Open WYD Server!"));
                        }
                    }
                }
            }
        }