diff --git a/Server/data/configs/npc_configs.json b/Server/data/configs/npc_configs.json index a64a8aa5a..a22f83ae9 100644 --- a/Server/data/configs/npc_configs.json +++ b/Server/data/configs/npc_configs.json @@ -60583,22 +60583,30 @@ "attack_level": "1" }, { + "examine": "A snowman in fake dragon armour.", + "combat_audio": "29,3295,3287", + "melee_animation": "7558", + "defence_animation": "7559", + "death_animation": "7560", "name": "Dragon snowman", "defence_level": "1", "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", + "lifepoints": "20", "strength_level": "1", "id": "6743", "range_level": "1", "attack_level": "1" }, { + "examine": "Arr!", + "combat_audio": "29,3295,3287", + "melee_animation": "7558", + "defence_animation": "7559", + "death_animation": "7560", "name": "Pirate snowman", "defence_level": "1", "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", + "lifepoints": "20", "strength_level": "1", "id": "6745", "range_level": "1", @@ -72440,5 +72448,28 @@ "examine": "A very strange plant.", "name": "Strange Plant", "id": "407" + }, + { + "agg_radius": "", + "examine": "A helmetted, barbarian snowman.", + "death_animation": "7560", + "name": "Barbarian Snowman", + "defence_level": "1", + "melee_animation": "7565", + "lifepoints": "20", + "combat_audio": "12,3295,3287", + "id": "6742", + "defence_animation": "7559" + }, + { + "examine": "A snow dwarf.", + "death_animation": "7560", + "name": "Dwarf Snowman", + "defence_level": "1", + "melee_animation": "7565", + "lifepoints": "20", + "combat_audio": "12,3295,3287", + "id": "6744", + "defence_animation": "7559" } ] \ No newline at end of file diff --git a/Server/src/main/content/global/handlers/npc/NPCTalkListener.kt b/Server/src/main/content/global/handlers/npc/NPCTalkListener.kt index a6812f692..5235fc82a 100644 --- a/Server/src/main/content/global/handlers/npc/NPCTalkListener.kt +++ b/Server/src/main/content/global/handlers/npc/NPCTalkListener.kt @@ -5,9 +5,13 @@ import content.region.kandarin.barcrawl.BarcrawlManager import content.region.kandarin.barcrawl.BarcrawlType import content.global.ame.RandomEvents import content.minigame.gnomecooking.* +import core.api.getAttribute import core.game.interaction.InteractionListener import core.game.interaction.IntType import core.game.system.timer.impl.AntiMacro +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.game.worldevents.holiday.HolidayRandomEvents +import core.game.worldevents.holiday.HolidayRandoms /** * Handles the NPC talk-to option. @@ -39,6 +43,18 @@ class NPCTalkListener : InteractionListener { } return@on true } + if (HolidayRandomEvents.holidayRandomIDs.contains(node.id) && node is HolidayRandomEventNPC) { + if(HolidayRandoms.getEventNpc(player) == null || HolidayRandoms.getEventNpc(player) != node.asNpc() || HolidayRandoms.getEventNpc(player)?.finalized == true) { + player.sendMessage("They aren't interested in talking to you.") + } else { + HolidayRandoms.getEventNpc(player)?.talkTo(node.asNpc()) + } + return@on true + } + if (getAttribute(npc, "holiday_random_extra_npc", false) && HolidayRandoms.getEventNpc(player) != null) { + HolidayRandoms.getEventNpc(player)?.talkTo(node.asNpc()) + return@on true + } if (!npc.getAttribute("facing_booth", false)) { npc.faceLocation(player.location) } diff --git a/Server/src/main/core/ServerConstants.kt b/Server/src/main/core/ServerConstants.kt index 8cb7c1333..c15622a83 100644 --- a/Server/src/main/core/ServerConstants.kt +++ b/Server/src/main/core/ServerConstants.kt @@ -318,6 +318,9 @@ class ServerConstants { @JvmField var FORCE_HALLOWEEN_RANDOMS = false + @JvmField + var FORCE_CHRISTMAS_RANDOMS = false + @JvmField var RUNECRAFTING_FORMULA_REVISION = 581 } diff --git a/Server/src/main/core/api/ContentAPI.kt b/Server/src/main/core/api/ContentAPI.kt index 670c885aa..78122a7da 100644 --- a/Server/src/main/core/api/ContentAPI.kt +++ b/Server/src/main/core/api/ContentAPI.kt @@ -778,8 +778,13 @@ fun sendMessage(player: Player, message: String) { * @param entity the entity to send the chat for * @param message the message to display */ -fun sendChat(entity: Entity, message: String) { - entity.sendChat(message) +fun sendChat(entity: Entity, message: String, delay: Int = -1) { + if (delay > -1) { + queueScript(entity, delay, QueueStrength.SOFT) { + entity.sendChat(message) + return@queueScript stopExecuting(entity) + } + } else entity.sendChat(message) } /** diff --git a/Server/src/main/core/game/node/entity/combat/CombatPulse.kt b/Server/src/main/core/game/node/entity/combat/CombatPulse.kt index cbdb10701..0473df0a0 100644 --- a/Server/src/main/core/game/node/entity/combat/CombatPulse.kt +++ b/Server/src/main/core/game/node/entity/combat/CombatPulse.kt @@ -444,7 +444,7 @@ class CombatPulse( if (entity is NPC) entity.asNpc().behavior.beforeAttackFinalized(entity, victim, state) if (impact || getDelay() == 0) { - if (state.estimatedHit != 0 && victim is NPC && entity is Player) { + if (state.estimatedHit != 0 && victim is NPC) { val n = victim.asNpc() val audio = n.getAudio(1) if (audio != null) { diff --git a/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt b/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt index 066bc64ba..b5633d588 100644 --- a/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt +++ b/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt @@ -364,7 +364,7 @@ abstract class CombatSwingHandler(var type: CombatStyle?) { //plays a punching sound when no weapon is equipped playGlobalAudio(entity.location, Sounds.HUMAN_ATTACK_2564) } - } else if (entity is NPC && victim is Player) { + } else if (entity is NPC) { val npc = entity.asNpc() val audio = npc.getAudio(0) if (audio != null) playGlobalAudio(entity.location, audio.id) diff --git a/Server/src/main/core/game/node/entity/combat/DeathTask.java b/Server/src/main/core/game/node/entity/combat/DeathTask.java index 1454950af..3ea456d7b 100644 --- a/Server/src/main/core/game/node/entity/combat/DeathTask.java +++ b/Server/src/main/core/game/node/entity/combat/DeathTask.java @@ -49,12 +49,9 @@ public final class DeathTask extends NodeTask { Entity killer = n.length > 0 ? (Entity) n[0] : e; if (e instanceof NPC) { killer.removeAttribute("combat-time"); - if (killer instanceof Player) { - Player p = killer.asPlayer(); - Audio audio = e.asNpc().getAudio(2); - if (audio != null) { - playGlobalAudio(e.getLocation(), audio.id); - } + Audio audio = e.asNpc().getAudio(2); + if (audio != null) { + playGlobalAudio(e.getLocation(), audio.id); } } e.graphics(Animator.RESET_G); diff --git a/Server/src/main/core/game/system/config/ServerConfigParser.kt b/Server/src/main/core/game/system/config/ServerConfigParser.kt index ccdaa71e3..62b866443 100644 --- a/Server/src/main/core/game/system/config/ServerConfigParser.kt +++ b/Server/src/main/core/game/system/config/ServerConfigParser.kt @@ -163,6 +163,7 @@ object ServerConfigParser { ServerConstants.NEW_PLAYER_ANNOUNCEMENT = data.getBoolean("world.new_player_announcement", true) ServerConstants.HOLIDAY_EVENT_RANDOMS = data.getBoolean("world.holiday_event_randoms", true) ServerConstants.FORCE_HALLOWEEN_RANDOMS = data.getBoolean("world.force_halloween_randoms", false) + ServerConstants.FORCE_CHRISTMAS_RANDOMS = data.getBoolean("world.force_christmas_randoms", false) ServerConstants.RUNECRAFTING_FORMULA_REVISION = data.getLong("world.runecrafting_formula_revision", 581).toInt() val logLevel = data.getString("server.log_level", "VERBOSE").uppercase() diff --git a/Server/src/main/core/game/worldevents/holiday/HolidayRandomEventNPC.kt b/Server/src/main/core/game/worldevents/holiday/HolidayRandomEventNPC.kt index 8a91ada91..824451832 100644 --- a/Server/src/main/core/game/worldevents/holiday/HolidayRandomEventNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/HolidayRandomEventNPC.kt @@ -1,7 +1,6 @@ package core.game.worldevents.holiday import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.MovementPulse import core.game.node.entity.impl.PulseType import core.game.node.entity.npc.NPC @@ -15,16 +14,14 @@ import kotlin.reflect.full.createInstance abstract class HolidayRandomEventNPC(id:Int) : NPC(id) { lateinit var player: Player - abstract var loot: WeightBasedTable? var spawnLocation: Location? = null var initialized = false var finalized = false var timerPaused = false var ticksLeft = secondsToTicks(30) - open fun create(player: Player, loot: WeightBasedTable? = null, type: String = ""): HolidayRandomEventNPC { + open fun create(player: Player, type: String = ""): HolidayRandomEventNPC { val event = this::class.createInstance() - event.loot = loot event.player = player event.spawnLocation = RegionManager.getSpawnLocation(player, this) return event @@ -83,4 +80,6 @@ abstract class HolidayRandomEventNPC(id:Int) : NPC(id) { super.clear() if(player.getAttribute("holiday-npc", null) == this) player.removeAttribute("holiday-npc") } + + abstract fun talkTo(npc: NPC) } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/HolidayRandomEvents.kt b/Server/src/main/core/game/worldevents/holiday/HolidayRandomEvents.kt index 1731f50b8..f1560ba0f 100644 --- a/Server/src/main/core/game/worldevents/holiday/HolidayRandomEvents.kt +++ b/Server/src/main/core/game/worldevents/holiday/HolidayRandomEvents.kt @@ -1,5 +1,6 @@ package core.game.worldevents.holiday +import core.game.worldevents.holiday.christmas.randoms.* import core.game.worldevents.holiday.halloween.randoms.* enum class HolidayRandomEvents(val npc: HolidayRandomEventNPC, val type: String) { @@ -9,12 +10,20 @@ enum class HolidayRandomEvents(val npc: HolidayRandomEventNPC, val type: String) ZOMBIE(npc = ZombieHolidayRandomNPC(), "halloween"), WITCH(npc = WitchHolidayRandomNPC(), "halloween"), DEATH(npc = DeathHolidayRandomNPC(), "halloween"), - VAMPIRE(npc = VampireHolidayRandomNPC(), "halloween"); + VAMPIRE(npc = VampireHolidayRandomNPC(), "halloween"), + CHOIR(npc = ChoirHolidayRandomNPC(), "christmas"), + SANTA(npc = SantaHolidayRandomNPC(), "christmas"), + SNOWMAN_FIGHT(npc = SnowmanFightHolidayRandom(), "christmas"), + JACK_FROST(npc = JackFrostHolidayRandomNPC(), "christmas"), + SNOWMAN(npc = SnowmanHolidayRandomNPC(), "christmas"), + SNOWSTORM(npc = SnowStormHolidayRandomNPC(), "christmas"), + COOK(npc = CookHolidayRandomNPC(), "christmas"); companion object { @JvmField val halloweenEventsList = ArrayList() val christmasEventsList = ArrayList() + val holidayRandomIDs = HolidayRandomEvents.values().map { it.npc.id }.toList() init { populateMappings() diff --git a/Server/src/main/core/game/worldevents/holiday/HolidayRandoms.kt b/Server/src/main/core/game/worldevents/holiday/HolidayRandoms.kt index b7ae0ed74..6ad5ed6f2 100644 --- a/Server/src/main/core/game/worldevents/holiday/HolidayRandoms.kt +++ b/Server/src/main/core/game/worldevents/holiday/HolidayRandoms.kt @@ -1,7 +1,6 @@ package core.game.worldevents.holiday import content.global.ame.RandomEventNPC -import content.global.skill.construction.HouseLocation import core.ServerConstants import core.api.* import core.game.node.entity.Entity @@ -63,6 +62,10 @@ class HolidayRandoms() : PersistTimer(0, "holiday", isAuto = true), Commands { sendMessage(player, colorize("%OA chill goes down your spine...")) currentHoliday = "halloween" } + "christmas" -> { + sendMessage(player, colorize("%GHappy Holidays.")) + currentHoliday = "christmas" + } "none" -> player.timers.removeTimer(this) } @@ -75,6 +78,9 @@ class HolidayRandoms() : PersistTimer(0, "holiday", isAuto = true), Commands { if ((!currentDate.isBefore(halloweenStartDate) && !currentDate.isAfter(halloweenEndDate)) || ServerConstants.FORCE_HALLOWEEN_RANDOMS) return "halloween" + if ((!currentDate.isBefore(christmasStartDate) && !currentDate.isAfter(christmasEndDate)) || ServerConstants.FORCE_CHRISTMAS_RANDOMS) + return "christmas" + return "none" } @@ -120,7 +126,8 @@ class HolidayRandoms() : PersistTimer(0, "holiday", isAuto = true), Commands { } return when (currentHoliday) { "halloween" -> HolidayRandomEvents.getHolidayRandom("halloween") - else -> HolidayRandomEvents.SPIDER + "christmas" -> HolidayRandomEvents.getHolidayRandom("christmas") + else -> throw Exception("Invalid event type!") } } @@ -148,7 +155,7 @@ class HolidayRandoms() : PersistTimer(0, "holiday", isAuto = true), Commands { define("forcehrevents", Privilege.ADMIN, "::forcehrevents [eventname]", "Force enable holiday random events.") { player, args -> if (args.size == 1) { - notify(player, "Holidays: halloween") + notify(player, "Holidays: halloween, christmas") return@define } val event = args[1] @@ -166,15 +173,26 @@ class HolidayRandoms() : PersistTimer(0, "holiday", isAuto = true), Commands { registerTimer(p, HolidayRandoms()) } } + "christmas" -> { + ServerConstants.FORCE_CHRISTMAS_RANDOMS = true + for (p in Repository.players) { + if (getTimer(p) != null || p.isArtificial) { + continue + } + notify(p, colorize("%GChristmas Randoms are now enabled!")) + registerTimer(p, HolidayRandoms()) + } + } else -> reject(player, "Invalid event!") } } define("stophrevents", Privilege.ADMIN, "::stophrevents", "Stops all holiday random events.") { player, _ -> - if (checkIfHoliday() == "none") + if (checkIfHoliday() == "none" || !ServerConstants.HOLIDAY_EVENT_RANDOMS) reject(player, "No holiday random events are currently active.") ServerConstants.HOLIDAY_EVENT_RANDOMS = false ServerConstants.FORCE_HALLOWEEN_RANDOMS = false + ServerConstants.FORCE_CHRISTMAS_RANDOMS = false for (p in Repository.players) { if (getTimer(p) == null) { continue diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/Giftmas.kt b/Server/src/main/core/game/worldevents/holiday/christmas/Giftmas.kt index 76749653b..e77df1a18 100644 --- a/Server/src/main/core/game/worldevents/holiday/christmas/Giftmas.kt +++ b/Server/src/main/core/game/worldevents/holiday/christmas/Giftmas.kt @@ -123,7 +123,7 @@ class Giftmas : Commands, StartupListener, LoginListener, InteractionListener { private val MESSAGE_DAILYXP_REACHED_SKILLING = colorize("%RYou have reached your daily limit of presents from skilling!") private val MESSAGE_DAILYXP_REACHED_COMBAT = colorize("%RYou have reached your daily limit of presents from combat!") private val MESSAGE_PRESENT_GRANTED = colorize("%GYou find a present while training!") - private val MBOX_LOOT = WeightBasedTable.create( + val MBOX_LOOT = WeightBasedTable.create( WeightedItem(Items.TOY_HORSEY_2520, 1, 1, 0.025), WeightedItem(Items.TOY_HORSEY_2522, 1, 1, 0.025), WeightedItem(Items.TOY_HORSEY_2524, 1, 1, 0.025), diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/ChoirHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/ChoirHolidayRandomNPC.kt new file mode 100644 index 000000000..b63be9fdd --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/ChoirHolidayRandomNPC.kt @@ -0,0 +1,63 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.interaction.QueueStrength +import core.game.node.entity.npc.NPC +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.RandomFunction +import org.rs09.consts.NPCs + +class ChoirHolidayRandomNPC() : HolidayRandomEventNPC(NPCs.ZANARIS_CHOIR_3312) { + override fun init() { + super.init() + queueScript(this, 4, QueueStrength.SOFT) { stage: Int -> + when (stage) { + 0 -> { + face(player) + when (RandomFunction.getRandom(3)) { + 0 -> { + sendChat(this, "Jingle bells, jingle bells!") + sendChat(this, "Jingle all the way!", 4) + sendChat(this, "Oh what fun it is to ride", 8) + sendChat(this, "On a one unicorn open sleigh", 12) + sendChat(this, "HEY!", 15) + return@queueScript delayScript(this, 16) + } + 1 -> { + sendChat(this, "Silver bells") + sendChat(this, "Silver bells", 5) + sendChat(this, "It's Christmas time in the city", 10) + sendChat(this, "Ring a ling", 15) + sendChat(this, "Hear them ring", 20) + sendChat(this, "Soon it will be Christmas day", 25) + return@queueScript delayScript(this, 26) + } + 2 -> { + sendChat(this, "Deck the halls with boughs of ranarr") + sendChat(this, "Fa la la la la la la la!", 5) + sendChat(this, "Tis the season to be jolly", 10) + sendChat(this, "Fa la la la la la la la!", 15) + return@queueScript delayScript(this, 16) + } + 3 -> { + sendChat(this, "O Wintumber Tree, O Wintumber tree,") + sendChat(this, "How lovely are your branches!", 5) + sendChat(this, "O Wintumber Tree, O Wintumber tree,", 10) + sendChat(this, "Of all the trees most lovely", 15) + return@queueScript delayScript(this, 16) + } + else -> return@queueScript keepRunning(this) + } + } + 1 -> { + terminate() + return@queueScript stopExecuting(this) + } + else -> return@queueScript stopExecuting(this) + } + } + } + + override fun talkTo(npc: NPC) { + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/CookHolidayRandomDialogue.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/CookHolidayRandomDialogue.kt new file mode 100644 index 000000000..012ccf8a5 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/CookHolidayRandomDialogue.kt @@ -0,0 +1,50 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.addItemOrDrop +import core.game.dialogue.DialogueFile +import core.game.dialogue.FacialExpression +import core.game.worldevents.holiday.HolidayRandoms +import org.rs09.consts.Items + +class CookHolidayRandomDialogue : DialogueFile() { + private val cakes = listOf(Items.CAKE_1891, Items.CHOCOLATE_CAKE_1897, Items.MINT_CAKE_9475) + override fun handle(componentID: Int, buttonID: Int) { + if (HolidayRandoms.getEventNpc(player!!) == null) + player!!.dialogueInterpreter.close() + + when (stage) { + 0 -> npcl(FacialExpression.HAPPY, "Greetings, ${player!!.username.capitalize()}. Every year around christmas I give away cake to the community. Would you care for a fresh baked cake?").also { stage++ } + 1 -> options("Sure, I will take a cake.", "Why are you giving cakes away?", "No, thanks.").also { stage++ } + 2 -> when (buttonID) { + 1 -> playerl(FacialExpression.HAPPY, "Sure, I will take a cake.").also { stage = 40 } + 2 -> playerl(FacialExpression.HALF_ASKING, "Why are you giving away cakes?").also { stage = 20 } + 3 -> playerl(FacialExpression.NEUTRAL, "No, thanks.").also { stage = 10 } + } + 10 -> npcl(FacialExpression.HAPPY, "Okay, I will find someone else who wants it. Merry Christmas, ${player!!.username.capitalize()}.").also { stage++ } + 11 -> { + HolidayRandoms.terminateEventNpc(player!!) + end() + } + 20 -> npcl(FacialExpression.NEUTRAL, "It's just something I do this time of year... Errr... well...").also { stage++ } + 21 -> playerl(FacialExpression.HALF_ASKING, "Is there something else?").also { stage++ } + 22 -> npcl(FacialExpression.NEUTRAL, "I used to be the cook for the old Duke of Lumbridge. Visiting dignitaries praised me for my fine banquets!"). also { stage++ } + 23 -> npcl(FacialExpression.ANNOYED, "But then someone found a rule that said that only one family could hold that post.").also { stage++ } + 24 -> npcl(FacialExpression.ANGRY, "Overnight I was fired and replaced by some fool who can't even bake a cake without help!").also { stage++ } + 25 -> playerl(FacialExpression.NEUTRAL, "I'm sorry to hear that. It sounds as if you are a great cook!").also { stage++ } + 26 -> npcl(FacialExpression.HAPPY, "Thanks, I am!").also { stage++ } + 27 -> npcl(FacialExpression.LAUGH, "I also do this each year to show everyone how incapable that sorry excuse of a cook they replaced me with is.").also { stage++ } + 28 -> npcl(FacialExpression.HAPPY, "So, did you want a cake?").also { stage++ } + 29 -> options("Sure, I will take a cake.", "No, thanks.").also { stage++ } + 30 -> when (buttonID) { + 1 -> playerl(FacialExpression.HAPPY, "Sure, I will take a cake.").also { stage = 40 } + 2 -> playerl(FacialExpression.NEUTRAL, "No, thanks.").also { stage = 10 } + } + 40 -> npcl(FacialExpression.HAPPY, "Here is a the finest cake you will ever have! Merry Christmas, ${player!!.username.capitalize()}.").also { stage++ } + 41 -> { + HolidayRandoms.terminateEventNpc(player!!) + addItemOrDrop(player!!, cakes.random()) + end() + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/CookHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/CookHolidayRandomNPC.kt new file mode 100644 index 000000000..3a33d4838 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/CookHolidayRandomNPC.kt @@ -0,0 +1,32 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.node.entity.npc.NPC +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.RandomFunction +import core.tools.minutesToTicks +import org.rs09.consts.NPCs + +class CookHolidayRandomNPC : HolidayRandomEventNPC(NPCs.COOK_4239) { + private val cookLines = listOf("@name, are you there?", "Would you like a fresh baked cake, @name?", "Happy Holidays, @name!") + private var hasTalkedWith = false + + override fun init() { + ticksLeft = minutesToTicks(3) + sendChat(this, "Happy Holidays, ${player.username.capitalize()}!", 2) + super.init() + } + + override fun tick() { + if (RandomFunction.roll(15) && !hasTalkedWith) + sendChat(this, cookLines.random().replace("@name",player.username.capitalize())) + + super.tick() + } + + override fun talkTo(npc: NPC) { + face(player) + hasTalkedWith = true + openDialogue(player, CookHolidayRandomDialogue(), npc) + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/JackFrostHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/JackFrostHolidayRandomNPC.kt new file mode 100644 index 000000000..01aace80a --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/JackFrostHolidayRandomNPC.kt @@ -0,0 +1,64 @@ +package core.game.worldevents.holiday.christmas.randoms + + +import core.api.getPathableRandomLocalCoordinate +import core.api.* +import core.game.interaction.QueueStrength +import core.game.node.entity.impl.Projectile +import core.game.node.entity.npc.NPC +import core.game.world.map.path.Pathfinder +import core.game.world.update.flag.context.Graphics +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.minutesToTicks +import org.rs09.consts.NPCs +import org.rs09.consts.Sounds + +class JackFrostHolidayRandomNPC : HolidayRandomEventNPC(NPCs.JACK_FROST_8517) { + + override fun init() { + ticksLeft = minutesToTicks(1) + spawnLocation = getPathableRandomLocalCoordinate(this, 3, player.location) + super.init() + } + + override fun tick() { + if (getWorldTicks() % 5 == 0) { + if (this.location.withinDistance(player.location, 1) || this.location.getDistance(player.location).toInt() > 3) { + val path = Pathfinder.find(this, getPathableRandomLocalCoordinate(this, 3, player.location)) + path.walk(this) + } else { + throwSnowball() + } + } + super.tick() + } + + override fun talkTo(npc: NPC) { + sendMessage(player, "He does not seem interested in talking.") + } + + override fun follow() { + } + + private fun throwSnowball() { + queueScript(this, 0, QueueStrength.SOFT) { stage: Int -> + when (stage) { + 0 -> { + face(this, player) + visualize(this, 7530, -1) + return@queueScript delayScript(this, 1) + } + 1 -> { + Projectile.create(this, player, 861, 30, 10).send() + return@queueScript delayScript(this, this.location.getDistance(player.location).toInt()) + } + 2 -> { + player.graphics(Graphics(1282)) + playGlobalAudio(player.location, Sounds.GUBLINCH_SNOWBALL_3295) + return@queueScript stopExecuting(this) + } + else -> return@queueScript stopExecuting(this) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SantaHolidayRandomDialogue.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SantaHolidayRandomDialogue.kt new file mode 100644 index 000000000..d5f758298 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SantaHolidayRandomDialogue.kt @@ -0,0 +1,54 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.addItem +import core.api.addItemOrDrop +import core.api.getAttribute +import core.game.dialogue.DialogueFile +import core.game.dialogue.FacialExpression +import core.game.worldevents.holiday.HolidayRandoms +import core.game.worldevents.holiday.christmas.Giftmas +import core.tools.END_DIALOGUE +import core.tools.RandomFunction +import org.rs09.consts.Items + +class SantaHolidayRandomDialogue : DialogueFile() { + + override fun handle(componentID: Int, buttonID: Int) { + if (HolidayRandoms.getEventNpc(player!!) == null) + player!!.dialogueInterpreter.close() + + when (stage) { + 0 -> npcl(FacialExpression.JOLLY, "Ho Ho Ho!").also { stage++ } + 1 -> npcl(FacialExpression.HAPPY, "Merry Christmas, ${player!!.username}! Would you like to know if you are on the nice or naughty list?").also { stage = 10 } + + 10 -> options("Yes, please.", "No, thanks."). also { stage = 11 } + 11 -> when (buttonID) { + 1 -> playerl(FacialExpression.HAPPY, "Yes, please.").also { stage = 20 } + 2 -> { + playerl(FacialExpression.NEUTRAL, "No, thanks.") + stage = END_DIALOGUE + HolidayRandoms.terminateEventNpc(player!!) + } + } + 20 -> if (getAttribute(HolidayRandoms.getEventNpc(player!!)!!, "playerisnice", false)) { + npcl(FacialExpression.HAPPY, "Let me check my list... ${player!!.username}.. You are on the nice list!").also { stage = 30 } + } else { + npcl(FacialExpression.SAD, "Let me check my list... ${player!!.username}.. You are on the naughty list!").also { stage = 40 } + } + 30 -> npcl(FacialExpression.HAPPY, "Since you have been a good ${if (player!!.isMale) "boy" else "girl"} this year, you get a gift. Merry Christmas, ${player!!.username}!").also { stage = 31 } + 31 -> { + val loot = Giftmas.MBOX_LOOT.roll().first() + addItem(player!!, loot.id, loot.amount) + HolidayRandoms.terminateEventNpc(player!!) + end() + } + 40 -> npcl(FacialExpression.NEUTRAL, "If you work on being a good ${if (player!!.isMale) "boy" else "girl"} from now on you will make it on the nice list!").also { stage = 41 } + 41 -> npcl(FacialExpression.NEUTRAL, "Since you are on the naughty list, you get coal.").also { stage = 42 } + 42 -> { + addItemOrDrop(player!!, Items.COAL_454, RandomFunction.getRandom(20)) + HolidayRandoms.terminateEventNpc(player!!) + end() + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SantaHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SantaHolidayRandomNPC.kt new file mode 100644 index 000000000..84a384af7 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SantaHolidayRandomNPC.kt @@ -0,0 +1,31 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.node.entity.npc.NPC +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.RandomFunction +import core.tools.minutesToTicks +import org.rs09.consts.NPCs + +class SantaHolidayRandomNPC() : HolidayRandomEventNPC(NPCs.SANTA_CLAUS_8540) { + + override fun init() { + spawnLocation = getPathableRandomLocalCoordinate(this, 1, player.location) + super.init() + ticksLeft = minutesToTicks(2) + setAttribute(this, "playerisnice", !RandomFunction.roll(3)) + sendChat(this, "Ho Ho Ho! Merry Christmas, ${player.username.capitalize()}!", 2) + } + + override fun tick() { + if (RandomFunction.roll(10)) + sendChat(this, "Ho Ho Ho! Merry Christmas, ${player.username.capitalize()}!") + + super.tick() + } + + override fun talkTo(npc: NPC) { + face(player) + openDialogue(player, SantaHolidayRandomDialogue(), npc) + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowStormHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowStormHolidayRandomNPC.kt new file mode 100644 index 000000000..c10d937f2 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowStormHolidayRandomNPC.kt @@ -0,0 +1,72 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.node.entity.npc.NPC +import core.game.world.map.RegionManager +import core.game.world.map.path.Pathfinder +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.RandomFunction +import core.tools.minutesToTicks +import org.rs09.consts.NPCs +import org.rs09.consts.Sounds + +class SnowStormHolidayRandomNPC : HolidayRandomEventNPC(NPCs.SNOW_6740) { + private lateinit var snowTwoNPC: NPC + private lateinit var snowThreeNPC: NPC + private lateinit var snowFourNPC: NPC + private lateinit var snowFiveNPC: NPC + private lateinit var snowNPCs: List + private val songs = listOf(189, 208, 209, 532, 547, 592) + private var snowFinalized = false + + override fun init() { + snowTwoNPC = create(NPCs.SNOW_6740, getPathableRandomLocalCoordinate(player, 3, player.location)) + snowThreeNPC = create(NPCs.SNOW_6740, getPathableRandomLocalCoordinate(player, 3, player.location)) + snowFourNPC = create(NPCs.SNOW_6740, getPathableRandomLocalCoordinate(player, 3, player.location)) + snowFiveNPC = create(NPCs.SNOW_6740, getPathableRandomLocalCoordinate(player, 3, player.location)) + snowNPCs = listOf(this, snowTwoNPC, snowThreeNPC, snowFourNPC, snowFiveNPC) + ticksLeft = minutesToTicks(2) + super.init() + snowTwoNPC.init() + snowThreeNPC.init() + snowFourNPC.init() + snowFiveNPC.init() + val nearbyPlayers = RegionManager.getLocalPlayers(player.location, 8) + for (p in nearbyPlayers) { + p.musicPlayer.unlock(songs.random(), true) + } + } + + override fun tick() { + if (getWorldTicks() % 8 == 0) { + moveSnow() + } + super.tick() + } + + private fun moveSnow() { + for (snow in snowNPCs) { + val snowPath = Pathfinder.find(snow, getPathableRandomLocalCoordinate(player, 4, player.location)) + snowPath.walk(snow) + + if (RandomFunction.roll(4)) + playGlobalAudio(snow.location, Sounds.ICY_WIND_2078) + } + } + + override fun follow() { + } + + override fun terminate() { + if (!snowFinalized) { + snowFinalized = true + for (snow in snowNPCs) { + poofClear(snow) + } + } + super.terminate() + } + + override fun talkTo(npc: NPC) { + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanFightBehavior.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanFightBehavior.kt new file mode 100644 index 000000000..b874bd8f0 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanFightBehavior.kt @@ -0,0 +1,21 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.getAttribute +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.player.Player +import core.game.worldevents.holiday.HolidayRandoms +import core.tools.RandomFunction + +class SnowmanFightBehavior : NPCBehavior() { + override fun onDeathStarted(self: NPC, killer: Entity) { + val holidayRandomPlayer = getAttribute(self, "holidayrandomplayer", null) ?: return + HolidayRandoms.terminateEventNpc(holidayRandomPlayer) + } + + override fun beforeAttackFinalized(self: NPC, victim: Entity, state: BattleState) { + state.estimatedHit = RandomFunction.getRandom(1) + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanFightHolidayRandom.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanFightHolidayRandom.kt new file mode 100644 index 000000000..15e598bf9 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanFightHolidayRandom.kt @@ -0,0 +1,52 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.node.entity.npc.NPC +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.minutesToTicks +import org.rs09.consts.NPCs + +class SnowmanFightHolidayRandom : HolidayRandomEventNPC(NPCs.BARBARIAN_SNOWMAN_6742) { + private lateinit var otherSnowman: NPC + private val snowmen = listOf(NPCs.DRAGON_SNOWMAN_6743, NPCs.PIRATE_SNOWMAN_6745, NPCs.DWARF_SNOWMAN_6744) + private var snowmenFinalized = false + + override fun init() { + otherSnowman = create(snowmen.random(), getPathableRandomLocalCoordinate(player, 3, player.location)) + ticksLeft = minutesToTicks(3) + setAttribute(this, "holidayrandomplayer", player) + setAttribute(otherSnowman, "holidayrandomplayer", player) + setAttribute(otherSnowman, "holiday_random_extra_npc", true) + this.behavior = SnowmanFightBehavior() + otherSnowman.behavior = SnowmanFightBehavior() + super.init() + otherSnowman.init() + + this.attack(otherSnowman) + otherSnowman.attack(this) + } + + override fun tick() { + if (!this.inCombat() && getWorldTicks() % 20 == 0) { + this.teleport(otherSnowman.location) + this.attack(otherSnowman) + otherSnowman.attack(this) + } + super.tick() + } + + override fun terminate() { + if (!snowmenFinalized) { + snowmenFinalized = true + poofClear(otherSnowman) + } + super.terminate() + } + + override fun follow() { + } + + override fun talkTo(npc: NPC) { + sendMessage(player, "They seem a little busy.") + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanHolidayRandomDialogue.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanHolidayRandomDialogue.kt new file mode 100644 index 000000000..ac43c2fd5 --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanHolidayRandomDialogue.kt @@ -0,0 +1,68 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.dialogue.DialogueFile +import core.game.dialogue.FacialExpression +import core.game.interaction.QueueStrength +import core.game.node.entity.player.link.emote.Emotes +import core.game.worldevents.holiday.HolidayRandoms +import org.rs09.consts.Items + + +class SnowmanHolidayRandomDialogue : DialogueFile() { + override fun handle(componentID: Int, buttonID: Int) { + if (HolidayRandoms.getEventNpc(player!!) == null) + player!!.dialogueInterpreter.close() + + when (stage) { + 0 -> npcl(FacialExpression.CHILD_NEUTRAL, "Greetings, ${player!!.username.capitalize()}. I'm visiting from the Land of Snow, but I need some help."). also { stage++ } + 1 -> options("What do you need?", "No, sorry.") .also { stage++ } + 2 -> when(buttonID) { + 1 -> playerl(FacialExpression.HALF_ASKING,"What do you need?").also { stage = 10 } + 2 -> playerl(FacialExpression.NEUTRAL,"No, sorry.").also { stage = 30 } + } + 10 -> npcl(FacialExpression.CHILD_NEUTRAL, "I visit Gielinor every year during this time when it is the coldest here, but it is still a little warm for us snowmen.").also { stage++ } + 11 -> npcl(FacialExpression.CHILD_NEUTRAL, "I'm really enjoying my visit, but I have started to melt. Would you happen to have a snowball?").also { stage++ } + 12 -> { + if (inInventory(player!!, Items.SNOWBALL_11951, 1)) { + playerl(FacialExpression.HAPPY, "Actually, I do! You can have it.").also { stage = 20 } + } else { + playerl(FacialExpression.NEUTRAL, "I don't have a snowball, sorry.").also { stage = 30 } + } + } + 20 -> { + npcl(FacialExpression.CHILD_NEUTRAL, "Thank you, ${player!!.username.capitalize()}!").also { stage++ } + } + 21 -> { + if (player!!.emoteManager.isUnlocked(Emotes.SNOWMAN_DANCE)) { + npcl(FacialExpression.CHILD_NEUTRAL, "Please take this lamp I found on my travels. Happy holidays, ${player!!.username.capitalize()}!").also { stage = 22 } + } else { + npcl(FacialExpression.CHILD_NEUTRAL, "Before I leave I will show you how to dance like us snowmen. Happy holidays, ${player!!.username.capitalize()}!").also { stage = 23 } + } + } + 22 -> { + if (removeItem(player!!, Items.SNOWBALL_11951)) + addItem(player!!, Items.LAMP_2528) + + end() + HolidayRandoms.terminateEventNpc(player!!) + } + 23 -> { + if (removeItem(player!!, Items.SNOWBALL_11951)) + player!!.emoteManager.unlock(Emotes.SNOWMAN_DANCE) + + queueScript(player!!, 2,QueueStrength.SOFT) { + sendDialogue(player!!, "You have unlocked the Snowman Dance emote!") + return@queueScript stopExecuting(player!!) + } + end() + HolidayRandoms.terminateEventNpc(player!!) + } + 30 -> npcl(FacialExpression.CHILD_NEUTRAL, "I must be going before I melt. Happy Holidays, ${player!!.username.capitalize()}.").also { stage++ } + 31 -> { + end() + HolidayRandoms.terminateEventNpc(player!!) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanHolidayRandomNPC.kt new file mode 100644 index 000000000..6248e710e --- /dev/null +++ b/Server/src/main/core/game/worldevents/holiday/christmas/randoms/SnowmanHolidayRandomNPC.kt @@ -0,0 +1,32 @@ +package core.game.worldevents.holiday.christmas.randoms + +import core.api.* +import core.game.node.entity.npc.NPC +import core.game.worldevents.holiday.HolidayRandomEventNPC +import core.tools.RandomFunction +import core.tools.minutesToTicks +import org.rs09.consts.NPCs + +class SnowmanHolidayRandomNPC : HolidayRandomEventNPC(NPCs.SNOWMAN_6746) { + private val snowmanLines = listOf("@name, are you there?", "Excuse me, @name?", "@name, could I please speak with you?") + private var hasTalkedWith = false + + override fun init() { + super.init() + ticksLeft = minutesToTicks(2) + sendChat(this, "Happy holidays, ${player.username.capitalize()}!", 2) + } + + override fun tick() { + if (RandomFunction.roll(15) && !hasTalkedWith) + sendChat(this, snowmanLines.random().replace("@name",player.username.capitalize())) + + super.tick() + } + + override fun talkTo(npc: NPC) { + face(player) + hasTalkedWith = true + openDialogue(player, SnowmanHolidayRandomDialogue(), npc) + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/BlackCatHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/BlackCatHolidayRandomNPC.kt index 0d145eb82..b893bfa1c 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/BlackCatHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/BlackCatHolidayRandomNPC.kt @@ -1,15 +1,15 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.QueueStrength import core.game.node.entity.combat.ImpactHandler.HitsplatType +import core.game.node.entity.npc.NPC import core.game.worldevents.holiday.HolidayRandomEventNPC import core.game.worldevents.holiday.HolidayRandoms import org.rs09.consts.Sounds -class BlackCatHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(4607) { +class BlackCatHolidayRandomNPC() : HolidayRandomEventNPC(4607) { override fun init() { super.init() queueScript(this, 8, QueueStrength.SOFT) { @@ -25,4 +25,7 @@ class BlackCatHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Ho return@queueScript stopExecuting(this) } } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/DeathHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/DeathHolidayRandomNPC.kt index eac1e21a5..ffe2ebc7e 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/DeathHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/DeathHolidayRandomNPC.kt @@ -1,14 +1,14 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.QueueStrength +import core.game.node.entity.npc.NPC import core.game.worldevents.holiday.HolidayRandomEventNPC import core.game.worldevents.holiday.HolidayRandoms import core.tools.RandomFunction import org.rs09.consts.Sounds -class DeathHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(2862) { +class DeathHolidayRandomNPC() : HolidayRandomEventNPC(2862) { override fun init() { super.init() playJingle(player, 337) @@ -36,4 +36,7 @@ class DeathHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Holid } } } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/GhostHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/GhostHolidayRandomNPC.kt index aa6c50b2c..f5defed09 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/GhostHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/GhostHolidayRandomNPC.kt @@ -1,12 +1,12 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable +import core.game.node.entity.npc.NPC import core.game.worldevents.holiday.HolidayRandomEventNPC import core.tools.RandomFunction import org.rs09.consts.Sounds -class GhostHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(2716) { +class GhostHolidayRandomNPC() : HolidayRandomEventNPC(2716) { override fun init() { super.init() this.isAggressive = false @@ -21,4 +21,7 @@ class GhostHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Holid if (RandomFunction.roll(10)) playGlobalAudio(this.location, Sounds.BIGGHOST_LAUGH_1600) } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/SpiderHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/SpiderHolidayRandomNPC.kt index 66685e19e..dea7ff063 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/SpiderHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/SpiderHolidayRandomNPC.kt @@ -1,15 +1,15 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.QueueStrength import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.npc.NPC import core.game.world.update.flag.context.Animation import core.game.worldevents.holiday.HolidayRandomEventNPC import core.game.worldevents.holiday.HolidayRandoms import org.rs09.consts.Sounds -class SpiderHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(61) { +class SpiderHolidayRandomNPC() : HolidayRandomEventNPC(61) { override fun init() { super.init() this.behavior = SpiderHolidayRandomBehavior() @@ -44,4 +44,7 @@ class SpiderHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Holi } } } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/VampireHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/VampireHolidayRandomNPC.kt index b1fdf8d30..2fc8ad225 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/VampireHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/VampireHolidayRandomNPC.kt @@ -1,9 +1,9 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.QueueStrength import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.npc.NPC import core.game.worldevents.holiday.HolidayRandomEventNPC import core.game.worldevents.holiday.HolidayRandoms import core.game.worldevents.holiday.ResetHolidayAppearance @@ -11,7 +11,7 @@ import core.tools.RandomFunction import core.tools.colorize import org.rs09.consts.Sounds -class VampireHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(1023) { +class VampireHolidayRandomNPC() : HolidayRandomEventNPC(1023) { override fun init() { super.init() playGlobalAudio(this.location, Sounds.REGULAR_VAMPIRE_APPEAR_1897) @@ -43,4 +43,7 @@ class VampireHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Hol } } } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/WitchHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/WitchHolidayRandomNPC.kt index 53bb704f0..bb4100be6 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/WitchHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/WitchHolidayRandomNPC.kt @@ -1,16 +1,16 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.QueueStrength import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.npc.NPC import core.game.worldevents.holiday.ResetHolidayAppearance import core.game.worldevents.holiday.HolidayRandomEventNPC import core.game.worldevents.holiday.HolidayRandoms import core.tools.RandomFunction import org.rs09.consts.Sounds -class WitchHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(611) { +class WitchHolidayRandomNPC() : HolidayRandomEventNPC(611) { override fun init() { super.init() when (RandomFunction.getRandom(4)) { @@ -146,4 +146,7 @@ class WitchHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Holid } } } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/ZombieHolidayRandomNPC.kt b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/ZombieHolidayRandomNPC.kt index 241ab8ab5..6cc7e313d 100644 --- a/Server/src/main/core/game/worldevents/holiday/halloween/randoms/ZombieHolidayRandomNPC.kt +++ b/Server/src/main/core/game/worldevents/holiday/halloween/randoms/ZombieHolidayRandomNPC.kt @@ -1,9 +1,9 @@ package core.game.worldevents.holiday.halloween.randoms import core.api.* -import core.api.utils.WeightBasedTable import core.game.interaction.QueueStrength import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.npc.NPC import core.game.worldevents.holiday.ResetHolidayAppearance import core.game.worldevents.holiday.HolidayRandomEventNPC import core.game.worldevents.holiday.HolidayRandoms @@ -11,7 +11,7 @@ import core.tools.RandomFunction import core.tools.colorize import org.rs09.consts.Sounds -class ZombieHolidayRandomNPC(override var loot: WeightBasedTable? = null) : HolidayRandomEventNPC(2714) { +class ZombieHolidayRandomNPC() : HolidayRandomEventNPC(2714) { override fun init() { super.init() this.isAggressive = false @@ -54,4 +54,7 @@ class ZombieHolidayRandomNPC(override var loot: WeightBasedTable? = null) : Holi } } } + + override fun talkTo(npc: NPC) { + } } \ No newline at end of file diff --git a/Server/worldprops/default.conf b/Server/worldprops/default.conf index eebd334a8..fe1f6bc00 100644 --- a/Server/worldprops/default.conf +++ b/Server/worldprops/default.conf @@ -101,6 +101,7 @@ new_player_announcement = true holiday_event_randoms = true #force holiday randoms (can only force one at a time) force_halloween_randoms = false +force_christmas_randoms = false # runecrafting formula revision (573 introduced probabilistic multiple runes, 581 extrapolated probabilistic runes past 99) runecrafting_formula_revision = 581