diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java index 58d84f575..3e4bf528b 100644 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java +++ b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java @@ -9,6 +9,8 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; +import static rs09.tools.DialogueConstKt.END_DIALOGUE; + /** * Handles the LadyOfTheLake dialogue. * @@ -52,7 +54,7 @@ public class TheLadyOfTheLake extends DialoguePlugin { public boolean handle(int interfaceId, int buttonId) { final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); switch (stage) { - case 999: + case END_DIALOGUE: end(); break; case 0: @@ -75,13 +77,13 @@ public class TheLadyOfTheLake extends DialoguePlugin { break; case 3: player("Good day."); - stage = 999; + stage = END_DIALOGUE; break; } break; case 250: npc("I am afraid I do not know what you are talking about."); - stage = 171; + stage = END_DIALOGUE; break; case 100: npc("I am the Lady of the Lake."); @@ -131,7 +133,7 @@ public class TheLadyOfTheLake extends DialoguePlugin { break; case 117: player("Thanks!"); - stage = 999; + stage = END_DIALOGUE; break; case 145: options("I seek the sword Excalibur.", "Good day."); @@ -145,7 +147,7 @@ public class TheLadyOfTheLake extends DialoguePlugin { break; case 2: player("Good day."); - stage = 999; + stage = END_DIALOGUE; break; } break; @@ -181,12 +183,12 @@ public class TheLadyOfTheLake extends DialoguePlugin { break; case 167: npc("Well, come back when you do."); - stage = 999; + stage = END_DIALOGUE; break; case 168: if (player.getInventory().freeSlots() == 0) { player("Sorry, I don't seem to have enough inventory space."); - stage = 999; + stage = END_DIALOGUE; } else if (player.getInventory().contains(995, 500)) { player.getInventory().remove(new Item(995, 500)); player.getInventory().add(new Item(35, 1)); @@ -199,7 +201,7 @@ public class TheLadyOfTheLake extends DialoguePlugin { break; case 170: interpreter.sendDialogue("The lady of the Lake hands you Excalibur."); - stage = 999; + stage = END_DIALOGUE; break; case 300: npc("'Tis very valuable, and not an artefact to be given", "away lightly."); @@ -224,7 +226,7 @@ public class TheLadyOfTheLake extends DialoguePlugin { case 305: player("Ok. That seems easy enough."); quest.setStage(player, 60); - stage = 171; + stage = END_DIALOGUE; break; case 699: options("Who are you?", "Good day."); @@ -238,13 +240,13 @@ public class TheLadyOfTheLake extends DialoguePlugin { break; case 2: player("Good day."); - stage = 999; + stage = END_DIALOGUE; break; } break; case 720: npc("I am the Lady of the Lake."); - stage = 999; + stage = END_DIALOGUE; break; } return true; diff --git a/Server/src/main/java/core/game/node/entity/skill/fletching/Fletching.java b/Server/src/main/java/core/game/node/entity/skill/fletching/Fletching.java index 1a1a54bc8..ebd0855d4 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fletching/Fletching.java +++ b/Server/src/main/java/core/game/node/entity/skill/fletching/Fletching.java @@ -154,10 +154,10 @@ public class Fletching { this.animation = animation; switch(indicator & 0xFF){ case 1: - this.string = 1777; + this.string = org.rs09.consts.Items.BOW_STRING_1777; break; case 2: - this.string = 9438; + this.string = org.rs09.consts.Items.CROSSBOW_STRING_9438; break; } } diff --git a/Server/src/main/java/core/tools/RandomFunction.java b/Server/src/main/java/core/tools/RandomFunction.java index a49afc297..28c5e0df0 100644 --- a/Server/src/main/java/core/tools/RandomFunction.java +++ b/Server/src/main/java/core/tools/RandomFunction.java @@ -97,6 +97,10 @@ public class RandomFunction { return RANDOM.nextInt(maxValue); } + public static final double randomDouble(double maxValue) { + return ThreadLocalRandom.current().nextDouble(0.0,maxValue); + } + public static final double randomDouble(double min, double max){ return ThreadLocalRandom.current().nextDouble(min,max); } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyHandler.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyHandler.kt index 7520e0a3c..978386ac4 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyHandler.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyHandler.kt @@ -1,46 +1,23 @@ package rs09.game.content.ame.events import core.game.component.Component -import core.game.content.quest.PluginInteraction -import core.game.content.quest.PluginInteractionManager -import core.game.interaction.DestinationFlag -import core.game.interaction.MovementPulse -import core.game.interaction.Option -import core.game.node.entity.npc.NPC -import core.game.node.entity.player.Player -import rs09.game.world.GameWorld import core.plugin.Initializable -import core.plugin.Plugin +import org.rs09.consts.NPCs +import rs09.game.interaction.InteractionListener -@Initializable -class SandwichLadyHandler : PluginInteraction(3117){ - override fun handle(player: Player?, npc: NPC?, option: Option?): Boolean { - class MoveTo : MovementPulse(player,DestinationFlag.ENTITY.getDestination(player,npc)){ - override fun pulse(): Boolean { - if(player?.antiMacroHandler?.hasEvent()!! && player.antiMacroHandler.event.name == "Sandwich Lady") { - player.interfaceManager?.open(Component(297)) - npc?.clear() - } else { - player.sendMessage("She isn't interested in you.") - } - return true +class SandwichLadyHandler : InteractionListener(){ + + val SANDWICH_LADY = NPCs.SANDWICH_LADY_3117 + override fun defineListeners() { + + on(NPC,SANDWICH_LADY,"talk-to"){player, node -> + if(player.antiMacroHandler?.hasEvent()!! && player.antiMacroHandler.event.name == "Sandwich Lady") { + player.interfaceManager?.open(Component(297)) + node.asNpc().clear() + } else { + player.sendMessage("She isn't interested in you.") } + return@on true } - - if(option?.name?.toLowerCase() == "talk-to"){ - GameWorld.submit(MoveTo()) - return true - } - return false } - - override fun fireEvent(identifier: String?, vararg args: Any?): Any { - return Unit - } - - override fun newInstance(arg: Any?): Plugin { - PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.NPC) - return this - } - } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyInterface.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyInterface.kt index f3cb3be1d..1d1a3b863 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyInterface.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/SandwichLadyInterface.kt @@ -1,17 +1,13 @@ package rs09.game.content.ame.events -import core.game.component.Component -import core.game.component.ComponentDefinition -import core.game.component.ComponentPlugin -import core.game.node.entity.player.Player import core.game.node.item.GroundItemManager import core.game.node.item.Item -import core.plugin.Initializable -import core.plugin.Plugin import org.rs09.consts.Items +import rs09.game.interaction.InterfaceListener -@Initializable -class SandwichLadyInterface : ComponentPlugin(){ +class SandwichLadyInterface : InterfaceListener(){ + + val SANDWICH_INTERFACE = 297 val baguette = Items.BAGUETTE_6961 val triangle_sandwich = Items.TRIANGLE_SANDWICH_6962 val sandwich = Items.SQUARE_SANDWICH_6965 @@ -20,29 +16,27 @@ class SandwichLadyInterface : ComponentPlugin(){ val kebab = Items.KEBAB_1971 val chocobar = Items.CHOCOLATE_BAR_1973 - override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { - var item = Item(0) - when(button) { - 7 -> {item = Item(baguette)} - 8 -> {item = Item(triangle_sandwich)} - 9 -> {item = Item(sandwich)} - 10 -> {item = Item(roll)} - 11 -> {item = Item(pie)} - 12 -> {item = Item(kebab)} - 13 -> {item = Item(chocobar)} - } - if(item.id != 0){ - player?.let { if(it.inventory.add(item)) else GroundItemManager.create(item,it) } - player?.interfaceManager?.close() - player?.antiMacroHandler?.event?.terminate() - return true - } - return false - } + override fun defineListeners() { + on(SANDWICH_INTERFACE){player, _, _, buttonID, _, _ -> + val item = + when(buttonID) { + 7 -> {Item(baguette)} + 8 -> {Item(triangle_sandwich)} + 9 -> {Item(sandwich)} + 10 -> {Item(roll)} + 11 -> {Item(pie)} + 12 -> {Item(kebab)} + 13 -> {Item(chocobar)} + else -> {Item(baguette)} + } - override fun newInstance(arg: Any?): Plugin { - ComponentDefinition.put(297,this) - return this - } + if(!player.inventory.add(item)){ + GroundItemManager.create(item,player) + } + player.interfaceManager.close() + player.antiMacroHandler.event.terminate() + return@on true + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt b/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt new file mode 100644 index 000000000..cce744d0a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt @@ -0,0 +1,41 @@ +package rs09.game.content.global + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items + +private val CHARMS = intArrayOf(Items.CRIMSON_CHARM_12160,Items.BLUE_CHARM_12163,Items.GREEN_CHARM_12159,Items.GOLD_CHARM_12158) +class NPCDropTable : WeightBasedTable() { + val charmDrops = WeightBasedTable() + + override fun add(element: WeightedItem): Boolean { + return if(CHARMS.contains(element.id)) charmDrops.add(element) + else super.add(element) + } + + override fun roll(player: Player): ArrayList { + val items= ArrayList(3) + var tempWeight = RandomFunction.randomDouble(totalWeight) + items.addAll(guaranteedItems.map { it.getItem() }.toList()) + + if(RandomFunction.random(1,15) == 5){ + items.addAll(charmDrops.roll(player)) + } + if(size == 1){ + items.add(get(0).getItem()) + return items + } + if(isNotEmpty()) { + for (item in shuffled()) { + tempWeight -= item.weight + if (tempWeight <= 0) { + items.add(item.getItem()) + break + } + } + } + return items + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt b/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt index 36af62442..c1499796d 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt @@ -2,8 +2,9 @@ package rs09.game.content.global import core.game.node.entity.player.Player import core.game.node.item.Item +import core.tools.RandomFunction -class WeightBasedTable : ArrayList() { +open class WeightBasedTable : ArrayList() { var totalWeight = 0.0 val guaranteedItems = ArrayList(5) @@ -13,9 +14,9 @@ class WeightBasedTable : ArrayList() { else super.add(element) } - fun roll(player: Player): ArrayList{ + open fun roll(player: Player): ArrayList{ val items= ArrayList(3) - var tempWeight = totalWeight + var tempWeight = RandomFunction.randomDouble(totalWeight) items.addAll(guaranteedItems.map { it.getItem() }.toList()) if(player.inventory.isFull){ @@ -34,7 +35,7 @@ class WeightBasedTable : ArrayList() { return items } - fun canRoll(player: Player): Boolean{ + open fun canRoll(player: Player): Boolean{ val guaranteed = guaranteedItems.map { it.getItem() }.toTypedArray() return (player.inventory.hasSpaceFor(*guaranteed) && guaranteed.isNotEmpty()) || !player.inventory.isFull } diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thelosttribe/DukeHoracioTLTDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thelosttribe/DukeHoracioTLTDialogue.kt index 1197af14c..cc618874c 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thelosttribe/DukeHoracioTLTDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thelosttribe/DukeHoracioTLTDialogue.kt @@ -113,7 +113,7 @@ class DukeHoracioTLTDialogue(val questStage: Int) : DialogueFile() { } } - else if(stage == 44){ + else if(questStage == 44){ when(stage){ START_DIALOGUE -> player( "I spoke to the goblin generals in the goblin village. They", diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/fletching/FletchingListeners.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/fletching/FletchingListeners.kt index af56ba045..97dde77f3 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/fletching/FletchingListeners.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/fletching/FletchingListeners.kt @@ -35,7 +35,7 @@ class FletchingListeners : InteractionListener() { val UNFINISHED_ARROWS = Fletching.ArrowHeads.values().map(Fletching.ArrowHeads::unfinished).toIntArray() val FEATHERS = intArrayOf(FEATHER_314,STRIPY_FEATHER_10087,RED_FEATHER_10088,BLUE_FEATHER_10089,YELLOW_FEATHER_10090,ORANGE_FEATHER_10091) val UNSTRUNG_BOWS = Fletching.String.values().map(Fletching.String::unfinished).toIntArray() - val STRINGS = intArrayOf(Items.BOW_STRING_1777,Items.SINEW_9436) + val STRINGS = intArrayOf(Items.BOW_STRING_1777,Items.CROSSBOW_STRING_9438) override fun defineListeners() {