From 045a4bac745988f513caedc5c7abf6cc24437836 Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 18:45:04 -0500 Subject: [PATCH 01/16] Fixed bug with Lost City "chop" on tree for Shamus. --- .../node/entity/skill/runecrafting/abyss/AbyssPlugin.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.kt index 4ad941569..cc302ee06 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.kt @@ -26,10 +26,11 @@ import rs09.game.world.GameWorld */ class AbyssPlugin : InteractionListener() { - val OBSTACLE = AbbysalObstacle.values().filter { it != AbbysalObstacle.MINE && it != AbbysalObstacle.SQUEEZE && it != AbbysalObstacle.PASSAGE}.map { it.option }.toTypedArray() + val OBSTACLE = AbbysalObstacle.values().filter { it != AbbysalObstacle.MINE && it != AbbysalObstacle.SQUEEZE && it != AbbysalObstacle.PASSAGE && it != AbbysalObstacle.CHOP }.map { it.option }.toTypedArray() val miningObstacle = 7158 val agilityObstacle = 7164 val passage = 7154 + val chopObstacle = 7161 override fun defineListeners() { definePlugin(AbyssalNPC()) @@ -68,7 +69,11 @@ class AbyssPlugin : InteractionListener() { obstacle!!.handle(player, node as Scenery) return@on true } - + on(chopObstacle, SCENERY, "chop"){ player, node -> + val obstacle = AbbysalObstacle.forObject(node as Scenery) + obstacle!!.handle(player, node as Scenery) + return@on true + } } From cc2e38be078db86a63ff6932ad052075c2a98020 Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 22:18:33 -0500 Subject: [PATCH 02/16] Attempt to fix server hanging on shutdown --- Server/src/main/java/core/game/system/SystemTermination.java | 2 ++ Server/src/main/kotlin/rs09/Server.kt | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Server/src/main/java/core/game/system/SystemTermination.java b/Server/src/main/java/core/game/system/SystemTermination.java index 91475ff08..f1bb0f185 100644 --- a/Server/src/main/java/core/game/system/SystemTermination.java +++ b/Server/src/main/java/core/game/system/SystemTermination.java @@ -4,6 +4,7 @@ import core.game.ge.GrandExchangeDatabase; import core.game.interaction.object.dmc.DMCHandler; import core.game.node.entity.player.Player; import core.game.node.entity.player.info.login.PlayerParser; +import rs09.Server; import rs09.ServerConstants; import rs09.game.ge.OfferManager; import rs09.game.system.SystemLogger; @@ -57,6 +58,7 @@ public final class SystemTermination { if (!file.isDirectory()) { file.mkdirs(); } + Server.getReactor().terminate(); for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { try { Player p = it.next(); diff --git a/Server/src/main/kotlin/rs09/Server.kt b/Server/src/main/kotlin/rs09/Server.kt index 2a98df8d6..6e9034a91 100644 --- a/Server/src/main/kotlin/rs09/Server.kt +++ b/Server/src/main/kotlin/rs09/Server.kt @@ -40,6 +40,7 @@ object Server { /** * The NIO reactor. */ + @JvmStatic var reactor: NioReactor? = null /** @@ -72,7 +73,8 @@ object Server { Runtime.getRuntime().addShutdownHook(ServerConstants.SHUTDOWN_HOOK) SystemLogger.logInfo("Starting networking...") try { - NioReactor.configure(43594 + GameWorld.settings?.worldId!!).start() + reactor = NioReactor.configure(43594 + GameWorld.settings?.worldId!!) + reactor!!.start() } catch (e: BindException) { SystemLogger.logErr("Port " + (43594 + GameWorld.settings?.worldId!!) + " is already in use!") throw e From 8744d9d16701aff51be7ed4f2c1d2b0e024b8cd0 Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 22:27:33 -0500 Subject: [PATCH 03/16] Attempt to fix server hanging on shutdown --- Server/src/main/kotlin/rs09/Server.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/kotlin/rs09/Server.kt b/Server/src/main/kotlin/rs09/Server.kt index 6e9034a91..c8366e31a 100644 --- a/Server/src/main/kotlin/rs09/Server.kt +++ b/Server/src/main/kotlin/rs09/Server.kt @@ -90,7 +90,7 @@ object Server { while(scanner.hasNextLine()){ val command = scanner.nextLine() when(command){ - "stop" -> SystemManager.flag(SystemState.TERMINATED) + "stop" -> exitProcess(0) "players" -> System.out.println("Players online: " + (Repository.LOGGED_IN_PLAYERS.size)) "update" -> SystemManager.flag(SystemState.UPDATING) "help","commands" -> printCommands() From 154c15dc1f76dc87deed25a38d778800965a384a Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 23:15:41 -0500 Subject: [PATCH 04/16] Remove unnecessary code --- .../kotlin/rs09/game/world/repository/DisconnectionQueue.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt index c79add8b3..269d62ef2 100644 --- a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt @@ -194,8 +194,8 @@ class DisconnectionQueue { if (sql) { player.details.sqlManager.update(player) player.details.save() - SQLEntryHandler.write(HighscoreSQLHandler(player)) - SQLEntryHandler.write(PlayerLogSQLHandler(player.monitor, player.name)) + /*SQLEntryHandler.write(HighscoreSQLHandler(player)) + SQLEntryHandler.write(PlayerLogSQLHandler(player.monitor, player.name))*/ } return true } catch (t: Throwable) { From 8407251ae6ce5b2bd5670408fc4b6b61ba0c341d Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 23:19:08 -0500 Subject: [PATCH 05/16] debuggin... --- .../kotlin/rs09/game/world/repository/DisconnectionQueue.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt index 269d62ef2..963fe4944 100644 --- a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt @@ -33,7 +33,7 @@ class DisconnectionQueue { //loop through entries and disconnect each entries.forEach { - if(finish(it.value,false)) queue.remove(it.key) + if(finish(it.value,false).also{cl -> SystemLogger.logInfo("Cleared? - $cl") }) queue.remove(it.key) } } From 5cb783c7fd4e35bde5e99a50ee993729c7da66a5 Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 23:29:15 -0500 Subject: [PATCH 06/16] demoffing --- Server/src/main/java/core/game/node/entity/player/Player.java | 4 ++-- .../kotlin/rs09/game/world/repository/DisconnectionQueue.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 a39ff8e26..242f61bfb 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 @@ -385,10 +385,10 @@ public class Player extends Entity { * @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat. */ public void clear(boolean force) { - if (!force && allowRemoval()) { + /*if (!force && allowRemoval()) { Repository.getDisconnectionQueue().add(this, true); return; - } + }*/ if (force) { Repository.getDisconnectionQueue().remove(getName()); } diff --git a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt index 963fe4944..269d62ef2 100644 --- a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt @@ -33,7 +33,7 @@ class DisconnectionQueue { //loop through entries and disconnect each entries.forEach { - if(finish(it.value,false).also{cl -> SystemLogger.logInfo("Cleared? - $cl") }) queue.remove(it.key) + if(finish(it.value,false)) queue.remove(it.key) } } From c82f86eb9c4311d004640800c6c46215c6d29d48 Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 23:33:44 -0500 Subject: [PATCH 07/16] demoffing pt 2 --- .../kotlin/rs09/game/world/repository/DisconnectionQueue.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt index 269d62ef2..bbc6193a4 100644 --- a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt @@ -53,6 +53,7 @@ class DisconnectionQueue { return false } if (entry.isClear) { + SystemLogger.logInfo("Clearing player...") player.clear() } Repository.playerNames.remove(player.name) @@ -63,6 +64,7 @@ class DisconnectionQueue { try { player.communication.clan.leave(player, false) } catch (e: Exception) { + e.printStackTrace() } if (player.isArtificial) { return true From 47177dee02467f0f2b1cdcf16af8b53345c27139 Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 23:37:07 -0500 Subject: [PATCH 08/16] demoffing pt 3 --- .../kotlin/rs09/game/world/repository/DisconnectionQueue.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt index bbc6193a4..864d2663e 100644 --- a/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/kotlin/rs09/game/world/repository/DisconnectionQueue.kt @@ -62,7 +62,8 @@ class DisconnectionQueue { Repository.LOGGED_IN_PLAYERS.remove(player.details.username) SystemLogger.logInfo("Player cleared. Removed ${player.details.username}") try { - player.communication.clan.leave(player, false) + if(player.communication.clan != null) + player.communication.clan.leave(player, false) } catch (e: Exception) { e.printStackTrace() } From 305d00f2cde4690b61f3964e6d5f559859c361ea Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 22 Jul 2021 23:49:05 -0500 Subject: [PATCH 09/16] demoffing pt 4 --- Server/src/main/java/core/game/node/entity/player/Player.java | 2 ++ 1 file changed, 2 insertions(+) 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 242f61bfb..0ac9f2d8c 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 @@ -79,6 +79,7 @@ import rs09.game.node.entity.combat.equipment.EquipmentDegrader; import rs09.game.node.entity.skill.runecrafting.PouchManager; import rs09.game.node.entity.state.newsys.State; import rs09.game.node.entity.state.newsys.StateRepository; +import rs09.game.system.SystemLogger; import rs09.game.world.GameWorld; import rs09.game.world.repository.Repository; import rs09.game.world.update.MapChunkRenderer; @@ -385,6 +386,7 @@ public class Player extends Entity { * @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat. */ public void clear(boolean force) { + SystemLogger.logInfo("Clearing player..."); /*if (!force && allowRemoval()) { Repository.getDisconnectionQueue().add(this, true); return; From ffd2a9380417a3a060bf6201a3228047c3236bbb Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 00:07:58 -0500 Subject: [PATCH 10/16] The final demoff --- .../main/java/core/game/node/entity/player/Player.java | 2 -- Server/src/main/java/core/net/IoEventHandler.java | 8 +------- 2 files changed, 1 insertion(+), 9 deletions(-) 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 0ac9f2d8c..242f61bfb 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 @@ -79,7 +79,6 @@ import rs09.game.node.entity.combat.equipment.EquipmentDegrader; import rs09.game.node.entity.skill.runecrafting.PouchManager; import rs09.game.node.entity.state.newsys.State; import rs09.game.node.entity.state.newsys.StateRepository; -import rs09.game.system.SystemLogger; import rs09.game.world.GameWorld; import rs09.game.world.repository.Repository; import rs09.game.world.update.MapChunkRenderer; @@ -386,7 +385,6 @@ public class Player extends Entity { * @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat. */ public void clear(boolean force) { - SystemLogger.logInfo("Clearing player..."); /*if (!force && allowRemoval()) { Repository.getDisconnectionQueue().add(this, true); return; diff --git a/Server/src/main/java/core/net/IoEventHandler.java b/Server/src/main/java/core/net/IoEventHandler.java index 877eeafe4..c5d7e7099 100644 --- a/Server/src/main/java/core/net/IoEventHandler.java +++ b/Server/src/main/java/core/net/IoEventHandler.java @@ -60,13 +60,7 @@ public class IoEventHandler { ByteBuffer buffer = ByteBuffer.allocate(100_000); IoSession session = (IoSession) key.attachment(); if (channel.read(buffer) == -1) { - if(session != null){ - if(session.getPlayer() != null){ - session.getPlayer().clear(); - } - //key.cancel(); - return; - } + return; } buffer.flip(); if (session == null) { From c925c31f6614a251dac57b259e6f16484037884a Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 11:05:19 -0500 Subject: [PATCH 11/16] Slight bugfix with random event manager --- .../main/kotlin/rs09/game/content/ame/RandomEventManager.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt index 0b7df0592..7ace936e6 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt @@ -17,10 +17,15 @@ class RandomEventManager(val player: Player) { fun fireEvent(){ if(player.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)){ + nextSpawn = GameWorld.ticks + 3000 return } val ame = RandomEvents.values().random() event = ame.npc.create(player,ame.loot,ame.type) + if(event!!.spawnLocation == null){ + nextSpawn = GameWorld.ticks + 3000 + return + } event!!.init() nextSpawn = GameWorld.ticks + DELAY_TICKS SystemLogger.logRE("Fired ${event!!.name} for ${player.username}") From 1cd03713675a1acf1dfa20592c39ca6265dcf69c Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 14:36:17 -0500 Subject: [PATCH 12/16] Fixed accuracy calculations. --- .../activity/gwd/GWDGraardorSwingHandler.java | 4 +- .../activity/gwd/GWDKreeArraSwingHandler.java | 4 +- .../gwd/GWDTsutsarothSwingHandler.java | 4 +- .../activity/gwd/GWDZilyanaSwingHandler.java | 4 +- .../activity/tzhaar/TzhaarFightCaveNPC.java | 4 +- .../quest/free/dragonslayer/ElvargNPC.java | 4 +- .../quest/free/dragonslayer/MeldarMadNPC.java | 4 +- .../handlers/DragonfireSwingHandler.java | 4 +- .../entity/npc/bosses/KalphiteQueenNPC.java | 4 +- .../entity/npc/bosses/TormentedDemonNPC.java | 4 +- .../bosses/wilderness/KingBlackDragonNPC.java | 6 +- .../core/game/node/entity/player/Player.java | 10 +++ .../node/entity/combat/CombatSwingHandler.kt | 13 ++-- .../combat/handlers/MagicSwingHandler.kt | 12 ++-- .../combat/handlers/MultiSwingHandler.kt | 4 +- .../combat/handlers/RangeSwingHandler.kt | 70 ++++++------------- .../combat/handlers/SalamanderSwingHandler.kt | 4 +- 17 files changed, 72 insertions(+), 87 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 ba97fef05..7c938adb5 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 @@ -159,8 +159,8 @@ public final class GWDGraardorSwingHandler extends CombatSwingHandler { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return getType().getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return getType().getSwingHandler().calculateDefence(victim, attacker); } @Override 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 01d6de51b..bd338d83d 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 @@ -192,8 +192,8 @@ public final class GWDKreeArraSwingHandler extends CombatSwingHandler { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return getType().getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return getType().getSwingHandler().calculateDefence(victim, attacker); } @Override diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java index a21b634db..0281420b2 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java @@ -143,8 +143,8 @@ public final class GWDTsutsarothSwingHandler extends CombatSwingHandler { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return getType().getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return getType().getSwingHandler().calculateDefence(victim, attacker); } @Override 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 03e692898..27fad1d87 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 @@ -121,8 +121,8 @@ public class GWDZilyanaSwingHandler extends CombatSwingHandler { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return getType().getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return getType().getSwingHandler().calculateDefence(victim, attacker); } @Override diff --git a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java index 262367320..bef277451 100644 --- a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java +++ b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java @@ -332,8 +332,8 @@ public final class TzhaarFightCaveNPC extends AbstractNPC { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return style.getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return style.getSwingHandler().calculateDefence(victim, attacker); } @Override 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 631cc6f60..e5e7ad0cf 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 @@ -216,8 +216,8 @@ public final class ElvargNPC extends AbstractNPC { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return style.getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return style.getSwingHandler().calculateDefence(victim, attacker); } @Override diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java index 1fd06c5f2..cd1d91d91 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java @@ -169,8 +169,8 @@ public final class MeldarMadNPC extends AbstractNPC { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return style.getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return style.getSwingHandler().calculateDefence(victim, attacker); } @Override diff --git a/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java b/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java index 40340c0f2..6ac038ad2 100644 --- a/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java +++ b/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java @@ -208,8 +208,8 @@ public class DragonfireSwingHandler extends CombatSwingHandler { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return CombatStyle.MAGIC.getSwingHandler().calculateDefence(victim, attacker); } @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 2e69bbd77..e94be4859 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 @@ -296,8 +296,8 @@ public final class KalphiteQueenNPC extends AbstractNPC { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return style.getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return style.getSwingHandler().calculateDefence(victim, attacker); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java index 41142075a..702399b7a 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java @@ -315,8 +315,8 @@ public class TormentedDemonNPC extends AbstractNPC { } @Override - public int calculateDefence(Entity entity, Entity attacker) { - return style.getSwingHandler().calculateDefence(entity, attacker); + public int calculateDefence(Entity victim, Entity attacker) { + return style.getSwingHandler().calculateDefence(victim, attacker); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java index c594c54cf..b69cce4ef 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java @@ -143,11 +143,11 @@ public final class KingBlackDragonNPC extends AbstractNPC { } @Override - public int calculateDefence(Entity entity, Entity attacker) { + public int calculateDefence(Entity victim, Entity attacker) { if (style == CombatStyle.MELEE) { - return style.getSwingHandler().calculateDefence(entity, attacker); + return style.getSwingHandler().calculateDefence(victim, attacker); } - return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker); + return CombatStyle.MAGIC.getSwingHandler().calculateDefence(victim, attacker); } @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 242f61bfb..d514da282 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 @@ -1,5 +1,6 @@ package core.game.node.entity.player; +import api.ContentAPI; import core.game.component.Component; import core.game.container.Container; import core.game.container.impl.BankContainer; @@ -70,6 +71,7 @@ import core.tools.RandomFunction; import core.tools.StringUtils; import kotlin.Unit; import kotlin.jvm.functions.Function1; +import org.rs09.consts.Items; import rs09.ServerConstants; import rs09.game.VarpManager; import rs09.game.content.ame.RandomEventManager; @@ -755,6 +757,14 @@ public class Player extends Entity { Arrays.fill(renderInfo.getAppearanceStamps(),0); } + /** + * Checks if the player is wearing void. + */ + public boolean isWearingVoid(boolean melee){ + int helm = melee ? Items.VOID_MELEE_HELM_11665 : Items.VOID_RANGER_HELM_11664; + return ContentAPI.inEquipment(this, helm, 1) && ContentAPI.inEquipment(this, Items.VOID_KNIGHT_ROBE_8840, 1) && ContentAPI.inEquipment(this, Items.VOID_KNIGHT_TOP_8839, 1); + } + /** * Updates the player's scene graph. * @param login If the player is logging in. diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt index 146453e8d..47c826c04 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt @@ -77,11 +77,11 @@ abstract class CombatSwingHandler(var type: CombatStyle?) { /** * Calculates the maximum defence of the entity. - * @param entity The entity. + * @param victim The entity. * @param attacker The entity to defend against. * @return The maximum defence value. */ - abstract fun calculateDefence(entity: Entity?, attacker: Entity?): Int + abstract fun calculateDefence(victim: Entity?, attacker: Entity?): Int /** * Gets the void set multiplier. @@ -188,18 +188,17 @@ abstract class CombatSwingHandler(var type: CombatStyle?) { } val attack = calculateAccuracy(entity) * accuracyMod * mod * getSetMultiplier(entity, Skills.ATTACK) val defence = calculateDefence(victim, entity) * defenceMod * getSetMultiplier(victim, Skills.DEFENCE) - val chance: Double - chance = if (attack < defence) { - (attack - 1) / (defence * 2) + val chance: Double = if (attack < defence) { + 1 - ((defence + 2) / ((2 * attack) + 1)) } else { - 1 - (defence + 1) / (attack * 2) + attack / ((2 * defence) + 1) } val ratio = chance * 100 val accuracy = floor(ratio) val block = floor(101 - ratio) val acc = Math.random() * accuracy val def = Math.random() * block - return acc > def + return (acc > def).also { if(entity?.username?.toLowerCase() == "test10") SystemLogger.logInfo("Should hit: $it") } } /** diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt index 84455411b..b043c359c 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt @@ -202,14 +202,14 @@ open class MagicSwingHandler return (baseDamage * levelMod).toInt() + 1 } - override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { - val level = entity!!.skills.getLevel(Skills.DEFENCE, true) + override fun calculateDefence(victim: Entity?, attacker: Entity?): Int { + val level = victim!!.skills.getLevel(Skills.DEFENCE, true) var prayer = 1.0 - if (entity is Player) { - prayer += entity.prayer.getSkillBonus(Skills.MAGIC) + if (victim is Player) { + prayer += victim.prayer.getSkillBonus(Skills.MAGIC) } - val effective = floor(level * prayer * 0.3) + entity.skills.getLevel(Skills.MAGIC, true) * 0.7 - val equipment = entity.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5] + val effective = floor(level * prayer * 0.3) + victim.skills.getLevel(Skills.MAGIC, true) * 0.7 + val equipment = victim.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5] return floor((effective + 8) * (equipment + 64) / 10).toInt() } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt index ff7220475..55be23dd5 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt @@ -139,8 +139,8 @@ open class MultiSwingHandler(meleeDistance: Boolean, vararg attacks: SwitchAttac } else current.handler.calculateHit(entity, victim, modifier) } - override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { - return current.handler.calculateDefence(entity, attacker) + override fun calculateDefence(victim: Entity?, attacker: Entity?): Int { + return current.handler.calculateDefence(victim, attacker) } override fun getSetMultiplier(e: Entity?, skillId: Int): Double { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt index e484a200a..4654597d9 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt @@ -1,5 +1,7 @@ package rs09.game.node.entity.combat.handlers +import api.ContentAPI +import api.EquipmentSlot import core.game.container.Container import core.game.container.impl.EquipmentContainer import core.game.content.quest.tutorials.tutorialisland.TutorialSession @@ -79,9 +81,9 @@ open class RangeSwingHandler } var hit = 0 if (isAccurateImpact(entity, victim, CombatStyle.RANGE)) { - val max = calculateHit(entity, victim, 1.0) + val max = calculateHit(entity, victim, 1.0).also { if(entity?.name?.toLowerCase() == "test10") SystemLogger.logInfo("Damage: $it") } state.maximumHit = max - hit = RandomFunction.random(max) + hit = RandomFunction.random(max + 1) } state.estimatedHit = hit if (state.weapon.type == WeaponType.DOUBLE_SHOT) { @@ -239,32 +241,16 @@ open class RangeSwingHandler } override fun calculateAccuracy(entity: Entity?): Int { - val baseLevel = entity!!.skills.getStaticLevel(Skills.RANGE) - var weaponRequirement = baseLevel - if (entity is Player) { - val weapon = entity.equipment[3] - weaponRequirement = weapon?.definition?.getRequirement(Skills.RANGE) ?: 1 - } - var weaponBonus = 0.0 - if (baseLevel > weaponRequirement) { - weaponBonus = (baseLevel - weaponRequirement) * .3 - } - val level = entity.skills.getLevel(Skills.RANGE) - var prayer = 1.0 - if (entity is Player) { - prayer += entity.prayer.getSkillBonus(Skills.RANGE) - } - var additional = 1.0 // Slayer helmet/salve/... - if(entity is Player && rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks.isActive(rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks.ACCURATE_MARKSMAN,entity.asPlayer())){ - additional += 0.5 - } - var styleBonus = 0 - if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) { - styleBonus = 3 - } - val effective = floor(level * prayer * additional + styleBonus + weaponBonus) - val bonus = entity.properties.bonuses[WeaponInterface.BONUS_RANGE] - return floor((effective + 8) * (bonus + 64) / 10).toInt() + entity ?: return 0 + var effectiveRangedLevel = entity.skills.getLevel(Skills.RANGE).toDouble() + if(entity is Player) effectiveRangedLevel = floor(effectiveRangedLevel + (entity.prayer.getSkillBonus(Skills.RANGE) * effectiveRangedLevel)) + if(entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) effectiveRangedLevel += 3 + effectiveRangedLevel += 8 + if(entity is Player && entity.isWearingVoid(false)) effectiveRangedLevel *= 1.1 + effectiveRangedLevel = floor(effectiveRangedLevel) + effectiveRangedLevel *= (entity.properties.bonuses[entity.properties.attackStyle.bonusType] + 64) + + return floor(effectiveRangedLevel).toInt() } override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { @@ -277,30 +263,20 @@ open class RangeSwingHandler var cumulativeStr = floor(level * prayer) if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) { cumulativeStr += 3.0 - } else if (entity.properties.attackStyle.style == WeaponInterface.STYLE_LONG_RANGE) { - cumulativeStr += 1.0 } cumulativeStr *= getSetMultiplier(entity, Skills.RANGE) - return (1.3 + (cumulativeStr / 10) + (bonus / 80) + ((cumulativeStr * bonus) / 640)).toInt() + cumulativeStr *= (bonus + 64) + return floor(1.5 + (ceil(cumulativeStr) / 640.0)).toInt() //return ((14 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier).toInt() / 10 + 1 } - override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { - val style = entity!!.properties.attackStyle - var styleBonus = 0 - if (style.style == WeaponInterface.STYLE_DEFENSIVE || style.style == WeaponInterface.STYLE_LONG_RANGE) { - styleBonus = 3 - } else if (style.style == WeaponInterface.STYLE_CONTROLLED) { - styleBonus = 1 - } - val level = entity.skills.getLevel(Skills.DEFENCE) - var prayer = 1.0 - if (entity is Player) { - prayer += entity.prayer.getSkillBonus(Skills.DEFENCE) - } - val effective = floor(level * prayer + styleBonus) - val equipment = entity.properties.bonuses[WeaponInterface.BONUS_RANGE + 5] - return floor((effective + 8) * (equipment + 64) / 10).toInt() + override fun calculateDefence(victim: Entity?, attacker: Entity?): Int { + victim ?: return 0 + attacker ?: return 0 + + val defLevel = victim.skills.getLevel(Skills.DEFENCE) + val styleDefenceBonus = victim.properties.bonuses[attacker.properties.attackStyle.bonusType + 5] + 64 + return defLevel * styleDefenceBonus } override fun getSetMultiplier(e: Entity?, skillId: Int): Double { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt index fd8514c59..6c9a676f3 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt @@ -58,8 +58,8 @@ class SalamanderSwingHandler(private var style: CombatStyle) : CombatSwingHandle } } - override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { - return style.swingHandler.calculateDefence(entity, attacker) + override fun calculateDefence(victim: Entity?, attacker: Entity?): Int { + return style.swingHandler.calculateDefence(victim, attacker) } override fun getSetMultiplier(e: Entity?, skillId: Int): Double { From 6395aeb4a50de222fc0b07f01b3ba03e67d8ed94 Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 14:37:07 -0500 Subject: [PATCH 13/16] Fixed accuracy calculations. --- .../combat/handlers/MeleeSwingHandler.kt | 122 ++++++++---------- 1 file changed, 53 insertions(+), 69 deletions(-) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt index 562f64a3f..ace2c1905 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt @@ -1,6 +1,7 @@ package rs09.game.node.entity.combat.handlers -import core.game.container.Container +import api.ContentAPI +import api.EquipmentSlot import core.game.container.impl.EquipmentContainer import core.game.content.quest.tutorials.tutorialisland.TutorialSession import core.game.content.quest.tutorials.tutorialisland.TutorialStage @@ -18,7 +19,6 @@ import core.game.node.entity.state.EntityState import core.game.world.map.path.Pathfinder import core.tools.RandomFunction import rs09.game.node.entity.combat.CombatSwingHandler -import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks import kotlin.math.floor /** @@ -72,7 +72,7 @@ open class MeleeSwingHandler if (state.armourEffect === ArmourSet.VERAC || isAccurateImpact(entity, victim, CombatStyle.MELEE)) { val max = calculateHit(entity, victim, 1.0) state.maximumHit = max - hit = RandomFunction.random(max) + hit = RandomFunction.random(max + 1) } state.estimatedHit = hit if(victim != null) { @@ -137,46 +137,36 @@ open class MeleeSwingHandler } override fun calculateAccuracy(entity: Entity?): Int { - val baseLevel = entity!!.skills.getStaticLevel(Skills.ATTACK) - var weaponRequirement = baseLevel - if (entity is Player) { - val weapon = entity.equipment[3] - weaponRequirement = weapon?.definition?.getRequirement(Skills.ATTACK) ?: 1 + //formula taken from wiki: https://oldschool.runescape.wiki/w/Damage_per_second/Melee#Step_six:_Calculate_the_hit_chance Yes I know it's old school. It's the best resource we have for potentially authentic formulae. + entity ?: return 0 + var effectiveAttackLevel = entity.skills.getLevel(Skills.ATTACK).toDouble() + if(entity is Player) effectiveAttackLevel = floor(effectiveAttackLevel + (entity.prayer.getSkillBonus(Skills.ATTACK) * effectiveAttackLevel)) + if(entity.properties.attackStyle.style == WeaponInterface.STYLE_ACCURATE) effectiveAttackLevel += 3 + else if(entity.properties.attackStyle.style == WeaponInterface.STYLE_CONTROLLED) effectiveAttackLevel += 1 + effectiveAttackLevel += 8 + if(entity is Player && entity.isWearingVoid(true)) effectiveAttackLevel *= 1.1 + effectiveAttackLevel = floor(effectiveAttackLevel) + effectiveAttackLevel *= (entity.properties.bonuses[entity.properties.attackStyle.bonusType] + 64) + + val helmetName = (if(entity is Player) ContentAPI.getItemFromEquipment(entity, EquipmentSlot.HAT)?.name ?: "null" else "null").toLowerCase() + val amuletName = (if(entity is Player) ContentAPI.getItemFromEquipment(entity, EquipmentSlot.AMULET)?.name ?: "null" else "null").toLowerCase() + val victimName = entity.properties.combatPulse.getVictim()?.name ?: "none" + + if (entity is Player //Slayer helm/ black mask + && (helmetName.contains("black mask") || helmetName.contains("slayer helm")) + && entity.slayer.task?.ids?.contains((entity.properties.combatPulse.getVictim()?.id ?: 0)) == true + ) { + effectiveAttackLevel *= 1.2 } - var weaponBonus = 0.0 - if (baseLevel > weaponRequirement) { - weaponBonus = (baseLevel - weaponRequirement) * .3 + + else if (entity is Player //Salve amulet + && (amuletName.contains("salve")) + && checkUndead(victimName) + ) { + effectiveAttackLevel *= 1.2 } - val style = entity.properties.attackStyle - var level = entity.skills.getLevel(Skills.ATTACK) - if(entity is Player && SkillcapePerks.isActive(SkillcapePerks.PRECISION_STRIKES,entity.asPlayer())){ - level += 6 - } - var prayer = 1.0 - if (entity is Player) { - prayer += entity.prayer.getSkillBonus(Skills.ATTACK) - } - var additional = 1.0 // Black mask/slayer helmet/salve/... - if (entity.properties.combatPulse.getVictim() != null) { - if (!entity.properties.combatPulse.getVictim()!!.isPlayer && entity is Player) { - if (checkUndead(entity.getProperties().combatPulse.getVictim()!!.name) && entity.asPlayer().equipment[EquipmentContainer.SLOT_AMULET] != null) { - if (entity.asPlayer().equipment[EquipmentContainer.SLOT_AMULET].id == 10588) { - additional += 0.20 - } else if (entity.isPlayer() && entity.asPlayer().equipment[EquipmentContainer.SLOT_AMULET].id == 4081) { - additional += 0.15 - } - } - } - } - var styleBonus = 0 - if (style.style == WeaponInterface.STYLE_ACCURATE) { - styleBonus = 3 - } else if (style.style == WeaponInterface.STYLE_CONTROLLED) { - styleBonus = 1 - } - val effective = floor(level * prayer * additional + styleBonus + weaponBonus) - val bonus = entity.properties.bonuses[style.bonusType] - return floor((effective + 8) * (bonus + 64) / 10 * 1.10).toInt() + + return floor(effectiveAttackLevel).toInt() } override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { @@ -198,22 +188,29 @@ open class MeleeSwingHandler return (1.3 + (cumulativeStr / 10) + (bonus / 80) + ((cumulativeStr * bonus) / 640)).toInt() } - override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { - val style = entity!!.properties.attackStyle - var styleBonus = 0 - if (style.style == WeaponInterface.STYLE_DEFENSIVE || style.style == WeaponInterface.STYLE_LONG_RANGE) { - styleBonus = 3 - } else if (style.style == WeaponInterface.STYLE_CONTROLLED) { - styleBonus = 1 + override fun calculateDefence(victim: Entity?, attacker: Entity?): Int { + //authentic formula, taken from OSRS wiki: https://oldschool.runescape.wiki/w/Damage_per_second/Melee#Step_five:_Calculate_the_Defence_roll + victim ?: return 0 + attacker ?: return 0 + + when(victim){ + is Player -> { + var effectiveDefenceLevel = victim.skills.getLevel(Skills.DEFENCE).toDouble() + effectiveDefenceLevel = floor(effectiveDefenceLevel + (victim.prayer.getSkillBonus(Skills.DEFENCE) * effectiveDefenceLevel)) + if(victim.properties.attackStyle.style == WeaponInterface.STYLE_DEFENSIVE) effectiveDefenceLevel += 3 + else if(victim.properties.attackStyle.style == WeaponInterface.STYLE_CONTROLLED) effectiveDefenceLevel += 1 + effectiveDefenceLevel += 8 + effectiveDefenceLevel = floor(effectiveDefenceLevel) + return floor(effectiveDefenceLevel * (victim.properties.bonuses[attacker.properties.attackStyle.bonusType + 5] + 64)).toInt() + } + is NPC -> { + val defLevel = victim.skills.getLevel(Skills.DEFENCE) + val styleDefenceBonus = victim.properties.bonuses[attacker.properties.attackStyle.bonusType + 5] + 64 + return defLevel * styleDefenceBonus + } } - val level = entity.skills.getLevel(Skills.DEFENCE) - var prayer = 1.0 - if (entity is Player) { - prayer += entity.prayer.getSkillBonus(Skills.DEFENCE) - } - val effective = floor(level * prayer + styleBonus) - val equipment = entity.properties.bonuses[attacker!!.properties.attackStyle.bonusType + 5] - return floor((effective + 8) * (equipment + 64) / 10).toInt() + + return 0 } override fun getSetMultiplier(e: Entity?, skillId: Int): Double { @@ -221,19 +218,6 @@ open class MeleeSwingHandler // System.out.println("Fiist number -> " + 1.0 + ((e.getSkills().getMaximumLifepoints() - e.getSkills().getLifepoints()) * 0.01)); return 1.0 + (e!!.skills.maximumLifepoints - e.skills.lifepoints) * 0.01 } - if (e is Player) { - val c: Container = e.equipment - val itemId = c.getNew(EquipmentContainer.SLOT_HAT).id - if ((skillId == Skills.ATTACK || skillId == Skills.STRENGTH) && (itemId in 8901..8921 || itemId == 13263)) { - val victim = e.getProperties().combatPulse.getVictim() - if (victim is NPC && victim.task == e.slayer.task) { - return 1.15 - } - } - if (containsVoidSet(c) && c.getNew(EquipmentContainer.SLOT_HAT).id == 11665) { - return 1.1 - } - } return 1.0 } From 3c12b04d050dc128bb16266c8ddb1be04fda64ec Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 15:34:26 -0500 Subject: [PATCH 14/16] Fixed an unintentional breakage with drill demon --- .../core/game/node/entity/player/link/InterfaceManager.java | 2 +- .../game/content/ame/events/drilldemon/DrillDemonUtils.kt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Server/src/main/java/core/game/node/entity/player/link/InterfaceManager.java b/Server/src/main/java/core/game/node/entity/player/link/InterfaceManager.java index 447c81b21..d56b34537 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/InterfaceManager.java +++ b/Server/src/main/java/core/game/node/entity/player/link/InterfaceManager.java @@ -467,7 +467,7 @@ public final class InterfaceManager { close(new Component(Components.OPTIONS_261)); // Settings close(new Component(Components.EMOTES_464)); // Emotes close(new Component(Components.MUSIC_V3_187)); // Music - close(new Component(Components.LOGOUT_182)); // Logout + //close(new Component(Components.LOGOUT_182)); // Logout } /** diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/DrillDemonUtils.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/DrillDemonUtils.kt index 9807f75fc..bc44624fe 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/DrillDemonUtils.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/DrillDemonUtils.kt @@ -25,6 +25,9 @@ object DrillDemonUtils { fun teleport(player: Player){ player.setAttribute(DD_KEY_RETURN_LOC,player.location) player.properties.teleportLocation = Location.create(3163, 4819, 0) + player.interfaceManager.closeDefaultTabs() + player.packetDispatch.sendInterfaceConfig(548, 69, true) + player.packetDispatch.sendInterfaceConfig(746, 12, true) ContentAPI.registerLogoutListener(player, "drilldemon"){p -> ContentAPI.teleport(p, player.getAttribute(DD_KEY_RETURN_LOC, p.location)) @@ -82,6 +85,9 @@ object DrillDemonUtils { player.removeAttribute(DD_KEY_TASK) player.removeAttribute(DD_CORRECT_OFFSET) player.removeAttribute(DD_CORRECT_COUNTER) + player.interfaceManager.openDefaultTabs() + player.packetDispatch.sendInterfaceConfig(548, 69, false) + player.packetDispatch.sendInterfaceConfig(746, 12, false) } fun animationForTask(task: Int): Animation { From 2664e0dace8ce84d21aa70ae4c7d465139a07e1c Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 16:22:05 -0500 Subject: [PATCH 15/16] Fixed a quirk with poison ivy bushes --- .../main/kotlin/rs09/game/node/entity/skill/farming/Patch.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/Patch.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/Patch.kt index 285c2571c..3d89fa069 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/Patch.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/Patch.kt @@ -62,7 +62,7 @@ class Patch(val player: Player, val patch: FarmingPatch, var plantable: Plantabl PatchType.BUSH -> { if(isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,getBushDeathValue()) else if(isDiseased && !isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,getBushDiseaseValue()) - else player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset, plantable?.value ?: 0 + currentGrowthStage) + //else player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset, (plantable?.value ?: 0) + currentGrowthStage) } PatchType.TREE -> { if(isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset + 7,1) @@ -100,7 +100,7 @@ class Patch(val player: Player, val patch: FarmingPatch, var plantable: Plantabl private fun getBushDiseaseValue(): Int{ if(plantable == Plantable.POISON_IVY_SEED){ - return (plantable?.value ?: 0) + currentGrowthStage + 13 + return (plantable?.value ?: 0) + currentGrowthStage + 12 } else { return (plantable?.value ?: 0) + currentGrowthStage + 65 } From 8d85c4904442c0b39109889c9ba52d22577848a5 Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 23 Jul 2021 19:25:56 -0500 Subject: [PATCH 16/16] Added player-independent animateScenery method --- Server/src/main/kotlin/api/ContentAPI.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Server/src/main/kotlin/api/ContentAPI.kt b/Server/src/main/kotlin/api/ContentAPI.kt index 25b4921fa..1bbbb2b78 100644 --- a/Server/src/main/kotlin/api/ContentAPI.kt +++ b/Server/src/main/kotlin/api/ContentAPI.kt @@ -15,7 +15,6 @@ import core.game.node.entity.impl.ForceMovement import core.game.node.entity.impl.Projectile import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player -import core.game.node.entity.player.link.RunScript import core.game.node.entity.player.link.TeleportManager import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.player.link.emote.Emotes @@ -27,13 +26,14 @@ import core.game.system.task.Pulse import core.game.world.map.Direction import core.game.world.map.Location import core.game.world.map.RegionManager +import core.game.world.map.RegionManager.getRegionChunk import core.game.world.map.path.Pathfinder import core.game.world.map.zone.MapZone import core.game.world.map.zone.ZoneBorders import core.game.world.map.zone.ZoneBuilder +import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Graphics -import core.tools.RandomFunction import rs09.game.content.dialogue.DialogueFile import rs09.game.system.SystemLogger import rs09.game.world.GameWorld @@ -390,6 +390,16 @@ object ContentAPI { player.packetDispatch.sendSceneryAnimation(obj, getAnimation(animationId), global) } + /** + * Send an object animation independent of a player + */ + @JvmStatic + fun animateScenery(obj: Scenery, animationId: Int){ + val animation = Animation(animationId) + animation.setObject(obj) + getRegionChunk(obj.location).flag(AnimateObjectUpdateFlag(animation)) + } + /** * Produce a ground item owned by the player */