public static P_39D New(Client client, P_39D p39D) { P_39D tmp = new P_39D { Header = SHeader.New(0x039D, Marshal.SizeOf <P_39D>(), client.ClientId), Client = p39D.Client, ClientID = p39D.ClientID, CurrentExp = client.Character.Mob.Exp, CurrentHp = client.Character.Mob.GameStatus.CurHP, CurrentMp = client.Character.Mob.GameStatus.CurMP, Damage = p39D.Damage, DoubleCritical = p39D.DoubleCritical, FlagLocal = p39D.FlagLocal, Mob = p39D.Mob, Motion = p39D.Motion, Progress = p39D.Progress, ReqMp = p39D.ReqMp, Rsv = p39D.Rsv, SkillIndex = p39D.SkillIndex, SkillParm = p39D.SkillParm, unk0 = p39D.unk0, Unk_1 = p39D.Unk_1, Unk_2 = p39D.Unk_2 }; return(tmp); }
private static void AddXpMob(Client client, ulong pAddXp) { client.Character.Mob.Exp += (ulong)(pAddXp * P_39D.GetBonusXp(client.Character)); //atualiza o xp do client client.Send(P_337.New(client)); //trata as mensagens de level, 1/4, 2/4 e 3/4 if (client.Character.Mob.BaseStatus.Level <= 399) { if (client.Character.Mob.Exp <= Rate.Exp_Mortal_Arch[client.Character.Mob.BaseStatus.Level]) { ulong vaLevelOrigem = client.Character.Mob.BaseStatus.Level == 0 ? 0 : Rate.Exp_Mortal_Arch[client.Character.Mob.BaseStatus.Level - 1]; ulong vaNextLevel = Rate.Exp_Mortal_Arch[client.Character.Mob.BaseStatus.Level]; ulong diferenca = vaNextLevel - vaLevelOrigem; ulong va1 = vaLevelOrigem + (diferenca / 4); ulong va2 = vaLevelOrigem + ((diferenca / 4) * 2); ulong va3 = vaLevelOrigem + ((diferenca / 4) * 3); ulong xpAtual = client.Character.Mob.Exp; if ((xpAtual >= va1 && xpAtual < va2)) { client.Send(P_101.New("1/4 BONUS")); client.Send(P_36A.New(client, Emotion.LevelUP, 3)); } else if ((xpAtual >= va2 && xpAtual <= va3)) { client.Send(P_101.New("2/4 BONUS")); client.Send(P_36A.New(client, Emotion.LevelUP, 3)); } else if ((xpAtual >= va3 && xpAtual <= vaNextLevel)) { client.Send(P_101.New("3/4 BONUS")); client.Send(P_36A.New(client, Emotion.LevelUP, 3)); } } else { Functions.GetCurrentScore(client, true); client.Send(P_101.New("++++++ Level Up ++++++")); client.Send(P_36A.New(client, Emotion.LevelUP, 3)); } } }
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)); } }