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; } } }
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)); } }