Пример #1
0
        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;
            }
            }
        }
Пример #2
0
        public static void controller(Client client, P_39D p39d)
        {
            int tamanho = 0;

            p39d.Damage.ToList().ForEach(a =>
            {
                tamanho += client.MobView.Where(b => a.MobId == b.Mob.ClientId).Count();
            });

            SMobList[] mobList = new SMobList[tamanho];
            for (int i = 0; i < p39d.Damage.Length - 1; i++)
            {
                SMobList dmg = client.MobView.Where(a => a.Mob.ClientId == p39d.Damage[i].MobId).FirstOrDefault();
                if (dmg.Mob.ClientId != 0)
                {
                    mobList[i] = dmg;
                    //remove os mob para que possa ser atualizado com o novo hp ja com o dano recebido depois
                    client.MobView.Remove(dmg);
                }
            }

            //check o modo que esta sendo atacado
            switch (p39d.SkillIndex)
            {
            case 151:   //Arco
            case -1:    //espada ou sem arma
            {
                for (int i = 0; i < mobList.Count(); i++)
                {
                    mobList[i].Mob.GameStatus.CurHP -= client.Character.Mob.GameStatus.Attack;
                    mobList[i].Mob.GameStatus.CurHP += mobList[i].Mob.GameStatus.Defense;

                    for (int a = 0; a < p39d.Damage.Length; a++)
                    {
                        if (p39d.Damage[a].MobId == mobList[i].Mob.ClientId)
                        {
                            p39d.Damage[a].Damage = client.Character.Mob.GameStatus.Attack - mobList[i].Mob.GameStatus.Defense;
                        }
                    }
                }
                break;
            }

            case 27:     // FM: skill Cura
            case 29:     // FM: skill Recuperar
            {
                SSkillList skill   = Config.SkilList[p39d.SkillIndex];
                int        kind    = p39d.SkillIndex % 24 / 8 + 1;
                int        special = client.Character.Mob.GameStatus.Master[kind];
                int        dam     = 0;

                if (p39d.SkillIndex == 27)
                {
                    dam = (special * 2) + skill.InstanceValue;
                }
                else
                {
                    dam = ((special * 3) / 2) + skill.InstanceValue;
                }

                client.Character.Mob.GameStatus.CurHP += dam;


                if (client.Character.Mob.GameStatus.CurHP > client.Character.Mob.GameStatus.MaxHP)
                {
                    client.Character.Mob.GameStatus.CurHP = client.Character.Mob.GameStatus.MaxHP;
                }

                p39d.Damage[0].Damage -= dam;
                break;
            }

            case 32:     // FM: skill Atake de fogo
            case 33:     // FM: skill Ralampago
            case 34:     // FM: skill Lanca de gelo
            case 35:     // FM: skill Meteoro
            case 36:     // FM: skill Nevasca
            case 38:     // FM: skill Fenix
            case 39:     // FM: skill 8
            {
                SSkillList skill = Config.SkilList[p39d.SkillIndex];
                client.Character.Mob.GameStatus.CurMP -= skill.ManaInicial;

                SStatus status = client.Character.Mob.GameStatus;

                int kind    = p39d.SkillIndex % 24 / 8 + 1;
                int special = status.Master[kind];

                switch (client.Character.Mob.ClassInfo)
                {
                case ClassInfo.TK:             // TK Magico
                {
                    client.Character.Mob.MagicIncrement = (short)(special + skill.InstanceValue + status.Master[0] + status.Level + (status.Int / 4) + (status.Int / 40));
                    break;
                }

                case ClassInfo.FM:             // testado
                {
                    client.Character.Mob.MagicIncrement = (short)((status.Int * 0.368) + (skill.InstanceValue / 4.2) + (status.Level / 2) + (1.15 * special));
                    break;
                }

                case ClassInfo.BM:
                {
                    client.Character.Mob.MagicIncrement = (short)((status.Int / 30) + (status.Int / 3) + skill.InstanceValue + 2 * special);
                    break;
                }

                case ClassInfo.HT:
                {
                    client.Character.Mob.MagicIncrement = (short)((3 * status.Master[0]) + (3 * status.Str) + special + skill.InstanceValue);
                    break;
                }
                }
                ;

                for (int i = 0; i < mobList.Count(); i++)
                {
                    mobList[i].Mob.GameStatus.CurHP -= client.Character.Mob.MagicIncrement;
                    mobList[i].Mob.GameStatus.CurHP += mobList[i].Mob.GameStatus.Defense;

                    for (int a = 0; a < p39d.Damage.Length; a++)
                    {
                        if (p39d.Damage[a].MobId == mobList[i].Mob.ClientId)
                        {
                            p39d.Damage[a].Damage = client.Character.Mob.MagicIncrement - mobList[i].Mob.GameStatus.Defense;
                        }
                    }
                }
                break;
            }

            case 37:     // FM: skill Trovao
            case 41:     // FM: skill Velocidade
            case 43:     // FM: skill Escudo Magico
            case 44:     // FM: skill Dano
            case 45:     // FM: skill Toque de Athena
            case 53:     // BM: skill Protecao Elemental
            {
                SSkillList skill = Config.SkilList[p39d.SkillIndex];
                client.Character.Mob.GameStatus.CurMP -= skill.ManaInicial;

                int index = Functions.GetSlotAffect(client, skill.IdSkill);

                client.Character.Mob.Affects[index].Index = (byte)skill.TipoDeEfeito;
                client.Character.Mob.Affects[index].Value = (short)skill.ValorDoEfeito;
                client.Character.Mob.Affects[index].Time  = skill.TempoDoEfeito;
                Functions.GetCurrentScore(client, false);
                break;
            }

            case 56:     // BM: skill Sumona Condor
            case 57:     // BM: skill Sumona javali Selvagem
            case 58:     // BM: skill Sumona Lobo Selvagem
            case 59:     // BM: skill Sumona Urso Selvagem
            case 60:     // BM: skill Sumona Grande Tigre
            case 61:     // BM  skill Sumona Gorila Gigante
            case 62:     // BM  skill Sumona Dragao
            case 63:     // BM  skill Sumona Succubus
            {
                SSkillList skill = Config.SkilList.ToArray()[p39d.SkillIndex - 1];;

                if (skill.InstanceValue >= 1 && skill.InstanceValue <= 50)
                {
                    int summons = 0;

                    if (skill.InstanceValue == 1 || skill.InstanceValue == 2)
                    {
                        summons = client.Character.Mob.GameStatus.Master[2] / 30;
                    }

                    else if (skill.InstanceValue == 3 || skill.InstanceValue == 4 || skill.InstanceValue == 5)
                    {
                        summons = client.Character.Mob.GameStatus.Master[2] / 40;
                    }

                    else if (skill.InstanceValue == 6 || skill.InstanceValue == 7)
                    {
                        summons = client.Character.Mob.GameStatus.Master[2] / 80;
                    }

                    else if (skill.InstanceValue == 8)
                    {
                        summons = 1;
                    }

                    //TODO: Falta fazer meio complexo isso
                    //client.Character.Mob.GenerateSummon(client, skill.InstanceValue - 1, summons);
                }
                break;
            }

            case 64:     // BM: skill Transformacao Lobisomem
            case 66:     // BM: skill Transformacao Urso
            case 68:     // BM: skill Transformacao Astaroth
            case 70:     // BM: skill Transformacao Titan
            case 71:     // BM: skill Transformacao Eden
            {
                SSkillList skill = Config.SkilList[p39d.SkillIndex];
                for (int i = 0; i < client.Character.Mob.Affects.Length; i++)
                {
                    if (client.Character.Mob.Affects[i].Index == 0 || client.Character.Mob.Affects[i].Index == (byte)Affect.Transformacao)
                    {
                        client.Character.Mob.Affects[i].Index = (byte)skill.TipoDeEfeito;
                        client.Character.Mob.Affects[i].Value = (short)skill.ValorDoEfeito;
                        client.Character.Mob.Affects[i].Time  = skill.TempoDoEfeito;
                        Functions.GetCurrentScore(client, false);
                        break;
                    }
                }

                short id = 0;
                switch (p39d.SkillIndex)
                {
                case 64:
                { id = 22; break; }

                case 66:
                { id = 23; break; }

                case 68:
                { id = 24; break; }

                case 70:
                { id = 25; break; }

                case 71:
                { id = 32; break; }
                }

                //troca a face do client para a skill sumonada
                client.Character.Mob.Equip[0].Id = id;

                short[] sanc = new short[16];
                byte[]  anc  = new byte[16];

                for (int i = 0; i < client.Character.Mob.Equip.Length; i++)
                {
                    //obtem os codigos de todos itens
                    sanc[i] = Functions.GetVisualItemCode(client.Character.Mob.Equip[i], i == 14 ? true : false);

                    //obtem os codigos Anct de todos os itens
                    anc[i] = Functions.GetVisualAnctCode(client.Character.Mob.Equip[i]);
                }

                //envia os efeitos
                client.Send(P_36B.New(client, sanc, anc));

                //atualiza o score do client
                Functions.GetCurrentScore(client, false);
                break;
            }
            }

            //Adiciona os mob a list de view com dano Hp reduzido
            client.MobView.AddRange(mobList);

            //envia o dano recebido para o mob
            client.Send(P_39D.New(client, p39d));

            //Varre a lista de mob para ver se alguem morreu
            for (int i = 0; i < mobList.Count(); i++)
            {
                if (mobList[i].Mob.GameStatus.CurHP < 0)
                {
                    //mata o mob e envia o drop se houver
                    P_338.controller(client, mobList[i].Mob.ClientId, mobList[i].Mob.Exp);

                    //trata o recebimento do xp
                    AddXpMob(client, mobList[i].Mob.Exp);
                }
            }

            //Cada atake checa se a experiencia estorou o limite e avanca o lvl a cada atake
            if (client.Character.Mob.Exp >= Rate.Exp_Mortal_Arch[client.Character.Mob.BaseStatus.Level])
            {
                client.Character.Mob.BaseStatus.Level += 1;
                Functions.GetCurrentScore(client, false);
                client.Send(P_36A.New(client, Emotion.LevelUP, 3));
            }
        }