Support for ExMagicSkillUseGround packet.
This commit is contained in:
+11
@@ -8707,6 +8707,17 @@ public class Player extends Playable
|
|||||||
final Location worldPosition = _currentSkillWorldPosition;
|
final Location worldPosition = _currentSkillWorldPosition;
|
||||||
if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null))
|
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);
|
sendPacket(ActionFailed.STATIC_PACKET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -72,6 +72,7 @@ import org.l2jmobius.gameserver.model.stats.Stat;
|
|||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
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.ExRotation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
||||||
@@ -349,6 +350,16 @@ public class SkillCaster implements Runnable
|
|||||||
if (!_skill.isNotBroadcastable())
|
if (!_skill.isNotBroadcastable())
|
||||||
{
|
{
|
||||||
caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType));
|
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)
|
if (caster.isPlayer() && !instantCast)
|
||||||
@@ -575,6 +586,12 @@ public class SkillCaster implements Runnable
|
|||||||
// On each repeat recharge shots before cast.
|
// On each repeat recharge shots before cast.
|
||||||
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
||||||
|
|
||||||
|
// Reset current skill world position.
|
||||||
|
if (caster.isPlayer())
|
||||||
|
{
|
||||||
|
caster.getActingPlayer().setCurrentSkillWorldPosition(null);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-25
@@ -23,14 +23,12 @@ import java.util.List;
|
|||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
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.model.skill.SkillCastingType;
|
||||||
import org.l2jmobius.gameserver.network.ServerPackets;
|
import org.l2jmobius.gameserver.network.ServerPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagicSkillUse server packet implementation.
|
* MagicSkillUse server packet implementation.
|
||||||
* @author UnAfraid, NosBit
|
* @author UnAfraid, NosBit, Mobius
|
||||||
*/
|
*/
|
||||||
public class MagicSkillUse extends ServerPacket
|
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 SkillCastingType _castingType; // Defines which client bar is going to use.
|
||||||
private final Creature _creature;
|
private final Creature _creature;
|
||||||
private final WorldObject _target;
|
private final WorldObject _target;
|
||||||
private final List<Integer> _unknown = Collections.emptyList();
|
private final boolean _isGroundTargetSkill;
|
||||||
private final List<Location> _groundLocations;
|
private final List<Location> _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;
|
_creature = creature;
|
||||||
_target = target;
|
_target = target;
|
||||||
_skillId = skillId;
|
_skillId = skillId;
|
||||||
@@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket
|
|||||||
_reuseDelay = reuseDelay;
|
_reuseDelay = reuseDelay;
|
||||||
_actionId = actionId;
|
_actionId = actionId;
|
||||||
_castingType = castingType;
|
_castingType = castingType;
|
||||||
Location skillWorldPos = null;
|
_isGroundTargetSkill = isGroundTargetSkill;
|
||||||
if (creature.isPlayer())
|
final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null;
|
||||||
{
|
|
||||||
final Player player = creature.getActingPlayer();
|
|
||||||
if (player.getCurrentSkillWorldPosition() != null)
|
|
||||||
{
|
|
||||||
skillWorldPos = player.getCurrentSkillWorldPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList();
|
_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)
|
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);
|
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.getX());
|
||||||
writeInt(_creature.getY());
|
writeInt(_creature.getY());
|
||||||
writeInt(_creature.getZ());
|
writeInt(_creature.getZ());
|
||||||
writeShort(_unknown.size()); // TODO: Implement me!
|
writeShort(_isGroundTargetSkill ? 64 : 0);
|
||||||
for (int unknown : _unknown)
|
|
||||||
{
|
|
||||||
writeShort(unknown);
|
|
||||||
}
|
|
||||||
writeShort(_groundLocations.size());
|
writeShort(_groundLocations.size());
|
||||||
for (IPositionable target : _groundLocations)
|
for (Location location : _groundLocations)
|
||||||
{
|
{
|
||||||
writeInt(target.getX());
|
writeInt(location.getX());
|
||||||
writeInt(target.getY());
|
writeInt(location.getY());
|
||||||
writeInt(target.getZ());
|
writeInt(location.getZ());
|
||||||
}
|
}
|
||||||
writeInt(_target.getX());
|
writeInt(_target.getX());
|
||||||
writeInt(_target.getY());
|
writeInt(_target.getY());
|
||||||
writeInt(_target.getZ());
|
writeInt(_target.getZ());
|
||||||
writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used
|
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(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills.
|
||||||
writeInt(-1); // 306
|
if (_groundLocations.isEmpty())
|
||||||
|
{
|
||||||
|
writeInt(-1); // 306
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8766,6 +8766,17 @@ public class Player extends Playable
|
|||||||
final Location worldPosition = _currentSkillWorldPosition;
|
final Location worldPosition = _currentSkillWorldPosition;
|
||||||
if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null))
|
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);
|
sendPacket(ActionFailed.STATIC_PACKET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -72,6 +72,7 @@ import org.l2jmobius.gameserver.model.stats.Stat;
|
|||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
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.ExRotation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
||||||
@@ -349,6 +350,16 @@ public class SkillCaster implements Runnable
|
|||||||
if (!_skill.isNotBroadcastable())
|
if (!_skill.isNotBroadcastable())
|
||||||
{
|
{
|
||||||
caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType));
|
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)
|
if (caster.isPlayer() && !instantCast)
|
||||||
@@ -575,6 +586,12 @@ public class SkillCaster implements Runnable
|
|||||||
// On each repeat recharge shots before cast.
|
// On each repeat recharge shots before cast.
|
||||||
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
||||||
|
|
||||||
|
// Reset current skill world position.
|
||||||
|
if (caster.isPlayer())
|
||||||
|
{
|
||||||
|
caster.getActingPlayer().setCurrentSkillWorldPosition(null);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-25
@@ -23,14 +23,12 @@ import java.util.List;
|
|||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
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.model.skill.SkillCastingType;
|
||||||
import org.l2jmobius.gameserver.network.ServerPackets;
|
import org.l2jmobius.gameserver.network.ServerPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagicSkillUse server packet implementation.
|
* MagicSkillUse server packet implementation.
|
||||||
* @author UnAfraid, NosBit
|
* @author UnAfraid, NosBit, Mobius
|
||||||
*/
|
*/
|
||||||
public class MagicSkillUse extends ServerPacket
|
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 SkillCastingType _castingType; // Defines which client bar is going to use.
|
||||||
private final Creature _creature;
|
private final Creature _creature;
|
||||||
private final WorldObject _target;
|
private final WorldObject _target;
|
||||||
private final List<Integer> _unknown = Collections.emptyList();
|
private final boolean _isGroundTargetSkill;
|
||||||
private final List<Location> _groundLocations;
|
private final List<Location> _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;
|
_creature = creature;
|
||||||
_target = target;
|
_target = target;
|
||||||
_skillId = skillId;
|
_skillId = skillId;
|
||||||
@@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket
|
|||||||
_reuseDelay = reuseDelay;
|
_reuseDelay = reuseDelay;
|
||||||
_actionId = actionId;
|
_actionId = actionId;
|
||||||
_castingType = castingType;
|
_castingType = castingType;
|
||||||
Location skillWorldPos = null;
|
_isGroundTargetSkill = isGroundTargetSkill;
|
||||||
if (creature.isPlayer())
|
final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null;
|
||||||
{
|
|
||||||
final Player player = creature.getActingPlayer();
|
|
||||||
if (player.getCurrentSkillWorldPosition() != null)
|
|
||||||
{
|
|
||||||
skillWorldPos = player.getCurrentSkillWorldPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList();
|
_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)
|
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);
|
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.getX());
|
||||||
writeInt(_creature.getY());
|
writeInt(_creature.getY());
|
||||||
writeInt(_creature.getZ());
|
writeInt(_creature.getZ());
|
||||||
writeShort(_unknown.size()); // TODO: Implement me!
|
writeShort(_isGroundTargetSkill ? 64 : 0);
|
||||||
for (int unknown : _unknown)
|
|
||||||
{
|
|
||||||
writeShort(unknown);
|
|
||||||
}
|
|
||||||
writeShort(_groundLocations.size());
|
writeShort(_groundLocations.size());
|
||||||
for (IPositionable target : _groundLocations)
|
for (Location location : _groundLocations)
|
||||||
{
|
{
|
||||||
writeInt(target.getX());
|
writeInt(location.getX());
|
||||||
writeInt(target.getY());
|
writeInt(location.getY());
|
||||||
writeInt(target.getZ());
|
writeInt(location.getZ());
|
||||||
}
|
}
|
||||||
writeInt(_target.getX());
|
writeInt(_target.getX());
|
||||||
writeInt(_target.getY());
|
writeInt(_target.getY());
|
||||||
writeInt(_target.getZ());
|
writeInt(_target.getZ());
|
||||||
writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used
|
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(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills.
|
||||||
writeInt(-1); // 306
|
if (_groundLocations.isEmpty())
|
||||||
|
{
|
||||||
|
writeInt(-1); // 306
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8801,6 +8801,17 @@ public class Player extends Playable
|
|||||||
final Location worldPosition = _currentSkillWorldPosition;
|
final Location worldPosition = _currentSkillWorldPosition;
|
||||||
if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null))
|
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);
|
sendPacket(ActionFailed.STATIC_PACKET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -72,6 +72,7 @@ import org.l2jmobius.gameserver.model.stats.Stat;
|
|||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
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.ExRotation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
||||||
@@ -349,6 +350,16 @@ public class SkillCaster implements Runnable
|
|||||||
if (!_skill.isNotBroadcastable())
|
if (!_skill.isNotBroadcastable())
|
||||||
{
|
{
|
||||||
caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType));
|
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)
|
if (caster.isPlayer() && !instantCast)
|
||||||
@@ -575,6 +586,12 @@ public class SkillCaster implements Runnable
|
|||||||
// On each repeat recharge shots before cast.
|
// On each repeat recharge shots before cast.
|
||||||
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
||||||
|
|
||||||
|
// Reset current skill world position.
|
||||||
|
if (caster.isPlayer())
|
||||||
|
{
|
||||||
|
caster.getActingPlayer().setCurrentSkillWorldPosition(null);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-25
@@ -23,14 +23,12 @@ import java.util.List;
|
|||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
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.model.skill.SkillCastingType;
|
||||||
import org.l2jmobius.gameserver.network.ServerPackets;
|
import org.l2jmobius.gameserver.network.ServerPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagicSkillUse server packet implementation.
|
* MagicSkillUse server packet implementation.
|
||||||
* @author UnAfraid, NosBit
|
* @author UnAfraid, NosBit, Mobius
|
||||||
*/
|
*/
|
||||||
public class MagicSkillUse extends ServerPacket
|
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 SkillCastingType _castingType; // Defines which client bar is going to use.
|
||||||
private final Creature _creature;
|
private final Creature _creature;
|
||||||
private final WorldObject _target;
|
private final WorldObject _target;
|
||||||
private final List<Integer> _unknown = Collections.emptyList();
|
private final boolean _isGroundTargetSkill;
|
||||||
private final List<Location> _groundLocations;
|
private final List<Location> _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;
|
_creature = creature;
|
||||||
_target = target;
|
_target = target;
|
||||||
_skillId = skillId;
|
_skillId = skillId;
|
||||||
@@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket
|
|||||||
_reuseDelay = reuseDelay;
|
_reuseDelay = reuseDelay;
|
||||||
_actionId = actionId;
|
_actionId = actionId;
|
||||||
_castingType = castingType;
|
_castingType = castingType;
|
||||||
Location skillWorldPos = null;
|
_isGroundTargetSkill = isGroundTargetSkill;
|
||||||
if (creature.isPlayer())
|
final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null;
|
||||||
{
|
|
||||||
final Player player = creature.getActingPlayer();
|
|
||||||
if (player.getCurrentSkillWorldPosition() != null)
|
|
||||||
{
|
|
||||||
skillWorldPos = player.getCurrentSkillWorldPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList();
|
_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)
|
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);
|
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.getX());
|
||||||
writeInt(_creature.getY());
|
writeInt(_creature.getY());
|
||||||
writeInt(_creature.getZ());
|
writeInt(_creature.getZ());
|
||||||
writeShort(_unknown.size()); // TODO: Implement me!
|
writeShort(_isGroundTargetSkill ? 64 : 0);
|
||||||
for (int unknown : _unknown)
|
|
||||||
{
|
|
||||||
writeShort(unknown);
|
|
||||||
}
|
|
||||||
writeShort(_groundLocations.size());
|
writeShort(_groundLocations.size());
|
||||||
for (IPositionable target : _groundLocations)
|
for (Location location : _groundLocations)
|
||||||
{
|
{
|
||||||
writeInt(target.getX());
|
writeInt(location.getX());
|
||||||
writeInt(target.getY());
|
writeInt(location.getY());
|
||||||
writeInt(target.getZ());
|
writeInt(location.getZ());
|
||||||
}
|
}
|
||||||
writeInt(_target.getX());
|
writeInt(_target.getX());
|
||||||
writeInt(_target.getY());
|
writeInt(_target.getY());
|
||||||
writeInt(_target.getZ());
|
writeInt(_target.getZ());
|
||||||
writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used
|
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(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills.
|
||||||
writeInt(-1); // 306
|
if (_groundLocations.isEmpty())
|
||||||
|
{
|
||||||
|
writeInt(-1); // 306
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-11
@@ -10,17 +10,18 @@
|
|||||||
<affectRange>250</affectRange>
|
<affectRange>250</affectRange>
|
||||||
<fanRange>0;0;250;60</fanRange>
|
<fanRange>0;0;250;60</fanRange>
|
||||||
<effectRange>1100</effectRange>
|
<effectRange>1100</effectRange>
|
||||||
<nextAction>ATTACK</nextAction>
|
|
||||||
<magicLevel>80</magicLevel>
|
<magicLevel>80</magicLevel>
|
||||||
<isMagic>6</isMagic>
|
<isMagic>0</isMagic>
|
||||||
<mpConsume>500</mpConsume>
|
<mpConsume>500</mpConsume>
|
||||||
<hitTime>1000</hitTime>
|
<hitTime>1000</hitTime>
|
||||||
<operateType>A1</operateType>
|
<operateType>A1</operateType>
|
||||||
<reuseDelay>60000</reuseDelay>
|
<reuseDelay>60000</reuseDelay>
|
||||||
|
<staticReuse>true</staticReuse>
|
||||||
<magicCriticalRate>5</magicCriticalRate>
|
<magicCriticalRate>5</magicCriticalRate>
|
||||||
<targetType>ENEMY</targetType>
|
<targetType>GROUND</targetType>
|
||||||
<affectScope>SINGLE</affectScope>
|
<affectScope>FAN_PB</affectScope>
|
||||||
<affectObject>NOT_FRIEND</affectObject>
|
<affectObject>NOT_FRIEND</affectObject>
|
||||||
|
<fanRange>0;0;900;20</fanRange>
|
||||||
<conditions>
|
<conditions>
|
||||||
<condition name="EquipWeapon">
|
<condition name="EquipWeapon">
|
||||||
<weaponType>
|
<weaponType>
|
||||||
@@ -29,6 +30,10 @@
|
|||||||
</condition>
|
</condition>
|
||||||
</conditions>
|
</conditions>
|
||||||
<effects>
|
<effects>
|
||||||
|
<effect name="PhysicalAttack">
|
||||||
|
<power>8000</power>
|
||||||
|
<pDefMod>0.5</pDefMod>
|
||||||
|
</effect>
|
||||||
<effect name="CallSkill">
|
<effect name="CallSkill">
|
||||||
<skillId>47020</skillId> <!-- Goring Charge -->
|
<skillId>47020</skillId> <!-- Goring Charge -->
|
||||||
<skillLevel>1</skillLevel>
|
<skillLevel>1</skillLevel>
|
||||||
@@ -1112,20 +1117,29 @@
|
|||||||
<activateRate>100</activateRate>
|
<activateRate>100</activateRate>
|
||||||
<magicLevel>80</magicLevel>
|
<magicLevel>80</magicLevel>
|
||||||
<isDebuff>true</isDebuff>
|
<isDebuff>true</isDebuff>
|
||||||
<trait>SHOCK</trait>
|
<targetType>GROUND</targetType>
|
||||||
<targetType>ENEMY</targetType>
|
<fanRange>0;0;600;60</fanRange>
|
||||||
<affectScope>SQUARE</affectScope>
|
<affectScope>FAN</affectScope>
|
||||||
<affectObject>NOT_FRIEND</affectObject>
|
<affectObject>NOT_FRIEND</affectObject>
|
||||||
|
<conditions>
|
||||||
|
<condition name="EquipWeapon">
|
||||||
|
<weaponType>
|
||||||
|
<item>PISTOLS</item>
|
||||||
|
</weaponType>
|
||||||
|
</condition>
|
||||||
|
</conditions>
|
||||||
<effects>
|
<effects>
|
||||||
<effect name="PhysicalAttack">
|
|
||||||
<power>8000</power>
|
|
||||||
<pDefMod>0.5</pDefMod>
|
|
||||||
</effect>
|
|
||||||
<effect name="KnockBack">
|
<effect name="KnockBack">
|
||||||
<distance>50</distance>
|
<distance>50</distance>
|
||||||
<speed>400</speed>
|
<speed>400</speed>
|
||||||
<knockDown>true</knockDown>
|
<knockDown>true</knockDown>
|
||||||
</effect>
|
</effect>
|
||||||
|
<effect name="DefenceTrait">
|
||||||
|
<DERANGEMENT>100</DERANGEMENT>
|
||||||
|
<SLEEP>100</SLEEP>
|
||||||
|
<HOLD>100</HOLD>
|
||||||
|
<SHOCK>100</SHOCK>
|
||||||
|
</effect>
|
||||||
<effect name="BlockActions">
|
<effect name="BlockActions">
|
||||||
<allowedSkills>10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190</allowedSkills>
|
<allowedSkills>10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190</allowedSkills>
|
||||||
</effect>
|
</effect>
|
||||||
|
|||||||
+11
@@ -8658,6 +8658,17 @@ public class Player extends Playable
|
|||||||
final Location worldPosition = _currentSkillWorldPosition;
|
final Location worldPosition = _currentSkillWorldPosition;
|
||||||
if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null))
|
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);
|
sendPacket(ActionFailed.STATIC_PACKET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.model.stats.Stat;
|
|||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
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.ExRotation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
||||||
@@ -345,6 +346,16 @@ public class SkillCaster implements Runnable
|
|||||||
if (!_skill.isNotBroadcastable())
|
if (!_skill.isNotBroadcastable())
|
||||||
{
|
{
|
||||||
caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType));
|
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)
|
if (caster.isPlayer() && !instantCast)
|
||||||
@@ -575,6 +586,12 @@ public class SkillCaster implements Runnable
|
|||||||
// On each repeat recharge shots before cast.
|
// On each repeat recharge shots before cast.
|
||||||
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
||||||
|
|
||||||
|
// Reset current skill world position.
|
||||||
|
if (caster.isPlayer())
|
||||||
|
{
|
||||||
|
caster.getActingPlayer().setCurrentSkillWorldPosition(null);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-25
@@ -23,14 +23,12 @@ import java.util.List;
|
|||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
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.model.skill.SkillCastingType;
|
||||||
import org.l2jmobius.gameserver.network.ServerPackets;
|
import org.l2jmobius.gameserver.network.ServerPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagicSkillUse server packet implementation.
|
* MagicSkillUse server packet implementation.
|
||||||
* @author UnAfraid, NosBit
|
* @author UnAfraid, NosBit, Mobius
|
||||||
*/
|
*/
|
||||||
public class MagicSkillUse extends ServerPacket
|
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 SkillCastingType _castingType; // Defines which client bar is going to use.
|
||||||
private final Creature _creature;
|
private final Creature _creature;
|
||||||
private final WorldObject _target;
|
private final WorldObject _target;
|
||||||
private final List<Integer> _unknown = Collections.emptyList();
|
private final boolean _isGroundTargetSkill;
|
||||||
private final List<Location> _groundLocations;
|
private final List<Location> _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;
|
_creature = creature;
|
||||||
_target = target;
|
_target = target;
|
||||||
_skillId = skillId;
|
_skillId = skillId;
|
||||||
@@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket
|
|||||||
_reuseDelay = reuseDelay;
|
_reuseDelay = reuseDelay;
|
||||||
_actionId = actionId;
|
_actionId = actionId;
|
||||||
_castingType = castingType;
|
_castingType = castingType;
|
||||||
Location skillWorldPos = null;
|
_isGroundTargetSkill = isGroundTargetSkill;
|
||||||
if (creature.isPlayer())
|
final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null;
|
||||||
{
|
|
||||||
final Player player = creature.getActingPlayer();
|
|
||||||
if (player.getCurrentSkillWorldPosition() != null)
|
|
||||||
{
|
|
||||||
skillWorldPos = player.getCurrentSkillWorldPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList();
|
_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)
|
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);
|
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.getX());
|
||||||
writeInt(_creature.getY());
|
writeInt(_creature.getY());
|
||||||
writeInt(_creature.getZ());
|
writeInt(_creature.getZ());
|
||||||
writeShort(_unknown.size()); // TODO: Implement me!
|
writeShort(_isGroundTargetSkill ? 64 : 0);
|
||||||
for (int unknown : _unknown)
|
|
||||||
{
|
|
||||||
writeShort(unknown);
|
|
||||||
}
|
|
||||||
writeShort(_groundLocations.size());
|
writeShort(_groundLocations.size());
|
||||||
for (IPositionable target : _groundLocations)
|
for (Location location : _groundLocations)
|
||||||
{
|
{
|
||||||
writeInt(target.getX());
|
writeInt(location.getX());
|
||||||
writeInt(target.getY());
|
writeInt(location.getY());
|
||||||
writeInt(target.getZ());
|
writeInt(location.getZ());
|
||||||
}
|
}
|
||||||
writeInt(_target.getX());
|
writeInt(_target.getX());
|
||||||
writeInt(_target.getY());
|
writeInt(_target.getY());
|
||||||
writeInt(_target.getZ());
|
writeInt(_target.getZ());
|
||||||
writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used
|
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(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills.
|
||||||
writeInt(-1); // 306
|
if (_groundLocations.isEmpty())
|
||||||
|
{
|
||||||
|
writeInt(-1); // 306
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-11
@@ -10,17 +10,18 @@
|
|||||||
<affectRange>250</affectRange>
|
<affectRange>250</affectRange>
|
||||||
<fanRange>0;0;250;60</fanRange>
|
<fanRange>0;0;250;60</fanRange>
|
||||||
<effectRange>1100</effectRange>
|
<effectRange>1100</effectRange>
|
||||||
<nextAction>ATTACK</nextAction>
|
|
||||||
<magicLevel>80</magicLevel>
|
<magicLevel>80</magicLevel>
|
||||||
<isMagic>6</isMagic>
|
<isMagic>0</isMagic>
|
||||||
<mpConsume>500</mpConsume>
|
<mpConsume>500</mpConsume>
|
||||||
<hitTime>1000</hitTime>
|
<hitTime>1000</hitTime>
|
||||||
<operateType>A1</operateType>
|
<operateType>A1</operateType>
|
||||||
<reuseDelay>60000</reuseDelay>
|
<reuseDelay>60000</reuseDelay>
|
||||||
|
<staticReuse>true</staticReuse>
|
||||||
<magicCriticalRate>5</magicCriticalRate>
|
<magicCriticalRate>5</magicCriticalRate>
|
||||||
<targetType>ENEMY</targetType>
|
<targetType>GROUND</targetType>
|
||||||
<affectScope>SINGLE</affectScope>
|
<affectScope>FAN_PB</affectScope>
|
||||||
<affectObject>NOT_FRIEND</affectObject>
|
<affectObject>NOT_FRIEND</affectObject>
|
||||||
|
<fanRange>0;0;900;20</fanRange>
|
||||||
<conditions>
|
<conditions>
|
||||||
<condition name="EquipWeapon">
|
<condition name="EquipWeapon">
|
||||||
<weaponType>
|
<weaponType>
|
||||||
@@ -29,6 +30,10 @@
|
|||||||
</condition>
|
</condition>
|
||||||
</conditions>
|
</conditions>
|
||||||
<effects>
|
<effects>
|
||||||
|
<effect name="PhysicalAttack">
|
||||||
|
<power>8000</power>
|
||||||
|
<pDefMod>0.5</pDefMod>
|
||||||
|
</effect>
|
||||||
<effect name="CallSkill">
|
<effect name="CallSkill">
|
||||||
<skillId>47020</skillId> <!-- Goring Charge -->
|
<skillId>47020</skillId> <!-- Goring Charge -->
|
||||||
<skillLevel>1</skillLevel>
|
<skillLevel>1</skillLevel>
|
||||||
@@ -1112,20 +1117,29 @@
|
|||||||
<activateRate>100</activateRate>
|
<activateRate>100</activateRate>
|
||||||
<magicLevel>80</magicLevel>
|
<magicLevel>80</magicLevel>
|
||||||
<isDebuff>true</isDebuff>
|
<isDebuff>true</isDebuff>
|
||||||
<trait>SHOCK</trait>
|
<targetType>GROUND</targetType>
|
||||||
<targetType>ENEMY</targetType>
|
<fanRange>0;0;600;60</fanRange>
|
||||||
<affectScope>SQUARE</affectScope>
|
<affectScope>FAN</affectScope>
|
||||||
<affectObject>NOT_FRIEND</affectObject>
|
<affectObject>NOT_FRIEND</affectObject>
|
||||||
|
<conditions>
|
||||||
|
<condition name="EquipWeapon">
|
||||||
|
<weaponType>
|
||||||
|
<item>PISTOLS</item>
|
||||||
|
</weaponType>
|
||||||
|
</condition>
|
||||||
|
</conditions>
|
||||||
<effects>
|
<effects>
|
||||||
<effect name="PhysicalAttack">
|
|
||||||
<power>8000</power>
|
|
||||||
<pDefMod>0.5</pDefMod>
|
|
||||||
</effect>
|
|
||||||
<effect name="KnockBack">
|
<effect name="KnockBack">
|
||||||
<distance>50</distance>
|
<distance>50</distance>
|
||||||
<speed>400</speed>
|
<speed>400</speed>
|
||||||
<knockDown>true</knockDown>
|
<knockDown>true</knockDown>
|
||||||
</effect>
|
</effect>
|
||||||
|
<effect name="DefenceTrait">
|
||||||
|
<DERANGEMENT>100</DERANGEMENT>
|
||||||
|
<SLEEP>100</SLEEP>
|
||||||
|
<HOLD>100</HOLD>
|
||||||
|
<SHOCK>100</SHOCK>
|
||||||
|
</effect>
|
||||||
<effect name="BlockActions">
|
<effect name="BlockActions">
|
||||||
<allowedSkills>10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190</allowedSkills>
|
<allowedSkills>10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190</allowedSkills>
|
||||||
</effect>
|
</effect>
|
||||||
|
|||||||
@@ -8903,6 +8903,17 @@ public class Player extends Playable
|
|||||||
final Location worldPosition = _currentSkillWorldPosition;
|
final Location worldPosition = _currentSkillWorldPosition;
|
||||||
if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null))
|
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);
|
sendPacket(ActionFailed.STATIC_PACKET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.model.stats.Stat;
|
|||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
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.ExRotation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
||||||
@@ -345,6 +346,16 @@ public class SkillCaster implements Runnable
|
|||||||
if (!_skill.isNotBroadcastable())
|
if (!_skill.isNotBroadcastable())
|
||||||
{
|
{
|
||||||
caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType));
|
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)
|
if (caster.isPlayer() && !instantCast)
|
||||||
@@ -575,6 +586,12 @@ public class SkillCaster implements Runnable
|
|||||||
// On each repeat recharge shots before cast.
|
// On each repeat recharge shots before cast.
|
||||||
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
||||||
|
|
||||||
|
// Reset current skill world position.
|
||||||
|
if (caster.isPlayer())
|
||||||
|
{
|
||||||
|
caster.getActingPlayer().setCurrentSkillWorldPosition(null);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-25
@@ -23,14 +23,12 @@ import java.util.List;
|
|||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
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.model.skill.SkillCastingType;
|
||||||
import org.l2jmobius.gameserver.network.ServerPackets;
|
import org.l2jmobius.gameserver.network.ServerPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagicSkillUse server packet implementation.
|
* MagicSkillUse server packet implementation.
|
||||||
* @author UnAfraid, NosBit
|
* @author UnAfraid, NosBit, Mobius
|
||||||
*/
|
*/
|
||||||
public class MagicSkillUse extends ServerPacket
|
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 SkillCastingType _castingType; // Defines which client bar is going to use.
|
||||||
private final Creature _creature;
|
private final Creature _creature;
|
||||||
private final WorldObject _target;
|
private final WorldObject _target;
|
||||||
private final List<Integer> _unknown = Collections.emptyList();
|
private final boolean _isGroundTargetSkill;
|
||||||
private final List<Location> _groundLocations;
|
private final List<Location> _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;
|
_creature = creature;
|
||||||
_target = target;
|
_target = target;
|
||||||
_skillId = skillId;
|
_skillId = skillId;
|
||||||
@@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket
|
|||||||
_reuseDelay = reuseDelay;
|
_reuseDelay = reuseDelay;
|
||||||
_actionId = actionId;
|
_actionId = actionId;
|
||||||
_castingType = castingType;
|
_castingType = castingType;
|
||||||
Location skillWorldPos = null;
|
_isGroundTargetSkill = isGroundTargetSkill;
|
||||||
if (creature.isPlayer())
|
final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null;
|
||||||
{
|
|
||||||
final Player player = creature.getActingPlayer();
|
|
||||||
if (player.getCurrentSkillWorldPosition() != null)
|
|
||||||
{
|
|
||||||
skillWorldPos = player.getCurrentSkillWorldPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList();
|
_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)
|
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);
|
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.getX());
|
||||||
writeInt(_creature.getY());
|
writeInt(_creature.getY());
|
||||||
writeInt(_creature.getZ());
|
writeInt(_creature.getZ());
|
||||||
writeShort(_unknown.size()); // TODO: Implement me!
|
writeShort(_isGroundTargetSkill ? 64 : 0);
|
||||||
for (int unknown : _unknown)
|
|
||||||
{
|
|
||||||
writeShort(unknown);
|
|
||||||
}
|
|
||||||
writeShort(_groundLocations.size());
|
writeShort(_groundLocations.size());
|
||||||
for (IPositionable target : _groundLocations)
|
for (Location location : _groundLocations)
|
||||||
{
|
{
|
||||||
writeInt(target.getX());
|
writeInt(location.getX());
|
||||||
writeInt(target.getY());
|
writeInt(location.getY());
|
||||||
writeInt(target.getZ());
|
writeInt(location.getZ());
|
||||||
}
|
}
|
||||||
writeInt(_target.getX());
|
writeInt(_target.getX());
|
||||||
writeInt(_target.getY());
|
writeInt(_target.getY());
|
||||||
writeInt(_target.getZ());
|
writeInt(_target.getZ());
|
||||||
writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used
|
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(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills.
|
||||||
writeInt(-1); // 306
|
if (_groundLocations.isEmpty())
|
||||||
|
{
|
||||||
|
writeInt(-1); // 306
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-11
@@ -10,17 +10,18 @@
|
|||||||
<affectRange>250</affectRange>
|
<affectRange>250</affectRange>
|
||||||
<fanRange>0;0;250;60</fanRange>
|
<fanRange>0;0;250;60</fanRange>
|
||||||
<effectRange>1100</effectRange>
|
<effectRange>1100</effectRange>
|
||||||
<nextAction>ATTACK</nextAction>
|
|
||||||
<magicLevel>80</magicLevel>
|
<magicLevel>80</magicLevel>
|
||||||
<isMagic>6</isMagic>
|
<isMagic>0</isMagic>
|
||||||
<mpConsume>500</mpConsume>
|
<mpConsume>500</mpConsume>
|
||||||
<hitTime>1000</hitTime>
|
<hitTime>1000</hitTime>
|
||||||
<operateType>A1</operateType>
|
<operateType>A1</operateType>
|
||||||
<reuseDelay>60000</reuseDelay>
|
<reuseDelay>60000</reuseDelay>
|
||||||
|
<staticReuse>true</staticReuse>
|
||||||
<magicCriticalRate>5</magicCriticalRate>
|
<magicCriticalRate>5</magicCriticalRate>
|
||||||
<targetType>ENEMY</targetType>
|
<targetType>GROUND</targetType>
|
||||||
<affectScope>SINGLE</affectScope>
|
<affectScope>FAN_PB</affectScope>
|
||||||
<affectObject>NOT_FRIEND</affectObject>
|
<affectObject>NOT_FRIEND</affectObject>
|
||||||
|
<fanRange>0;0;900;20</fanRange>
|
||||||
<conditions>
|
<conditions>
|
||||||
<condition name="EquipWeapon">
|
<condition name="EquipWeapon">
|
||||||
<weaponType>
|
<weaponType>
|
||||||
@@ -29,6 +30,10 @@
|
|||||||
</condition>
|
</condition>
|
||||||
</conditions>
|
</conditions>
|
||||||
<effects>
|
<effects>
|
||||||
|
<effect name="PhysicalAttack">
|
||||||
|
<power>8000</power>
|
||||||
|
<pDefMod>0.5</pDefMod>
|
||||||
|
</effect>
|
||||||
<effect name="CallSkill">
|
<effect name="CallSkill">
|
||||||
<skillId>47020</skillId> <!-- Goring Charge -->
|
<skillId>47020</skillId> <!-- Goring Charge -->
|
||||||
<skillLevel>1</skillLevel>
|
<skillLevel>1</skillLevel>
|
||||||
@@ -1621,20 +1626,29 @@
|
|||||||
<activateRate>100</activateRate>
|
<activateRate>100</activateRate>
|
||||||
<magicLevel>80</magicLevel>
|
<magicLevel>80</magicLevel>
|
||||||
<isDebuff>true</isDebuff>
|
<isDebuff>true</isDebuff>
|
||||||
<trait>SHOCK</trait>
|
<targetType>GROUND</targetType>
|
||||||
<targetType>ENEMY</targetType>
|
<fanRange>0;0;600;60</fanRange>
|
||||||
<affectScope>SQUARE</affectScope>
|
<affectScope>FAN</affectScope>
|
||||||
<affectObject>NOT_FRIEND</affectObject>
|
<affectObject>NOT_FRIEND</affectObject>
|
||||||
|
<conditions>
|
||||||
|
<condition name="EquipWeapon">
|
||||||
|
<weaponType>
|
||||||
|
<item>PISTOLS</item>
|
||||||
|
</weaponType>
|
||||||
|
</condition>
|
||||||
|
</conditions>
|
||||||
<effects>
|
<effects>
|
||||||
<effect name="PhysicalAttack">
|
|
||||||
<power>8000</power>
|
|
||||||
<pDefMod>0.5</pDefMod>
|
|
||||||
</effect>
|
|
||||||
<effect name="KnockBack">
|
<effect name="KnockBack">
|
||||||
<distance>50</distance>
|
<distance>50</distance>
|
||||||
<speed>400</speed>
|
<speed>400</speed>
|
||||||
<knockDown>true</knockDown>
|
<knockDown>true</knockDown>
|
||||||
</effect>
|
</effect>
|
||||||
|
<effect name="DefenceTrait">
|
||||||
|
<DERANGEMENT>100</DERANGEMENT>
|
||||||
|
<SLEEP>100</SLEEP>
|
||||||
|
<HOLD>100</HOLD>
|
||||||
|
<SHOCK>100</SHOCK>
|
||||||
|
</effect>
|
||||||
<effect name="BlockActions">
|
<effect name="BlockActions">
|
||||||
<allowedSkills>10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190</allowedSkills>
|
<allowedSkills>10279;10517;10025;10776;11770;1904;11264;11093;13314;1912;7002;18721;18722;28203;30516;35190</allowedSkills>
|
||||||
</effect>
|
</effect>
|
||||||
|
|||||||
@@ -8903,6 +8903,17 @@ public class Player extends Playable
|
|||||||
final Location worldPosition = _currentSkillWorldPosition;
|
final Location worldPosition = _currentSkillWorldPosition;
|
||||||
if ((usedSkill.getTargetType() == TargetType.GROUND) && (worldPosition == null))
|
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);
|
sendPacket(ActionFailed.STATIC_PACKET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.model.stats.Stat;
|
|||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
|
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.ExRotation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
import org.l2jmobius.gameserver.network.serverpackets.FlyToLocation;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
|
||||||
@@ -345,6 +346,16 @@ public class SkillCaster implements Runnable
|
|||||||
if (!_skill.isNotBroadcastable())
|
if (!_skill.isNotBroadcastable())
|
||||||
{
|
{
|
||||||
caster.broadcastPacket(new MagicSkillUse(caster, target, _skill.getDisplayId(), _skill.getDisplayLevel(), displayedCastTime, reuseDelay, _skill.getReuseDelayGroup(), actionId, _castingType));
|
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)
|
if (caster.isPlayer() && !instantCast)
|
||||||
@@ -575,6 +586,12 @@ public class SkillCaster implements Runnable
|
|||||||
// On each repeat recharge shots before cast.
|
// On each repeat recharge shots before cast.
|
||||||
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
caster.rechargeShots(_skill.useSoulShot(), _skill.useSpiritShot(), false);
|
||||||
|
|
||||||
|
// Reset current skill world position.
|
||||||
|
if (caster.isPlayer())
|
||||||
|
{
|
||||||
|
caster.getActingPlayer().setCurrentSkillWorldPosition(null);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-25
@@ -23,14 +23,12 @@ import java.util.List;
|
|||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
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.model.skill.SkillCastingType;
|
||||||
import org.l2jmobius.gameserver.network.ServerPackets;
|
import org.l2jmobius.gameserver.network.ServerPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagicSkillUse server packet implementation.
|
* MagicSkillUse server packet implementation.
|
||||||
* @author UnAfraid, NosBit
|
* @author UnAfraid, NosBit, Mobius
|
||||||
*/
|
*/
|
||||||
public class MagicSkillUse extends ServerPacket
|
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 SkillCastingType _castingType; // Defines which client bar is going to use.
|
||||||
private final Creature _creature;
|
private final Creature _creature;
|
||||||
private final WorldObject _target;
|
private final WorldObject _target;
|
||||||
private final List<Integer> _unknown = Collections.emptyList();
|
private final boolean _isGroundTargetSkill;
|
||||||
private final List<Location> _groundLocations;
|
private final List<Location> _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;
|
_creature = creature;
|
||||||
_target = target;
|
_target = target;
|
||||||
_skillId = skillId;
|
_skillId = skillId;
|
||||||
@@ -58,18 +56,16 @@ public class MagicSkillUse extends ServerPacket
|
|||||||
_reuseDelay = reuseDelay;
|
_reuseDelay = reuseDelay;
|
||||||
_actionId = actionId;
|
_actionId = actionId;
|
||||||
_castingType = castingType;
|
_castingType = castingType;
|
||||||
Location skillWorldPos = null;
|
_isGroundTargetSkill = isGroundTargetSkill;
|
||||||
if (creature.isPlayer())
|
final Location skillWorldPos = creature.isPlayer() ? creature.getActingPlayer().getCurrentSkillWorldPosition() : null;
|
||||||
{
|
|
||||||
final Player player = creature.getActingPlayer();
|
|
||||||
if (player.getCurrentSkillWorldPosition() != null)
|
|
||||||
{
|
|
||||||
skillWorldPos = player.getCurrentSkillWorldPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_groundLocations = skillWorldPos != null ? Arrays.asList(skillWorldPos) : Collections.emptyList();
|
_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)
|
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);
|
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.getX());
|
||||||
writeInt(_creature.getY());
|
writeInt(_creature.getY());
|
||||||
writeInt(_creature.getZ());
|
writeInt(_creature.getZ());
|
||||||
writeShort(_unknown.size()); // TODO: Implement me!
|
writeShort(_isGroundTargetSkill ? 64 : 0);
|
||||||
for (int unknown : _unknown)
|
|
||||||
{
|
|
||||||
writeShort(unknown);
|
|
||||||
}
|
|
||||||
writeShort(_groundLocations.size());
|
writeShort(_groundLocations.size());
|
||||||
for (IPositionable target : _groundLocations)
|
for (Location location : _groundLocations)
|
||||||
{
|
{
|
||||||
writeInt(target.getX());
|
writeInt(location.getX());
|
||||||
writeInt(target.getY());
|
writeInt(location.getY());
|
||||||
writeInt(target.getZ());
|
writeInt(location.getZ());
|
||||||
}
|
}
|
||||||
writeInt(_target.getX());
|
writeInt(_target.getX());
|
||||||
writeInt(_target.getY());
|
writeInt(_target.getY());
|
||||||
writeInt(_target.getZ());
|
writeInt(_target.getZ());
|
||||||
writeInt(_actionId >= 0); // 1 when ID from RequestActionUse is used
|
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(_actionId >= 0 ? _actionId : 0); // ID from RequestActionUse. Used to set cooldown on summon skills.
|
||||||
writeInt(-1); // 306
|
if (_groundLocations.isEmpty())
|
||||||
|
{
|
||||||
|
writeInt(-1); // 306
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user