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
+ }
}
}