diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/BarbFishOptionListeners.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/BarbFishOptionListeners.kt new file mode 100644 index 000000000..02f64f548 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/BarbFishOptionListeners.kt @@ -0,0 +1,30 @@ +package rs09.game.node.entity.skill.fishing.barbfishing + +import core.game.node.item.Item +import rs09.game.interaction.OptionListener + +class BarbFishOptionListeners : OptionListener() { + override fun defineListeners() { + + on(25268,OBJECT,"search"){player,_ -> + if(player.getAttribute("barbtraining:fishing",false) == true){ + if(!player.inventory.containsItem(Item(11323))){ + player.inventory.add(Item(11323)) + player.sendMessage("Under the bed you find a fishing rod.") + } else { + player.sendMessage("You find nothing under the bed") + } + } else { + player.sendMessage("Maybe I should speak to Otto before looking under his bed.") + } + return@on true + } + + on(1176,NPC,"fish"){player,_ -> + player.pulseManager.run(BarbFishingPulse(player)) + player.sendMessage("You attempt to catch a fish...") + return@on true + } + + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/BarbFishingPulse.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/BarbFishingPulse.kt new file mode 100644 index 000000000..7d3b09700 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/BarbFishingPulse.kt @@ -0,0 +1,98 @@ +package rs09.game.node.entity.skill.fishing.barbfishing + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.skill.SkillPulse +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.tools.RandomFunction +import rs09.tools.Items +import rs09.tools.stringtools.colorize + +/** + * Pulse used for barbarian fishing + * @author Ceikry + */ +class BarbFishingPulse(player: Player) : SkillPulse(player,NPC(1176)) { + override fun checkRequirements(): Boolean { + /*if(player.getAttribute("barbtraining:fishing:completed",false) == false){ + player.sendMessage(colorize("%RYou need to complete barbarian fishing training to fish here.")) + return false + }*/ + if(player.skills.getLevel(Skills.FISHING) < 48){ + player.sendMessage(colorize("%RYou need a fishing level of at least 48 to fish here.")) + return false + } + if(player.skills.getLevel(Skills.AGILITY) < 15 || player.skills.getLevel(Skills.STRENGTH) < 15){ + player.sendMessage(colorize("%RYou need a strength and agility level of at least 15 to fish here.")) + return false + } + if(!player.inventory.containsItem(Item(11323))){ + player.sendMessage(colorize("%RYou need a barbarian fishing rod to fish here.")) + return false + } + if(player.inventory.isFull){ + player.sendMessage("You don't have enough space in your inventory.") + return false + } + if(!(player.inventory.containsItem(Item(Items.FEATHER_314)) || player.inventory.containsItem(Item(Items.FISH_OFFCUTS_11334)))){ + player.sendMessage("You don't have any bait with which to fish.") + return false + } + return true + } + + override fun animate() { + player.animator.animate(Animation(622)) + } + + override fun reward(): Boolean { + val stragiXP = arrayOf(5,6,7) + val fishXP = arrayOf(50,70,80) + val reward = getRandomFish() + val success = rollSuccess(when(reward){ + Item(11328) -> 48 + Item(11330) -> 58 + Item(11332) -> 70 + else -> 99 + }) + val index = (when(reward){ + Item(11328) -> 0 + Item(11330) -> 1 + Item(11332) -> 2 + else -> 0 + }) + if(success){ + if(!player.inventory.remove(Item(Items.FISH_OFFCUTS_11334))) { + player.inventory.remove(Item(Items.FEATHER_314)) + } + player.inventory.add(reward) + player.skills.addExperience(Skills.FISHING,fishXP[index].toDouble()) + player.skills.addExperience(Skills.AGILITY,stragiXP[index].toDouble()) + player.skills.addExperience(Skills.STRENGTH,stragiXP[index].toDouble()) + player.sendMessage("You manage to catch a ${reward.name.toLowerCase()}.") + } + super.setDelay(5) + return player.inventory.freeSlots() == 0 + } + + fun rollSuccess(fish: Int): Boolean{ + val level = 1 + player.skills.getLevel(Skills.FISHING) + player.familiarManager.getBoost(Skills.FISHING) + val hostRatio: Double = Math.random() * fish + val clientRatio: Double = Math.random() * (level * 3.0 - fish) + return hostRatio < clientRatio + } + + fun getRandomFish(): Item{ + val fish = arrayOf(11328,11330,11332) + val fishing = player.skills.getLevel(Skills.FISHING) + val strength = player.skills.getLevel(Skills.STRENGTH) + val agility = player.skills.getLevel(Skills.AGILITY) + var possibleIndex = 0 + if(fishing >= 58 && (strength >= 30 && agility >= 30)) possibleIndex++ + if(fishing >= 70 && (strength >= 45 && agility >= 45)) possibleIndex++ + return Item(fish[RandomFunction.random(possibleIndex + 1)]) + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/FishCuttingPulse.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/FishCuttingPulse.kt new file mode 100644 index 000000000..6b72ec968 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/FishCuttingPulse.kt @@ -0,0 +1,45 @@ +package rs09.game.node.entity.skill.fishing.barbfishing + +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import rs09.tools.Items + +/** + * Pulse used for cutting fish into fish offcuts + * @param player the player running the pulse + * @param fish the fish being cut + * @author Ceikry + */ +class FishCuttingPulse(val player: Player, val fish: Int) : Pulse(0){ + fun checkRequirements(): Boolean { + if(!(player.inventory.freeSlots() >= 2 || (player.inventory.freeSlots() >= 1 && player.inventory.containsItem(Item(Items.FISH_OFFCUTS_11334))))){ + player.sendMessage("You do not have enough space to do that.") + return false + } + return true + } + + override fun pulse(): Boolean { + player.animator.animate(Animation(1248)) + player.inventory.remove(Item(fish)) + + player.inventory.add(Item(Items.FISH_OFFCUTS_11334)) + + player.inventory.add(Item(when(fish){ + 11328, 11330 -> Items.ROE_11324 + 11332 -> Items.CAVIAR_11326 + else -> 0 + })) + + player.skills.addExperience(Skills.COOKING,when(fish){ + 11328,11330 -> 10.0 + 11332 -> 15.0 + else -> 0.0 + }) + + return true + } +} diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/KnifeWithFish.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/KnifeWithFish.kt new file mode 100644 index 000000000..5d8670357 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/KnifeWithFish.kt @@ -0,0 +1,26 @@ +package rs09.game.node.entity.skill.fishing.barbfishing + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.plugin.Initializable +import core.plugin.Plugin +import rs09.tools.Items + +@Initializable +/** + * Handles using a knife with barbarian fishing fish + * @author Ceikry + */ +class KnifeWithFish : UseWithHandler(11328,11330,11332){ + override fun handle(event: NodeUsageEvent?): Boolean { + event?.player ?: return false + event.player.pulseManager.run(FishCuttingPulse(event.player,event.usedItem.id)) + return true + } + + override fun newInstance(arg: Any?): Plugin { + addHandler(Items.KNIFE_946, ITEM_TYPE,this) + return this + } + +} diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/SpotManager.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/SpotManager.kt new file mode 100644 index 000000000..0039d76f2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/fishing/barbfishing/SpotManager.kt @@ -0,0 +1,81 @@ +package rs09.game.node.entity.skill.fishing.barbfishing + +import core.game.node.entity.npc.NPC +import core.game.world.map.Location +import core.plugin.CorePluginTypes.ManagerPlugin +import core.plugin.CorePluginTypes.Managers +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction +import rs09.game.node.entity.skill.fishing.barbfishing.SpotManager.Companion.locations +import rs09.game.node.entity.skill.fishing.barbfishing.SpotManager.Companion.usedLocations + +@Initializable +/** + * Manages fishing spot spawning and relocation + * @author Ceikry + */ +class SpotManager : ManagerPlugin() { + var ticks = 0 + val spots = ArrayList() + + companion object{ + val usedLocations = arrayListOf() + val locations = listOf( + Location.create(2506, 3494, 0), + Location.create(2504, 3497, 0), + Location.create(2504, 3497, 0), + Location.create(2500, 3506, 0), + Location.create(2500, 3509, 0), + Location.create(2500, 3512, 0), + Location.create(2504, 3516, 0) + ) + } + + override fun tick() { + if(ticks % 50 == 0){ + usedLocations.clear() + for(spot in spots) usedLocations.add(spot.loc ?: Location(0,0,0)) + } + } + + override fun newInstance(arg: Any?): Plugin { + for(i in 0 until 5){ + spots.add(BarbFishingSpot(getNewLoc(), getNewTTL()).also { it.init() }) + } + Managers.register(this) + return this + } +} + +fun getNewTTL(): Int{ + return RandomFunction.random(400,2000) +} + +fun getNewLoc(): Location { + var loc = locations.random() + while(usedLocations.contains(loc)) loc = locations.random() + usedLocations.add(loc) + return loc +} + +class BarbFishingSpot(var loc: Location? = null, var ttl: Int) : NPC(1176){ + init { + location = loc + } + val locations = listOf( + Location.create(2506, 3494, 0), + Location.create(2504, 3497, 0), + Location.create(2504, 3497, 0), + Location.create(2500, 3506, 0), + Location.create(2500, 3509, 0), + Location.create(2500, 3512, 0), + Location.create(2504, 3516, 0) + ) + override fun handleTickActions() { + if(location != loc) properties.teleportLocation = loc.also { ttl = getNewTTL() } + if(ttl-- <= 0){ + loc = getNewLoc() + } + } +}