From 9f7a2effb2cc335fe320c0d6b292b3dfcb9ed55a Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:05:24 +0000 Subject: [PATCH] Support for ExMagicSkillUseGround packet. --- .../gameserver/model/actor/Player.java | 11 +++++ .../gameserver/model/skill/SkillCaster.java | 17 +++++++ .../serverpackets/ExMagicSkillUseGround.java | 48 +++++++++++++++++++ .../network/serverpackets/MagicSkillUse.java | 45 ++++++++--------- .../gameserver/model/actor/Player.java | 11 +++++ .../gameserver/model/skill/SkillCaster.java | 17 +++++++ .../serverpackets/ExMagicSkillUseGround.java | 48 +++++++++++++++++++ .../network/serverpackets/MagicSkillUse.java | 45 ++++++++--------- .../gameserver/model/actor/Player.java | 11 +++++ .../gameserver/model/skill/SkillCaster.java | 17 +++++++ .../serverpackets/ExMagicSkillUseGround.java | 48 +++++++++++++++++++ .../network/serverpackets/MagicSkillUse.java | 45 ++++++++--------- .../game/data/stats/skills/47000-47099.xml | 36 +++++++++----- .../gameserver/model/actor/Player.java | 11 +++++ .../gameserver/model/skill/SkillCaster.java | 17 +++++++ .../serverpackets/ExMagicSkillUseGround.java | 48 +++++++++++++++++++ .../network/serverpackets/MagicSkillUse.java | 45 ++++++++--------- .../game/data/stats/skills/47000-47099.xml | 36 +++++++++----- .../gameserver/model/actor/Player.java | 11 +++++ .../gameserver/model/skill/SkillCaster.java | 17 +++++++ .../serverpackets/ExMagicSkillUseGround.java | 48 +++++++++++++++++++ .../network/serverpackets/MagicSkillUse.java | 45 ++++++++--------- .../game/data/stats/skills/47000-47099.xml | 36 +++++++++----- .../gameserver/model/actor/Player.java | 11 +++++ .../gameserver/model/skill/SkillCaster.java | 17 +++++++ .../serverpackets/ExMagicSkillUseGround.java | 48 +++++++++++++++++++ .../network/serverpackets/MagicSkillUse.java | 45 ++++++++--------- 27 files changed, 651 insertions(+), 183 deletions(-) create mode 100644 L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java create mode 100644 L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java create mode 100644 L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java create mode 100644 L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java create mode 100644 L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java create mode 100644 L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java index 3062a168ea..4267a7d978 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -8707,6 +8707,17 @@ public class Player extends Playable final Location worldPosition = _currentSkillWorldPosition; if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null)) { + if (getCurrentMp() >= usedSkill.getMpConsume()) + { + if (usedSkill.checkCondition(this, target, true)) + { + sendPacket(new MagicSkillUse(this, this, usedSkill.getDisplayId(), usedSkill.getDisplayLevel(), 0, 0, usedSkill.getReuseDelayGroup(), -1, SkillCastingType.NORMAL, true)); + } + } + else + { + sendPacket(SystemMessageId.NOT_ENOUGH_MP); + } sendPacket(ActionFailed.STATIC_PACKET); return false; } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java index 0b2d5ca9cb..577fc3a872 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java @@ -72,6 +72,7 @@ import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; +import org.l2jmobius.gameserver.network.serverpackets.ExMagicSkillUseGround; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld; @@ -349,6 +350,16 @@ public class SkillCaster implements Runnable if (!_skill.isNotBroadcastable()) { caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType)); + if ((_skill.getTargetType() == TargetType.GROUND) && caster.isPlayer()) + { + final Player player = caster.getActingPlayer(); + final Location worldPosition = player.getCurrentSkillWorldPosition(); + if (worldPosition != null) + { + final Location location = new Location(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), worldPosition.getHeading()); + ThreadPool.schedule(() -> player.broadcastPacket(new ExMagicSkillUseGround(player.getObjectId(), _skill.getId(), location)), 100); + } + } } if (caster.isPlayer() && !instantCast) @@ -575,6 +586,12 @@ public class SkillCaster implements Runnable // On each repeat recharge shots before cast. caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false); + // Reset current skill world position. + if (caster.isPlayer()) + { + caster.getActingPlayer().setCurrentSkillWorldPosition(null); + } + return true; } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java new file mode 100644 index 0000000000..e9db7593ed --- /dev/null +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java @@ -0,0 +1,48 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.network.ServerPackets; + +/** + * @author Mobius + */ +public class ExMagicSkillUseGround extends ServerPacket +{ + private final int _playerObjectId; + private final int _skillId; + private final Location _location; + + public ExMagicSkillUseGround(int playerObjectId, int skillId, Location location) + { + _playerObjectId = playerObjectId; + _skillId = skillId; + _location = location; + } + + @Override + public void write() + { + ServerPackets.EX_MAGIC_SKILL_USE_GROUND.writeId(this); + writeInt(_playerObjectId); + writeInt(_skillId); + writeInt(_location.getX()); + writeInt(_location.getY()); + writeInt(_location.getZ()); + } +} diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java index 635e169ed7..081cdef9e2 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java @@ -23,14 +23,12 @@ import java.util.List; import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.interfaces.IPositionable; import org.l2jmobius.gameserver.model.skill.SkillCastingType; import org.l2jmobius.gameserver.network.ServerPackets; /** * MagicSkillUse server packet implementation. - * @author UnAfraid, NosBit + * @author UnAfraid, NosBit, Mobius */ public class MagicSkillUse extends ServerPacket { @@ -43,12 +41,12 @@ public class MagicSkillUse extends ServerPacket private final SkillCastingType _castingType; // Defines which client bar is going to use. private final Creature _creature; private final WorldObject _target; - private final List _unknown = Collections.emptyList(); + private final boolean _isGroundTargetSkill; private final List _groundLocations; - public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType, boolean isGroundTargetSkill) { - super(75); + super(84); _creature = creature; _target = target; _skillId = skillId; @@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket _reuseDelay = reuseDelay; _actionId = actionId; _castingType = castingType; - Location skillWorldPos = null; - if (creature.isPlayer()) - { - final Player player = creature.getActingPlayer(); - if (player.getCurrentSkillWorldPosition() != null) - { - skillWorldPos = player.getCurrentSkillWorldPosition(); - } - } + _isGroundTargetSkill = isGroundTargetSkill; + final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null; _groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList(); } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + { + this(creature, target, skillId, skillLevel, hitTime, reuseDelay, reuseGroup, actionId, castingType, false); + } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay) { this(creature, target, skillId, skillLevel, hitTime, reuseDelay, -1, -1, SkillCastingType.NORMAL); @@ -95,23 +91,22 @@ public class MagicSkillUse extends ServerPacket writeInt(_creature.getX()); writeInt(_creature.getY()); writeInt(_creature.getZ()); - writeShort(_unknown.size()); // TODO: Implement me! - for (int unknown : _unknown) - { - writeShort(unknown); - } + writeShort(_isGroundTargetSkill ? 64 : 0); writeShort(_groundLocations.size()); - for (IPositionable target : _groundLocations) + for (Location location : _groundLocations) { - writeInt(target.getX()); - writeInt(target.getY()); - writeInt(target.getZ()); + writeInt(location.getX()); + writeInt(location.getY()); + writeInt(location.getZ()); } writeInt(_target.getX()); writeInt(_target.getY()); writeInt(_target.getZ()); writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used writeInt(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills. - writeInt(-1); // 306 + if (_groundLocations.isEmpty()) + { + writeInt(-1); // 306 + } } } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java index f15ee1c373..3d0f46cc0d 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -8766,6 +8766,17 @@ public class Player extends Playable final Location worldPosition = _currentSkillWorldPosition; if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null)) { + if (getCurrentMp() >= usedSkill.getMpConsume()) + { + if (usedSkill.checkCondition(this, target, true)) + { + sendPacket(new MagicSkillUse(this, this, usedSkill.getDisplayId(), usedSkill.getDisplayLevel(), 0, 0, usedSkill.getReuseDelayGroup(), -1, SkillCastingType.NORMAL, true)); + } + } + else + { + sendPacket(SystemMessageId.NOT_ENOUGH_MP); + } sendPacket(ActionFailed.STATIC_PACKET); return false; } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java index a965fadeb9..1a713cd048 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java @@ -72,6 +72,7 @@ import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; +import org.l2jmobius.gameserver.network.serverpackets.ExMagicSkillUseGround; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld; @@ -349,6 +350,16 @@ public class SkillCaster implements Runnable if (!_skill.isNotBroadcastable()) { caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType)); + if ((_skill.getTargetType() == TargetType.GROUND) && caster.isPlayer()) + { + final Player player = caster.getActingPlayer(); + final Location worldPosition = player.getCurrentSkillWorldPosition(); + if (worldPosition != null) + { + final Location location = new Location(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), worldPosition.getHeading()); + ThreadPool.schedule(() -> player.broadcastPacket(new ExMagicSkillUseGround(player.getObjectId(), _skill.getId(), location)), 100); + } + } } if (caster.isPlayer() && !instantCast) @@ -575,6 +586,12 @@ public class SkillCaster implements Runnable // On each repeat recharge shots before cast. caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false); + // Reset current skill world position. + if (caster.isPlayer()) + { + caster.getActingPlayer().setCurrentSkillWorldPosition(null); + } + return true; } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java new file mode 100644 index 0000000000..e9db7593ed --- /dev/null +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java @@ -0,0 +1,48 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.network.ServerPackets; + +/** + * @author Mobius + */ +public class ExMagicSkillUseGround extends ServerPacket +{ + private final int _playerObjectId; + private final int _skillId; + private final Location _location; + + public ExMagicSkillUseGround(int playerObjectId, int skillId, Location location) + { + _playerObjectId = playerObjectId; + _skillId = skillId; + _location = location; + } + + @Override + public void write() + { + ServerPackets.EX_MAGIC_SKILL_USE_GROUND.writeId(this); + writeInt(_playerObjectId); + writeInt(_skillId); + writeInt(_location.getX()); + writeInt(_location.getY()); + writeInt(_location.getZ()); + } +} diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java index 635e169ed7..081cdef9e2 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java @@ -23,14 +23,12 @@ import java.util.List; import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.interfaces.IPositionable; import org.l2jmobius.gameserver.model.skill.SkillCastingType; import org.l2jmobius.gameserver.network.ServerPackets; /** * MagicSkillUse server packet implementation. - * @author UnAfraid, NosBit + * @author UnAfraid, NosBit, Mobius */ public class MagicSkillUse extends ServerPacket { @@ -43,12 +41,12 @@ public class MagicSkillUse extends ServerPacket private final SkillCastingType _castingType; // Defines which client bar is going to use. private final Creature _creature; private final WorldObject _target; - private final List _unknown = Collections.emptyList(); + private final boolean _isGroundTargetSkill; private final List _groundLocations; - public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType, boolean isGroundTargetSkill) { - super(75); + super(84); _creature = creature; _target = target; _skillId = skillId; @@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket _reuseDelay = reuseDelay; _actionId = actionId; _castingType = castingType; - Location skillWorldPos = null; - if (creature.isPlayer()) - { - final Player player = creature.getActingPlayer(); - if (player.getCurrentSkillWorldPosition() != null) - { - skillWorldPos = player.getCurrentSkillWorldPosition(); - } - } + _isGroundTargetSkill = isGroundTargetSkill; + final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null; _groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList(); } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + { + this(creature, target, skillId, skillLevel, hitTime, reuseDelay, reuseGroup, actionId, castingType, false); + } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay) { this(creature, target, skillId, skillLevel, hitTime, reuseDelay, -1, -1, SkillCastingType.NORMAL); @@ -95,23 +91,22 @@ public class MagicSkillUse extends ServerPacket writeInt(_creature.getX()); writeInt(_creature.getY()); writeInt(_creature.getZ()); - writeShort(_unknown.size()); // TODO: Implement me! - for (int unknown : _unknown) - { - writeShort(unknown); - } + writeShort(_isGroundTargetSkill ? 64 : 0); writeShort(_groundLocations.size()); - for (IPositionable target : _groundLocations) + for (Location location : _groundLocations) { - writeInt(target.getX()); - writeInt(target.getY()); - writeInt(target.getZ()); + writeInt(location.getX()); + writeInt(location.getY()); + writeInt(location.getZ()); } writeInt(_target.getX()); writeInt(_target.getY()); writeInt(_target.getZ()); writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used writeInt(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills. - writeInt(-1); // 306 + if (_groundLocations.isEmpty()) + { + writeInt(-1); // 306 + } } } diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java index 305b24a164..c0d5aa4c00 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -8801,6 +8801,17 @@ public class Player extends Playable final Location worldPosition = _currentSkillWorldPosition; if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null)) { + if (getCurrentMp() >= usedSkill.getMpConsume()) + { + if (usedSkill.checkCondition(this, target, true)) + { + sendPacket(new MagicSkillUse(this, this, usedSkill.getDisplayId(), usedSkill.getDisplayLevel(), 0, 0, usedSkill.getReuseDelayGroup(), -1, SkillCastingType.NORMAL, true)); + } + } + else + { + sendPacket(SystemMessageId.NOT_ENOUGH_MP); + } sendPacket(ActionFailed.STATIC_PACKET); return false; } diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java index 6f013c6760..d160096fa1 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java @@ -72,6 +72,7 @@ import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; +import org.l2jmobius.gameserver.network.serverpackets.ExMagicSkillUseGround; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld; @@ -349,6 +350,16 @@ public class SkillCaster implements Runnable if (!_skill.isNotBroadcastable()) { caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType)); + if ((_skill.getTargetType() == TargetType.GROUND) && caster.isPlayer()) + { + final Player player = caster.getActingPlayer(); + final Location worldPosition = player.getCurrentSkillWorldPosition(); + if (worldPosition != null) + { + final Location location = new Location(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), worldPosition.getHeading()); + ThreadPool.schedule(() -> player.broadcastPacket(new ExMagicSkillUseGround(player.getObjectId(), _skill.getId(), location)), 100); + } + } } if (caster.isPlayer() && !instantCast) @@ -575,6 +586,12 @@ public class SkillCaster implements Runnable // On each repeat recharge shots before cast. caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false); + // Reset current skill world position. + if (caster.isPlayer()) + { + caster.getActingPlayer().setCurrentSkillWorldPosition(null); + } + return true; } diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java new file mode 100644 index 0000000000..e9db7593ed --- /dev/null +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java @@ -0,0 +1,48 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.network.ServerPackets; + +/** + * @author Mobius + */ +public class ExMagicSkillUseGround extends ServerPacket +{ + private final int _playerObjectId; + private final int _skillId; + private final Location _location; + + public ExMagicSkillUseGround(int playerObjectId, int skillId, Location location) + { + _playerObjectId = playerObjectId; + _skillId = skillId; + _location = location; + } + + @Override + public void write() + { + ServerPackets.EX_MAGIC_SKILL_USE_GROUND.writeId(this); + writeInt(_playerObjectId); + writeInt(_skillId); + writeInt(_location.getX()); + writeInt(_location.getY()); + writeInt(_location.getZ()); + } +} diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java index 635e169ed7..081cdef9e2 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java @@ -23,14 +23,12 @@ import java.util.List; import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.interfaces.IPositionable; import org.l2jmobius.gameserver.model.skill.SkillCastingType; import org.l2jmobius.gameserver.network.ServerPackets; /** * MagicSkillUse server packet implementation. - * @author UnAfraid, NosBit + * @author UnAfraid, NosBit, Mobius */ public class MagicSkillUse extends ServerPacket { @@ -43,12 +41,12 @@ public class MagicSkillUse extends ServerPacket private final SkillCastingType _castingType; // Defines which client bar is going to use. private final Creature _creature; private final WorldObject _target; - private final List _unknown = Collections.emptyList(); + private final boolean _isGroundTargetSkill; private final List _groundLocations; - public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType, boolean isGroundTargetSkill) { - super(75); + super(84); _creature = creature; _target = target; _skillId = skillId; @@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket _reuseDelay = reuseDelay; _actionId = actionId; _castingType = castingType; - Location skillWorldPos = null; - if (creature.isPlayer()) - { - final Player player = creature.getActingPlayer(); - if (player.getCurrentSkillWorldPosition() != null) - { - skillWorldPos = player.getCurrentSkillWorldPosition(); - } - } + _isGroundTargetSkill = isGroundTargetSkill; + final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null; _groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList(); } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + { + this(creature, target, skillId, skillLevel, hitTime, reuseDelay, reuseGroup, actionId, castingType, false); + } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay) { this(creature, target, skillId, skillLevel, hitTime, reuseDelay, -1, -1, SkillCastingType.NORMAL); @@ -95,23 +91,22 @@ public class MagicSkillUse extends ServerPacket writeInt(_creature.getX()); writeInt(_creature.getY()); writeInt(_creature.getZ()); - writeShort(_unknown.size()); // TODO: Implement me! - for (int unknown : _unknown) - { - writeShort(unknown); - } + writeShort(_isGroundTargetSkill ? 64 : 0); writeShort(_groundLocations.size()); - for (IPositionable target : _groundLocations) + for (Location location : _groundLocations) { - writeInt(target.getX()); - writeInt(target.getY()); - writeInt(target.getZ()); + writeInt(location.getX()); + writeInt(location.getY()); + writeInt(location.getZ()); } writeInt(_target.getX()); writeInt(_target.getY()); writeInt(_target.getZ()); writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used writeInt(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills. - writeInt(-1); // 306 + if (_groundLocations.isEmpty()) + { + writeInt(-1); // 306 + } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/47000-47099.xml b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/47000-47099.xml index 5d8218059f..be18bc5151 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/47000-47099.xml +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/47000-47099.xml @@ -10,17 +10,18 @@ 250 0;0;250;60 1100 - ATTACK 80 - 6 + 0 500 1000 A1 60000 + true 5 - ENEMY - SINGLE + GROUND + FAN_PB NOT_FRIEND + 0;0;900;20 @@ -29,6 +30,10 @@ + + 8000 + 0.5 + 47020 1 @@ -1112,20 +1117,29 @@ 100 80 true - SHOCK - ENEMY - SQUARE + GROUND + 0;0;600;60 + FAN NOT_FRIEND + + + + PISTOLS + + + - - 8000 - 0.5 - 50 400 true + + 100 + 100 + 100 + 100 + 10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190 diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java index 2b2e32a49b..242ab44319 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -8658,6 +8658,17 @@ public class Player extends Playable final Location worldPosition = _currentSkillWorldPosition; if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null)) { + if (getCurrentMp() >= usedSkill.getMpConsume()) + { + if (usedSkill.checkCondition(this, target, true)) + { + sendPacket(new MagicSkillUse(this, this, usedSkill.getDisplayId(), usedSkill.getDisplayLevel(), 0, 0, usedSkill.getReuseDelayGroup(), -1, SkillCastingType.NORMAL, true)); + } + } + else + { + sendPacket(SystemMessageId.NOT_ENOUGH_MP); + } sendPacket(ActionFailed.STATIC_PACKET); return false; } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java index d22de5f4aa..850b0cc05c 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java @@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; +import org.l2jmobius.gameserver.network.serverpackets.ExMagicSkillUseGround; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld; @@ -345,6 +346,16 @@ public class SkillCaster implements Runnable if (!_skill.isNotBroadcastable()) { caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType)); + if ((_skill.getTargetType() == TargetType.GROUND) && caster.isPlayer()) + { + final Player player = caster.getActingPlayer(); + final Location worldPosition = player.getCurrentSkillWorldPosition(); + if (worldPosition != null) + { + final Location location = new Location(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), worldPosition.getHeading()); + ThreadPool.schedule(() -> player.broadcastPacket(new ExMagicSkillUseGround(player.getObjectId(), _skill.getId(), location)), 100); + } + } } if (caster.isPlayer() && !instantCast) @@ -575,6 +586,12 @@ public class SkillCaster implements Runnable // On each repeat recharge shots before cast. caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false); + // Reset current skill world position. + if (caster.isPlayer()) + { + caster.getActingPlayer().setCurrentSkillWorldPosition(null); + } + return true; } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java new file mode 100644 index 0000000000..e9db7593ed --- /dev/null +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java @@ -0,0 +1,48 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.network.ServerPackets; + +/** + * @author Mobius + */ +public class ExMagicSkillUseGround extends ServerPacket +{ + private final int _playerObjectId; + private final int _skillId; + private final Location _location; + + public ExMagicSkillUseGround(int playerObjectId, int skillId, Location location) + { + _playerObjectId = playerObjectId; + _skillId = skillId; + _location = location; + } + + @Override + public void write() + { + ServerPackets.EX_MAGIC_SKILL_USE_GROUND.writeId(this); + writeInt(_playerObjectId); + writeInt(_skillId); + writeInt(_location.getX()); + writeInt(_location.getY()); + writeInt(_location.getZ()); + } +} diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java index 635e169ed7..081cdef9e2 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java @@ -23,14 +23,12 @@ import java.util.List; import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.interfaces.IPositionable; import org.l2jmobius.gameserver.model.skill.SkillCastingType; import org.l2jmobius.gameserver.network.ServerPackets; /** * MagicSkillUse server packet implementation. - * @author UnAfraid, NosBit + * @author UnAfraid, NosBit, Mobius */ public class MagicSkillUse extends ServerPacket { @@ -43,12 +41,12 @@ public class MagicSkillUse extends ServerPacket private final SkillCastingType _castingType; // Defines which client bar is going to use. private final Creature _creature; private final WorldObject _target; - private final List _unknown = Collections.emptyList(); + private final boolean _isGroundTargetSkill; private final List _groundLocations; - public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType, boolean isGroundTargetSkill) { - super(75); + super(84); _creature = creature; _target = target; _skillId = skillId; @@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket _reuseDelay = reuseDelay; _actionId = actionId; _castingType = castingType; - Location skillWorldPos = null; - if (creature.isPlayer()) - { - final Player player = creature.getActingPlayer(); - if (player.getCurrentSkillWorldPosition() != null) - { - skillWorldPos = player.getCurrentSkillWorldPosition(); - } - } + _isGroundTargetSkill = isGroundTargetSkill; + final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null; _groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList(); } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + { + this(creature, target, skillId, skillLevel, hitTime, reuseDelay, reuseGroup, actionId, castingType, false); + } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay) { this(creature, target, skillId, skillLevel, hitTime, reuseDelay, -1, -1, SkillCastingType.NORMAL); @@ -95,23 +91,22 @@ public class MagicSkillUse extends ServerPacket writeInt(_creature.getX()); writeInt(_creature.getY()); writeInt(_creature.getZ()); - writeShort(_unknown.size()); // TODO: Implement me! - for (int unknown : _unknown) - { - writeShort(unknown); - } + writeShort(_isGroundTargetSkill ? 64 : 0); writeShort(_groundLocations.size()); - for (IPositionable target : _groundLocations) + for (Location location : _groundLocations) { - writeInt(target.getX()); - writeInt(target.getY()); - writeInt(target.getZ()); + writeInt(location.getX()); + writeInt(location.getY()); + writeInt(location.getZ()); } writeInt(_target.getX()); writeInt(_target.getY()); writeInt(_target.getZ()); writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used writeInt(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills. - writeInt(-1); // 306 + if (_groundLocations.isEmpty()) + { + writeInt(-1); // 306 + } } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/stats/skills/47000-47099.xml b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/stats/skills/47000-47099.xml index 753b6a10bb..19b97f2e1d 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/stats/skills/47000-47099.xml +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/stats/skills/47000-47099.xml @@ -10,17 +10,18 @@ 250 0;0;250;60 1100 - ATTACK 80 - 6 + 0 500 1000 A1 60000 + true 5 - ENEMY - SINGLE + GROUND + FAN_PB NOT_FRIEND + 0;0;900;20 @@ -29,6 +30,10 @@ + + 8000 + 0.5 + 47020 1 @@ -1112,20 +1117,29 @@ 100 80 true - SHOCK - ENEMY - SQUARE + GROUND + 0;0;600;60 + FAN NOT_FRIEND + + + + PISTOLS + + + - - 8000 - 0.5 - 50 400 true + + 100 + 100 + 100 + 100 + 10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190 diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java index 328164be69..465a2cf2c7 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -8903,6 +8903,17 @@ public class Player extends Playable final Location worldPosition = _currentSkillWorldPosition; if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null)) { + if (getCurrentMp() >= usedSkill.getMpConsume()) + { + if (usedSkill.checkCondition(this, target, true)) + { + sendPacket(new MagicSkillUse(this, this, usedSkill.getDisplayId(), usedSkill.getDisplayLevel(), 0, 0, usedSkill.getReuseDelayGroup(), -1, SkillCastingType.NORMAL, true)); + } + } + else + { + sendPacket(SystemMessageId.NOT_ENOUGH_MP); + } sendPacket(ActionFailed.STATIC_PACKET); return false; } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java index 8a4e2d7075..d11a88b8c8 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java @@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; +import org.l2jmobius.gameserver.network.serverpackets.ExMagicSkillUseGround; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld; @@ -345,6 +346,16 @@ public class SkillCaster implements Runnable if (!_skill.isNotBroadcastable()) { caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType)); + if ((_skill.getTargetType() == TargetType.GROUND) && caster.isPlayer()) + { + final Player player = caster.getActingPlayer(); + final Location worldPosition = player.getCurrentSkillWorldPosition(); + if (worldPosition != null) + { + final Location location = new Location(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), worldPosition.getHeading()); + ThreadPool.schedule(() -> player.broadcastPacket(new ExMagicSkillUseGround(player.getObjectId(), _skill.getId(), location)), 100); + } + } } if (caster.isPlayer() && !instantCast) @@ -575,6 +586,12 @@ public class SkillCaster implements Runnable // On each repeat recharge shots before cast. caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false); + // Reset current skill world position. + if (caster.isPlayer()) + { + caster.getActingPlayer().setCurrentSkillWorldPosition(null); + } + return true; } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java new file mode 100644 index 0000000000..e9db7593ed --- /dev/null +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java @@ -0,0 +1,48 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.network.ServerPackets; + +/** + * @author Mobius + */ +public class ExMagicSkillUseGround extends ServerPacket +{ + private final int _playerObjectId; + private final int _skillId; + private final Location _location; + + public ExMagicSkillUseGround(int playerObjectId, int skillId, Location location) + { + _playerObjectId = playerObjectId; + _skillId = skillId; + _location = location; + } + + @Override + public void write() + { + ServerPackets.EX_MAGIC_SKILL_USE_GROUND.writeId(this); + writeInt(_playerObjectId); + writeInt(_skillId); + writeInt(_location.getX()); + writeInt(_location.getY()); + writeInt(_location.getZ()); + } +} diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java index 635e169ed7..081cdef9e2 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java @@ -23,14 +23,12 @@ import java.util.List; import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.interfaces.IPositionable; import org.l2jmobius.gameserver.model.skill.SkillCastingType; import org.l2jmobius.gameserver.network.ServerPackets; /** * MagicSkillUse server packet implementation. - * @author UnAfraid, NosBit + * @author UnAfraid, NosBit, Mobius */ public class MagicSkillUse extends ServerPacket { @@ -43,12 +41,12 @@ public class MagicSkillUse extends ServerPacket private final SkillCastingType _castingType; // Defines which client bar is going to use. private final Creature _creature; private final WorldObject _target; - private final List _unknown = Collections.emptyList(); + private final boolean _isGroundTargetSkill; private final List _groundLocations; - public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType, boolean isGroundTargetSkill) { - super(75); + super(84); _creature = creature; _target = target; _skillId = skillId; @@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket _reuseDelay = reuseDelay; _actionId = actionId; _castingType = castingType; - Location skillWorldPos = null; - if (creature.isPlayer()) - { - final Player player = creature.getActingPlayer(); - if (player.getCurrentSkillWorldPosition() != null) - { - skillWorldPos = player.getCurrentSkillWorldPosition(); - } - } + _isGroundTargetSkill = isGroundTargetSkill; + final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null; _groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList(); } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + { + this(creature, target, skillId, skillLevel, hitTime, reuseDelay, reuseGroup, actionId, castingType, false); + } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay) { this(creature, target, skillId, skillLevel, hitTime, reuseDelay, -1, -1, SkillCastingType.NORMAL); @@ -95,23 +91,22 @@ public class MagicSkillUse extends ServerPacket writeInt(_creature.getX()); writeInt(_creature.getY()); writeInt(_creature.getZ()); - writeShort(_unknown.size()); // TODO: Implement me! - for (int unknown : _unknown) - { - writeShort(unknown); - } + writeShort(_isGroundTargetSkill ? 64 : 0); writeShort(_groundLocations.size()); - for (IPositionable target : _groundLocations) + for (Location location : _groundLocations) { - writeInt(target.getX()); - writeInt(target.getY()); - writeInt(target.getZ()); + writeInt(location.getX()); + writeInt(location.getY()); + writeInt(location.getZ()); } writeInt(_target.getX()); writeInt(_target.getY()); writeInt(_target.getZ()); writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used writeInt(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills. - writeInt(-1); // 306 + if (_groundLocations.isEmpty()) + { + writeInt(-1); // 306 + } } } diff --git a/L2J_Mobius_Essence_6.3_Crusader/dist/game/data/stats/skills/47000-47099.xml b/L2J_Mobius_Essence_6.3_Crusader/dist/game/data/stats/skills/47000-47099.xml index df1ddf8797..b1b408dec1 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/dist/game/data/stats/skills/47000-47099.xml +++ b/L2J_Mobius_Essence_6.3_Crusader/dist/game/data/stats/skills/47000-47099.xml @@ -10,17 +10,18 @@ 250 0;0;250;60 1100 - ATTACK 80 - 6 + 0 500 1000 A1 60000 + true 5 - ENEMY - SINGLE + GROUND + FAN_PB NOT_FRIEND + 0;0;900;20 @@ -29,6 +30,10 @@ + + 8000 + 0.5 + 47020 1 @@ -1621,20 +1626,29 @@ 100 80 true - SHOCK - ENEMY - SQUARE + GROUND + 0;0;600;60 + FAN NOT_FRIEND + + + + PISTOLS + + + - - 8000 - 0.5 - 50 400 true + + 100 + 100 + 100 + 100 + 10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190 diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/actor/Player.java index 6fdc4bbe0f..bc07008aca 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -8903,6 +8903,17 @@ public class Player extends Playable final Location worldPosition = _currentSkillWorldPosition; if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null)) { + if (getCurrentMp() >= usedSkill.getMpConsume()) + { + if (usedSkill.checkCondition(this, target, true)) + { + sendPacket(new MagicSkillUse(this, this, usedSkill.getDisplayId(), usedSkill.getDisplayLevel(), 0, 0, usedSkill.getReuseDelayGroup(), -1, SkillCastingType.NORMAL, true)); + } + } + else + { + sendPacket(SystemMessageId.NOT_ENOUGH_MP); + } sendPacket(ActionFailed.STATIC_PACKET); return false; } diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java index ffef1ef421..989a6f8f2b 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/skill/SkillCaster.java @@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; +import org.l2jmobius.gameserver.network.serverpackets.ExMagicSkillUseGround; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation; import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld; @@ -345,6 +346,16 @@ public class SkillCaster implements Runnable if (!_skill.isNotBroadcastable()) { caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType)); + if ((_skill.getTargetType() == TargetType.GROUND) && caster.isPlayer()) + { + final Player player = caster.getActingPlayer(); + final Location worldPosition = player.getCurrentSkillWorldPosition(); + if (worldPosition != null) + { + final Location location = new Location(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), worldPosition.getHeading()); + ThreadPool.schedule(() -> player.broadcastPacket(new ExMagicSkillUseGround(player.getObjectId(), _skill.getId(), location)), 100); + } + } } if (caster.isPlayer() && !instantCast) @@ -575,6 +586,12 @@ public class SkillCaster implements Runnable // On each repeat recharge shots before cast. caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false); + // Reset current skill world position. + if (caster.isPlayer()) + { + caster.getActingPlayer().setCurrentSkillWorldPosition(null); + } + return true; } diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java new file mode 100644 index 0000000000..08a37e3a19 --- /dev/null +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/ExMagicSkillUseGround.java @@ -0,0 +1,48 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.network.ServerPackets; + +/** + * @author Mobius + */ +public class ExMagicSkillUseGround extends ServerPacket +{ + private final int _playerObjectId; + private final int _skillId; + private final Location _location; + + public ExMagicSkillUseGround(int playerObjectId, int skillId, Location location) + { + _playerObjectId = playerObjectId; + _skillId = skillId; + _location = location; + } + + @Override + public void write() + { + ServerPackets.EX_MAGIC_SKILL_USE_GROUND.writeId(this); + writeInt(_playerObjectId); + writeInt(_skillId); + writeInt(_location.getX()); + writeInt(_location.getY()); + writeInt(_location.getZ()); + } +} diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java index 635e169ed7..081cdef9e2 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/MagicSkillUse.java @@ -23,14 +23,12 @@ import java.util.List; import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.interfaces.IPositionable; import org.l2jmobius.gameserver.model.skill.SkillCastingType; import org.l2jmobius.gameserver.network.ServerPackets; /** * MagicSkillUse server packet implementation. - * @author UnAfraid, NosBit + * @author UnAfraid, NosBit, Mobius */ public class MagicSkillUse extends ServerPacket { @@ -43,12 +41,12 @@ public class MagicSkillUse extends ServerPacket private final SkillCastingType _castingType; // Defines which client bar is going to use. private final Creature _creature; private final WorldObject _target; - private final List _unknown = Collections.emptyList(); + private final boolean _isGroundTargetSkill; private final List _groundLocations; - public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType, boolean isGroundTargetSkill) { - super(75); + super(84); _creature = creature; _target = target; _skillId = skillId; @@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket _reuseDelay = reuseDelay; _actionId = actionId; _castingType = castingType; - Location skillWorldPos = null; - if (creature.isPlayer()) - { - final Player player = creature.getActingPlayer(); - if (player.getCurrentSkillWorldPosition() != null) - { - skillWorldPos = player.getCurrentSkillWorldPosition(); - } - } + _isGroundTargetSkill = isGroundTargetSkill; + final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null; _groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList(); } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay, int reuseGroup, int actionId, SkillCastingType castingType) + { + this(creature, target, skillId, skillLevel, hitTime, reuseDelay, reuseGroup, actionId, castingType, false); + } + public MagicSkillUse(Creature creature, WorldObject target, int skillId, int skillLevel, int hitTime, int reuseDelay) { this(creature, target, skillId, skillLevel, hitTime, reuseDelay, -1, -1, SkillCastingType.NORMAL); @@ -95,23 +91,22 @@ public class MagicSkillUse extends ServerPacket writeInt(_creature.getX()); writeInt(_creature.getY()); writeInt(_creature.getZ()); - writeShort(_unknown.size()); // TODO: Implement me! - for (int unknown : _unknown) - { - writeShort(unknown); - } + writeShort(_isGroundTargetSkill ? 64 : 0); writeShort(_groundLocations.size()); - for (IPositionable target : _groundLocations) + for (Location location : _groundLocations) { - writeInt(target.getX()); - writeInt(target.getY()); - writeInt(target.getZ()); + writeInt(location.getX()); + writeInt(location.getY()); + writeInt(location.getZ()); } writeInt(_target.getX()); writeInt(_target.getY()); writeInt(_target.getZ()); writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used writeInt(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills. - writeInt(-1); // 306 + if (_groundLocations.isEmpty()) + { + writeInt(-1); // 306 + } } }