From db7b9d06b288d9202beb6a5295f9c684ec324c23 Mon Sep 17 00:00:00 2001 From: Ceikry Date: Thu, 31 Mar 2022 13:52:19 +0000 Subject: [PATCH] Add LogoutListener interface - allows a class to call some code on player logout - improved version of logout listeners. Add StartupListener interface - allows a class to call some code on server startup without adding messy code elsewhere Add ShutdownListener interface - allows a class to call some code on server shutdown without adding messy code elsewhere Add TickListener interface - allows a class to call some code on each tick without adding messy code elsewhere Converted all applicable content over to using these new interfaces --- .../barrows/BarrowsActivityPlugin.java | 6 +- .../bountyhunter/BountyHunterActivity.java | 8 +- .../clanwars/ClanWarsChallengeRoom.java | 4 +- .../activity/duel/DuelArenaActivity.java | 6 +- .../activity/fog/FOGActivityPlugin.java | 8 +- .../activity/guild/HeroGuildPlugin.java | 4 +- .../activity/guild/RangingGuildPlugin.java | 5 +- .../activity/magearena/MageArenaPlugin.java | 14 +- .../activity/mta/MageTrainingArenaPlugin.java | 4 +- .../activity/partyroom/PartyRoomPlugin.java | 6 +- .../PestControlActivityPlugin.java | 27 +- .../reward/PCIslandOptionPlugin.java | 4 +- .../puropuro/ElnockInquisitorDialogue.java | 4 +- .../activity/puropuro/PuroPuroPlugin.java | 12 +- .../activity/pyramidplunder/PlunderZones.java | 14 +- .../PyramidPlunderActivity.java | 6 +- .../stronghold/StrongHoldSecurityPlugin.java | 17 +- .../StrongHoldOfPlayerSafetyPlugin.java | 10 +- .../activity/wguild/WarriorsGuild.java | 4 +- .../wguild/animator/AnimatedArmour.java | 1 + .../wguild/animator/AnimationRoom.java | 11 +- .../activity/wguild/barrel/BarrelRoom.java | 4 +- .../wguild/catapult/CatapultRoom.java | 6 +- .../wguild/cyclopes/CyclopesRoom.java | 6 +- .../activity/wguild/shot/ShotPutRoom.java | 4 +- .../content/cutscene/DBRCutscenePlugin.java | 4 +- .../cutscene/JulietCutscenePlugin.java | 4 +- .../content/dialogue/JiminuaDialogue.java | 4 +- .../dialogue/MartinThwaitDialogue.java | 4 +- .../dialogue/RomilyWeaklaxDialogue.java | 4 +- .../content/dialogue/RugMerchantDialogue.java | 4 +- .../global/action/DoorActionHandler.java | 23 +- .../shootingstar/StarChartPlugin.java | 4 +- .../holiday/christmas/ChristmasEvent.java | 6 +- .../holiday/easter/BasketofEggsEvent.java | 4 +- .../holiday/halloween/DeathMansionEvent.java | 1726 ----------------- .../content/quest/free/ErnestTheChicken.java | 4 +- .../BlackKnightsFortress.java | 4 +- .../quest/free/demonslayer/DemonSlayer.java | 4 +- .../quest/free/dragonslayer/DragonSlayer.java | 4 +- .../free/goblindiplomacy/GoblinDiplomacy.java | 4 +- .../GoblinDiplomacyPlugin.java | 4 +- .../free/piratestreasure/PiratesTreasure.java | 4 +- .../free/princealirescue/PrinceAliRescue.java | 4 +- .../free/shieldofarrav/ShieldofArrav.java | 4 +- .../free/therestlessghost/RestlessGhost.java | 4 +- .../animalmagnetism/AliceHusbandDialogue.java | 4 +- .../animalmagnetism/AnimalMagnetism.java | 22 +- .../AnimalMagnetismPlugin.java | 4 +- .../animalmagnetism/AvasDevicePlugin.java | 4 +- .../members/dwarfcannon/DwarfCannon.java | 12 +- .../members/junglepotion/JunglePotion.java | 8 +- .../quest/members/lostcity/LostCity.java | 12 +- .../merlinscrystal/CandleMakerDialogue.java | 4 +- .../members/merlinscrystal/MerlinCrystal.java | 4 +- .../merlinscrystal/MerlinCrystalPlugin.java | 6 +- .../rovingelves/MossGiantGuardianNPC.java | 4 +- .../members/rovingelves/RovingElves.java | 12 +- .../members/thetouristrap/AnaDialogue.java | 6 +- .../thetouristrap/DesertGuardDialogue.java | 4 +- .../MercenaryCaptainDialogue.java | 4 +- .../members/thetouristrap/RowdySlaveNPC.java | 4 +- .../members/thetouristrap/TouristTrap.java | 4 +- .../thetouristrap/TouristTrapPlugin.java | 30 +- .../members/waterfallquest/WaterFall.java | 4 +- .../waterfallquest/WaterfallPlugin.java | 19 +- .../members/whatliesbelow/WLBelowPlugin.java | 16 +- .../members/whatliesbelow/WhatLiesBelow.java | 4 +- .../witchshouse/WitchsHousePlugin.java | 6 +- .../miniquest/surok/HuntForSurokPlugin.java | 10 +- .../tutorialisland/BasicStarter.java | 44 - .../game/content/ttrail/EmoteCluePlugin.java | 4 +- .../content/ttrail/TreasureTrailPlugin.java | 19 +- .../java/core/game/content/ttrail/UriNPC.java | 4 +- .../game/content/zone/ChaosTunnelZone.java | 4 +- .../game/content/zone/WildernessAreaZone.java | 4 +- .../content/zone/neitiznot/NeitiznotZone.java | 4 +- .../content/zone/phasmatys/GravingasNPC.java | 4 +- .../content/zone/phasmatys/PhasmatysZone.java | 16 +- .../zone/rellekka/JarvaldDialogue.java | 9 +- .../content/zone/rellekka/RellekkaZone.java | 18 +- .../zone/wbisland/WaterBirthDungeonZone.java | 10 +- .../core/game/ge/GrandExchangeDatabase.java | 20 +- .../interaction/city/ShiloVillagePlugin.java | 4 +- .../interaction/city/TrollheimPlugin.java | 12 +- .../interaction/city/WizardTowerPlugin.java | 16 +- .../game/interaction/city/ZanarisPlugin.java | 4 +- .../inter/OrbViewingInterface.java | 4 +- .../item/DragonfireShieldPlugin.java | 4 +- .../interaction/item/ExplorersRingPlugin.kt | 4 +- .../game/interaction/item/FishbowlPlugin.java | 8 +- .../game/interaction/item/GodBookPlugin.java | 9 +- .../interaction/item/MorphItemPlugin.java | 4 +- .../item/toys/SnowGlobePlugin.java | 5 +- .../item/withitem/DarkBowDyePlugin.java | 4 +- .../item/withitem/GraniteMaulPlugin.java | 4 +- .../item/withitem/LavaScalePlugin.java | 4 +- .../item/withobject/IncubatorPlugin.java | 4 +- .../item/withobject/SmithingPlugin.java | 4 +- .../withobject/SpiritShieldBlessPlugin.java | 4 +- .../game/interaction/npc/BogrogPlugin.java | 4 +- .../interaction/npc/SecurityGuardPlugin.java | 4 +- .../core/game/interaction/npc/ZaffPlugin.kt | 2 +- .../interaction/npc/ZahurOptionPlugin.java | 4 +- .../interaction/npc/bob/BobRepairItem.java | 4 +- .../SorceressApprenticePlugin.java | 8 +- .../interaction/object/CowMilkingPlugin.java | 4 +- .../object/CrystalChestPlugin.java | 4 +- .../object/LumbridgeBasementPlugin.java | 6 +- .../interaction/object/PyreSitePlugin.java | 4 +- .../object/SinclairFlourBarrelPlugin.java | 4 +- .../object/WildernessLeverPlugin.java | 4 +- .../interaction/object/dmc/DMCHandler.java | 48 +- .../object/dmc/DwarfMultiCannonPlugin.java | 4 +- .../object/sorceress/GardenObjectsPlugin.kt | 19 +- .../wildyditch/WildernessDitchPlugin.java | 4 +- .../game/node/entity/npc/Metamorphosis.java | 4 +- .../node/entity/npc/bosses/TzRekJadNPC.java | 4 +- .../node/entity/npc/drop/CELEMinorTable.java | 12 +- .../node/entity/npc/drop/RareDropTable.java | 12 +- .../npc/familiar/CockatriceFamiliarNPC.java | 14 +- .../entity/npc/familiar/CompostMoundNPC.java | 6 +- .../entity/npc/familiar/DesertWyrmNPC.java | 4 +- .../entity/npc/familiar/ForgeRegentNPC.java | 4 +- .../node/entity/npc/familiar/MacawNPC.java | 4 +- .../npc/familiar/MinotaurFamiliarNPC.java | 14 +- .../node/entity/npc/familiar/PyreLordNPC.java | 4 +- .../npc/familiar/UnicornStallionNPC.java | 4 +- .../entity/npc/familiar/VoidFamiliarNPC.java | 12 +- .../game/node/entity/npc/other/BorkNPC.java | 10 +- .../node/entity/npc/other/GraveStoneNPC.java | 4 +- .../entity/npc/revenant/CorruptEquipment.java | 4 +- .../entity/npc/revenant/PVPEquipment.java | 4 +- .../entity/npc/revenant/RevenantPlugin.java | 4 +- .../core/game/node/entity/player/Player.java | 39 +- .../entity/skill/agility/AgilityHandler.java | 22 +- .../skill/agility/brimhaven/BladeTrap.java | 12 +- .../agility/brimhaven/BrimhavenCourse.java | 29 +- .../skill/agility/brimhaven/DartTrap.java | 13 +- .../skill/agility/brimhaven/FloorSpikes.java | 12 +- .../skill/agility/brimhaven/PressurePad.java | 12 +- .../agility/brimhaven/SpinningBlades.java | 12 +- .../agility/pyramid/AgilityPyramidCourse.java | 6 +- .../skill/agility/pyramid/RollingBlock.java | 12 +- .../agility/shortcuts/MonkeyBarShortcut.java | 11 +- .../skill/construction/BuildOptionPlugin.java | 4 +- .../construction/PortalOptionPlugin.java | 4 +- .../decoration/StaircasePlugin.java | 6 +- .../decoration/kitchen/LarderPlugin.java | 4 +- .../decoration/kitchen/ShelfPlugin.java | 4 +- .../portalchamber/PortalChamberPlugin.java | 4 +- .../workshop/ClockmakersBenchPlugin.java | 4 +- .../decoration/workshop/ToolsPlugin.java | 4 +- .../construction/npc/HouseServantPlugin.java | 4 +- .../skill/hunter/FalconryActivityPlugin.java | 6 +- .../entity/skill/hunter/HunterPlugin.java | 12 +- .../entity/skill/hunter/ImpBoxPlugin.java | 6 +- .../skill/hunter/ImpetuousImpulses.java | 7 +- .../runecrafting/RunecraftingPlugin.java | 12 +- .../node/entity/skill/slayer/GargoyleNPC.java | 4 +- .../entity/skill/slayer/RockSlugPlugin.java | 6 +- .../skill/slayer/SlayerRewardPlugin.java | 6 +- .../skill/slayer/dungeon/AncientCavern.java | 4 +- .../slayer/dungeon/LumbridgeDungeon.java | 4 +- .../skill/slayer/dungeon/SmokeDungeon.java | 4 +- .../summoning/SummoningCreationPlugin.java | 5 +- .../summoning/SummoningTrainingRoom.java | 4 +- .../core/game/system/SystemTermination.java | 45 +- .../core/game/system/task/ItemLogoutTask.java | 34 - .../game/system/task/LocationLogoutTask.java | 33 - .../core/game/system/task/LogoutTask.java | 63 - .../core/game/world/callback/CallBack.java | 16 - .../core/game/world/map/zone/ZoneBuilder.java | 7 +- .../game/world/objectparser/ObjectParser.java | 18 +- Server/src/main/kotlin/api/LoginListener.kt | 5 + Server/src/main/kotlin/api/LogoutListener.kt | 11 + .../src/main/kotlin/api/ShutdownListener.kt | 10 + Server/src/main/kotlin/api/StartupListener.kt | 10 + Server/src/main/kotlin/api/TickListener.kt | 11 + Server/src/main/kotlin/rs09/GlobalStats.kt | 2 +- Server/src/main/kotlin/rs09/Server.kt | 4 - Server/src/main/kotlin/rs09/ServerStore.kt | 119 +- .../general/scriptrepository/PlayerScripts.kt | 13 - .../content/activity/allfiredup/AFUSession.kt | 30 +- .../FishingTrawlerInteractionHandler.kt | 2 - .../fishingtrawler/FishingTrawlerSession.kt | 27 +- .../game/content/global/GlobalKillCounter.kt | 138 +- .../content/global/worldevents/WorldEvent.kt | 4 +- .../holiday/christmas/GiftRollPlugin.kt | 2 +- .../holiday/halloween/GrimDialogue.kt | 2 +- .../holiday/halloween/TrickOrTreatHandler.kt | 4 +- .../worldevents/penguinhns/PenguinManager.kt | 2 +- .../worldevents/shootingstar/ShootingStar.kt | 7 +- .../shootingstar/StarSpriteDialogue.kt | 2 +- .../rs09/game/content/jobs/JobManager.kt | 2 +- .../jobs/WorkForInteractionListener.kt | 2 +- .../main/kotlin/rs09/game/ge/GEAutoStock.kt | 7 +- .../main/kotlin/rs09/game/ge/GrandExchange.kt | 402 ++-- .../kotlin/rs09/game/interaction/Listener.kt | 7 +- .../game/interaction/item/StarRingListener.kt | 2 +- .../entity/npc/other/AlKharidWarriorPlugin.kt | 4 +- .../player/info/stats/StatsCommandSet.kt | 3 +- .../skill/agility/BarbarianOutpostCourse.kt | 4 +- .../skill/agility/GnomeStrongholdCourse.kt | 3 - .../decoration/study/LecternPlugin.kt | 2 +- .../gather/fishing/barbfishing/SpotManager.kt | 9 +- .../skill/runecrafting/abyss/AbyssPlugin.kt | 2 +- .../entity/state/newsys/StateRepository.kt | 49 +- .../kotlin/rs09/game/system/SystemLogger.kt | 10 + .../rs09/game/system/command/Command.kt | 5 - .../rs09/game/system/command/Privilege.kt | 7 + .../system/command/oldsys/AIPCommandPlugin.kt | 1 - .../rottenpotato/RottenPotatoRSHDDialogue.kt | 2 +- .../command/sets/AnimationCommandSet.kt | 3 +- .../system/command/sets/BottingCommandSet.kt | 3 +- .../game/system/command/sets/CommandSet.kt | 5 +- .../system/command/sets/ConfigCommandSet.kt | 3 +- .../command/sets/DevelopmentCommandSet.kt | 3 +- .../game/system/command/sets/FunCommandSet.kt | 7 +- .../system/command/sets/MiscCommandSet.kt | 53 +- .../command/sets/ModerationCommandSet.kt | 5 +- .../system/command/sets/MusicCommandSet.kt | 5 +- .../system/command/sets/QuestCommandSet.kt | 5 +- .../system/command/sets/SlayerCommandSet.kt | 3 +- .../system/command/sets/SpawnCommandSet.kt | 3 +- .../system/command/sets/SystemCommandSet.kt | 15 +- .../system/command/sets/TeleportCommandSet.kt | 3 +- .../main/kotlin/rs09/game/world/GameWorld.kt | 52 +- .../kotlin/rs09/game/world/ImmerseWorld.kt | 291 ++- .../rs09/game/world/callback/CallbackHub.kt | 30 - .../{PluginManager.kt => ClassScanner.kt} | 60 +- .../kotlin/rs09/worker/MajorUpdateWorker.kt | 1 + 232 files changed, 1498 insertions(+), 3232 deletions(-) delete mode 100644 Server/src/main/java/core/game/content/holiday/halloween/DeathMansionEvent.java delete mode 100644 Server/src/main/java/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java delete mode 100644 Server/src/main/java/core/game/system/task/ItemLogoutTask.java delete mode 100644 Server/src/main/java/core/game/system/task/LocationLogoutTask.java delete mode 100644 Server/src/main/java/core/game/system/task/LogoutTask.java delete mode 100644 Server/src/main/java/core/game/world/callback/CallBack.java create mode 100644 Server/src/main/kotlin/api/LogoutListener.kt create mode 100644 Server/src/main/kotlin/api/ShutdownListener.kt create mode 100644 Server/src/main/kotlin/api/StartupListener.kt create mode 100644 Server/src/main/kotlin/api/TickListener.kt create mode 100644 Server/src/main/kotlin/rs09/game/system/command/Privilege.kt delete mode 100644 Server/src/main/kotlin/rs09/game/world/callback/CallbackHub.kt rename Server/src/main/kotlin/rs09/plugin/{PluginManager.kt => ClassScanner.kt} (61%) diff --git a/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java b/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java index 81c153d46..3e3da1f33 100644 --- a/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java +++ b/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java @@ -32,7 +32,7 @@ import core.plugin.Initializable; import core.tools.RandomFunction; import rs09.game.content.activity.barrows.RewardChest; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import static api.ContentAPIKt.getWorldTicks; @@ -371,8 +371,8 @@ public final class BarrowsActivityPlugin extends ActivityPlugin { @Override public void configure() { - PluginManager.definePlugin(new TunnelEntranceDialogue()); - PluginManager.definePlugin(BarrowsPuzzle.SHAPES); + ClassScanner.definePlugin(new TunnelEntranceDialogue()); + ClassScanner.definePlugin(BarrowsPuzzle.SHAPES); registerRegion(14231); BarrowsCrypt.init(); PULSE.stop(); diff --git a/Server/src/main/java/core/game/content/activity/bountyhunter/BountyHunterActivity.java b/Server/src/main/java/core/game/content/activity/bountyhunter/BountyHunterActivity.java index 5bce8f92c..5527b0592 100644 --- a/Server/src/main/java/core/game/content/activity/bountyhunter/BountyHunterActivity.java +++ b/Server/src/main/java/core/game/content/activity/bountyhunter/BountyHunterActivity.java @@ -28,7 +28,7 @@ import core.game.world.map.zone.impl.WildernessZone; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import java.util.*; @@ -170,7 +170,7 @@ public final class BountyHunterActivity extends ActivityPlugin { break; } } - PluginManager.definePlugin(new ComponentPlugin() { + ClassScanner.definePlugin(new ComponentPlugin() { @Override public Plugin newInstance(Object arg) throws Throwable { ComponentDefinition.put(657, this); @@ -194,8 +194,8 @@ public final class BountyHunterActivity extends ActivityPlugin { }); BHScoreBoard.init(); - PluginManager.definePlugin(new BountyLocateSpell()); - PluginManager.definePlugin(new BHOptionHandler()); + ClassScanner.definePlugin(new BountyLocateSpell()); + ClassScanner.definePlugin(new BHOptionHandler()); ActivityManager.register(new BountyHunterActivity(CraterType.MID_LEVEL)); ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL)); } diff --git a/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java b/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java index 46a609aa5..61401fc21 100644 --- a/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java +++ b/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java @@ -12,7 +12,7 @@ import core.game.world.map.zone.ZoneRestriction; import core.game.world.map.zone.impl.WildernessZone; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the clan wars challenge room. @@ -86,7 +86,7 @@ public final class ClanWarsChallengeRoom extends MapZone implements Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new CWChallengeOption()); + ClassScanner.definePlugin(new CWChallengeOption()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/duel/DuelArenaActivity.java b/Server/src/main/java/core/game/content/activity/duel/DuelArenaActivity.java index 34fc12bb1..a6f276fed 100644 --- a/Server/src/main/java/core/game/content/activity/duel/DuelArenaActivity.java +++ b/Server/src/main/java/core/game/content/activity/duel/DuelArenaActivity.java @@ -16,7 +16,7 @@ import core.game.world.map.Location; import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -141,8 +141,8 @@ public final class DuelArenaActivity extends ActivityPlugin { } parseScoreboard(); register(new ZoneBorders(3325, 3201, 3396, 3280)); - PluginManager.definePlugin(new DuelArea.ForfeitTrapdoorPlugin()); - PluginManager.definePlugins(new DuelSession(null, null, false), new DuelComponentPlugin(), new ChallengeOptionPlugin()); + ClassScanner.definePlugin(new DuelArea.ForfeitTrapdoorPlugin()); + ClassScanner.definePlugins(new DuelSession(null, null, false), new DuelComponentPlugin(), new ChallengeOptionPlugin()); } /** diff --git a/Server/src/main/java/core/game/content/activity/fog/FOGActivityPlugin.java b/Server/src/main/java/core/game/content/activity/fog/FOGActivityPlugin.java index 6bbbb4ed9..41ffc53cb 100644 --- a/Server/src/main/java/core/game/content/activity/fog/FOGActivityPlugin.java +++ b/Server/src/main/java/core/game/content/activity/fog/FOGActivityPlugin.java @@ -8,7 +8,7 @@ import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.game.world.map.zone.ZoneBorders; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the fist of guthix activity. @@ -50,9 +50,9 @@ public class FOGActivityPlugin extends ActivityPlugin { @Override public void configure() { - PluginManager.definePlugin(new FOGLobbyZone()); - PluginManager.definePlugin(new FOGWaitingZone()); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new FOGLobbyZone()); + ClassScanner.definePlugin(new FOGWaitingZone()); + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(30204).getHandlers().put("option:enter", this); diff --git a/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java b/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java index fa46612bd..1ff29fbc4 100644 --- a/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java +++ b/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java @@ -15,7 +15,7 @@ import core.game.node.scenery.Scenery; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the hero guild. @@ -28,7 +28,7 @@ public final class HeroGuildPlugin extends OptionHandler { public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(2624).getHandlers().put("option:open", this); SceneryDefinition.forId(2625).getHandlers().put("option:open", this); - PluginManager.definePlugin(new JewelleryRechargePlugin()); + ClassScanner.definePlugin(new JewelleryRechargePlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/guild/RangingGuildPlugin.java b/Server/src/main/java/core/game/content/activity/guild/RangingGuildPlugin.java index 07551a021..ddf6879c4 100644 --- a/Server/src/main/java/core/game/content/activity/guild/RangingGuildPlugin.java +++ b/Server/src/main/java/core/game/content/activity/guild/RangingGuildPlugin.java @@ -9,10 +9,9 @@ import core.game.component.ComponentPlugin; import core.game.container.impl.EquipmentContainer; import core.plugin.Initializable; import org.rs09.consts.Items; -import core.game.node.entity.Entity; import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.player.link.diary.DiaryType; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import core.game.content.dialogue.DialoguePlugin; import core.game.content.dialogue.FacialExpression; @@ -58,7 +57,7 @@ public final class RangingGuildPlugin extends OptionHandler { new BowArrowSalesman().init(); new WarningInterface().newInstance(arg); new CompetitionJudge().init(); - PluginManager.definePlugin(new TowerArcher()); + ClassScanner.definePlugin(new TowerArcher()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/magearena/MageArenaPlugin.java b/Server/src/main/java/core/game/content/activity/magearena/MageArenaPlugin.java index 7000ff01f..144a795d3 100644 --- a/Server/src/main/java/core/game/content/activity/magearena/MageArenaPlugin.java +++ b/Server/src/main/java/core/game/content/activity/magearena/MageArenaPlugin.java @@ -20,7 +20,7 @@ import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.content.global.action.PickupHandler; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the mage arena activity. @@ -41,12 +41,12 @@ public final class MageArenaPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(MAGE_ARENA); - PluginManager.definePlugin(new KolodionNPC()); - PluginManager.definePlugin(new MageArenaNPC()); - PluginManager.definePlugin(new LundailDialogue()); - PluginManager.definePlugin(new KolodionDialogue()); - PluginManager.definePlugin(new ChamberGuardianDialogue()); + ClassScanner.definePlugin(MAGE_ARENA); + ClassScanner.definePlugin(new KolodionNPC()); + ClassScanner.definePlugin(new MageArenaNPC()); + ClassScanner.definePlugin(new LundailDialogue()); + ClassScanner.definePlugin(new KolodionDialogue()); + ClassScanner.definePlugin(new ChamberGuardianDialogue()); ItemDefinition.forId(2412).getHandlers().put("option:drop", this); ItemDefinition.forId(2413).getHandlers().put("option:drop", this); ItemDefinition.forId(2414).getHandlers().put("option:drop", this); diff --git a/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java b/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java index eab29ad89..481f028b8 100644 --- a/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java +++ b/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java @@ -18,7 +18,7 @@ import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.content.activity.mta.EnchantSpell; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the mage training area interactions. @@ -52,7 +52,7 @@ public class MageTrainingArenaPlugin extends OptionHandler { ItemDefinition.forId(TelekineticZone.STATUE).getHandlers().put("option:observe", this); ItemDefinition.forId(TelekineticZone.STATUE).getHandlers().put("option:reset", this); NPCDefinition.forId(3102).getHandlers().put("option:talk-to", this); - PluginManager.definePlugins(new CharmedWarriorDialogue(), new EntranceGuardianDialogue(), new RewardsGuardianDialogue(), new ProgressHatDialogue(), new EnchantmentGuardianDialogue(), new EnchantSpell(), new GraveyardGuardianDialogue(), new AlchemyGuardianDialogue(), new TelekineticGrabSpell(), new TelekineticGuardianDialogue(), new MazeGuardianDialogue()); + ClassScanner.definePlugins(new CharmedWarriorDialogue(), new EntranceGuardianDialogue(), new RewardsGuardianDialogue(), new ProgressHatDialogue(), new EnchantmentGuardianDialogue(), new EnchantSpell(), new GraveyardGuardianDialogue(), new AlchemyGuardianDialogue(), new TelekineticGrabSpell(), new TelekineticGuardianDialogue(), new MazeGuardianDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/partyroom/PartyRoomPlugin.java b/Server/src/main/java/core/game/content/activity/partyroom/PartyRoomPlugin.java index f11a183c7..0f33e8836 100644 --- a/Server/src/main/java/core/game/content/activity/partyroom/PartyRoomPlugin.java +++ b/Server/src/main/java/core/game/content/activity/partyroom/PartyRoomPlugin.java @@ -27,7 +27,7 @@ import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the party room. @@ -72,8 +72,8 @@ public final class PartyRoomPlugin extends OptionHandler { SceneryDefinition.forId(OPEN_CHEST).getHandlers().put("option:deposit", this); SceneryDefinition.forId(OPEN_CHEST).getHandlers().put("option:shut", this); SceneryDefinition.forId(LEVER).getHandlers().put("option:pull", this); - PluginManager.definePlugin(new DepositInterfaceHandler()); - PluginManager.definePlugin(new BalloonManager()); + ClassScanner.definePlugin(new DepositInterfaceHandler()); + ClassScanner.definePlugin(new BalloonManager()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java b/Server/src/main/java/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java index 31547bbd4..d7a665895 100644 --- a/Server/src/main/java/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java +++ b/Server/src/main/java/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java @@ -18,7 +18,6 @@ import core.game.node.entity.state.EntityState; import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.game.system.task.Pulse; -import rs09.game.ai.AIPlayer; import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.map.build.DynamicRegion; @@ -26,7 +25,7 @@ import core.game.world.map.zone.RegionZone; import core.game.world.map.zone.ZoneBuilder; import core.game.world.map.zone.ZoneRestriction; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import core.tools.StringUtils; import core.game.content.activity.pestcontrol.monsters.*; @@ -220,18 +219,18 @@ public final class PestControlActivityPlugin extends ActivityPlugin { ActivityManager.register(activities[1]); ActivityManager.register(activities[2]); // Load abstract NPC plugins - PluginManager.definePlugin(new PCPortalNPC()); - PluginManager.definePlugin(new PCSquireNPC()); - PluginManager.definePlugin(new PCTorcherNPC()); - PluginManager.definePlugin(new PCDefilerNPC()); - PluginManager.definePlugin(new PCRavagerNPC()); - PluginManager.definePlugin(new PCShifterNPC()); - PluginManager.definePlugin(new PCSplatterNPC()); - PluginManager.definePlugin(new PCSpinnerNPC()); - PluginManager.definePlugin(new PCBrawlerNPC()); - PluginManager.definePlugin(new PCObjectHandler()); - PluginManager.definePlugin(new PestControlSquire()); - PluginManager.definePlugin(new VoidSealPlugin()); + ClassScanner.definePlugin(new PCPortalNPC()); + ClassScanner.definePlugin(new PCSquireNPC()); + ClassScanner.definePlugin(new PCTorcherNPC()); + ClassScanner.definePlugin(new PCDefilerNPC()); + ClassScanner.definePlugin(new PCRavagerNPC()); + ClassScanner.definePlugin(new PCShifterNPC()); + ClassScanner.definePlugin(new PCSplatterNPC()); + ClassScanner.definePlugin(new PCSpinnerNPC()); + ClassScanner.definePlugin(new PCBrawlerNPC()); + ClassScanner.definePlugin(new PCObjectHandler()); + ClassScanner.definePlugin(new PestControlSquire()); + ClassScanner.definePlugin(new VoidSealPlugin()); ZoneBuilder.configure(new PCLanderZone(activities)); ZoneBuilder.configure(new PCIslandZone()); } diff --git a/Server/src/main/java/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java b/Server/src/main/java/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java index 8ab61ef0d..8b3843558 100644 --- a/Server/src/main/java/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java +++ b/Server/src/main/java/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java @@ -6,7 +6,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the option plugin used to handle the pc island related nodes. @@ -20,7 +20,7 @@ public final class PCIslandOptionPlugin extends OptionHandler { for (int id : new int[] { 3786, 3788, 3789, 5956 }) { NPCDefinition.forId(id).getHandlers().put("option:exchange", this); } - PluginManager.definePlugin(new PCRewardInterface()); + ClassScanner.definePlugin(new PCRewardInterface()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java b/Server/src/main/java/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java index 2a2058f69..363826102 100644 --- a/Server/src/main/java/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java +++ b/Server/src/main/java/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java @@ -9,7 +9,7 @@ import core.game.node.entity.skill.hunter.bnet.ImplingNode; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.game.content.activity.puropuro.ElnockInquisitorDialogue.ElnockExchangeInterfaceHandler.ElnockExchange; @@ -188,7 +188,7 @@ public final class ElnockInquisitorDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new ElnockExchangeInterfaceHandler()); + ClassScanner.definePlugin(new ElnockExchangeInterfaceHandler()); } @Override diff --git a/Server/src/main/java/core/game/content/activity/puropuro/PuroPuroPlugin.java b/Server/src/main/java/core/game/content/activity/puropuro/PuroPuroPlugin.java index fede65a3f..8a689c09c 100644 --- a/Server/src/main/java/core/game/content/activity/puropuro/PuroPuroPlugin.java +++ b/Server/src/main/java/core/game/content/activity/puropuro/PuroPuroPlugin.java @@ -32,7 +32,7 @@ import core.net.packet.PacketRepository; import core.net.packet.context.MinimapStateContext; import core.net.packet.out.MinimapState; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -74,11 +74,11 @@ public final class PuroPuroPlugin extends MapZone implements Plugin { public Plugin newInstance(Object arg) throws Throwable { PULSE.stop(); ZoneBuilder.configure(this); - PluginManager.definePlugin(new FairyAerykaDialogue()); - PluginManager.definePlugin(new WanderingImplingDialogue()); - PluginManager.definePlugin(new ElnockInquisitorDialogue()); - PluginManager.definePlugin(new PuroOptionHandler()); - PluginManager.definePlugin(new ImpDefenderNPC()); + ClassScanner.definePlugin(new FairyAerykaDialogue()); + ClassScanner.definePlugin(new WanderingImplingDialogue()); + ClassScanner.definePlugin(new ElnockInquisitorDialogue()); + ClassScanner.definePlugin(new PuroOptionHandler()); + ClassScanner.definePlugin(new ImpDefenderNPC()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/pyramidplunder/PlunderZones.java b/Server/src/main/java/core/game/content/activity/pyramidplunder/PlunderZones.java index 2f3fbcf9c..844511198 100644 --- a/Server/src/main/java/core/game/content/activity/pyramidplunder/PlunderZones.java +++ b/Server/src/main/java/core/game/content/activity/pyramidplunder/PlunderZones.java @@ -11,8 +11,6 @@ import core.game.node.entity.skill.Skills; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.world.map.Location; import core.game.world.map.zone.MapZone; import core.game.world.map.zone.ZoneBorders; @@ -21,6 +19,7 @@ import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; import core.tools.RandomFunction; +import kotlin.Unit; import rs09.game.Varp; import rs09.game.content.activity.pyramidplunder.PlunderSession; @@ -112,12 +111,21 @@ public class PlunderZones implements Plugin { if(session != null){ session.resetVars(); } - e.asPlayer().addExtension(LogoutTask.class, new LocationLogoutTask(12, Location.create(3288, 2801, 0))); + e.asPlayer().logoutListeners.put("plunder-logout", player -> { + player.setLocation(Location.create(3288, 2801, 0)); + return Unit.INSTANCE; + }); updateRoomVarp(e.asPlayer()); } return true; } + @Override + public boolean leave(Entity e, boolean logout) { + e.asPlayer().logoutListeners.remove("plunder-logout"); + return super.leave(e, logout); + } + public void updateRoomVarp(Player player){ Varp varp = player.varpManager.get(822); varp.setVarbit(0,room.reqLevel); diff --git a/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java b/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java index c190933f5..c8be4ea2e 100644 --- a/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java +++ b/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java @@ -7,7 +7,7 @@ import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.plugin.Initializable; import rs09.game.content.activity.pyramidplunder.PlunderSession; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the Pyramid plunder activity. @@ -64,8 +64,8 @@ public final class PyramidPlunderActivity extends ActivityPlugin { @Override public void register() { - PluginManager.definePlugin(new GuardMummyDialogue()); - PluginManager.definePlugin(new PyramidOptionHandler()); + ClassScanner.definePlugin(new GuardMummyDialogue()); + ClassScanner.definePlugin(new PyramidOptionHandler()); mummy = NPC.create(4476, Location.create(1968, 4427, 2)); mummy.init(); registerRegion(7749); diff --git a/Server/src/main/java/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java b/Server/src/main/java/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java index f80105131..caa363638 100644 --- a/Server/src/main/java/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java +++ b/Server/src/main/java/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java @@ -13,7 +13,6 @@ import core.game.interaction.OptionHandler; import core.game.node.Node; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.diary.DiaryType; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.game.system.task.Pulse; @@ -24,7 +23,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -50,13 +49,13 @@ public final class StrongHoldSecurityPlugin extends MapZone implements Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new ExplorerDialogue()); - PluginManager.definePlugin(new StrongholdDialogue()); - PluginManager.definePlugin(new GrainOfPlentyDialogue()); - PluginManager.definePlugin(new GiftOfPeaceDialogue()); - PluginManager.definePlugin(new CradleOfLifeDialogue()); - PluginManager.definePlugin(new BoxOfHealthDialogue()); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new ExplorerDialogue()); + ClassScanner.definePlugin(new StrongholdDialogue()); + ClassScanner.definePlugin(new GrainOfPlentyDialogue()); + ClassScanner.definePlugin(new GiftOfPeaceDialogue()); + ClassScanner.definePlugin(new CradleOfLifeDialogue()); + ClassScanner.definePlugin(new BoxOfHealthDialogue()); + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(16154).getHandlers().put("option:climb-down", this); diff --git a/Server/src/main/java/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java b/Server/src/main/java/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java index 9501564fb..6a5ea30cf 100644 --- a/Server/src/main/java/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java +++ b/Server/src/main/java/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java @@ -12,7 +12,7 @@ import core.net.packet.context.CameraContext.CameraType; import core.net.packet.out.CameraViewPacket; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * @author Tyler Telis @@ -47,10 +47,10 @@ public class StrongHoldOfPlayerSafetyPlugin implements Plugin { @Override public Plugin newInstance(Object object) throws Throwable { - PluginManager.definePlugin(new PSOptionHandler()); - PluginManager.definePlugin(new GuardDialoguePlugin()); - PluginManager.definePlugin(new PlayerSafetyTest()); - PluginManager.definePlugin(new ProfessorHenryDialogue()); + ClassScanner.definePlugin(new PSOptionHandler()); + ClassScanner.definePlugin(new GuardDialoguePlugin()); + ClassScanner.definePlugin(new PlayerSafetyTest()); + ClassScanner.definePlugin(new ProfessorHenryDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/wguild/WarriorsGuild.java b/Server/src/main/java/core/game/content/activity/wguild/WarriorsGuild.java index 9fd0abc29..46f97de44 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/WarriorsGuild.java +++ b/Server/src/main/java/core/game/content/activity/wguild/WarriorsGuild.java @@ -14,7 +14,7 @@ import core.game.node.scenery.Scenery; import core.game.world.map.Location; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the warrior guild options. @@ -35,7 +35,7 @@ public final class WarriorsGuild extends OptionHandler { SceneryDefinition.forId(1530).getHandlers().put("option:open", this); NPCDefinition.forId(4287).getHandlers().put("option:claim-shield", this); NPCDefinition.setOptionHandler("claim-tokens", this); - PluginManager.definePlugin(new ClaimTokenDialogue()); + ClassScanner.definePlugin(new ClaimTokenDialogue()); return this; } 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 09c18794d..9d59eb594 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 @@ -119,6 +119,7 @@ public final class AnimatedArmour extends NPC { int amount = set.getTokenAmount(); GroundItemManager.create(new Item(8851, amount), location, player); } + player.logoutListeners.remove("animation-room"); player.removeAttribute("animated_set"); } } diff --git a/Server/src/main/java/core/game/content/activity/wguild/animator/AnimationRoom.java b/Server/src/main/java/core/game/content/activity/wguild/animator/AnimationRoom.java index 67fbb13fe..1fa7a24ad 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/animator/AnimationRoom.java +++ b/Server/src/main/java/core/game/content/activity/wguild/animator/AnimationRoom.java @@ -8,9 +8,8 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.node.scenery.Scenery; -import core.game.system.task.ItemLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.zone.MapZone; @@ -112,7 +111,7 @@ public final class AnimationRoom extends MapZone implements Plugin { */ private void animateArmour(final Player player, final Scenery object, final ArmourSet set) { if (!player.getInventory().containItems(set.getPieces())) { - player.getDialogueInterpreter().sendDialogue("You need a plate body, playe legs and full helm of the same type to", "activate the armour animator."); + player.getDialogueInterpreter().sendDialogue("You need a plate body, plate legs and full helm of the same type to", "activate the armour animator."); return; } if (player.getAttribute("animated_set") != null) { @@ -134,7 +133,10 @@ public final class AnimationRoom extends MapZone implements Plugin { } } player.getAudioManager().send(1909); - player.addExtension(LogoutTask.class, new ItemLogoutTask(5, new Item(set.getPieces()[0]), new Item(set.getPieces()[1]), new Item(set.getPieces()[2]))); + player.logoutListeners.put("animation-room", player1 -> { + for(int item : set.getPieces()) player1.getInventory().add(new Item(item)); + return Unit.INSTANCE; + }); player.getDialogueInterpreter().sendPlainMessage(true, "The animator hums, something appears to be working.", "You stand back..."); spawn = true; super.setDelay(4); @@ -146,7 +148,6 @@ public final class AnimationRoom extends MapZone implements Plugin { ForceMovement.run(player, player.getLocation().transform(0, 1, 0)).setDirection(Direction.SOUTH); return false; } - player.removeExtension(LogoutTask.class); player.getInterfaceManager().closeChatbox(); NPC npc = new AnimatedArmour(player, object.getLocation(), set); player.setAttribute("animated_set", npc); diff --git a/Server/src/main/java/core/game/content/activity/wguild/barrel/BarrelRoom.java b/Server/src/main/java/core/game/content/activity/wguild/barrel/BarrelRoom.java index 50b3eaa64..8cbdbef2a 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/barrel/BarrelRoom.java +++ b/Server/src/main/java/core/game/content/activity/wguild/barrel/BarrelRoom.java @@ -23,7 +23,7 @@ import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -86,7 +86,7 @@ public final class BarrelRoom extends MapZone implements Plugin { public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); pulse.stop(); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(15668).getHandlers().put("option:pick-up", this); diff --git a/Server/src/main/java/core/game/content/activity/wguild/catapult/CatapultRoom.java b/Server/src/main/java/core/game/content/activity/wguild/catapult/CatapultRoom.java index 2b8c6a4be..0e71075fb 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/catapult/CatapultRoom.java +++ b/Server/src/main/java/core/game/content/activity/wguild/catapult/CatapultRoom.java @@ -30,7 +30,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -164,7 +164,7 @@ public final class CatapultRoom extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { ItemDefinition.forId(SHIELD_ID).getHandlers().put("option:wield", this); @@ -195,7 +195,7 @@ public final class CatapultRoom extends MapZone implements Plugin { return true; } }); - PluginManager.definePlugin(new ComponentPlugin() { + ClassScanner.definePlugin(new ComponentPlugin() { @Override public Plugin newInstance(Object arg) throws Throwable { ComponentDefinition.put(411, this); diff --git a/Server/src/main/java/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java b/Server/src/main/java/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java index 4ef808d96..6a79a3b12 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java +++ b/Server/src/main/java/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java @@ -28,7 +28,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.map.zone.ZoneRestriction; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -130,8 +130,8 @@ public final class CyclopesRoom extends MapZone implements Plugin { public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); PULSE.stop(); - PluginManager.definePlugin(new KamfreenaDial()); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new KamfreenaDial()); + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/content/activity/wguild/shot/ShotPutRoom.java b/Server/src/main/java/core/game/content/activity/wguild/shot/ShotPutRoom.java index 8504dc572..5cc5ab71b 100644 --- a/Server/src/main/java/core/game/content/activity/wguild/shot/ShotPutRoom.java +++ b/Server/src/main/java/core/game/content/activity/wguild/shot/ShotPutRoom.java @@ -22,7 +22,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -33,7 +33,7 @@ import core.tools.RandomFunction; public final class ShotPutRoom extends DialoguePlugin { static { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public boolean handle(final Player player, Node node, String option) { 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 1a8ee8da3..5c3221b4f 100644 --- a/Server/src/main/java/core/game/content/cutscene/DBRCutscenePlugin.java +++ b/Server/src/main/java/core/game/content/cutscene/DBRCutscenePlugin.java @@ -35,7 +35,7 @@ import core.net.packet.context.CameraContext; import core.net.packet.context.CameraContext.CameraType; import core.net.packet.out.CameraViewPacket; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the draynor bank robbery cutscene plugin. @@ -228,7 +228,7 @@ public final class DBRCutscenePlugin extends CutscenePlugin { } catch (Throwable e) { e.printStackTrace(); } - PluginManager.definePlugin(new BluePhatItem()); + ClassScanner.definePlugin(new BluePhatItem()); } @Override diff --git a/Server/src/main/java/core/game/content/cutscene/JulietCutscenePlugin.java b/Server/src/main/java/core/game/content/cutscene/JulietCutscenePlugin.java index b1adc0f89..633825813 100644 --- a/Server/src/main/java/core/game/content/cutscene/JulietCutscenePlugin.java +++ b/Server/src/main/java/core/game/content/cutscene/JulietCutscenePlugin.java @@ -14,7 +14,7 @@ import core.net.packet.context.CameraContext; import core.net.packet.context.CameraContext.CameraType; import core.net.packet.out.CameraViewPacket; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the romeo and juliet cutscene plugin. @@ -35,7 +35,7 @@ public final class JulietCutscenePlugin extends CutscenePlugin { */ public JulietCutscenePlugin() { this(null); - PluginManager.definePlugin(new JulietDialogue()); + ClassScanner.definePlugin(new JulietDialogue()); } /** diff --git a/Server/src/main/java/core/game/content/dialogue/JiminuaDialogue.java b/Server/src/main/java/core/game/content/dialogue/JiminuaDialogue.java index edc7b50e2..ec3dcc3ce 100644 --- a/Server/src/main/java/core/game/content/dialogue/JiminuaDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/JiminuaDialogue.java @@ -8,7 +8,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.item.Item; import core.game.node.entity.player.Player; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the jiminua dialogue plugin. @@ -38,7 +38,7 @@ public final class JiminuaDialogue extends DialoguePlugin { @Override public DialoguePlugin newInstance(Player player) { - PluginManager.definePlugin(new JiminuaUnnoteHandler()); + ClassScanner.definePlugin(new JiminuaUnnoteHandler()); return new JiminuaDialogue(player); } diff --git a/Server/src/main/java/core/game/content/dialogue/MartinThwaitDialogue.java b/Server/src/main/java/core/game/content/dialogue/MartinThwaitDialogue.java index d01b5ee83..00fd4223f 100644 --- a/Server/src/main/java/core/game/content/dialogue/MartinThwaitDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/MartinThwaitDialogue.java @@ -9,7 +9,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the dialogue used for martin thwait. @@ -161,7 +161,7 @@ public final class MartinThwaitDialogue extends DialoguePlugin { @Override public void init() { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/content/dialogue/RomilyWeaklaxDialogue.java b/Server/src/main/java/core/game/content/dialogue/RomilyWeaklaxDialogue.java index a2c41c81e..ab4254295 100644 --- a/Server/src/main/java/core/game/content/dialogue/RomilyWeaklaxDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/RomilyWeaklaxDialogue.java @@ -9,7 +9,7 @@ import core.game.node.item.Item; import core.plugin.Initializable; import core.game.node.entity.player.Player; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -67,7 +67,7 @@ public class RomilyWeaklaxDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new RomilyWildPieHandler()); + ClassScanner.definePlugin(new RomilyWildPieHandler()); } @Override diff --git a/Server/src/main/java/core/game/content/dialogue/RugMerchantDialogue.java b/Server/src/main/java/core/game/content/dialogue/RugMerchantDialogue.java index cc21ce220..19e4a78dc 100644 --- a/Server/src/main/java/core/game/content/dialogue/RugMerchantDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/RugMerchantDialogue.java @@ -17,7 +17,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import org.rs09.consts.Items; import static rs09.tools.stringtools.GlobalsKt.colorize; @@ -65,7 +65,7 @@ public final class RugMerchantDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new RugMerchantPlugin()); + ClassScanner.definePlugin(new RugMerchantPlugin()); } /** diff --git a/Server/src/main/java/core/game/content/global/action/DoorActionHandler.java b/Server/src/main/java/core/game/content/global/action/DoorActionHandler.java index 1de0cc0c3..c4b5635ea 100644 --- a/Server/src/main/java/core/game/content/global/action/DoorActionHandler.java +++ b/Server/src/main/java/core/game/content/global/action/DoorActionHandler.java @@ -1,6 +1,5 @@ package core.game.content.global.action; -import api.ContentAPIKt; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.audio.Audio; @@ -8,13 +7,12 @@ import core.game.node.entity.player.link.diary.DiaryType; import core.game.node.scenery.Constructed; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; 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.path.Pathfinder; +import kotlin.Unit; import rs09.game.system.config.DoorConfigLoader; import rs09.game.world.GameWorld; @@ -98,9 +96,12 @@ public final class DoorActionHandler { final Scenery second = (object.getId() == 3) ? null : getSecondDoor(object, entity); entity.lock(4); final Location loc = entity.getLocation(); - entity.addExtension(LogoutTask.class, new LocationLogoutTask(4, loc)); if (entity instanceof Player) { ((Player) entity).getAudioManager().send(new Audio(3419)); + entity.asPlayer().logoutListeners.put("autowalk", player -> { + player.setLocation(loc); + return Unit.INSTANCE; + }); } GameWorld.getPulser().submit(new Pulse(1) { boolean opened = false; @@ -134,6 +135,8 @@ public final class DoorActionHandler { if (object.getId() == 2406 && player.getLocation().withinDistance(Location.create(3202,3169,0))) { player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 6); } + + entity.asPlayer().logoutListeners.remove("autowalk"); } // Reset door to inactive @@ -379,7 +382,13 @@ public final class DoorActionHandler { } entity.lock(4); final Location loc = entity.getLocation(); - entity.addExtension(LogoutTask.class, new LocationLogoutTask(4, loc)); + if(entity instanceof Player) + { + entity.asPlayer().logoutListeners.put("autowalk", player -> { + player.setLocation(loc); + return Unit.INSTANCE; + }); + } object.setCharge(IN_USE_CHARGE); second.setCharge(IN_USE_CHARGE); GameWorld.getPulser().submit(new Pulse(1) { @@ -395,6 +404,10 @@ public final class DoorActionHandler { opened = true; return false; } + if(entity instanceof Player) + { + entity.asPlayer().logoutListeners.remove("autowalk"); + } object.setCharge(1000); if (second != null) { second.setCharge(1000); diff --git a/Server/src/main/java/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java b/Server/src/main/java/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java index b5373e3dd..a6bd21964 100644 --- a/Server/src/main/java/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java +++ b/Server/src/main/java/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java @@ -8,7 +8,7 @@ import core.game.interaction.OptionHandler; import core.game.node.Node; import core.game.node.entity.player.Player; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.PluginManifest; @PluginManifest(name="ShootingStars") @@ -24,7 +24,7 @@ public class StarChartPlugin extends ComponentPlugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new StarChartOptions()); + ClassScanner.definePlugin(new StarChartOptions()); ComponentDefinition.forId(iface.getId()).setPlugin(this); return this; } 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 5ef0854d0..be527ec72 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 @@ -40,7 +40,7 @@ import rs09.game.world.repository.Repository; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -101,7 +101,7 @@ public class ChristmasEvent extends HolidayEvent { @Override public Plugin newInstance(Object arg) throws Throwable { if (isActive()) { - PluginManager.definePlugins(new ChristmasEventOptionPlugin(), new SnowmanItemHandler(), new SnowImpDialogue(), new SnowmanHatComponentPlugin(), new QueenOfSnowDialogue(), new SnowballItemPlugin(), new SnowmanNPC(), new PeltOptionHandler()); + ClassScanner.definePlugins(new ChristmasEventOptionPlugin(), new SnowmanItemHandler(), new SnowImpDialogue(), new SnowmanHatComponentPlugin(), new QueenOfSnowDialogue(), new SnowballItemPlugin(), new SnowmanNPC(), new PeltOptionHandler()); } return super.newInstance(arg); } @@ -417,7 +417,7 @@ public class ChristmasEvent extends HolidayEvent { @Override public Plugin newInstance(Object arg) throws Throwable { addHandler(28295, OBJECT_TYPE, this); - PluginManager.definePlugin(new SnowmanDialogue()); + ClassScanner.definePlugin(new SnowmanDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/holiday/easter/BasketofEggsEvent.java b/Server/src/main/java/core/game/content/holiday/easter/BasketofEggsEvent.java index 17d616ae8..6c1948c5c 100644 --- a/Server/src/main/java/core/game/content/holiday/easter/BasketofEggsEvent.java +++ b/Server/src/main/java/core/game/content/holiday/easter/BasketofEggsEvent.java @@ -23,7 +23,7 @@ import core.game.world.map.Location; import rs09.game.world.repository.Repository; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -75,7 +75,7 @@ public class BasketofEggsEvent extends HolidayEvent { */ public BasketofEggsEvent() { super("Basket of Eggs", HolidayType.EASTER, 1086, 16, 2); - PluginManager.definePlugins(new BasketofEggsPlugin(), new EasterBunnyDialogue(), new RubberchickenPlugin(), new ChocolateEggPlugin(), new EasterItemPlugin()); + ClassScanner.definePlugins(new BasketofEggsPlugin(), new EasterBunnyDialogue(), new RubberchickenPlugin(), new ChocolateEggPlugin(), new EasterItemPlugin()); } @Override diff --git a/Server/src/main/java/core/game/content/holiday/halloween/DeathMansionEvent.java b/Server/src/main/java/core/game/content/holiday/halloween/DeathMansionEvent.java deleted file mode 100644 index ad87fe745..000000000 --- a/Server/src/main/java/core/game/content/holiday/halloween/DeathMansionEvent.java +++ /dev/null @@ -1,1726 +0,0 @@ -package core.game.content.holiday.halloween; - -import java.util.ArrayList; -import java.util.List; - -import rs09.ServerConstants; -import core.cache.def.impl.SceneryDefinition; -import core.game.component.Component; -import core.plugin.Initializable; -import core.game.content.dialogue.DialogueAction; -import core.game.content.dialogue.DialogueInterpreter; -import core.game.content.dialogue.DialoguePlugin; -import core.game.content.dialogue.FacialExpression; -import core.game.content.holiday.HolidayEvent; -import core.game.content.holiday.HolidayItem; -import core.game.content.holiday.HolidayType; -import core.game.content.holiday.ItemLimitation; -import core.game.node.entity.skill.Skills; -import core.game.node.entity.skill.agility.AgilityHandler; -import core.game.interaction.NodeUsageEvent; -import core.game.interaction.Option; -import core.game.interaction.OptionHandler; -import core.game.interaction.UseWithHandler; -import core.game.node.Node; -import core.game.node.entity.Entity; -import core.game.node.entity.combat.ImpactHandler.HitsplatType; -import core.game.node.entity.impl.ForceMovement; -import core.game.node.entity.npc.AbstractNPC; -import core.game.node.entity.npc.NPC; -import core.game.node.entity.player.Player; -import core.game.node.entity.player.info.Rights; -import core.game.node.entity.player.link.emote.Emotes; -import core.game.node.entity.player.link.request.RequestType; -import core.game.node.item.GroundItemManager; -import core.game.node.item.Item; -import core.game.node.scenery.Scenery; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; -import core.game.system.task.Pulse; -import rs09.game.world.GameWorld; -import core.game.world.map.Direction; -import core.game.world.map.Location; -import core.game.world.map.RegionManager; -import core.game.world.map.zone.MapZone; -import core.game.world.map.zone.ZoneBorders; -import core.game.world.map.zone.ZoneBuilder; -import rs09.game.world.repository.Repository; -import core.game.world.update.flag.context.Animation; -import core.game.world.update.flag.context.Graphics; -import core.net.packet.PacketRepository; -import core.net.packet.context.CameraContext; -import core.net.packet.context.CameraContext.CameraType; -import core.net.packet.out.CameraViewPacket; -import core.plugin.Plugin; -import rs09.plugin.PluginManager; -import core.tools.RandomFunction; - -/** - * Handles the death mansion halloween event set in 2007. - * @author Vexia - * @author Emperor - * @see http://2009scape.wikia.com/wiki/2007_Hallowe'en_event - */ -@Initializable -public class DeathMansionEvent extends HolidayEvent { - - /** - * The last pumpkin being rewarded for skilling. - */ - private static int lastPumpkinReward; - - /** - * The grim reaper chat messages. - */ - private static final String[] GRIM_CHATS = new String[] { "Let me escort you away, @name...", "@name is mine!", "Now is the time you die, @name.", "Muahahahahaha!", "There is no escape, @name...", "Beware Mortals. @name travels with me now.", "I claim @name as my own.", "Your time here is over, @name.", "I have come for you, @name!" }; - - /** - * The current pumpkin item. - */ - private static Item pumpkin; - - /** - * The location of bad webs to choose from. - */ - private static final Location[][] WEB_PATHS = new Location[][] { { new Location(1709, 4837, 0), new Location(1708, 4839, 0), new Location(1705, 4841, 0), new Location(1703, 4843, 0) },// path - // 1 - { new Location(1706, 4836, 0), new Location(1704, 4837, 0), new Location(1702, 4842, 0) },// path - // 2 - { new Location(1704, 4835, 0), new Location(1704, 4837, 0), new Location(1697, 4841, 0), new Location(1695, 4846, 0), new Location(1697, 4848, 0) },// path - // 3 - { new Location(1700, 4835, 0), new Location(1698, 4838, 0), new Location(1697, 4841, 0), new Location(1698, 4845, 0) },// path - // 4 - { new Location(1691, 4835, 0), new Location(1690, 4838, 0), new Location(1691, 4840, 0), new Location(1693, 4843, 0), new Location(1694, 4845, 0), new Location(1695, 4846, 0), new Location(1697, 4848, 0) },// path - // 5 - { new Location(1684, 4839, 0), new Location(1687, 4840, 0), new Location(1691, 4840, 0), new Location(1693, 4843, 0), new Location(1694, 4845, 0), new Location(1695, 4846, 0), new Location(1697, 4848, 0) },// path - // 6 - { new Location(1704, 4835, 0), new Location(1704, 4837, 0), new Location(1694, 4840, 0), new Location(1693, 4843, 0), new Location(1694, 4845, 0), new Location(1698, 4845, 0) } // 7 - }; - - /** - * The start location. - */ - public static final Location START = new Location(1697, 4814, 0); - - /** - * The portal location. - */ - public static final Location PORTAL_LOCATION = new Location(3000, 3270, 0); - - /** - * The servants skull item. - */ - public static final Item SERVANT_SKULL = new Item(11784); - - /** - * The diary item. - */ - public static final Item DIARY = new Item(11780); - - /** - * The hood item. - */ - public static final Item HOOD = new Item(11789); - - /** - * The grim reaper id. - */ - public static final int GRIM_REAPER = 6390; - - /** - * The muncher npc id. - */ - public static final int MUNCHER = 2329; - - /** - * The death portal id. - */ - public static final int DEATH_PORTAL = 27254; - - /** - * Constructs a new {@code DeathMansionEvent} {@code Object} - */ - public DeathMansionEvent() { - super("Death Mansion", HolidayType.HALLOWEEN, 1085, 16, 9); - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - if (isActive()) { - PluginManager.definePlugins(new DarkPortalHandler(), new DeathPortalZone(), new GrimReaperDialogue(), new MuncherDialogue(), new MuncherNPC(), new GrimItemHandler()); - } - return super.newInstance(arg); - } - - @Override - public boolean enter(Entity entity) { - if (entity instanceof Player) { - Player player = entity.asPlayer(); - player.getProperties().setSpawnLocation(START); - if (getStage(player) == 3 && !player.hasItem(SERVANT_SKULL)) { - setStage(player, 2); - } - } - return super.enter(entity); - } - - @Override - public boolean leave(Entity e, boolean logout) { - if (e instanceof Player) { - Player player = e.asPlayer(); - if (!logout) { - if (player.getAttribute("grimDis", 0) > GameWorld.getTicks()) { - return super.leave(player, logout); - } - int stage = getStage(player); - if (stage == 5) { - GrimItem.resetItems(player); - player.sendMessage("Any items you were carrying from the house have been removed."); - } - cleanItems(player, GrimItem.getItems()); - cleanItems(player, new Item[] { DIARY, SERVANT_SKULL }); - } else { - List objs = player.getAttribute("objs", null); - if (objs == null) { - objs = new ArrayList(); - } - for (Scenery o : objs) { - if (RegionManager.getLocalEntitys(o.getLocation(), 1).size() != 0) { - continue; - } - if (!o.getLocation().withinDistance(player.getLocation(), 1)) { - player.getPacketDispatch().sendSceneryAnimation(o, Animation.create(7286)); - } - } - } - player.getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); - } - return super.leave(e, logout); - } - - @Override - public boolean teleport(Entity e, int type, Node node) { - if (e instanceof Player) { - if (type != -1) { - e.asPlayer().getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Foolish mortal! Do you have no manners? Use", "the portal near me to exit my mansion."); - return false; - } - } - return super.teleport(e, type, node); - } - - @Override - public boolean isComplete(Player player) { - return super.isComplete(player) || getStage(player) < 0 || getConfig(player) == 249852; - } - - @Override - public boolean interact(Entity e, final Node target, Option option) { - if (e instanceof Player) { - final Player player = e.asPlayer(); - switch (target.getId()) { - case DEATH_PORTAL: - player.teleport(PORTAL_LOCATION); - return true; - case 27276: - handlePassageWay(player, target.asScenery()); - return true; - case 27266: - passSpiderWeb(player, target.asScenery()); - return true; - case 27242: - case 27243: - if (getStage(player) >= 6) { - player.setAttribute("grimDis", GameWorld.getTicks() + 2); - player.teleport(target.getId() == 27243 ? Location.create(1703, 4826, 0) : Location.create(1639, 4835, 0)); - return true; - } - player.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Don't go gallivanting around my house. Come and see", "me if you're not sure what to do."); - return true; - case 27257: - if (!player.getInventory().hasSpaceFor(SERVANT_SKULL)) { - player.sendMessage("You don't have enough inventory space."); - return true; - } - int webIndex = player.getAttribute("webIndex", 0); - int newIndex = -1; - while (newIndex == -1) { - newIndex = RandomFunction.random(WEB_PATHS.length); - if (newIndex == webIndex) { - newIndex = -1; - } - } - player.setAttribute("/save:webIndex", newIndex); - setStage(player, 3); - player.getInventory().add(SERVANT_SKULL); - player.getDialogueInterpreter().sendItemMessage(SERVANT_SKULL, "You found the servant's skull. Now to get out of the garden."); - return true; - case 2329: - player.getDialogueInterpreter().open("muncher-dialogue", target); - return true; - case 27245: - if (getStage(player) >= 6) { - player.sendMessage("There's no need to search the table any more."); - return true; - } - if (!player.hasItem(DIARY)) { - player.getInventory().add(DIARY); - player.getDialogueInterpreter().sendItemMessage(DIARY, "You find a diary on the table. This should give some clues as to where items within the room should go."); - } else { - player.sendMessage("You already have a copy of the diary, you don't need to take another."); - } - return true; - case 11780: - if (option.getName().toLowerCase().equals("read")) { - if (!player.getAttribute("read-diary", false)) { - player.getDialogueInterpreter().sendDialogues(player, null, "Hopefully, by reading this, I can find clues on where to", "put any items I find."); - player.setAttribute("/save:read-diary", true); - player.getDialogueInterpreter().addAction(new DialogueAction() { - @Override - public void handle(Player player, int buttonId) { - player.getDialogueInterpreter().open("grim-diary"); - } - }); - } else { - player.getDialogueInterpreter().open("grim-diary"); - } - return true; - } - break; - case 27255: - case 27247: - case 27246: - case 27261: - case 27252: - case 27250: - case 27248: - case 27251: - case 27249: - case 27253: - final GrimItem item = GrimItem.forObjectId(target.getId()); - if (item == GrimItem.HUMAN_BONES) { - player.getDialogueInterpreter().sendOptions("Where to search?", "Towards the left", "Towards the right"); - player.getDialogueInterpreter().addAction(new DialogueAction() { - @Override - public void handle(Player player, int buttonId) { - if (buttonId == 2) { - item.search(player, target.asScenery()); - } else { - player.animate(Animation.create(7271)); - player.getDialogueInterpreter().sendDialogues(player, FacialExpression.SUSPICIOUS, "Arrghhh! My eyes!"); - } - } - }); - return true; - } else if (item == GrimItem.EYEBALL) { - player.getDialogueInterpreter().sendOptions("Where to search?", "Under the cushions", "Under the sofa"); - player.getDialogueInterpreter().addAction(new DialogueAction() { - @Override - public void handle(Player player, int buttonId) { - if (buttonId == 1) { - item.search(player, target.asScenery()); - } else { - player.getPacketDispatch().sendSceneryAnimation(target.asScenery(), Animation.create(7278)); - player.animate(Animation.create(7272)); - player.getDialogueInterpreter().sendDialogues(player, FacialExpression.DISGUSTED, "That wasn't such a good idea."); - } - } - }); - return true; - } - item.search(player, target.asScenery()); - return true; - case 27278: - final Location end = target.getLocation().equals(new Location(1633, 4824, 0)) ? new Location(1630, 4824, 0) : target.getLocation().equals(new Location(1627, 4819, 0)) ? new Location(1627, 4819, 0) : target.getLocation().equals(new Location(1630, 4819, 0)) ? new Location(1627, 4819, 0) : target.getLocation().equals(1624, 4822, 0) ? new Location(1624, 4828, 0) : new Location(1637, 4820, 0); - if (target.getLocation().equals(new Location(1637, 4820, 0)) || target.getLocation().equals(new Location(1630, 4824, 0)) || target.getLocation().equals(new Location(1627, 4819, 0))) { - player.sendMessage("You can't go back that way."); - return true; - } - player.lock(3); - if (target.getLocation().equals(1624, 4822, 0)) { - player.sendChat("Weeeeee"); - GameWorld.getPulser().submit(new Pulse(1, player) { - - @Override - public boolean pulse() { - player.getWalkingQueue().reset(); - player.getWalkingQueue().setRunDisabled(true); - player.addExtension(LogoutTask.class, new LocationLogoutTask(10000000, new Location(1624, 4821, 0))); - player.getInterfaceManager().closeDefaultTabs(); - player.getAppearance().setStandAnimation(7266); - player.getAppearance().setWalkAnimation(7267); - player.getAppearance().setRunAnimation(7267); - player.getAppearance().setTurn180(7267); - player.getAppearance().setTurn90ccw(7267); - player.getAppearance().setTurn90cw(7267); - player.getAppearance().sync(); - return true; - } - - }); - } - player.getPacketDispatch().sendSceneryAnimation(target.asScenery(), Animation.create(7296)); - AgilityHandler.walk(player, -1, player.getLocation(), target.getLocation(), null, 0.0, null); - GameWorld.getPulser().submit(new Pulse(1, player) { - - @Override - public boolean pulse() { - AgilityHandler.forceWalk(player, -1, player.getLocation(), end, Animation.create(target.getLocation().equals(1624, 4822, 0) ? 7269 : 7268), target.getLocation().equals(1624, 4822, 0) ? 80 : 40, 0.0, null); - return true; - } - - }); - return true; - case 27211: - player.getInterfaceManager().restoreTabs(); - player.removeExtension(LogoutTask.class); - player.getAppearance().setDefaultAnimations(); - player.getAppearance().sync(); - player.getWalkingQueue().setRunDisabled(false); - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(0, 3, 0), Animation.create(7273), 6, 0.0, null); - return true; - case 27212: - player.sendMessage("You can't go back that way."); - return true; - case 27218: - player.lock(10); - Location strt = player.getLocation().transform(0, -1, 0); - AgilityHandler.forceWalk(player, -1, player.getLocation(), strt, Animation.create(7274), 5, 0.0, null); - GameWorld.getPulser().submit(new Pulse(1, player) { - int ticks; - int x = 1636; - int y = 4829; - int yInc = 0; - int xInc = 0; - int speed = 100; - int height = 560; - - @Override - public boolean pulse() { - switch (++ticks) { - case 1: - PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x + xInc, y + yInc, height, 1, speed)); - PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 5, y - 4, height, 1, speed)); - break; - case 8: - x = 1637; - y = 4816; - PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x + xInc, y + yInc, height, 1, speed)); - PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1, y + 1, height, 1, speed)); - ForceMovement.run(player, player.getLocation(), player.getLocation().transform(0, -5, 0), null, null, Direction.SOUTH, 50); - break; - case 10: - PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, x + 5, y - 4, height, 1, speed)); - return true; - } - return false; - } - }); - return true; - } - } - return super.interact(e, target, option); - } - - @Override - public void locationUpdate(Entity entity, Location last) { - if (entity instanceof Player) { - final Player p = entity.asPlayer(); - Location loc = p.getLocation(); - List objs = p.getAttribute("objs", null); - if (objs == null) { - objs = new ArrayList(); - } - for (int i = 0; i < 1; i++) { - for (Direction direction : Direction.values()) { - Scenery o = RegionManager.getObject(loc.transform(direction, 1)); - if (o != null && o.getId() == 27241) { - objs.add(o); - p.setAttribute("objs", objs); - p.getPacketDispatch().sendSceneryAnimation(o, Animation.create(7289)); - } - } - } - for (Scenery o : objs) { - if (RegionManager.getLocalEntitys(o.getLocation(), 1).size() != 0) { - continue; - } - if (!o.getLocation().withinDistance(p.getLocation(), 1)) { - p.getPacketDispatch().sendSceneryAnimation(o, Animation.create(7286)); - } - } - if (loc.getX() >= 1630 && loc.getX() <= 1646 && loc.getY() >= 4844 && loc.getY() <= 4852) { - final Scenery object = RegionManager.getObject(entity.getLocation()); - if (object != null && object.getId() == 27240) { - p.getWalkingQueue().reset(); - p.getLocks().lock(); - p.sendMessage("You accidentally trigger a trap."); - GameWorld.getPulser().submit(new Pulse(1, p) { - int ticks; - - @Override - public boolean pulse() { - switch (++ticks) { - case 1: - if (!p.getLocation().equals(object.getLocation())) { - p.teleport(object.getLocation()); - } - p.lock(); - p.getPacketDispatch().sendSceneryAnimation(object, Animation.create(1939)); - break; - case 2: - p.animate(Animation.create(4366)); - break; - case 4: - p.getPacketDispatch().sendGlobalPositionGraphic(86, object.getLocation()); - p.teleport(new Location(1641, 4830, 0)); - break; - case 5: - p.unlock(); - p.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Look closely and you should see the joins", "of the doors on the ground."); - return true; - } - return false; - } - }); - return; - } - } - } - super.locationUpdate(entity, last); - } - - @Override - public boolean canRequest(RequestType type, Player player, Player target) { - if (player.getAppearance().getStandAnimation() == 7266 || target.getAppearance().getStandAnimation() == 7266) { - return false; - } - return super.canRequest(type, player, target); - } - - /** - * Handles the passage way. - * @param player the player. - * @param target the target. - */ - private void handlePassageWay(final Player player, final Scenery target) { - int stage = getStage(player); - if (stage < 1 || stage < 4 && target.getLocation().getX() == 1694) { - electrocute(player, target); - return; - } - if (stage >= 6 && target.getLocation().getX() == 1645) { - player.lock(2); - player.animate(Animation.create(7299)); - player.graphics(Graphics.create(281)); - setStage(player, stage + 1); - player.teleport(stage + 1 == 8 ? Location.create(1633, 4839, 0) : new Location(1642, 4828, 0), 1); - player.getDialogueInterpreter().open(GRIM_REAPER, true, true); - return; - } - if (stage >= 4 && player.getLocation().getX() == 1701 || stage >= 6 && (target.getLocation().getX() == 1694 && player.getLocation().getX() >= target.getLocation().getX()) || stage >= 8 && target.getLocation().equals(new Location(1641, 4829, 0))) { - player.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Foolish mortal! You have no business in there."); - return; - } - if (stage == 1 && player.getLocation().getX() == 1701) { - setStage(player, 2); - passDorway(player, target.getLocation()); - player.getDialogueInterpreter().open(GRIM_REAPER, true, true); - return; - } else if (stage == 3 && player.getLocation().getX() == 1701 && player.getInventory().containsItem(SERVANT_SKULL)) { - setStage(player, 4); - passDorway(player, target.getLocation()); - player.getInventory().remove(SERVANT_SKULL); - player.removeAttribute("webIndex"); - player.getDialogueInterpreter().open(GRIM_REAPER, true, true, true); - return; - } else if (getStage(player) == 4 && target.getLocation().getX() == 1694) { - setStage(player, 5); - passDorway(player, target.getLocation()); - player.getDialogueInterpreter().open(GRIM_REAPER, true, true); - return; - } - player.getDialogueInterpreter().sendDialogues(6389, 7292, "We're watching you..."); - player.getDialogueInterpreter().addAction(new DialogueAction() { - @Override - public void handle(Player player, int buttonId) { - passDorway(player, target.getLocation()); - } - }); - } - - /** - * Passes through a spider web. - * @param player the player. - * @param object the object. - */ - private void passSpiderWeb(Player player, Scenery object) { - int webIndex = player.getAttribute("webIndex", -1); - if (webIndex == -1) { - player.setAttribute("/save:webIndex", (webIndex = RandomFunction.random(WEB_PATHS.length))); - } - boolean goodWeb = false; - for (Location l : WEB_PATHS[webIndex]) { - if (l.equals(object.getLocation())) { - goodWeb = true; - break; - } - } - if (!goodWeb) { - player.sendMessage("You cannot pass through this particular web - try another."); - return; - } - player.getPacketDispatch().sendSceneryAnimation(object, Animation.create(7280)); - player.lock(3); - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(Direction.getDirection(player.getLocation(), object.getLocation()), 2), Animation.create(2240), 8, 0.0, null); - } - - /** - * Passes through a doorway. - * @param player the player. - * @param location the location. - */ - public void passDorway(Player player, Location location) { - Location end = player.getLocation().transform(Direction.getDirection(player.getLocation(), location), 2); - player.addExtension(LogoutTask.class, new LocationLogoutTask(3, end)); - player.sendMessage("You safely pass through the gargoyles' judgement."); - player.lock(3); - AgilityHandler.walk(player, -1, player.getLocation(), end, null, 0.0, null); - } - - /** - * Electrocutes the player. - * @param player the player. - * @param object the object. - */ - private void electrocute(final Player player, Scenery object) { - player.lock(4); - player.animate(Animation.create(7299)); - player.graphics(Graphics.create(281)); - int x = 0, x2 = 0; - int y = 0, y2 = 0; - Direction dir = object.getDirection(); - if (dir == Direction.SOUTH || dir == Direction.NORTH) { - x = 1; - x2 = -1; - } else if (dir == Direction.WEST) { - y = 1; - y2 = -1; - } else { - y = -1; - y2 = 1; - } - Scenery first = RegionManager.getObject(object.getLocation().transform(x, y, 0)); - Scenery second = RegionManager.getObject(object.getLocation().transform(x2, y2, 0)); - if (first != null && second != null) { - player.getPacketDispatch().sendSceneryAnimation(first, Animation.create(7285)); - player.getPacketDispatch().sendSceneryAnimation(second, Animation.create(7285)); - } - player.sendMessage("You fail to pass through the gargoyles' judgement"); - GameWorld.getPulser().submit(new Pulse(1, player) { - @Override - public boolean pulse() { - player.getImpactHandler().manualHit(player, player.getSkills().getLifepoints(), HitsplatType.NORMAL); - player.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "You may be able to wander around other people's", "houses, but I shall not allow it."); - return true; - } - }); - } - - @Override - public void load() { - // ObjectBuilder.add(new GameObject(DEATH_PORTAL, new Location(2999, - // 3268, 0))); - pumpkin = new Item(1959); - for (int id = 1053; id < 1059; id += 2) { - if (!ItemLimitation.isRegistered(id)) { - ItemLimitation.register(id, 15); - } - } - if (!ItemLimitation.isRegistered(pumpkin.getId())) { - ItemLimitation.register(pumpkin.getId(), 100); - } - if (ItemLimitation.getAmountLeft(pumpkin.getId()) > 0) { - HolidayItem.startRandomSpawn(pumpkin, 1000, Location.create(3433, 3534, 0), Location.create(3099, 3548, 0), Location.create(3067, 10255, 0), Location.create(2913, 3746, 0), Location.create(3193, 3914, 0), Location.create(3214, 9618, 0), Location.create(3227, 3219, 2), Location.create(3300, 3312, 0), Location.create(3075, 3260, 0), Location.create(3213, 3428, 0), Location.create(3213, 3480, 0), Location.create(2710, 3460, 0), Location.create(2750, 3440, 0), Location.create(2927, 3144, 0), Location.create(2667, 3309, 0), Location.create(2600, 3104, 0), Location.create(2910, 4832, 0), Location.create(2925, 3445, 0), Location.create(2475, 3423, 1), Location.create(2817, 3441, 0), Location.create(2948, 3216, 0), Location.create(1864, 5243, 0), Location.create(2706, 3733, 0), Location.create(3186, 3446, 1), Location.create(3189, 9832, 0), Location.create(2655, 3310, 0), Location.create(3145, 9913, 0)); - } - } - - @Override - public void addExperience(Player player, int skill, double experience) { - if (skill <= Skills.MAGIC && skill != Skills.PRAYER) { - return; - } - if (GameWorld.getTicks() - lastPumpkinReward < 1000 && RandomFunction.random(2500) == 0 && ItemLimitation.getAmountLeft(pumpkin.getId()) > 0) { - if (player.getInventory().add(pumpkin)) { - player.getPacketDispatch().sendMessage("You found a pumpkin!"); - lastPumpkinReward = GameWorld.getTicks(); - ItemLimitation.decreaseAmount(pumpkin.getId()); - } - } - } - - @Override - public void commenceDeath(Entity killer, Entity victim) { - if (!(victim instanceof Player) || victim.getZoneMonitor().isInZone("Death Mansion")) { - return; - } - Player player = (Player) victim; - final NPC reaper = NPC.create(2862, player.getLocation()); - reaper.setLocation(RegionManager.getSpawnLocation(player, reaper)); - if (reaper.getLocation() == null) { - return; - } - reaper.init(); - reaper.face(player); - reaper.setWalks(false); - reaper.setNeverWalks(true); - reaper.setAggressive(false); - reaper.animate(Animation.create(392)); - reaper.sendChat(RandomFunction.getRandomElement(GRIM_CHATS).replace("@name", player.getUsername())); - GameWorld.getPulser().submit(new Pulse(4, reaper) { - @Override - public boolean pulse() { - reaper.clear(); - return true; - } - }); - } - - @Override - public void finalizeDeath(Entity killer, Entity victim) { - if (killer instanceof Player && victim instanceof NPC) { - Player player = (Player) killer; - if (victim.getProperties().getCurrentCombatLevel() > 0) { - int chance = (5_000 / victim.getProperties().getCurrentCombatLevel()) * 100; - if (RandomFunction.random(chance) == 0) { - int itemId = 1053 + (RandomFunction.random(3) * 2); - if (ItemLimitation.getAmountLeft(itemId) > 0) { - ItemLimitation.decreaseAmount(itemId); - Repository.sendNews(player.getUsername() + " found a halloween mask!"); - player.getPacketDispatch().sendMessage("You find a scary looking mask."); - GroundItemManager.create(new Item(itemId), victim.getLocation(), player); - } - } - } - } - } - - @Override - public boolean isActive() { - return false; - } - - @Override - public void configure() { - registerRegion(6731); - registerRegion(6475); - } - - /** - * Handles the grim item handler. - * @author Vexia - */ - public static class GrimItemHandler extends UseWithHandler { - - /** - * The object ids. - */ - private static final int[] OBJECTS = new int[] { 27249, 27255, 27247, 27246, 27261, 27260, 27252, 27248, 27250, 27251, 27253 }; - - /** - * Constructs a new {@code GrimItemHandler} {@code Object} - */ - public GrimItemHandler() { - super(11782, 11781, 11785, 11787, 11786, 11788, 11783); - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - for (int id : OBJECTS) { - addHandler(id, OBJECT_TYPE, this); - } - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - GrimItem item = GrimItem.forDestinationId(event.getUsedWith().getId()); - if (item == null || event.getUsedItem().getId() != item.getItem().getId()) { - return false; - } - item.useWithEvent(player, event.getUsedWith().asScenery()); - return true; - } - - } - - /** - * A grim reaper item. - * @author Vexia - */ - public enum GrimItem { - TESTAMENT(new int[] { 27255 }, new Item(11782), "You found someone's Last Will and Testament.", new String[] { "You recall the entry in the diary, '...have to sit on that for a while...'", "and place the Last Will and Testament under the sofa cushions." }, 27252), ROBE(new int[] { 27247, 27246 }, new Item(11781), "You found the Grim Reaper's robes.", new String[] { "You recall the entry in the diary, '...decided to throw them in the", "fireplace...' and place the robes in the fireplace." }, 27251), HOURGLASS(new int[] { 27261, 27260 }, new Item(11785), "You found an hourglass.", new String[] { "You recall the entry in the diary, '...hourglass today so have added", "that to the fishtank...' and place the hourglass in the fishtank." }, 27253), EYEBALL(new int[] { 27252 }, new Item(11787), "You found someone's eye.", new String[] { "You recall the entry in the diary, '...I put the eye back on the", "shelf...' and place the eye on the shelf." }, 27261, 27260), SCYTHE_SHARPENER(new int[] { 27248, 27249, 27250 }, new Item(11786), "You found a scythe sharpener.", new String[] { "You recall the entry in the diary, '...put the sharpener back in the", "cabinet...' and place the scythe sharpener in the cabinet." }, 27247, 27246), POTION(new int[] { 27251 }, new Item(11788), "You found a 'Voice of Doom' potion.", new String[] { "You recall the entry in the diary, '...I found my old 'Voice of Doom'", "potion amongst some books...' and place the potion on the bookcase." }, 27248, 27249, 27250), HUMAN_BONES(new int[] { 27253 }, new Item(11783), "You found some bones. They look decidely human.", new String[] { "You recall the entry in the diary, '...decided to lock them up in the", "chest...' and place the bones in the chest." }, 27255); - - /** - * The object id. - */ - private final int[] objectIds; - - /** - * The item. - */ - private final Item item; - - /** - * The found text. - */ - private final String foundText; - - /** - * The return text. - */ - private final String[] returnText; - - /** - * The destination object id. - */ - private final int[] destinationIds; - - /** - * Constructs a new {@code GrimItem} {@code Object} - * @param objectIds the object ids. - * @param item the item. - * @param foundText the found text. - * @param returnText the returning text. - */ - private GrimItem(int[] objectIds, Item item, String foundText, String[] returnText, int... destinationIds) { - this.objectIds = objectIds; - this.item = item; - this.foundText = foundText; - this.returnText = returnText; - this.destinationIds = destinationIds; - } - - /** - * Searches for the grim item. - * @param player the player. - * @param object the object. - */ - public void search(Player player, Scenery object) { - if (!player.getInventory().hasSpaceFor(item)) { - player.sendMessage("You don't have enough inventory space."); - return; - } - if (player.getInventory().containsItem(item) || hasGrimItem(player, this)) { - player.getDialogueInterpreter().sendDialogue("You have already taken the item you were looking for", "from here."); - return; - } - if (player.getInventory().add(item)) { - player.animate(Animation.create(833)); - player.getDialogueInterpreter().sendItemMessage(item, foundText); - } - } - - /** - * Called on the use with event. - * @param player the player. - * @param object the object. - */ - public void useWithEvent(Player player, Scenery object) { - if (hasGrimItem(player, this)) { - player.getDialogueInterpreter().sendDialogue("You have already returned this item to it's proper", "spot in the mansion."); - return; - } - if (player.getInventory().remove(item)) { - setGrimItem(player, this); - player.animate(Animation.create(833)); - player.getDialogueInterpreter().sendDialogue(returnText); - if (getGrimItems(player).size() == values().length) { - DeathMansionEvent event = (DeathMansionEvent) player.getZoneMonitor().getZones().get(0).getZone(); - if (event != null) { - player.removeAttribute("ready-diary"); - event.setStage(player, 6); - player.getDialogueInterpreter().open(GRIM_REAPER, true, true); - } - } - } - } - - /** - * Checks if the player has the grim item. - * @param player the player. - * @param item the item. - * @return {@code True} if so. - */ - public static boolean hasGrimItem(Player player, GrimItem item) { - return getGrimItems(player).contains(item); - } - - /** - * Sets the grim item as completed. - * @param player the player. - * @param item the item. - */ - public static void setGrimItem(Player player, GrimItem item) { - List items = getGrimItems(player); - items.add(item); - player.setAttribute("grim-items", items); - } - - /** - * Resets the grim items. - * @param player the items. - */ - public static void resetItems(Player player) { - player.removeAttribute("grim-items"); - } - - /** - * Gets the list of set grim items. - * @param player the player. - * @return the items. - */ - public static List getGrimItems(Player player) { - List items = player.getAttribute("grim-items", null); - if (items == null) { - items = new ArrayList<>(20); - } - player.setAttribute("grim-items", items); - return items; - } - - /** - * Gets the grim item by the destination id. - * @param objectId the object id. - * @return the id. - */ - public static GrimItem forDestinationId(int objectId) { - for (GrimItem item : values()) { - for (int id : item.getDestinationId()) { - if (id == objectId) { - return item; - } - } - } - return null; - } - - /** - * Gets the object id. - * @param objectId the object id. - * @return the grim item. - */ - public static GrimItem forObjectId(int objectId) { - for (GrimItem item : values()) { - for (int id : item.getObjectIds()) { - if (id == objectId) { - return item; - } - } - } - return null; - } - - /** - * Gets the items. - * @return the items. - */ - public static Item[] getItems() { - Item[] items = new Item[values().length]; - for (int i = 0; i < items.length; i++) { - items[i] = values()[i].getItem(); - } - return items; - } - - /** - * Gets the objectId. - * @return the objectId - */ - public int[] getObjectIds() { - return objectIds; - } - - /** - * Gets the item. - * @return the item - */ - public Item getItem() { - return item; - } - - /** - * Gets the foundText. - * @return the foundText - */ - public String getFoundText() { - return foundText; - } - - /** - * Gets the returnText. - * @return the returnText - */ - public String[] getReturnText() { - return returnText; - } - - /** - * Gets the destinationId. - * @return the destinationId - */ - public int[] getDestinationId() { - return destinationIds; - } - - } - - /** - * Handles the grim reaper dialogue. - * @author Vexia - */ - public class GrimReaperDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code GrimReaperDialogue} {@code Object} - */ - public GrimReaperDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code GrimReaperDialogue} {@code Object} - * @param player the player. - */ - public GrimReaperDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new GrimReaperDialogue(player); - } - - @Override - public boolean open(Object... args) { - switch (getStage(player)) { - case 0: - player("Erm... Excuse me... Could I ask..."); - break; - case 1: - case 2: - case 3: - if (args.length > 1) { - npc("You have found my garden I see."); - stage = 100; - return true; - } - player("Erm... What was I supposed to do?"); - break; - case 4: - if (args.length == 0 && !player.getInventory().containsItem(SERVANT_SKULL)) { - player("Erm... What was I supposed to do?"); - stage = 2; - return true; - } - player("Woah, what'd I do? Oh no, the skull's gone."); - break; - case 5: - if (args.length > 1) { - npc("You made it."); - } else { - npc("Foolish mortal, get back to the task."); - stage = -1; - } - break; - case 6: - if (args.length > 1) { - npc("Looks like you've returned everything to its proper", "location."); - stage = 20; - } else { - player("Erm... What was I supposed to do?"); - } - break; - case 7: - if (args.length > 1) { - player("Huh? What happened there?"); - stage = 20; - } else { - player("Erm... What was I supposed to do?"); - } - break; - case 8: - if (args.length > 1) { - npc("That is sufficient."); - stage = 20; - } else { - player("You wished to speak with me?"); - } - break; - case 9: - case -12290: - end(); - break; - } - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - if (player.getAttribute("lo", false)) { - end(); - return true; - } - switch (getStage(player)) { - case 0: - switch (stage) { - case 0: - npc("Speak, mortal."); - stage++; - break; - case 1: - player("Well, sir, lord, erm, your highness..."); - stage++; - break; - case 2: - npc("I need no title."); - stage++; - break; - case 3: - player("Well, of course. Sorry. I was just wondering, what is", "this place?"); - stage++; - break; - case 4: - npc("My house. You have found yourself here because I", "deem it necessary."); - stage++; - break; - case 5: - player("You do?"); - stage++; - break; - case 6: - npc("Long have I had a servant performing tasks as", "instructed. He left my service to pass on into death", "Such a role is to be replaced."); - stage++; - break; - case 7: - player("I see so you want me to be your servant?"); - stage++; - break; - case 8: - npc("Eager assumptions shall bring you regret, human. A", "worthy soul has already been picked for the position.", "My house is open now as various things need attending", "to before the transition can take place."); - stage++; - break; - case 9: - player("So basically you want me to tidy up some things before", "your new servant arrives?"); - stage++; - break; - case 10: - npc("Interpret as you will, mortal!"); - stage++; - break; - case 11: - options("I'll help out no problem.", "That doesn't really appeal, I'm off."); - stage++; - break; - case 12: - if (buttonId == 1) { - player("I'll help out no problem."); - stage = 15; - break; - } - player("That doesn't really appeal, I'm off."); - stage++; - break; - case 13: - npc("So be it, mortal!"); - stage++; - break; - case 14: - end(); - break; - case 15: - DeathMansionEvent.this.setStage(player, 1, 16); - npc("Proceeding as instructed is the best way to survive", "here, human. I can always see you and can speak with", "you whenever I wish as this is my domain. Go to the", "garden for further instructions."); - stage++; - break; - } - break; - case 1: - case 2: - case 3: - switch (stage) { - case 0: - npc("Foolish mortal! Proceed to the garden for", "further instructions."); - stage++; - break; - case 1: - end(); - break; - case 16: - player("Always watched, To the garden. Thank you. Much", "appreciated."); - stage++; - break; - case 17: - end(); - break; - case 100: - player("Woah. You made me jump. How does your voice carry", "so far?"); - stage++; - break; - case 101: - npc("That is not of your concern. Whilst in my domain you", "shall never be far from my gaze."); - stage++; - break; - case 102: - player("Okay... So, what exactly do you want me to do out", "here?"); - stage++; - break; - case 103: - npc("My last servant died in here. His skull still remains and", "you must bring it out to prevent my next servant from", "getting the wrong impression."); - stage++; - break; - case 104: - player("And I suppose your servant was killed by some huge", "man-eating spider?"); - stage++; - break; - case 105: - npc("That is not your business, mortal. Anyway, the webs", "you see are from a nest of very small spiders. Some", "webs you can pass, some you cannot. You will only", "need to use your bare hands to break though."); - stage++; - break; - case 106: - player("Sorry I asked. I'll go find the skull and bring it back", "out of the garden."); - stage++; - break; - case 107: - npc("Yes, and do not try teleporting out of the garden with", "the skull. The skull will remain behind and you'll have to", "find it again."); - stage++; - break; - case 108: - end(); - break; - } - break; - case 4: - switch (stage) { - case -1: - end(); - break; - case 0: - npc("Do not concern yourself. I had instructed the", "gargoyles to take it from you."); - stage++; - break; - case 1: - player("You could have let me know! I almost had a heart", "attack."); - stage++; - break; - case 2: - npc("Please proceed to the westernmost room for your next", "task."); - stage++; - break; - case 3: - player("You don't waste time, do you? So, the room that looks a", "bit like your lounge? I'm on my way."); - stage++; - break; - case 4: - end(); - break; - } - break; - case 5: - switch (stage) { - case -1: - end(); - break; - case 0: - player("You sound surprised."); - stage++; - break; - case 1: - npc("You wouldn't be the first, or last, to die in this house."); - stage++; - break; - case 2: - player("I'm so pleased. So, to the task at hand. What should I", "be doing in here?"); - stage++; - break; - case 3: - npc("If you search around the room you'll find various", "items. Put them back where they belong. My diary is", "on the table - read this for some clues, but tell anyone", "what you read and you die."); - stage++; - break; - case 4: - player("*Gulp* I shall have a look."); - stage++; - break; - case 5: - end(); - break; - } - break; - case 6: - switch (stage) { - case 0: - npc("Please proceed upstairs and enter", "the room you find there."); - stage = 22; - break; - case 20: - player("Woo hoo!"); - stage++; - break; - case 21: - npc("You've not finished yet, mortal. Please proceed upstairs", "and enter the room you find there."); - stage++; - break; - case 22: - player("Upstairs it is."); - stage++; - break; - case 23: - end(); - break; - } - break; - case 7: - switch (stage) { - case 0: - npc("You must complete the playground."); - stage = 23; - break; - case 20: - npc("Again."); - stage++; - break; - case 21: - player("What?"); - stage++; - break; - case 22: - npc("One more time around just to be sure all is in order."); - stage++; - break; - case 23: - end(); - break; - } - break; - case 8: - switch (stage) { - case 0: - npc("Correct. You have completed the tasks as ordered,", "hence your time here is done."); - stage++; - break; - case 1: - player("An I'm still alive. I rock!"); - stage++; - break; - case 2: - player("So...any chance of a reward for my service?"); - stage++; - break; - case 3: - npc("Hmmm. Mortals and their goal-driven attitude - one", "thing that shall forever elude my understanding. As you", "wish, but trouble me no more."); - stage++; - break; - case 4: - player("Thank you!"); - stage++; - break; - case 5: - if (!player.getInventory().hasSpaceFor(HOOD)) { - npc("You don't have enough inventory space,", "mortal."); - stage = 23; - break; - } - interpreter.sendItemMessage(HOOD, "The Grim Reaper has given you the " + RED + "Grim Reaper hood and you've unlocked the " + RED + "Zombie Hand Emote as well as the " + RED + "Scared emote."); - stage++; - break; - case 6: - npc("Death will find you one day..."); - stage++; - break; - case 7: - DeathMansionEvent.this.setStage(player, 9); - player.getConfigManager().set(1085, 249852, true); // hallowe'en - // hand - // emote - player.getEmoteManager().unlock(Emotes.SCARED); - player.getEmoteManager().unlock(Emotes.ZOMBIE_HAND); - player.addExtension(LogoutTask.class, new LocationLogoutTask(5, PORTAL_LOCATION)); - player.getInventory().add(HOOD); - player.lock(5); - player.getProperties().setSpawnLocation(PORTAL_LOCATION); - player.getImpactHandler().manualHit(player, player.getSkills().getLifepoints(), HitsplatType.NORMAL); - close(); - player.setAttribute("lo", true); - GameWorld.getPulser().submit(new Pulse(5, player) { - @Override - public boolean pulse() { - player.setAttribute("lo", true); - player("Well. That was an experience I shall never forget."); - stage++; - return true; - } - }); - break; - case 8: - end(); - break; - case 20: - player("Phew."); - stage++; - break; - case 21: - npc("Come and speak with me downstairs."); - stage++; - break; - case 22: - player("I'll be right down."); - stage++; - break; - case 23: - end(); - break; - } - break; - case 9: - case -12290: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { GRIM_REAPER }; - } - - } - - /** - * Represents the area around the death portal. (used to darken the screen) - * @author Vexia - */ - public class DeathPortalZone extends MapZone implements Plugin { - - /** - * Constructs a new {@code DeathPortalZone} {@code Object} - */ - public DeathPortalZone() { - super("Death portal", true); - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - ZoneBuilder.configure(this); - return this; - } - - @Override - public Object fireEvent(String identifier, Object... args) { - return null; - } - - @Override - public boolean enter(Entity entity) { - if (entity instanceof Player) { - darken(entity.asPlayer()); - } - return super.enter(entity); - } - - @Override - public boolean leave(Entity e, boolean logout) { - if (e instanceof Player) { - e.asPlayer().getInterfaceManager().closeOverlay(); - } - return super.leave(e, logout); - } - - @Override - public void locationUpdate(Entity e, Location last) { - if (e instanceof Player) { - darken(e.asPlayer()); - } - super.locationUpdate(e, last); - } - - /** - * Darkens the players screen. - * @param player the player. - */ - private void darken(Player player) { - int distance = (int) player.getLocation().getDistance(new Location(3000, 3269, 0)); - int component = 97; - if (distance < 5) { - component = 98; - } - if (player.getInterfaceManager().getOverlay() == null || player.getInterfaceManager().getOverlay().getId() != component) { - player.getInterfaceManager().openOverlay(new Component(component)); - } - } - - @Override - public void configure() { - register(new ZoneBorders(2993, 3263, 3008, 3275)); - } - - } - - /** - * Handles the dark portal entrance. - * @author Vexia - */ - public class DarkPortalHandler extends OptionHandler { - - @Override - public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new DarkPortalDialogue()); - SceneryDefinition.forId(DEATH_PORTAL).getHandlers().put("option:enter", this); - return this; - } - - @Override - public boolean handle(Player player, Node node, String option) { - if (player.getDetails().getRights() == Rights.ADMINISTRATOR) { - player.getPacketDispatch().sendMessage("Current pumpkin location: " + pumpkin.getLocation() + "."); - } - if (isComplete(player)) { - player.sendMessage("You've no need to return to the Grim Reaper's house."); - return true; - } - player.getDialogueInterpreter().open("dark-portal"); - return true; - } - - /** - * Handles the dark portals dialogue. - * @author Vexia - */ - public class DarkPortalDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code DarkPortalDialogue} {@code Object} - */ - public DarkPortalDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code DarkPortalDialogue} {@code Object} - * @param player the player. - */ - public DarkPortalDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new DarkPortalDialogue(player); - } - - @Override - public boolean open(Object... args) { - switch (getStage(player)) { - case 0: - player("I can't believe I'm doing this.", "Oh, well, here goes nothing."); - break; - default: - player.teleport(START); - break; - } - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (getStage(player)) { - case 0: - switch (stage) { - case 0: - player.teleport(START); - GameWorld.getPulser().submit(new Pulse(1, player) { - - @Override - public boolean pulse() { - player("Well, I'm still in one piece - that's a good start."); - stage++; - return true; - } - - }); - close(); - break; - case 1: - end(); - break; - } - break; - default: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { DialogueInterpreter.getDialogueKey("dark-portal") }; - } - - } - - } - - /** - * Handles the muncher npc. - * @author Vexia - */ - public class MuncherNPC extends AbstractNPC { - - /** - * Constructs a new {@code MuncherNPC} {@code Object} - * @param id the id. - * @param location the location. - */ - public MuncherNPC(int id, Location location) { - super(id, location); - } - - /** - * Constructs a new {@code MuncherNPC} {@code Object} - */ - public MuncherNPC() { - super(-1, null); - } - - @Override - public void handleTickActions() { - super.handleTickActions(); - if (RandomFunction.random(100) < 4) { - sendChat("Grrrrr"); - } - } - - @Override - public AbstractNPC construct(int id, Location location, Object... objects) { - return new MuncherNPC(id, location); - } - - @Override - public int[] getIds() { - return new int[] { 2329 }; - } - - } - - /** - * Handles the muncher dialogue. - * @author Vexia - */ - public class MuncherDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code MuncherDialogue} {@code Object} - */ - public MuncherDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code MuncherDialogue} {@code Object} - * @param player the player. - */ - public MuncherDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new MuncherDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - interpreter.sendDialogues(player, FacialExpression.JOLLY, "Here, boy!"); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc.sendChat("Grrrrrrr"); - interpreter.sendDialogues(player, FacialExpression.SUSPICIOUS, "Whoaah!"); - stage++; - break; - case 1: - options("Stroke him", "Try to entertain him", "Blow a raspberry at him"); - stage++; - break; - case 2: - if (buttonId == 1) { - close(); - Animation a = Animation.create(7270); - player.animate(a); - player.lock(a.getDuration()); - npc.faceTemporary(player, 2); - npc.animate(Animation.create(6578)); - GameWorld.getPulser().submit(new Pulse(a.getDuration(), player) { - @Override - public boolean pulse() { - player("Okay, touching him seems to be a bad idea."); - stage++; - return true; - } - }); - } else if (buttonId == 2) { - close(); - Animation anim = new Animation(866); - player.animate(anim); - player.lock(anim.getDuration()); - GameWorld.getPulser().submit(new Pulse(anim.getDuration(), player) { - @Override - public boolean pulse() { - player("If it's possible for a skeletal dog to smile, I think he", "would be now."); - stage++; - return true; - } - }); - } else { - npc.sendChat("Grrrrrr"); - player.animate(Animation.create(2110)); - npc.faceTemporary(player, 3); - player.lock(4); - GameWorld.getPulser().submit(new Pulse(3, player) { - @Override - public boolean pulse() { - npc.animate(Animation.create(6579)); - player.getImpactHandler().manualHit(player, player.getSkills().getLifepoints(), HitsplatType.NORMAL); - return true; - } - }); - end(); - } - break; - case 3: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { DialogueInterpreter.getDialogueKey("muncher-dialogue") }; - } - - } -} diff --git a/Server/src/main/java/core/game/content/quest/free/ErnestTheChicken.java b/Server/src/main/java/core/game/content/quest/free/ErnestTheChicken.java index d9eb30bc5..5eb898e20 100644 --- a/Server/src/main/java/core/game/content/quest/free/ErnestTheChicken.java +++ b/Server/src/main/java/core/game/content/quest/free/ErnestTheChicken.java @@ -7,7 +7,7 @@ import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.game.world.map.Location; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the ernest the chicken quest. @@ -45,7 +45,7 @@ public final class ErnestTheChicken extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new ErnestNPC(), new ErnestChickenNPC()); + ClassScanner.definePlugins(new ErnestNPC(), new ErnestChickenNPC()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java b/Server/src/main/java/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java index fca3763b8..8068ce5e2 100644 --- a/Server/src/main/java/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java +++ b/Server/src/main/java/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java @@ -4,7 +4,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the black knights fortress quest. @@ -28,7 +28,7 @@ public final class BlackKnightsFortress extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new BKCabbagePlugin(), new BKFortressPlugin(), new SirAmikVarzeDialogue()); + ClassScanner.definePlugins(new BKCabbagePlugin(), new BKFortressPlugin(), new SirAmikVarzeDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayer.java b/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayer.java index 262ec28b8..589073752 100644 --- a/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayer.java +++ b/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayer.java @@ -11,7 +11,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the demon slayer quest. @@ -55,7 +55,7 @@ public class DemonSlayer extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new DemonSlayerPlugin(), new DSlayerDrainPlugin(), new DemonSlayerCutscene(), new WallyCutscenePlugin(), new GypsyArisDialogue(), new SirPyrsinDialogue(), new TraibornDialogue(), new CaptainRovinDialogue()); + ClassScanner.definePlugins(new DemonSlayerPlugin(), new DSlayerDrainPlugin(), new DemonSlayerCutscene(), new WallyCutscenePlugin(), new GypsyArisDialogue(), new SirPyrsinDialogue(), new TraibornDialogue(), new CaptainRovinDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java index 913dcc886..802f231b8 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java @@ -15,7 +15,7 @@ import core.plugin.Initializable; import rs09.game.content.dialogue.region.lumbridge.DukeHoracioDialogue; import rs09.game.content.quest.free.dragonslayer.NedDialogue; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the dragon slayer quest. @@ -119,7 +119,7 @@ public final class DragonSlayer extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new CrandorMapPlugin(), new DragonSlayerPlugin(), new DSMagicDoorPlugin(), new DragonSlayerCutscene(), new MazeDemonNPC(), new MazeGhostNPC(), new MazeSkeletonNPC(), new MazeZombieNPC(), new MeldarMadNPC(), new WormbrainNPC(), new ZombieRatNPC(), new DSChestDialogue(), new GuildmasterDialogue(), new ElvargNPC(), new WormbrainDialogue(), new OziachDialogue(), new NedDialogue(), new DukeHoracioDialogue()); + ClassScanner.definePlugins(new CrandorMapPlugin(), new DragonSlayerPlugin(), new DSMagicDoorPlugin(), new DragonSlayerCutscene(), new MazeDemonNPC(), new MazeGhostNPC(), new MazeSkeletonNPC(), new MazeZombieNPC(), new MeldarMadNPC(), new WormbrainNPC(), new ZombieRatNPC(), new DSChestDialogue(), new GuildmasterDialogue(), new ElvargNPC(), new WormbrainDialogue(), new OziachDialogue(), new NedDialogue(), new DukeHoracioDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java b/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java index 59c70f6f8..106ae88c6 100644 --- a/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java +++ b/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java @@ -6,7 +6,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.GroundItemManager; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the demon slayer quest. @@ -50,7 +50,7 @@ public class GoblinDiplomacy extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new GDiplomacyCutscene(), new GoblinDiplomacyPlugin(), new GrubfootDialogue()); + ClassScanner.definePlugins(new GDiplomacyCutscene(), new GoblinDiplomacyPlugin(), new GrubfootDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java b/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java index 807c401af..8045456c8 100644 --- a/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java +++ b/Server/src/main/java/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java @@ -12,7 +12,7 @@ import core.game.node.item.Item; import core.game.node.scenery.Scenery; import rs09.game.world.GameWorld; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.StringUtils; /** @@ -42,7 +42,7 @@ public final class GoblinDiplomacyPlugin extends OptionHandler { for (GoblinMailPlugin.GoblinMail mail : GoblinMailPlugin.GoblinMail.values()) { ItemDefinition.forId(mail.getProduct().getId()).getHandlers().put("option:wear", this); } - PluginManager.definePlugin(new GoblinMailPlugin()); + ClassScanner.definePlugin(new GoblinMailPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/piratestreasure/PiratesTreasure.java b/Server/src/main/java/core/game/content/quest/free/piratestreasure/PiratesTreasure.java index d9bc2ed00..c14deee6d 100644 --- a/Server/src/main/java/core/game/content/quest/free/piratestreasure/PiratesTreasure.java +++ b/Server/src/main/java/core/game/content/quest/free/piratestreasure/PiratesTreasure.java @@ -6,7 +6,7 @@ import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the pirates treasure quest. @@ -55,7 +55,7 @@ public final class PiratesTreasure extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new PiratesTreasurePlugin()); + ClassScanner.definePlugin(new PiratesTreasurePlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/princealirescue/PrinceAliRescue.java b/Server/src/main/java/core/game/content/quest/free/princealirescue/PrinceAliRescue.java index c161997c0..1f2409158 100644 --- a/Server/src/main/java/core/game/content/quest/free/princealirescue/PrinceAliRescue.java +++ b/Server/src/main/java/core/game/content/quest/free/princealirescue/PrinceAliRescue.java @@ -5,7 +5,7 @@ import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the prince ali rescue quest. @@ -49,7 +49,7 @@ public class PrinceAliRescue extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new LadyKeliDialogue(), new LadyKeliNPC(), new PrinceAliRescuePlugin(), new WigDyePlugin()); + ClassScanner.definePlugins(new LadyKeliDialogue(), new LadyKeliNPC(), new PrinceAliRescuePlugin(), new WigDyePlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java b/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java index 8b9d0d7d6..d4d13c79e 100644 --- a/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java +++ b/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java @@ -5,7 +5,7 @@ import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; import rs09.game.content.dialogue.region.varrock.KingRoaldDialogue; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the shield of arrav quest. @@ -59,7 +59,7 @@ public class ShieldofArrav extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new CertificatePlugin(), new CuratorHaigHalenDialogue(), new JohnnyBeardNPC(), new JonnytheBeardPlugin(), new KatrineDialogue(), new KingRoaldDialogue(), new ReldoDialogue(), new ShieldArravPlugin(), new ShieldofArravBook(), new StravenDialogue(), new WeaponsMasterDialogue()); + ClassScanner.definePlugins(new CertificatePlugin(), new CuratorHaigHalenDialogue(), new JohnnyBeardNPC(), new JonnytheBeardPlugin(), new KatrineDialogue(), new KingRoaldDialogue(), new ReldoDialogue(), new ShieldArravPlugin(), new ShieldofArravBook(), new StravenDialogue(), new WeaponsMasterDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhost.java b/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhost.java index 0108fadf3..dbfdd5fea 100644 --- a/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhost.java +++ b/Server/src/main/java/core/game/content/quest/free/therestlessghost/RestlessGhost.java @@ -6,7 +6,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the restless ghost quest. @@ -35,7 +35,7 @@ public class RestlessGhost extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new OldCronDialogue()); + ClassScanner.definePlugin(new OldCronDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java index d2efe20e5..5ad67b9bd 100644 --- a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java @@ -21,7 +21,7 @@ import core.net.packet.PacketRepository; import core.net.packet.context.CameraContext; import core.net.packet.context.CameraContext.CameraType; import core.net.packet.out.CameraViewPacket; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the husband of alice's npc dialogue. @@ -64,7 +64,7 @@ public final class AliceHusbandDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new ChickenCatchScene()); + ClassScanner.definePlugin(new ChickenCatchScene()); } @Override diff --git a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java index 12a39c6b2..5dab5a895 100644 --- a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java +++ b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java @@ -4,7 +4,7 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.game.content.quest.members.animalmagnetism.AnimalMagnetismPlugin.ContainerHandler; import core.game.content.quest.members.animalmagnetism.AnimalMagnetismPlugin.HammerMagnetPlugin; @@ -108,16 +108,16 @@ public final class AnimalMagnetism extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new AvaDialogue()); - PluginManager.definePlugin(new AliceDialogue()); - PluginManager.definePlugin(new WitchDialogue()); - PluginManager.definePlugin(new ContainerHandler()); - PluginManager.definePlugin(new UndeadTreePlugin()); - PluginManager.definePlugin(new AvasDevicePlugin()); - PluginManager.definePlugin(new HammerMagnetPlugin()); - PluginManager.definePlugin(new ResearchNoteHandler()); - PluginManager.definePlugin(new AliceHusbandDialogue()); - PluginManager.definePlugin(new AnimalMagnetismPlugin()); + ClassScanner.definePlugin(new AvaDialogue()); + ClassScanner.definePlugin(new AliceDialogue()); + ClassScanner.definePlugin(new WitchDialogue()); + ClassScanner.definePlugin(new ContainerHandler()); + ClassScanner.definePlugin(new UndeadTreePlugin()); + ClassScanner.definePlugin(new AvasDevicePlugin()); + ClassScanner.definePlugin(new HammerMagnetPlugin()); + ClassScanner.definePlugin(new ResearchNoteHandler()); + ClassScanner.definePlugin(new AliceHusbandDialogue()); + ClassScanner.definePlugin(new AnimalMagnetismPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java index 83750c71f..73056266d 100644 --- a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java @@ -31,7 +31,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -219,7 +219,7 @@ public final class AnimalMagnetismPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { NPCDefinition.forId(5208).getHandlers().put("option:chop", this); diff --git a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java index ef1adc6d8..9de59e88d 100644 --- a/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java @@ -7,7 +7,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; import rs09.game.node.entity.state.newsys.states.AvaDeviceState; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the equippage event of an ava device. @@ -19,7 +19,7 @@ public final class AvasDevicePlugin implements Plugin { public Plugin newInstance(Object arg) throws Throwable { AnimalMagnetism.AVAS_ACCUMULATOR.getDefinition().getHandlers().put("equipment", this); AnimalMagnetism.AVAS_ATTRACTOR.getDefinition().getHandlers().put("equipment", this); - PluginManager.definePlugin(new DisableDevicePlugin()); + ClassScanner.definePlugin(new DisableDevicePlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/dwarfcannon/DwarfCannon.java b/Server/src/main/java/core/game/content/quest/members/dwarfcannon/DwarfCannon.java index 86998a7dc..3b6917cac 100644 --- a/Server/src/main/java/core/game/content/quest/members/dwarfcannon/DwarfCannon.java +++ b/Server/src/main/java/core/game/content/quest/members/dwarfcannon/DwarfCannon.java @@ -4,7 +4,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.game.node.entity.skill.Skills; /** @@ -48,11 +48,11 @@ public class DwarfCannon extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new LollkDialogue()); - PluginManager.definePlugin(new NulodionDialogue()); - PluginManager.definePlugin(new CaptainLawgofNPC()); - PluginManager.definePlugin(new CaptainLawgofDialogue()); - PluginManager.definePlugin(new DwarfCannonPlugin()); + ClassScanner.definePlugin(new LollkDialogue()); + ClassScanner.definePlugin(new NulodionDialogue()); + ClassScanner.definePlugin(new CaptainLawgofNPC()); + ClassScanner.definePlugin(new CaptainLawgofDialogue()); + ClassScanner.definePlugin(new DwarfCannonPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/junglepotion/JunglePotion.java b/Server/src/main/java/core/game/content/quest/members/junglepotion/JunglePotion.java index 92a012675..2c7d5c903 100644 --- a/Server/src/main/java/core/game/content/quest/members/junglepotion/JunglePotion.java +++ b/Server/src/main/java/core/game/content/quest/members/junglepotion/JunglePotion.java @@ -9,7 +9,7 @@ import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; import core.game.system.task.Pulse; import core.game.world.update.flag.context.Animation; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import core.tools.StringUtils; @@ -37,9 +37,9 @@ public final class JunglePotion extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new TrufitusDialogue()); - PluginManager.definePlugin(new JogreCavernDialogue()); - PluginManager.definePlugin(new JunglePotionPlugin()); + ClassScanner.definePlugin(new TrufitusDialogue()); + ClassScanner.definePlugin(new JogreCavernDialogue()); + ClassScanner.definePlugin(new JunglePotionPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/lostcity/LostCity.java b/Server/src/main/java/core/game/content/quest/members/lostcity/LostCity.java index 347d9bbc9..5654f0276 100644 --- a/Server/src/main/java/core/game/content/quest/members/lostcity/LostCity.java +++ b/Server/src/main/java/core/game/content/quest/members/lostcity/LostCity.java @@ -5,7 +5,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The main type for the lost city Quest. @@ -93,11 +93,11 @@ public class LostCity extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new LostCityPlugin()); - PluginManager.definePlugin(new TreeSpiritNPC()); - PluginManager.definePlugin(new ShamusDialogue()); - PluginManager.definePlugin(new WarriorDialogue()); - PluginManager.definePlugin(new DramenStaffPlugin()); + ClassScanner.definePlugin(new LostCityPlugin()); + ClassScanner.definePlugin(new TreeSpiritNPC()); + ClassScanner.definePlugin(new ShamusDialogue()); + ClassScanner.definePlugin(new WarriorDialogue()); + ClassScanner.definePlugin(new DramenStaffPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java index ee078e04e..6585260c1 100644 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java @@ -10,7 +10,7 @@ import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Plugin; import rs09.game.system.config.ShopParser; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the dialogue plugin used to handle the candle maker npc. @@ -45,7 +45,7 @@ public final class CandleMakerDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java index 76e3eda47..42b7d4fd9 100644 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java +++ b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java @@ -4,7 +4,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.plugin.Initializable; import rs09.game.content.quest.members.merlinsquest.TheLadyOfTheLake; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the merlin's crystal quest. @@ -77,7 +77,7 @@ public final class MerlinCrystal extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new CrateCutscenePlugin(), + ClassScanner.definePlugins(new CrateCutscenePlugin(), new MerlinCrystalPlugin(), new ArheinShopDialogue(), new BeggarDialogue(), diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java index af194ccbc..825495df7 100644 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java @@ -29,7 +29,7 @@ import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the Merlin's Crystal Dialogue/Interactions. @@ -59,8 +59,8 @@ public final class MerlinCrystalPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new MerlinCrystalDialogue()); - PluginManager.definePlugin(new MerlinCrystalItemHandler()); + ClassScanner.definePlugin(new MerlinCrystalDialogue()); + ClassScanner.definePlugin(new MerlinCrystalItemHandler()); SceneryDefinition.forId(63).getHandlers().put("option:hide-in", this); SceneryDefinition.forId(40026).getHandlers().put("option:climb-up", this); SceneryDefinition.forId(72).getHandlers().put("option:open", this); diff --git a/Server/src/main/java/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java b/Server/src/main/java/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java index 63cab6fdf..7fbc3f44d 100644 --- a/Server/src/main/java/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java +++ b/Server/src/main/java/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java @@ -12,7 +12,7 @@ import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.game.world.map.Location; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The level 84 Moss Giant in Glarial's tomb. @@ -57,7 +57,7 @@ public final class MossGiantGuardianNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElves.java b/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElves.java index 0971d62d1..1d3d969dd 100644 --- a/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElves.java +++ b/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElves.java @@ -5,7 +5,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The Roving Elves quest. @@ -94,11 +94,11 @@ public class RovingElves extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new RovingElvesPlugin()); - PluginManager.definePlugin(new RovingElvesObstacles()); - PluginManager.definePlugin(new ElunedDialogue()); - PluginManager.definePlugin(new IslwynDialogue()); - PluginManager.definePlugin(new MossGiantGuardianNPC()); + ClassScanner.definePlugin(new RovingElvesPlugin()); + ClassScanner.definePlugin(new RovingElvesObstacles()); + ClassScanner.definePlugin(new ElunedDialogue()); + ClassScanner.definePlugin(new IslwynDialogue()); + ClassScanner.definePlugin(new MossGiantGuardianNPC()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/thetouristrap/AnaDialogue.java b/Server/src/main/java/core/game/content/quest/members/thetouristrap/AnaDialogue.java index ec03928ef..2c957e843 100644 --- a/Server/src/main/java/core/game/content/quest/members/thetouristrap/AnaDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/thetouristrap/AnaDialogue.java @@ -12,7 +12,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.map.RegionManager; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The dialogue plugin used to handle the ana npc. @@ -51,8 +51,8 @@ public final class AnaDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new AnaNPC()); - PluginManager.definePlugin(new AnaBarrelHandler()); + ClassScanner.definePlugin(new AnaNPC()); + ClassScanner.definePlugin(new AnaBarrelHandler()); } @Override diff --git a/Server/src/main/java/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java b/Server/src/main/java/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java index 927f2ef5d..12050b4cf 100644 --- a/Server/src/main/java/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java @@ -11,7 +11,7 @@ import core.game.system.task.Pulse; import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.map.RegionManager; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -51,7 +51,7 @@ public final class DesertGuardDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new DesertGuardNPC()); + ClassScanner.definePlugin(new DesertGuardNPC()); } @Override diff --git a/Server/src/main/java/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java b/Server/src/main/java/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java index 43f74baf4..c90d3b87a 100644 --- a/Server/src/main/java/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java @@ -7,7 +7,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.world.map.Location; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the mercenary captain dialogue plugin. @@ -46,7 +46,7 @@ public final class MercenaryCaptainDialogue extends DialoguePlugin { @Override public void init() { super.init(); - PluginManager.definePlugin(new MercenaryCaptain()); + ClassScanner.definePlugin(new MercenaryCaptain()); } @Override diff --git a/Server/src/main/java/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java b/Server/src/main/java/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java index 60f0ac084..d07887c21 100644 --- a/Server/src/main/java/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java +++ b/Server/src/main/java/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java @@ -11,7 +11,7 @@ import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.game.world.map.Location; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -65,7 +65,7 @@ public final class RowdySlaveNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrap.java b/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrap.java index 6c68c59e2..161fd8033 100644 --- a/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrap.java +++ b/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrap.java @@ -11,7 +11,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.map.zone.ZoneBorders; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The main type for the tourist trap quest. @@ -116,7 +116,7 @@ public final class TouristTrap extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new TouristTrapPlugin(), new AnaDialogue(), new CaptainSiadDialogue(), new DesertGuardDialogue(), new IrenaDialogue(), new MaleSlaveDialogue(), new MercenaryCaptainDialogue(), new MercenaryDialogue(), new MinecartDriverDialogue(), new MineSlaveNPC(), new MiningCampZone(), new RowdySlaveNPC(), new AlShabimDialogue(), new BedabinNomadDialogue()); + ClassScanner.definePlugins(new TouristTrapPlugin(), new AnaDialogue(), new CaptainSiadDialogue(), new DesertGuardDialogue(), new IrenaDialogue(), new MaleSlaveDialogue(), new MercenaryCaptainDialogue(), new MercenaryDialogue(), new MinecartDriverDialogue(), new MineSlaveNPC(), new MiningCampZone(), new RowdySlaveNPC(), new AlShabimDialogue(), new BedabinNomadDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java b/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java index a87caed01..4d2de19cd 100644 --- a/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java @@ -32,7 +32,7 @@ import core.game.world.map.RegionManager; import core.game.world.map.build.DynamicRegion; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import core.game.content.quest.members.thetouristrap.TouristTrapPlugin.AnnaCartHandler.AnnaCartCutscene; @@ -117,16 +117,16 @@ public final class TouristTrapPlugin extends OptionHandler { TouristTrap.TECHNICAL_PLANS.getDefinition().getHandlers().put("option:read", this); TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:look", this); TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:drop", this); - PluginManager.definePlugin(new BedabinKeyHandler()); - PluginManager.definePlugin(new BedabinAnvilHandler()); - PluginManager.definePlugin(new BarrelDialogue()); - PluginManager.definePlugin(new WinchDialogue()); - PluginManager.definePlugin(new MineCartDialogue()); - PluginManager.definePlugin(new AnnaCartHandler()); - PluginManager.definePlugin(new AnnaCartCutscene()); - PluginManager.definePlugin(new AnnaWinchHandler()); - PluginManager.definePlugin(new WinchCutscene()); - PluginManager.definePlugin(new CartDialogue()); + ClassScanner.definePlugin(new BedabinKeyHandler()); + ClassScanner.definePlugin(new BedabinAnvilHandler()); + ClassScanner.definePlugin(new BarrelDialogue()); + ClassScanner.definePlugin(new WinchDialogue()); + ClassScanner.definePlugin(new MineCartDialogue()); + ClassScanner.definePlugin(new AnnaCartHandler()); + ClassScanner.definePlugin(new AnnaCartCutscene()); + ClassScanner.definePlugin(new AnnaWinchHandler()); + ClassScanner.definePlugin(new WinchCutscene()); + ClassScanner.definePlugin(new CartDialogue()); return this; } @@ -963,7 +963,7 @@ public final class TouristTrapPlugin extends OptionHandler { @Override public void init() { super.init(); - PluginManager.definePlugin(new MiningCartCutscene()); + ClassScanner.definePlugin(new MiningCartCutscene()); } @Override @@ -1386,8 +1386,8 @@ public final class TouristTrapPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) { addHandler(2672, OBJECT_TYPE, this); - PluginManager.definePlugin(new PrototypeDartHandler()); - PluginManager.definePlugin(new BedabinAnvilDialogue()); + ClassScanner.definePlugin(new PrototypeDartHandler()); + ClassScanner.definePlugin(new BedabinAnvilDialogue()); return this; } @@ -1459,7 +1459,7 @@ public final class TouristTrapPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) { addHandler(TouristTrap.PROTOTYPE_DART_TIP.getId(), ITEM_TYPE, this); - PluginManager.definePlugin(new ProtoTypeDialogue()); + ClassScanner.definePlugin(new ProtoTypeDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterFall.java b/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterFall.java index 0b96c06d1..fd6387b5b 100644 --- a/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterFall.java +++ b/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterFall.java @@ -5,7 +5,7 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The main type for the waterfall quest. @@ -84,7 +84,7 @@ public class WaterFall extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugins(new AlmeraDialogue(), new BookOnBaxtorianPlugin(), new GolrieDialogue(), new HadleyDialogue(), new HudonDialogue(), new WaterfallPlugin(), new WaterfallTreeDialogue()); + ClassScanner.definePlugins(new AlmeraDialogue(), new BookOnBaxtorianPlugin(), new GolrieDialogue(), new HadleyDialogue(), new HudonDialogue(), new WaterfallPlugin(), new WaterfallTreeDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java b/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java index 3af50ab50..5adb516a2 100644 --- a/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java @@ -21,13 +21,12 @@ import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import kotlin.Unit; +import rs09.plugin.ClassScanner; /** * Master plugin file for the Waterfall quest. @@ -101,7 +100,7 @@ public final class WaterfallPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new WaterfallUseWithHandler()); + ClassScanner.definePlugin(new WaterfallUseWithHandler()); NPCDefinition.forId(305).getHandlers().put("option:talk-to", this); SceneryDefinition.forId(1987).getHandlers().put("option:board", this); SceneryDefinition.forId(2020).getHandlers().put("option:climb", this); @@ -276,7 +275,10 @@ public final class WaterfallPlugin extends OptionHandler { break; case 10283: case 1996: - player.addExtension(LogoutTask.class, new LocationLogoutTask(10, player.getLocation())); + player.logoutListeners.put("waterfall", player1 -> { + player1.setLocation(player.getLocation().transform(0,0,0)); + return Unit.INSTANCE; + }); player.getPacketDispatch().sendGraphic(68); player.lock(6); AgilityHandler.walk(player, -1, player.getLocation(), new Location(2512, 3471, 0), Animation.create(164), 0, null); @@ -287,6 +289,7 @@ public final class WaterfallPlugin extends OptionHandler { public boolean pulse() { player.getPacketDispatch().sendMessage("You are washed downstream but feel lucky to be alive."); player.teleport(new Location(2527, 3413)); + player.logoutListeners.remove("waterfall"); return true; } }); @@ -431,7 +434,10 @@ public final class WaterfallPlugin extends OptionHandler { if (SWIMMERS.size() == 0 || ROPES.size() == 0) { handleObjects(true, player); } - player.addExtension(LogoutTask.class, new LocationLogoutTask(13, player.getLocation())); + player.logoutListeners.put("waterfall", player1 -> { + player1.setLocation(player.getLocation().transform(0,0,0)); + return Unit.INSTANCE; + }); player.getPulseManager().run(new Pulse(2, player) { @Override public boolean pulse() { @@ -443,6 +449,7 @@ public final class WaterfallPlugin extends OptionHandler { player.teleport(new Location(2513, 3468)); player.faceLocation(new Location(2512, 3468, 0)); player.animate(Animation.create(780)); + player.logoutListeners.remove("waterfall"); return true; } diff --git a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java index 664683215..49ee2848f 100644 --- a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java @@ -19,7 +19,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the what lies below options. @@ -30,14 +30,14 @@ public class WLBelowPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new OutlawNPC()); - PluginManager.definePlugin(new KingRoaldNPC()); + ClassScanner.definePlugin(new OutlawNPC()); + ClassScanner.definePlugin(new KingRoaldNPC()); ActivityManager.register(new WLBelowCutscene()); - PluginManager.definePlugin(new FolderHandler()); - PluginManager.definePlugin(new MetalWandHandler()); - PluginManager.definePlugin(new AnnaJonesDialogue()); - PluginManager.definePlugin(new SurokMagisDialogue()); - PluginManager.definePlugin(new RatBurgissDialogue()); + ClassScanner.definePlugin(new FolderHandler()); + ClassScanner.definePlugin(new MetalWandHandler()); + ClassScanner.definePlugin(new AnnaJonesDialogue()); + ClassScanner.definePlugin(new SurokMagisDialogue()); + ClassScanner.definePlugin(new RatBurgissDialogue()); SceneryDefinition.forId(23095).getHandlers().put("option:use", this); SceneryDefinition.forId(23058).getHandlers().put("option:enter", this); SceneryDefinition.forId(23057).getHandlers().put("option:excavate", this); diff --git a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java index e7ba1b645..d79ede2de 100644 --- a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java +++ b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java @@ -6,7 +6,7 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The what lies below quest. @@ -100,7 +100,7 @@ public class WhatLiesBelow extends Quest { @Override public Quest newInstance(Object object) { - PluginManager.definePlugin(new WLBelowPlugin()); + ClassScanner.definePlugin(new WLBelowPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java b/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java index e781d6403..f2fcd696b 100644 --- a/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java @@ -16,7 +16,7 @@ import core.game.node.scenery.Scenery; import core.game.world.map.Location; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -169,8 +169,8 @@ public class WitchsHousePlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new WitchsHouseUseWithHandler()); - PluginManager.definePlugin(new MouseNPC()); + ClassScanner.definePlugin(new WitchsHouseUseWithHandler()); + ClassScanner.definePlugin(new MouseNPC()); SceneryDefinition.forId(2867).getHandlers().put("option:look-under", this); SceneryDefinition.forId(2861).getHandlers().put("option:open", this); SceneryDefinition.forId(2865).getHandlers().put("option:open", this); diff --git a/Server/src/main/java/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java b/Server/src/main/java/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java index a6ae5157f..bc0be6ffb 100644 --- a/Server/src/main/java/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java +++ b/Server/src/main/java/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java @@ -6,7 +6,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the hunt for surok mini quest. @@ -17,10 +17,10 @@ public class HuntForSurokPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new DakhThoulanAegisDialogue()); - PluginManager.definePlugin(new MishkalunDornDialogue()); - PluginManager.definePlugin(new SilasDahcsnuDialogue()); - PluginManager.definePlugin(new SurokMagisDialogue()); + ClassScanner.definePlugin(new DakhThoulanAegisDialogue()); + ClassScanner.definePlugin(new MishkalunDornDialogue()); + ClassScanner.definePlugin(new SilasDahcsnuDialogue()); + ClassScanner.definePlugin(new SurokMagisDialogue()); SceneryDefinition.forId(28780).getHandlers().put("option:use", this); return this; } diff --git a/Server/src/main/java/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java b/Server/src/main/java/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java deleted file mode 100644 index 7ea33875e..000000000 --- a/Server/src/main/java/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java +++ /dev/null @@ -1,44 +0,0 @@ -package core.game.content.quest.tutorials.tutorialisland; - -import core.game.node.entity.player.Player; -import core.plugin.Initializable; -import core.plugin.Plugin; -import core.plugin.PluginManifest; -import core.plugin.PluginType; - -/** - * Basic starter until tutorial is completed. - * - * @author Michael Sasse (https://github.com/mikeysasse/) - */ -@Initializable -@PluginManifest(type = PluginType.LOGIN) -public class BasicStarter implements Plugin { - - private static final int[][] STARTER_ITEMS = { { 1351, 1 }, { 590, 1 }, - { 303, 1 }, { 315, 1 }, { 1925, 1 }, { 1931, 1 }, { 2309, 1 }, - { 1265, 1 }, { 1205, 1 }, { 1277, 1 }, { 1171, 1 }, { 841, 1 }, - { 882, 25 }, { 556, 25 }, { 558, 15 }, { 555, 6 }, { 557, 4 }, - { 559, 2 } }; - - public BasicStarter() { } - - @Override - public Plugin newInstance(Player player) throws Throwable { - if (player.getDetails().getLastLogin() == 0) { - //Redundant if the Tutorial Completion Dialogue is going to clear the bank, inventory and equipment after teleporting to Lumbridge. - //Causes a full inventory on tutorial island when the instructors are giving the player more items. - //The Starter pack array exists in the TutorialCompletionDialogue file... So could this file be deleted? - - /*for (int[] item : STARTER_ITEMS) { - player.getInventory().add(new Item(item[0], item[1])); - }*/ - } - return this; - } - - @Override - public Object fireEvent(String identifier, Object... args) { - return null; - } -} diff --git a/Server/src/main/java/core/game/content/ttrail/EmoteCluePlugin.java b/Server/src/main/java/core/game/content/ttrail/EmoteCluePlugin.java index b66f6326e..fbedcc260 100644 --- a/Server/src/main/java/core/game/content/ttrail/EmoteCluePlugin.java +++ b/Server/src/main/java/core/game/content/ttrail/EmoteCluePlugin.java @@ -3,7 +3,7 @@ package core.game.content.ttrail; import core.game.node.entity.player.link.emote.Emotes; import core.game.world.map.zone.ZoneBorders; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Initializes the emote clue plugins. @@ -140,7 +140,7 @@ public final class EmoteCluePlugin extends EmoteClueScroll { register(new EmoteCluePlugin("draynor-market-yawn", 2737, ClueLevel.EASY, emote, new int[][] { { 1097 }, { 1191 }, { 1295 } }, "Yawn in Draynor
Marketplace.
Equip studded leather
chaps, an iron
kiteshield and a steel
longsword.", new ZoneBorders(3075, 3245, 3086, 3255))); register(new EmoteCluePlugin("castle-wars-yawn", 2739, ClueLevel.MEDIUM, emote, Emotes.SHRUG, new int[][] { { 1698 }, { 1329 }, WILDY_CAPES }, "Yawn in the Castle
Wars lobby. Shrug
before you talk to me.
Equip ruby amulet, a
mithril scimitar and a
Wilderness cape.", new ZoneBorders(2434, 3061, 2464, 3102))); register(new EmoteCluePlugin("rogue-gen-yawn", 2741, ClueLevel.HARD, emote, new int[][] { { 1183 }, { 2487 }, { 1275 } }, "Yawn in the rogues'
general store. Beware
of double agents!
Equip an adamant
square shield, blue
dragon vambraces
and a rune pickaxe.", new ZoneBorders(3024, 3699, 3027, 3704))); - PluginManager.definePlugin(new UriNPC()); + ClassScanner.definePlugin(new UriNPC()); return this; } diff --git a/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java b/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java index 6d974c172..592eeb9c4 100644 --- a/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java +++ b/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java @@ -17,8 +17,7 @@ import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.game.system.config.NPCConfigParser; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the clue scroll options. @@ -41,14 +40,14 @@ public final class TreasureTrailPlugin extends OptionHandler { ItemDefinition.forId(level.getCasket().getId()).getHandlers().put("option:open", this); } ItemDefinition.forId(CoordinateClueScroll.SEXTANT.getId()).getHandlers().put("option:look through", this); - PluginManager.definePlugin(new MapCluePlugin()); - PluginManager.definePlugin(new ClueItemPlugin()); - PluginManager.definePlugin(new EmoteCluePlugin()); - PluginManager.definePlugin(new TTrailOptionHandler()); - PluginManager.definePlugin(new SextantComponentPlugin()); - PluginManager.definePlugin(new CoordinateCluePlugin()); - PluginManager.definePlugin(new SaradominWizardNPC()); - PluginManager.definePlugin(new ZamorakWizardNPC()); + ClassScanner.definePlugin(new MapCluePlugin()); + ClassScanner.definePlugin(new ClueItemPlugin()); + ClassScanner.definePlugin(new EmoteCluePlugin()); + ClassScanner.definePlugin(new TTrailOptionHandler()); + ClassScanner.definePlugin(new SextantComponentPlugin()); + ClassScanner.definePlugin(new CoordinateCluePlugin()); + ClassScanner.definePlugin(new SaradominWizardNPC()); + ClassScanner.definePlugin(new ZamorakWizardNPC()); return this; } 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 0d79b54e0..5e264071f 100644 --- a/Server/src/main/java/core/game/content/ttrail/UriNPC.java +++ b/Server/src/main/java/core/game/content/ttrail/UriNPC.java @@ -9,7 +9,7 @@ import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.game.world.map.RegionManager; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -120,7 +120,7 @@ public final class UriNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new UriDialogue()); + ClassScanner.definePlugin(new UriDialogue()); return super.newInstance(arg); } diff --git a/Server/src/main/java/core/game/content/zone/ChaosTunnelZone.java b/Server/src/main/java/core/game/content/zone/ChaosTunnelZone.java index db69d4241..fa1483f96 100644 --- a/Server/src/main/java/core/game/content/zone/ChaosTunnelZone.java +++ b/Server/src/main/java/core/game/content/zone/ChaosTunnelZone.java @@ -24,7 +24,7 @@ import core.game.world.map.zone.ZoneRestriction; import core.game.world.update.flag.context.Graphics; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -59,7 +59,7 @@ public final class ChaosTunnelZone extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { for (int i = 0; i < ENTRANCE_DATA.length; i++) { diff --git a/Server/src/main/java/core/game/content/zone/WildernessAreaZone.java b/Server/src/main/java/core/game/content/zone/WildernessAreaZone.java index c25fa60d6..03d756796 100644 --- a/Server/src/main/java/core/game/content/zone/WildernessAreaZone.java +++ b/Server/src/main/java/core/game/content/zone/WildernessAreaZone.java @@ -25,7 +25,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import java.util.ArrayList; import java.util.List; @@ -54,7 +54,7 @@ public class WildernessAreaZone extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugins(new MandrithDialoguePlugin(), new PilesDialoguePlugin(), new PilesItemHandler(), new RuniteGolemNPC()); + ClassScanner.definePlugins(new MandrithDialoguePlugin(), new PilesDialoguePlugin(), new PilesItemHandler(), new RuniteGolemNPC()); return this; } diff --git a/Server/src/main/java/core/game/content/zone/neitiznot/NeitiznotZone.java b/Server/src/main/java/core/game/content/zone/neitiznot/NeitiznotZone.java index 577471667..a81a5e473 100644 --- a/Server/src/main/java/core/game/content/zone/neitiznot/NeitiznotZone.java +++ b/Server/src/main/java/core/game/content/zone/neitiznot/NeitiznotZone.java @@ -8,7 +8,7 @@ import core.game.world.map.zone.MapZone; import core.game.world.map.zone.ZoneBuilder; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the neitiznot zone. @@ -27,7 +27,7 @@ public class NeitiznotZone extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugins(new MawnisBurowgarDialogue(), new ThakkradYakDialogue(), new YakArmourPlugin(), new YakArmourPlugin()); + ClassScanner.definePlugins(new MawnisBurowgarDialogue(), new ThakkradYakDialogue(), new YakArmourPlugin(), new YakArmourPlugin()); return this; } diff --git a/Server/src/main/java/core/game/content/zone/phasmatys/GravingasNPC.java b/Server/src/main/java/core/game/content/zone/phasmatys/GravingasNPC.java index cd9960696..21a7ddc96 100644 --- a/Server/src/main/java/core/game/content/zone/phasmatys/GravingasNPC.java +++ b/Server/src/main/java/core/game/content/zone/phasmatys/GravingasNPC.java @@ -5,7 +5,7 @@ import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -50,7 +50,7 @@ public final class GravingasNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new GravingasDialogue()); + ClassScanner.definePlugin(new GravingasDialogue()); return super.newInstance(arg); } diff --git a/Server/src/main/java/core/game/content/zone/phasmatys/PhasmatysZone.java b/Server/src/main/java/core/game/content/zone/phasmatys/PhasmatysZone.java index 8f38faae3..07b0a916b 100644 --- a/Server/src/main/java/core/game/content/zone/phasmatys/PhasmatysZone.java +++ b/Server/src/main/java/core/game/content/zone/phasmatys/PhasmatysZone.java @@ -22,7 +22,7 @@ import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the phasmatyz zone area. @@ -48,13 +48,13 @@ public final class PhasmatysZone extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new GravingasNPC()); - PluginManager.definePlugin(new NecrovarusDialogue()); - PluginManager.definePlugin(new GhostSailorDialogue()); - PluginManager.definePlugin(new EctoplasmFillPlugin()); - PluginManager.definePlugin(new GhostDiscipleDialogue()); - PluginManager.definePlugin(new GhostVillagerDialogue()); - PluginManager.definePlugin(new GhostInkeeperDialogue()); + ClassScanner.definePlugin(new GravingasNPC()); + ClassScanner.definePlugin(new NecrovarusDialogue()); + ClassScanner.definePlugin(new GhostSailorDialogue()); + ClassScanner.definePlugin(new EctoplasmFillPlugin()); + ClassScanner.definePlugin(new GhostDiscipleDialogue()); + ClassScanner.definePlugin(new GhostVillagerDialogue()); + ClassScanner.definePlugin(new GhostInkeeperDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/zone/rellekka/JarvaldDialogue.java b/Server/src/main/java/core/game/content/zone/rellekka/JarvaldDialogue.java index 332cb603a..cc1e040af 100644 --- a/Server/src/main/java/core/game/content/zone/rellekka/JarvaldDialogue.java +++ b/Server/src/main/java/core/game/content/zone/rellekka/JarvaldDialogue.java @@ -5,9 +5,8 @@ import core.game.content.dialogue.DialoguePlugin; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Location; @@ -199,7 +198,10 @@ public final class JarvaldDialogue extends DialoguePlugin { public void sail(final Player player, final boolean to) { player.lock(); player.getInterfaceManager().open(new Component(224)); - player.addExtension(LogoutTask.class, new LocationLogoutTask(5, to ? Location.create(2544, 3759, 0) : Location.create(2620, 3685, 0))); + player.logoutListeners.put("jarvald", player1 -> { + player.setLocation(to ? Location.create(2544, 3759, 0) : Location.create(2620, 3685, 0)); + return Unit.INSTANCE; + }); GameWorld.getPulser().submit(new Pulse(1, player) { int count; @@ -212,6 +214,7 @@ public final class JarvaldDialogue extends DialoguePlugin { player.getProperties().setTeleportLocation(to ? Location.create(2544, 3759, 0) : Location.create(2620, 3685, 0)); player.getDialogueInterpreter().close(); player.getDialogueInterpreter().sendDialogue("The ship arrives at " + (to ? "Waterbirth Island" : "Rellekka") + "."); + player.logoutListeners.remove("jarvald"); return true; } return false; diff --git a/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java b/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java index 9aca35a5c..7b28796ce 100644 --- a/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java +++ b/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java @@ -1,8 +1,6 @@ package core.game.content.zone.rellekka; import core.cache.def.impl.SceneryDefinition; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; import core.plugin.Initializable; import core.game.node.entity.skill.agility.AgilityHandler; @@ -12,7 +10,6 @@ import core.game.component.Component; import core.game.node.Node; import core.game.node.entity.Entity; import core.game.node.entity.impl.ForceMovement; -import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; import core.game.world.map.Location; @@ -21,8 +18,9 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; +import kotlin.Unit; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the rellekka zone. @@ -41,9 +39,9 @@ public final class RellekkaZone extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new JarvaldDialogue()); - PluginManager.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue()); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new JarvaldDialogue()); + ClassScanner.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue()); + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { @@ -115,7 +113,10 @@ public final class RellekkaZone extends MapZone implements Plugin { public static void sail(final Player player, final String name, final Location destination) { player.lock(); player.getInterfaceManager().open(new Component(224)); - player.addExtension(LogoutTask.class, new LocationLogoutTask(5, destination)); + player.logoutListeners.put("rellekka-sail", player1 -> { + player1.setLocation(destination); + return Unit.INSTANCE; + }); GameWorld.getPulser().submit(new Pulse(1, player) { int count; @@ -127,6 +128,7 @@ public final class RellekkaZone extends MapZone implements Plugin { player.getInterfaceManager().close(); player.getProperties().setTeleportLocation(destination); player.getDialogueInterpreter().sendDialogue("The ship arrives at " + name + "."); + player.logoutListeners.remove("rellekka-sail"); return true; } return false; 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 3a20f6b54..0936e51f8 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 @@ -30,7 +30,7 @@ import rs09.game.world.repository.Repository; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the waterbirth dungeon zone. @@ -49,10 +49,10 @@ public final class WaterBirthDungeonZone extends MapZone implements Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new MagicDoorDialogue()); + ClassScanner.definePlugin(new MagicDoorDialogue()); SceneryDefinition.forId(12094).getHandlers().put("option:use", this); SceneryDefinition.forId(12045).getHandlers().put("option:open", this); SceneryDefinition.forId(12047).getHandlers().put("option:open", this); diff --git a/Server/src/main/java/core/game/interaction/inter/OrbViewingInterface.java b/Server/src/main/java/core/game/interaction/inter/OrbViewingInterface.java index 6c2e78715..a6b2670ee 100644 --- a/Server/src/main/java/core/game/interaction/inter/OrbViewingInterface.java +++ b/Server/src/main/java/core/game/interaction/inter/OrbViewingInterface.java @@ -13,7 +13,7 @@ import core.game.system.task.Pulse; import core.game.world.map.Location; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles an orb viewing interface. @@ -54,7 +54,7 @@ public final class OrbViewingInterface extends ComponentPlugin { public Plugin newInstance(Object arg) throws Throwable { ComponentDefinition.put(374, this); ComponentDefinition.put(649, this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(9391).getHandlers().put("option:look-into", this); diff --git a/Server/src/main/java/core/game/interaction/item/DragonfireShieldPlugin.java b/Server/src/main/java/core/game/interaction/item/DragonfireShieldPlugin.java index 35dbe93c1..32ae59fbb 100644 --- a/Server/src/main/java/core/game/interaction/item/DragonfireShieldPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/DragonfireShieldPlugin.java @@ -19,7 +19,7 @@ import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.node.entity.combat.CombatPulse; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import java.util.concurrent.TimeUnit; @@ -37,7 +37,7 @@ public final class DragonfireShieldPlugin extends OptionHandler { ItemDefinition.forId(11283).getHandlers().put("option:operate", this); ItemDefinition.forId(11284).getHandlers().put("option:inspect", this); ItemDefinition.forId(11284).getHandlers().put("option:operate", this); - PluginManager.definePlugin(new DFSItemPlugin()); + ClassScanner.definePlugin(new DFSItemPlugin()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/ExplorersRingPlugin.kt b/Server/src/main/java/core/game/interaction/item/ExplorersRingPlugin.kt index 7f4531c3d..87b49d3eb 100644 --- a/Server/src/main/java/core/game/interaction/item/ExplorersRingPlugin.kt +++ b/Server/src/main/java/core/game/interaction/item/ExplorersRingPlugin.kt @@ -17,8 +17,8 @@ import core.game.world.update.flag.context.Graphics import org.json.simple.JSONObject import org.rs09.consts.Items import rs09.ServerStore -import rs09.ServerStore.getBoolean -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getBoolean +import rs09.ServerStore.Companion.getInt import rs09.game.interaction.InteractionListener /** diff --git a/Server/src/main/java/core/game/interaction/item/FishbowlPlugin.java b/Server/src/main/java/core/game/interaction/item/FishbowlPlugin.java index cba9a7206..2ed06682a 100644 --- a/Server/src/main/java/core/game/interaction/item/FishbowlPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/FishbowlPlugin.java @@ -15,7 +15,7 @@ import core.game.node.item.WeightedChanceItem; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import core.game.content.dialogue.DialogueInterpreter; import core.game.content.dialogue.DialoguePlugin; @@ -55,8 +55,8 @@ public class FishbowlPlugin extends OptionHandler { def.getHandlers().put("option:feed", this); def.getHandlers().put("option:drop", this); } - PluginManager.definePlugin(new FishbowlDialogue()); - PluginManager.definePlugin(new FeedPetFishHandler()); + ClassScanner.definePlugin(new FishbowlDialogue()); + ClassScanner.definePlugin(new FeedPetFishHandler()); new AquariumPlugin().newInstance(arg); return this; } @@ -220,7 +220,7 @@ public class FishbowlPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(10091).getHandlers().put("option:fish-in", this); - PluginManager.definePlugin(new TinyNetHandler()); + ClassScanner.definePlugin(new TinyNetHandler()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/GodBookPlugin.java b/Server/src/main/java/core/game/interaction/item/GodBookPlugin.java index 8f383e3e8..776172cf1 100644 --- a/Server/src/main/java/core/game/interaction/item/GodBookPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/GodBookPlugin.java @@ -1,8 +1,6 @@ package core.game.interaction.item; import core.game.content.dialogue.DialogueAction; -import core.game.content.dialogue.DialogueInterpreter; -import core.game.content.dialogue.DialoguePlugin; import core.game.content.global.GodBook; import core.game.node.entity.skill.Skills; import core.game.interaction.NodeUsageEvent; @@ -13,12 +11,9 @@ import core.game.node.entity.player.Player; import core.game.node.item.GroundItem; import core.game.node.item.Item; import core.game.node.item.ItemPlugin; -import core.game.system.task.Pulse; -import rs09.game.world.GameWorld; -import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the god books. @@ -32,7 +27,7 @@ public class GodBookPlugin extends OptionHandler { for (GodBook book : GodBook.values()) { book.getDamagedBook().getDefinition().getHandlers().put("option:check", this); } - PluginManager.definePlugins(new PageHandler(), new GodBookItem(), new SymbolBlessHandler()); + ClassScanner.definePlugins(new PageHandler(), new GodBookItem(), new SymbolBlessHandler()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/MorphItemPlugin.java b/Server/src/main/java/core/game/interaction/item/MorphItemPlugin.java index 21e865fe3..397faefdc 100644 --- a/Server/src/main/java/core/game/interaction/item/MorphItemPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/MorphItemPlugin.java @@ -10,7 +10,7 @@ import core.game.node.item.Item; import rs09.game.world.GameWorld; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -42,7 +42,7 @@ public class MorphItemPlugin implements Plugin { public Plugin newInstance(Object arg) throws Throwable { ItemDefinition.forId(7927).getHandlers().put("equipment", this); ItemDefinition.forId(6583).getHandlers().put("equipment", this); - PluginManager.definePlugin(new MorphInterfacePlugin()); + ClassScanner.definePlugin(new MorphInterfacePlugin()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/toys/SnowGlobePlugin.java b/Server/src/main/java/core/game/interaction/item/toys/SnowGlobePlugin.java index 92185eccb..d482ea4e5 100644 --- a/Server/src/main/java/core/game/interaction/item/toys/SnowGlobePlugin.java +++ b/Server/src/main/java/core/game/interaction/item/toys/SnowGlobePlugin.java @@ -1,6 +1,5 @@ package core.game.interaction.item.toys; -import core.cache.def.impl.ItemDefinition; import core.game.component.Component; import core.game.component.ComponentDefinition; import core.game.component.ComponentPlugin; @@ -13,7 +12,7 @@ import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; @Initializable public class SnowGlobePlugin extends OptionHandler { @@ -25,7 +24,7 @@ public class SnowGlobePlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new SnowGlobeInterface()); + ClassScanner.definePlugin(new SnowGlobeInterface()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/withitem/DarkBowDyePlugin.java b/Server/src/main/java/core/game/interaction/item/withitem/DarkBowDyePlugin.java index 881f75e7c..05afeb033 100644 --- a/Server/src/main/java/core/game/interaction/item/withitem/DarkBowDyePlugin.java +++ b/Server/src/main/java/core/game/interaction/item/withitem/DarkBowDyePlugin.java @@ -6,7 +6,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The plugin used to dye a dark bow into a more one. @@ -30,7 +30,7 @@ public final class DarkBowDyePlugin extends UseWithHandler { addHandler(14797, ITEM_TYPE, this); addHandler(14799, ITEM_TYPE, this); addHandler(14801, ITEM_TYPE, this); - PluginManager.definePlugin(new DarkBowCleanPlugin()); + ClassScanner.definePlugin(new DarkBowCleanPlugin()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/withitem/GraniteMaulPlugin.java b/Server/src/main/java/core/game/interaction/item/withitem/GraniteMaulPlugin.java index b2cddcb7a..9174ffa24 100644 --- a/Server/src/main/java/core/game/interaction/item/withitem/GraniteMaulPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/withitem/GraniteMaulPlugin.java @@ -10,7 +10,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The plugin used to make the granite maul into the ornamental version. @@ -30,7 +30,7 @@ public final class GraniteMaulPlugin extends UseWithHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new GraniteMaulRevertHandler()); + ClassScanner.definePlugin(new GraniteMaulRevertHandler()); addHandler(14793, ITEM_TYPE, this); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/withitem/LavaScalePlugin.java b/Server/src/main/java/core/game/interaction/item/withitem/LavaScalePlugin.java index e445ef51c..8a521aa73 100644 --- a/Server/src/main/java/core/game/interaction/item/withitem/LavaScalePlugin.java +++ b/Server/src/main/java/core/game/interaction/item/withitem/LavaScalePlugin.java @@ -7,7 +7,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -29,7 +29,7 @@ public final class LavaScalePlugin extends UseWithHandler { @Override public Plugin newInstance(Object arg) throws Throwable { addHandler(233, ITEM_TYPE, this); - PluginManager.definePlugin(new AntifireMakePlugin()); + ClassScanner.definePlugin(new AntifireMakePlugin()); return this; } diff --git a/Server/src/main/java/core/game/interaction/item/withobject/IncubatorPlugin.java b/Server/src/main/java/core/game/interaction/item/withobject/IncubatorPlugin.java index d031d1bff..1b352c2ac 100644 --- a/Server/src/main/java/core/game/interaction/item/withobject/IncubatorPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/withobject/IncubatorPlugin.java @@ -13,7 +13,7 @@ import core.plugin.Initializable; import core.plugin.Plugin; import core.tools.StringUtils; import rs09.game.node.entity.state.newsys.states.IncubatorState; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the incubator. @@ -24,7 +24,7 @@ public class IncubatorPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new IncubatorEggHandler()); + ClassScanner.definePlugin(new IncubatorEggHandler()); SceneryDefinition.forId(28359).getHandlers().put("option:take-egg", this); SceneryDefinition.forId(28359).getHandlers().put("option:inspect", this); return this; diff --git a/Server/src/main/java/core/game/interaction/item/withobject/SmithingPlugin.java b/Server/src/main/java/core/game/interaction/item/withobject/SmithingPlugin.java index f61e9bef6..6b26b7539 100644 --- a/Server/src/main/java/core/game/interaction/item/withobject/SmithingPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/withobject/SmithingPlugin.java @@ -14,7 +14,7 @@ import core.game.node.scenery.Scenery; import core.plugin.Plugin; import core.plugin.Initializable; import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the option handler used for smithing. @@ -46,7 +46,7 @@ public final class SmithingPlugin extends UseWithHandler { addHandler(26817, OBJECT_TYPE, this); addHandler(37622, OBJECT_TYPE, this); addHandler(42027, OBJECT_TYPE, this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java b/Server/src/main/java/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java index ca02c3f2e..b2b175d91 100644 --- a/Server/src/main/java/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java @@ -10,7 +10,7 @@ import rs09.game.world.repository.Repository; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the blessing of Spirit shields. @@ -29,7 +29,7 @@ public class SpiritShieldBlessPlugin extends UseWithHandler { @Override public Plugin newInstance(Object arg) throws Throwable { addHandler(24343, OBJECT_TYPE, this); - PluginManager.definePlugin(new SpiritShieldMakePlugin()); + ClassScanner.definePlugin(new SpiritShieldMakePlugin()); return this; } diff --git a/Server/src/main/java/core/game/interaction/npc/BogrogPlugin.java b/Server/src/main/java/core/game/interaction/npc/BogrogPlugin.java index bc6d8a378..8098e214b 100644 --- a/Server/src/main/java/core/game/interaction/npc/BogrogPlugin.java +++ b/Server/src/main/java/core/game/interaction/npc/BogrogPlugin.java @@ -11,7 +11,7 @@ import core.game.node.Node; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the bogrog npc. @@ -23,7 +23,7 @@ public final class BogrogPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { NPCDefinition.forId(4472).getHandlers().put("option:swap", this); - PluginManager.definePlugin(new BogrogDialogue()); + ClassScanner.definePlugin(new BogrogDialogue()); return this; } diff --git a/Server/src/main/java/core/game/interaction/npc/SecurityGuardPlugin.java b/Server/src/main/java/core/game/interaction/npc/SecurityGuardPlugin.java index 8b8ca8cdf..203b8918b 100644 --- a/Server/src/main/java/core/game/interaction/npc/SecurityGuardPlugin.java +++ b/Server/src/main/java/core/game/interaction/npc/SecurityGuardPlugin.java @@ -8,7 +8,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import org.rs09.consts.Items; @Initializable @@ -16,7 +16,7 @@ public final class SecurityGuardPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new SecurityGuardDialogue()); + ClassScanner.definePlugin(new SecurityGuardDialogue()); return this; } diff --git a/Server/src/main/java/core/game/interaction/npc/ZaffPlugin.kt b/Server/src/main/java/core/game/interaction/npc/ZaffPlugin.kt index 6f61517af..e8cd07f68 100644 --- a/Server/src/main/java/core/game/interaction/npc/ZaffPlugin.kt +++ b/Server/src/main/java/core/game/interaction/npc/ZaffPlugin.kt @@ -21,7 +21,7 @@ import core.game.node.item.Item import org.json.simple.JSONObject import org.rs09.consts.Items import rs09.ServerStore -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getInt import rs09.game.system.SystemLogger /** diff --git a/Server/src/main/java/core/game/interaction/npc/ZahurOptionPlugin.java b/Server/src/main/java/core/game/interaction/npc/ZahurOptionPlugin.java index 499ef0515..161fef10a 100644 --- a/Server/src/main/java/core/game/interaction/npc/ZahurOptionPlugin.java +++ b/Server/src/main/java/core/game/interaction/npc/ZahurOptionPlugin.java @@ -8,7 +8,7 @@ import core.game.interaction.OptionHandler; import core.game.node.Node; import core.game.node.entity.player.Player; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.game.node.entity.skill.herblore.PotionDecantingPlugin; @@ -23,7 +23,7 @@ public class ZahurOptionPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { NPCDefinition.forId(3037).getHandlers().put("option:combine", this); - PluginManager.definePlugin(new ZahurDialoguePlugin()); + ClassScanner.definePlugin(new ZahurDialoguePlugin()); return this; } diff --git a/Server/src/main/java/core/game/interaction/npc/bob/BobRepairItem.java b/Server/src/main/java/core/game/interaction/npc/bob/BobRepairItem.java index 2cfcd22ba..fee2b7184 100644 --- a/Server/src/main/java/core/game/interaction/npc/bob/BobRepairItem.java +++ b/Server/src/main/java/core/game/interaction/npc/bob/BobRepairItem.java @@ -7,7 +7,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the plugin used to handle an item being used on bob. @@ -28,7 +28,7 @@ public final class BobRepairItem extends UseWithHandler { public Plugin newInstance(Object arg) throws Throwable { addHandler(519, NPC_TYPE, this); addHandler(3797, NPC_TYPE, this); - PluginManager.definePlugin(new BobDialogue()); + ClassScanner.definePlugin(new BobDialogue()); return this; } diff --git a/Server/src/main/java/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java b/Server/src/main/java/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java index e927232a0..07db3e059 100644 --- a/Server/src/main/java/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java +++ b/Server/src/main/java/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java @@ -2,17 +2,13 @@ package core.game.interaction.npc.sorceress_app; import core.cache.def.impl.NPCDefinition; import core.cache.def.impl.SceneryDefinition; -import core.game.content.global.action.ClimbActionHandler; import core.game.interaction.OptionHandler; import core.game.node.Node; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; -import core.game.node.scenery.Scenery; -import core.game.world.map.Location; -import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Teleport option for Sorceress Apprentice @@ -39,7 +35,7 @@ public class SorceressApprenticePlugin extends OptionHandler { public Plugin newInstance(Object arg) throws Throwable { NPCDefinition.forId(5532).getHandlers().put("option:teleport", this); SceneryDefinition.forId(21781).getHandlers().put("option:climb-up", this); - PluginManager.definePlugin(new SorceressApprenticeDialogue()); + ClassScanner.definePlugin(new SorceressApprenticeDialogue()); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/CowMilkingPlugin.java b/Server/src/main/java/core/game/interaction/object/CowMilkingPlugin.java index efb6160e6..987438b9e 100644 --- a/Server/src/main/java/core/game/interaction/object/CowMilkingPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/CowMilkingPlugin.java @@ -12,7 +12,7 @@ import core.game.system.task.Pulse; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the plugin used to milk a cow. @@ -83,7 +83,7 @@ public final class CowMilkingPlugin extends OptionHandler { SceneryDefinition.forId(8689).getHandlers().put("option:milk", this); SceneryDefinition.forId(12111).getHandlers().put("option:milk", this); SceneryDefinition.setOptionHandler("steal-cowbell", this); - PluginManager.definePlugin(new BucketHandler()); + ClassScanner.definePlugin(new BucketHandler()); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/CrystalChestPlugin.java b/Server/src/main/java/core/game/interaction/object/CrystalChestPlugin.java index 5684a18b5..45f8904ca 100644 --- a/Server/src/main/java/core/game/interaction/object/CrystalChestPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/CrystalChestPlugin.java @@ -8,7 +8,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -35,7 +35,7 @@ public final class CrystalChestPlugin extends UseWithHandler { @Override public Plugin newInstance(Object arg) throws Throwable { addHandler(172, OBJECT_TYPE, this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/interaction/object/LumbridgeBasementPlugin.java b/Server/src/main/java/core/game/interaction/object/LumbridgeBasementPlugin.java index b1fa523cd..2c9c70bf1 100644 --- a/Server/src/main/java/core/game/interaction/object/LumbridgeBasementPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/LumbridgeBasementPlugin.java @@ -1,14 +1,12 @@ package core.game.interaction.object; import core.cache.def.impl.SceneryDefinition; -import core.game.content.dialogue.DialoguePlugin; import core.game.interaction.NodeUsageEvent; import core.game.interaction.OptionHandler; import core.game.interaction.UseWithHandler; import core.game.node.Node; import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.npc.AbstractNPC; -import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; @@ -19,7 +17,7 @@ import core.game.world.map.Location; import core.game.world.map.path.Pathfinder; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -55,7 +53,7 @@ public class LumbridgeBasementPlugin extends OptionHandler { SceneryDefinition.forId(40849).getHandlers().put("option:jump-down", this); SceneryDefinition.forId(40260).getHandlers().put("option:climb-through", this); SceneryDefinition.forId(41077).getHandlers().put("option:crawl-through", this); - PluginManager.definePlugins(new LightCreatureNPC(), new LightCreatureHandler()); + ClassScanner.definePlugins(new LightCreatureNPC(), new LightCreatureHandler()); SceneryBuilder.add(new Scenery(40260, Location.create(2526, 5828, 2), 2)); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/PyreSitePlugin.java b/Server/src/main/java/core/game/interaction/object/PyreSitePlugin.java index fb1883298..c0d11218b 100644 --- a/Server/src/main/java/core/game/interaction/object/PyreSitePlugin.java +++ b/Server/src/main/java/core/game/interaction/object/PyreSitePlugin.java @@ -24,7 +24,7 @@ import core.plugin.Plugin; import core.tools.RandomFunction; import rs09.game.world.GameWorld; import rs09.game.world.repository.Repository; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import java.util.ArrayList; import java.util.List; @@ -64,7 +64,7 @@ public final class PyreSitePlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(25286).getHandlers().put("option:construct", this); - PluginManager.definePlugin(new FerociousBarbarianNPC()); + ClassScanner.definePlugin(new FerociousBarbarianNPC()); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/SinclairFlourBarrelPlugin.java b/Server/src/main/java/core/game/interaction/object/SinclairFlourBarrelPlugin.java index d272cb9c0..6d16c483d 100644 --- a/Server/src/main/java/core/game/interaction/object/SinclairFlourBarrelPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/SinclairFlourBarrelPlugin.java @@ -12,7 +12,7 @@ import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** @@ -59,7 +59,7 @@ public final class SinclairFlourBarrelPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(26122).getHandlers().put("option:take from", this); - PluginManager.definePlugin(new FlourHandler()); + ClassScanner.definePlugin(new FlourHandler()); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/WildernessLeverPlugin.java b/Server/src/main/java/core/game/interaction/object/WildernessLeverPlugin.java index bb7330025..4ecac6cd5 100644 --- a/Server/src/main/java/core/game/interaction/object/WildernessLeverPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/WildernessLeverPlugin.java @@ -16,7 +16,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles wilderness levers. @@ -38,7 +38,7 @@ public final class WildernessLeverPlugin extends OptionHandler { SceneryDefinition.forId(id).getHandlers().put("option:pull", this); } } - PluginManager.definePlugin(new LeverDialogue()); + ClassScanner.definePlugin(new LeverDialogue()); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/dmc/DMCHandler.java b/Server/src/main/java/core/game/interaction/object/dmc/DMCHandler.java index 90242a3ad..170b5716a 100644 --- a/Server/src/main/java/core/game/interaction/object/dmc/DMCHandler.java +++ b/Server/src/main/java/core/game/interaction/object/dmc/DMCHandler.java @@ -1,5 +1,6 @@ package core.game.interaction.object.dmc; +import api.LogoutListener; import core.game.node.entity.combat.CombatStyle; import core.game.node.entity.combat.ImpactHandler.HitsplatType; import core.game.node.entity.impl.Projectile; @@ -10,7 +11,6 @@ import core.game.node.entity.skill.Skills; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -19,6 +19,7 @@ import core.game.world.map.zone.ZoneRestriction; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.tools.RandomFunction; +import org.jetbrains.annotations.NotNull; import rs09.game.node.entity.combat.CombatSwingHandler; import rs09.game.world.GameWorld; @@ -26,7 +27,7 @@ import rs09.game.world.GameWorld; * Handles a player's Dwarf Multi-cannon. * @author Emperor */ -public final class DMCHandler { +public final class DMCHandler implements LogoutListener { /** * The player. @@ -43,11 +44,6 @@ public final class DMCHandler { */ private int cannonballs; - /** - * The logout plugin. - */ - private Plugin logoutPlugin; - /** * The firing pulse. */ @@ -63,6 +59,10 @@ public final class DMCHandler { */ private Pulse decayPulse; + public DMCHandler() { + this.player = null; + } + /** * Constructs a new {@code DMCHandler} {@code Object} * @param player The player owning the cannon. @@ -219,19 +219,6 @@ public final class DMCHandler { } return true; } - player.addExtension(LogoutTask.class, new LogoutTask() { - int amount = count + 1; - - @Override - public void run(Player player) { - for (int i = 0; i < amount; i++) { - player.getInventory().add(new Item(6 + (i * 2))); - } - if (object != null) { - SceneryBuilder.remove(object); - } - } - }); switch (count) { case 0: object = SceneryBuilder.add(new Scenery(7, spawn)); @@ -265,19 +252,15 @@ public final class DMCHandler { */ public void configure(Scenery cannon) { this.cannon = cannon; - player.removeExtension(LogoutTask.class); - player.getLogoutPlugins().add(logoutPlugin = new Plugin() { - @Override - public Plugin newInstance(Player arg) throws Throwable { - clear(false); - return this; - } + } - @Override - public Object fireEvent(String identifier, Object... args) { - return null; - } - }); + @Override + public void logout(@NotNull Player player) { + if(player.getAttribute("dmc") != null) + { + DMCHandler handler = player.getAttribute("dmc"); + handler.clear(false); + } } /** @@ -290,7 +273,6 @@ public final class DMCHandler { } SceneryBuilder.remove(cannon); player.removeAttribute("dmc"); - player.getLogoutPlugins().remove(logoutPlugin); if (!pickup) { player.getSavedData().getActivityData().setLostCannon(true); return; diff --git a/Server/src/main/java/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java b/Server/src/main/java/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java index 9b7e1c4e6..92ad615cc 100644 --- a/Server/src/main/java/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java @@ -11,7 +11,7 @@ import core.game.node.entity.player.info.Rights; import core.game.node.item.Item; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the Dwarf multi-cannon. @@ -62,7 +62,7 @@ public final class DwarfMultiCannonPlugin extends OptionHandler { } }); - PluginManager.definePlugin(new DMCZone()); + ClassScanner.definePlugin(new DMCZone()); return this; } diff --git a/Server/src/main/java/core/game/interaction/object/sorceress/GardenObjectsPlugin.kt b/Server/src/main/java/core/game/interaction/object/sorceress/GardenObjectsPlugin.kt index b79512f50..aa900ce26 100644 --- a/Server/src/main/java/core/game/interaction/object/sorceress/GardenObjectsPlugin.kt +++ b/Server/src/main/java/core/game/interaction/object/sorceress/GardenObjectsPlugin.kt @@ -1,25 +1,18 @@ package core.game.interaction.`object`.sorceress -import rs09.plugin.PluginManager.definePlugin -import rs09.game.world.GameWorld.Pulser import core.plugin.Initializable -import core.game.interaction.OptionHandler import core.plugin.Plugin -import core.cache.def.impl.SceneryDefinition import core.game.component.Component import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression import core.game.interaction.NodeUsageEvent import core.game.interaction.UseWithHandler -import core.game.node.Node import core.game.node.scenery.Scenery import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.game.node.entity.player.link.quest.Quest import core.game.node.entity.skill.Skills import core.game.node.item.Item -import core.game.system.task.LocationLogoutTask -import core.game.system.task.LogoutTask import core.game.system.task.Pulse import core.game.world.map.Location import core.game.world.update.flag.context.Animation @@ -30,7 +23,7 @@ import core.net.packet.out.MinimapState import core.tools.RandomFunction import rs09.game.interaction.InteractionListener import rs09.game.world.GameWorld -import rs09.plugin.PluginManager +import rs09.plugin.ClassScanner class GardenObjectsPlugin : InteractionListener() { @@ -44,13 +37,13 @@ class GardenObjectsPlugin : InteractionListener() { override fun defineListeners() { SqirkJuicePlugin().newInstance(null) SqirkMakingDialogue().init() - PluginManager.definePlugin(SorceressGardenObject()) + ClassScanner.definePlugin(SorceressGardenObject()) on(SQIRK_TREES, SCENERY, "pick-fruit"){player, node -> val def = SeasonDefinitions.forTreeId(node.id) if (def != null) { player.lock() - player.addExtension(LogoutTask::class.java, LocationLogoutTask(99, def.respawn)) + player.logoutListeners["garden"] = {p -> p.location = def.respawn} player.animate(PICK_FRUIT) player.skills.addExperience(Skills.THIEVING, def.exp, true) player.skills.addExperience(Skills.FARMING, def.farmExp, true) @@ -63,7 +56,7 @@ class GardenObjectsPlugin : InteractionListener() { PacketRepository.send(MinimapState::class.java, MinimapStateContext(player, 2)) } else if (counter == 3) player.properties.teleportLocation = def.respawn else if (counter == 4) { player.unlock() - player.removeExtension(LogoutTask::class.java) + player.logoutListeners.remove("garden") player.packetDispatch.sendMessage("An elemental force emanating from the garden teleports you away.") PacketRepository.send(MinimapState::class.java, MinimapStateContext(player, 0)) player.interfaceManager.close() @@ -137,7 +130,7 @@ class GardenObjectsPlugin : InteractionListener() { */ private fun handleElementalGarden(player: Player, `object`: Scenery, herbDef: HerbDefinition) { player.lock() - player.addExtension(LogoutTask::class.java, LocationLogoutTask(99, herbDef.respawn)) + player.logoutListeners["garden"] = {p -> p.location = herbDef.respawn} player.animate(ANIMATION) player.skills.addExperience(Skills.FARMING, herbDef.exp, true) GameWorld.Pulser.submit(object : Pulse(2, player) { @@ -156,7 +149,7 @@ class GardenObjectsPlugin : InteractionListener() { PacketRepository.send(MinimapState::class.java, MinimapStateContext(player, 0)) player.interfaceManager.close() player.interfaceManager.closeOverlay() - player.removeExtension(LogoutTask::class.java) + player.logoutListeners.remove("garden") player.unlock() return true } diff --git a/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java b/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java index e31f7604f..4160b8c32 100644 --- a/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java @@ -9,7 +9,7 @@ import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the plugin to handle the crossing. @@ -22,7 +22,7 @@ public final class WildernessDitchPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.forId(23271).getHandlers().put("option:cross", this); - PluginManager.definePlugin(new WildernessInterfacePlugin()); + ClassScanner.definePlugin(new WildernessInterfacePlugin()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/npc/Metamorphosis.java b/Server/src/main/java/core/game/node/entity/npc/Metamorphosis.java index 80d0fb3c7..07920a2b8 100644 --- a/Server/src/main/java/core/game/node/entity/npc/Metamorphosis.java +++ b/Server/src/main/java/core/game/node/entity/npc/Metamorphosis.java @@ -9,7 +9,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -45,7 +45,7 @@ public abstract class Metamorphosis extends OptionHandler { NPCDefinition.forId(id).getHandlers().put("option:metamorphosis", this); } if (getDialoguePlugin() != null) { - PluginManager.definePlugin(getDialoguePlugin()); + ClassScanner.definePlugin(getDialoguePlugin()); } return this; } diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/TzRekJadNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/TzRekJadNPC.java index 6222554f6..944211cb1 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/TzRekJadNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/TzRekJadNPC.java @@ -11,7 +11,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import rs09.game.world.repository.Repository; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -46,7 +46,7 @@ public class TzRekJadNPC extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { NPCDefinition.forId(TZHAAR_MEJ_ID).getHandlers().put("option:exchange fire cape", this); - PluginManager.definePlugins(new TzhaarMejJalDialogue(), new TzRekJadDialogue()); + ClassScanner.definePlugins(new TzhaarMejJalDialogue(), new TzRekJadDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java b/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java index 68b5bf4ca..b913fdf70 100644 --- a/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java +++ b/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java @@ -1,5 +1,6 @@ package core.game.node.entity.npc.drop; +import api.StartupListener; import rs09.ServerConstants; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; @@ -17,11 +18,13 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import static rs09.game.system.SystemLogger.logInfo; + /** * Handles the Chaos Elemental's minor drop table. It is supposed to roll this table alongside its standard major drops on the main table. * @author Crash */ -public final class CELEMinorTable { +public final class CELEMinorTable implements StartupListener { /** * The item id of the item representing the C. Ele minor drop table slot in a drop @@ -51,15 +54,14 @@ public final class CELEMinorTable { public CELEMinorTable() throws ParserConfigurationException {} - /** - * Initializes the C. Ele minor table. - */ - public static void init(){ + @Override + public void startup() { if(ServerConstants.CELEDT_DATA_PATH != null && !new File(ServerConstants.CELEDT_DATA_PATH).exists()){ SystemLogger.logErr("Can't locate CELEDT file at " + ServerConstants.CELEDT_DATA_PATH); return; } parse(ServerConstants.CELEDT_DATA_PATH); + logInfo("Loaded up Chaos Elemental drop table from " + ServerConstants.CELEDT_DATA_PATH); } /** diff --git a/Server/src/main/java/core/game/node/entity/npc/drop/RareDropTable.java b/Server/src/main/java/core/game/node/entity/npc/drop/RareDropTable.java index fd2a17557..8649e6443 100644 --- a/Server/src/main/java/core/game/node/entity/npc/drop/RareDropTable.java +++ b/Server/src/main/java/core/game/node/entity/npc/drop/RareDropTable.java @@ -1,5 +1,6 @@ package core.game.node.entity.npc.drop; +import api.StartupListener; import rs09.ServerConstants; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; @@ -17,11 +18,13 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import static rs09.game.system.SystemLogger.logInfo; + /** * Handles the rare drop table. * @author Ceikry */ -public final class RareDropTable { +public final class RareDropTable implements StartupListener { /** * The item id of the item representing the rare drop table slot in a drop @@ -51,15 +54,14 @@ public final class RareDropTable { public RareDropTable() throws ParserConfigurationException {} - /** - * Initializes the rare drop table. - */ - public static void init(){ + @Override + public void startup() { if(ServerConstants.RDT_DATA_PATH != null && !new File(ServerConstants.RDT_DATA_PATH).exists()){ SystemLogger.logErr("Can't locate RDT file at " + ServerConstants.RDT_DATA_PATH); return; } parse(ServerConstants.RDT_DATA_PATH); + logInfo("Initialized Rare Drop Table from " + ServerConstants.RDT_DATA_PATH); } /** diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java index 079d1d662..7a46ba1ec 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java @@ -15,7 +15,7 @@ import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the loading of a cockatrice familiar. @@ -31,12 +31,12 @@ public final class CockatriceFamiliarNPC implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new SpiritCockatrice()); - PluginManager.definePlugin(new SpiritGuthatrice()); - PluginManager.definePlugin(new SpiritZamatrice()); - PluginManager.definePlugin(new SpiritPengatrice()); - PluginManager.definePlugin(new SpiritCoraxatrice()); - PluginManager.definePlugin(new SpiritVulatrice()); + ClassScanner.definePlugin(new SpiritCockatrice()); + ClassScanner.definePlugin(new SpiritGuthatrice()); + ClassScanner.definePlugin(new SpiritZamatrice()); + ClassScanner.definePlugin(new SpiritPengatrice()); + ClassScanner.definePlugin(new SpiritCoraxatrice()); + ClassScanner.definePlugin(new SpiritVulatrice()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/CompostMoundNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/CompostMoundNPC.java index 4de682105..37430d431 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/CompostMoundNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/CompostMoundNPC.java @@ -21,7 +21,7 @@ import core.tools.RandomFunction; import org.rs09.consts.Items; import rs09.game.node.entity.skill.farming.CompostBin; import rs09.game.node.entity.skill.farming.CompostBins; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the Compost Mound familiar. @@ -59,9 +59,9 @@ public class CompostMoundNPC extends Forager { @Override public void configureFamiliar() { - PluginManager.definePlugin(new CompostBucketPlugin()); + ClassScanner.definePlugin(new CompostBucketPlugin()); if (!DialogueInterpreter.contains(getIds()[1])) { - PluginManager.definePlugin(new CompostMoundDialogue()); + ClassScanner.definePlugin(new CompostMoundDialogue()); } } diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/DesertWyrmNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/DesertWyrmNPC.java index 84dd26460..82285a42c 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/DesertWyrmNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/DesertWyrmNPC.java @@ -29,7 +29,7 @@ import core.game.world.map.RegionManager; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the Desert Wyrm familiar. @@ -76,7 +76,7 @@ public final class DesertWyrmNPC extends Forager { @Override public void configureFamiliar() { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { for (int i : getIds()) { diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java index e3ed62b83..ab69357a1 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java @@ -15,7 +15,7 @@ import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.player.FaceLocationFlag; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.firemaking.FireMakingPulse; @@ -64,7 +64,7 @@ public class ForgeRegentNPC extends Familiar { @Override public void configureFamiliar() { - PluginManager.definePlugin(new ForgeRegentFiremake()); + ClassScanner.definePlugin(new ForgeRegentFiremake()); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/MacawNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/MacawNPC.java index 8c54317cb..7823f8640 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/MacawNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/MacawNPC.java @@ -14,7 +14,7 @@ import rs09.game.world.GameWorld; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -59,7 +59,7 @@ public class MacawNPC extends Forager { @Override public Plugin newInstance(Object object) throws Throwable { - PluginManager.definePlugin(new MacawDialogue()); + ClassScanner.definePlugin(new MacawDialogue()); return super.newInstance(object); } diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java index 83b5222af..aebb62c0d 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java @@ -13,7 +13,7 @@ import rs09.game.world.GameWorld; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.plugin.Initializable; import core.tools.RandomFunction; @@ -27,12 +27,12 @@ public final class MinotaurFamiliarNPC implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new BronzeMinotaurNPC()); - PluginManager.definePlugin(new IronMinotaurNPC()); - PluginManager.definePlugin(new SteelMinotaurNPC()); - PluginManager.definePlugin(new MithrilMinotaurNPC()); - PluginManager.definePlugin(new AdamantMinotaurNPC()); - PluginManager.definePlugin(new RuneMinotaurNPC()); + ClassScanner.definePlugin(new BronzeMinotaurNPC()); + ClassScanner.definePlugin(new IronMinotaurNPC()); + ClassScanner.definePlugin(new SteelMinotaurNPC()); + ClassScanner.definePlugin(new MithrilMinotaurNPC()); + ClassScanner.definePlugin(new AdamantMinotaurNPC()); + ClassScanner.definePlugin(new RuneMinotaurNPC()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java index 7f7f12db8..05af17627 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java @@ -25,7 +25,7 @@ import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.game.world.update.flag.player.FaceLocationFlag; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the Pyrelord familiar. @@ -64,7 +64,7 @@ public class PyreLordNPC extends Familiar { @Override public void configureFamiliar() { - PluginManager.definePlugin(new PyreLordFiremake()); + ClassScanner.definePlugin(new PyreLordFiremake()); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/UnicornStallionNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/UnicornStallionNPC.java index 0d6f6a07b..4ee1d7352 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/UnicornStallionNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/UnicornStallionNPC.java @@ -13,7 +13,7 @@ import core.game.node.entity.state.EntityState; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the Unicorn Stallion familiar. @@ -54,7 +54,7 @@ public class UnicornStallionNPC extends Familiar { @Override protected void configureFamiliar() { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java index 90f0000b4..d688e6192 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java @@ -19,7 +19,7 @@ import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The plugin used to load void familiar npcs. @@ -36,10 +36,10 @@ public final class VoidFamiliarNPC implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new VoidRavagerNPC()); - PluginManager.definePlugin(new VoidShifterNPC()); - PluginManager.definePlugin(new VoidSpinnerNPC()); - PluginManager.definePlugin(new VoidTorcherNPC()); + ClassScanner.definePlugin(new VoidRavagerNPC()); + ClassScanner.definePlugin(new VoidShifterNPC()); + ClassScanner.definePlugin(new VoidSpinnerNPC()); + ClassScanner.definePlugin(new VoidTorcherNPC()); return this; } @@ -251,7 +251,7 @@ public final class VoidFamiliarNPC implements Plugin { @Override public void configureFamiliar() { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { 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 c01c15881..96400f4f9 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 @@ -27,7 +27,7 @@ import core.net.packet.out.CameraViewPacket; import core.net.packet.out.MinimapState; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import core.game.content.activity.ActivityPlugin; import core.game.content.activity.CutscenePlugin; @@ -255,10 +255,10 @@ public class BorkNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new BorkCutscene()); - PluginManager.definePlugin(new DagonDialogue()); - PluginManager.definePlugin(new OrkLegion()); - PluginManager.definePlugin(new DagonElite()); + ClassScanner.definePlugin(new BorkCutscene()); + ClassScanner.definePlugin(new DagonDialogue()); + ClassScanner.definePlugin(new OrkLegion()); + ClassScanner.definePlugin(new DagonElite()); return super.newInstance(arg); } 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 d997a58a7..463763a52 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 @@ -22,7 +22,7 @@ import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; import core.plugin.Initializable; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles a gravestone npc. @@ -169,7 +169,7 @@ public class GraveStoneNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new GraveStonePlugin()); + ClassScanner.definePlugin(new GraveStonePlugin()); return super.newInstance(arg); } diff --git a/Server/src/main/java/core/game/node/entity/npc/revenant/CorruptEquipment.java b/Server/src/main/java/core/game/node/entity/npc/revenant/CorruptEquipment.java index 9d6f8f401..eafd74a0b 100644 --- a/Server/src/main/java/core/game/node/entity/npc/revenant/CorruptEquipment.java +++ b/Server/src/main/java/core/game/node/entity/npc/revenant/CorruptEquipment.java @@ -5,7 +5,7 @@ import core.game.node.entity.Entity; import core.game.node.entity.combat.equipment.DegradableEquipment; import core.game.node.entity.player.Player; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the degrading of corrupt equipment. @@ -27,7 +27,7 @@ public class CorruptEquipment extends DegradableEquipment { * Initializes the corrupt equipment degarding. */ public static void init() { - PluginManager.definePlugin(new CorruptEquipment(EquipmentContainer.SLOT_CHEST, new int[] {13958, 13960})); + ClassScanner.definePlugin(new CorruptEquipment(EquipmentContainer.SLOT_CHEST, new int[] {13958, 13960})); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/revenant/PVPEquipment.java b/Server/src/main/java/core/game/node/entity/npc/revenant/PVPEquipment.java index c7f65b5d6..908f82bc0 100644 --- a/Server/src/main/java/core/game/node/entity/npc/revenant/PVPEquipment.java +++ b/Server/src/main/java/core/game/node/entity/npc/revenant/PVPEquipment.java @@ -4,7 +4,7 @@ import core.game.node.entity.Entity; import core.game.node.entity.combat.equipment.DegradableEquipment; import core.game.node.entity.player.Player; import core.game.node.item.Item; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the degrading of PVP armour. @@ -26,7 +26,7 @@ public class PVPEquipment extends DegradableEquipment { * Initializes the PVP equipment degrading. */ public static void init() { - PluginManager.definePlugin(new PVPEquipment(1, null)); + ClassScanner.definePlugin(new PVPEquipment(1, null)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantPlugin.java b/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantPlugin.java index 45948dab7..0e15f2cdd 100644 --- a/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantPlugin.java +++ b/Server/src/main/java/core/game/node/entity/npc/revenant/RevenantPlugin.java @@ -7,7 +7,7 @@ import core.game.node.entity.npc.NPC; import core.game.world.map.Location; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -34,7 +34,7 @@ public class RevenantPlugin implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new RevenantNPC()); + ClassScanner.definePlugin(new RevenantNPC()); //CorruptEquipment.init(); //PVPEquipment.init(); spawn(); 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 d8d27a98b..75dbf765b 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 @@ -46,7 +46,6 @@ import core.game.node.item.GroundItemManager; import core.game.node.item.Item; import core.game.system.communication.CommunicationInfo; import core.game.system.monitor.PlayerMonitor; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; import core.game.world.map.*; import core.game.world.map.build.DynamicRegion; @@ -66,7 +65,6 @@ import core.net.packet.context.SkillContext; import core.net.packet.out.BuildDynamicScene; import core.net.packet.out.SkillLevel; import core.net.packet.out.UpdateSceneGraph; -import core.plugin.Plugin; import core.tools.RandomFunction; import core.tools.StringUtils; import kotlin.Unit; @@ -345,10 +343,6 @@ public class Player extends Entity { * Brawling Gloves manager */ private final BrawlingGlovesManager brawlingGlovesManager = new BrawlingGlovesManager(this); - /** - * The logout plugins. - */ - private List> logoutPlugins; /** * The boolean for the player playing. @@ -424,21 +418,9 @@ public class Player extends Entity { if (force) { Repository.getDisconnectionQueue().remove(getName()); } + GameWorld.getLogoutListeners().forEach((it) -> it.logout(this)); setPlaying(false); getWalkingQueue().reset(); - LogoutTask task = getExtension(LogoutTask.class); - if (task != null) { - task.fire(this); - } - if (logoutPlugins != null && !logoutPlugins.isEmpty()) { - logoutPlugins.stream().filter(Objects::nonNull).forEach(plugin -> { - try { - plugin.newInstance(this); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - }); - } if(!logoutListeners.isEmpty()){ logoutListeners.forEach((key,method) -> method.invoke(this)); } @@ -1329,25 +1311,6 @@ public class Player extends Entity { return audioManager; } - /** - * Gets the logoutPlugins. - * @return the logoutPlugins - */ - public List> getLogoutPlugins() { - if (logoutPlugins == null) { - logoutPlugins = new ArrayList<>(20); - } - return logoutPlugins; - } - - /** - * Sets the balogoutPlugins. - * @param logoutPlugins the logoutPlugins to set. - */ - public void setLogoutPlugins(List> logoutPlugins) { - this.logoutPlugins = logoutPlugins; - } - /** * Gets the bankPinManager. * @return the bankPinManager diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java b/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java index a0c5e8618..0b684e126 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java @@ -7,9 +7,8 @@ import core.game.interaction.MovementPulse; import core.game.node.entity.combat.ImpactHandler.HitsplatType; import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.player.Player; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -138,6 +137,10 @@ public final class AgilityHandler { * @return The force movement instance, if force movement is used. */ public static ForceMovement forceWalk(final Player player, final int courseIndex, Location start, Location end, Animation animation, int speed, final double experience, final String message) { + player.logoutListeners.put("forcewalk", p -> { + p.setLocation(player.getLocation().transform(0,0,0)); + return Unit.INSTANCE; + }); ForceMovement movement = new ForceMovement(player, start, end, animation, speed) { @Override public void stop() { @@ -149,6 +152,7 @@ public final class AgilityHandler { player.getSkills().addExperience(Skills.AGILITY, experience, true); } setObstacleFlag(player, courseIndex); + player.logoutListeners.remove("forcewalk"); } }; movement.start(); @@ -167,6 +171,10 @@ public final class AgilityHandler { * @return The force movement instance, if force movement is used. */ public static ForceMovement forceWalk(final Player player, final int courseIndex, Location start, Location end, Animation animation, int speed, final double experience, final String message, int delay) { + player.logoutListeners.put("forcewalk", p -> { + p.setLocation(player.getLocation().transform(0,0,0)); + return Unit.INSTANCE; + }); if (delay < 1) { return forceWalk(player, courseIndex, start, end, animation, speed, experience, message); } @@ -181,6 +189,7 @@ public final class AgilityHandler { player.getSkills().addExperience(Skills.AGILITY, experience, true); } setObstacleFlag(player, courseIndex); + player.logoutListeners.remove("forcewalk"); } }; GameWorld.getPulser().submit(new Pulse(delay, player) { @@ -264,10 +273,10 @@ public final class AgilityHandler { int ticks = player.getWalkingQueue().getQueue().size(); player.getImpactHandler().setDisabledTicks(ticks); player.lock(1 + ticks); - LogoutTask task = player.getExtension(LogoutTask.class); - if (task == null || !(task instanceof LocationLogoutTask) || !((LocationLogoutTask) task).isValid()) { - player.addExtension(LogoutTask.class, new LocationLogoutTask(1 + ticks, start)); - } + player.logoutListeners.put("agility", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); if (animation != null) { player.getAppearance().setAnimations(animation); } @@ -286,6 +295,7 @@ public final class AgilityHandler { player.getSkills().addExperience(Skills.AGILITY, experience, true); } setObstacleFlag(player, courseIndex); + player.logoutListeners.remove("agility"); return true; } }); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java index 02d6e6ca8..8538dc372 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java @@ -3,10 +3,9 @@ package core.game.node.entity.skill.agility.brimhaven; import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.MovementHook; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -26,7 +25,13 @@ public final class BladeTrap implements MovementHook { final Player player = (Player) e; final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); e.lock(5); - e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + if(e.isPlayer()) + { + e.asPlayer().logoutListeners.put("blade-trap", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); + } GameWorld.getPulser().submit(new Pulse(2, e) { @Override public boolean pulse() { @@ -39,6 +44,7 @@ public final class BladeTrap implements MovementHook { } Location loc = player.getLocation(); AgilityHandler.failWalk(player, 1, loc, loc.transform(direction), loc.transform(direction), Animation.create(846), 10, 3, "You were hit by the saw blade!").setDirection(d); + player.logoutListeners.remove("blade-trap"); return true; } }); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java index 138941e50..aa494a60e 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java @@ -9,9 +9,8 @@ import core.game.node.Node; import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -123,7 +122,10 @@ public final class BrimhavenCourse extends OptionHandler { player.getAppearance().setAnimations(Animation.create(1118 + m)); player.getAppearance().sync(); AgilityHandler.climb(player, -1, new Animation(1117 + m), start.transform(dir), 0.0, null); - player.addExtension(LogoutTask.class, new LocationLogoutTask(22, start)); + player.logoutListeners.put("brimcourse", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); GameWorld.getPulser().submit(new Pulse(3, player) { Location last = start.transform(dir); int count; @@ -134,17 +136,18 @@ public final class BrimhavenCourse extends OptionHandler { if (AgilityHandler.hasFailed(player, 1, 0.15)) { player.getAppearance().setAnimations(); player.getAppearance().sync(); - LogoutTask task = player.getExtension(LogoutTask.class); - task.setDelay(2); AgilityHandler.fail(player, 2, last.transform(0, 0, -3), Animation.create(1119 + m), getHitAmount(player), "You missed a hand hold!"); + player.logoutListeners.remove("brimcourse"); return true; } } else if (count == 6) { player.getAppearance().setAnimations(); player.getAppearance().sync(); AgilityHandler.forceWalk(player, -1, last, last.transform(dir), Animation.create(1120 + m), 5, getExp(player, 22.0), null).setDirection(faceDirection); + player.logoutListeners.remove("brimcourse"); return true; } + player.logoutListeners.remove("brimcourse"); AgilityHandler.forceWalk(player, -1, last, last = last.transform(dir), Animation.create(1118 + m), 5, 0.0, null).setDirection(faceDirection); return false; } @@ -186,7 +189,10 @@ public final class BrimhavenCourse extends OptionHandler { player.getAppearance().setAnimations(Animation.create(745)); final Location start = player.getLocation(); ForceMovement.run(player, start.transform(dir), start.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(742), Animation.create(744)); - player.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + player.logoutListeners.put("brimcourse", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); GameWorld.getPulser().submit(new Pulse(2, player) { boolean failed; int count; @@ -201,14 +207,15 @@ public final class BrimhavenCourse extends OptionHandler { } setDelay(7); AgilityHandler.walk(player, -1, player.getLocation().transform(dir), player.getLocation().transform(dir.getStepX() * 7, dir.getStepY() * 7, 0), Animation.create(662), 0.0, null); - player.addExtension(LogoutTask.class, new LocationLogoutTask(9, start)); } else if (count == 2) { if (failed) { player.getAppearance().setAnimations(); player.getAppearance().sync(); AgilityHandler.fail(player, 2, player.getLocation().transform(0, 0, -3), Animation.create(768), getHitAmount(player), "You missed a hand hold!"); + player.logoutListeners.remove("brimcourse"); return true; } + player.logoutListeners.remove("brimcourse"); AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(dir), Animation.create(743), 10, getExp(player, 14.0), null); return true; } @@ -273,7 +280,6 @@ public final class BrimhavenCourse extends OptionHandler { return true; } }); - player.addExtension(LogoutTask.class, new LocationLogoutTask(8, start)); return; } AgilityHandler.walk(player, -1, start, end, ForceMovement.WALK_ANIMATION, getExp(player, 6.0), null); @@ -288,7 +294,10 @@ public final class BrimhavenCourse extends OptionHandler { final Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); AgilityHandler.forceWalk(player, -1, player.getLocation(), object.getLocation(), Animation.create(741), 10, 0, null); final Location start = player.getLocation(); - player.addExtension(LogoutTask.class, new LocationLogoutTask(12, start)); + player.logoutListeners.put("brimcourse", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); player.lock(12); GameWorld.getPulser().submit(new Pulse(2, player) { int count = 0; @@ -300,9 +309,11 @@ public final class BrimhavenCourse extends OptionHandler { player.unlock(); player.lock(2); AgilityHandler.fail(player, 2, player.getLocation().transform(d.getStepX() << 1, d.getStepY() << 1, -3), Animation.create(764), getHitAmount(player), "You lost your balance!"); + player.logoutListeners.remove("brimcourse"); return true; } AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(dir), Animation.create(741), 10, count == 5 ? getExp(player, 18.0) : 0, null); + player.logoutListeners.remove("brimcourse"); return ++count == 6; } }); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/DartTrap.java b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/DartTrap.java index 9c92be1b4..c43486691 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/DartTrap.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/DartTrap.java @@ -5,10 +5,9 @@ import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.Entity; import core.game.node.entity.impl.Projectile; import core.game.node.entity.player.Player; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.MovementHook; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -31,7 +30,13 @@ public final class DartTrap implements MovementHook { final Player player = (Player) e; final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); e.lock(6); - e.addExtension(LogoutTask.class, new LocationLogoutTask(13, start)); + if(e.isPlayer()) + { + e.asPlayer().logoutListeners.put("dart-trap", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); + } final Location startProj = l.transform(dir.getStepX() * 5, dir.getStepY() * 5, 0); GameWorld.getPulser().submit(new Pulse(2, e) { boolean failed; @@ -77,12 +82,14 @@ public final class DartTrap implements MovementHook { if (failed) { player.getPacketDispatch().sendMessage("You were hit by some darts, something on them makes you feel dizzy!"); player.getSkills().updateLevel(Skills.AGILITY, -(2 + RandomFunction.randomize(2)), 0); + player.logoutListeners.remove("dart-trap"); return true; } setDelay(2); AgilityHandler.walk(player, -1, l, l.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), null, 30.0, null); } else if (count == 4) { PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + player.logoutListeners.remove("dart-trap"); return true; } return false; diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java index 3fa6da42b..2ff48a454 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java @@ -4,10 +4,9 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.MovementHook; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -26,7 +25,13 @@ public final class FloorSpikes implements MovementHook { final Player player = (Player) e; final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); e.lock(5); - e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + if(e.isPlayer()) + { + ((Player) e).logoutListeners.put("floor-spikes", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); + } GameWorld.getPulser().submit(new Pulse(3, e) { @Override public boolean pulse() { @@ -44,6 +49,7 @@ public final class FloorSpikes implements MovementHook { } else { AgilityHandler.forceWalk(player, -1, l, l.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(1115), 20, 26, null); } + player.logoutListeners.remove("floor-spikes"); return true; } }); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/PressurePad.java b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/PressurePad.java index 239878227..824903bbf 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/PressurePad.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/PressurePad.java @@ -4,10 +4,9 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.MovementHook; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -26,7 +25,13 @@ public final class PressurePad implements MovementHook { final Player player = (Player) e; final Location start = dest.transform(-dir.getStepX(), -dir.getStepY(), 0); e.lock(5); - e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + if(e.isPlayer()) + { + ((Player) e).logoutListeners.put("pressure-pad", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); + } GameWorld.getPulser().submit(new Pulse(3, e) { @Override public boolean pulse() { @@ -44,6 +49,7 @@ public final class PressurePad implements MovementHook { } else { AgilityHandler.forceWalk(player, -1, dest, dest.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(1115), 20, 26, null); } + player.logoutListeners.remove("pressure-pad"); return true; } }); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java index 673a3dfd7..be3650749 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java @@ -4,10 +4,9 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.MovementHook; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -26,7 +25,13 @@ public final class SpinningBlades implements MovementHook { final Player player = (Player) e; final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); e.lock(5); - e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + if(e.isPlayer()) + { + ((Player) e).logoutListeners.put("spin-blades", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); + } GameWorld.getPulser().submit(new Pulse(3, e) { @Override public boolean pulse() { @@ -43,6 +48,7 @@ public final class SpinningBlades implements MovementHook { } else { AgilityHandler.forceWalk(player, -1, l, l.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(1115), 20, 26, null); } + player.logoutListeners.remove("spin-blades"); return true; } }); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java b/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java index 9dbf026c7..b61dc532d 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java @@ -17,7 +17,7 @@ import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the agility pryamid course. @@ -93,8 +93,8 @@ public final class AgilityPyramidCourse extends AgilityCourse { SceneryDefinition.forId(10858).getHandlers().put("option:climb-down", this); SceneryDefinition.forId(10865).getHandlers().put("option:climb-over", this); RollingBlock.BlockSets.values(); - PluginManager.definePlugin(new MovingBlockNPC()); - PluginManager.definePlugin(new AgilityPyramidZone()); + ClassScanner.definePlugin(new MovingBlockNPC()); + ClassScanner.definePlugin(new AgilityPyramidZone()); } @Override diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/RollingBlock.java b/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/RollingBlock.java index 82960b3da..20e1262fe 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/RollingBlock.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/pyramid/RollingBlock.java @@ -4,10 +4,9 @@ import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.Entity; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.MovementHook; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -30,7 +29,13 @@ public final class RollingBlock implements MovementHook { final boolean fail = backwards || AgilityHandler.hasFailed(player, 2, 0.3); player.lock(5); AgilityPyramidCourse.addConfig(player, stone, 1, false); - e.addExtension(LogoutTask.class, new LocationLogoutTask(5, player.getLocation())); + if(e.isPlayer()) + { + ((Player) e).logoutListeners.put("rolling-block", p -> { + p.setLocation(e.getLocation().transform(0,0,0)); + return Unit.INSTANCE; + }); + } if (fail) { GameWorld.getPulser().submit(new Pulse(1, player) { int counter; @@ -49,6 +54,7 @@ public final class RollingBlock implements MovementHook { break; case 3: AgilityPyramidCourse.addConfig(player, stone, 0, true); + player.logoutListeners.remove("rolling-block"); return true; } return false; diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java b/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java index b1a1014db..aa90b416c 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java @@ -7,9 +7,8 @@ import core.game.node.Node; import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; -import core.game.system.task.LocationLogoutTask; -import core.game.system.task.LogoutTask; import core.game.system.task.Pulse; +import kotlin.Unit; import rs09.game.world.GameWorld; import core.game.world.map.Direction; import core.game.world.map.Location; @@ -74,7 +73,10 @@ public class MonkeyBarShortcut extends AgilityShortcut { final Location start = player.getLocation(); final Direction dir = direct; ForceMovement.run(player, start.transform(dir), start.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(742), Animation.create(744)); - player.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + player.logoutListeners.put("monkey-bar", p -> { + p.setLocation(start); + return Unit.INSTANCE; + }); GameWorld.getPulser().submit(new Pulse(2, player) { int count; boolean failed; @@ -89,15 +91,16 @@ public class MonkeyBarShortcut extends AgilityShortcut { } setDelay(4); AgilityHandler.walk(player, -1, player.getLocation().transform(dir), player.getLocation().transform(dir.getStepX() * 4, dir.getStepY() * 4, 0), Animation.create(662), 0.0, null); - player.addExtension(LogoutTask.class, new LocationLogoutTask(7, start)); } else if (count == 2) { if (failed) { player.getAppearance().setAnimations(); player.getAppearance().sync(); AgilityHandler.fail(player, 2, new Location(2599, 9564, 0), Animation.create(768), RandomFunction.random(1, 3), null); + player.logoutListeners.remove("monkey-bar"); return true; } AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(dir), Animation.create(743), 10, getExperience(), null); + player.logoutListeners.remove("monkey-bar"); return true; } return false; diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/BuildOptionPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/BuildOptionPlugin.java index 63cf6aed3..370a5db96 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/BuildOptionPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/BuildOptionPlugin.java @@ -13,7 +13,7 @@ import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.node.entity.skill.construction.Hotspot; import rs09.game.system.SystemLogger; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * The build option handling plugin. @@ -27,7 +27,7 @@ public final class BuildOptionPlugin extends OptionHandler { public Plugin newInstance(Object arg) throws Throwable { SceneryDefinition.setOptionHandler("build", this); SceneryDefinition.setOptionHandler("remove", this); - PluginManager.definePlugin(new RemoveDialogue()); + ClassScanner.definePlugin(new RemoveDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/PortalOptionPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/PortalOptionPlugin.java index 02cb759ab..d4b7c5ad5 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/PortalOptionPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/PortalOptionPlugin.java @@ -15,7 +15,7 @@ import core.plugin.PluginManifest; import core.plugin.PluginType; import kotlin.Unit; import rs09.game.world.repository.Repository; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the house portal options. @@ -32,7 +32,7 @@ public final class PortalOptionPlugin extends OptionHandler { } SceneryDefinition.forId(13405).getHandlers().put("option:lock", this); SceneryDefinition.forId(13405).getHandlers().put("option:enter", this); - PluginManager.definePlugin(new PortalDialogue()); + ClassScanner.definePlugin(new PortalDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java index d204bdcbc..c6c3a7931 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java @@ -19,7 +19,7 @@ import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.node.entity.skill.construction.Hotspot; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles construction staircases. @@ -31,8 +31,8 @@ public final class StaircasePlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new BuildDialogue()); - PluginManager.definePlugin(new ClimbPohLadder()); + ClassScanner.definePlugin(new BuildDialogue()); + ClassScanner.definePlugin(new ClimbPohLadder()); for (int i = 13497; i < 13507; i++) { SceneryDefinition.forId(i).getHandlers().put("option:climb", this); SceneryDefinition.forId(i).getHandlers().put("option:climb-up", this); diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java index 2d8b3f44e..6387a3669 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java @@ -9,7 +9,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the interactions for the three Larders. @@ -20,7 +20,7 @@ public final class LarderPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new LarderDialogue()); + ClassScanner.definePlugin(new LarderDialogue()); SceneryDefinition.forId(13565).getHandlers().put("option:search", this); SceneryDefinition.forId(13566).getHandlers().put("option:search", this); SceneryDefinition.forId(13567).getHandlers().put("option:search", this); diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java index 604deec36..dd8dbf06b 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java @@ -9,7 +9,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the shelves in the kitchen room. @@ -20,7 +20,7 @@ public final class ShelfPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new ShelfDialogue()); + ClassScanner.definePlugin(new ShelfDialogue()); for (int i = 13545; i < 13552; i++) { SceneryDefinition.forId(i).getHandlers().put("option:search", this); } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java index ddc1d3f2d..64187f05c 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java @@ -15,7 +15,7 @@ import core.game.world.map.Location; import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.node.entity.skill.construction.Hotspot; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * PortalChamberPlugin @@ -112,7 +112,7 @@ public class PortalChamberPlugin extends OptionHandler { for (int i = 13615; i <= 13635; i++) { SceneryDefinition.forId(i).getHandlers().put("option:enter", this); } - PluginManager.definePlugin(new DirectPortalDialogue()); + ClassScanner.definePlugin(new DirectPortalDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java index c75439dcf..4d8f4311f 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java @@ -15,7 +15,7 @@ import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the clockmakers bench in the workshop @@ -77,7 +77,7 @@ public class ClockmakersBenchPlugin extends OptionHandler { SceneryDefinition.forId(13710).getHandlers().put("option:craft", this); SceneryDefinition.forId(13711).getHandlers().put("option:craft", this); SceneryDefinition.forId(13712).getHandlers().put("option:craft", this); - PluginManager.definePlugin(new ClockmakerBenchDialogue()); + ClassScanner.definePlugin(new ClockmakerBenchDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java index e12b7f104..883e945ad 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java @@ -12,7 +12,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import java.util.ArrayList; import java.util.List; @@ -80,7 +80,7 @@ public class ToolsPlugin extends OptionHandler { for (ToolStore t : ToolStore.values()) { SceneryDefinition.forId(t.objectId).getHandlers().put("option:search", this); } - PluginManager.definePlugin(new ToolDialogue()); + ClassScanner.definePlugin(new ToolDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java b/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java index 84a2a3995..c7f96e64a 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java @@ -5,7 +5,7 @@ import core.game.interaction.NodeUsageEvent; import core.game.interaction.UseWithHandler; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles interaction with the house servant. @@ -39,7 +39,7 @@ public class HouseServantPlugin extends UseWithHandler { addHandler(4239, NPC_TYPE, this); addHandler(4241, NPC_TYPE, this); addHandler(4243, NPC_TYPE, this); - PluginManager.definePlugin(new HouseServantDialogue()); + ClassScanner.definePlugin(new HouseServantDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java b/Server/src/main/java/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java index af1ea2c16..311074b87 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java @@ -17,7 +17,7 @@ import core.game.node.item.Item; import core.game.world.map.Location; import core.game.world.map.zone.ZoneBorders; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents the activity used during falconry practice. @@ -99,7 +99,7 @@ public final class FalconryActivityPlugin extends ActivityPlugin { @Override public void register() { - PluginManager.definePlugin(new FalconryPlugin()); + ClassScanner.definePlugin(new FalconryPlugin()); } /** @@ -130,7 +130,7 @@ public final class FalconryActivityPlugin extends ActivityPlugin { for (FalconCatch falconCatch : FalconCatch.values()) { NPCDefinition.forId(falconCatch.getNpc()).getHandlers().put("option:catch", this); } - PluginManager.definePlugin(new Plugin() { + ClassScanner.definePlugin(new Plugin() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java b/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java index 1bcc4e555..861f3c83c 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java @@ -21,7 +21,7 @@ import core.game.node.scenery.Scenery; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import java.util.ArrayList; import java.util.List; @@ -69,11 +69,11 @@ public final class HunterPlugin extends OptionHandler { SceneryDefinition.forId(trap.getFailed()).getHandlers().put("option:investigate", this); SceneryDefinition.forId(trap.getNet()).getHandlers().put("option:investigate", this); } - PluginManager.definePlugin(new HunterNPC()); - PluginManager.definePlugin(new HunterNetPlugin()); - PluginManager.definePlugin(new HunterItemPlugin()); - PluginManager.definePlugin(new FalconryActivityPlugin()); - PluginManager.definePlugin(new HuntingItemUseWithHandler()); + ClassScanner.definePlugin(new HunterNPC()); + ClassScanner.definePlugin(new HunterNetPlugin()); + ClassScanner.definePlugin(new HunterItemPlugin()); + ClassScanner.definePlugin(new FalconryActivityPlugin()); + ClassScanner.definePlugin(new HuntingItemUseWithHandler()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/ImpBoxPlugin.java b/Server/src/main/java/core/game/node/entity/skill/hunter/ImpBoxPlugin.java index cc737d922..7c0d6b706 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/ImpBoxPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/ImpBoxPlugin.java @@ -16,7 +16,7 @@ import core.net.packet.PacketRepository; import core.net.packet.context.ContainerContext; import core.net.packet.out.ContainerPacket; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -33,12 +33,12 @@ public class ImpBoxPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new ImpInterfaceHandler(null)); + ClassScanner.definePlugin(new ImpInterfaceHandler(null)); for (int id : IDS) { ItemDefinition.forId(id).getHandlers().put("option:bank", this); ItemDefinition.forId(id).getHandlers().put("option:talk-to", this); } - PluginManager.definePlugin(new ImpBoxDialogue()); + ClassScanner.definePlugin(new ImpBoxDialogue()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/ImpetuousImpulses.java b/Server/src/main/java/core/game/node/entity/skill/hunter/ImpetuousImpulses.java index 782aa991d..97846c304 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/ImpetuousImpulses.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/ImpetuousImpulses.java @@ -1,9 +1,9 @@ package core.game.node.entity.skill.hunter; +import api.StartupListener; import core.game.node.entity.skill.hunter.bnet.BNetTypes; import core.game.node.entity.skill.hunter.bnet.ImplingNode; import rs09.game.world.GameWorld; -import core.game.world.callback.CallBack; import core.game.world.map.Location; import core.tools.RandomFunction; @@ -14,7 +14,7 @@ import java.util.Random; * @author Vexia * @author Emperor */ -public final class ImpetuousImpulses implements CallBack { +public final class ImpetuousImpulses implements StartupListener { /** * The random instance used. @@ -145,9 +145,8 @@ public final class ImpetuousImpulses implements CallBack { } @Override - public boolean call() { + public void startup() { spawnImps(); - return true; } } diff --git a/Server/src/main/java/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java b/Server/src/main/java/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java index 72e1a4d43..03a0f46ee 100644 --- a/Server/src/main/java/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java @@ -22,7 +22,7 @@ import core.plugin.Plugin; import rs09.game.content.global.travel.EssenceTeleport; import rs09.game.node.entity.skill.runecrafting.RunePouchPlugin; import rs09.game.world.GameWorld; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles runecraftign related options. @@ -34,11 +34,11 @@ public class RunecraftingPlugin extends OptionHandler { @Override public Plugin newInstance(Object arg) throws Throwable { addNodes(); - PluginManager.definePlugin(new TiaraPlugin()); - PluginManager.definePlugin(new RunePouchPlugin()); - PluginManager.definePlugin(new EnchantTiaraPlugin()); - PluginManager.definePlugin(new MysteriousRuinPlugin()); - PluginManager.definePlugin(new CombinationRunePlugin()); + ClassScanner.definePlugin(new TiaraPlugin()); + ClassScanner.definePlugin(new RunePouchPlugin()); + ClassScanner.definePlugin(new EnchantTiaraPlugin()); + ClassScanner.definePlugin(new MysteriousRuinPlugin()); + ClassScanner.definePlugin(new CombinationRunePlugin()); SceneryDefinition.forId(2492).getHandlers().put("option:use", this); NPCDefinition.forId(553).getHandlers().put("option:teleport", this); NPCDefinition.forId(2328).getHandlers().put("option:teleport", this); diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/GargoyleNPC.java b/Server/src/main/java/core/game/node/entity/skill/slayer/GargoyleNPC.java index 48ccca94a..9b52a6420 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/GargoyleNPC.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/GargoyleNPC.java @@ -11,7 +11,7 @@ import core.game.world.map.Location; import core.plugin.Initializable; import core.plugin.Plugin; import org.rs09.consts.Items; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the gargoyle npc. @@ -65,7 +65,7 @@ public final class GargoyleNPC extends AbstractNPC { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new RockHammerHandler()); + ClassScanner.definePlugin(new RockHammerHandler()); return super.newInstance(arg); } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/RockSlugPlugin.java b/Server/src/main/java/core/game/node/entity/skill/slayer/RockSlugPlugin.java index 8cf5a5c68..ea2e5d005 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/RockSlugPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/RockSlugPlugin.java @@ -12,7 +12,7 @@ import core.game.world.map.Location; import core.game.world.map.path.Pathfinder; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the interactions of a rock slug. @@ -33,8 +33,8 @@ public final class RockSlugPlugin implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new RockSlugNPC()); - PluginManager.definePlugin(new SaltBagHandler()); + ClassScanner.definePlugin(new RockSlugNPC()); + ClassScanner.definePlugin(new SaltBagHandler()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java index 4f341fa46..f8f1f52e3 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java @@ -14,7 +14,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the slayer reward interface plugin. @@ -44,7 +44,7 @@ public class SlayerRewardPlugin extends ComponentPlugin { ComponentDefinition.forId(161).setPlugin(this);//assignment ComponentDefinition.forId(163).setPlugin(this);//learn ComponentDefinition.forId(164).setPlugin(this);//buy - PluginManager.definePlugins(new SlayerMasterPlugin(), new SlayerHelmCraftPlugin()); + ClassScanner.definePlugins(new SlayerMasterPlugin(), new SlayerHelmCraftPlugin()); return this; } @@ -345,7 +345,7 @@ public class SlayerRewardPlugin extends ComponentPlugin { @Override public Plugin newInstance(Object arg) throws Throwable { addHandler(SPINY_HELMET.getId(), ITEM_TYPE, this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java index d0b7923d9..5f8c4f0f5 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java @@ -28,7 +28,7 @@ import core.net.packet.PacketRepository; import core.net.packet.context.MinimapStateContext; import core.net.packet.out.MinimapState; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; /** @@ -58,7 +58,7 @@ public final class AncientCavern extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java index 83b7344bd..edeea29ac 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java @@ -18,7 +18,7 @@ import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import java.util.HashMap; @@ -46,7 +46,7 @@ public final class LumbridgeDungeon extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new WallBeastNPC()); + ClassScanner.definePlugin(new WallBeastNPC()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java index a0cdaa078..f7f020282 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java @@ -16,7 +16,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.plugin.Initializable; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; import core.tools.RandomFunction; import java.util.ArrayList; @@ -71,7 +71,7 @@ public final class SmokeDungeon extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { - PluginManager.definePlugin(new OptionHandler() { + ClassScanner.definePlugin(new OptionHandler() { @Override public Plugin newInstance(Object arg) throws Throwable { diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java b/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java index 2d76cc417..dc17f2099 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java @@ -8,11 +8,10 @@ import core.game.component.ComponentPlugin; import core.game.interaction.NodeUsageEvent; import core.game.interaction.UseWithHandler; import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.RunScript; import core.plugin.Initializable; import core.plugin.Plugin; import kotlin.Unit; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Represents a component plugin used to handle the summoning creation of a @@ -26,7 +25,7 @@ public final class SummoningCreationPlugin extends ComponentPlugin { public Plugin newInstance(Object arg) throws Throwable { ComponentDefinition.put(669, this); ComponentDefinition.put(673, this); - PluginManager.definePlugin(new ObeliskHandler()); + ClassScanner.definePlugin(new ObeliskHandler()); return this; } diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java b/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java index ec155c05c..672465efa 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java @@ -31,7 +31,7 @@ import core.net.packet.context.MinimapStateContext; import core.net.packet.out.CameraViewPacket; import core.net.packet.out.MinimapState; import core.plugin.Plugin; -import rs09.plugin.PluginManager; +import rs09.plugin.ClassScanner; /** * Handles the summoning training room. @@ -235,7 +235,7 @@ public final class SummoningTrainingRoom extends OptionHandler { @Override public void register() { - PluginManager.definePlugin(new FluffyDialogue()); + ClassScanner.definePlugin(new FluffyDialogue()); } /** diff --git a/Server/src/main/java/core/game/system/SystemTermination.java b/Server/src/main/java/core/game/system/SystemTermination.java index 2d7194599..29a564bb6 100644 --- a/Server/src/main/java/core/game/system/SystemTermination.java +++ b/Server/src/main/java/core/game/system/SystemTermination.java @@ -1,5 +1,6 @@ package core.game.system; +import api.ShutdownListener; import core.game.ge.GrandExchangeDatabase; import core.game.interaction.object.dmc.DMCHandler; import core.game.node.entity.player.Player; @@ -9,6 +10,7 @@ import rs09.ServerConstants; import rs09.ServerStore; import rs09.game.content.global.GlobalKillCounter; import rs09.game.system.SystemLogger; +import rs09.game.world.GameWorld; import rs09.game.world.repository.Repository; import java.io.File; @@ -37,12 +39,18 @@ public final class SystemTermination { SystemLogger.logInfo("[SystemTerminator] Initializing termination sequence - do not shutdown!"); try { Server.setRunning(false); - for(Player player : Repository.getPlayers()){ - DMCHandler dmc = player.getAttribute("dmc",null); - if(dmc != null){ - dmc.clear(false); + for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { + try { + Player p = it.next(); + if (p != null && !p.isArtificial()) { // Should never be null. + p.getDetails().save(); + p.clear(); + } + } catch (Exception e) { + e.printStackTrace(); } } + GameWorld.getShutdownListeners().forEach(ShutdownListener::shutdown); if(ServerConstants.DATA_PATH != null) save(ServerConstants.DATA_PATH); } catch (Throwable e) { @@ -62,27 +70,6 @@ public final class SystemTermination { file.mkdirs(); } Server.getReactor().terminate(); - for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { - try { - Player p = it.next(); - if (p != null && !p.isArtificial()) { // Should never be null. -/* p.removeAttribute("combat-time"); - p.clear(); - PlayerParser.save(p);*/ - p.getDetails().save(); - p.getLogoutPlugins().forEach(playerPlugin -> { - try { - playerPlugin.newInstance(p); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - }); - p.clear(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } long start = System.currentTimeMillis(); while(!Repository.getDisconnectionQueue().isEmpty() && System.currentTimeMillis() - start < 5000L){ Repository.getDisconnectionQueue().update(); @@ -91,15 +78,7 @@ public final class SystemTermination { } catch (Exception ignored) {} } Repository.getDisconnectionQueue().update(); - GlobalKillCounter.save(); - GrandExchangeDatabase.save(); SystemLogger.flushLogs(); - SystemLogger.logInfo("[SystemTerminator] Saved Grand Exchange databases!"); Repository.getDisconnectionQueue().clear(); - SystemLogger.logInfo("[SystemTerminator] Saving Server Store..."); - ServerStore.save(); - SystemLogger.logInfo("[SystemTerminator] Server Store Saved!"); -// ServerStore.dump(directory + "store/"); - SystemLogger.logInfo("[SystemTerminator] Saved player accounts!"); } } diff --git a/Server/src/main/java/core/game/system/task/ItemLogoutTask.java b/Server/src/main/java/core/game/system/task/ItemLogoutTask.java deleted file mode 100644 index 27c29b91d..000000000 --- a/Server/src/main/java/core/game/system/task/ItemLogoutTask.java +++ /dev/null @@ -1,34 +0,0 @@ -package core.game.system.task; - -import core.game.node.entity.player.Player; -import core.game.node.item.Item; - -/** - * Logout task used for adding items when the player logs out. - * @author Emperor - */ -public final class ItemLogoutTask extends LogoutTask { - - /** - * The items. - */ - private final Item[] items; - - /** - * Constructs a new {@code ItemLogoutTask} {@code Object}. - * @param ticks The amount of ticks. - * @param items The items to add on logout. - */ - public ItemLogoutTask(int ticks, Item... items) { - super(ticks); - this.items = items; - } - - @Override - public void run(Player player) { - for (Item item : items) { - player.getInventory().add(item); - } - } - -} \ No newline at end of file diff --git a/Server/src/main/java/core/game/system/task/LocationLogoutTask.java b/Server/src/main/java/core/game/system/task/LocationLogoutTask.java deleted file mode 100644 index ed9a6198c..000000000 --- a/Server/src/main/java/core/game/system/task/LocationLogoutTask.java +++ /dev/null @@ -1,33 +0,0 @@ -package core.game.system.task; - -import core.game.node.entity.player.Player; -import core.game.world.map.Location; - -/** - * Sets the player's location on logout. - * @author Emperor - */ -public final class LocationLogoutTask extends LogoutTask { - - /** - * The location to set. - */ - private final Location location; - - /** - * Constructs a new {@code LocationLogoutTask} {@code Object}. - * @param ticks The amount of ticks this task is valid for. - * @param location The location to set. - */ - public LocationLogoutTask(int ticks, Location location) { - super(ticks); - this.location = location; - } - - @SuppressWarnings("deprecation") - @Override - public void run(Player player) { - player.setLocation(location); - } - -} \ No newline at end of file diff --git a/Server/src/main/java/core/game/system/task/LogoutTask.java b/Server/src/main/java/core/game/system/task/LogoutTask.java deleted file mode 100644 index 241724641..000000000 --- a/Server/src/main/java/core/game/system/task/LogoutTask.java +++ /dev/null @@ -1,63 +0,0 @@ -package core.game.system.task; - -import core.game.node.entity.player.Player; -import rs09.game.world.GameWorld; - -/** - * A task called upon when a player disconnects from the game. - * @author Emperor - */ -public abstract class LogoutTask { - - /** - * The amount of ticks this logout task is valid for. - */ - private int validity; - - /** - * Constructs a new {@code LogoutTask} {@code Object}. - */ - public LogoutTask() { - this(Integer.MAX_VALUE - GameWorld.getTicks()); - } - - /** - * Constructs a new {@code LogoutTask} {@code Object}. - * @param ticks The amount of ticks this logout task is valid. - */ - public LogoutTask(int ticks) { - this.validity = GameWorld.getTicks() + ticks; - } - - /** - * Runs the task. - * @param player The player. - */ - public abstract void run(Player player); - - /** - * Fires the logout task, if it is still valid. - * @param player The player logging out. - */ - public void fire(Player player) { - if (isValid()) { - run(player); - } - } - - /** - * Checks if the logout task is valid. - * @return {@code True} if so. - */ - public boolean isValid() { - return validity > GameWorld.getTicks(); - } - - /** - * Sets the new validity delay. - * @param ticks The amount of ticks this task should remain valid for. - */ - public void setDelay(int ticks) { - this.validity = GameWorld.getTicks() + ticks; - } -} \ No newline at end of file diff --git a/Server/src/main/java/core/game/world/callback/CallBack.java b/Server/src/main/java/core/game/world/callback/CallBack.java deleted file mode 100644 index 90034bf0b..000000000 --- a/Server/src/main/java/core/game/world/callback/CallBack.java +++ /dev/null @@ -1,16 +0,0 @@ -package core.game.world.callback; - -/** - * Represents a call back which is used in {@link CallbackHub} to load any - * neccesary details used on the starting of a world. - * @author 'Vexia - */ -public interface CallBack { - - /** - * Method used to call anything related to this {@link CallBack}. - * @return True if succesfull with calling, and - * False if not. - */ - public boolean call(); -} diff --git a/Server/src/main/java/core/game/world/map/zone/ZoneBuilder.java b/Server/src/main/java/core/game/world/map/zone/ZoneBuilder.java index b5e69f641..33aa0f2cb 100644 --- a/Server/src/main/java/core/game/world/map/zone/ZoneBuilder.java +++ b/Server/src/main/java/core/game/world/map/zone/ZoneBuilder.java @@ -1,6 +1,6 @@ package core.game.world.map.zone; -import core.game.world.callback.CallBack; +import api.StartupListener; import core.game.world.map.zone.impl.*; @@ -8,17 +8,16 @@ import core.game.world.map.zone.impl.*; * Loads all the default zones. * @author Emperor */ -public class ZoneBuilder implements CallBack { +public class ZoneBuilder implements StartupListener { @Override - public boolean call() { + public void startup() { configure(WildernessZone.getInstance()); configure(MultiwayCombatZone.getInstance()); configure(new ModeratorZone()); configure(new DarkZone()); configure(new KaramjaZone()); configure(new BankZone()); - return true; } /** diff --git a/Server/src/main/java/core/game/world/objectparser/ObjectParser.java b/Server/src/main/java/core/game/world/objectparser/ObjectParser.java index bc143b336..0ffe690b5 100644 --- a/Server/src/main/java/core/game/world/objectparser/ObjectParser.java +++ b/Server/src/main/java/core/game/world/objectparser/ObjectParser.java @@ -1,5 +1,6 @@ package core.game.world.objectparser; +import api.StartupListener; import rs09.ServerConstants; import core.game.node.scenery.Scenery; import rs09.game.world.GameWorld; @@ -17,9 +18,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; -@Initializable -@PluginManifest(name="ObjectParser") -public class ObjectParser extends StartupPlugin { +public class ObjectParser implements StartupListener { public void parseObjects(){ if(ServerConstants.OBJECT_PARSER_PATH == null) return; @@ -101,18 +100,7 @@ public class ObjectParser extends StartupPlugin { } @Override - public void run() { + public void startup() { parseObjects(); } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - GameWorld.getSTARTUP_PLUGINS().add(this); - return this; - } - - @Override - public Object fireEvent(String identifier, Object... args) { - return null; - } } diff --git a/Server/src/main/kotlin/api/LoginListener.kt b/Server/src/main/kotlin/api/LoginListener.kt index 844e7c629..96a900d18 100644 --- a/Server/src/main/kotlin/api/LoginListener.kt +++ b/Server/src/main/kotlin/api/LoginListener.kt @@ -3,5 +3,10 @@ package api import core.game.node.entity.player.Player interface LoginListener { + /** + * NOTE: This should NOT reference any non-static class-local variables. + * If you need to access a player's specific instance, use an attribute. + * Alternatively, consider using an [api.events.EventHook] if applicable. + */ fun login(player: Player) } \ No newline at end of file diff --git a/Server/src/main/kotlin/api/LogoutListener.kt b/Server/src/main/kotlin/api/LogoutListener.kt new file mode 100644 index 000000000..443d4c5e6 --- /dev/null +++ b/Server/src/main/kotlin/api/LogoutListener.kt @@ -0,0 +1,11 @@ +package api + +import core.game.node.entity.player.Player + +interface LogoutListener { + /** + * NOTE: This should NOT reference any non-static class-local variables. + * If you need to access a player's specific instance, use an attribute. + */ + fun logout(player: Player) +} \ No newline at end of file diff --git a/Server/src/main/kotlin/api/ShutdownListener.kt b/Server/src/main/kotlin/api/ShutdownListener.kt new file mode 100644 index 000000000..cc97a06fa --- /dev/null +++ b/Server/src/main/kotlin/api/ShutdownListener.kt @@ -0,0 +1,10 @@ +package api + +import rs09.game.system.SystemLogger + +interface ShutdownListener { + /** + * NOTE: This should NOT reference nonstatic class-local variables. + */ + fun shutdown() +} \ No newline at end of file diff --git a/Server/src/main/kotlin/api/StartupListener.kt b/Server/src/main/kotlin/api/StartupListener.kt new file mode 100644 index 000000000..2240a8895 --- /dev/null +++ b/Server/src/main/kotlin/api/StartupListener.kt @@ -0,0 +1,10 @@ +package api + +import rs09.game.system.SystemLogger + +interface StartupListener { + /** + * NOTE: This should NOT reference nonstatic class-local variables. + */ + fun startup() +} \ No newline at end of file diff --git a/Server/src/main/kotlin/api/TickListener.kt b/Server/src/main/kotlin/api/TickListener.kt new file mode 100644 index 000000000..c0d9cf4b1 --- /dev/null +++ b/Server/src/main/kotlin/api/TickListener.kt @@ -0,0 +1,11 @@ +package api + +interface TickListener { + /** + * NOTE: This should NOT reference nonstatic class-local variables. + * TickListeners are generally for NON-player, WORLD tick events. + * Examples: Fishing spot rotation, grand exchange updates, puro puro randomization, etc. + * If you need something (player/entity)-specific, use an [api.events.EventHook] with the [api.events.TickEvent] + */ + fun tick() +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/GlobalStats.kt b/Server/src/main/kotlin/rs09/GlobalStats.kt index 8817ae3b3..415a4615c 100644 --- a/Server/src/main/kotlin/rs09/GlobalStats.kt +++ b/Server/src/main/kotlin/rs09/GlobalStats.kt @@ -1,7 +1,7 @@ package rs09 import org.json.simple.JSONObject -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getInt object GlobalStats { diff --git a/Server/src/main/kotlin/rs09/Server.kt b/Server/src/main/kotlin/rs09/Server.kt index 1ec1ed7af..bfb0bc416 100644 --- a/Server/src/main/kotlin/rs09/Server.kt +++ b/Server/src/main/kotlin/rs09/Server.kt @@ -68,8 +68,6 @@ object Server { startTime = System.currentTimeMillis() val t = TimeStamp() SystemLogger.logInfo("Initializing Server Store...") - GlobalKillCounter.init() - ServerStore.init() SystemLogger.logInfo("Initialized ${ServerStore.counter} store files.") GameWorld.prompt(true) SQLManager.init() @@ -85,8 +83,6 @@ object Server { WorldCommunicator.connect() SystemLogger.logInfo(GameWorld.settings?.name + " flags " + GameWorld.settings?.toString()) SystemLogger.logInfo(GameWorld.settings?.name + " started in " + t.duration(false, "") + " milliseconds.") - - GEAutoStock.autostock() val scanner = Scanner(System.`in`) running = true diff --git a/Server/src/main/kotlin/rs09/ServerStore.kt b/Server/src/main/kotlin/rs09/ServerStore.kt index 117e35629..c40037bdb 100644 --- a/Server/src/main/kotlin/rs09/ServerStore.kt +++ b/Server/src/main/kotlin/rs09/ServerStore.kt @@ -1,19 +1,21 @@ package rs09 +import api.ShutdownListener +import api.StartupListener import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import rs09.game.system.SystemLogger +import rs09.game.system.SystemLogger.logShutdown +import rs09.game.system.SystemLogger.logStartup import java.io.File import java.io.FileReader import java.io.FileWriter import javax.script.ScriptEngineManager -object ServerStore { - val fileMap = HashMap() - var counter = 0 - - fun init(){ +class ServerStore : StartupListener, ShutdownListener { + override fun startup() { + logStartup("Parsing server store...") val dir = File(ServerConstants.STORE_PATH!!) if(!dir.exists()){ dir.mkdirs() @@ -41,8 +43,8 @@ object ServerStore { } } - @JvmStatic - fun save() { + override fun shutdown() { + logShutdown("Saving server store...") val dir = File(ServerConstants.DATA_PATH + File.separator + "serverstore") if(!dir.exists()){ dir.mkdirs() @@ -63,63 +65,68 @@ object ServerStore { } } - @JvmStatic - fun getArchive(name: String): JSONObject { - if(fileMap[name] == null){ - fileMap[name] = JSONObject() + companion object { + val fileMap = HashMap() + var counter = 0 + + @JvmStatic + fun getArchive(name: String): JSONObject { + if(fileMap[name] == null){ + fileMap[name] = JSONObject() + } + + return fileMap[name]!! } - return fileMap[name]!! - } - - fun setArchive(name: String, data: JSONObject){ - fileMap[name] = data - } - - fun clearDailyEntries() { - fileMap.keys.toTypedArray().forEach { - if(it.toLowerCase().contains("daily")) fileMap[it]?.clear() + fun setArchive(name: String, data: JSONObject){ + fileMap[name] = data } - } - fun clearWeeklyEntries() { - fileMap.keys.toTypedArray().forEach { - if(it.toLowerCase().contains("weekly")) fileMap[it]?.clear() + fun clearDailyEntries() { + fileMap.keys.toTypedArray().forEach { + if(it.toLowerCase().contains("daily")) fileMap[it]?.clear() + } } - } - @JvmStatic - fun JSONObject.getInt(key: String): Int { - return when(val value = this[key]){ - is Long -> value.toInt() - is Double -> value.toInt() - is Float -> value.toInt() - is Int -> value - is Nothing -> 0 - else -> 0 + fun clearWeeklyEntries() { + fileMap.keys.toTypedArray().forEach { + if(it.toLowerCase().contains("weekly")) fileMap[it]?.clear() + } } - } - @JvmStatic - fun JSONObject.getString(key: String): String { - return this[key] as? String ?: "nothing" - } - - @JvmStatic - fun JSONObject.getLong(key: String): Long { - return this[key] as? Long ?: 0L - } - - @JvmStatic - fun JSONObject.getBoolean(key: String): Boolean { - return this[key] as? Boolean ?: false - } - - fun List.toJSONArray(): JSONArray{ - val jArray = JSONArray() - for(i in this){ - jArray.add(i) + @JvmStatic + fun JSONObject.getInt(key: String): Int { + return when(val value = this[key]){ + is Long -> value.toInt() + is Double -> value.toInt() + is Float -> value.toInt() + is Int -> value + is Nothing -> 0 + else -> 0 + } + } + + @JvmStatic + fun JSONObject.getString(key: String): String { + return this[key] as? String ?: "nothing" + } + + @JvmStatic + fun JSONObject.getLong(key: String): Long { + return this[key] as? Long ?: 0L + } + + @JvmStatic + fun JSONObject.getBoolean(key: String): Boolean { + return this[key] as? Boolean ?: false + } + + fun List.toJSONArray(): JSONArray{ + val jArray = JSONArray() + for(i in this){ + jArray.add(i) + } + return jArray } - return jArray } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt index 1aaba11e6..697f4e4c3 100644 --- a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt @@ -1,19 +1,6 @@ package rs09.game.ai.general.scriptrepository -import io.github.classgraph.ClassGraph - object PlayerScripts { class PlayerScript(val identifier: String, val description: Array, val name: String, val clazz: Class<*>) val identifierMap = HashMap() - - - fun init(){ - val result = ClassGraph().enableAnnotationInfo().acceptPackages("rs09.game.ai.general.scriptrepository").scan() - result.getClassesWithAnnotation("rs09.game.ai.general.scriptrepository.PlayerCompatible").forEach { res -> - val description = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptDescription").parameterValues[0].value as Array - val identifier = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptIdentifier").parameterValues[0].value.toString() - val name = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptName").parameterValues[0].value.toString() - identifierMap[identifier] = PlayerScript(identifier,description,name,res.loadClass()) - } - } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/activity/allfiredup/AFUSession.kt b/Server/src/main/kotlin/rs09/game/content/activity/allfiredup/AFUSession.kt index a61e618d7..4b9566a43 100644 --- a/Server/src/main/kotlin/rs09/game/content/activity/allfiredup/AFUSession.kt +++ b/Server/src/main/kotlin/rs09/game/content/activity/allfiredup/AFUSession.kt @@ -1,5 +1,6 @@ package rs09.game.content.activity.allfiredup +import api.LogoutListener import core.game.node.entity.player.Player import core.game.node.item.Item import core.game.system.task.Pulse @@ -12,7 +13,7 @@ import rs09.tools.stringtools.colorize * Handles keeping track of lit beacons and their burn time remaining * @author Ceikry */ -class AFUSession(val player: Player) { +class AFUSession(val player: Player? = null) : LogoutListener { private val beaconTimers = Array(14){i -> BeaconTimer(0,AFUBeacon.values()[i])} private val logInventories = Array(14){Item(0,0)} private val beaconWatched = Array(14){false} @@ -22,7 +23,7 @@ class AFUSession(val player: Player) { isActive = true GameWorld.Pulser.submit(object: Pulse(){ override fun pulse(): Boolean { - player.setAttribute("afu-pulse",this) + player!!.setAttribute("afu-pulse",this) beaconTimers.forEach {timer -> timer.ticks-- if(timer.ticks == 300) timer.beacon.diminish(player).also { @@ -40,8 +41,7 @@ class AFUSession(val player: Player) { return !isActive } }) - player.setAttribute("afu-session",this) - player.logoutPlugins.add(AFULogoutPlugin()) + player!!.setAttribute("afu-session",this) } fun getLitBeacons(): Int{ @@ -111,20 +111,12 @@ class AFUSession(val player: Player) { } } - internal class BeaconTimer(var ticks: Int, val beacon: AFUBeacon) - - class AFULogoutPlugin: Plugin { - override fun newInstance(arg: Player?): Plugin { - arg ?: return this - AFUBeacon.resetAllBeacons(arg) - val session: AFUSession? = arg.getAttribute("afu-session",null) - session?.end() - arg.removeAttribute("afu-session") - return this - } - - override fun fireEvent(identifier: String?, vararg args: Any?): Any { - return Unit - } + override fun logout(player: Player) { + AFUBeacon.resetAllBeacons(player) + val session: AFUSession? = player.getAttribute("afu-session",null) + session?.end() + player.removeAttribute("afu-session") } + + internal class BeaconTimer(var ticks: Int, val beacon: AFUBeacon) } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerInteractionHandler.kt b/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerInteractionHandler.kt index d72c63bf7..bd28bd28b 100644 --- a/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerInteractionHandler.kt +++ b/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerInteractionHandler.kt @@ -49,7 +49,6 @@ class FishingTrawlerInteractionHandler : InteractionListener() { (ActivityManager.getActivity("fishing trawler") as FishingTrawlerActivity).removePlayer(player) val session: FishingTrawlerSession? = player.getAttribute("ft-session",null) session?.players?.remove(player) - player.logoutPlugins.clear() return@on true } @@ -89,7 +88,6 @@ class FishingTrawlerInteractionHandler : InteractionListener() { on(BARREL_IDS,SCENERY,"climb-on"){ player, _ -> player.properties.teleportLocation = Location.create(2672, 3222, 0) player.dialogueInterpreter.sendDialogue("You climb onto the floating barrel and begin to kick your way to the","shore.","You make it to the shore tired and weary.") - player.logoutPlugins.clear() player.appearance.setDefaultAnimations() player.appearance.sync() return@on true diff --git a/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerSession.kt index 939467250..ece074601 100644 --- a/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerSession.kt +++ b/Server/src/main/kotlin/rs09/game/content/activity/fishingtrawler/FishingTrawlerSession.kt @@ -1,5 +1,6 @@ package rs09.game.content.activity.fishingtrawler +import api.LogoutListener import core.game.component.Component import core.game.node.scenery.Scenery import core.game.node.scenery.SceneryBuilder @@ -36,12 +37,15 @@ private const val HOLE_NORTH_Y = 26 private const val HOLE_SOUTH_Y = 23 private const val LEAKING_ID = 2167 private const val PATCHED_ID = 2168 -class FishingTrawlerSession(var region: DynamicRegion, val activity: FishingTrawlerActivity) { + +class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : LogoutListener { + constructor(region: DynamicRegion, activity: FishingTrawlerActivity) : this(activity) {this.region = region; this.base = region.baseLocation} var players: ArrayList = ArrayList() var netRipped = false var fishAmount = 0 var timeLeft = secondsToTicks(600) - var base = region.baseLocation + lateinit var region: DynamicRegion + lateinit var base: Location var isActive = false var boatSank = false var hole_locations = ArrayList() @@ -71,7 +75,6 @@ class FishingTrawlerSession(var region: DynamicRegion, val activity: FishingTraw updateOverlay(player) player.properties.teleportLocation = base.transform(36,24,0) player.setAttribute("ft-session",this) - player.logoutPlugins.add(TrawlerLogoutPlugin()) player.stateManager.set(EntityState.TELEBLOCK,timeLeft) } } @@ -137,7 +140,6 @@ class FishingTrawlerSession(var region: DynamicRegion, val activity: FishingTraw for(player in session.players){ player.interfaceManager.closeOverlay() player.properties.teleportLocation = Location.create(2666, 3162, 0) - player.logoutPlugins.clear() player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_GAMES_WON") } } @@ -267,19 +269,10 @@ class FishingTrawlerSession(var region: DynamicRegion, val activity: FishingTraw fun updateOverlay(player: Player){ FishingTrawlerOverlay.sendUpdate(player,((waterAmount / 500.0) * 100).toInt(),netRipped,fishAmount,TimeUnit.SECONDS.toMinutes(ticksToSeconds(timeLeft).toLong()).toInt() + 1) } -} -class TrawlerLogoutPlugin : Plugin{ - override fun newInstance(arg: Player?): Plugin { - arg?.location = Location.create(2667, 3161, 0) - val session: FishingTrawlerSession? = arg?.getAttribute("ft-session",null) - session ?: return this - session.players.remove(arg) - return this + override fun logout(player: Player) { + val session = player.getAttribute("ft-session",null) ?: return + player.location = Location.create(2667, 3161, 0) + session.players.remove(player) } - - override fun fireEvent(identifier: String?, vararg args: Any?): Any { - return Unit - } - } diff --git a/Server/src/main/kotlin/rs09/game/content/global/GlobalKillCounter.kt b/Server/src/main/kotlin/rs09/game/content/global/GlobalKillCounter.kt index 9be43721d..850630725 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/GlobalKillCounter.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/GlobalKillCounter.kt @@ -1,5 +1,7 @@ package rs09.game.content.global +import api.ShutdownListener +import api.StartupListener import core.game.node.entity.player.Player import rs09.game.system.SystemLogger import java.io.File @@ -10,12 +12,12 @@ import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import rs09.ServerConstants import core.game.node.item.Item +import rs09.game.system.SystemLogger.logShutdown +import rs09.game.system.SystemLogger.logStartup -object GlobalKillCounter { - val kills: HashMap> = HashMap() - val rare_drops: HashMap> = HashMap() - - fun init() { +class GlobalKillCounter : StartupListener, ShutdownListener { + override fun startup() { + logStartup("Parsing Global Kill Counts") val file = File(ServerConstants.DATA_PATH + File.separator + "global_kill_stats.json") if(!file.exists()) { return @@ -35,36 +37,8 @@ object GlobalKillCounter { } } - @JvmStatic - fun populate(field: HashMap>, obj: Any?) { - if(obj != null && obj is JSONObject) { - for((player, tmp_kc) in obj.asIterable()) { - if(player is String) { - val kc: HashMap = HashMap() - for((npc_id, count) in (tmp_kc as JSONObject).asIterable()) { - kc.put(java.lang.Long.parseLong(npc_id as String), count as Long) - } - field.put(player, kc) - } - } - } - } - - @JvmStatic - fun saveField(field: HashMap>): JSONObject { - val tmp_kills = JSONObject() - for((player, kc) in field.asIterable()) { - val tmp_kc = JSONObject() - for((id, count) in kc.asIterable()) { - tmp_kc.put(id, count) - } - tmp_kills.put(player, tmp_kc) - } - return tmp_kills - } - - @JvmStatic - fun save() { + override fun shutdown() { + logShutdown("Saving Global Kill Counts") val data = JSONObject() data.put("kills", saveField(kills)) data.put("rare_drops", saveField(rare_drops)) @@ -72,36 +46,74 @@ object GlobalKillCounter { FileWriter(file).use { it.write(data.toJSONString()); it.flush(); it.close() } } - @JvmStatic - fun incrementKills(player: Player, npc_id: Int) { - val player_kills = kills.getOrPut(player.username, { HashMap() }) - val old_amount = player_kills.getOrElse(npc_id.toLong(), { 0 }) - player_kills.put(npc_id.toLong(), 1 + old_amount) - } + companion object { + val kills: HashMap> = HashMap() + val rare_drops: HashMap> = HashMap() - @JvmStatic - fun incrementRareDrop(player: Player, item: Item) { - val player_drops = rare_drops.getOrPut(player.username, { HashMap() }) - val old_amount = player_drops.getOrElse(item.id.toLong(), { 0 }) - player_drops.put(item.id.toLong(), item.amount + old_amount) - } - - @JvmStatic - fun getKills(player: Player, npc_id: Int): Long { - return kills.getOrElse(player.username, { HashMap() }).getOrElse(npc_id.toLong(), { 0 }) - } - - @JvmStatic - fun getKills(player: Player, npc_ids: IntArray): Long { - var sum: Long = 0 - for(npc_id in npc_ids) { - sum += getKills(player, npc_id) + @JvmStatic + fun populate(field: HashMap>, obj: Any?) { + if(obj != null && obj is JSONObject) { + for((player, tmp_kc) in obj.asIterable()) { + if(player is String) { + val kc: HashMap = HashMap() + for((npc_id, count) in (tmp_kc as JSONObject).asIterable()) { + kc.put(java.lang.Long.parseLong(npc_id as String), count as Long) + } + field.put(player, kc) + } + } + } } - return sum - } - @JvmStatic - fun getRareDrops(player: Player, item_id: Int): Long { - return rare_drops.getOrElse(player.username, { HashMap() }).getOrElse(item_id.toLong(), { 0 }) + @JvmStatic + fun saveField(field: HashMap>): JSONObject { + val tmp_kills = JSONObject() + for((player, kc) in field.asIterable()) { + val tmp_kc = JSONObject() + for((id, count) in kc.asIterable()) { + tmp_kc.put(id, count) + } + tmp_kills.put(player, tmp_kc) + } + return tmp_kills + } + + @JvmStatic + fun save() { + + } + + @JvmStatic + fun incrementKills(player: Player, npc_id: Int) { + val player_kills = kills.getOrPut(player.username, { HashMap() }) + val old_amount = player_kills.getOrElse(npc_id.toLong(), { 0 }) + player_kills.put(npc_id.toLong(), 1 + old_amount) + } + + @JvmStatic + fun incrementRareDrop(player: Player, item: Item) { + val player_drops = rare_drops.getOrPut(player.username, { HashMap() }) + val old_amount = player_drops.getOrElse(item.id.toLong(), { 0 }) + player_drops.put(item.id.toLong(), item.amount + old_amount) + } + + @JvmStatic + fun getKills(player: Player, npc_id: Int): Long { + return kills.getOrElse(player.username, { HashMap() }).getOrElse(npc_id.toLong(), { 0 }) + } + + @JvmStatic + fun getKills(player: Player, npc_ids: IntArray): Long { + var sum: Long = 0 + for(npc_id in npc_ids) { + sum += getKills(player, npc_id) + } + return sum + } + + @JvmStatic + fun getRareDrops(player: Player, item_id: Int): Long { + return rare_drops.getOrElse(player.username, { HashMap() }).getOrElse(item_id.toLong(), { 0 }) + } } } diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/WorldEvent.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/WorldEvent.kt index 397a14aec..faa10b899 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/WorldEvent.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/WorldEvent.kt @@ -2,7 +2,7 @@ package rs09.game.content.global.worldevents import rs09.game.system.SystemLogger import core.plugin.Plugin -import rs09.plugin.PluginManager +import rs09.plugin.ClassScanner import java.util.* /** @@ -57,7 +57,7 @@ open class WorldEvent(var name: String) { class PluginSet(vararg val plugins: Plugin<*>){ val set = ArrayList(plugins.asList()) fun initialize() { - PluginManager.definePlugins(*set.toTypedArray()) + ClassScanner.definePlugins(*set.toTypedArray()) } fun add(plugin: Plugin<*>){ set.add(plugin) diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/christmas/GiftRollPlugin.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/christmas/GiftRollPlugin.kt index 3d61e59a6..08955ae5e 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/christmas/GiftRollPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/christmas/GiftRollPlugin.kt @@ -8,7 +8,7 @@ import core.plugin.Initializable import core.tools.RandomFunction import org.rs09.consts.Items import rs09.ServerStore -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getInt import rs09.game.content.global.WeightBasedTable import rs09.game.content.global.WeightedItem import rs09.game.interaction.InteractionListener diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/GrimDialogue.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/GrimDialogue.kt index 7d1993751..79c03e3b6 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/GrimDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/GrimDialogue.kt @@ -8,7 +8,7 @@ import core.game.node.entity.player.Player import core.game.node.entity.player.link.emote.Emotes import core.game.node.item.Item import rs09.ServerStore -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getInt import rs09.tools.END_DIALOGUE /** diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/TrickOrTreatHandler.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/TrickOrTreatHandler.kt index 2fcab9dfa..d40b33533 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/TrickOrTreatHandler.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/holiday/halloween/TrickOrTreatHandler.kt @@ -12,8 +12,8 @@ import core.game.world.update.flag.context.Graphics import core.tools.RandomFunction import org.rs09.consts.Components import rs09.ServerStore -import rs09.ServerStore.getInt -import rs09.ServerStore.getString +import rs09.ServerStore.Companion.getInt +import rs09.ServerStore.Companion.getString import rs09.game.content.dialogue.DialogueFile import rs09.game.interaction.InteractionListener import rs09.game.world.GameWorld diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/penguinhns/PenguinManager.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/penguinhns/PenguinManager.kt index 7fdd5bf62..6759ffedb 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/penguinhns/PenguinManager.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/penguinhns/PenguinManager.kt @@ -6,7 +6,7 @@ import rs09.game.system.SystemLogger import core.game.world.map.Location import org.json.simple.JSONArray import org.json.simple.JSONObject -import rs09.ServerStore.toJSONArray +import rs09.ServerStore.Companion.toJSONArray import java.util.* class PenguinManager{ diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/ShootingStar.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/ShootingStar.kt index 28f3ad97c..14602254e 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/ShootingStar.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/ShootingStar.kt @@ -5,9 +5,10 @@ import core.game.node.scenery.SceneryBuilder import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.game.world.map.Location -import rs09.ServerStore.getBoolean -import rs09.ServerStore.getInt -import rs09.ServerStore.getString +import rs09.ServerStore.Companion.getBoolean +import rs09.ServerStore.Companion.getInt +import rs09.ServerStore.Companion.getString + import rs09.game.ai.general.scriptrepository.ShootingStarBot import rs09.game.world.repository.Repository diff --git a/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt b/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt index 99242a3b8..10d8cafc3 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt @@ -11,7 +11,7 @@ import core.tools.RandomFunction import org.json.simple.JSONObject import org.rs09.consts.Items import rs09.ServerStore -import rs09.ServerStore.getBoolean +import rs09.ServerStore.Companion.getBoolean import rs09.game.node.entity.state.newsys.states.ShootingStarState import rs09.tools.END_DIALOGUE import rs09.tools.secondsToTicks diff --git a/Server/src/main/kotlin/rs09/game/content/jobs/JobManager.kt b/Server/src/main/kotlin/rs09/game/content/jobs/JobManager.kt index fd64c16d4..c7e9c9f0c 100644 --- a/Server/src/main/kotlin/rs09/game/content/jobs/JobManager.kt +++ b/Server/src/main/kotlin/rs09/game/content/jobs/JobManager.kt @@ -8,7 +8,7 @@ import core.game.node.item.GroundItemManager import core.game.node.item.Item import org.json.simple.JSONObject import rs09.ServerStore -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getInt import rs09.game.system.SystemLogger import java.util.concurrent.TimeUnit diff --git a/Server/src/main/kotlin/rs09/game/content/jobs/WorkForInteractionListener.kt b/Server/src/main/kotlin/rs09/game/content/jobs/WorkForInteractionListener.kt index 81fcb824b..3b3d8d6f0 100644 --- a/Server/src/main/kotlin/rs09/game/content/jobs/WorkForInteractionListener.kt +++ b/Server/src/main/kotlin/rs09/game/content/jobs/WorkForInteractionListener.kt @@ -13,7 +13,7 @@ import core.game.node.item.Item import org.json.simple.JSONObject import org.rs09.consts.Items import rs09.ServerStore -import rs09.ServerStore.getInt +import rs09.ServerStore.Companion.getInt import rs09.game.Event import rs09.game.interaction.InteractionListener import rs09.game.system.SystemLogger diff --git a/Server/src/main/kotlin/rs09/game/ge/GEAutoStock.kt b/Server/src/main/kotlin/rs09/game/ge/GEAutoStock.kt index 5a134a285..bc1856398 100644 --- a/Server/src/main/kotlin/rs09/game/ge/GEAutoStock.kt +++ b/Server/src/main/kotlin/rs09/game/ge/GEAutoStock.kt @@ -1,5 +1,6 @@ package rs09.game.ge +import api.StartupListener import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser @@ -7,7 +8,11 @@ import rs09.ServerConstants import java.io.File import java.io.FileReader -class GEAutoStock { +class GEAutoStock : StartupListener { + override fun startup() { + autostock() + } + companion object { // autostock format should be identical to the botoffers json format. private val DB_PATH = "data" + File.separator + "eco" + File.separator + "autostock.json" diff --git a/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt b/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt index 49c16c063..bd9667eaa 100644 --- a/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt +++ b/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt @@ -1,5 +1,6 @@ package rs09.game.ge +import api.StartupListener import api.getItemName import api.itemDefinition import api.sendMessage @@ -8,7 +9,6 @@ import core.game.ge.OfferState import core.game.node.entity.player.Player import core.game.node.entity.player.info.PlayerDetails import core.game.node.entity.player.link.audio.Audio -import core.game.world.callback.CallBack import rs09.game.system.SystemLogger import rs09.game.system.config.ItemConfigParser import rs09.game.world.repository.Repository @@ -18,7 +18,7 @@ import java.lang.Integer.max * Handles the exchanging of offers, offer update thread, etc. * @author Ceikry */ -object GrandExchange : CallBack { +class GrandExchange : StartupListener { /** * Fallback safety check to make sure we don't start the GE twice under any circumstance */ @@ -65,240 +65,240 @@ object GrandExchange : CallBack { isRunning = true } - fun processOffer(offer: GrandExchangeOffer) - { - val conn = GEDB.connect() - if(offer.isActive) + companion object { + fun processOffer(offer: GrandExchangeOffer) { - val sellStmt = conn.createStatement() - val sell_offer = sellStmt.executeQuery("SELECT * from player_offers where item_id = ${offer.itemID} AND is_sale = 1 AND offer_state < 4 AND NOT offer_state = 2") - var bestOffer: GrandExchangeOffer? = null - - while(sell_offer.next()) + val conn = GEDB.connect() + if(offer.isActive) { - val otherOffer = GrandExchangeOffer.fromQuery(sell_offer) - if(!otherOffer.isActive) continue - if(otherOffer.offeredValue > offer.offeredValue) continue - if(bestOffer == null) bestOffer = otherOffer - else if(otherOffer.offeredValue < bestOffer.offeredValue) bestOffer = otherOffer - } + val sellStmt = conn.createStatement() + val sell_offer = sellStmt.executeQuery("SELECT * from player_offers where item_id = ${offer.itemID} AND is_sale = 1 AND offer_state < 4 AND NOT offer_state = 2") + var bestOffer: GrandExchangeOffer? = null - if(bestOffer != null) - { - val before = offer.amountLeft - exchange(offer,bestOffer) - if(offer.amountLeft != before) - SystemLogger.logGE("Purchased ${before - offer.amountLeft}x ${getItemName(offer.itemID)} @ B:${offer.offeredValue}/S:${bestOffer.offeredValue} gp each.") - } - - if(offer.amountLeft > 0) - { - val botStmt = conn.createStatement() - val bot_offer = botStmt.executeQuery("SELECT * from bot_offers where item_id = ${offer.itemID}") - if(bot_offer.next()) + while(sell_offer.next()) { - val botOffer = GrandExchangeOffer.fromBotQuery(bot_offer) - val before = offer.amountLeft - exchange(offer, botOffer) - if(offer.amountLeft != before) - SystemLogger.logGE("Purchased FROM BOT ${offer.amountLeft - before}x ${getItemName(offer.itemID)}") + val otherOffer = GrandExchangeOffer.fromQuery(sell_offer) + if(!otherOffer.isActive) continue + if(otherOffer.offeredValue > offer.offeredValue) continue + if(bestOffer == null) bestOffer = otherOffer + else if(otherOffer.offeredValue < bestOffer.offeredValue) bestOffer = otherOffer } + + if(bestOffer != null) + { + val before = offer.amountLeft + exchange(offer,bestOffer) + if(offer.amountLeft != before) + SystemLogger.logGE("Purchased ${before - offer.amountLeft}x ${getItemName(offer.itemID)} @ B:${offer.offeredValue}/S:${bestOffer.offeredValue} gp each.") + } + + if(offer.amountLeft > 0) + { + val botStmt = conn.createStatement() + val bot_offer = botStmt.executeQuery("SELECT * from bot_offers where item_id = ${offer.itemID}") + if(bot_offer.next()) + { + val botOffer = GrandExchangeOffer.fromBotQuery(bot_offer) + val before = offer.amountLeft + exchange(offer, botOffer) + if(offer.amountLeft != before) + SystemLogger.logGE("Purchased FROM BOT ${offer.amountLeft - before}x ${getItemName(offer.itemID)}") + } + } + sellStmt.close() } - sellStmt.close() } - } - @JvmStatic - fun getRecommendedPrice(itemID: Int, from_bot: Boolean = false): Int { - var base = max(GrandExchangeDatabase.getDatabase()[itemID]?.value ?: 0, getItemDefPrice(itemID)) - if (from_bot) base = (max(BotPrices.getPrice(itemID), base) * 1.10).toInt() - return base - } + @JvmStatic + fun getRecommendedPrice(itemID: Int, from_bot: Boolean = false): Int { + var base = max(GrandExchangeDatabase.getDatabase()[itemID]?.value ?: 0, getItemDefPrice(itemID)) + if (from_bot) base = (max(BotPrices.getPrice(itemID), base) * 1.10).toInt() + return base + } - private fun getItemDefPrice(itemID: Int): Int { - return max(itemDefinition(itemID).getConfiguration(ItemConfigParser.GE_PRICE) ?: 0, itemDefinition(itemID).value) - } + private fun getItemDefPrice(itemID: Int): Int { + return max(itemDefinition(itemID).getConfiguration(ItemConfigParser.GE_PRICE) ?: 0, itemDefinition(itemID).value) + } - @JvmStatic - fun getOfferStats(itemID: Int, sale: Boolean) : String - { - val conn = GEDB.connect() - - var foundOffers = 0 - var totalAmount = 0 - var bestPrice = 0 - val sb = StringBuilder() - var stmt = conn.createStatement() - - if(!sale) + @JvmStatic + fun getOfferStats(itemID: Int, sale: Boolean) : String { - var botAmt = 0 - var botPrice = 0 - val player_offers = stmt.executeQuery("SELECT * from player_offers where item_id = $itemID AND is_sale = 1 AND offer_state < 4 AND NOT offer_state = 2") + val conn = GEDB.connect() - while(player_offers.next()) + var foundOffers = 0 + var totalAmount = 0 + var bestPrice = 0 + val sb = StringBuilder() + var stmt = conn.createStatement() + + if(!sale) { - val o = GrandExchangeOffer.fromQuery(player_offers) - ++foundOffers - totalAmount += o.amountLeft - if(o.offeredValue < bestPrice || bestPrice == 0) - bestPrice = o.offeredValue + var botAmt = 0 + var botPrice = 0 + val player_offers = stmt.executeQuery("SELECT * from player_offers where item_id = $itemID AND is_sale = 1 AND offer_state < 4 AND NOT offer_state = 2") + + while(player_offers.next()) + { + val o = GrandExchangeOffer.fromQuery(player_offers) + ++foundOffers + totalAmount += o.amountLeft + if(o.offeredValue < bestPrice || bestPrice == 0) + bestPrice = o.offeredValue + } + + stmt.close() + stmt = conn.createStatement() + val bot_offers = stmt.executeQuery("SELECT * from bot_offers where item_id = $itemID") + if(bot_offers.next()) + { + val o = GrandExchangeOffer.fromBotQuery(bot_offers) + botAmt = o.amount + botPrice = getRecommendedPrice(itemID, true) + } + + sb.append("Player Stock: $totalAmount ") + sb.append(" Lowest Price: $bestPrice
") + sb.append("-".repeat(50)) + sb.append("
Bot Stock: $botAmt ") + sb.append(" Bot Price: $botPrice") + } + else + { + val buy_offers = stmt.executeQuery("SELECT * from player_offers where item_id = $itemID AND is_sale = 0 AND offer_state < 4 AND NOT offer_state = 2") + + while(buy_offers.next()) + { + val o = GrandExchangeOffer.fromQuery(buy_offers) + ++foundOffers + totalAmount += o.amountLeft + if(o.offeredValue > bestPrice) + bestPrice = o.offeredValue + } + + sb.append("Buy Offers: $totalAmount ") + sb.append("Highest Offer: $bestPrice") } stmt.close() - stmt = conn.createStatement() - val bot_offers = stmt.executeQuery("SELECT * from bot_offers where item_id = $itemID") - if(bot_offers.next()) + return sb.toString() + } + + fun addBotOffer(itemID: Int, amount: Int): Boolean + { + if (GrandExchangeDatabase.getDatabase()[itemID] == null) + return false + + val offer = GrandExchangeOffer.createBotOffer(itemID, amount) + offer.writeNew() + + return true + } + + fun dispatch(player: Player, offer: GrandExchangeOffer) : Boolean + { + if ( offer.amount < 1 ) + sendMessage(player, "You must choose the quantity you wish to buy!").also { return false } + + if ( offer.offeredValue < 1 ) + sendMessage(player, "You must choose the price you wish to buy for!").also { return false } + + if ( offer.offerState != OfferState.PENDING || offer.uid != 0L ) { - val o = GrandExchangeOffer.fromBotQuery(bot_offers) - botAmt = o.amount - botPrice = getRecommendedPrice(itemID, true) + SystemLogger.logWarn("[GE] DISPATCH FAILURE: ${offer.offerState.name}, UID: ${offer.uid}") + return false } - sb.append("Player Stock: $totalAmount ") - sb.append(" Lowest Price: $bestPrice
") - sb.append("-".repeat(50)) - sb.append("
Bot Stock: $botAmt ") - sb.append(" Bot Price: $botPrice") - } - else - { - val buy_offers = stmt.executeQuery("SELECT * from player_offers where item_id = $itemID AND is_sale = 0 AND offer_state < 4 AND NOT offer_state = 2") + if ( player.isArtificial ) + offer.playerUID = PlayerDetails.getDetails("2009scape").uid.also { offer.isBot = true } + else + offer.playerUID = player.details.uid - while(buy_offers.next()) - { - val o = GrandExchangeOffer.fromQuery(buy_offers) - ++foundOffers - totalAmount += o.amountLeft - if(o.offeredValue > bestPrice) - bestPrice = o.offeredValue + offer.offerState = OfferState.REGISTERED + //player.exchangeRecords.update(offer) + + if (offer.sell) { + Repository.sendNews(player.username + " just offered " + offer.amount + " " + getItemName(offer.itemID) + " on the GE.") } - sb.append("Buy Offers: $totalAmount ") - sb.append("Highest Offer: $bestPrice") + offer.writeNew() + return true } - stmt.close() - return sb.toString() - } - - fun addBotOffer(itemID: Int, amount: Int): Boolean - { - if (GrandExchangeDatabase.getDatabase()[itemID] == null) - return false - - val offer = GrandExchangeOffer.createBotOffer(itemID, amount) - offer.writeNew() - - return true - } - - fun dispatch(player: Player, offer: GrandExchangeOffer) : Boolean - { - if ( offer.amount < 1 ) - sendMessage(player, "You must choose the quantity you wish to buy!").also { return false } - - if ( offer.offeredValue < 1 ) - sendMessage(player, "You must choose the price you wish to buy for!").also { return false } - - if ( offer.offerState != OfferState.PENDING || offer.uid != 0L ) + fun exchange(offer: GrandExchangeOffer, other: GrandExchangeOffer) { - SystemLogger.logWarn("[GE] DISPATCH FAILURE: ${offer.offerState.name}, UID: ${offer.uid}") - return false + if(offer.sell && other.sell) return //Don't exchange if they are both sell offers + val amount = Integer.min(offer.amount - offer.completedAmount, other.amount - other.completedAmount) + + val seller = if(offer.sell) offer else other + val buyer = if(offer == seller) other else offer + + //If the buyer is buying for less than the seller is selling for, don't exchange + if(seller.offeredValue > buyer.offeredValue) return + + seller.completedAmount += amount + buyer.completedAmount += amount + + if(seller.amountLeft < 1 && seller.player != null) + seller.player!!.audioManager.send(Audio(4042,1,1)) + + seller.addWithdrawItem(995, amount * seller.offeredValue) + buyer.addWithdrawItem(seller.itemID, amount) + + if(seller.offeredValue < buyer.offeredValue) + buyer.addWithdrawItem(995, amount * (buyer.offeredValue - seller.offeredValue)) + + if(seller.amountLeft < 1) + seller.offerState = OfferState.COMPLETED + if(buyer.amountLeft < 1) + buyer.offerState = OfferState.COMPLETED + + seller.totalCoinExchange += seller.offeredValue * amount + buyer.totalCoinExchange += seller.offeredValue * amount + + seller.update() + val sellerPlayer = Repository.uid_map[seller.playerUID] + sellerPlayer?.exchangeRecords?.visualizeRecords() + buyer.update() + val buyerPlayer = Repository.uid_map[buyer.playerUID] + buyerPlayer?.exchangeRecords?.visualizeRecords() } - if ( player.isArtificial ) - offer.playerUID = PlayerDetails.getDetails("2009scape").uid.also { offer.isBot = true } - else - offer.playerUID = player.details.uid - - offer.offerState = OfferState.REGISTERED - //player.exchangeRecords.update(offer) - - if (offer.sell) { - Repository.sendNews(player.username + " just offered " + offer.amount + " " + getItemName(offer.itemID) + " on the GE.") - } - - offer.writeNew() - return true - } - - fun exchange(offer: GrandExchangeOffer, other: GrandExchangeOffer) - { - if(offer.sell && other.sell) return //Don't exchange if they are both sell offers - val amount = Integer.min(offer.amount - offer.completedAmount, other.amount - other.completedAmount) - - val seller = if(offer.sell) offer else other - val buyer = if(offer == seller) other else offer - - //If the buyer is buying for less than the seller is selling for, don't exchange - if(seller.offeredValue > buyer.offeredValue) return - - seller.completedAmount += amount - buyer.completedAmount += amount - - if(seller.amountLeft < 1 && seller.player != null) - seller.player!!.audioManager.send(Audio(4042,1,1)) - - seller.addWithdrawItem(995, amount * seller.offeredValue) - buyer.addWithdrawItem(seller.itemID, amount) - - if(seller.offeredValue < buyer.offeredValue) - buyer.addWithdrawItem(995, amount * (buyer.offeredValue - seller.offeredValue)) - - if(seller.amountLeft < 1) - seller.offerState = OfferState.COMPLETED - if(buyer.amountLeft < 1) - buyer.offerState = OfferState.COMPLETED - - seller.totalCoinExchange += seller.offeredValue * amount - buyer.totalCoinExchange += seller.offeredValue * amount - - seller.update() - val sellerPlayer = Repository.uid_map[seller.playerUID] - sellerPlayer?.exchangeRecords?.visualizeRecords() - buyer.update() - val buyerPlayer = Repository.uid_map[buyer.playerUID] - buyerPlayer?.exchangeRecords?.visualizeRecords() - } - - fun getValidOffers(): List - { - val conn = GEDB.connect() - val stmt = conn.createStatement() - val offers = ArrayList() - - val results = stmt.executeQuery("SELECT * FROM player_offers WHERE offer_state < 4 AND NOT offer_state = 2") - while(results.next()) + fun getValidOffers(): List { - val o = GrandExchangeOffer.fromQuery(results) - offers.add(o) + val conn = GEDB.connect() + val stmt = conn.createStatement() + val offers = ArrayList() + + val results = stmt.executeQuery("SELECT * FROM player_offers WHERE offer_state < 4 AND NOT offer_state = 2") + while(results.next()) + { + val o = GrandExchangeOffer.fromQuery(results) + offers.add(o) + } + stmt.close() + return offers } - stmt.close() - return offers - } - fun getBotOffers(): List - { - val conn = GEDB.connect() - val stmt = conn.createStatement() - val offers = ArrayList() - - val results = stmt.executeQuery("SELECT item_id,amount FROM bot_offers WHERE amount > 0") - while(results.next()) + fun getBotOffers(): List { - val o = GrandExchangeOffer.fromBotQuery(results) - offers.add(o) + val conn = GEDB.connect() + val stmt = conn.createStatement() + val offers = ArrayList() + + val results = stmt.executeQuery("SELECT item_id,amount FROM bot_offers WHERE amount > 0") + while(results.next()) + { + val o = GrandExchangeOffer.fromBotQuery(results) + offers.add(o) + } + stmt.close() + return offers } - stmt.close() - return offers + } - - - override fun call(): Boolean { + override fun startup(){ GEDB.init() boot() - return true } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/Listener.kt b/Server/src/main/kotlin/rs09/game/interaction/Listener.kt index 9d6f51fd4..c576a2f3f 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/Listener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/Listener.kt @@ -1,5 +1,10 @@ package rs09.game.interaction -interface Listener { +import api.StartupListener + +interface Listener : StartupListener { fun defineListeners() + override fun startup() { + defineListeners() + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/StarRingListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/StarRingListener.kt index fa0de99b8..d654b6f09 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/item/StarRingListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/item/StarRingListener.kt @@ -8,7 +8,7 @@ import core.game.world.map.Location import org.json.simple.JSONObject import org.rs09.consts.Items import rs09.ServerStore -import rs09.ServerStore.getBoolean +import rs09.ServerStore.Companion.getBoolean import rs09.game.content.dialogue.DialogueFile import rs09.game.content.global.worldevents.WorldEvents import rs09.game.content.global.worldevents.shootingstar.ShootingStar diff --git a/Server/src/main/kotlin/rs09/game/node/entity/npc/other/AlKharidWarriorPlugin.kt b/Server/src/main/kotlin/rs09/game/node/entity/npc/other/AlKharidWarriorPlugin.kt index c896693a2..b79d4f9b2 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/npc/other/AlKharidWarriorPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/npc/other/AlKharidWarriorPlugin.kt @@ -10,7 +10,7 @@ import core.game.world.map.Location import core.game.world.map.RegionManager import core.plugin.Initializable import core.plugin.Plugin -import rs09.plugin.PluginManager +import rs09.plugin.ClassScanner /** * Handles the Al-Kharid Warrior @@ -28,7 +28,7 @@ class AlKharidWarriorNPC : AbstractNPC { } override fun newInstance(arg: Any?): Plugin { - PluginManager.definePlugin(WarriorOptionPlugin()) + ClassScanner.definePlugin(WarriorOptionPlugin()) return super.newInstance(arg) } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt index 43cc49bee..ebf1e8cd6 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt @@ -9,6 +9,7 @@ import org.rs09.consts.NPCs; import rs09.game.content.global.GlobalKillCounter; import rs09.game.interaction.InterfaceListener import rs09.game.system.command.Command +import rs09.game.system.command.Privilege import rs09.game.system.command.sets.CommandSet import rs09.game.world.repository.Repository @@ -167,7 +168,7 @@ fun prepareInterface(player: Player,other: Player, page: Int){ data class StatsPageInfo(val other: Player, val page: Int) {} @Initializable -class StatsCommandSet : CommandSet(Command.Privilege.STANDARD) { +class StatsCommandSet : CommandSet(Privilege.STANDARD) { override fun defineCommands() { define("stats"){player,args -> if(args.size == 1){ diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt index 2d96c3fd9..265801475 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt @@ -20,7 +20,7 @@ import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Graphics import core.plugin.Initializable import rs09.game.world.GameWorld -import rs09.plugin.PluginManager +import rs09.plugin.ClassScanner /** * Handles the barbarian outpost course. @@ -180,7 +180,7 @@ class BarbarianOutpostCourse NPCDefinition.forId(385).handlers["option:pick-up"] = this NPCDefinition.forId(386).handlers["option:pick-up"] = this NPCDefinition.forId(387).handlers["option:pick-up"] = this - PluginManager.definePlugin(BarbarianGuardDialogue()) + ClassScanner.definePlugin(BarbarianGuardDialogue()) } override fun getDestination(node: Node, n: Node): Location? { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/GnomeStrongholdCourse.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/GnomeStrongholdCourse.kt index d3477adba..716dab2fd 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/GnomeStrongholdCourse.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/GnomeStrongholdCourse.kt @@ -8,8 +8,6 @@ import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.game.node.entity.skill.agility.AgilityCourse import core.game.node.entity.skill.agility.AgilityHandler -import core.game.system.task.LocationLogoutTask -import core.game.system.task.LogoutTask import core.game.world.map.Location import core.game.world.update.flag.context.Animation import core.plugin.Initializable @@ -94,7 +92,6 @@ class GnomeStrongholdCourse AgilityHandler.forceWalk(player, -1, Location.create(x, 3433, 0), Location.create(x, 3435, 0), Animation.create(844), 10, 0.0, null, 5) player.lock() AgilityHandler.forceWalk(player, 6, Location.create(x, 3435, 0), Location.create(x, 3437, 0), Animation.create(10579), 20, 7.5, null, 8) - player.addExtension(LogoutTask::class.java, LocationLogoutTask(12, Location.create(x, 3430, 0))) return true } } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt index 6fe7252d2..dfa531776 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt @@ -17,7 +17,7 @@ import core.game.world.update.flag.context.Animation import core.plugin.Initializable import core.plugin.Plugin import rs09.game.world.GameWorld -import rs09.plugin.PluginManager.definePlugin +import rs09.plugin.ClassScanner.definePlugin /** * Handles the lectern diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/gather/fishing/barbfishing/SpotManager.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/gather/fishing/barbfishing/SpotManager.kt index 670cb644f..269e6153c 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/gather/fishing/barbfishing/SpotManager.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/gather/fishing/barbfishing/SpotManager.kt @@ -1,5 +1,7 @@ package rs09.game.node.entity.skill.gather.fishing.barbfishing +import api.StartupListener +import api.TickListener import core.game.node.entity.npc.NPC import core.game.world.map.Location import core.plugin.CorePluginTypes.ManagerPlugin @@ -10,12 +12,11 @@ import core.tools.RandomFunction import rs09.game.node.entity.skill.gather.fishing.barbfishing.SpotManager.Companion.locations import rs09.game.node.entity.skill.gather.fishing.barbfishing.SpotManager.Companion.usedLocations -@Initializable /** * Manages fishing spot spawning and relocation * @author Ceikry */ -class SpotManager : ManagerPlugin() { +class SpotManager : TickListener, StartupListener { var ticks = 0 val spots = ArrayList() @@ -39,12 +40,10 @@ class SpotManager : ManagerPlugin() { } } - override fun newInstance(arg: Any?): Plugin { + override fun startup() { for(i in 0 until 5){ spots.add(BarbFishingSpot(getNewLoc(), getNewTTL()).also { it.init() }) } - Managers.register(this) - return this } } 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 5bffe6094..57ec46268 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 @@ -1,7 +1,7 @@ package core.game.node.entity.skill.runecrafting.abyss import api.* -import rs09.plugin.PluginManager.definePlugin +import rs09.plugin.ClassScanner.definePlugin import rs09.tools.stringtools.colorize import rs09.game.system.SystemLogger.logInfo import core.game.node.scenery.Scenery diff --git a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt index 5617a48b6..e48568e83 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/state/newsys/StateRepository.kt @@ -1,34 +1,41 @@ package rs09.game.node.entity.state.newsys +import api.StartupListener import core.game.node.entity.player.Player import io.github.classgraph.ClassGraph -object StateRepository { - val states = HashMap() +class StateRepository : StartupListener{ + override fun startup() { + loadStateClasses() + } - @JvmStatic - fun init() { - val result = ClassGraph().enableClassInfo().enableAnnotationInfo().acceptPackages("rs09.game.node.entity.state").scan() - result.getClassesWithAnnotation("rs09.game.node.entity.state.newsys.PlayerState").forEach{ - val key = it.getAnnotationInfo("rs09.game.node.entity.state.newsys.PlayerState").parameterValues[0].value as String - val clazz = it.loadClass().newInstance() - if(clazz is State) { - states.put(key, clazz) + companion object { + val states = HashMap() + + fun loadStateClasses() + { + val result = ClassGraph().enableClassInfo().enableAnnotationInfo().acceptPackages("rs09.game.node.entity.state").scan() + result.getClassesWithAnnotation("rs09.game.node.entity.state.newsys.PlayerState").forEach{ + val key = it.getAnnotationInfo("rs09.game.node.entity.state.newsys.PlayerState").parameterValues[0].value as String + val clazz = it.loadClass().newInstance() + if(clazz is State) { + states.put(key, clazz) + } } } - } - @JvmStatic - fun forKey(key: String, player: Player): State?{ - val state = states[key] - if(player.states[key] != null){ + @JvmStatic + fun forKey(key: String, player: Player): State?{ + val state = states[key] + if(player.states[key] != null){ + return null + } + if(state != null){ + val clazz = state.newInstance(player) + player.states[key] = clazz + return clazz + } return null } - if(state != null){ - val clazz = state.newInstance(player) - player.states[key] = clazz - return clazz - } - return null } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/system/SystemLogger.kt b/Server/src/main/kotlin/rs09/game/system/SystemLogger.kt index af4dcfc35..4f4c90b8b 100644 --- a/Server/src/main/kotlin/rs09/game/system/SystemLogger.kt +++ b/Server/src/main/kotlin/rs09/game/system/SystemLogger.kt @@ -102,4 +102,14 @@ object SystemLogger { } } catch(ignored: Exception){} } + + @JvmStatic fun logStartup(message: String) + { + SystemLogger.logInfo("[STARTUP] $message") + } + + @JvmStatic fun logShutdown(message: String) + { + SystemLogger.logInfo("[SHUTDOWN] $message") + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/system/command/Command.kt b/Server/src/main/kotlin/rs09/game/system/command/Command.kt index 44b11f517..ebf819e47 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/Command.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/Command.kt @@ -15,11 +15,6 @@ class Command(val name: String, val privilege: Privilege, val handle: (Player, A } } - enum class Privilege{ - STANDARD, - MODERATOR, - ADMIN - } } object CommandMapping { diff --git a/Server/src/main/kotlin/rs09/game/system/command/Privilege.kt b/Server/src/main/kotlin/rs09/game/system/command/Privilege.kt new file mode 100644 index 000000000..a20a7f775 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/system/command/Privilege.kt @@ -0,0 +1,7 @@ +package rs09.game.system.command + +enum class Privilege{ + STANDARD, + MODERATOR, + ADMIN +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt b/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt index 71c61da18..3f1ed9516 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt @@ -218,7 +218,6 @@ class AIPCommandPlugin : CommandPlugin() { return true } "immerse", "immersiveworld", "immersive" -> { - ImmerseWorld.init() player.sendMessage("Started immersive world, 2") return true } diff --git a/Server/src/main/kotlin/rs09/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt b/Server/src/main/kotlin/rs09/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt index 6e6f6d223..d9d028f8c 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt @@ -37,7 +37,7 @@ class RottenPotatoRSHDDialogue(player: Player? = null) : DialoguePlugin(player) //Wipe Bots 1 -> AIRepository.PulseRepository.toTypedArray().forEach { it.stop(); it.botScript.bot.clear(); AIPlayer.deregister((it.botScript.bot as AIPlayer).uid) }.also { player.sendMessage(colorize("%RBots wiped.")); end() } //Spawn Bots - 2 -> ImmerseWorld.init().also { player.sendMessage(colorize("%RBots Respawning...")); end() } + 2 -> ImmerseWorld.spawnBots().also { player.sendMessage(colorize("%RBots Respawning...")); end() } //Force Log All Online Players 3 -> { Repository.disconnectionQueue.clear().also { end() } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt index bbd48b81a..244f6abc1 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt @@ -6,11 +6,12 @@ import core.game.world.update.flag.context.Animation import core.plugin.Initializable import rs09.game.system.command.Command import rs09.game.system.command.CommandPlugin.Companion.toInteger +import rs09.game.system.command.Privilege import rs09.game.world.GameWorld import java.util.* @Initializable -class AnimationCommandSet : CommandSet(Command.Privilege.ADMIN) { +class AnimationCommandSet : CommandSet(Privilege.ADMIN) { protected var npcs: List = ArrayList() diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt index 8131ecb3a..e95d4e6b2 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt @@ -7,11 +7,12 @@ import rs09.game.ai.general.GeneralBotCreator import rs09.game.ai.general.scriptrepository.PlayerScripts import rs09.game.ai.general.scriptrepository.Script import rs09.game.system.command.Command +import rs09.game.system.command.Privilege import rs09.game.world.GameWorld import rs09.tools.stringtools.colorize @Initializable -class BottingCommandSet : CommandSet(Command.Privilege.STANDARD) { +class BottingCommandSet : CommandSet(Privilege.STANDARD) { override fun defineCommands() { define("scripts"){player, _ -> if(GameWorld.settings?.enabled_botting != true){ diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt index d8992d412..0aa55e0e1 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt @@ -4,6 +4,7 @@ import core.game.node.entity.player.Player import rs09.game.system.command.Command import rs09.game.system.command.CommandMapping import core.plugin.Plugin +import rs09.game.system.command.Privilege import rs09.tools.stringtools.colorize /** @@ -13,7 +14,7 @@ import rs09.tools.stringtools.colorize * @author Ceikry * @param defaultPrivilege the default privilege level for all commands in this set. */ -abstract class CommandSet(val defaultPrivilege: Command.Privilege) : Plugin { +abstract class CommandSet(val defaultPrivilege: Privilege) : Plugin { override fun newInstance(arg: Any?): Plugin { defineCommands() return this @@ -50,7 +51,7 @@ abstract class CommandSet(val defaultPrivilege: Command.Privilege) : Plugin) -> Unit){ + fun define(name: String, privilege: Privilege = defaultPrivilege, handle: (Player, Array) -> Unit){ CommandMapping.register(Command(name, privilege, handle)) } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt index 56fd094f9..7b9e496f1 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt @@ -2,9 +2,10 @@ package rs09.game.system.command.sets import core.plugin.Initializable import rs09.game.system.command.Command +import rs09.game.system.command.Privilege @Initializable -class ConfigCommandSet : CommandSet(Command.Privilege.ADMIN){ +class ConfigCommandSet : CommandSet(Privilege.ADMIN){ override fun defineCommands() { /** diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt index 06979958f..fb60c0f15 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt @@ -10,9 +10,10 @@ import core.plugin.Initializable import org.rs09.consts.Items import rs09.game.content.global.NPCDropTable import rs09.game.system.command.Command +import rs09.game.system.command.Privilege @Initializable -class DevelopmentCommandSet : CommandSet(Command.Privilege.ADMIN) { +class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { val farmKitItems = arrayListOf(Items.RAKE_5341, Items.SPADE_952, Items.SEED_DIBBER_5343, Items.WATERING_CAN8_5340, Items.SECATEURS_5329, Items.GARDENING_TROWEL_5325) override fun defineCommands() { diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt index 6fc59dd3d..59a99fc96 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt @@ -13,12 +13,13 @@ import rs09.game.content.dialogue.DialogueFile import rs09.game.interaction.InteractionListeners import rs09.game.interaction.SpadeDigListener import rs09.game.system.command.Command +import rs09.game.system.command.Privilege import rs09.game.world.GameWorld import rs09.tools.END_DIALOGUE import java.util.* @Initializable -class FunCommandSet : CommandSet(Command.Privilege.ADMIN) { +class FunCommandSet : CommandSet(Privilege.ADMIN) { var npcs: List = ArrayList() @@ -46,7 +47,7 @@ class FunCommandSet : CommandSet(Command.Privilege.ADMIN) { /** * Transform a player's appearance into that of an NPC. */ - define("pnpc", Command.Privilege.MODERATOR){ player, args -> + define("pnpc", Privilege.MODERATOR){ player, args -> if(args.size < 2){ reject(player, "Usage: ::pnpc ") return@define @@ -120,7 +121,7 @@ class FunCommandSet : CommandSet(Command.Privilege.ADMIN) { /** * Opens up the makeover interface */ - define("makeover", Command.Privilege.MODERATOR){ player, _ -> + define("makeover", Privilege.MODERATOR){ player, _ -> CharacterDesign.open(player) } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt index 03d40bbe9..f8e196194 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt @@ -28,6 +28,7 @@ import rs09.game.node.entity.state.newsys.states.FarmingState import rs09.game.system.SystemLogger import rs09.game.system.command.Command import rs09.game.system.command.CommandMapping +import rs09.game.system.command.Privilege import rs09.game.world.repository.Repository import rs09.tools.stringtools.colorize import java.awt.Toolkit @@ -35,17 +36,17 @@ import java.awt.datatransfer.StringSelection import java.util.* @Initializable -class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ +class MiscCommandSet : CommandSet(Privilege.ADMIN){ override fun defineCommands() { /** * Toggles debug mode */ - define("debug", Command.Privilege.STANDARD){ player, _ -> + define("debug", Privilege.STANDARD){ player, _ -> player.toggleDebug() } - define("calc_accuracy", Command.Privilege.STANDARD){ player, args -> + define("calc_accuracy", Privilege.STANDARD){ player, args -> val handler = player.getSwingHandler(false) player.sendMessage("handler type: ${handler.type}") player.sendMessage("calculateAccuracy: ${handler.calculateAccuracy(player)}") @@ -63,7 +64,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ /** * Prints player's current location */ - define("loc", Command.Privilege.STANDARD){ player, _-> + define("loc", Privilege.STANDARD){ player, _-> val l = player.location val r = player.viewport.region var obj: Scenery? = null @@ -82,18 +83,18 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ /** * Tells the player to use loc */ - define("pos", Command.Privilege.STANDARD){ player, _-> + define("pos", Privilege.STANDARD){ player, _-> notify(player, "Do you mean ::loc?") } /** * Tells the player to use loc */ - define("coords", Command.Privilege.STANDARD){ player, _-> + define("coords", Privilege.STANDARD){ player, _-> notify(player, "Do you mean ::loc?") } - define("calcmaxhit", Command.Privilege.STANDARD) { player, _ -> + define("calcmaxhit", Privilege.STANDARD) { player, _ -> val swingHandler = player.getSwingHandler(false) val hit = swingHandler.calculateHit(player, player, 1.0) notify(player, "max hit (${(swingHandler as Object).getClass().getName()}): ${hit}") @@ -119,7 +120,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ /** * Lists the players currently online */ - define("players", Command.Privilege.MODERATOR){ player, _ -> + define("players", Privilege.MODERATOR){ player, _ -> val rights = player.rights.ordinal if (player!!.interfaceManager.isOpened && player.interfaceManager.opened.id != Components.QUESTJOURNAL_SCROLL_275 || player.locks.isMovementLocked || player.locks.isTeleportLocked) { reject(player, "Please finish what you're doing first.") @@ -146,14 +147,14 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ /** * Opens the credit/voting shop */ - define("shop", Command.Privilege.STANDARD){ player, _ -> + define("shop", Privilege.STANDARD){ player, _ -> player.interfaceManager.open(Component(Components.CREDIT_SHOP)) } /** * Shows the player a list of currently active GE sell offers */ - define("ge", Command.Privilege.STANDARD) { player, args -> + define("ge", Privilege.STANDARD) { player, args -> if(args.size < 2){ reject(player, "Usage: ::ge mode", "Available modes: buying, selling, search, bots, botsearch") } @@ -194,7 +195,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ /** * Reply to PMs (also enables tab-to-reply) */ - define("reply", Command.Privilege.STANDARD){ player, _ -> + define("reply", Privilege.STANDARD){ player, _ -> if(player.interfaceManager.isOpened){ reject(player, "Please finish what you're doing first.") } @@ -342,14 +343,14 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ val varbitID = args[1].toInt() notify(player, "${varbitID}: ${VarbitDefinition.forId(varbitID, 0)}") } - define("togglexp",Command.Privilege.STANDARD){ player, args -> + define("togglexp", Privilege.STANDARD){ player, args -> val enabled = player.varpManager.get(2501).getVarbit(0)?.value == 1 player.varpManager.get(2501).setVarbit(0,if(enabled) 0 else 1).send(player) notify(player, "XP drops are now " + colorize("%R" + if(!enabled) "ON." else "OFF.")) player.varpManager.flagSave(2501) } - define("xpconfig",Command.Privilege.STANDARD){player,args -> + define("xpconfig", Privilege.STANDARD){ player, args -> if(args.size < 3){ reject(player,"Usage: ::xpconfig track|mode type", "Track types: total|recent", @@ -403,7 +404,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ player.varpManager.flagSave(2501) } - define("toggleslayer",Command.Privilege.STANDARD){player,_ -> + define("toggleslayer", Privilege.STANDARD){ player, _ -> val disabled = player.varpManager.get(2502).getVarbit(0)?.value == 1 player.varpManager.get(2502).setVarbit(0,if(disabled) 0 else 1).send(player) if(!disabled){ @@ -414,7 +415,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ notify(player,"Slayer task tracker is now " + (if(disabled) colorize("%RON") else colorize("%ROFF")) + ".") } - define("setvarbit",Command.Privilege.ADMIN){ + define("setvarbit", Privilege.ADMIN){ player,args -> if(args.size < 4){ reject(player,"Usage: ::setvarbit index offset value") @@ -429,7 +430,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ player.varpManager.get(index!!).setVarbit(offset!!, value!!).send(player) } - define("setvarc", Command.Privilege.ADMIN) { player, args -> + define("setvarc", Privilege.ADMIN) { player, args -> if(args.size < 3){ reject(player,"Usage: ::setvarc index value") } @@ -443,7 +444,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ player.packetDispatch.sendVarcUpdate(index!!, value!!) } - define("grow",Command.Privilege.ADMIN){player,_ -> + define("grow", Privilege.ADMIN){ player, _ -> val state: FarmingState = player.states.get("farming") as FarmingState? ?: return@define for(patch in state.getPatches()){ @@ -451,7 +452,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ } } - define("finishbins",Command.Privilege.ADMIN){player,_ -> + define("finishbins", Privilege.ADMIN){ player, _ -> val state: FarmingState = player.states.get("farming") as FarmingState? ?: return@define for(bin in state.getBins()){ @@ -459,26 +460,26 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ } } - define("testlady",Command.Privilege.ADMIN){player,_ -> + define("testlady", Privilege.ADMIN){ player, _ -> player.antiMacroHandler.event = RandomEvents.RIVER_TROLL.npc.create(player) player.antiMacroHandler.event!!.init() } - define("revent",Command.Privilege.ADMIN){player,_ -> + define("revent", Privilege.ADMIN){ player, _ -> println(player.pulseManager.current) player.antiMacroHandler.fireEvent() } - define("addcredits",Command.Privilege.ADMIN){player,_ -> + define("addcredits", Privilege.ADMIN){ player, _ -> player.details.credits += 100 } - define("resetgwdropes",Command.Privilege.STANDARD){player,_ -> + define("resetgwdropes", Privilege.STANDARD){ player, _ -> player.varpManager.get(1048).clearBitRange(0,31) player.varpManager.get(1048).send(player) } - define("resetmistag",Command.Privilege.STANDARD){player,_ -> + define("resetmistag", Privilege.STANDARD){ player, _ -> player.removeAttribute("mistag-greeted") } @@ -503,7 +504,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ notify(player,"No parent NPC found.") } } - define("infinitespecial",Command.Privilege.ADMIN){player,args -> + define("infinitespecial", Privilege.ADMIN){ player, args -> val usageStr = "Usage: ::infinitespecial true|false" if(args.size < 2){ reject(player, usageStr) @@ -514,7 +515,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ else -> reject(player, usageStr) } } - define("allow_aggro", Command.Privilege.ADMIN) { player, args -> + define("allow_aggro", Privilege.ADMIN) { player, args -> val usageStr = "Usage: ::allow_aggro true | false" if(args.size < 2) { reject(player, usageStr) @@ -527,7 +528,7 @@ class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ } } - define("confirmrules", Command.Privilege.STANDARD) { player, args -> + define("confirmrules", Privilege.STANDARD) { player, args -> if(getAttribute(player,"rules:confirmed", false)) reject(player, "You have already confirmed the rules.") if(args.size < 2) diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt index d6a9e47d6..56111ef6d 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt @@ -8,6 +8,7 @@ import rs09.game.world.GameWorld import core.game.world.map.Location import rs09.game.world.repository.Repository import core.plugin.Initializable +import rs09.game.system.command.Privilege import java.util.concurrent.TimeUnit @Initializable @@ -15,7 +16,7 @@ import java.util.concurrent.TimeUnit * Moderation commands * @author Ceikry */ -class ModerationCommandSet : CommandSet(Command.Privilege.MODERATOR){ +class ModerationCommandSet : CommandSet(Privilege.MODERATOR){ override fun defineCommands() { val MAX_JAIL_TIME = 1800 //Max jail time (in seconds) @@ -24,7 +25,7 @@ class ModerationCommandSet : CommandSet(Command.Privilege.MODERATOR){ * Kick a player * ============================================================================================================= */ - define("kick", Command.Privilege.ADMIN){ player, args -> + define("kick", Privilege.ADMIN){ player, args -> val playerToKick: Player? = Repository.getPlayerByName(args[1]) if (playerToKick != null) { playerToKick.clear(true) diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt index a1b27b7c1..17a92cb3e 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt @@ -6,9 +6,10 @@ import core.net.packet.context.MusicContext import core.net.packet.out.MusicPacket import core.plugin.Initializable import rs09.game.system.command.Command +import rs09.game.system.command.Privilege @Initializable -class MusicCommandSet : CommandSet(Command.Privilege.STANDARD){ +class MusicCommandSet : CommandSet(Privilege.STANDARD){ override fun defineCommands() { /** @@ -43,7 +44,7 @@ class MusicCommandSet : CommandSet(Command.Privilege.STANDARD){ * Command that unlocks all music tracks for the player * Restricted to ADMIN access only. */ - define("allmusic", Command.Privilege.ADMIN){ player, _ -> + define("allmusic", Privilege.ADMIN){ player, _ -> for (me in MusicEntry.getSongs().values) { player.musicPlayer.unlock(me.id) } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/QuestCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/QuestCommandSet.kt index 825fca176..504693c2e 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/QuestCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/QuestCommandSet.kt @@ -5,9 +5,10 @@ import core.game.node.entity.player.Player import core.game.node.entity.player.link.quest.QuestRepository import rs09.game.system.command.Command import core.plugin.Initializable +import rs09.game.system.command.Privilege @Initializable -class QuestCommandSet : CommandSet(Command.Privilege.ADMIN){ +class QuestCommandSet : CommandSet(Privilege.ADMIN){ override fun defineCommands() { /** * Completes all quests @@ -41,7 +42,7 @@ class QuestCommandSet : CommandSet(Command.Privilege.ADMIN){ /** * Displays the currently implemented quests */ - define("quests", Command.Privilege.STANDARD){ player, _ -> + define("quests", Privilege.STANDARD){ player, _ -> sendQuests(player) } } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt index 9ff6790bd..0f0ff2b0a 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt @@ -3,9 +3,10 @@ package rs09.game.system.command.sets import core.game.node.entity.npc.NPC import core.plugin.Initializable import rs09.game.system.command.Command +import rs09.game.system.command.Privilege @Initializable -class SlayerCommandSet : CommandSet(Command.Privilege.ADMIN){ +class SlayerCommandSet : CommandSet(Privilege.ADMIN){ override fun defineCommands() { /** * Finishes a player's slayer task (the correct way) diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/SpawnCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/SpawnCommandSet.kt index df371d8b2..43d9167dc 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/SpawnCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/SpawnCommandSet.kt @@ -9,11 +9,12 @@ import rs09.game.system.SystemLogger import rs09.game.system.command.Command import rs09.game.system.command.CommandPlugin import core.plugin.Initializable +import rs09.game.system.command.Privilege import java.awt.Toolkit import java.awt.datatransfer.StringSelection @Initializable -class SpawnCommandSet : CommandSet(Command.Privilege.ADMIN){ +class SpawnCommandSet : CommandSet(Privilege.ADMIN){ override fun defineCommands() { /** * Spawns an npc with the given ID diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt index 53a35f777..9051ea006 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt @@ -11,11 +11,12 @@ import core.game.system.SystemState import core.plugin.Initializable import org.rs09.consts.Items import rs09.game.system.command.Command +import rs09.game.system.command.Privilege import rs09.game.world.repository.Repository import kotlin.system.exitProcess @Initializable -class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { +class SystemCommandSet : CommandSet(Privilege.ADMIN) { override fun defineCommands() { /** * Start an update countdown @@ -38,7 +39,7 @@ class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { /** * Allows a player to reset their password */ - define("resetpassword", Command.Privilege.STANDARD) { player, args -> + define("resetpassword", Privilege.STANDARD) { player, args -> if (args.size != 3) { reject(player, "Usage: ::resetpassword current new", "WARNING: THIS IS PERMANENT.", "WARNING: PASSWORD CAN NOT CONTAIN SPACES.") } @@ -69,7 +70,7 @@ class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { /** * Allows an Administrator to reset a password */ - define("setpasswordother", Command.Privilege.ADMIN) { player, args -> + define("setpasswordother", Privilege.ADMIN) { player, args -> if (args.size != 3) { reject(player, "Usage: ::resetpasswordother user new", "WARNING: THIS IS PERMANENT.", "WARNING: PASSWORD CAN NOT CONTAIN SPACES.") } @@ -95,7 +96,7 @@ class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { } } - define("giveitem", Command.Privilege.ADMIN) { player, args -> + define("giveitem", Privilege.ADMIN) { player, args -> if (args.size == 3 || args.size == 4) { val victim = Repository.getPlayerByName(args[1]) val itemID = args[2].toIntOrNull() @@ -131,7 +132,7 @@ class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { } } - define("removeitem", Command.Privilege.ADMIN) { player, args -> + define("removeitem", Privilege.ADMIN) { player, args -> if (args.size == 4 || args.size == 5) { val itemLoc = args[1].toLowerCase() val victim = Repository.getPlayerByName(args[2]) @@ -182,7 +183,7 @@ class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { } } - define("removeitemall", Command.Privilege.ADMIN) { player, args -> + define("removeitemall", Privilege.ADMIN) { player, args -> if (args.size == 3) { val victim = Repository.getPlayerByName(args[1]) val itemID = args[2].toIntOrNull() @@ -234,7 +235,7 @@ class SystemCommandSet : CommandSet(Command.Privilege.ADMIN) { player.inventory.add(Item(Items.ROTTEN_POTATO_5733)) } - define("shutdown",Command.Privilege.ADMIN) { player, _ -> + define("shutdown", Privilege.ADMIN) { player, _ -> exitProcess(0) } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt index ca0df7542..17c35d279 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt @@ -5,10 +5,11 @@ import core.game.world.map.Location import core.plugin.Initializable import rs09.ServerConstants import rs09.game.system.command.Command +import rs09.game.system.command.Privilege import rs09.game.world.repository.Repository @Initializable -class TeleportCommandSet : CommandSet(Command.Privilege.ADMIN){ +class TeleportCommandSet : CommandSet(Privilege.ADMIN){ override fun defineCommands() { /** * Allows teleporting by location name diff --git a/Server/src/main/kotlin/rs09/game/world/GameWorld.kt b/Server/src/main/kotlin/rs09/game/world/GameWorld.kt index c0982bc92..1508846e3 100644 --- a/Server/src/main/kotlin/rs09/game/world/GameWorld.kt +++ b/Server/src/main/kotlin/rs09/game/world/GameWorld.kt @@ -1,11 +1,8 @@ package rs09.game.world -import api.LoginListener +import api.* import core.cache.Cache import core.cache.def.impl.SceneryDefinition -import core.game.ge.GrandExchangeDatabase -import core.game.node.entity.npc.drop.RareDropTable -import core.game.node.entity.npc.drop.CELEMinorTable import core.game.node.entity.player.Player import core.game.system.SystemManager import core.game.system.SystemState @@ -22,13 +19,13 @@ import rs09.game.node.entity.state.newsys.StateRepository import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger.logInfo import rs09.game.system.config.ConfigParser -import rs09.game.world.callback.CallbackHub import rs09.game.world.repository.Repository -import rs09.plugin.PluginManager +import rs09.plugin.ClassScanner import rs09.worker.MajorUpdateWorker import java.text.SimpleDateFormat import java.util.* import java.util.function.Consumer +import kotlin.collections.ArrayList /** * Represents the game world. @@ -48,6 +45,30 @@ object GameWorld { @JvmStatic val loginListeners = ArrayList() + /** + * Logout listeners + */ + @JvmStatic + val logoutListeners = ArrayList() + + /** + * Tick listeners + */ + @JvmStatic + val tickListeners = ArrayList() + + /** + * Startup Listeners + */ + @JvmStatic + val startupListeners = ArrayList() + + /** + * Shutdown Listeners + */ + @JvmStatic + val shutdownListeners = ArrayList() + @JvmStatic val STARTUP_PLUGINS: List = ArrayList() private val configParser = ConfigParser() @@ -135,32 +156,19 @@ object GameWorld { */ @Throws(Throwable::class) fun prompt(run: Boolean, directory: String?){ - SystemLogger.logInfo("Prompting ${settings?.name} Game World...") + logInfo("Prompting ${settings?.name} Game World...") Cache.init(ServerConstants.CACHE_PATH) databaseManager = DatabaseManager(ServerConstants.DATABASE) databaseManager!!.connect() - GrandExchangeDatabase.init() configParser.prePlugin() - PluginManager.init() + ClassScanner.scanAndLoad() configParser.postPlugin() - RareDropTable.init() - logInfo("Initialized Rare Drop Table from " + ServerConstants.RDT_DATA_PATH) - CELEMinorTable.init() - logInfo("Initialized Chaos Elemental (Minor) Drop Table from " + ServerConstants.CELEDT_DATA_PATH) - if (settings!!.enable_bots) { - ImmerseWorld.init() - } - CallbackHub.call() - STARTUP_PLUGINS.forEach(Consumer { plugin: StartupPlugin? -> - plugin?.run() - }) + startupListeners.forEach { it.startup() } if (run) { SystemManager.flag(if (settings?.isDevMode == true) SystemState.PRIVATE else SystemState.ACTIVE) } SceneryDefinition.getDefinitions().values.forEach(Consumer { obj: SceneryDefinition -> obj.examine }) System.gc() - PlayerScripts.init() - StateRepository.init() SystemLogger.initTradeLogger() } diff --git a/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt b/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt index 6423a3cbf..fd1504e92 100644 --- a/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt +++ b/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt @@ -1,5 +1,6 @@ package rs09.game.world +import api.StartupListener import core.game.node.entity.combat.CombatStyle import core.game.world.map.Location import core.game.world.map.zone.ZoneBorders @@ -11,100 +12,220 @@ import java.util.Timer import java.util.concurrent.Executors import kotlin.concurrent.schedule -object ImmerseWorld { - var assembler = CombatBotAssembler() - var skillingBotAssembler = SkillingBotAssembler() - @JvmStatic - fun init() { - Executors.newSingleThreadExecutor().execute { - Thread.currentThread().name = "BotSpawner" - immerseSeersAndCatherby() - immerseLumbridgeDraynor() - immerseVarrock() - // immerseWilderness() temp disabled due to unbalanced exchange rates - immerseFishingGuild() - immerseAdventurer() - // immerseSlayer() - } +class ImmerseWorld : StartupListener { + + override fun startup() { + spawnBots() } - fun immerseAdventurer(){ - for (i in 0..(GameWorld.settings?.max_adv_bots ?: 50)){ - var random: Long = (10000..300000).random().toLong() - Timer().schedule(random){ - spawn_adventurers() + companion object { + var assembler = CombatBotAssembler() + var skillingBotAssembler = SkillingBotAssembler() + + fun spawnBots() + { + if(GameWorld.settings!!.enable_bots) + { + Executors.newSingleThreadExecutor().execute { + Thread.currentThread().name = "BotSpawner" + immerseSeersAndCatherby() + immerseLumbridgeDraynor() + immerseVarrock() + // immerseWilderness() temp disabled due to unbalanced exchange rates + immerseFishingGuild() + immerseAdventurer() + // immerseSlayer() + } } } - } - fun spawn_adventurers(){ - val lumbridge = Location.create(3221, 3219, 0) - val tiers = listOf(CombatBotAssembler.Tier.LOW,CombatBotAssembler.Tier.MED) - GeneralBotCreator( - Adventurer(CombatStyle.MELEE), - assembler.MeleeAdventurer(tiers.random(), lumbridge) - ) - GeneralBotCreator( - Adventurer(CombatStyle.RANGE), - assembler.RangeAdventurer(tiers.random(), lumbridge) - ) - } - - fun immerseFishingGuild(){ - val fishingGuild = Location.create(2604, 3421, 0) - for (i in (0..4)) { - GeneralBotCreator(fishingGuild, SharkCatcher()) + fun immerseAdventurer() { + for (i in 0..(GameWorld.settings?.max_adv_bots ?: 50)) { + var random: Long = (10000..300000).random().toLong() + Timer().schedule(random) { + spawn_adventurers() + } + } } - } - fun immerseSeersAndCatherby(){ - GeneralBotCreator(SeersMagicTrees(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2702, 3397, 0))) - GeneralBotCreator(SeersFlax(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(2738, 3444, 0))) - GeneralBotCreator(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2722, 3493, 0))) - GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2807, 3441, 0))) - GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher()) - } - - fun immerseLumbridgeDraynor(){ - GeneralBotCreator(CowKiller(), assembler.produce(CombatBotAssembler.Type.RANGE, CombatBotAssembler.Tier.MED, Location.create(3261, 3269, 0))) - GeneralBotCreator(CowKiller(), assembler.produce(CombatBotAssembler.Type.MELEE, CombatBotAssembler.Tier.LOW, Location.create(3261, 3269, 0))) - GeneralBotCreator(CowKiller(), assembler.produce(CombatBotAssembler.Type.MELEE, CombatBotAssembler.Tier.MED, Location.create(3257, 3267, 0))) - GeneralBotCreator(ManThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3235, 3213, 0))) - GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0))) - GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0))) - GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0))) - GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0))) - GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0))) - GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) - GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) - GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) - } - - fun immerseVarrock(){ - val WestBankIdlerBorders = ZoneBorders(3184, 3435,3187, 3444) - GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH,Location.create(3189, 3435, 0))) - GeneralBotCreator(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE,Location.create(3189, 3439, 0))) - GeneralBotCreator(Idler(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH,WestBankIdlerBorders.randomLoc)) - GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3256, 3420, 0))) - GeneralBotCreator(VarrockEssenceMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3253, 3420, 0))) - GeneralBotCreator(VarrockSmither(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH,Location.create(3189, 3436, 0))) - GeneralBotCreator(NonBankingMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3182, 3374, 0))) - } - - fun immerseWilderness(){ - val wilderness = Location.create(2979, 3603, 0) - for (i in (0..1)) { - GeneralBotCreator(GreenDragonKiller(CombatStyle.MELEE), assembler.assembleMeleeDragonBot(CombatBotAssembler.Tier.HIGH,wilderness)) - GeneralBotCreator(GreenDragonKiller(CombatStyle.MELEE), assembler.assembleMeleeDragonBot(CombatBotAssembler.Tier.MED,wilderness)) - GeneralBotCreator(GreenDragonKiller(CombatStyle.RANGE), assembler.assembleRangedBot(CombatBotAssembler.Tier.HIGH,wilderness)) + fun spawn_adventurers() { + val lumbridge = Location.create(3221, 3219, 0) + val tiers = listOf(CombatBotAssembler.Tier.LOW, CombatBotAssembler.Tier.MED) + GeneralBotCreator( + Adventurer(CombatStyle.MELEE), + assembler.MeleeAdventurer(tiers.random(), lumbridge) + ) + GeneralBotCreator( + Adventurer(CombatStyle.RANGE), + assembler.RangeAdventurer(tiers.random(), lumbridge) + ) } - } - fun immerseFalador(){ - GeneralBotCreator(CoalMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3037, 9737, 0))) - } + fun immerseFishingGuild() { + val fishingGuild = Location.create(2604, 3421, 0) + for (i in (0..4)) { + GeneralBotCreator(fishingGuild, SharkCatcher()) + } + } - fun immerseSlayer(){ - GeneralBotCreator(GenericSlayerBot(), assembler.produce(CombatBotAssembler.Type.MELEE,CombatBotAssembler.Tier.HIGH,Location.create(2673, 3635, 0))) + fun immerseSeersAndCatherby() { + GeneralBotCreator( + SeersMagicTrees(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2702, 3397, 0)) + ) + GeneralBotCreator( + SeersFlax(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(2738, 3444, 0)) + ) + GeneralBotCreator( + FletchingBankstander(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2722, 3493, 0)) + ) + GeneralBotCreator( + GlassBlowingBankstander(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2807, 3441, 0)) + ) + GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher()) + } + + fun immerseLumbridgeDraynor() { + GeneralBotCreator( + CowKiller(), + assembler.produce( + CombatBotAssembler.Type.RANGE, + CombatBotAssembler.Tier.MED, + Location.create(3261, 3269, 0) + ) + ) + GeneralBotCreator( + CowKiller(), + assembler.produce( + CombatBotAssembler.Type.MELEE, + CombatBotAssembler.Tier.LOW, + Location.create(3261, 3269, 0) + ) + ) + GeneralBotCreator( + CowKiller(), + assembler.produce( + CombatBotAssembler.Type.MELEE, + CombatBotAssembler.Tier.MED, + Location.create(3257, 3267, 0) + ) + ) + GeneralBotCreator( + ManThiever(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3235, 3213, 0)) + ) + GeneralBotCreator( + FarmerThiever(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3094, 3243, 0)) + ) + GeneralBotCreator( + FarmerThiever(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3094, 3243, 0)) + ) + GeneralBotCreator( + DraynorWillows(), + skillingBotAssembler.produce( + SkillingBotAssembler.Wealth.values().random(), + Location.create(3094, 3245, 0) + ) + ) + GeneralBotCreator( + DraynorWillows(), + skillingBotAssembler.produce( + SkillingBotAssembler.Wealth.values().random(), + Location.create(3094, 3245, 0) + ) + ) + GeneralBotCreator( + DraynorWillows(), + skillingBotAssembler.produce( + SkillingBotAssembler.Wealth.values().random(), + Location.create(3094, 3245, 0) + ) + ) + GeneralBotCreator( + DraynorFisher(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3095, 3246, 0)) + ) + GeneralBotCreator( + DraynorFisher(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3095, 3246, 0)) + ) + GeneralBotCreator( + DraynorFisher(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3095, 3246, 0)) + ) + } + + fun immerseVarrock() { + val WestBankIdlerBorders = ZoneBorders(3184, 3435, 3187, 3444) + GeneralBotCreator( + GlassBlowingBankstander(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH, Location.create(3189, 3435, 0)) + ) + GeneralBotCreator( + FletchingBankstander(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(3189, 3439, 0)) + ) + GeneralBotCreator( + Idler(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH, WestBankIdlerBorders.randomLoc) + ) + GeneralBotCreator( + GlassBlowingBankstander(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3256, 3420, 0)) + ) + GeneralBotCreator( + VarrockEssenceMiner(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3253, 3420, 0)) + ) + GeneralBotCreator( + VarrockSmither(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH, Location.create(3189, 3436, 0)) + ) + GeneralBotCreator( + NonBankingMiner(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3182, 3374, 0)) + ) + } + + fun immerseWilderness() { + val wilderness = Location.create(2979, 3603, 0) + for (i in (0..1)) { + GeneralBotCreator( + GreenDragonKiller(CombatStyle.MELEE), + assembler.assembleMeleeDragonBot(CombatBotAssembler.Tier.HIGH, wilderness) + ) + GeneralBotCreator( + GreenDragonKiller(CombatStyle.MELEE), + assembler.assembleMeleeDragonBot(CombatBotAssembler.Tier.MED, wilderness) + ) + GeneralBotCreator( + GreenDragonKiller(CombatStyle.RANGE), + assembler.assembleRangedBot(CombatBotAssembler.Tier.HIGH, wilderness) + ) + } + } + + fun immerseFalador() { + GeneralBotCreator( + CoalMiner(), + skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(3037, 9737, 0)) + ) + } + + fun immerseSlayer() { + GeneralBotCreator( + GenericSlayerBot(), + assembler.produce( + CombatBotAssembler.Type.MELEE, + CombatBotAssembler.Tier.HIGH, + Location.create(2673, 3635, 0) + ) + ) + } } } diff --git a/Server/src/main/kotlin/rs09/game/world/callback/CallbackHub.kt b/Server/src/main/kotlin/rs09/game/world/callback/CallbackHub.kt deleted file mode 100644 index aff6edd83..000000000 --- a/Server/src/main/kotlin/rs09/game/world/callback/CallbackHub.kt +++ /dev/null @@ -1,30 +0,0 @@ -package rs09.game.world.callback - -import core.game.node.entity.skill.hunter.ImpetuousImpulses -import core.game.world.callback.CallBack -import core.game.world.map.zone.ZoneBuilder -import rs09.game.ge.GrandExchange -import rs09.game.system.SystemLogger -import java.util.* - -/** - * Initializes a few world pulses that need to continuously run - * @author Vexia - */ -object CallbackHub { - private var calls: MutableList = ArrayList() - - fun call(): Boolean { - calls.add(ZoneBuilder()) - calls.add(GrandExchange) - calls.add(ImpetuousImpulses()) - for (call in calls) { - if (!call.call()) { - SystemLogger.logErr("A callback was stopped, callback=" + call.javaClass.simpleName + ".") - return false - } - } - calls.clear() - return true - } -} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/plugin/PluginManager.kt b/Server/src/main/kotlin/rs09/plugin/ClassScanner.kt similarity index 61% rename from Server/src/main/kotlin/rs09/plugin/PluginManager.kt rename to Server/src/main/kotlin/rs09/plugin/ClassScanner.kt index 07d2f5c08..b7377fa70 100644 --- a/Server/src/main/kotlin/rs09/plugin/PluginManager.kt +++ b/Server/src/main/kotlin/rs09/plugin/ClassScanner.kt @@ -1,6 +1,6 @@ package rs09.plugin -import api.LoginListener +import api.* import core.game.content.activity.ActivityManager import core.game.content.activity.ActivityPlugin import core.game.content.dialogue.DialoguePlugin @@ -12,20 +12,20 @@ import core.plugin.PluginManifest import core.plugin.PluginType import io.github.classgraph.ClassGraph import io.github.classgraph.ClassInfo +import rs09.game.ai.general.scriptrepository.PlayerScripts import rs09.game.interaction.InteractionListener import rs09.game.interaction.InterfaceListener import rs09.game.node.entity.skill.magic.SpellListener import rs09.game.system.SystemLogger -import rs09.game.system.command.Command import rs09.game.world.GameWorld import java.util.* import java.util.function.Consumer /** - * Represents a class used to handle the loading of all plugins. + * A class used to reflectively scan the classpath and load classes * @author Ceikry */ -object PluginManager { +object ClassScanner { var disabledPlugins = HashMap() /** * The amount of plugins loaded. @@ -44,10 +44,10 @@ object PluginManager { private val lastLoaded: String? = null /** - * Initializes the plugin manager. + * Scan the classpath for reflection-loaded content classes such as listeners, "plugins", etc */ @JvmStatic - fun init() { + fun scanAndLoad() { try { load() loadedPlugins!!.clear() @@ -56,11 +56,14 @@ object PluginManager { } catch (t: Throwable) { SystemLogger.logErr("Error initializing Plugins -> " + t.localizedMessage + " for file -> " + lastLoaded) t.printStackTrace() + } catch (e: Exception) { + SystemLogger.logErr("Error initializing Plugins -> " + e.localizedMessage + " for file -> " + lastLoaded) + e.printStackTrace() } } fun load() { - var result = ClassGraph().enableClassInfo().enableAnnotationInfo().scan() + val result = ClassGraph().enableClassInfo().enableAnnotationInfo().scan() result.getClassesWithAnnotation("core.plugin.Initializable").forEach(Consumer { p: ClassInfo -> try { definePlugin(p.loadClass().newInstance() as Plugin) @@ -70,27 +73,38 @@ object PluginManager { e.printStackTrace() } }) - result.getSubclasses("rs09.game.system.command.Command").forEach { - try { - definePlugin(it.loadClass().newInstance() as Plugin).also { System.out.println("Initializing $it") } - } catch (e: Exception) {e.printStackTrace()} + result.getClassesWithAnnotation("rs09.game.ai.general.scriptrepository.PlayerCompatible").forEach { res -> + val description = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptDescription").parameterValues[0].value as Array + val identifier = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptIdentifier").parameterValues[0].value.toString() + val name = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptName").parameterValues[0].value.toString() + PlayerScripts.identifierMap[identifier] = + PlayerScripts.PlayerScript(identifier, description, name, res.loadClass()) } - result.getClassesImplementing("api.LoginListener").forEach { + result.getClassesImplementing("api.StartupListener").filter { !it.isAbstract }.forEach { + try { + val clazz = it.loadClass().newInstance() as StartupListener + GameWorld.startupListeners.add(clazz) + } catch (e: Exception) + { + SystemLogger.logErr("Error loading startup listener: ${it.simpleName}, ${e.localizedMessage}") + e.printStackTrace() + } + } + result.getClassesImplementing("api.ShutdownListener").filter { !it.isAbstract }.forEach { + val clazz = it.loadClass().newInstance() as ShutdownListener + GameWorld.shutdownListeners.add(clazz) + } + result.getClassesImplementing("api.LoginListener").filter { !it.isAbstract }.forEach { val clazz = it.loadClass().newInstance() as LoginListener GameWorld.loginListeners.add(clazz) } - result.getSubclasses("rs09.game.interaction.InteractionListener").forEach { - val clazz = it.loadClass().newInstance() as InteractionListener - clazz.defineListeners() - clazz.defineDestinationOverrides() + result.getClassesImplementing("api.LogoutListener").filter { !it.isAbstract }.forEach { + val clazz = it.loadClass().newInstance() as LogoutListener + GameWorld.logoutListeners.add(clazz) } - result.getSubclasses("rs09.game.interaction.InterfaceListener").forEach { - val clazz = it.loadClass().newInstance() as InterfaceListener - clazz.defineListeners() - } - result.getSubclasses("rs09.game.node.entity.skill.magic.SpellListener").forEach { - val clazz = it.loadClass().newInstance() as SpellListener - clazz.defineListeners() + result.getClassesImplementing("api.TickListener").filter { !it.isAbstract }.forEach { + val clazz = it.loadClass().newInstance() as TickListener + GameWorld.tickListeners.add(clazz) } } diff --git a/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt b/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt index 5333a9c5b..a8a202050 100644 --- a/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt +++ b/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt @@ -89,6 +89,7 @@ class MajorUpdateWorker { GameWorld.pulse() //disconnect all players waiting to be disconnected Repository.disconnectionQueue.update() + GameWorld.tickListeners.forEach { it.tick() } //tick all manager plugins Managers.tick() }