public static bool Handle(Entities.GameClient client, UseSpellPacket usespell) { if (!client.Equipments.Contains(Enums.ItemLocation.Steed)) { return(false); } if (client.ContainsFlag1(Enums.Effect1.Riding)) { client.RemoveFlag1(Enums.Effect1.Riding); } else if (client.Stamina < 100) { return(false); } else { client.AddStatusEffect1(Enums.Effect1.Riding); } using (var vigor = new Packets.SteedVigorPacket()) { vigor.Type = 2; vigor.Amount = 9001; client.Send(vigor); } usespell.AddTarget(client.EntityUID, 0); return(true); }
/// <summary> /// Gets the physical damage (PVP). /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="attacked">The attacked.</param> /// <returns>Returns the damage.</returns> private static double GetPhysicalDamage_PVP(Entities.GameClient attacker, Entities.GameClient attacked) { double damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(attacker.MinAttack, attacker.MaxAttack); damage *= 1 + attacker.DragonGemPercentage; damage -= attacked.Defense; if (attacked.ContainsFlag1(Enums.Effect1.Shield)) { damage *= 0.5; } if (attacker.ContainsFlag1(Enums.Effect1.Stig)) { damage *= 1.75; } double damage_perc = damage; damage_perc = (damage / 100) * attacked.TortoiseGemPercentage; damage -= damage_perc; damage_perc = (damage / 100) * attacked.Bless; damage -= damage_perc; return(damage); }
/// <summary> /// Gets the physical magic damage. (MVP) /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="attacked">The attacked.</param> /// <param name="spell">The spell.</param> /// <returns>Returns the damage.</returns> private static double GetPhysicalMagicDamage_MVP(Entities.Monster attacker, Entities.GameClient attacked, Data.Spell spell) { double damage = (double)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)attacker.MaxAttack, (int)attacker.MaxAttack * 2); damage -= attacked.Defense; damage *= 0.65; // penetration extra damage if (spell.SpellID == 1290 && damage > 0) { double hunperc = (double)((damage / 100) * 26.6); damage += (hunperc * spell.Level); } if (attacked.ContainsFlag1(Enums.Effect1.Shield)) { damage *= 0.5; } // damage += spell.Power; //damage *= 1 + attacker.PhoenixGemPercentage; // damage -= attacked.Defense; // double damage_perc = damage; // damage_perc = (damage / 100) * attacked.TortoiseGemPercentage; // damage -= damage_perc; // damage_perc = (damage / 100) * attacked.Bless; // damage -= damage_perc; return(damage); }
/// <summary> /// Gets the ranged damage. (PVP) /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="attacked">The attacked.</param> /// <returns>Returns the damage.</returns> private static double GetRangedDamage_PVM(Entities.GameClient attacker, Entities.Monster attacked) { double damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(attacker.MinAttack, attacker.MaxAttack); damage *= 1 - (attacked.Dodge * 0.01); damage *= 0.45; if (attacker.ContainsFlag1(Enums.Effect1.Stig)) { damage *= 1.75; } damage *= 1 + attacker.DragonGemPercentage; //double damage_perc = damage; //damage_perc = (damage / 100) * attacked.TortoiseGemPercentage; //damage -= damage_perc; //damage_perc = (damage / 100) * attacked.Bless; //damage -= damage_perc; return(damage); }
/// <summary> /// Handling the Jump action from GeneralDataPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="General">The GeneralDataPacket.</param> public static void Handle(Entities.GameClient client, GeneralDataPacket General) { if (!client.Alive) { return; } if (client.ContainsFlag1(Enums.Effect1.IceBlock)) { return; } if (client.Booth != null) { client.Booth.CancelBooth(); client.Pullback(); } client.Action = Enums.ActionType.None; client.AttackPacket = null; ushort JumpX = General.Data1Low; ushort JumpY = General.Data1High; if (Core.Screen.GetDistance(client.X, client.Y, JumpX, JumpY) > 28) { client.Pullback(); return; } if (!client.Map.ValidCoord(JumpX, JumpY)) { client.Pullback(); return; } /*DateTime time = new ProjectX_V3_Lib.Time.SystemTime(General.Timestamp); * if (client.LastMovement > time) * { * client.Pullback(); // speedhack * return; * }*/ if (!(DateTime.Now >= client.LastMovement.AddMilliseconds(400)) && client.LastMoveJump) { client.Pullback(); // speedhack return; } if (client.Battle != null) { if (!client.Battle.EnterArea(client)) { client.Pullback(); return; } else if (!client.Battle.LeaveArea(client)) { client.Pullback(); return; } } if (Calculations.BasicCalculations.ChanceSuccess(50)) { client.Stamina += 7; } client.LastMoveJump = true; client.LastMovement = DateTime.Now; client.LastX = client.X; client.LastY = client.Y; client.X = JumpX; client.Y = JumpY; client.SendToScreen(General, true); Data.AdvancedSkill.SkillInArea(client, client.X, client.Y); }
/// <summary> /// Handles the movement packet. /// </summary> /// <param name="client">The client.</param> /// <param name="packet">The packet.</param> public static void Handle(Entities.GameClient client, DataPacket packet) { if (client.ContainsFlag1(Enums.Effect1.IceBlock)) { return; } client.Action = Enums.ActionType.None; client.AttackPacket = null; client.LastMoveJump = false; using (var move = new MovementPacket(packet)) { if (move.EntityUID != client.EntityUID) { return; } int NewX = 0, NewY = 0; int NewDir = 0; switch (move.WalkMode) { case Enums.WalkMode.Run: case Enums.WalkMode.Walk: { NewDir = (int)move.Direction % 8; NewX = client.X + DeltaX[NewDir]; NewY = client.Y + DeltaY[NewDir]; break; } case Enums.WalkMode.Mount: { NewDir = (int)move.Direction % 24; NewX = client.X + DeltaMountX[NewDir]; NewY = client.Y + DeltaMountY[NewDir]; break; } } if (client.Map.ValidCoord(NewX, NewY)) { client.LastX = client.X; client.LastY = client.LastY; client.LastMovement = DateTime.Now; client.X = (ushort)NewX; client.Y = (ushort)NewY; client.Direction = (byte)NewDir; client.SendToScreen(move, true); if (client.Battle != null) { if (!client.Battle.EnterArea(client)) { client.X = client.LastX; client.Y = client.LastY; client.Pullback(); return; } else if (!client.Battle.LeaveArea(client)) { client.X = client.LastX; client.Y = client.LastY; client.Pullback(); return; } } Data.AdvancedSkill.SkillInArea(client, client.X, client.Y); } } }
/// <summary> /// Handling the combat of the interact packet. /// </summary> /// <param name="client">The client.</param> /// <param name="interact">The interact packet.</param> public static void Handle(Entities.GameClient client, InteractionPacket interact) { if (interact == null) { return; } if (!client.Alive) { return; } if (client.Paralyzed) { return; } if (!client.CanAttack) { return; } if (!(DateTime.Now >= client.LoginProtection.AddSeconds(10))) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST)) client.Send(fmsg); return; } if (!(DateTime.Now >= client.ReviveProtection.AddSeconds(5))) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST)) client.Send(fmsg); return; } if (!(DateTime.Now >= client.LastAttack.AddMilliseconds(Core.TimeIntervals.AttackInterval)) && client.AttackPacket == null) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST)) client.Send(fmsg); return; } if (client.Battle != null) { if (!client.Battle.HandleBeginAttack(client)) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST)) client.Send(fmsg); return; } } client.LastAttack = DateTime.Now; //client.AutoAttacking = false; switch (interact.Action) { case Enums.InteractAction.MagicAttack: { #region TemporaryDecryption if (!interact.UnPacked) { interact.UnPacked = true; byte[] packet = interact.Copy(); ushort SkillId = Convert.ToUInt16(((long)packet[24] & 0xFF) | (((long)packet[25] & 0xFF) << 8)); SkillId ^= (ushort)0x915d; SkillId ^= (ushort)client.EntityUID; SkillId = (ushort)(SkillId << 0x3 | SkillId >> 0xd); SkillId -= 0xeb42; uint Target = ((uint)packet[12] & 0xFF) | (((uint)packet[13] & 0xFF) << 8) | (((uint)packet[14] & 0xFF) << 16) | (((uint)packet[15] & 0xFF) << 24); Target = ((((Target & 0xffffe000) >> 13) | ((Target & 0x1fff) << 19)) ^ 0x5F2D2463 ^ client.EntityUID) - 0x746F4AE6; ushort TargetX = 0; ushort TargetY = 0; long xx = (packet[16] & 0xFF) | ((packet[17] & 0xFF) << 8); long yy = (packet[18] & 0xFF) | ((packet[19] & 0xFF) << 8); xx = xx ^ (client.EntityUID & 0xffff) ^ 0x2ed6; xx = ((xx << 1) | ((xx & 0x8000) >> 15)) & 0xffff; xx |= 0xffff0000; xx -= 0xffff22ee; yy = yy ^ (client.EntityUID & 0xffff) ^ 0xb99b; yy = ((yy << 5) | ((yy & 0xF800) >> 11)) & 0xffff; yy |= 0xffff0000; yy -= 0xffff8922; TargetX = Convert.ToUInt16(xx); TargetY = Convert.ToUInt16(yy); interact.TargetUID = Target; interact.MagicType = SkillId; interact.X = TargetX; interact.Y = TargetY; } #endregion if (client.ContainsFlag1(Enums.Effect1.Riding) && interact.MagicType != 7001) { if (client.Stamina >= 100) { client.Stamina = 0; client.RemoveFlag1(Enums.Effect1.Riding); } return; } Magic.Handle(client, interact); break; } case Enums.InteractAction.Attack: if (client.ContainsFlag1(Enums.Effect1.Riding)) { if (client.Stamina >= 100) { client.Stamina = 0; client.RemoveFlag1(Enums.Effect1.Riding); } return; } Physical.Handle(client, interact); break; case Enums.InteractAction.Shoot: if (client.ContainsFlag1(Enums.Effect1.Riding)) { if (client.Stamina >= 100) { client.Stamina = 0; client.RemoveFlag1(Enums.Effect1.Riding); } return; } Ranged.Handle(client, interact); break; } }
/// <summary> /// Processing damage. /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="attacked">The attacked.</param> /// <param name="damage">The damage.</param> public static void ProcessDamage(Entities.IEntity attacker, Entities.IEntity attacked, ref uint damage, bool kill_damage = true) { // Removed dura, bugged atm. the dura works, although client doesn't update proper etc. CBA to fix it as I never intended to use it // Although you can go ahead and fix it yourself if you want, I may do it if I ever feel like it // The dura lose is commented out below. #region ATTACKER : GAMECLIENT if (attacker is Entities.GameClient) { Entities.GameClient attackerclient = attacker as Entities.GameClient; attackerclient.LoseAttackDura(damage); #region ATTACKED : GAMECLIENT if (attacked is Entities.GameClient) { Entities.GameClient attackedclient = attacked as Entities.GameClient; // tournament check, damage = 1 + return if (attackerclient.Battle != null) { if (!attackerclient.Battle.HandleAttack(attackerclient, attackedclient, ref damage)) { damage = 0; return; } } else { if (attacked.Map.GotKillCons() && !attackedclient.ContainsFlag1(Enums.Effect1.BlueName) && !attackedclient.ContainsFlag1(Enums.Effect1.RedName) && !attackedclient.ContainsFlag1(Enums.Effect1.BlackName)) { attackerclient.AddStatusEffect1(Enums.Effect1.BlueName, 20000); } attackedclient.LoseDefenseDura(damage); } } #endregion #region ATTACKED : MONSTER if (attacked is Entities.Monster) { Entities.Monster attackedmob = attacked as Entities.Monster; if (((byte)attackedmob.Behaviour) >= 3) { attackerclient.AddStatusEffect1(Enums.Effect1.BlueName, 20000); } if (damage > 0) { ulong exp = (ulong)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage); if (attacked.Level > (attacker.Level + 10)) { exp *= 2; } else if (attacker.Level > (attacked.Level + 10)) { exp = (ulong)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(1, (int)attackedmob.Level); } attackerclient.AddExp(exp); } } #endregion //if (Calculations.Battle.LoseDuraAttak()) //attackerclient.LoseAttackDura(damage); } #endregion #region ATTACKER : MONSTER #region ATTACKED : GAMECLIENT if (attacked is Entities.GameClient) { Entities.GameClient attackedclient = attacked as Entities.GameClient; attackedclient.LoseDefenseDura(damage); } #endregion #endregion if (kill_damage) { HitDamage(attacker, attacked, damage); } }
/// <summary> /// Equips a new item. /// </summary> /// <param name="item">The item to equip.</param> /// <param name="pos">The position to equip the item at.</param> /// <param name="unequip">Boolean defining whether to unequip an existing item at the position.</param> /// <returns>Returns true if the item was equipped.</returns> public bool Equip(ItemInfo item, Enums.ItemLocation pos, bool unequip = true, bool force_equip = false) { if (!force_equip) { #region Sex check if (item.Sex == Enums.Sex.Female && Owner.Sex != Enums.Sex.Female) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.ITEM_FEMALE)) Owner.Send(fmsg); return(false); } #endregion #region Job Check // if (item.Profession != Enums.Class.Unknown && Core.Kernel.GetBaseClass(item.Profession) != Enums.Class.Unknown) // { // Enums.Class promoteclass = Core.Kernel.GetBaseClass(Owner.Class); // if (promoteclass != Core.Kernel.GetBaseClass(item.Profession)) // { // using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, string.Format(Core.MessageConst.ITEM_JOB_INVALID, Core.Kernel.GetBaseClass(item.Profession).ToString()))) // Owner.Send(fmsg); // // return false; // } // else if (!Core.Kernel.AboveFirstPromotion(Owner.Class)) // { // using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, string.Format(Core.MessageConst.ITEM_JOB_INVALID, Core.Kernel.GetBaseClass(item.Profession).ToString()))) // Owner.Send(fmsg); // // return false; // } // } #endregion #region Level Check if (Owner.Level < item.RequiredLevel) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.LEVEL_LOW)) Owner.Send(fmsg); return(false); } #endregion #region Stats Check if (Owner.Strength < item.RequiredStrength || Owner.Agility < item.RequiredAgility || Owner.Vitality < item.RequiredVitality || Owner.Spirit < item.RequiredSpirit) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.STATS_LOW)) Owner.Send(fmsg); return(false); } #endregion #region Prof Check // if (Owner.Level < item.RequiredProf) // { // using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.LEVEL_LOW)) // Owner.Send(fmsg); // // return false; // } #endregion } if (!force_equip) { switch (pos) { #region Head case Enums.ItemLocation.Head: { if (item.ItemType != Enums.ItemType.Head) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Necklace case Enums.ItemLocation.Necklace: { if (item.ItemType != Enums.ItemType.Necklace) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Ring case Enums.ItemLocation.Ring: { if (item.ItemType != Enums.ItemType.Ring) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Armor case Enums.ItemLocation.Armor: { if (item.ItemType != Enums.ItemType.Armor) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Boots case Enums.ItemLocation.Boots: { if (item.ItemType != Enums.ItemType.Boots) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Bottle case Enums.ItemLocation.Bottle: { if (item.ItemType != Enums.ItemType.Bottle) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Garment case Enums.ItemLocation.Garment: { if (MaskedGarment != null) { return(false); } if (item.ItemType != Enums.ItemType.Garment) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Steed case Enums.ItemLocation.Steed: { if (Owner.ContainsFlag1(Enums.Effect1.Riding)) { return(false); } if (item.ItemType != Enums.ItemType.Steed) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region SteedArmor case Enums.ItemLocation.SteedArmor: { if (Owner.ContainsFlag1(Enums.Effect1.Riding)) { return(false); } if (item.ItemType != Enums.ItemType.SteedArmor) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } break; } #endregion #region Fan case Enums.ItemLocation.Fan: { return(false); /*if (item.ItemType != Enums.ItemType.Fan) * { * using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) * Owner.Send(fmsg); * return false; * } * break;*/ } #endregion #region Tower case Enums.ItemLocation.Tower: { return(false); /*if (item.ItemType != Enums.ItemType.Tower) * { * using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) * Owner.Send(fmsg); * return false; * } * break;*/ } #endregion #region Right case Enums.ItemLocation.WeaponR: { if (MaskedRightHand != null) { return(false); } if (item.ItemType != Enums.ItemType.OneHand && item.ItemType != Enums.ItemType.TwoHand && item.ItemType != Enums.ItemType.Bow) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } if (Contains(Enums.ItemLocation.WeaponL) && item.ItemType == Enums.ItemType.TwoHand) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.TWO_HAND_EQUIP_FAIL)) Owner.Send(fmsg); return(false); } break; } #endregion #region Left case Enums.ItemLocation.WeaponL: { if (MaskedLeftHand != null) { return(false); } if (item.ItemType != Enums.ItemType.OneHand && item.ItemType != Enums.ItemType.Shield && item.ItemType != Enums.ItemType.Arrow) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } if (item.ItemType == Enums.ItemType.Shield || item.ItemType == Enums.ItemType.Arrow) { if (!Contains(Enums.ItemLocation.WeaponR)) { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE)) Owner.Send(fmsg); return(false); } } if (!Contains(Enums.ItemLocation.WeaponR) && item.ItemType != Enums.ItemType.Shield && item.ItemType != Enums.ItemType.Arrow) { pos = Enums.ItemLocation.WeaponR; } break; } #endregion #region default default: { using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_POS)) Owner.Send(fmsg); return(false); } #endregion } } if (Contains(pos)) { if (unequip) { if (!Unequip(pos)) { return(false); } } else if (!force_equip) { ItemInfo ritem; if (!EquipmentItems.TryRemove(pos, out ritem)) { return(false); } } } item.Location = pos; if (Owner.Inventory.ContainsByUID(item.UID) && !force_equip) { if (Owner.Inventory.RemoveItemByUID(item.UID) != null) { item.SendPacket(Owner, 1); if (EquipmentItems.TryAdd(pos, item)) { if (Owner.LoggedIn) { Database.CharacterDatabase.SaveEquipment(Owner, item, pos); Owner.BaseEntity.CalculateBaseStats(); using (var equippack = new Packets.ItemPacket()) { equippack.UID = item.UID; equippack.Action = Enums.ItemAction.Equip; equippack.Data1Low = (ushort)pos; Owner.Send(equippack); } SendGears(); } return(true); } } } else if (!force_equip) { item.SendPacket(Owner, 1); if (EquipmentItems.TryAdd(pos, item)) { if (Owner.LoggedIn) { Database.CharacterDatabase.SaveEquipment(Owner, item, pos); Owner.BaseEntity.CalculateBaseStats(); using (var equippack = new Packets.ItemPacket()) { equippack.UID = item.UID; equippack.Action = Enums.ItemAction.Equip; equippack.Data1Low = (ushort)pos; Owner.Send(equippack); } SendGears(); } return(true); } } else { item.SendPacket(Owner, 1); if (Owner.LoggedIn) { Database.CharacterDatabase.SaveEquipment(Owner, item, pos); Owner.BaseEntity.CalculateBaseStats(); using (var equippack = new Packets.ItemPacket()) { equippack.UID = item.UID; equippack.Action = Enums.ItemAction.Equip; equippack.Data1Low = (ushort)pos; Owner.Send(equippack); } SendGears(); } } return(false); }