From ccdadf1dab152cbf5ed8a533ac47f7d80dbf6637 Mon Sep 17 00:00:00 2001 From: Avi Weinstock Date: Wed, 23 Feb 2022 13:32:56 +0000 Subject: [PATCH] Fixed cannons spamming chat about how you're already in combat or that they can't attack your familiar Improved nechryaels' death spawn multicombat handling DFS now works on skeletal wyverns' ice breath --- .../activity/gwd/GWDGraardorSwingHandler.java | 4 +-- .../activity/gwd/GWDKreeArraSwingHandler.java | 4 +-- .../activity/gwd/GWDZilyanaSwingHandler.java | 4 +-- .../activity/gwd/GodWarsMinionNPC.java | 8 +++-- .../game/content/activity/gwd/GodWarsNPC.java | 8 +++-- .../content/activity/gwd/GodwarsBossNPC.java | 8 +++-- .../activity/magearena/KolodionNPC.java | 2 +- .../activity/pestcontrol/PCSquireNPC.java | 2 +- .../pyramidplunder/PyramidPlunderNPC.java | 4 +-- .../wguild/animator/AnimatedArmour.java | 4 +-- .../content/cutscene/DBRCutscenePlugin.java | 2 +- .../holiday/christmas/ChristmasEvent.java | 6 ++-- .../quest/free/dragonslayer/ElvargNPC.java | 24 ++++++++------- .../quest/free/dragonslayer/WormbrainNPC.java | 8 +++-- .../therestlessghost/RestlessGhostPlugin.java | 2 +- .../quest/members/lostcity/TreeSpiritNPC.java | 4 +-- .../witchshouse/WitchsExperimentNPC.java | 2 +- .../content/ttrail/SaradominWizardNPC.java | 4 +-- .../java/core/game/content/ttrail/UriNPC.java | 4 +-- .../game/content/ttrail/ZamorakWizardNPC.java | 4 +-- .../zone/wbisland/WaterBirthDungeonZone.java | 6 ++-- .../interaction/object/PyreSitePlugin.java | 8 +++-- .../interaction/object/dmc/DMCHandler.java | 2 +- .../java/core/game/node/entity/Entity.java | 7 +++-- .../special/ChainhitSpecialHandler.java | 2 +- .../game/node/entity/npc/IdleAbstractNPC.java | 10 ++++--- .../java/core/game/node/entity/npc/NPC.java | 8 +++-- .../node/entity/npc/bosses/GiantMoleNPC.java | 4 +-- .../entity/npc/bosses/KalphiteQueenNPC.java | 2 +- .../game/node/entity/npc/other/BorkNPC.java | 2 +- .../node/entity/npc/other/GraveStoneNPC.java | 2 +- .../entity/npc/other/VampireSlayerNPC.java | 2 +- .../quest/pirates_treasure/GardenerNPC.java | 4 +-- .../node/entity/npc/revenant/RevenantNPC.java | 10 ++++--- .../core/game/node/entity/player/Player.java | 6 ++-- .../entity/player/link/prayer/Prayer.java | 2 +- .../node/entity/skill/hunter/ImplingNPC.java | 4 +-- .../skill/slayer/FishingExplosivePlugin.java | 4 +-- .../entity/skill/slayer/NechryaelNPC.java | 14 ++++++--- .../skill/summoning/familiar/Familiar.java | 30 ++++++++++++------- .../core/game/world/map/zone/ZoneMonitor.java | 12 ++++---- .../quest/members/familycrest/ChronozonNPC.kt | 4 +-- .../game/node/entity/combat/CombatPulse.kt | 2 +- .../skill/hunter/pitfall/HunterPitfall.kt | 2 +- 44 files changed, 150 insertions(+), 107 deletions(-) diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java index 8d5fbf21b..7e91dc4c0 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java @@ -71,7 +71,7 @@ public final class GWDGraardorSwingHandler extends CombatSwingHandler { if (!CHAMBER.insideBorder(t.getLocation())) { continue; } - if (t.isAttackable(npc, CombatStyle.RANGE)) { + if (t.isAttackable(npc, CombatStyle.RANGE, false)) { list.add(new BattleState(entity, t)); } } @@ -180,4 +180,4 @@ public final class GWDGraardorSwingHandler extends CombatSwingHandler { else return -1; } -} \ No newline at end of file +} diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java index 77d0a50a8..ce7052a52 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java @@ -87,7 +87,7 @@ public final class GWDKreeArraSwingHandler extends CombatSwingHandler { if (!CHAMBER.insideBorder(t.getLocation())) { continue; } - if (t.isAttackable(npc, CombatStyle.RANGE)) { + if (t.isAttackable(npc, CombatStyle.RANGE, false)) { list.add(new BattleState(entity, t)); } } @@ -214,4 +214,4 @@ public final class GWDKreeArraSwingHandler extends CombatSwingHandler { else return -1; } -} \ No newline at end of file +} diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java index 1dec4fb03..b4d721d8a 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java @@ -60,7 +60,7 @@ public class GWDZilyanaSwingHandler extends CombatSwingHandler { NPC npc = (NPC) entity; List list = new ArrayList<>(20); for (Entity t : RegionManager.getLocalPlayers(npc.getCenterLocation(), (npc.size() >> 1) + 2)) { - if (t.getLocation().getX() < 2908 && t.isAttackable(npc, CombatStyle.MAGIC)) { + if (t.getLocation().getX() < 2908 && t.isAttackable(npc, CombatStyle.MAGIC, false)) { list.add(new BattleState(entity, t)); } } @@ -157,4 +157,4 @@ public class GWDZilyanaSwingHandler extends CombatSwingHandler { state.getStyle().getSwingHandler().visualizeImpact(entity, victim, state); } -} \ No newline at end of file +} diff --git a/Server/src/main/java/core/game/content/activity/gwd/GodWarsMinionNPC.java b/Server/src/main/java/core/game/content/activity/gwd/GodWarsMinionNPC.java index ca2e69964..cf6be3905 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GodWarsMinionNPC.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GodWarsMinionNPC.java @@ -84,12 +84,14 @@ public final class GodWarsMinionNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (boss != null && boss.getId() == 6222 && style == CombatStyle.MELEE && entity instanceof Player) { - ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + } return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/activity/gwd/GodWarsNPC.java b/Server/src/main/java/core/game/content/activity/gwd/GodWarsNPC.java index 29e2d3ca5..a2778377b 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GodWarsNPC.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GodWarsNPC.java @@ -102,12 +102,14 @@ public final class GodWarsNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (style == CombatStyle.MELEE && faction == GodWarsFaction.ARMADYL && entity instanceof Player) { - ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + } return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/activity/gwd/GodwarsBossNPC.java b/Server/src/main/java/core/game/content/activity/gwd/GodwarsBossNPC.java index 99d92a8a9..2ab79ab6b 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GodwarsBossNPC.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GodwarsBossNPC.java @@ -244,12 +244,14 @@ public final class GodwarsBossNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (getId() == 6222 && style == CombatStyle.MELEE && entity instanceof Player) { - ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + } return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } /** diff --git a/Server/src/main/java/core/game/content/activity/magearena/KolodionNPC.java b/Server/src/main/java/core/game/content/activity/magearena/KolodionNPC.java index 98c808d5a..b5c26b813 100644 --- a/Server/src/main/java/core/game/content/activity/magearena/KolodionNPC.java +++ b/Server/src/main/java/core/game/content/activity/magearena/KolodionNPC.java @@ -126,7 +126,7 @@ public final class KolodionNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (style != CombatStyle.MAGIC) { return false; } diff --git a/Server/src/main/java/core/game/content/activity/pestcontrol/PCSquireNPC.java b/Server/src/main/java/core/game/content/activity/pestcontrol/PCSquireNPC.java index f237a506e..45ca92029 100644 --- a/Server/src/main/java/core/game/content/activity/pestcontrol/PCSquireNPC.java +++ b/Server/src/main/java/core/game/content/activity/pestcontrol/PCSquireNPC.java @@ -47,7 +47,7 @@ public final class PCSquireNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (DeathTask.isDead(this) || entity instanceof Player) { return false; } diff --git a/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java b/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java index 4b062cb62..abbd96dae 100644 --- a/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java +++ b/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java @@ -115,12 +115,12 @@ public abstract class PyramidPlunderNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity instanceof Player && entity != player) { ((Player) entity).getPacketDispatch().sendMessage("It's not after you."); return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/activity/wguild/animator/AnimatedArmour.java b/Server/src/main/java/core/game/content/activity/wguild/animator/AnimatedArmour.java index 44b05b41b..09c18794d 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/animator/AnimatedArmour.java +++ b/Server/src/main/java/core/game/content/activity/wguild/animator/AnimatedArmour.java @@ -84,14 +84,14 @@ public final class AnimatedArmour extends NPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity != player) { if (entity instanceof Player) { ((Player) entity).getPacketDispatch().sendMessage("This isn't your armour to attack."); } return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/cutscene/DBRCutscenePlugin.java b/Server/src/main/java/core/game/content/cutscene/DBRCutscenePlugin.java index df29bf950..1a8ee8da3 100644 --- a/Server/src/main/java/core/game/content/cutscene/DBRCutscenePlugin.java +++ b/Server/src/main/java/core/game/content/cutscene/DBRCutscenePlugin.java @@ -867,7 +867,7 @@ public final class DBRCutscenePlugin extends CutscenePlugin { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { return true; } diff --git a/Server/src/main/java/core/game/content/holiday/christmas/ChristmasEvent.java b/Server/src/main/java/core/game/content/holiday/christmas/ChristmasEvent.java index 8415797b4..5ef0854d0 100644 --- a/Server/src/main/java/core/game/content/holiday/christmas/ChristmasEvent.java +++ b/Server/src/main/java/core/game/content/holiday/christmas/ChristmasEvent.java @@ -1063,9 +1063,11 @@ public class ChristmasEvent extends HolidayEvent { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity instanceof Player) { - ((Player) entity).sendMessage("You can't attack a snowman."); + if(message) { + ((Player) entity).sendMessage("You can't attack a snowman."); + } return false; } return true; diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java index c8f108ff2..5e5d7daa6 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java @@ -143,21 +143,25 @@ public final class ElvargNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (!(entity instanceof Player)) { - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } final Player player = (Player) entity; if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 40 && (player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD))) { - player.getPacketDispatch().sendMessage("You have already slain the dragon. Now you just need to return to Oziach for"); - player.getPacketDispatch().sendMessage("your reward!"); - return true; - } - if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) > 40) { - player.getPacketDispatch().sendMessage("You have already slain Elvarg."); + if(message) { + player.getPacketDispatch().sendMessage("You have already slain the dragon. Now you just need to return to Oziach for"); + player.getPacketDispatch().sendMessage("your reward!"); + } return false; } - return super.isAttackable(entity, style); + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) > 40) { + if(message) { + player.getPacketDispatch().sendMessage("You have already slain Elvarg."); + } + return false; + } + return super.isAttackable(entity, style, message); } @Override @@ -322,4 +326,4 @@ public final class ElvargNPC extends AbstractNPC { } -} \ No newline at end of file +} diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/WormbrainNPC.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/WormbrainNPC.java index 104e8c013..059811690 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/WormbrainNPC.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/WormbrainNPC.java @@ -52,15 +52,17 @@ public final class WormbrainNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity instanceof Player) { final Player player = (Player) entity; if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 20) { - player.getPacketDispatch().sendMessage("The goblin is already in prison. You have no reason to attack him."); + if(message) { + player.getPacketDispatch().sendMessage("The goblin is already in prison. You have no reason to attack him."); + } return false; } } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java b/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java index 61f9b54de..8e88e1282 100644 --- a/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java +++ b/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java @@ -238,7 +238,7 @@ public final class RestlessGhostPlugin extends OptionHandler { } @Override - public boolean isAttackable(final Entity entity, final CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { final Player player = ((Player) entity); final Player pl = getAttribute("player", null); return pl == null ? false : pl == player ? true : false; diff --git a/Server/src/main/java/core/game/content/quest/members/lostcity/TreeSpiritNPC.java b/Server/src/main/java/core/game/content/quest/members/lostcity/TreeSpiritNPC.java index 35859986a..fb3e58d15 100644 --- a/Server/src/main/java/core/game/content/quest/members/lostcity/TreeSpiritNPC.java +++ b/Server/src/main/java/core/game/content/quest/members/lostcity/TreeSpiritNPC.java @@ -52,11 +52,11 @@ public final class TreeSpiritNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity != player) { return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java b/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java index e2c6de9cf..1ffa48d06 100644 --- a/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java +++ b/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java @@ -57,7 +57,7 @@ public class WitchsExperimentNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { return p == entity; } diff --git a/Server/src/main/java/core/game/content/ttrail/SaradominWizardNPC.java b/Server/src/main/java/core/game/content/ttrail/SaradominWizardNPC.java index 79202bdc4..13c7aaab0 100644 --- a/Server/src/main/java/core/game/content/ttrail/SaradominWizardNPC.java +++ b/Server/src/main/java/core/game/content/ttrail/SaradominWizardNPC.java @@ -124,7 +124,7 @@ public final class SaradominWizardNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (!(entity instanceof Player)) { return false; } @@ -132,7 +132,7 @@ public final class SaradominWizardNPC extends AbstractNPC { Player p = entity.asPlayer(); return p == player; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/ttrail/UriNPC.java b/Server/src/main/java/core/game/content/ttrail/UriNPC.java index bddcad008..0d79b54e0 100644 --- a/Server/src/main/java/core/game/content/ttrail/UriNPC.java +++ b/Server/src/main/java/core/game/content/ttrail/UriNPC.java @@ -101,7 +101,7 @@ public final class UriNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (!(entity instanceof Player)) { return false; } @@ -109,7 +109,7 @@ public final class UriNPC extends AbstractNPC { Player p = entity.asPlayer(); return p == player; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/ttrail/ZamorakWizardNPC.java b/Server/src/main/java/core/game/content/ttrail/ZamorakWizardNPC.java index 897fdc3d1..c4e6acd9e 100644 --- a/Server/src/main/java/core/game/content/ttrail/ZamorakWizardNPC.java +++ b/Server/src/main/java/core/game/content/ttrail/ZamorakWizardNPC.java @@ -99,7 +99,7 @@ public final class ZamorakWizardNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (!(entity instanceof Player)) { return false; } @@ -107,7 +107,7 @@ public final class ZamorakWizardNPC extends AbstractNPC { Player p = entity.asPlayer(); return p == player; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/content/zone/wbisland/WaterBirthDungeonZone.java b/Server/src/main/java/core/game/content/zone/wbisland/WaterBirthDungeonZone.java index 2575a5563..3a20f6b54 100644 --- a/Server/src/main/java/core/game/content/zone/wbisland/WaterBirthDungeonZone.java +++ b/Server/src/main/java/core/game/content/zone/wbisland/WaterBirthDungeonZone.java @@ -389,14 +389,16 @@ public final class WaterBirthDungeonZone extends MapZone implements Plugin it = list.iterator(); it.hasNext();) { final Entity e = it.next(); it.remove(); - if (!e.isAttackable(player, CombatStyle.RANGE) || !e.getProperties().isMultiZone()) { + if (!e.isAttackable(player, CombatStyle.RANGE, false) || !e.getProperties().isMultiZone()) { continue; } double distance = victim.getLocation().getDistance(e.getLocation()); diff --git a/Server/src/main/java/core/game/node/entity/npc/IdleAbstractNPC.java b/Server/src/main/java/core/game/node/entity/npc/IdleAbstractNPC.java index 6c96cda72..7612724ba 100644 --- a/Server/src/main/java/core/game/node/entity/npc/IdleAbstractNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/IdleAbstractNPC.java @@ -57,17 +57,19 @@ public abstract class IdleAbstractNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (isInvisible()) { return false; } if (getTask() != null && entity instanceof Player && getTask().levelReq > entity.getSkills().getStaticLevel(Skills.SLAYER)) { - ((Player) entity).getPacketDispatch().sendMessage("You need a higher slayer level to know how to wound this monster."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("You need a higher slayer level to know how to wound this monster."); + } } if (DeathTask.isDead(this)) { return false; } - if (!entity.getZoneMonitor().continueAttack(this, style)) { + if (!entity.getZoneMonitor().continueAttack(this, style, message)) { return false; } return true; @@ -136,4 +138,4 @@ public abstract class IdleAbstractNPC extends AbstractNPC { this.idle = idle; } -} \ No newline at end of file +} diff --git a/Server/src/main/java/core/game/node/entity/npc/NPC.java b/Server/src/main/java/core/game/node/entity/npc/NPC.java index 3bd79964b..7174eefe4 100644 --- a/Server/src/main/java/core/game/node/entity/npc/NPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/NPC.java @@ -392,14 +392,16 @@ public class NPC extends Entity { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if ((entity instanceof Player && !definition.hasAction("attack")) || isInvisible()) { return false; } if (task != null && entity instanceof Player && task.levelReq > entity.getSkills().getStaticLevel(Skills.SLAYER)) { - ((Player) entity).getPacketDispatch().sendMessage("You need a higher slayer level to know how to wound this monster."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("You need a higher slayer level to know how to wound this monster."); + } } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java index 42f63420d..71a93779d 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java @@ -224,11 +224,11 @@ public final class GiantMoleNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (digging) { return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java index e94be4859..5a6c3fb9e 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java @@ -212,7 +212,7 @@ public final class KalphiteQueenNPC extends AbstractNPC { private BattleState[] getRangeTargets(Entity e, Entity victim) { List list = new ArrayList<>(20); for (Entity t : RegionManager.getLocalPlayers(victim, -1 + (int) e.getCenterLocation().getDistance(victim.getLocation()))) { - if (t.isAttackable(e, CombatStyle.RANGE)) { + if (t.isAttackable(e, CombatStyle.RANGE, false)) { list.add(new BattleState(e, t)); } } diff --git a/Server/src/main/java/core/game/node/entity/npc/other/BorkNPC.java b/Server/src/main/java/core/game/node/entity/npc/other/BorkNPC.java index c464ec4c0..6b08732ed 100644 --- a/Server/src/main/java/core/game/node/entity/npc/other/BorkNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/other/BorkNPC.java @@ -373,7 +373,7 @@ public class BorkNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity e, CombatStyle style) { + public boolean isAttackable(Entity e, CombatStyle style, boolean message) { return false; } diff --git a/Server/src/main/java/core/game/node/entity/npc/other/GraveStoneNPC.java b/Server/src/main/java/core/game/node/entity/npc/other/GraveStoneNPC.java index 774ac2807..d997a58a7 100644 --- a/Server/src/main/java/core/game/node/entity/npc/other/GraveStoneNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/other/GraveStoneNPC.java @@ -128,7 +128,7 @@ public class GraveStoneNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { return false; } diff --git a/Server/src/main/java/core/game/node/entity/npc/other/VampireSlayerNPC.java b/Server/src/main/java/core/game/node/entity/npc/other/VampireSlayerNPC.java index cc4f30b36..6bb939d2f 100644 --- a/Server/src/main/java/core/game/node/entity/npc/other/VampireSlayerNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/other/VampireSlayerNPC.java @@ -155,7 +155,7 @@ public class VampireSlayerNPC extends AbstractNPC { } @Override - public boolean isAttackable(final Entity entity, final CombatStyle style) { + public boolean isAttackable(final Entity entity, final CombatStyle style, boolean message) { final Player player = ((Player) entity); final Player pl = getAttribute("player", null); return pl == null ? false : pl == player ? true : false; diff --git a/Server/src/main/java/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java b/Server/src/main/java/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java index bca136edc..339650b87 100644 --- a/Server/src/main/java/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java @@ -64,12 +64,12 @@ public final class GardenerNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { final Player target = getAttribute("target", null); if (target != entity) { return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantNPC.java b/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantNPC.java index 2f03bcff0..80ae977a5 100644 --- a/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantNPC.java @@ -190,18 +190,20 @@ public class RevenantNPC extends AbstractNPC { } @Override - public boolean continueAttack(Entity target, CombatStyle style) { + public boolean continueAttack(Entity target, CombatStyle style, boolean message) { return target instanceof Player ? checkCombatLevel(target.asPlayer()) : true; } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity.asPlayer().isArtificial()) { return false; } if (entity instanceof Player) { if (!checkCombatLevel(entity.asPlayer()) && !entity.asPlayer().isAdmin()) { - entity.asPlayer().sendMessage("The level difference between you and your opponent is too great."); + if(message) { + entity.asPlayer().sendMessage("The level difference between you and your opponent is too great."); + } return false; } } @@ -214,7 +216,7 @@ public class RevenantNPC extends AbstractNPC { return false; } } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/player/Player.java b/Server/src/main/java/core/game/node/entity/player/Player.java index 0bad3e73f..5d73adb60 100644 --- a/Server/src/main/java/core/game/node/entity/player/Player.java +++ b/Server/src/main/java/core/game/node/entity/player/Player.java @@ -730,7 +730,7 @@ public class Player extends Entity { } } Item item = equipment.get(EquipmentContainer.SLOT_SHIELD); - if (item != null && (fire && (item.getId() == 11283 || item.getId() == 11284 || item.getId() == 1540) || (!fire && (item.getId() == 2890 || item.getId() == 9731)))) { + if (item != null && (item.getId() == 11283 || item.getId() == 11284 || (fire && (item.getId() == 1540) || (!fire && (item.getId() == 2890 || item.getId() == 9731))))) { value |= 0x4; } if (prayer.get(PrayerType.PROTECT_FROM_MAGIC)) { @@ -755,11 +755,11 @@ public class Player extends Entity { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity instanceof NPC && !((NPC) entity).getDefinition().hasAction("attack") && !((NPC) entity).isIgnoreAttackRestrictions(this)) { return false; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java b/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java index b2718b75d..17842b88b 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java +++ b/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java @@ -119,7 +119,7 @@ public final class Prayer { } for (Object o : targets) { Entity entity = (Entity) o; - if (entity.isAttackable(player, CombatStyle.MAGIC)) { + if (entity.isAttackable(player, CombatStyle.MAGIC, false)) { entity.getImpactHandler().manualHit(player, 1 + RandomFunction.randomize(maximum), HitsplatType.NORMAL); } } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/ImplingNPC.java b/Server/src/main/java/core/game/node/entity/skill/hunter/ImplingNPC.java index e797ae9ea..426a5c12a 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/ImplingNPC.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/ImplingNPC.java @@ -83,14 +83,14 @@ public final class ImplingNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (style != CombatStyle.MAGIC) { return false; } if (entity.getProperties().getSpell().getSpellId() == 12 || entity.getProperties().getSpell().getSpellId() == 30 || entity.getProperties().getSpell().getSpellId() == 56) { return true; } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java b/Server/src/main/java/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java index 7f577e01d..d73bad286 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java @@ -200,9 +200,9 @@ public final class FishingExplosivePlugin extends OptionHandler { } @Override - public boolean isAttackable(final Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { final Player pl = getAttribute("player", null); - return pl != null && pl == entity && super.isAttackable(entity, style); + return pl != null && pl == entity && super.isAttackable(entity, style, message); } @Override diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/NechryaelNPC.java b/Server/src/main/java/core/game/node/entity/skill/slayer/NechryaelNPC.java index 1ce0c8546..81822be6b 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/NechryaelNPC.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/NechryaelNPC.java @@ -162,16 +162,23 @@ public final class NechryaelNPC extends AbstractNPC { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity instanceof Player) { final Player t = (Player) entity; if (t != player) { - t.getPacketDispatch().sendMessage("This isn't spawned for you."); + if(message) { + t.getPacketDispatch().sendMessage("This isn't spawned for you."); + } return false; } } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } @Override public boolean isPoisonImmune() { @@ -182,6 +189,5 @@ public final class NechryaelNPC extends AbstractNPC { public int[] getIds() { return new int[] { DEATH_SPAWN }; } - } } diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java index 814d76ab8..dca7e1bbf 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java @@ -220,37 +220,47 @@ public abstract class Familiar extends NPC implements Plugin { } @Override - public boolean isAttackable(Entity entity, CombatStyle style) { + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { if (entity == owner) { - owner.getPacketDispatch().sendMessage("You can't just betray your own familiar like that!"); + if(message) { + owner.getPacketDispatch().sendMessage("You can't just betray your own familiar like that!"); + } return false; } if (entity instanceof Player) { - if (!owner.isAttackable(entity, style)) { + if (!owner.isAttackable(entity, style, message)) { return false; } } if (!getProperties().isMultiZone()) { if (entity instanceof Player && !((Player) entity).getProperties().isMultiZone()) { - ((Player) entity).getPacketDispatch().sendMessage("You have to be in multicombat to attack a player's familiar."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("You have to be in multicombat to attack a player's familiar."); + } return false; } if (entity instanceof Player) { - ((Player) entity).getPacketDispatch().sendMessage("This familiar is not in the a multicombat zone."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("This familiar is not in the a multicombat zone."); + } } return false; } if (entity instanceof Player) { if (!((Player) entity).getSkullManager().isWilderness()) { - ((Player) entity).getPacketDispatch().sendMessage("You have to be in the wilderness to attack a player's familiar."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("You have to be in the wilderness to attack a player's familiar."); + } return false; } if (!owner.getSkullManager().isWilderness()) { - ((Player) entity).getPacketDispatch().sendMessage("This familiar's owner is not in the wilderness."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("This familiar's owner is not in the wilderness."); + } return false; } } - return super.isAttackable(entity, style); + return super.isAttackable(entity, style, message); } @Override @@ -418,7 +428,7 @@ public abstract class Familiar extends NPC implements Plugin { * moves). */ public boolean canAttack(Entity target, boolean message) { - if (!target.isAttackable(owner, owner.getProperties().getCombatPulse().getStyle())) { + if (!target.isAttackable(owner, owner.getProperties().getCombatPulse().getStyle(), true)) { return false; } if (target.getLocation().getDistance(getLocation()) > 8) { @@ -427,7 +437,7 @@ public abstract class Familiar extends NPC implements Plugin { } return false; } - if (target.getLocks().isInteractionLocked() || !target.isAttackable(this, CombatStyle.MAGIC)) { + if (target.getLocks().isInteractionLocked() || !target.isAttackable(this, CombatStyle.MAGIC, true)) { return false; } return isCombatFamiliar(); diff --git a/Server/src/main/java/core/game/world/map/zone/ZoneMonitor.java b/Server/src/main/java/core/game/world/map/zone/ZoneMonitor.java index e9fdd394e..73d02232e 100644 --- a/Server/src/main/java/core/game/world/map/zone/ZoneMonitor.java +++ b/Server/src/main/java/core/game/world/map/zone/ZoneMonitor.java @@ -112,24 +112,26 @@ public final class ZoneMonitor { * @param style The combat style used. * @return {@code True} if so. */ - public boolean continueAttack(Node target, CombatStyle style) { + public boolean continueAttack(Node target, CombatStyle style, boolean message) { if (target instanceof Entity) { - if (!entity.continueAttack((Entity) target, style)) { + if (!entity.continueAttack((Entity) target, style, message)) { return false; } } for (RegionZone z : zones) { - if (!z.getZone().continueAttack(entity, target, style, true)) { + if (!z.getZone().continueAttack(entity, target, style, message)) { return false; } } if (entity instanceof Player && target instanceof Player) { if (!((Player) entity).getSkullManager().isWilderness() || !((Player) target).getSkullManager().isWilderness()) { - ((Player) entity).getPacketDispatch().sendMessage("You can only attack other players in the wilderness."); + if(message) { + ((Player) entity).getPacketDispatch().sendMessage("You can only attack other players in the wilderness."); + } return false; } } - if (target instanceof Entity && !MapZone.checkMulti(entity, (Entity) target, true)) { + if (target instanceof Entity && !MapZone.checkMulti(entity, (Entity) target, message)) { return false; } return true; diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/ChronozonNPC.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/ChronozonNPC.kt index 5ed371c71..4b929820b 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/ChronozonNPC.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/ChronozonNPC.kt @@ -78,10 +78,10 @@ class ChronozonNPC(id: Int, location: Location?) : AbstractNPC(667, Location(308 } } - override fun isAttackable(entity: Entity, style: CombatStyle?): Boolean { + override fun isAttackable(entity: Entity, style: CombatStyle?, message: Boolean): Boolean { return entity == m_targetPlayer && m_targetPlayer.questRepository.getQuest("Family Crest").getStage(m_targetPlayer) == 19 && - super.isAttackable(entity, style) + super.isAttackable(entity, style, message) } override fun clear() { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt index 5525626e2..b78bb5296 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt @@ -129,7 +129,7 @@ class CombatPulse( if (handler == null) { handler = entity.getSwingHandler(true) } - if (!v.isAttackable(entity, handler!!.type)) { + if (!v.isAttackable(entity, handler!!.type, true)) { return true } if (!swing(entity, victim, handler)) { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt index 66ca5c016..84aafe92f 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt @@ -318,7 +318,7 @@ class PitfallNPC : AbstractNPC { return BEAST_IDS } - override fun isAttackable(entity: Entity, style: CombatStyle): Boolean { + override fun isAttackable(entity: Entity, style: CombatStyle, message: Boolean): Boolean { return false }