Files
2009scape/Server/src/main/content/global/skill/farming/UseWithPatchHandler.kt
T
2023-05-07 07:22:34 +00:00

259 lines
13 KiB
Kotlin

package content.global.skill.farming
import core.api.*
import core.game.node.entity.player.link.diary.DiaryType
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 org.rs09.consts.Items
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
class UseWithPatchHandler : InteractionListener {
val RAKE = Items.RAKE_5341
val SEED_DIBBER = Items.SEED_DIBBER_5343
val SPADE = Items.SPADE_952
val SECATEURS = Items.SECATEURS_5329
val MAGIC_SECATEURS = Items.MAGIC_SECATEURS_7409
val TROWEL = Items.GARDENING_TROWEL_5325
val pourBucketAnim = Animation(2283)
val wateringCanAnim = Animation(2293)
val plantCureAnim = Animation(2288)
val secateursTreeAnim = Animation(2277)
val magicSecateursTreeAnim = Animation(3340)
@JvmField
val allowedNodes = ArrayList<Int>()
val patches = ArrayList<Int>()
override fun defineListeners() {
loadNodes()
onUseWith(IntType.SCENERY, allowedNodes.toIntArray(), *patches.toIntArray()) { player, used, with ->
val patch = FarmingPatch.forObject(with.asScenery()) ?: return@onUseWith true
val usedItem = used.asItem()
player.faceLocation(with.location)
when(usedItem.id){
RAKE -> PatchRaker.rake(player,patch)
SEED_DIBBER -> player.sendMessage("I should plant a seed, not the seed dibber.")
SPADE -> player.dialogueInterpreter.open(67984003,patch.getPatchFor(player)) //DigUpPatchDialogue.kt
SECATEURS, MAGIC_SECATEURS -> {
val p = patch.getPatchFor(player)
if(patch.type == PatchType.TREE) {
if(p.isDiseased && !p.isDead) {
player.pulseManager.run(object: Pulse(){
override fun pulse(): Boolean {
if (usedItem.id == SECATEURS ) player.animator.animate(secateursTreeAnim) else player.animator.animate(magicSecateursTreeAnim)
p.cureDisease()
return true
}
})
} else if(p.plantable == Plantable.WILLOW_SAPLING && p.harvestAmt > 0) {
val pulse = CropHarvester.harvestPulse(player, with, Items.WILLOW_BRANCH_5933) ?: return@onUseWith false
player.pulseManager.run(pulse)
}
}
}
TROWEL, Items.PLANT_POT_5350 -> {
if(!player.inventory.containsAtLeastOneItem(TROWEL)) {
player.sendMessage("You need a trowel to fill plant pots with dirt.")
return@onUseWith true
}
val p = patch.getPatchFor(player)
if(!p.isWeedy()){
player.sendMessage("This patch has something growing in it.")
return@onUseWith true
} else if (p.currentGrowthStage != 3){
player.sendMessage("I should clear this of weeds before trying to take some dirt.")
return@onUseWith true
}
val potAmount = player.inventory.getAmount(Items.PLANT_POT_5350)
if(potAmount == 0){
player.sendMessage("You have no plant pots to fill.")
return@onUseWith true
}
val anim = Animation(2272)
player.pulseManager.run(object : Pulse(anim.duration){
override fun pulse(): Boolean {
if(player.inventory.remove(Item(Items.PLANT_POT_5350))){
player.animator.animate(anim)
player.inventory.add(Item(Items.PLANT_POT_5354))
} else return true
return false
}
})
}
Items.PLANT_CURE_6036 -> {
val p = patch.getPatchFor(player)
if(p.isDiseased && !p.isDead){
player.pulseManager.run(object: Pulse(){
override fun pulse(): Boolean {
player.animator.animate(plantCureAnim)
player.audioManager.send(2438)
if(player.inventory.remove(usedItem)){
player.inventory.add(Item(Items.VIAL_229))
p.cureDisease()
}
return true
}
})
} else {
player.sendMessage("I have no reason to do this right now.")
}
}
Items.WATERING_CAN1_5333,Items.WATERING_CAN2_5334,Items.WATERING_CAN3_5335,Items.WATERING_CAN4_5336,Items.WATERING_CAN5_5337,Items.WATERING_CAN6_5338,Items.WATERING_CAN7_5339,Items.WATERING_CAN8_5340 -> {
val p = patch.getPatchFor(player)
val t = p.patch.type
if(!p.isWatered && p.plantable != Plantable.SCARECROW && (t == PatchType.ALLOTMENT || t == PatchType.FLOWER || t == PatchType.HOPS) && !p.isGrown()){
player.pulseManager.run(object : Pulse(){
override fun pulse(): Boolean {
if(p.isWeedy()){
player.sendMessage("You should grow something first.")
return true
}
player.animator.animate(wateringCanAnim)
player.audioManager.send(2446)
if(player.inventory.remove(usedItem)){
player.inventory.add(Item(usedItem.id.getNext()))
p.water()
}
return true
}
})
}
}
Items.SUPERCOMPOST_6034, Items.COMPOST_6032 -> {
val p = patch.getPatchFor(player)
if(p.compost == CompostType.NONE) {
player.animator.animate(pourBucketAnim)
player.audioManager.send(2427)
player.pulseManager.run(object : Pulse(){
override fun pulse(): Boolean {
if(player.inventory.remove(usedItem,false)){
p.compost = if(usedItem.id == Items.SUPERCOMPOST_6034) CompostType.SUPER else CompostType.NORMAL
if(p.compost == CompostType.SUPER) rewardXP(player, Skills.FARMING, 26.0) else rewardXP(player, Skills.FARMING, 18.5)
if(p.plantable != null && p.plantable?.applicablePatch != PatchType.FLOWER) {
p.harvestAmt += if(p.compost == CompostType.NORMAL) 1 else if(p.compost == CompostType.SUPER) 2 else 0
}
p.cropLives += if(p.compost == CompostType.SUPER) 2 else 1
player.inventory.add(Item(Items.BUCKET_1925))
}
return true
}
})
} else {
player.sendMessage("This patch has already been treated with compost.")
}
}
else -> {
val plantable = Plantable.forItemID(usedItem.id) ?: return@onUseWith false
if(plantable.applicablePatch != patch.type){
player.sendMessage("You can't plant that seed in this patch.")
return@onUseWith true
}
if(plantable.requiredLevel > player.skills.getLevel(Skills.FARMING)){
player.sendMessage("You need a Farming level of ${plantable.requiredLevel} to plant this.")
return@onUseWith true
}
val p = patch.getPatchFor(player)
if(p.getCurrentState() < 3 && p.isWeedy()){
player.sendMessage("You must weed your patch before you can plant a seed in it.")
return@onUseWith true
} else if(p.getCurrentState() > 3){
player.sendMessage("There is already something growing in this patch.")
return@onUseWith true
}
val plantItem =
if(patch.type == PatchType.ALLOTMENT) Item(plantable.itemID,3) else if(patch.type == PatchType.HOPS){
if(plantable == Plantable.JUTE_SEED) Item(plantable.itemID,3) else Item(plantable.itemID,4)
} else {
Item(plantable.itemID,1)
}
if(patch.type == PatchType.ALLOTMENT){
if(!player.inventory.containsItem(plantItem)){
player.sendMessage("You need 3 seeds to plant an allotment patch.")
return@onUseWith true
}
}
if(patch.type != PatchType.FRUIT_TREE && patch.type != PatchType.TREE){
if(!player.inventory.contains(Items.SEED_DIBBER_5343,1)){
player.sendMessage("You need a seed dibber to plant that.")
return@onUseWith true
}
} else {
if(!player.inventory.contains(Items.SPADE_952,1)){
player.sendMessage("You need a spade to plant that.")
return@onUseWith true
}
}
player.lock()
if(player.inventory.remove(plantItem)) {
player.animator.animate(Animation(2291))
player.audioManager.send(2432)
player.pulseManager.run(object : Pulse(3) {
override fun pulse(): Boolean {
if(plantable == Plantable.JUTE_SEED && patch == FarmingPatch.MCGRUBOR_HOPS && !player.achievementDiaryManager.hasCompletedTask(DiaryType.SEERS_VILLAGE,0,7)){
player.achievementDiaryManager.finishTask(player,DiaryType.SEERS_VILLAGE,0,7)
}
p.plant(plantable)
player.skills.addExperience(Skills.FARMING, plantable.plantingXP)
p.setNewHarvestAmount()
if(p.patch.type == PatchType.TREE || p.patch.type == PatchType.FRUIT_TREE){
player.inventory.add(Item(Items.PLANT_POT_5350))
}
player.unlock()
return true
}
})
}
}
}
return@onUseWith true
}
}
fun loadNodes(){
patches.addAll(8550..8557) //allotment wrappers
patches.addAll(7847..7853) //flower patch wrappers
patches.addAll(8150..8156) //herb patch wrappers
patches.addAll(8388..8391) // Tree patches
patches.add(19147) //Tree patch
patches.addAll(7962..7965) //fruit trees
patches.addAll(8173..8176) //hops
patches.addAll(7577..7580) //bush
patches.add(23760) //evil turnip
patches.add(7572) //belladonna
patches.add(8337) //mushroom
patches.add(27197) //jade vine
patches.add(7771) //cactus
patches.add(7807) //calquat
patches.addAll(8382..8383)//spirit trees
patches.add(8338) //spirit tree
patches.add(18816) //death plateau wrapper
for(p in Plantable.values()){
allowedNodes.add(p.itemID)
}
allowedNodes.addAll(arrayListOf(RAKE,SEED_DIBBER,SPADE,SECATEURS,MAGIC_SECATEURS,TROWEL,Items.SUPERCOMPOST_6034,Items.COMPOST_6032,Items.PLANT_CURE_6036,Items.WATERING_CAN1_5333,Items.WATERING_CAN2_5334,Items.WATERING_CAN3_5335,Items.WATERING_CAN4_5336,Items.WATERING_CAN5_5337,Items.WATERING_CAN6_5338,Items.WATERING_CAN7_5339,Items.WATERING_CAN8_5340, Items.PLANT_POT_5350))
}
private fun Int.getNext(): Int {
if(this == Items.WATERING_CAN1_5333) return Items.WATERING_CAN_5331
else return this - 1
}
}