public byte[] AnctCode; // 2 a 7 = 6 public static P_36B New(Client client, short[] paSancCodEquip, byte[] paAnctCode) { P_36B tmp = new P_36B { Header = SHeader.New(0x036B, Marshal.SizeOf <P_36B>(), client.ClientId), SancCodEquip = paSancCodEquip, AnctCode = paAnctCode }; return(tmp); }
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)); } }