mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-09 16:45:44 -07:00
Implemented Evil Bob's Island random event
Added admin command ::bob to start random event
This commit is contained in:
parent
31e865759e
commit
604925f513
13 changed files with 613 additions and 9 deletions
|
|
@ -85,7 +85,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"item_id": "303",
|
"item_id": "303",
|
||||||
"loc_data": "{1,3245,3155,0,10485900}-{1,3244,3159,0,10485900}"
|
"loc_data": "{1,3245,3155,0,10485900}-{1,3244,3159,0,10485900}-{1,3429,4784,0,75}-{1,3432,4783,0,75}-{1,3414,4768,0,75}-{1,3429,4769,0,75}-{1,3431,4772,0,75}-{1,3415,4786,0,75}-{1,3412,4784,0,75}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"item_id": "305",
|
"item_id": "305",
|
||||||
|
|
|
||||||
|
|
@ -1239,7 +1239,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "411",
|
"id": "411",
|
||||||
"borders": "{2496,4736,2559,4799}"
|
"borders": "{3403,4761,3442,4792}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "412",
|
"id": "412",
|
||||||
|
|
|
||||||
|
|
@ -24390,7 +24390,7 @@
|
||||||
"attack_level": "1"
|
"attack_level": "1"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"examine": "Hey",
|
"examine": "Hey, it's Bob the cat! Or... is it?",
|
||||||
"melee_animation": "0",
|
"melee_animation": "0",
|
||||||
"range_animation": "0",
|
"range_animation": "0",
|
||||||
"defence_animation": "0",
|
"defence_animation": "0",
|
||||||
|
|
|
||||||
|
|
@ -4787,6 +4787,14 @@
|
||||||
"npc_id": "2462",
|
"npc_id": "2462",
|
||||||
"loc_data": "{2596,4773,0,1,2}-{2602,4771,0,1,6}-{2596,4780,0,1,4}"
|
"loc_data": "{2596,4773,0,1,2}-{2602,4771,0,1,6}-{2596,4780,0,1,4}"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"npc_id": "2479",
|
||||||
|
"loc_data": "{3420,4777,0,0,0}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"npc_id": "2481",
|
||||||
|
"loc_data": "{3423,4777,0,0,5}"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"npc_id": "2482",
|
"npc_id": "2482",
|
||||||
"loc_data": "{3057,3902,0,1,3}"
|
"loc_data": "{3057,3902,0,1,3}"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import org.rs09.consts.Items
|
||||||
import content.global.ame.events.MysteriousOldManNPC
|
import content.global.ame.events.MysteriousOldManNPC
|
||||||
import content.global.ame.events.certer.CerterNPC
|
import content.global.ame.events.certer.CerterNPC
|
||||||
import content.global.ame.events.drilldemon.SeargentDamienNPC
|
import content.global.ame.events.drilldemon.SeargentDamienNPC
|
||||||
|
import content.global.ame.events.evilbob.EvilBobNPC
|
||||||
import content.global.ame.events.evilchicken.EvilChickenNPC
|
import content.global.ame.events.evilchicken.EvilChickenNPC
|
||||||
import content.global.ame.events.freakyforester.FreakyForesterNPC
|
import content.global.ame.events.freakyforester.FreakyForesterNPC
|
||||||
import content.global.ame.events.genie.GenieNPC
|
import content.global.ame.events.genie.GenieNPC
|
||||||
|
|
@ -40,6 +41,7 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
|
||||||
)),
|
)),
|
||||||
DRILL_DEMON(npc = SeargentDamienNPC()),
|
DRILL_DEMON(npc = SeargentDamienNPC()),
|
||||||
EVIL_CHICKEN(npc = EvilChickenNPC()),
|
EVIL_CHICKEN(npc = EvilChickenNPC()),
|
||||||
|
EVIL_BOB(npc = EvilBobNPC(), skillId = Skills.FISHING),
|
||||||
SURPRISE_EXAM(npc = MysteriousOldManNPC(), type = "sexam"),
|
SURPRISE_EXAM(npc = MysteriousOldManNPC(), type = "sexam"),
|
||||||
FREAKY_FORESTER(npc = FreakyForesterNPC(), skillId = Skills.WOODCUTTING),
|
FREAKY_FORESTER(npc = FreakyForesterNPC(), skillId = Skills.WOODCUTTING),
|
||||||
TREE_SPIRIT(npc = TreeSpiritRENPC(), skillId = Skills.WOODCUTTING),
|
TREE_SPIRIT(npc = TreeSpiritRENPC(), skillId = Skills.WOODCUTTING),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,109 @@
|
||||||
|
package content.global.ame.events.evilbob
|
||||||
|
|
||||||
|
import content.global.ame.events.evilbob.EvilBobUtils.giveEventFishingSpot
|
||||||
|
import core.api.*
|
||||||
|
import core.game.dialogue.DialogueFile
|
||||||
|
import core.game.dialogue.FacialExpression
|
||||||
|
import core.game.node.entity.npc.NPC
|
||||||
|
import core.tools.END_DIALOGUE
|
||||||
|
import org.rs09.consts.Items
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
|
||||||
|
class EvilBobDialogue : DialogueFile() {
|
||||||
|
override fun handle(componentID: Int, buttonID: Int) {
|
||||||
|
npc = NPC(NPCs.EVIL_BOB_2479)
|
||||||
|
if (getAttribute(player!!, EvilBobUtils.assignedFishingZone, "none") == "none") giveEventFishingSpot(player!!)
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
if (getAttribute(player!!, EvilBobUtils.eventComplete, false)) {
|
||||||
|
sendDialogue(player!!, "Evil Bob appears to be sleeping, best not to wake him up.").also { stage = END_DIALOGUE }
|
||||||
|
} else if (removeItem(player!!, Items.RAW_FISHLIKE_THING_6200)) {
|
||||||
|
setAttribute(player!!, EvilBobUtils.fishCaught, false)
|
||||||
|
playerl(FacialExpression.NEUTRAL, "Here, I've brought you some fish.").also { stage = 500 }
|
||||||
|
} else if (removeItem(player!!, Items.RAW_FISHLIKE_THING_6204)) {
|
||||||
|
setAttribute(player!!, EvilBobUtils.fishCaught, false)
|
||||||
|
setAttribute(player!!, EvilBobUtils.attentive, true)
|
||||||
|
setAttribute(player!!, EvilBobUtils.attentiveNewSpot, true)
|
||||||
|
playerl(FacialExpression.NEUTRAL, "Here, I've brought you some fish.").also { stage = 600 }
|
||||||
|
} else if (inInventory(player!!, Items.FISHLIKE_THING_6202) || inInventory(player!!, Items.FISHLIKE_THING_6206)) {
|
||||||
|
npcl(FacialExpression.CHILD_NORMAL, "What, are you giving me cooked fish? What am I going to do with that? Uncook it first!").also { stage = 700 }
|
||||||
|
} else if (!getAttribute(player!!, EvilBobUtils.startingDialogueSeen, false)) {
|
||||||
|
playerl(FacialExpression.ASKING, "Huh?").also { stage = 800 }
|
||||||
|
setAttribute(player!!, EvilBobUtils.startingDialogueSeen, true)
|
||||||
|
} else playerl(FacialExpression.ANNOYED, "Let me out of here!").also { stage++ }
|
||||||
|
}
|
||||||
|
1 -> npcl(FacialExpression.CHILD_NORMAL, "I will never let you go, ${player!!.username}!").also { stage++ }
|
||||||
|
2 -> options("Why not?", "What's it all about?", "How is it possible that you're talking?", "What did you do to Bob?").also { stage++ }
|
||||||
|
3 -> when (buttonID) {
|
||||||
|
1 -> playerl(FacialExpression.ASKING, "Why not?").also { stage = 100 }
|
||||||
|
2 -> playerl(FacialExpression.ASKING, "What's it all about?").also { stage = 200 }
|
||||||
|
3 -> playerl(FacialExpression.ASKING, "How is it possible that you're talking?").also { stage = 300 }
|
||||||
|
4 -> playerl(FacialExpression.ASKING, "What did you do to Bob?").also { stage = 400 }
|
||||||
|
}
|
||||||
|
|
||||||
|
100 -> npcl(FacialExpression.CHILD_NORMAL, "Uhm...").also { stage++ }
|
||||||
|
101 -> npcl(FacialExpression.CHILD_NORMAL, "Because I say so! And because I can never have enough servants!").also { stage++ }
|
||||||
|
102 -> npcl(FacialExpression.CHILD_NORMAL, "Now catch me some fish, I'm hungry.").also { stage++ }
|
||||||
|
103 -> playerl(FacialExpression.ASKING, "What fish, where?").also { stage++ }
|
||||||
|
104 -> npcl(FacialExpression.CHILD_NORMAL, "Talk to my other servants, and hurry it up!").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
200 -> npcl(FacialExpression.CHILD_NORMAL, "Sit down and I'll tell you. It's a question of servant shortage.").also { stage++ }
|
||||||
|
201 -> playerl(FacialExpression.NEUTRAL, "Go on.").also { stage++ }
|
||||||
|
202 -> npcl(FacialExpression.CHILD_NORMAL, "You are a skilled worker. A human like you is worth a great deal as a slave.").also { stage++ }
|
||||||
|
203 -> playerl(FacialExpression.ANGRY, "A slave?? I will have nothing to do with you. Is that clear? Absolutely nothing.").also { stage++ }
|
||||||
|
204 -> npcl(FacialExpression.CHILD_NORMAL, "Now be reasonable little human. It's just a matter of time before you will do everything I ask you to. Play along and this can be a very nice place.").also { stage++ }
|
||||||
|
205 -> playerl(FacialExpression.ANGRY, "I will not make any deals with you. I'm a human. I will not be pushed, numbered, meowed at, teleported or enslaved. My life is my own.").also { stage++ }
|
||||||
|
206 -> npcl(FacialExpression.CHILD_NORMAL, "Is it?").also { stage++ }
|
||||||
|
207 -> playerl(FacialExpression.ANNOYED, "Yes. You won't hold me.").also { stage++ }
|
||||||
|
208 -> npcl(FacialExpression.CHILD_NORMAL, "Won't I?").also { stage++ }
|
||||||
|
209 -> npcl(FacialExpression.CHILD_NORMAL, "Let me assure you there's no way out.").also { stage++ }
|
||||||
|
210 -> npcl(FacialExpression.CHILD_NORMAL, "Just ask my servants!").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
300 -> npcl(FacialExpression.CHILD_NORMAL, "How is it possible that you're not meowing?").also { stage++ }
|
||||||
|
301 -> playerl(FacialExpression.HALF_ASKING, "Meowing?? Why would I be meowing?").also { stage++ }
|
||||||
|
302 -> npcl(FacialExpression.CHILD_NORMAL, "Most humans do, that's why I'm wearing this amulet of Man speak... but I do try to train my staff in civilised speech.").also { stage++ }
|
||||||
|
303 -> npcl(FacialExpression.CHILD_NORMAL, "Ah, but I suppose things are slightly different in your world... what a dreadful place that must be.").also { stage++ }
|
||||||
|
304 -> playerl(FacialExpression.NEUTRAL, "I think I'm getting a headache...").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
400 -> npcl(FacialExpression.CHILD_NORMAL, "Bob? I am Bob!").also { stage++ }
|
||||||
|
401 -> npcl(FacialExpression.CHILD_NORMAL, "Oh, you mean the Bob in your world? Nothing. I am an incarnation of Bob here on Scape2009.").also { stage++ }
|
||||||
|
402 -> playerl(FacialExpression.NEUTRAL, "What, you mean this is... like some kind of mirror land?").also { stage++ }
|
||||||
|
403 -> npcl(FacialExpression.CHILD_NORMAL, " Something like that... somewhere in Scape2009 there must be a human servant called ${player!!.username}.").also { stage++ }
|
||||||
|
404 -> npcl(FacialExpression.CHILD_NORMAL, "But you work just as well for me! Now get to work, human! Fish for me!").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
500 ->{
|
||||||
|
if (getAttribute(player!!, EvilBobUtils.attentive , false)) stage = 505 else stage++
|
||||||
|
npcl(FacialExpression.CHILD_NORMAL, "Mmm, mmm...that's delicious.")
|
||||||
|
}
|
||||||
|
501 -> npcl(FacialExpression.CHILD_NORMAL, "Now, let me take...a little...catnap.").also { stage++ }
|
||||||
|
502 -> {
|
||||||
|
end()
|
||||||
|
setAttribute(player!!, EvilBobUtils.eventComplete, true)
|
||||||
|
findNPC(NPCs.EVIL_BOB_2479)!!.sendChat("ZZZzzz")
|
||||||
|
}
|
||||||
|
505 -> {
|
||||||
|
setAttribute(player!!, EvilBobUtils.attentive , false)
|
||||||
|
setAttribute(player!!, EvilBobUtils.attentiveNewSpot , true)
|
||||||
|
giveEventFishingSpot(player!!)
|
||||||
|
npcl(FacialExpression.CHILD_NORMAL, "Now get me another, you no-good human.").also { stage++ }
|
||||||
|
}
|
||||||
|
506 -> sendDialogue(player!!, "Evil Bob seems slightly less attentive of you.").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
600 -> npcl(FacialExpression.CHILD_NORMAL, "What was this? That was absolutely disgusting!").also { stage++ }
|
||||||
|
601 -> npcl(FacialExpression.CHILD_NORMAL, "Don't you know what kind of fish I like? Talk to my other servants for some advice.").also { stage++ }
|
||||||
|
602 -> sendDialogue(player!!, "Evil Bob seems more attentive of you.").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
700 -> playerl(FacialExpression.HALF_ASKING, "Errr... Uncook it?").also { stage++ }
|
||||||
|
701 -> npcl(FacialExpression.CHILD_NORMAL,"You heard me! There's the cold fire, by the trees, now get uncooking!").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
800 -> playerl(FacialExpression.ANGRY, "Where am I?").also { stage++ }
|
||||||
|
801 -> npcl(FacialExpression.CHILD_NORMAL, "On my island.").also { stage++ }
|
||||||
|
802 -> playerl(FacialExpression.ANGRY, "Who brought me here?").also { stage++ }
|
||||||
|
803 -> npcl(FacialExpression.CHILD_NORMAL, "That would be telling.").also { stage++ }
|
||||||
|
804 -> playerl(FacialExpression.ANGRY, "Take me to your leader!").also { stage++ }
|
||||||
|
805 -> npcl(FacialExpression.CHILD_NORMAL,"I am your leader, you are but a slave.").also { stage++ }
|
||||||
|
806 -> playerl(FacialExpression.ANGRY, "I am not a slave, I am a free man!").also { stage++ }
|
||||||
|
807 -> npcl(FacialExpression.CHILD_NORMAL, "Ah-ha-ha-ha-ha-ha!").also { stage = END_DIALOGUE }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
package content.global.ame.events.evilbob
|
||||||
|
|
||||||
|
import core.api.*
|
||||||
|
import core.game.dialogue.FacialExpression
|
||||||
|
import core.game.interaction.IntType
|
||||||
|
import core.game.interaction.InteractionListener
|
||||||
|
import core.game.node.entity.Entity
|
||||||
|
import core.game.node.entity.player.link.emote.Emotes
|
||||||
|
import core.game.system.task.Pulse
|
||||||
|
import core.game.world.map.Location
|
||||||
|
import core.game.world.map.zone.ZoneBorders
|
||||||
|
import core.game.world.map.zone.ZoneRestriction
|
||||||
|
import org.rs09.consts.Items
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
import org.rs09.consts.Sounds
|
||||||
|
|
||||||
|
class EvilBobListeners : InteractionListener, MapArea {
|
||||||
|
|
||||||
|
override fun defineListeners() {
|
||||||
|
on(EvilBobUtils.evilBob, IntType.NPC, "talk-to") { player, node ->
|
||||||
|
openDialogue(player, EvilBobDialogue(), node.asNpc())
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
|
||||||
|
on(EvilBobUtils.servant, IntType.NPC, "talk-to") { player, node ->
|
||||||
|
openDialogue(player, ServantDialogue(), node.asNpc())
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
|
||||||
|
on(EvilBobUtils.fishingSpot, IntType.SCENERY, "net") { player, _ ->
|
||||||
|
if (getAttribute(player!!, EvilBobUtils.attentiveNewSpot, false) || getAttribute(player!!, EvilBobUtils.eventComplete, false)) {
|
||||||
|
sendDialogue(player, "You don't know if this is a good place to go fishing. Perhaps you should ask someone, like one of the human servants.")
|
||||||
|
} else if (!inInventory(player, Items.SMALL_FISHING_NET_303)) {
|
||||||
|
sendNPCDialogue(player, NPCs.SERVANT_2481, "You'll need a fishing net. There are plenty scattered around the beach.", FacialExpression.SAD);
|
||||||
|
} else if (freeSlots(player) == 0) {
|
||||||
|
sendDialogue(player, "You don't have enough space in your inventory.")
|
||||||
|
} else if (getAttribute(player, EvilBobUtils.fishCaught, false)) {
|
||||||
|
sendNPCDialogue(player, NPCs.SERVANT_2481, "You've already got a fish. Come over here to uncook it, then serve it to Evil Bob.", FacialExpression.SAD)
|
||||||
|
} else {
|
||||||
|
lock(player, 6)
|
||||||
|
animate(player, EvilBobUtils.fishAnim)
|
||||||
|
sendMessage(player, "You cast out your net...")
|
||||||
|
runTask(player, 6) {
|
||||||
|
when (getAttribute(player, EvilBobUtils.assignedFishingZone, EvilBobUtils.northFishingZone.toString())) {
|
||||||
|
EvilBobUtils.northFishingZone.toString() -> {
|
||||||
|
if (inBorders(player, EvilBobUtils.northFishingZone)) {
|
||||||
|
addItem(player, Items.FISHLIKE_THING_6202)
|
||||||
|
} else addItem(player, Items.FISHLIKE_THING_6206)
|
||||||
|
}
|
||||||
|
EvilBobUtils.southFishingZone.toString() -> {
|
||||||
|
if (inBorders(player, EvilBobUtils.southFishingZone)) {
|
||||||
|
addItem(player, Items.FISHLIKE_THING_6202)
|
||||||
|
} else addItem(player, Items.FISHLIKE_THING_6206)
|
||||||
|
}
|
||||||
|
EvilBobUtils.eastFishingZone.toString() -> {
|
||||||
|
if (inBorders(player, EvilBobUtils.eastFishingZone)) {
|
||||||
|
addItem(player, Items.FISHLIKE_THING_6202)
|
||||||
|
} else addItem(player, Items.FISHLIKE_THING_6206)
|
||||||
|
}
|
||||||
|
EvilBobUtils.westFishingZone.toString() -> {
|
||||||
|
if (inBorders(player, EvilBobUtils.westFishingZone)) {
|
||||||
|
addItem(player, Items.FISHLIKE_THING_6202)
|
||||||
|
} else addItem(player, Items.FISHLIKE_THING_6206)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sendItemDialogue(player, Items.FISHLIKE_THING_6202, "You catch a... what is this?? Is this a fish?? And it's cooked already??")
|
||||||
|
resetAnimator(player)
|
||||||
|
setAttribute(player, EvilBobUtils.fishCaught, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
|
||||||
|
onUseWith(IntType.SCENERY, EvilBobUtils.fishlikeThings, EvilBobUtils.uncookingPot) { player, _, _ ->
|
||||||
|
lock(player, 2)
|
||||||
|
animate(player, EvilBobUtils.cookAnim)
|
||||||
|
playAudio(player, Sounds.UNCOOKING_2322)
|
||||||
|
if (removeItem(player, Items.FISHLIKE_THING_6202)) addItem(player, Items.RAW_FISHLIKE_THING_6200)
|
||||||
|
if (removeItem(player, Items.FISHLIKE_THING_6206)) addItem(player, Items.RAW_FISHLIKE_THING_6204)
|
||||||
|
return@onUseWith true
|
||||||
|
}
|
||||||
|
|
||||||
|
onUseWith(IntType.NPC, EvilBobUtils.fishlikeThings, EvilBobUtils.evilBob) { player, _, _ ->
|
||||||
|
openDialogue(player, EvilBobDialogue(), NPCs.EVIL_BOB_2479)
|
||||||
|
return@onUseWith true
|
||||||
|
}
|
||||||
|
|
||||||
|
onUseWith(IntType.NPC, EvilBobUtils.rawFishlikeThings, EvilBobUtils.evilBob) { player, _, _ ->
|
||||||
|
openDialogue(player, EvilBobDialogue(), NPCs.EVIL_BOB_2479)
|
||||||
|
return@onUseWith true
|
||||||
|
}
|
||||||
|
|
||||||
|
on(EvilBobUtils.fishlikeThings, IntType.ITEM, "Eat") { player, _ ->
|
||||||
|
sendMessage(player, "It looks vile and smells even worse. You're not eating that!")
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
|
||||||
|
on(EvilBobUtils.exitPortal, IntType.SCENERY, "enter") { player, portal ->
|
||||||
|
if (getAttribute(player, EvilBobUtils.eventComplete, false)) {
|
||||||
|
lock(player, 12)
|
||||||
|
submitWorldPulse(object : Pulse() {
|
||||||
|
var counter = 0
|
||||||
|
override fun pulse(): Boolean {
|
||||||
|
when (counter++) {
|
||||||
|
1 -> forceMove(player, player.location, portal.location, 0, 50, null, 819)
|
||||||
|
4 -> {
|
||||||
|
player.faceLocation(Location.create(3421, 4777, 0))
|
||||||
|
emote(player, Emotes.RASPBERRY)
|
||||||
|
sendChat(player, "Be seeing you!")
|
||||||
|
|
||||||
|
}
|
||||||
|
7 -> {
|
||||||
|
player.animate(EvilBobUtils.teleAnim)
|
||||||
|
player.graphics(EvilBobUtils.telegfx)
|
||||||
|
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||||
|
|
||||||
|
}
|
||||||
|
10 -> {
|
||||||
|
sendMessage(player, "Welcome back to 2009Scape.")
|
||||||
|
teleport(player, getAttribute(player, EvilBobUtils.prevLocation, Location.create(3222, 3219, 0)))
|
||||||
|
EvilBobUtils.reward(player)
|
||||||
|
EvilBobUtils.cleanup(player)
|
||||||
|
sendPlayerDialogue(player, "That was the strangest dream I've ever had! Assuming it was a dream...", FacialExpression.HALF_ASKING)
|
||||||
|
resetAnimator(player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else sendNPCDialogue(player, NPCs.EVIL_BOB_2479, "You're going nowhere, human!", FacialExpression.CHILD_NEUTRAL)
|
||||||
|
return@on true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||||
|
return arrayOf(ZoneBorders(3400, 4762, 3443, 4793))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||||
|
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areaEnter(entity: Entity) {
|
||||||
|
entity.locks.lockTeleport(1000000)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package content.global.ame.events.evilbob
|
||||||
|
|
||||||
|
import content.global.ame.RandomEventNPC
|
||||||
|
import core.api.*
|
||||||
|
import core.api.utils.WeightBasedTable
|
||||||
|
import core.game.node.entity.npc.NPC
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
import org.rs09.consts.Sounds
|
||||||
|
|
||||||
|
class EvilBobNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.EVIL_BOB_2478) {
|
||||||
|
|
||||||
|
override fun init() {
|
||||||
|
super.init()
|
||||||
|
sendChat("meow")
|
||||||
|
lock(player, 10)
|
||||||
|
runTask(player, 6) {
|
||||||
|
sendChat(player, "No... what? Nooooooooooooo!")
|
||||||
|
player.animate(EvilBobUtils.teleAnim)
|
||||||
|
player.graphics(EvilBobUtils.telegfx)
|
||||||
|
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||||
|
EvilBobUtils.giveEventFishingSpot(player)
|
||||||
|
runTask(player, 3) {
|
||||||
|
sendMessage(player, "Welcome to Scape2009.")
|
||||||
|
EvilBobUtils.teleport(player)
|
||||||
|
resetAnimator(player)
|
||||||
|
openDialogue(player, EvilBobDialogue(), NPCs.EVIL_BOB_2479)
|
||||||
|
content.global.ame.RandomEventManager.getInstance(player)?.event?.terminate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun talkTo(npc: NPC) {
|
||||||
|
player.dialogueInterpreter.open(EvilBobDialogue(), this.asNpc())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
package content.global.ame.events.evilbob
|
||||||
|
|
||||||
|
import core.api.*
|
||||||
|
import core.game.node.entity.player.Player
|
||||||
|
import core.game.node.entity.skill.Skills
|
||||||
|
import core.game.world.map.Location
|
||||||
|
import core.game.world.map.zone.ZoneBorders
|
||||||
|
import core.game.world.update.flag.context.Animation
|
||||||
|
import core.game.world.update.flag.context.Graphics
|
||||||
|
import core.tools.RandomFunction
|
||||||
|
import org.rs09.consts.Items
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
import org.rs09.consts.Scenery
|
||||||
|
|
||||||
|
object EvilBobUtils {
|
||||||
|
const val prevLocation = "/save:evilbob:prevlocation"
|
||||||
|
const val eventComplete = "/save:evilbob:eventcomplete"
|
||||||
|
const val assignedFishingZone = "/save:evilbob:fishingzone"
|
||||||
|
const val fishCaught = "evilbob:fishcaught"
|
||||||
|
const val attentive = "/save:evilbob:attentive"
|
||||||
|
const val servantHelpDialogueSeen = "/save:evilbob:servantdialogeseen"
|
||||||
|
const val attentiveNewSpot = "/save:evilbob:attentivenewspot"
|
||||||
|
const val startingDialogueSeen = "/save:evilbob:startingdialogueseen"
|
||||||
|
|
||||||
|
const val evilBob = NPCs.EVIL_BOB_2479
|
||||||
|
const val servant = NPCs.SERVANT_2481
|
||||||
|
const val exitPortal = Scenery.PORTAL_8987
|
||||||
|
|
||||||
|
const val uncookingPot = Scenery.UNCOOKING_POT_8985
|
||||||
|
const val fishingSpot = 8986
|
||||||
|
|
||||||
|
val fishlikeThings = intArrayOf(Items.FISHLIKE_THING_6202, Items.FISHLIKE_THING_6206)
|
||||||
|
val rawFishlikeThings = intArrayOf(Items.RAW_FISHLIKE_THING_6200, Items.RAW_FISHLIKE_THING_6204)
|
||||||
|
|
||||||
|
val cookAnim = Animation(897)
|
||||||
|
val fishAnim = Animation(620)
|
||||||
|
val teleAnim = Animation(714)
|
||||||
|
val telegfx = Graphics(308, 100, 50)
|
||||||
|
|
||||||
|
val northFishingZone = ZoneBorders(3421, 4789, 3427, 4792)
|
||||||
|
val eastFishingZone = ZoneBorders(3437, 4774, 3440, 4780)
|
||||||
|
val southFishingZone = ZoneBorders(3419, 4763, 3426, 4765)
|
||||||
|
val westFishingZone = ZoneBorders(3405, 4773, 3408, 4779)
|
||||||
|
|
||||||
|
fun giveEventFishingSpot(player: Player) {
|
||||||
|
when (RandomFunction.getRandom(3)) {
|
||||||
|
0 -> setAttribute(player, assignedFishingZone, northFishingZone.toString())
|
||||||
|
1 -> setAttribute(player, assignedFishingZone, southFishingZone.toString())
|
||||||
|
2 -> setAttribute(player, assignedFishingZone, eastFishingZone.toString())
|
||||||
|
3 -> setAttribute(player, assignedFishingZone, westFishingZone.toString())
|
||||||
|
else -> setAttribute(player, assignedFishingZone, northFishingZone.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun teleport(player: Player) {
|
||||||
|
setAttribute(player, prevLocation, player.location)
|
||||||
|
player.properties.teleportLocation = Location.create(3419, 4776, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cleanup(player: Player) {
|
||||||
|
player.locks.unlockTeleport()
|
||||||
|
player.properties.teleportLocation = getAttribute(player, prevLocation, null)
|
||||||
|
removeAttributes(player, assignedFishingZone, eventComplete, prevLocation, attentive, servantHelpDialogueSeen, attentiveNewSpot, startingDialogueSeen)
|
||||||
|
removeAll(player, Items.FISHLIKE_THING_6202)
|
||||||
|
removeAll(player, Items.FISHLIKE_THING_6202, Container.BANK)
|
||||||
|
removeAll(player, Items.FISHLIKE_THING_6206)
|
||||||
|
removeAll(player, Items.FISHLIKE_THING_6206, Container.BANK)
|
||||||
|
removeAll(player, Items.RAW_FISHLIKE_THING_6200)
|
||||||
|
removeAll(player, Items.RAW_FISHLIKE_THING_6200, Container.BANK)
|
||||||
|
removeAll(player, Items.RAW_FISHLIKE_THING_6204)
|
||||||
|
removeAll(player, Items.RAW_FISHLIKE_THING_6204, Container.BANK)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reward(player: Player) {
|
||||||
|
val experience = 650.0
|
||||||
|
if (getStatLevel(player, Skills.MAGIC) > 50 ) {
|
||||||
|
when (RandomFunction.getRandom(1)) {
|
||||||
|
0 -> {
|
||||||
|
player.skills.addExperience(Skills.FISHING, experience)
|
||||||
|
runTask(player, 8) { sendDialogue(player, "You feel somehow that you've become better at fishing.") }
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
player.skills.addExperience(Skills.MAGIC, experience)
|
||||||
|
runTask(player, 8) { sendDialogue(player, "You feel somehow that you've become better at magic.") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
player.skills.addExperience(Skills.FISHING, experience)
|
||||||
|
runTask(player, 6) { sendDialogue(player, "You feel somehow that you've become better at fishing.") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,150 @@
|
||||||
|
package content.global.ame.events.evilbob
|
||||||
|
|
||||||
|
import core.api.*
|
||||||
|
import core.game.activity.Cutscene
|
||||||
|
import core.game.node.entity.player.Player
|
||||||
|
|
||||||
|
class ServantCutsceneN(player: Player) : Cutscene(player) {
|
||||||
|
|
||||||
|
override fun setup() {
|
||||||
|
setExit(player.location.transform(0, 0, 0))
|
||||||
|
loadRegion(13642)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun runStage(stage: Int) {
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
fadeToBlack()
|
||||||
|
timedUpdate(4)
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
teleport(player, 29, 41)
|
||||||
|
moveCamera(30, 43) // +7 from statue
|
||||||
|
openInterface(player, 186)
|
||||||
|
timedUpdate(2)
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
timedUpdate(2)
|
||||||
|
rotateCamera(30, 51, 300, 100) // the statue loc
|
||||||
|
fadeFromBlack()
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
timedUpdate(9)
|
||||||
|
moveCamera(30, 46, 300, 2) // +4 from statue
|
||||||
|
}
|
||||||
|
4 -> {
|
||||||
|
end{ player.locks.lockTeleport(1000000) }
|
||||||
|
closeInterface(player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServantCutsceneS(player: Player) : Cutscene(player) {
|
||||||
|
|
||||||
|
override fun setup() {
|
||||||
|
setExit(player.location.transform(0, 0, 0))
|
||||||
|
loadRegion(13642)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun runStage(stage: Int) {
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
fadeToBlack()
|
||||||
|
timedUpdate(4)
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
teleport(player, 29, 41)
|
||||||
|
moveCamera(29, 38) // +7 from statue
|
||||||
|
openInterface(player, 186)
|
||||||
|
timedUpdate(2)
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
timedUpdate(2)
|
||||||
|
rotateCamera(29, 30, 300, 100) // the statue loc
|
||||||
|
fadeFromBlack()
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
timedUpdate(9)
|
||||||
|
moveCamera(29, 35, 300, 2) // +4 from statue
|
||||||
|
}
|
||||||
|
4 -> {
|
||||||
|
end{ player.locks.lockTeleport(1000000) }
|
||||||
|
closeInterface(player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServantCutsceneE(player: Player) : Cutscene(player) {
|
||||||
|
|
||||||
|
override fun setup() {
|
||||||
|
setExit(player.location.transform(0, 0, 0))
|
||||||
|
loadRegion(13642)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun runStage(stage: Int) {
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
fadeToBlack()
|
||||||
|
timedUpdate(4)
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
teleport(player, 29, 41)
|
||||||
|
moveCamera(35, 41) // +7 from statue
|
||||||
|
openInterface(player, 186)
|
||||||
|
timedUpdate(2)
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
timedUpdate(2)
|
||||||
|
rotateCamera(43, 41, 300, 100) // the statue loc
|
||||||
|
fadeFromBlack()
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
timedUpdate(9)
|
||||||
|
moveCamera(38, 41, 300, 2) // +4 from statue
|
||||||
|
}
|
||||||
|
4 -> {
|
||||||
|
end{ player.locks.lockTeleport(1000000) }
|
||||||
|
closeInterface(player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServantCutsceneW(player: Player) : Cutscene(player) {
|
||||||
|
|
||||||
|
override fun setup() {
|
||||||
|
setExit(player.location.transform(0, 0, 0))
|
||||||
|
loadRegion(13642)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun runStage(stage: Int) {
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
fadeToBlack()
|
||||||
|
timedUpdate(4)
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
teleport(player, 29, 41)
|
||||||
|
moveCamera(25, 40) // +7 from statue
|
||||||
|
openInterface(player, 186)
|
||||||
|
timedUpdate(2)
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
timedUpdate(2)
|
||||||
|
rotateCamera(18, 40, 300, 100) // the statue loc
|
||||||
|
fadeFromBlack()
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
timedUpdate(9)
|
||||||
|
moveCamera(22, 40, 300, 2) // +4 from statue
|
||||||
|
}
|
||||||
|
4 -> {
|
||||||
|
end{ player.locks.lockTeleport(1000000) }
|
||||||
|
closeInterface(player)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package content.global.ame.events.evilbob
|
||||||
|
|
||||||
|
import core.api.getAttribute
|
||||||
|
import core.api.setAttribute
|
||||||
|
import core.game.dialogue.DialogueFile
|
||||||
|
import core.game.dialogue.FacialExpression
|
||||||
|
import core.game.node.entity.npc.NPC
|
||||||
|
import core.tools.END_DIALOGUE
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
|
||||||
|
class ServantDialogue : DialogueFile() {
|
||||||
|
|
||||||
|
override fun handle(componentID: Int, buttonID: Int) {
|
||||||
|
npc = NPC(NPCs.SERVANT_2481)
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
if (getAttribute(player!!, EvilBobUtils.eventComplete, false)) {
|
||||||
|
playerl(FacialExpression.NEUTRAL, "Evil Bob has fallen asleep, come quickly!").also { stage = 2 }
|
||||||
|
} else if (!getAttribute(player!!, EvilBobUtils.servantHelpDialogueSeen, false)) {
|
||||||
|
playerl(FacialExpression.ANGRY, "I need help, I've been kidnapped by an evil cat!").also { stage = 200 }
|
||||||
|
} else if (getAttribute(player!!, EvilBobUtils.attentiveNewSpot, false)) {
|
||||||
|
npcl(FacialExpression.SAD, "Look... over t-t-there! That fishing spot c-c-contains the f-f-f-fish he likes.").also { stage = 1 }
|
||||||
|
} else npcl(FacialExpression.SAD, "F-f-f-fish... give him the f-f-f-fish he likes and he might f- f-f-fall asleep.").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
end()
|
||||||
|
setAttribute(player!!, EvilBobUtils.attentiveNewSpot, false)
|
||||||
|
when (getAttribute(player!!, EvilBobUtils.assignedFishingZone, EvilBobUtils.northFishingZone.toString())) {
|
||||||
|
EvilBobUtils.northFishingZone.toString() -> ServantCutsceneN(player!!).start()
|
||||||
|
EvilBobUtils.southFishingZone.toString() -> ServantCutsceneS(player!!).start()
|
||||||
|
EvilBobUtils.eastFishingZone.toString() -> ServantCutsceneE(player!!).start()
|
||||||
|
EvilBobUtils.westFishingZone.toString() -> ServantCutsceneW(player!!).start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 -> npcl(FacialExpression.SAD, "Come? Come where?").also { stage++ }
|
||||||
|
3 -> playerl(FacialExpression.FRIENDLY, "Away from this place! To 2009Scape proper!").also { stage++ }
|
||||||
|
4 -> npcl(FacialExpression.SAD, "You go, ${player!!.username}, I don't belong there... I belong here, in Scape2009. This is the only place I can ever go...").also { stage++ }
|
||||||
|
5 -> options("But I love you!", "Oh alright then.").also { stage++ }
|
||||||
|
6 -> when(buttonID) {
|
||||||
|
1 -> playerl(FacialExpression.SAD, "But I love you!").also { stage = 100 }
|
||||||
|
2 -> playerl(FacialExpression.NEUTRAL, "Oh, alright then, I'll be off! See you around!").also { stage = END_DIALOGUE}
|
||||||
|
}
|
||||||
|
|
||||||
|
100 -> npcl(FacialExpression.NEUTRAL, "Our love can never be, sweet ${player!!.username}.").also { stage++ }
|
||||||
|
101 -> npcl(FacialExpression.NEUTRAL, "Go now! Go, and don't look back!").also { stage = END_DIALOGUE }
|
||||||
|
|
||||||
|
200 -> npcl(FacialExpression.SAD, "Meow! Errr... I c-c-c-can't help you... He'll kill us all!").also { stage++ }
|
||||||
|
201 -> playerl(FacialExpression.ANGRY, "Now you listen to me! He's just a little cat! There must be something I can do!").also { stage++ }
|
||||||
|
202 -> npcl(FacialExpression.SAD, "F-f-f-fish... give him the f-f-f-fish he likes and he might f- f-f-fall asleep.").also { stage++ }
|
||||||
|
203 -> {
|
||||||
|
npcl(FacialExpression.SAD, "Look... over t-t-there! That fishing spot c-c-contains the f-f-f-fish he likes.").also { stage = 1 }
|
||||||
|
setAttribute(player!!, EvilBobUtils.servantHelpDialogueSeen, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -257,12 +257,6 @@ abstract class Cutscene(val player: Player) {
|
||||||
8 -> player.properties.teleportLocation = exitLocation
|
8 -> player.properties.teleportLocation = exitLocation
|
||||||
9 -> fadeFromBlack()
|
9 -> fadeFromBlack()
|
||||||
16 -> {
|
16 -> {
|
||||||
try {
|
|
||||||
endActions?.invoke()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
log(this::class.java, Log.ERR, "There's some bad nasty code in ${this::class.java.simpleName} end actions!")
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -283,6 +277,12 @@ abstract class Cutscene(val player: Player) {
|
||||||
player.logoutListeners.remove("cutscene")
|
player.logoutListeners.remove("cutscene")
|
||||||
content.global.ame.RandomEventManager.getInstance(player)?.enabled = true
|
content.global.ame.RandomEventManager.getInstance(player)?.enabled = true
|
||||||
PacketRepository.send(MinimapState::class.java, MinimapStateContext(player, 0))
|
PacketRepository.send(MinimapState::class.java, MinimapStateContext(player, 0))
|
||||||
|
try {
|
||||||
|
endActions?.invoke()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log(this::class.java, Log.ERR, "There's some bad nasty code in ${this::class.java.simpleName} end actions!")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -556,6 +556,11 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){
|
||||||
content.global.ame.RandomEventManager.getInstance(player)!!.event!!.init()
|
content.global.ame.RandomEventManager.getInstance(player)!!.event!!.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define("bob", Privilege.ADMIN){ player, _ ->
|
||||||
|
content.global.ame.RandomEventManager.getInstance(player)!!.event = RandomEvents.EVIL_BOB.npc.create(player)
|
||||||
|
content.global.ame.RandomEventManager.getInstance(player)!!.event!!.init()
|
||||||
|
}
|
||||||
|
|
||||||
define("revent", Privilege.ADMIN){ player, _ ->
|
define("revent", Privilege.ADMIN){ player, _ ->
|
||||||
println(player.pulseManager.current)
|
println(player.pulseManager.current)
|
||||||
content.global.ame.RandomEventManager.getInstance(player)!!.fireEvent()
|
content.global.ame.RandomEventManager.getInstance(player)!!.fireEvent()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue