From 6335f18c7ef058c9f4974d207bfe3d766a77e48d Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 7 Aug 2025 21:15:50 -0300 Subject: [PATCH 01/46] Initial summoning --- .../content/skill/summoning/Summoning.kts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 game/src/main/kotlin/content/skill/summoning/Summoning.kts diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts new file mode 100644 index 0000000000..57964d7c2c --- /dev/null +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -0,0 +1,40 @@ +package content.skill.summoning + +import content.entity.player.inv.inventoryItem +import world.gregs.voidps.cache.definition.data.NPCDefinition +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.data.definition.EnumDefinitions +import world.gregs.voidps.engine.data.definition.NPCDefinitions +import world.gregs.voidps.engine.entity.character.mode.Follow +import world.gregs.voidps.engine.entity.character.npc.NPCs +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.inject +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove + +val enums: EnumDefinitions by inject() +val npcs: NPCs by inject() +val npcDefinitions: NPCDefinitions by inject() + +inventoryItem("Summon", "*_pouch") { + val familiarLevel = enums.get("summoning_pouch_levels").getInt(item.def.id) + val familiarId = enums.get("summoning_familiar_ids").getInt(item.def.id) + val summoningXp = item.def["summon_experience", 0.0] + val familiar = npcDefinitions.get(familiarId) + + if (player.levels.get(Skill.Summoning) <= familiarLevel) { + //TODO: Get actual message + player.message("You don't have the level needed to summon that familiar...") + } + + summonFamiliar(player, familiar) + player.inventory.remove(item.id) + player.experience.add(Skill.Summoning, summoningXp) +} + +fun summonFamiliar(player: Player, familiar: NPCDefinition) { + val familiarNpc = npcs.add(familiar.stringId, player.tile) + familiarNpc.mode = Follow(familiarNpc, player) + +} \ No newline at end of file From 44fcfdb47ad478264f9101d3d4567c33099e480f Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 7 Aug 2025 21:36:09 -0300 Subject: [PATCH 02/46] Fix followers not watching target after teleing --- .../world/gregs/voidps/engine/entity/character/mode/Follow.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Follow.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Follow.kt index c562d1b29d..158fcac3e9 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Follow.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Follow.kt @@ -32,6 +32,7 @@ class Follow( } if (character is NPC && character.tile.distanceTo(target) > 15) { character.tele(strategy.tile, clearMode = false) + character.clearWatch() } if (!smart) { character.steps.clearDestination() From ba42384015f68afb4b504fb0d3ec69890fd41fd0 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 7 Aug 2025 22:19:04 -0300 Subject: [PATCH 03/46] Add summoning varps and varbits --- data/skill/summoning/summoning.varbits.toml | 29 +++++++++++++++++++++ data/skill/summoning/summoning.varps.toml | 9 +++++++ 2 files changed, 38 insertions(+) create mode 100644 data/skill/summoning/summoning.varbits.toml create mode 100644 data/skill/summoning/summoning.varps.toml diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml new file mode 100644 index 0000000000..6f694ad04b --- /dev/null +++ b/data/skill/summoning/summoning.varbits.toml @@ -0,0 +1,29 @@ +[pet_details_chathead_animation] +id = 4282 +format = "int" +persist = true + +[pet_details_growth_percentage] +id = 4285 +format = "int" +persist = true + +[pet_details_hunger_percentage] +id = 4286 +format = "int" +persist = true + +[unknown_summoning_special_points] +id = 4288 +format = "int" +persist = true + +[pet_details_seconds_remaining] +id = 4290 +format = "int" +persist = true + +[pet_details_minutes_remaining] +id = 4534 +format = "int" +persist = true \ No newline at end of file diff --git a/data/skill/summoning/summoning.varps.toml b/data/skill/summoning/summoning.varps.toml new file mode 100644 index 0000000000..65c6bf835d --- /dev/null +++ b/data/skill/summoning/summoning.varps.toml @@ -0,0 +1,9 @@ +[pet_details_pet_name] +id = 448 +format = "int" +persist = true + +[pet_details_chathead] +id = 1174 +format = "int" +persist = true \ No newline at end of file From 63d8173a28764d0fa144e9cc2d94a61c4899a0a2 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 7 Aug 2025 22:20:48 -0300 Subject: [PATCH 04/46] Update pet details interface on summoning familiar --- .../content/skill/summoning/Summoning.kts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 57964d7c2c..b2da88d416 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -3,12 +3,16 @@ package content.skill.summoning import content.entity.player.inv.inventoryItem import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.sendScript +import world.gregs.voidps.engine.client.ui.event.adminCommand import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.mode.Follow +import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.entity.item.Item import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove @@ -28,13 +32,23 @@ inventoryItem("Summon", "*_pouch") { player.message("You don't have the level needed to summon that familiar...") } - summonFamiliar(player, familiar) + val familiarNpc = summonFamiliar(player, familiar) ?: return@inventoryItem + updateFamiliarInterface(player, familiarNpc, item) player.inventory.remove(item.id) player.experience.add(Skill.Summoning, summoningXp) + } -fun summonFamiliar(player: Player, familiar: NPCDefinition) { +fun summonFamiliar(player: Player, familiar: NPCDefinition): NPC? { val familiarNpc = npcs.add(familiar.stringId, player.tile) familiarNpc.mode = Follow(familiarNpc, player) + return familiarNpc +} + +fun updateFamiliarInterface(player: Player, familiar: NPC, pouch: Item) { + player.variables.set("pet_details_pet_name", pouch.def.id) + player.variables.set("pet_details_chathead", familiar.def.id) + + player.addVarbit("pet_details_chathead_animation", 1) } \ No newline at end of file From f0a734e878eaa08a484bf04db9a65b3f62a64328 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 7 Aug 2025 23:32:37 -0300 Subject: [PATCH 05/46] Add and update summoning enums --- data/client/enums.toml | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/data/client/enums.toml b/data/client/enums.toml index 7799368fc9..81eb88b6ca 100644 --- a/data/client/enums.toml +++ b/data/client/enums.toml @@ -332,9 +332,14 @@ id = 1100 [gravestone_price] id = 1101 +# From NPC id +# Lowercase, does not include dungeoneering IDs +[summoning_familiar_names_lowercase] +id = 931 + # From NPC id, used in interface 662, cs2 751 -# All seem to be in the format 4895#### -[summoning_familiar_hashes_1] +# Fruit bat (6817) -> 747, 30 +[summoning_orb_packed_components] id = 1092 # From index in crafting menu, no difference from summoning_pouch_ids_2 @@ -365,6 +370,15 @@ id = 1187 [summoning_scroll_ids_1] id = 1188 +# Used if varp 4282 > 50, 50 is immediately subtracted from the varp +# Not sure when these are actually used... When low health, maybe?? +[pet_details_chathead_animations_other] +id = 1275 + +# Used if varp 4282 <= 50 +[pet_details_chathead_animations_normal] +id = 1276 + # From index in the crafting menu, no difference from summoning_pouch_ids_1 [summoning_pouch_ids_2] id = 1277 @@ -378,8 +392,9 @@ id = 1278 id = 1279 # From NPC id, used in interface 662, cs2 751 -# All seem to be in the format 4338#### -[summoning_familiar_hashes] +# Fruit bat (6817) -> 662, 88 +# Seems to be 1 off on the component ID. Fruit bat's scroll is ID 89 +[pet_details_use_scroll_packed_components] id = 1282 # From associated summoning pouch ID @@ -435,5 +450,9 @@ id = 1077 [exchange_slot_interfaces] id = 1078 +# Familiar names from 0 - 77 in alphabetical order (Except phoenix, which is in place 77) +[summoning_familiar_names_alphabetical] +id = 1539 + [farming_protection] id = 2024 From aae43dbcd43f0a0815315d46d1fae480fb3114fc Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 8 Aug 2025 19:24:27 -0300 Subject: [PATCH 06/46] Rename varbit --- data/skill/summoning/summoning.varbits.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index 6f694ad04b..e8525969a3 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -13,7 +13,9 @@ id = 4286 format = "int" persist = true -[unknown_summoning_special_points] +# Changes the mouseover info for the cast button in inter 662 (pet_details) +# E.g. "Level 1: Howl (-->#<-- Special Move points)" +[summoning_special_points_needed] id = 4288 format = "int" persist = true From ca3899b53a5dabae8cd653afa99197e4b64e1b95 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 8 Aug 2025 19:24:47 -0300 Subject: [PATCH 07/46] Add special points remaining varp --- data/skill/summoning/summoning.varps.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/skill/summoning/summoning.varps.toml b/data/skill/summoning/summoning.varps.toml index 65c6bf835d..c608dabad9 100644 --- a/data/skill/summoning/summoning.varps.toml +++ b/data/skill/summoning/summoning.varps.toml @@ -6,4 +6,9 @@ persist = true [pet_details_chathead] id = 1174 format = "int" +persist = true + +[summoning_special_points_remaining] +id = 1177 +format = "int" persist = true \ No newline at end of file From a97dc4c4e4cee3f3cc80ede7193daface14b7399 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 8 Aug 2025 21:43:10 -0300 Subject: [PATCH 08/46] Show familiar options in summoning orb --- data/entity/player/modal/toplevel/gameframe.ifaces.toml | 3 +++ game/src/main/kotlin/content/skill/summoning/Summoning.kts | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/data/entity/player/modal/toplevel/gameframe.ifaces.toml b/data/entity/player/modal/toplevel/gameframe.ifaces.toml index f12a33cdea..ec81322a07 100644 --- a/data/entity/player/modal/toplevel/gameframe.ifaces.toml +++ b/data/entity/player/modal/toplevel/gameframe.ifaces.toml @@ -188,6 +188,9 @@ id = 165 [summoning_orb] id = 747 type = "summoning_orb" +components = { + familiar_options = 8 +} [health_orb] id = 748 diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index b2da88d416..4e0f9ac98a 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -3,8 +3,6 @@ package content.skill.summoning import content.entity.player.inv.inventoryItem import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message -import world.gregs.voidps.engine.client.sendScript -import world.gregs.voidps.engine.client.ui.event.adminCommand import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.mode.Follow @@ -36,13 +34,13 @@ inventoryItem("Summon", "*_pouch") { updateFamiliarInterface(player, familiarNpc, item) player.inventory.remove(item.id) player.experience.add(Skill.Summoning, summoningXp) - } fun summonFamiliar(player: Player, familiar: NPCDefinition): NPC? { + // TODO: Return null if there's not enough space around the player to spawn the familiar val familiarNpc = npcs.add(familiar.stringId, player.tile) familiarNpc.mode = Follow(familiarNpc, player) - + player.interfaces.sendVisibility("summoning_orb", "familiar_options", true) return familiarNpc } From cdde9a712bc679a551bf900d76eb245d5afa685b Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sun, 10 Aug 2025 18:28:12 -0300 Subject: [PATCH 09/46] Set up pet_details interface correctly --- data/entity/player/modal/interface_types.toml | 6 +++++- data/skill/summoning/summoning.ifaces.toml | 2 ++ .../main/kotlin/content/skill/summoning/Summoning.kts | 10 ++++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/data/entity/player/modal/interface_types.toml b/data/entity/player/modal/interface_types.toml index c234a0e3c1..ea84ccd3e8 100644 --- a/data/entity/player/modal/interface_types.toml +++ b/data/entity/player/modal/interface_types.toml @@ -69,7 +69,7 @@ resizeIndex = 92 fixedIndex = 209 resizeIndex = 93 -[follower_details_tab] +[unknown_tab_1] fixedIndex = 210 resizeIndex = 94 @@ -105,6 +105,10 @@ resizeIndex = 101 fixedIndex = 197 resizeIndex = 83 +[follower_details_tab] +fixedIndex = 219 +resizeIndex = 103 + [logout_tab] fixedIndex = 220 resizeIndex = 104 diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index 51184ade7b..893064b722 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -41,9 +41,11 @@ id = 79 [pet_details] id = 662 +type = "follower_details_tab" [pet_hunger_details] id = 663 +type = "follower_details_tab" [summoning_scroll_creation] id = 666 diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 4e0f9ac98a..07280c3e27 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -40,13 +40,15 @@ fun summonFamiliar(player: Player, familiar: NPCDefinition): NPC? { // TODO: Return null if there's not enough space around the player to spawn the familiar val familiarNpc = npcs.add(familiar.stringId, player.tile) familiarNpc.mode = Follow(familiarNpc, player) - player.interfaces.sendVisibility("summoning_orb", "familiar_options", true) + return familiarNpc } fun updateFamiliarInterface(player: Player, familiar: NPC, pouch: Item) { - player.variables.set("pet_details_pet_name", pouch.def.id) - player.variables.set("pet_details_chathead", familiar.def.id) + player.interfaces.open("pet_details") + + player["pet_details_pet_name"] = pouch.def.id + player["pet_details_chathead"] = familiar.def.id - player.addVarbit("pet_details_chathead_animation", 1) + player["pet_details_chathead_animation"] = 1 } \ No newline at end of file From c1a80356fd4bf21fe30c5443c6c79784ffdce79b Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sun, 10 Aug 2025 18:47:45 -0300 Subject: [PATCH 10/46] Rename task tab interface type --- data/entity/player/modal/interface_types.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/entity/player/modal/interface_types.toml b/data/entity/player/modal/interface_types.toml index ea84ccd3e8..8c11732e71 100644 --- a/data/entity/player/modal/interface_types.toml +++ b/data/entity/player/modal/interface_types.toml @@ -69,7 +69,7 @@ resizeIndex = 92 fixedIndex = 209 resizeIndex = 93 -[unknown_tab_1] +[tasks_tab] fixedIndex = 210 resizeIndex = 94 From 653ea3026aa370725c4c8498e9699a00354d822f Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 11 Aug 2025 18:44:31 -0300 Subject: [PATCH 11/46] Implement left-click options menu and refactor --- data/skill/summoning/summoning.ifaces.toml | 20 +++++- data/skill/summoning/summoning.varbits.toml | 10 +++ .../engine/entity/character/player/Player.kt | 2 + .../content/skill/summoning/Summoning.kts | 64 +++++++++++++++---- 4 files changed, 83 insertions(+), 13 deletions(-) diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index 893064b722..a371913883 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -78,8 +78,26 @@ type = "dialogue_box" id = 737 type = "dialogue_box" -[familiar_options] +[follower_left_click_options] id = 880 +type = "overlay_tab" +components = { + follower_details_circle = 7, + follower_details = 8, + special_move_circle = 9, + special_move = 10, + attack_circle = 11, + attack = 12, + call_follower_circle = 13, + call_follower = 14, + dismiss_follower_cricle = 15, + dismiss_follower = 16, + take_bob_cricle = 17, + take_bob = 18, + renew_familiar_circle = 19, + renew_familiar = 20, + confirm = 21 +} [summoning_side] id = 722 diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index e8525969a3..aea4643201 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -28,4 +28,14 @@ persist = true [pet_details_minutes_remaining] id = 4534 format = "int" +persist = true + +[summoning_orb_left_click_option] +id = 6454 +format = "int" +persist = true + +[summoning_menu_left_click_option] +id = 6455 +format = "int" persist = true \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt index af834e9ae7..4a20bbde5d 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt @@ -16,6 +16,7 @@ import world.gregs.voidps.engine.entity.character.Character import world.gregs.voidps.engine.entity.character.mode.EmptyMode import world.gregs.voidps.engine.entity.character.mode.Mode import world.gregs.voidps.engine.entity.character.mode.move.Steps +import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.player.chat.clan.ClanRank import world.gregs.voidps.engine.entity.character.player.equip.BodyParts import world.gregs.voidps.engine.entity.character.player.skill.exp.Experience @@ -51,6 +52,7 @@ class Player( val body: BodyParts = BodyParts(), val offers: Array = Array(6) { ExchangeOffer() }, val history: MutableList = mutableListOf(), + var follower: NPC? = null, ) : Character { override val visuals: PlayerVisuals = PlayerVisuals(body) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 07280c3e27..bdec7a5870 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -3,6 +3,7 @@ package content.skill.summoning import content.entity.player.inv.inventoryItem import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.mode.Follow @@ -10,7 +11,6 @@ import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.skill.Skill -import world.gregs.voidps.engine.entity.item.Item import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove @@ -30,25 +30,65 @@ inventoryItem("Summon", "*_pouch") { player.message("You don't have the level needed to summon that familiar...") } - val familiarNpc = summonFamiliar(player, familiar) ?: return@inventoryItem - updateFamiliarInterface(player, familiarNpc, item) + player.summonFamiliar(familiar) ?: return@inventoryItem + player.updateFamiliarInterface() player.inventory.remove(item.id) player.experience.add(Skill.Summoning, summoningXp) } -fun summonFamiliar(player: Player, familiar: NPCDefinition): NPC? { - // TODO: Return null if there's not enough space around the player to spawn the familiar - val familiarNpc = npcs.add(familiar.stringId, player.tile) - familiarNpc.mode = Follow(familiarNpc, player) +interfaceOption("Select left-click option", id = "summoning_orb") { + player.openFollowerLeftClickOptions() +} + +interfaceOption("Select", id = "follower_left_click_options") { + val varbitValue = when { + component.startsWith("follower_details") -> 0 + component.startsWith("special_move") -> 1 + component.startsWith("attack") -> 2 + component.startsWith("call_follower") -> 3 + component.startsWith("dismiss_follower") -> 4 + component.startsWith("take_bob") -> 5 + component.startsWith("renew_familiar") -> 6 + else -> -1 + } + + player["summoning_menu_left_click_option"] = varbitValue +} + +interfaceOption("Confirm Selection", "confirm", "follower_left_click_options") { + player.confirmFollowerLeftClickOptions() +} + +fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { + if (follower != null) { + // TODO: Find actual message for this + message("You must dismiss your current follower before summoning another.") + return null + } + + val familiarNpc = npcs.add(familiar.stringId, tile) + familiarNpc.mode = Follow(familiarNpc, this) + follower = familiarNpc return familiarNpc } -fun updateFamiliarInterface(player: Player, familiar: NPC, pouch: Item) { - player.interfaces.open("pet_details") +fun Player.updateFamiliarInterface() { + if (follower == null) return + + this.interfaces.open("pet_details") + + this["pet_details_pet_name"] = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) + this["pet_details_chathead"] = follower!!.def.id - player["pet_details_pet_name"] = pouch.def.id - player["pet_details_chathead"] = familiar.def.id + this["pet_details_chathead_animation"] = 1 +} + +fun Player.openFollowerLeftClickOptions() { + interfaces.open("follower_left_click_options") +} - player["pet_details_chathead_animation"] = 1 +fun Player.confirmFollowerLeftClickOptions() { + this["summoning_orb_left_click_option"] = this["summoning_menu_left_click_option", -1] + interfaces.close("follower_left_click_options") } \ No newline at end of file From 27405c1f8d8dae3e62c2007e9468c0c9d9e5107b Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 11 Aug 2025 19:44:33 -0300 Subject: [PATCH 12/46] Rename vars and interfaces to be more specific on pet/familiar (or follower if applies to both) --- data/skill/summoning/summoning.ifaces.toml | 4 ++-- data/skill/summoning/summoning.varbits.toml | 7 ++++++- data/skill/summoning/summoning.varps.toml | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index a371913883..ed665301d7 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -39,11 +39,11 @@ id = 27 [summoning_creation] id = 79 -[pet_details] +[familiar_details] id = 662 type = "follower_details_tab" -[pet_hunger_details] +[pet_details] id = 663 type = "follower_details_tab" diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index aea4643201..3a25920790 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -1,4 +1,9 @@ -[pet_details_chathead_animation] +[show_summoning_orb] +id = 4280 +format = "boolean" +persist = true + +[follower_details_chathead_animation] id = 4282 format = "int" persist = true diff --git a/data/skill/summoning/summoning.varps.toml b/data/skill/summoning/summoning.varps.toml index c608dabad9..977a8f22d6 100644 --- a/data/skill/summoning/summoning.varps.toml +++ b/data/skill/summoning/summoning.varps.toml @@ -1,9 +1,9 @@ -[pet_details_pet_name] +[follower_details_name] id = 448 format = "int" persist = true -[pet_details_chathead] +[follower_details_chathead] id = 1174 format = "int" persist = true From c5151c8e9d17b7194854ac9cfd1f95db1d1a82ba Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 11 Aug 2025 20:14:00 -0300 Subject: [PATCH 13/46] Add components for familiar and pet details ifaces --- data/skill/summoning/summoning.ifaces.toml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index ed665301d7..8220b2a9b5 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -42,10 +42,21 @@ id = 79 [familiar_details] id = 662 type = "follower_details_tab" +components = { + call = 49, + dismiss = 51, + attack = 65, + take_bob_items = 67, + renew = 69, +} [pet_details] id = 663 type = "follower_details_tab" +components = { + call = 21, + dismiss = 23 +} [summoning_scroll_creation] id = 666 From d4dc3a568588e7d8d28dc4f3a1b386f69860bbc2 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 11 Aug 2025 20:14:16 -0300 Subject: [PATCH 14/46] Set default show_summoning_orb value --- data/skill/summoning/summoning.varbits.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index 3a25920790..7fd12a114e 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -2,6 +2,7 @@ id = 4280 format = "boolean" persist = true +default = true [follower_details_chathead_animation] id = 4282 From 23e5470be3ce84d6f1854e44d01fde14774aac14 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 11 Aug 2025 20:22:35 -0300 Subject: [PATCH 15/46] Implement dismissing familiars --- .../content/skill/summoning/Summoning.kts | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index bdec7a5870..a55ee6a02e 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -1,5 +1,6 @@ package content.skill.summoning +import content.entity.player.dialogue.type.choice import content.entity.player.inv.inventoryItem import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message @@ -59,6 +60,24 @@ interfaceOption("Confirm Selection", "confirm", "follower_left_click_options") { player.confirmFollowerLeftClickOptions() } +interfaceOption("Dismiss", id = "summoning_orb") { + player.dismissFamiliar() +} + +interfaceOption("Dismiss *", "dismiss", "familiar_details") { + when (option) { + "Dismiss Familiar" -> { + choice("Are you sure you want to dismiss your familiar?") { + option("Yes.") { + player.dismissFamiliar() + } + option("No.") + } + } + "Dismiss Now" -> player.dismissFamiliar() + } +} + fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { if (follower != null) { // TODO: Find actual message for this @@ -73,15 +92,24 @@ fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { return familiarNpc } +fun Player.dismissFamiliar() { + npcs.remove(follower) + follower = null + interfaces.close("familiar_details") + + this["follower_details_name"] = -1 + this["follower_details_chathead"] = -1 +} + fun Player.updateFamiliarInterface() { if (follower == null) return - this.interfaces.open("pet_details") + this.interfaces.open("familiar_details") - this["pet_details_pet_name"] = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) - this["pet_details_chathead"] = follower!!.def.id + this["follower_details_name"] = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) + this["follower_details_chathead"] = follower!!.def.id - this["pet_details_chathead_animation"] = 1 + this["follower_details_chathead_animation"] = 1 } fun Player.openFollowerLeftClickOptions() { From 20b4d3dfe39415ed9dfdc0a14e729dcfa04c258b Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 19 Aug 2025 19:50:41 -0300 Subject: [PATCH 16/46] Change follower to a property --- .../engine/entity/character/player/Player.kt | 15 ++++++++++++++- .../kotlin/content/skill/summoning/Summoning.kts | 8 ++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt index 4a20bbde5d..d2429289ca 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt @@ -17,10 +17,12 @@ import world.gregs.voidps.engine.entity.character.mode.EmptyMode import world.gregs.voidps.engine.entity.character.mode.Mode import world.gregs.voidps.engine.entity.character.mode.move.Steps import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.chat.clan.ClanRank import world.gregs.voidps.engine.entity.character.player.equip.BodyParts import world.gregs.voidps.engine.entity.character.player.skill.exp.Experience import world.gregs.voidps.engine.entity.character.player.skill.level.Levels +import world.gregs.voidps.engine.get import world.gregs.voidps.engine.inv.Inventories import world.gregs.voidps.engine.queue.ActionQueue import world.gregs.voidps.engine.suspend.DialogueSuspension @@ -52,7 +54,6 @@ class Player( val body: BodyParts = BodyParts(), val offers: Array = Array(6) { ExchangeOffer() }, val history: MutableList = mutableListOf(), - var follower: NPC? = null, ) : Character { override val visuals: PlayerVisuals = PlayerVisuals(body) @@ -110,6 +111,18 @@ class Player( override val steps = Steps(this) + var Player.follower: NPC? + get() { + val index = this["follower_index", -1] + return get().indexed(index) + } + set(value) { + if (value != null) { + this["follower_index"] = value.index + this["follower_id"] = value.id + } + } + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index a55ee6a02e..4fd2233d62 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -15,6 +15,7 @@ import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.engine.queue.softQueue val enums: EnumDefinitions by inject() val npcs: NPCs by inject() @@ -32,7 +33,6 @@ inventoryItem("Summon", "*_pouch") { } player.summonFamiliar(familiar) ?: return@inventoryItem - player.updateFamiliarInterface() player.inventory.remove(item.id) player.experience.add(Skill.Summoning, summoningXp) } @@ -87,7 +87,11 @@ fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { val familiarNpc = npcs.add(familiar.stringId, tile) familiarNpc.mode = Follow(familiarNpc, this) - follower = familiarNpc + + softQueue("summon_familiar", 2) { + follower = familiarNpc + player.updateFamiliarInterface() + } return familiarNpc } From 5850a43a7ae5669c4be4ff4637d23d1f17463c3f Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 19 Aug 2025 19:59:19 -0300 Subject: [PATCH 17/46] Play gfx when summoning familiars --- data/skill/summoning/summoning.gfx.toml | 5 +++++ game/src/main/kotlin/content/skill/summoning/Summoning.kts | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 data/skill/summoning/summoning.gfx.toml diff --git a/data/skill/summoning/summoning.gfx.toml b/data/skill/summoning/summoning.gfx.toml new file mode 100644 index 0000000000..00051a9268 --- /dev/null +++ b/data/skill/summoning/summoning.gfx.toml @@ -0,0 +1,5 @@ +[summon_familiar_small] +id = 1314 + +[summon_familiar_large] +id = 1315 \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 4fd2233d62..daad28b1a3 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -90,6 +90,13 @@ fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { softQueue("summon_familiar", 2) { follower = familiarNpc + + if (follower!!.size == 1) { + follower!!.gfx("summon_familiar_small") + } else { + follower!!.gfx("summon_familiar_large") + } + player.updateFamiliarInterface() } From 3048454d164feec91bffbb48897fbfaa19f498a9 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 19 Aug 2025 20:01:23 -0300 Subject: [PATCH 18/46] Refactor playing gfx --- data/skill/summoning/summoning.gfx.toml | 4 ++-- game/src/main/kotlin/content/skill/summoning/Summoning.kts | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/data/skill/summoning/summoning.gfx.toml b/data/skill/summoning/summoning.gfx.toml index 00051a9268..4fcf922db5 100644 --- a/data/skill/summoning/summoning.gfx.toml +++ b/data/skill/summoning/summoning.gfx.toml @@ -1,5 +1,5 @@ -[summon_familiar_small] +[summon_familiar_size_1] id = 1314 -[summon_familiar_large] +[summon_familiar_size_2] id = 1315 \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index daad28b1a3..5428de6e7e 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -91,12 +91,7 @@ fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { softQueue("summon_familiar", 2) { follower = familiarNpc - if (follower!!.size == 1) { - follower!!.gfx("summon_familiar_small") - } else { - follower!!.gfx("summon_familiar_large") - } - + follower!!.gfx("summon_familiar_size_${follower!!.size}") player.updateFamiliarInterface() } From d70a34c81de9629b6eacec9bd524a61a86ff88e0 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 19 Aug 2025 20:10:50 -0300 Subject: [PATCH 19/46] Implement calling follower --- .../main/kotlin/content/skill/summoning/Summoning.kts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 5428de6e7e..48dbb42e63 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -8,6 +8,7 @@ import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.mode.Follow +import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player @@ -78,6 +79,10 @@ interfaceOption("Dismiss *", "dismiss", "familiar_details") { } } +interfaceOption("Call *", "call", "*_details") { + player.callFollower() +} + fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { if (follower != null) { // TODO: Find actual message for this @@ -125,4 +130,9 @@ fun Player.openFollowerLeftClickOptions() { fun Player.confirmFollowerLeftClickOptions() { this["summoning_orb_left_click_option"] = this["summoning_menu_left_click_option", -1] interfaces.close("follower_left_click_options") +} + +fun Player.callFollower() { + follower!!.tele(steps.follow, clearMode = false) + follower!!.clearWatch() } \ No newline at end of file From 4bac06796351a081744a558e92c554853d80e54b Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 19 Aug 2025 20:12:30 -0300 Subject: [PATCH 20/46] Implement calling follower from summoning orb --- game/src/main/kotlin/content/skill/summoning/Summoning.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 48dbb42e63..79ed5b2de5 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -83,6 +83,10 @@ interfaceOption("Call *", "call", "*_details") { player.callFollower() } +interfaceOption("Call Follower", "*", "summoning_orb") { + player.callFollower() +} + fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { if (follower != null) { // TODO: Find actual message for this From 159b673b4c0a77754dc571362e7126e1d29996f9 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 19 Aug 2025 20:27:22 -0300 Subject: [PATCH 21/46] Fix sending low level message at wrong time --- game/src/main/kotlin/content/skill/summoning/Summoning.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 79ed5b2de5..0288b59ca1 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -28,9 +28,10 @@ inventoryItem("Summon", "*_pouch") { val summoningXp = item.def["summon_experience", 0.0] val familiar = npcDefinitions.get(familiarId) - if (player.levels.get(Skill.Summoning) <= familiarLevel) { + if (player.levels.get(Skill.Summoning) < familiarLevel) { //TODO: Get actual message player.message("You don't have the level needed to summon that familiar...") + return@inventoryItem } player.summonFamiliar(familiar) ?: return@inventoryItem From 07e21851dd1c433b675f01ddf737cc4cd486044e Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Wed, 20 Aug 2025 12:05:05 -0300 Subject: [PATCH 22/46] Add familiar time and summon points to data file --- data/skill/summoning/summoning.items.toml | 160 +++++++++++++++++++++- 1 file changed, 159 insertions(+), 1 deletion(-) diff --git a/data/skill/summoning/summoning.items.toml b/data/skill/summoning/summoning.items.toml index b90c99d7bd..564b0afd61 100644 --- a/data/skill/summoning/summoning.items.toml +++ b/data/skill/summoning/summoning.items.toml @@ -21,6 +21,8 @@ weight = 0.02 examine = "I can summon a spirit terrorbird familiar with this." summon_experience = 0.8 infuse_experience = 68.4 +familiar_time = 36 +summon_points = 6 [spirit_terrorbird_pouch_noted] id = 12008 @@ -33,6 +35,8 @@ weight = 0.02 examine = "I can summon a granite crab familiar with this." summon_experience = 0.2 infuse_experience = 21.6 +familiar_time = 18 +summon_points = 2 [granite_crab_pouch_noted] id = 12010 @@ -45,6 +49,8 @@ weight = 0.02 examine = "I can summon a praying mantis familiar with this." summon_experience = 3.6 infuse_experience = 329.6 +familiar_time = 69 +summon_points = 8 [praying_mantis_pouch_noted] id = 12012 @@ -57,6 +63,8 @@ weight = 0.02 examine = "I can summon a giant ent familiar with this." summon_experience = 1.6 infuse_experience = 136.8 +familiar_time = 49 +summon_points = 8 [giant_ent_pouch_noted] id = 12014 @@ -69,6 +77,8 @@ weight = 0.02 examine = "I can summon a spirit cobra familiar with this." summon_experience = 3.1 infuse_experience = 276.8 +familiar_time = 56 +summon_points = 7 [spirit_cobra_pouch_noted] id = 12016 @@ -81,6 +91,8 @@ weight = 0.02 examine = "I can summon a spirit dagannoth familiar with this." summon_experience = 4.1 infuse_experience = 364.8 +familiar_time = 57 +summon_points = 9 [spirit_dagannoth_pouch_noted] id = 12018 @@ -93,6 +105,8 @@ weight = 0.02 examine = "I can summon a thorny snail familiar with this." summon_experience = 0.2 infuse_experience = 12.6 +familiar_time = 16 +summon_points = 2 [thorny_snail_pouch_noted] id = 12020 @@ -105,6 +119,8 @@ weight = 0.02 examine = "I can summon a beaver familiar with this." summon_experience = 0.7 infuse_experience = 57.6 +familiar_time = 27 +summon_points = 4 [beaver_pouch_noted] id = 12022 @@ -117,6 +133,8 @@ weight = 0.02 examine = "I can summon a karamthulhu overlord familiar with this." summon_experience = 5.8 infuse_experience = 510.5 +familiar_time = 44 +summon_points = 6 [karam_overlord_pouch_noted] id = 12024 @@ -129,6 +147,8 @@ weight = 0.02 examine = "I can summon a hydra familiar with this." summon_experience = 1.6 infuse_experience = 140.8 +familiar_time = 49 +summon_points = 8 [hydra_pouch_noted] id = 12026 @@ -141,6 +161,8 @@ weight = 0.02 examine = "I can summon a spirit jelly familiar with this." summon_experience = 5.5 infuse_experience = 484.0 +familiar_time = 43 +summon_points = 6 [spirit_jelly_pouch_noted] id = 12028 @@ -153,6 +175,8 @@ weight = 0.02 examine = "I can summon a bunyip familiar with this." summon_experience = 1.4 infuse_experience = 119.2 +familiar_time = 44 +summon_points = 7 [bunyip_pouch_noted] id = 12030 @@ -165,6 +189,8 @@ weight = 0.02 examine = "I can summon a war tortoise familiar with this." summon_experience = 0.7 infuse_experience = 58.6 +familiar_time = 43 +summon_points = 7 [war_tortoise_pouch_noted] id = 12032 @@ -177,6 +203,8 @@ weight = 0.02 examine = "I can summon a fruit bat familiar with this." summon_experience = 1.4 infuse_experience = 121.2 +familiar_time = 45 +summon_points = 7 [fruit_bat_pouch_noted] id = 12034 @@ -189,6 +217,8 @@ weight = 0.02 examine = "I can summon an abyssal parasite familiar with this." summon_experience = 1.1 infuse_experience = 94.8 +familiar_time = 30 +summon_points = 6 [abyssal_parasite_pouch_noted] id = 12036 @@ -201,6 +231,8 @@ weight = 0.02 examine = "I can summon an abyssal lurker familiar with this." summon_experience = 1.9 infuse_experience = 109.6 +familiar_time = 41 +summon_points = 7 [abyssal_lurker_pouch_noted] id = 12038 @@ -213,6 +245,8 @@ weight = 0.02 examine = "I can summon a unicorn stallion familiar with this." summon_experience = 1.8 infuse_experience = 154.4 +familiar_time = 54 +summon_points = 9 [unicorn_stallion_pouch_noted] id = 12040 @@ -225,6 +259,8 @@ weight = 0.02 examine = "I can summon a magpie familiar with this." summon_experience = 0.9 infuse_experience = 83.2 +familiar_time = 34 +summon_points = 5 [magpie_pouch_noted] id = 12042 @@ -237,6 +273,8 @@ weight = 0.02 examine = "I can summon a dreadfowl familiar with this." summon_experience = 0.1 infuse_experience = 9.3 +familiar_time = 4 +summon_points = 1 [dreadfowl_pouch_noted] id = 12044 @@ -249,6 +287,8 @@ weight = 0.02 examine = "I can summon a stranger plant familiar with this." summon_experience = 3.2 infuse_experience = 281.6 +familiar_time = 49 +summon_points = 7 [stranger_plant_pouch_noted] id = 12046 @@ -261,6 +301,8 @@ weight = 0.02 examine = "I can summon a spirit wolf familiar with this." summon_experience = 0.1 infuse_experience = 4.8 +familiar_time = 6 +summon_points = 1 [spirit_wolf_pouch_noted] id = 12048 @@ -273,6 +315,8 @@ weight = 0.02 examine = "I can summon a desert wyrm familiar with this." summon_experience = 0.4 infuse_experience = 31.2 +familiar_time = 19 +summon_points = 1 [desert_wyrm_pouch_noted] id = 12050 @@ -285,6 +329,8 @@ weight = 0.02 examine = "I can summon an evil turnip familiar with this." summon_experience = 2.1 infuse_experience = 184.8 +familiar_time = 30 +summon_points = 5 [evil_turnip_pouch_noted] id = 12052 @@ -297,6 +343,8 @@ weight = 0.02 examine = "I can summon a vampyre bat familiar with this." summon_experience = 1.5 infuse_experience = 136.0 +familiar_time = 33 +summon_points = 4 [vampyre_bat_pouch_noted] id = 12054 @@ -309,6 +357,8 @@ weight = 0.02 examine = "I can summon a spirit scorpion familiar with this." summon_experience = 0.9 infuse_experience = 83.2 +familiar_time = 17 +summon_points = 2 [spirit_scorpion_pouch_noted] id = 12056 @@ -321,6 +371,8 @@ weight = 0.02 examine = "I can summon an arctic bear familiar with this." summon_experience = 1.1 infuse_experience = 93.2 +familiar_time = 28 +summon_points = 8 [arctic_bear_pouch_noted] id = 12058 @@ -333,6 +385,8 @@ weight = 0.02 examine = "I can summon a spirit spider familiar with this." summon_experience = 0.2 infuse_experience = 12.6 +familiar_time = 15 +summon_points = 2 [spirit_spider_pouch_noted] id = 12060 @@ -345,6 +399,8 @@ weight = 0.02 examine = "I can summon a bloated leech familiar with this." summon_experience = 2.4 infuse_experience = 215.2 +familiar_time = 34 +summon_points = 5 [bloated_leech_pouch_noted] id = 12062 @@ -357,6 +413,8 @@ weight = 0.02 examine = "I can summon a spirit kalphite familiar with this." summon_experience = 2.5 infuse_experience = 220.0 +familiar_time = 22 +summon_points = 3 [spirit_kalphite_pouch_noted] id = 12064 @@ -369,6 +427,8 @@ weight = 0.02 examine = "I can summon a honey badger familiar with this." summon_experience = 1.6 infuse_experience = 140.8 +familiar_time = 25 +summon_points = 4 [honey_badger_pouch_noted] id = 12066 @@ -381,6 +441,8 @@ weight = 0.02 examine = "I can summon an albino rat familiar with this." summon_experience = 2.3 infuse_experience = 202.4 +familiar_time = 22 +summon_points = 3 [albino_rat_pouch_noted] id = 12068 @@ -393,6 +455,8 @@ weight = 0.02 examine = "I can summon a granite lobster familiar with this." summon_experience = 3.7 infuse_experience = 325.6 +familiar_time = 47 +summon_points = 8 [granite_lobster_pouch_noted] id = 12070 @@ -405,6 +469,8 @@ weight = 0.02 examine = "I can summon a macaw familiar with this." summon_experience = 0.8 infuse_experience = 72.4 +familiar_time = 31 +summon_points = 5 [macaw_pouch_noted] id = 12072 @@ -417,6 +483,8 @@ weight = 0.02 examine = "Summons a level 43 combat familiar." summon_experience = 3.6 infuse_experience = 316.8 +familiar_time = 30 +summon_points = 9 [bronze_minotaur_pouch_noted] id = 12074 @@ -429,6 +497,8 @@ weight = 0.02 examine = "I can summon an iron minotaur familiar with this." summon_experience = 4.6 infuse_experience = 404.8 +familiar_time = 37 +summon_points = 9 [iron_minotaur_pouch_noted] id = 12076 @@ -441,6 +511,8 @@ weight = 0.02 examine = "I can summon a steel minotaur familiar with this." summon_experience = 1.1 infuse_experience = 492.8 +familiar_time = 46 +summon_points = 9 [steel_minotaur_pouch_noted] id = 12078 @@ -453,6 +525,8 @@ weight = 0.02 examine = "I can summon a mithril minotaur with this." summon_experience = 1.0 infuse_experience = 580.8 +familiar_time = 55 +summon_points = 9 [mithril_minotaur_pouch_noted] id = 12080 @@ -465,6 +539,8 @@ weight = 0.02 examine = "I can summon an adamant minotaur familiar with this." summon_experience = 1.5 infuse_experience = 668.8 +familiar_time = 66 +summon_points = 9 [adamant_minotaur_pouch_noted] id = 12082 @@ -477,6 +553,8 @@ weight = 0.02 examine = "I can summon a rune minotaur with this." summon_experience = 8.6 infuse_experience = 756.8 +familiar_time = 151 +summon_points = 9 [rune_minotaur_pouch_noted] id = 12084 @@ -489,6 +567,8 @@ weight = 0.02 examine = "I can summon a smoke devil familiar with this." summon_experience = 3.0 infuse_experience = 268.0 +familiar_time = 48 +summon_points = 7 [smoke_devil_pouch_noted] id = 12086 @@ -501,6 +581,8 @@ weight = 0.02 examine = "I can summon a bull ant familiar with this." summon_experience = 0.6 infuse_experience = 52.8 +familiar_time = 30 +summon_points = 5 [bull_ant_pouch_noted] id = 12088 @@ -513,6 +595,8 @@ weight = 0.02 examine = "I can summon a wolpertinger familiar with this." summon_experience = 4.5 infuse_experience = 404.8 +familiar_time = 62 +summon_points = 10 [wolpertinger_pouch_noted] id = 12090 @@ -525,6 +609,8 @@ weight = 0.02 examine = "I can summon a compost mound familiar with this." summon_experience = 0.6 infuse_experience = 49.8 +familiar_time = 24 +summon_points = 6 [compost_mound_pouch_noted] id = 12092 @@ -537,6 +623,8 @@ weight = 0.02 examine = "I can summon a pack yak familiar with this." summon_experience = 4.8 infuse_experience = 422.4 +familiar_time = 58 +summon_points = 10 [pack_yak_pouch_noted] id = 12094 @@ -549,6 +637,8 @@ weight = 0.02 examine = "I can summon a spirit cockatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_cockatrice_pouch_noted] id = 12096 @@ -561,6 +651,8 @@ weight = 0.02 examine = "I can summon a spirit guthatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_guthatrice_pouch_noted] id = 12098 @@ -573,6 +665,8 @@ weight = 0.02 examine = "I can summon a spirit saratrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_saratrice_pouch_noted] id = 12100 @@ -585,6 +679,8 @@ weight = 0.02 examine = "I can summon a spirit zamatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_zamatrice_pouch_noted] id = 12102 @@ -597,6 +693,8 @@ weight = 0.02 examine = "I can summon a spirit pengatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_pengatrice_pouch_noted] id = 12104 @@ -609,6 +707,8 @@ weight = 0.02 examine = "I can summon a spirit coraxatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_coraxatrice_pouch_noted] id = 12106 @@ -621,6 +721,8 @@ weight = 0.02 examine = "I can summon a spirit vulatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 +familiar_time = 36 +summon_points = 5 [spirit_vulatrice_pouch_noted] id = 12108 @@ -703,6 +805,8 @@ weight = 0.02 examine = "I can summon a barker toad familiar with this." summon_experience = 6.6 infuse_experience = 87.0 +familiar_time = 8 +summon_points = 7 [barker_toad_pouch_noted] id = 12124 @@ -2346,7 +2450,7 @@ limit = 5000 examine = "A scroll for a desert wyrm familiar." transform_experience = 0.4 use_experience = 0.4 -special_points = 6 +special_points = 6 [bronze_bull_rush_scroll] id = 12461 @@ -2839,6 +2943,8 @@ weight = 0.02 examine = "I can summon an ibis familiar with this." summon_experience = 5.6 infuse_experience = 98.8 +familiar_time = 38 +summon_points = 6 [ibis_pouch_noted] id = 12532 @@ -3849,6 +3955,8 @@ weight = 0.02 examine = "I can summon a swamp titan familiar with this." summon_experience = 4.2 infuse_experience = 373.6 +familiar_time = 56 +summon_points = 9 [swamp_titan_pouch_noted] id = 12777 @@ -3861,6 +3969,8 @@ weight = 0.02 examine = "I can summon a spirit mosquito familiar with this." summon_experience = 0.5 infuse_experience = 46.5 +familiar_time = 12 +summon_points = 2 [spirit_mosquito_pouch_noted] id = 12779 @@ -3873,6 +3983,8 @@ weight = 0.02 examine = "I can summon a void spinner familiar with this." summon_experience = 0.7 infuse_experience = 59.6 +familiar_time = 27 +summon_points = 4 [void_spinner_pouch_noted] id = 12781 @@ -3885,6 +3997,8 @@ weight = 0.02 examine = "I can summon a forge regent familiar with this." summon_experience = 7.6 infuse_experience = 134.0 +familiar_time = 45 +summon_points = 9 [forge_regent_pouch_noted] id = 12783 @@ -3897,6 +4011,8 @@ weight = 0.02 examine = "I can summon a spirit larupia familiar with this." summon_experience = 5.7 infuse_experience = 501.6 +familiar_time = 49 +summon_points = 6 [spirit_larupia_pouch_noted] id = 12785 @@ -3909,6 +4025,8 @@ weight = 0.02 examine = "I can summon a geyser titan familiar with this." summon_experience = 8.9 infuse_experience = 783.2 +familiar_time = 69 +summon_points = 10 [geyser_titan_pouch_noted] id = 12787 @@ -3921,6 +4039,8 @@ weight = 0.02 examine = "I can summon a lava titan familiar with this." summon_experience = 8.3 infuse_experience = 730.4 +familiar_time = 61 +summon_points = 9 [lava_titan_pouch_noted] id = 12789 @@ -3933,6 +4053,8 @@ weight = 0.02 examine = "I can summon a steel titan familiar with this." summon_experience = 4.9 infuse_experience = 435.2 +familiar_time = 64 +summon_points = 10 [steel_titan_pouch_noted] id = 12791 @@ -3945,6 +4067,8 @@ weight = 0.02 examine = "I can summon an obsidian golem familiar with this." summon_experience = 7.3 infuse_experience = 642.4 +familiar_time = 55 +summon_points = 8 [obsidian_golem_pouch_noted] id = 12793 @@ -3957,6 +4081,8 @@ weight = 0.02 examine = "I can summon a talon beast familiar with this." summon_experience = 3.9 infuse_experience = 1015.2 +familiar_time = 49 +summon_points = 9 [talon_beast_pouch_noted] id = 12795 @@ -3969,6 +4095,8 @@ weight = 0.02 examine = "I can summon an abyssal titan familiar with this." summon_experience = 1.9 infuse_experience = 163.2 +familiar_time = 32 +summon_points = 10 [abyssal_titan_pouch_noted] id = 12797 @@ -3981,6 +4109,8 @@ weight = 0.02 examine = "I can summon a void torcher familiar with this." summon_experience = 0.7 infuse_experience = 59.6 +familiar_time = 94 +summon_points = 4 [void_torcher_pouch_noted] id = 12799 @@ -3993,6 +4123,8 @@ weight = 0.02 examine = "I can summon a giant chinchompa familiar with this." summon_experience = 2.9 infuse_experience = 225.2 +familiar_time = 31 +summon_points = 1 [giant_chinchompa_pouch_noted] id = 12801 @@ -4005,6 +4137,8 @@ weight = 0.02 examine = "I can summon a fire titan familiar with this." summon_experience = 7.9 infuse_experience = 695.2 +familiar_time = 62 +summon_points = 9 [fire_titan_pouch_noted] id = 12803 @@ -4017,6 +4151,8 @@ weight = 0.02 examine = "I can summon a moss titan familiar with this." summon_experience = 7.9 infuse_experience = 695.2 +familiar_time = 58 +summon_points = 9 [moss_titan_pouch_noted] id = 12805 @@ -4029,6 +4165,8 @@ weight = 0.02 examine = "I can summon an ice titan familiar with this." summon_experience = 7.9 infuse_experience = 695.2 +familiar_time = 64 +summon_points = 9 [ice_titan_pouch_noted] id = 12807 @@ -4041,6 +4179,8 @@ weight = 0.02 examine = "I can summon a spirit Tz-Kih familiar with this." summon_experience = 1.1 infuse_experience = 96.8 +familiar_time = 18 +summon_points = 3 [spirit_tz_kih_pouch_noted] id = 12809 @@ -4053,6 +4193,8 @@ weight = 0.02 examine = "I can summon a spirit graahk familiar with this." summon_experience = 5.7 infuse_experience = 501.6 +familiar_time = 49 +summon_points = 6 [spirit_graahk_pouch_noted] id = 12811 @@ -4065,6 +4207,8 @@ weight = 0.02 examine = "I can summon a spirit kyatt familiar with this." summon_experience = 5.7 infuse_experience = 501.6 +familiar_time = 49 +summon_points = 6 [spirit_kyatt_pouch_noted] id = 12813 @@ -4077,6 +4221,8 @@ weight = 0.02 examine = "I can summon a void shifter familiar with this." summon_experience = 0.7 infuse_experience = 59.6 +familiar_time = 94 +summon_points = 4 [void_shifter_pouch_noted] id = 12815 @@ -4089,6 +4235,8 @@ weight = 0.02 examine = "I can summon a pyrelord familiar with this." summon_experience = 2.3 infuse_experience = 202.4 +familiar_time = 32 +summon_points = 5 [pyrelord_pouch_noted] id = 12817 @@ -4101,6 +4249,8 @@ weight = 0.02 examine = "I can summon a void ravager familiar with this." summon_experience = 0.7 infuse_experience = 59.6 +familiar_time = 27 +summon_points = 4 [void_ravager_pouch_noted] id = 12819 @@ -4113,6 +4263,8 @@ weight = 0.02 examine = "I can summon a ravenous locust familiar with this." summon_experience = 1.5 infuse_experience = 132.0 +familiar_time = 24 +summon_points = 4 [ravenous_locust_pouch_noted] id = 12821 @@ -4125,6 +4277,8 @@ weight = 0.02 examine = "I can summon an iron titan familiar with this." summon_experience = 4.7 infuse_experience = 417.6 +familiar_time = 60 +summon_points = 10 [iron_titan_pouch_noted] id = 12823 @@ -4315,6 +4469,8 @@ weight = 0.02 examine = "I can summon a phoenix familiar with this." summon_experience = 1.1 infuse_experience = 301.0 +familiar_time = 30 +summon_points = 8 [phoenix_pouch_noted] id = 14624 @@ -4387,6 +4543,8 @@ price = 1698 limit = 100 weight = 0.02 examine = "I can summon meerkat familiars with this." +familiar_time = 40 +summon_points = 1 [meerkats_pouch_noted] id = 19623 From c2e22d389b0b7fa4d967a350c5383a516d77396c Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Wed, 20 Aug 2025 13:40:18 -0300 Subject: [PATCH 23/46] Add summoning npcs file --- data/skill/summoning/summoning.npcs.toml | 431 +++++++++++++++++++++++ 1 file changed, 431 insertions(+) create mode 100644 data/skill/summoning/summoning.npcs.toml diff --git a/data/skill/summoning/summoning.npcs.toml b/data/skill/summoning/summoning.npcs.toml new file mode 100644 index 0000000000..03f431bc6b --- /dev/null +++ b/data/skill/summoning/summoning.npcs.toml @@ -0,0 +1,431 @@ +[spirit_terrorbird_familiar] +id = 6794 + +[granite_crab_familiar] +id = 6796 + +[praying_mantis_familiar] +id = 6798 + +[giant_ent_familiar] +id = 6800 + +[spirit_cobra_familiar] +id = 6802 + +[spirit_dagannoth_familiar] +id = 6804 + +[thorny_snail_familiar] +id = 6806 + +[beaver_familiar] +id = 6808 + +[karamthulhu_overlord_familiar] +id = 6809 + +[hydra_familiar] +id = 6811 + +[spirit_jelly_familiar] +id = 6992 + +[bunyip_familiar] +id = 6813 + +[war_tortoise_familiar] +id = 6815 + +[fruit_bat_familiar] +id = 6817 + +[abyssal_parasite_familiar] +id = 6818 + +[abyssal_lurker_familiar] +id = 6820 + +[unicorn_stallion_familiar] +id = 6822 + +[magpie_familiar] +id = 6824 + +[dreadfowl_familiar] +id = 6825 + +[stranger_plant_familiar] +id = 6827 + +[spirit_wolf_familiar] +id = 6829 + +[desert_wyrm_familiar] +id = 6831 + +[evil_turnip_familiar] +id = 6833 + +[vampire_bat_familiar] +id = 6835 + +[spirit_scorpion_familiar] +id = 6837 + +[arctic_bear_familiar] +id = 6839 + +[spirit_spider_familiar] +id = 6841 + +[bloated_leech_familiar] +id = 6843 + +[spirit_kalphite_familiar] +id = 6994 + +[honey_badger_familiar] +id = 6845 + +[albino_rat_familiar] +id = 6847 + +[granite_lobster_familiar] +id = 6849 + +[macaw_familiar] +id = 6851 + +[bronze_minotaur_familiar] +id = 6853 + +[iron_minotaur_familiar] +id = 6855 + +[steel_minotaur_familiar] +id = 6857 + +[mithril_minotaur_familiar] +id = 6859 + +[adamant_minotaur_familiar] +id = 6861 + +[rune_minotaur_familiar] +id = 6863 + +[smoke_devil_familiar] +id = 6865 + +[bull_ant_familiar] +id = 6867 + +[wolpertinger_familiar] +id = 6869 + +[compost_mound_familiar] +id = 6871 + +[pack_yak_familiar] +id = 6873 + +[spirit_cockatrice_familiar] +id = 6875 + +[spirit_guthatrice_familiar] +id = 6877 + +[spirit_saratrice_familiar] +id = 6879 + +[spirit_zamatrice_familiar] +id = 6881 + +[spirit_pengatrice_familiar] +id = 6883 + +[spirit_coraxatrice_familiar] +id = 6885 + +[spirit_vulatrice_familiar] +id = 6887 + +[barker_toad_familiar] +id = 6889 + +[ibis_familiar] +id = 6991 + +[swamp_titan_familiar] +id = 7329 + +[spirit_mosquito_familiar] +id = 7331 + +[void_spinner_familiar] +id = 7333 + +[forge_regent_familiar] +id = 7335 + +[spirit_larupia_familiar] +id = 7337 + +[geyser_titan_familiar] +id = 7339 + +[lava_titan_familiar] +id = 7341 + +[steel_titan_familiar] +id = 7343 + +[obsidian_golem_familiar] +id = 7345 + +[talon_beast_familiar] +id = 7347 + +[abyssal_titan_familiar] +id = 7349 + +[void_torcher_familiar] +id = 7351 + +[giant_chinchompa_familiar] +id = 7353 + +[fire_titan_familiar] +id = 7355 + +[moss_titan_familiar] +id = 7357 + +[ice_titan_familiar] +id = 7359 + +[spirit_tz-kih_familiar] +id = 7361 + +[spirit_graahk_familiar] +id = 7363 + +[spirit_kyatt_familiar] +id = 7365 + +[void_shifter_familiar] +id = 7367 + +[pyrelord_familiar] +id = 7377 + +[void_ravager_familiar] +id = 7370 + +[ravenous_locust_familiar] +id = 7372 + +[iron_titan_familiar] +id = 7375 + +[clay_familiar_class_1_familiar] +id = 8240 + +[clay_familiar_class_2_familiar] +id = 8242 + +[clay_familiar_class_3_familiar] +id = 8244 + +[clay_familiar_class_4_familiar] +id = 8246 + +[clay_familiar_class_5_familiar] +id = 8248 + +[phoenix_familiar] +id = 8575 + +[cub_bloodrager_familiar] +id = 11106 + +[little_bloodrager_familiar] +id = 11108 + +[naïve_bloodrager_familiar] +id = 11110 + +[keen_bloodrager_familiar] +id = 11112 + +[brave_bloodrager_familiar] +id = 11114 + +[brah_bloodrager_familiar] +id = 11116 + +[naabe_bloodrager_familiar] +id = 11118 + +[wise_bloodrager_familiar] +id = 11120 + +[adept_bloodrager_familiar] +id = 11122 + +[sachem_bloodrager_familiar] +id = 11124 + +[cub_stormbringer_familiar] +id = 11126 + +[little_stormbringer_familiar] +id = 11128 + +[naïve_stormbringer_familiar] +id = 11130 + +[keen_stormbringer_familiar] +id = 11132 + +[brave_stormbringer_familiar] +id = 11134 + +[brah_stormbringer_familiar] +id = 11136 + +[naabe_stormbringer_familiar] +id = 11138 + +[wise_stormbringer_familiar] +id = 11140 + +[adept_stormbringer_familiar] +id = 11142 + +[sachem_stormbringer_familiar] +id = 11144 + +[cub_hoardstalker_familiar] +id = 11146 + +[little_hoardstalker_familiar] +id = 11148 + +[naïve_hoardstalker_familiar] +id = 11150 + +[keen_hoardstalker_familiar] +id = 11152 + +[brave_hoardstalker_familiar] +id = 11154 + +[brah_hoardstalker_familiar] +id = 11156 + +[naabe_hoardstalker_familiar] +id = 11158 + +[wise_hoardstalker_familiar] +id = 11160 + +[adept_hoardstalker_familiar] +id = 11162 + +[sachem_hoardstalker_familiar] +id = 11164 + +[cub_skinweaver_familiar] +id = 11166 + +[little_skinweaver_familiar] +id = 11168 + +[naïve_skinweaver_familiar] +id = 11170 + +[keen_skinweaver_familiar] +id = 11172 + +[brave_skinweaver_familiar] +id = 11174 + +[brah_skinweaver_familiar] +id = 11176 + +[naabe_skinweaver_familiar] +id = 11178 + +[wise_skinweaver_familiar] +id = 11180 + +[adept_skinweaver_familiar] +id = 11182 + +[sachem_skinweaver_familiar] +id = 11184 + +[cub_worldbearer_familiar] +id = 11186 + +[little_worldbearer_familiar] +id = 11188 + +[naïve_worldbearer_familiar] +id = 11190 + +[keen_worldbearer_familiar] +id = 11192 + +[brave_worldbearer_familiar] +id = 11194 + +[brah_worldbearer_familiar] +id = 11196 + +[naabe_worldbearer_familiar] +id = 11198 + +[wise_worldbearer_familiar] +id = 11200 + +[adept_worldbearer_familiar] +id = 11202 + +[sachem_worldbearer_familiar] +id = 11204 + +[cub_deathslinger_familiar] +id = 11206 + +[little_deathslinger_familiar] +id = 11208 + +[naive_deathslinger_familiar] +id = 11210 + +[keen_deathslinger_familiar] +id = 11212 + +[brave_deathslinger_familiar] +id = 11214 + +[brah_deathslinger_familiar] +id = 11216 + +[naabe_deathslinger_familiar] +id = 11218 + +[wise_deathslinger_familiar] +id = 11220 + +[adept_deathslinger_familiar] +id = 11222 + +[sachem_deathslinger_familiar] +id = 11224 + +[meerkats_familiar] +id = 11640 \ No newline at end of file From d27a9ee3762c4af63be26e2d2c622656982c4c9a Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Wed, 20 Aug 2025 13:42:09 -0300 Subject: [PATCH 24/46] Move familiar time to npc data file --- data/skill/summoning/summoning.items.toml | 80 ----------------------- data/skill/summoning/summoning.npcs.toml | 80 ++++++++++++++++++++++- 2 files changed, 79 insertions(+), 81 deletions(-) diff --git a/data/skill/summoning/summoning.items.toml b/data/skill/summoning/summoning.items.toml index 564b0afd61..2e6fa3f4fd 100644 --- a/data/skill/summoning/summoning.items.toml +++ b/data/skill/summoning/summoning.items.toml @@ -21,7 +21,6 @@ weight = 0.02 examine = "I can summon a spirit terrorbird familiar with this." summon_experience = 0.8 infuse_experience = 68.4 -familiar_time = 36 summon_points = 6 [spirit_terrorbird_pouch_noted] @@ -35,7 +34,6 @@ weight = 0.02 examine = "I can summon a granite crab familiar with this." summon_experience = 0.2 infuse_experience = 21.6 -familiar_time = 18 summon_points = 2 [granite_crab_pouch_noted] @@ -49,7 +47,6 @@ weight = 0.02 examine = "I can summon a praying mantis familiar with this." summon_experience = 3.6 infuse_experience = 329.6 -familiar_time = 69 summon_points = 8 [praying_mantis_pouch_noted] @@ -63,7 +60,6 @@ weight = 0.02 examine = "I can summon a giant ent familiar with this." summon_experience = 1.6 infuse_experience = 136.8 -familiar_time = 49 summon_points = 8 [giant_ent_pouch_noted] @@ -77,7 +73,6 @@ weight = 0.02 examine = "I can summon a spirit cobra familiar with this." summon_experience = 3.1 infuse_experience = 276.8 -familiar_time = 56 summon_points = 7 [spirit_cobra_pouch_noted] @@ -91,7 +86,6 @@ weight = 0.02 examine = "I can summon a spirit dagannoth familiar with this." summon_experience = 4.1 infuse_experience = 364.8 -familiar_time = 57 summon_points = 9 [spirit_dagannoth_pouch_noted] @@ -105,7 +99,6 @@ weight = 0.02 examine = "I can summon a thorny snail familiar with this." summon_experience = 0.2 infuse_experience = 12.6 -familiar_time = 16 summon_points = 2 [thorny_snail_pouch_noted] @@ -119,7 +112,6 @@ weight = 0.02 examine = "I can summon a beaver familiar with this." summon_experience = 0.7 infuse_experience = 57.6 -familiar_time = 27 summon_points = 4 [beaver_pouch_noted] @@ -133,8 +125,6 @@ weight = 0.02 examine = "I can summon a karamthulhu overlord familiar with this." summon_experience = 5.8 infuse_experience = 510.5 -familiar_time = 44 -summon_points = 6 [karam_overlord_pouch_noted] id = 12024 @@ -147,7 +137,6 @@ weight = 0.02 examine = "I can summon a hydra familiar with this." summon_experience = 1.6 infuse_experience = 140.8 -familiar_time = 49 summon_points = 8 [hydra_pouch_noted] @@ -161,7 +150,6 @@ weight = 0.02 examine = "I can summon a spirit jelly familiar with this." summon_experience = 5.5 infuse_experience = 484.0 -familiar_time = 43 summon_points = 6 [spirit_jelly_pouch_noted] @@ -175,7 +163,6 @@ weight = 0.02 examine = "I can summon a bunyip familiar with this." summon_experience = 1.4 infuse_experience = 119.2 -familiar_time = 44 summon_points = 7 [bunyip_pouch_noted] @@ -189,7 +176,6 @@ weight = 0.02 examine = "I can summon a war tortoise familiar with this." summon_experience = 0.7 infuse_experience = 58.6 -familiar_time = 43 summon_points = 7 [war_tortoise_pouch_noted] @@ -203,7 +189,6 @@ weight = 0.02 examine = "I can summon a fruit bat familiar with this." summon_experience = 1.4 infuse_experience = 121.2 -familiar_time = 45 summon_points = 7 [fruit_bat_pouch_noted] @@ -217,7 +202,6 @@ weight = 0.02 examine = "I can summon an abyssal parasite familiar with this." summon_experience = 1.1 infuse_experience = 94.8 -familiar_time = 30 summon_points = 6 [abyssal_parasite_pouch_noted] @@ -231,7 +215,6 @@ weight = 0.02 examine = "I can summon an abyssal lurker familiar with this." summon_experience = 1.9 infuse_experience = 109.6 -familiar_time = 41 summon_points = 7 [abyssal_lurker_pouch_noted] @@ -245,7 +228,6 @@ weight = 0.02 examine = "I can summon a unicorn stallion familiar with this." summon_experience = 1.8 infuse_experience = 154.4 -familiar_time = 54 summon_points = 9 [unicorn_stallion_pouch_noted] @@ -259,7 +241,6 @@ weight = 0.02 examine = "I can summon a magpie familiar with this." summon_experience = 0.9 infuse_experience = 83.2 -familiar_time = 34 summon_points = 5 [magpie_pouch_noted] @@ -273,7 +254,6 @@ weight = 0.02 examine = "I can summon a dreadfowl familiar with this." summon_experience = 0.1 infuse_experience = 9.3 -familiar_time = 4 summon_points = 1 [dreadfowl_pouch_noted] @@ -287,7 +267,6 @@ weight = 0.02 examine = "I can summon a stranger plant familiar with this." summon_experience = 3.2 infuse_experience = 281.6 -familiar_time = 49 summon_points = 7 [stranger_plant_pouch_noted] @@ -301,7 +280,6 @@ weight = 0.02 examine = "I can summon a spirit wolf familiar with this." summon_experience = 0.1 infuse_experience = 4.8 -familiar_time = 6 summon_points = 1 [spirit_wolf_pouch_noted] @@ -315,7 +293,6 @@ weight = 0.02 examine = "I can summon a desert wyrm familiar with this." summon_experience = 0.4 infuse_experience = 31.2 -familiar_time = 19 summon_points = 1 [desert_wyrm_pouch_noted] @@ -329,7 +306,6 @@ weight = 0.02 examine = "I can summon an evil turnip familiar with this." summon_experience = 2.1 infuse_experience = 184.8 -familiar_time = 30 summon_points = 5 [evil_turnip_pouch_noted] @@ -343,7 +319,6 @@ weight = 0.02 examine = "I can summon a vampyre bat familiar with this." summon_experience = 1.5 infuse_experience = 136.0 -familiar_time = 33 summon_points = 4 [vampyre_bat_pouch_noted] @@ -357,7 +332,6 @@ weight = 0.02 examine = "I can summon a spirit scorpion familiar with this." summon_experience = 0.9 infuse_experience = 83.2 -familiar_time = 17 summon_points = 2 [spirit_scorpion_pouch_noted] @@ -371,7 +345,6 @@ weight = 0.02 examine = "I can summon an arctic bear familiar with this." summon_experience = 1.1 infuse_experience = 93.2 -familiar_time = 28 summon_points = 8 [arctic_bear_pouch_noted] @@ -385,7 +358,6 @@ weight = 0.02 examine = "I can summon a spirit spider familiar with this." summon_experience = 0.2 infuse_experience = 12.6 -familiar_time = 15 summon_points = 2 [spirit_spider_pouch_noted] @@ -399,7 +371,6 @@ weight = 0.02 examine = "I can summon a bloated leech familiar with this." summon_experience = 2.4 infuse_experience = 215.2 -familiar_time = 34 summon_points = 5 [bloated_leech_pouch_noted] @@ -413,7 +384,6 @@ weight = 0.02 examine = "I can summon a spirit kalphite familiar with this." summon_experience = 2.5 infuse_experience = 220.0 -familiar_time = 22 summon_points = 3 [spirit_kalphite_pouch_noted] @@ -427,7 +397,6 @@ weight = 0.02 examine = "I can summon a honey badger familiar with this." summon_experience = 1.6 infuse_experience = 140.8 -familiar_time = 25 summon_points = 4 [honey_badger_pouch_noted] @@ -441,7 +410,6 @@ weight = 0.02 examine = "I can summon an albino rat familiar with this." summon_experience = 2.3 infuse_experience = 202.4 -familiar_time = 22 summon_points = 3 [albino_rat_pouch_noted] @@ -455,7 +423,6 @@ weight = 0.02 examine = "I can summon a granite lobster familiar with this." summon_experience = 3.7 infuse_experience = 325.6 -familiar_time = 47 summon_points = 8 [granite_lobster_pouch_noted] @@ -469,7 +436,6 @@ weight = 0.02 examine = "I can summon a macaw familiar with this." summon_experience = 0.8 infuse_experience = 72.4 -familiar_time = 31 summon_points = 5 [macaw_pouch_noted] @@ -483,7 +449,6 @@ weight = 0.02 examine = "Summons a level 43 combat familiar." summon_experience = 3.6 infuse_experience = 316.8 -familiar_time = 30 summon_points = 9 [bronze_minotaur_pouch_noted] @@ -497,7 +462,6 @@ weight = 0.02 examine = "I can summon an iron minotaur familiar with this." summon_experience = 4.6 infuse_experience = 404.8 -familiar_time = 37 summon_points = 9 [iron_minotaur_pouch_noted] @@ -511,7 +475,6 @@ weight = 0.02 examine = "I can summon a steel minotaur familiar with this." summon_experience = 1.1 infuse_experience = 492.8 -familiar_time = 46 summon_points = 9 [steel_minotaur_pouch_noted] @@ -525,7 +488,6 @@ weight = 0.02 examine = "I can summon a mithril minotaur with this." summon_experience = 1.0 infuse_experience = 580.8 -familiar_time = 55 summon_points = 9 [mithril_minotaur_pouch_noted] @@ -539,7 +501,6 @@ weight = 0.02 examine = "I can summon an adamant minotaur familiar with this." summon_experience = 1.5 infuse_experience = 668.8 -familiar_time = 66 summon_points = 9 [adamant_minotaur_pouch_noted] @@ -553,7 +514,6 @@ weight = 0.02 examine = "I can summon a rune minotaur with this." summon_experience = 8.6 infuse_experience = 756.8 -familiar_time = 151 summon_points = 9 [rune_minotaur_pouch_noted] @@ -567,7 +527,6 @@ weight = 0.02 examine = "I can summon a smoke devil familiar with this." summon_experience = 3.0 infuse_experience = 268.0 -familiar_time = 48 summon_points = 7 [smoke_devil_pouch_noted] @@ -581,7 +540,6 @@ weight = 0.02 examine = "I can summon a bull ant familiar with this." summon_experience = 0.6 infuse_experience = 52.8 -familiar_time = 30 summon_points = 5 [bull_ant_pouch_noted] @@ -595,7 +553,6 @@ weight = 0.02 examine = "I can summon a wolpertinger familiar with this." summon_experience = 4.5 infuse_experience = 404.8 -familiar_time = 62 summon_points = 10 [wolpertinger_pouch_noted] @@ -609,7 +566,6 @@ weight = 0.02 examine = "I can summon a compost mound familiar with this." summon_experience = 0.6 infuse_experience = 49.8 -familiar_time = 24 summon_points = 6 [compost_mound_pouch_noted] @@ -623,7 +579,6 @@ weight = 0.02 examine = "I can summon a pack yak familiar with this." summon_experience = 4.8 infuse_experience = 422.4 -familiar_time = 58 summon_points = 10 [pack_yak_pouch_noted] @@ -637,7 +592,6 @@ weight = 0.02 examine = "I can summon a spirit cockatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_cockatrice_pouch_noted] @@ -651,7 +605,6 @@ weight = 0.02 examine = "I can summon a spirit guthatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_guthatrice_pouch_noted] @@ -665,7 +618,6 @@ weight = 0.02 examine = "I can summon a spirit saratrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_saratrice_pouch_noted] @@ -679,7 +631,6 @@ weight = 0.02 examine = "I can summon a spirit zamatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_zamatrice_pouch_noted] @@ -693,7 +644,6 @@ weight = 0.02 examine = "I can summon a spirit pengatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_pengatrice_pouch_noted] @@ -707,7 +657,6 @@ weight = 0.02 examine = "I can summon a spirit coraxatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_coraxatrice_pouch_noted] @@ -721,7 +670,6 @@ weight = 0.02 examine = "I can summon a spirit vulatrice familiar with this." summon_experience = 0.9 infuse_experience = 75.2 -familiar_time = 36 summon_points = 5 [spirit_vulatrice_pouch_noted] @@ -805,7 +753,6 @@ weight = 0.02 examine = "I can summon a barker toad familiar with this." summon_experience = 6.6 infuse_experience = 87.0 -familiar_time = 8 summon_points = 7 [barker_toad_pouch_noted] @@ -2943,7 +2890,6 @@ weight = 0.02 examine = "I can summon an ibis familiar with this." summon_experience = 5.6 infuse_experience = 98.8 -familiar_time = 38 summon_points = 6 [ibis_pouch_noted] @@ -3955,7 +3901,6 @@ weight = 0.02 examine = "I can summon a swamp titan familiar with this." summon_experience = 4.2 infuse_experience = 373.6 -familiar_time = 56 summon_points = 9 [swamp_titan_pouch_noted] @@ -3969,7 +3914,6 @@ weight = 0.02 examine = "I can summon a spirit mosquito familiar with this." summon_experience = 0.5 infuse_experience = 46.5 -familiar_time = 12 summon_points = 2 [spirit_mosquito_pouch_noted] @@ -3983,7 +3927,6 @@ weight = 0.02 examine = "I can summon a void spinner familiar with this." summon_experience = 0.7 infuse_experience = 59.6 -familiar_time = 27 summon_points = 4 [void_spinner_pouch_noted] @@ -3997,7 +3940,6 @@ weight = 0.02 examine = "I can summon a forge regent familiar with this." summon_experience = 7.6 infuse_experience = 134.0 -familiar_time = 45 summon_points = 9 [forge_regent_pouch_noted] @@ -4011,7 +3953,6 @@ weight = 0.02 examine = "I can summon a spirit larupia familiar with this." summon_experience = 5.7 infuse_experience = 501.6 -familiar_time = 49 summon_points = 6 [spirit_larupia_pouch_noted] @@ -4025,7 +3966,6 @@ weight = 0.02 examine = "I can summon a geyser titan familiar with this." summon_experience = 8.9 infuse_experience = 783.2 -familiar_time = 69 summon_points = 10 [geyser_titan_pouch_noted] @@ -4039,7 +3979,6 @@ weight = 0.02 examine = "I can summon a lava titan familiar with this." summon_experience = 8.3 infuse_experience = 730.4 -familiar_time = 61 summon_points = 9 [lava_titan_pouch_noted] @@ -4053,7 +3992,6 @@ weight = 0.02 examine = "I can summon a steel titan familiar with this." summon_experience = 4.9 infuse_experience = 435.2 -familiar_time = 64 summon_points = 10 [steel_titan_pouch_noted] @@ -4067,7 +4005,6 @@ weight = 0.02 examine = "I can summon an obsidian golem familiar with this." summon_experience = 7.3 infuse_experience = 642.4 -familiar_time = 55 summon_points = 8 [obsidian_golem_pouch_noted] @@ -4081,7 +4018,6 @@ weight = 0.02 examine = "I can summon a talon beast familiar with this." summon_experience = 3.9 infuse_experience = 1015.2 -familiar_time = 49 summon_points = 9 [talon_beast_pouch_noted] @@ -4095,7 +4031,6 @@ weight = 0.02 examine = "I can summon an abyssal titan familiar with this." summon_experience = 1.9 infuse_experience = 163.2 -familiar_time = 32 summon_points = 10 [abyssal_titan_pouch_noted] @@ -4109,7 +4044,6 @@ weight = 0.02 examine = "I can summon a void torcher familiar with this." summon_experience = 0.7 infuse_experience = 59.6 -familiar_time = 94 summon_points = 4 [void_torcher_pouch_noted] @@ -4123,7 +4057,6 @@ weight = 0.02 examine = "I can summon a giant chinchompa familiar with this." summon_experience = 2.9 infuse_experience = 225.2 -familiar_time = 31 summon_points = 1 [giant_chinchompa_pouch_noted] @@ -4137,7 +4070,6 @@ weight = 0.02 examine = "I can summon a fire titan familiar with this." summon_experience = 7.9 infuse_experience = 695.2 -familiar_time = 62 summon_points = 9 [fire_titan_pouch_noted] @@ -4151,7 +4083,6 @@ weight = 0.02 examine = "I can summon a moss titan familiar with this." summon_experience = 7.9 infuse_experience = 695.2 -familiar_time = 58 summon_points = 9 [moss_titan_pouch_noted] @@ -4165,7 +4096,6 @@ weight = 0.02 examine = "I can summon an ice titan familiar with this." summon_experience = 7.9 infuse_experience = 695.2 -familiar_time = 64 summon_points = 9 [ice_titan_pouch_noted] @@ -4179,7 +4109,6 @@ weight = 0.02 examine = "I can summon a spirit Tz-Kih familiar with this." summon_experience = 1.1 infuse_experience = 96.8 -familiar_time = 18 summon_points = 3 [spirit_tz_kih_pouch_noted] @@ -4193,7 +4122,6 @@ weight = 0.02 examine = "I can summon a spirit graahk familiar with this." summon_experience = 5.7 infuse_experience = 501.6 -familiar_time = 49 summon_points = 6 [spirit_graahk_pouch_noted] @@ -4207,7 +4135,6 @@ weight = 0.02 examine = "I can summon a spirit kyatt familiar with this." summon_experience = 5.7 infuse_experience = 501.6 -familiar_time = 49 summon_points = 6 [spirit_kyatt_pouch_noted] @@ -4221,7 +4148,6 @@ weight = 0.02 examine = "I can summon a void shifter familiar with this." summon_experience = 0.7 infuse_experience = 59.6 -familiar_time = 94 summon_points = 4 [void_shifter_pouch_noted] @@ -4235,7 +4161,6 @@ weight = 0.02 examine = "I can summon a pyrelord familiar with this." summon_experience = 2.3 infuse_experience = 202.4 -familiar_time = 32 summon_points = 5 [pyrelord_pouch_noted] @@ -4249,7 +4174,6 @@ weight = 0.02 examine = "I can summon a void ravager familiar with this." summon_experience = 0.7 infuse_experience = 59.6 -familiar_time = 27 summon_points = 4 [void_ravager_pouch_noted] @@ -4263,7 +4187,6 @@ weight = 0.02 examine = "I can summon a ravenous locust familiar with this." summon_experience = 1.5 infuse_experience = 132.0 -familiar_time = 24 summon_points = 4 [ravenous_locust_pouch_noted] @@ -4277,7 +4200,6 @@ weight = 0.02 examine = "I can summon an iron titan familiar with this." summon_experience = 4.7 infuse_experience = 417.6 -familiar_time = 60 summon_points = 10 [iron_titan_pouch_noted] @@ -4469,7 +4391,6 @@ weight = 0.02 examine = "I can summon a phoenix familiar with this." summon_experience = 1.1 infuse_experience = 301.0 -familiar_time = 30 summon_points = 8 [phoenix_pouch_noted] @@ -4543,7 +4464,6 @@ price = 1698 limit = 100 weight = 0.02 examine = "I can summon meerkat familiars with this." -familiar_time = 40 summon_points = 1 [meerkats_pouch_noted] diff --git a/data/skill/summoning/summoning.npcs.toml b/data/skill/summoning/summoning.npcs.toml index 03f431bc6b..ce0b7355f9 100644 --- a/data/skill/summoning/summoning.npcs.toml +++ b/data/skill/summoning/summoning.npcs.toml @@ -1,233 +1,309 @@ [spirit_terrorbird_familiar] id = 6794 +familiar_time = 36 [granite_crab_familiar] id = 6796 +familiar_time = 18 [praying_mantis_familiar] id = 6798 +familiar_time = 69 [giant_ent_familiar] id = 6800 +familiar_time = 49 [spirit_cobra_familiar] id = 6802 +familiar_time = 56 [spirit_dagannoth_familiar] id = 6804 +familiar_time = 57 [thorny_snail_familiar] id = 6806 +familiar_time = 16 [beaver_familiar] id = 6808 +familiar_time = 27 [karamthulhu_overlord_familiar] id = 6809 +familiar_time = 44 [hydra_familiar] id = 6811 +familiar_time = 49 [spirit_jelly_familiar] id = 6992 +familiar_time = 43 [bunyip_familiar] id = 6813 +familiar_time = 44 [war_tortoise_familiar] id = 6815 +familiar_time = 43 [fruit_bat_familiar] id = 6817 +familiar_time = 45 [abyssal_parasite_familiar] id = 6818 +familiar_time = 30 [abyssal_lurker_familiar] id = 6820 +familiar_time = 41 [unicorn_stallion_familiar] id = 6822 +familiar_time = 54 [magpie_familiar] id = 6824 +familiar_time = 34 [dreadfowl_familiar] id = 6825 +familiar_time = 4 [stranger_plant_familiar] id = 6827 +familiar_time = 49 [spirit_wolf_familiar] id = 6829 +familiar_time = 6 [desert_wyrm_familiar] id = 6831 +familiar_time = 19 [evil_turnip_familiar] id = 6833 +familiar_time = 30 [vampire_bat_familiar] id = 6835 [spirit_scorpion_familiar] id = 6837 +familiar_time = 17 [arctic_bear_familiar] id = 6839 +familiar_time = 28 [spirit_spider_familiar] id = 6841 +familiar_time = 15 [bloated_leech_familiar] id = 6843 +familiar_time = 34 [spirit_kalphite_familiar] id = 6994 +familiar_time = 22 [honey_badger_familiar] id = 6845 +familiar_time = 25 [albino_rat_familiar] id = 6847 +familiar_time = 22 [granite_lobster_familiar] id = 6849 +familiar_time = 47 [macaw_familiar] id = 6851 +familiar_time = 31 [bronze_minotaur_familiar] id = 6853 +familiar_time = 30 [iron_minotaur_familiar] id = 6855 +familiar_time = 37 [steel_minotaur_familiar] id = 6857 +familiar_time = 46 [mithril_minotaur_familiar] id = 6859 +familiar_time = 55 [adamant_minotaur_familiar] id = 6861 +familiar_time = 66 [rune_minotaur_familiar] id = 6863 +familiar_time = 151 [smoke_devil_familiar] id = 6865 +familiar_time = 48 [bull_ant_familiar] id = 6867 +familiar_time = 30 [wolpertinger_familiar] id = 6869 +familiar_time = 62 [compost_mound_familiar] id = 6871 +familiar_time = 24 [pack_yak_familiar] id = 6873 +familiar_time = 58 [spirit_cockatrice_familiar] id = 6875 +familiar_time = 36 [spirit_guthatrice_familiar] id = 6877 +familiar_time = 36 [spirit_saratrice_familiar] id = 6879 +familiar_time = 36 [spirit_zamatrice_familiar] id = 6881 +familiar_time = 36 [spirit_pengatrice_familiar] id = 6883 +familiar_time = 36 [spirit_coraxatrice_familiar] id = 6885 +familiar_time = 36 [spirit_vulatrice_familiar] id = 6887 +familiar_time = 36 [barker_toad_familiar] id = 6889 +familiar_time = 8 [ibis_familiar] id = 6991 +familiar_time = 38 [swamp_titan_familiar] id = 7329 +familiar_time = 56 [spirit_mosquito_familiar] id = 7331 +familiar_time = 12 [void_spinner_familiar] id = 7333 +familiar_time = 27 [forge_regent_familiar] id = 7335 +familiar_time = 45 [spirit_larupia_familiar] id = 7337 +familiar_time = 49 [geyser_titan_familiar] id = 7339 +familiar_time = 69 [lava_titan_familiar] id = 7341 +familiar_time = 61 [steel_titan_familiar] id = 7343 +familiar_time = 64 [obsidian_golem_familiar] id = 7345 +familiar_time = 55 [talon_beast_familiar] id = 7347 +familiar_time = 49 [abyssal_titan_familiar] id = 7349 +familiar_time = 32 [void_torcher_familiar] id = 7351 +familiar_time = 94 [giant_chinchompa_familiar] id = 7353 +familiar_time = 31 [fire_titan_familiar] id = 7355 +familiar_time = 62 [moss_titan_familiar] id = 7357 +familiar_time = 58 [ice_titan_familiar] id = 7359 +familiar_time = 64 [spirit_tz-kih_familiar] id = 7361 +familiar_time = 18 [spirit_graahk_familiar] id = 7363 +familiar_time = 49 [spirit_kyatt_familiar] id = 7365 +familiar_time = 49 [void_shifter_familiar] id = 7367 +familiar_time = 94 [pyrelord_familiar] id = 7377 +familiar_time = 32 [void_ravager_familiar] id = 7370 +familiar_time = 27 [ravenous_locust_familiar] id = 7372 +familiar_time = 24 [iron_titan_familiar] id = 7375 +familiar_time = 60 [clay_familiar_class_1_familiar] id = 8240 @@ -246,6 +322,7 @@ id = 8248 [phoenix_familiar] id = 8575 +familiar_time = 30 [cub_bloodrager_familiar] id = 11106 @@ -428,4 +505,5 @@ id = 11222 id = 11224 [meerkats_familiar] -id = 11640 \ No newline at end of file +id = 11640 +familiar_time = 40 \ No newline at end of file From 5b61c144647207b1133098e82ad2105788594eca Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Wed, 20 Aug 2025 14:48:12 -0300 Subject: [PATCH 25/46] Implement familiar timers --- data/skill/summoning/summoning.varbits.toml | 4 +- .../engine/entity/character/player/Player.kt | 12 ----- .../content/skill/summoning/Summoning.kts | 44 +++++++++++++++++++ 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index 7fd12a114e..0d2d73ce5b 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -26,12 +26,12 @@ id = 4288 format = "int" persist = true -[pet_details_seconds_remaining] +[familiar_details_seconds_remaining] id = 4290 format = "int" persist = true -[pet_details_minutes_remaining] +[familiar_details_minutes_remaining] id = 4534 format = "int" persist = true diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt index d2429289ca..28996a82fa 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Player.kt @@ -111,18 +111,6 @@ class Player( override val steps = Steps(this) - var Player.follower: NPC? - get() { - val index = this["follower_index", -1] - return get().indexed(index) - } - set(value) { - if (value != null) { - this["follower_index"] = value.index - this["follower_id"] = value.id - } - } - override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 0288b59ca1..dac7e9706e 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -17,10 +17,24 @@ import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.engine.queue.softQueue +import world.gregs.voidps.engine.timer.timerStart +import world.gregs.voidps.engine.timer.timerStop +import world.gregs.voidps.engine.timer.timerTick val enums: EnumDefinitions by inject() val npcs: NPCs by inject() val npcDefinitions: NPCDefinitions by inject() +var Player.follower: NPC? + get() { + val index = this["follower_index", -1] + return world.gregs.voidps.engine.get().indexed(index) + } + set(value) { + if (value != null) { + this["follower_index"] = value.index + this["follower_id"] = value.id + } + } inventoryItem("Summon", "*_pouch") { val familiarLevel = enums.get("summoning_pouch_levels").getInt(item.def.id) @@ -103,6 +117,7 @@ fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { follower!!.gfx("summon_familiar_size_${follower!!.size}") player.updateFamiliarInterface() + timers.start("familiar_timer") } return familiarNpc @@ -115,6 +130,9 @@ fun Player.dismissFamiliar() { this["follower_details_name"] = -1 this["follower_details_chathead"] = -1 + this["familiar_details_minutes_remaining"] = 0 + this["familiar_details_seconds_remaining"] = 0 + timers.stop("familiar_timer") } fun Player.updateFamiliarInterface() { @@ -140,4 +158,30 @@ fun Player.confirmFollowerLeftClickOptions() { fun Player.callFollower() { follower!!.tele(steps.follow, clearMode = false) follower!!.clearWatch() +} + +timerStart("familiar_timer") {player -> + interval = 50 // 30 seconds + + player["familiar_details_minutes_remaining"] = player.follower!!.def["familiar_time", 0] + player["familiar_details_seconds_remaining"] = 0 +} + +timerTick("familiar_timer") {player -> + if (player["familiar_details_seconds_remaining", 0] == 0) { + player.dec("familiar_details_minutes_remaining") + } + player["familiar_details_seconds_remaining"] = (player["familiar_details_seconds_remaining", 0] + 1) % 2 + + if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { + cancel() + } + + println("${player["familiar_details_minutes_remaining", 0]}:${player["familiar_details_seconds_remaining", 0]}") +} + +timerStop("familiar_timer") {player -> + if (player.follower != null) { + player.dismissFamiliar() + } } \ No newline at end of file From ff870a31ea051a31d8df5375fc3eb80afe24a635 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 22 Aug 2025 15:43:50 -0300 Subject: [PATCH 26/46] Remove println --- game/src/main/kotlin/content/skill/summoning/Summoning.kts | 2 -- 1 file changed, 2 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index dac7e9706e..f924656e57 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -176,8 +176,6 @@ timerTick("familiar_timer") {player -> if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { cancel() } - - println("${player["familiar_details_minutes_remaining", 0]}:${player["familiar_details_seconds_remaining", 0]}") } timerStop("familiar_timer") {player -> From f2dce5a2ead5758df4e3e41e32feb82ad5ec5419 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 22 Aug 2025 16:30:30 -0300 Subject: [PATCH 27/46] Implement renewing familiars --- .../content/skill/summoning/Summoning.kts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index f924656e57..c99a9c06ed 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -6,6 +6,7 @@ import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions +import world.gregs.voidps.engine.data.definition.ItemDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.mode.Follow import world.gregs.voidps.engine.entity.character.move.tele @@ -13,6 +14,7 @@ import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.entity.item.Item import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove @@ -24,6 +26,8 @@ import world.gregs.voidps.engine.timer.timerTick val enums: EnumDefinitions by inject() val npcs: NPCs by inject() val npcDefinitions: NPCDefinitions by inject() +val itemDefinitions: ItemDefinitions by inject() + var Player.follower: NPC? get() { val index = this["follower_index", -1] @@ -80,6 +84,10 @@ interfaceOption("Dismiss", id = "summoning_orb") { player.dismissFamiliar() } +interfaceOption("Renew Familiar", id = "summoning_orb") { + player.renewFamiliar() +} + interfaceOption("Dismiss *", "dismiss", "familiar_details") { when (option) { "Dismiss Familiar" -> { @@ -94,6 +102,10 @@ interfaceOption("Dismiss *", "dismiss", "familiar_details") { } } +interfaceOption("Renew Familiar", "renew", "familiar_details") { + player.renewFamiliar() +} + interfaceOption("Call *", "call", "*_details") { player.callFollower() } @@ -160,6 +172,22 @@ fun Player.callFollower() { follower!!.clearWatch() } +fun Player.renewFamiliar() { + val pouchId = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) + val pouchItem = Item(itemDefinitions.get(pouchId).stringId) + + if (!inventory.contains(pouchItem.id)) { + // TODO: Find the actual message used here in 2011 + message("You don't have the required pouch to renew your familiar.") + return + } + + inventory.remove(pouchItem.id) + this["familiar_details_minutes_remaining"] = follower!!.def["familiar_time", 0] + this["familiar_details_seconds_remaining"] = 0 + follower!!.gfx("summon_familiar_size_${follower!!.size}") +} + timerStart("familiar_timer") {player -> interval = 50 // 30 seconds From 1f203627f29753de08724739e93bdd6ebf4e4105 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 22 Aug 2025 18:08:00 -0300 Subject: [PATCH 28/46] Remove familiar_time as it already exists in parameters --- data/skill/summoning/summoning.npcs.toml | 77 ------------------- .../content/skill/summoning/Summoning.kts | 4 +- 2 files changed, 2 insertions(+), 79 deletions(-) diff --git a/data/skill/summoning/summoning.npcs.toml b/data/skill/summoning/summoning.npcs.toml index ce0b7355f9..ca1b0e6081 100644 --- a/data/skill/summoning/summoning.npcs.toml +++ b/data/skill/summoning/summoning.npcs.toml @@ -1,309 +1,233 @@ [spirit_terrorbird_familiar] id = 6794 -familiar_time = 36 [granite_crab_familiar] id = 6796 -familiar_time = 18 [praying_mantis_familiar] id = 6798 -familiar_time = 69 [giant_ent_familiar] id = 6800 -familiar_time = 49 [spirit_cobra_familiar] id = 6802 -familiar_time = 56 [spirit_dagannoth_familiar] id = 6804 -familiar_time = 57 [thorny_snail_familiar] id = 6806 -familiar_time = 16 [beaver_familiar] id = 6808 -familiar_time = 27 [karamthulhu_overlord_familiar] id = 6809 -familiar_time = 44 [hydra_familiar] id = 6811 -familiar_time = 49 [spirit_jelly_familiar] id = 6992 -familiar_time = 43 [bunyip_familiar] id = 6813 -familiar_time = 44 [war_tortoise_familiar] id = 6815 -familiar_time = 43 [fruit_bat_familiar] id = 6817 -familiar_time = 45 [abyssal_parasite_familiar] id = 6818 -familiar_time = 30 [abyssal_lurker_familiar] id = 6820 -familiar_time = 41 [unicorn_stallion_familiar] id = 6822 -familiar_time = 54 [magpie_familiar] id = 6824 -familiar_time = 34 [dreadfowl_familiar] id = 6825 -familiar_time = 4 [stranger_plant_familiar] id = 6827 -familiar_time = 49 [spirit_wolf_familiar] id = 6829 -familiar_time = 6 [desert_wyrm_familiar] id = 6831 -familiar_time = 19 [evil_turnip_familiar] id = 6833 -familiar_time = 30 [vampire_bat_familiar] id = 6835 [spirit_scorpion_familiar] id = 6837 -familiar_time = 17 [arctic_bear_familiar] id = 6839 -familiar_time = 28 [spirit_spider_familiar] id = 6841 -familiar_time = 15 [bloated_leech_familiar] id = 6843 -familiar_time = 34 [spirit_kalphite_familiar] id = 6994 -familiar_time = 22 [honey_badger_familiar] id = 6845 -familiar_time = 25 [albino_rat_familiar] id = 6847 -familiar_time = 22 [granite_lobster_familiar] id = 6849 -familiar_time = 47 [macaw_familiar] id = 6851 -familiar_time = 31 [bronze_minotaur_familiar] id = 6853 -familiar_time = 30 [iron_minotaur_familiar] id = 6855 -familiar_time = 37 [steel_minotaur_familiar] id = 6857 -familiar_time = 46 [mithril_minotaur_familiar] id = 6859 -familiar_time = 55 [adamant_minotaur_familiar] id = 6861 -familiar_time = 66 [rune_minotaur_familiar] id = 6863 -familiar_time = 151 [smoke_devil_familiar] id = 6865 -familiar_time = 48 [bull_ant_familiar] id = 6867 -familiar_time = 30 [wolpertinger_familiar] id = 6869 -familiar_time = 62 [compost_mound_familiar] id = 6871 -familiar_time = 24 [pack_yak_familiar] id = 6873 -familiar_time = 58 [spirit_cockatrice_familiar] id = 6875 -familiar_time = 36 [spirit_guthatrice_familiar] id = 6877 -familiar_time = 36 [spirit_saratrice_familiar] id = 6879 -familiar_time = 36 [spirit_zamatrice_familiar] id = 6881 -familiar_time = 36 [spirit_pengatrice_familiar] id = 6883 -familiar_time = 36 [spirit_coraxatrice_familiar] id = 6885 -familiar_time = 36 [spirit_vulatrice_familiar] id = 6887 -familiar_time = 36 [barker_toad_familiar] id = 6889 -familiar_time = 8 [ibis_familiar] id = 6991 -familiar_time = 38 [swamp_titan_familiar] id = 7329 -familiar_time = 56 [spirit_mosquito_familiar] id = 7331 -familiar_time = 12 [void_spinner_familiar] id = 7333 -familiar_time = 27 [forge_regent_familiar] id = 7335 -familiar_time = 45 [spirit_larupia_familiar] id = 7337 -familiar_time = 49 [geyser_titan_familiar] id = 7339 -familiar_time = 69 [lava_titan_familiar] id = 7341 -familiar_time = 61 [steel_titan_familiar] id = 7343 -familiar_time = 64 [obsidian_golem_familiar] id = 7345 -familiar_time = 55 [talon_beast_familiar] id = 7347 -familiar_time = 49 [abyssal_titan_familiar] id = 7349 -familiar_time = 32 [void_torcher_familiar] id = 7351 -familiar_time = 94 [giant_chinchompa_familiar] id = 7353 -familiar_time = 31 [fire_titan_familiar] id = 7355 -familiar_time = 62 [moss_titan_familiar] id = 7357 -familiar_time = 58 [ice_titan_familiar] id = 7359 -familiar_time = 64 [spirit_tz-kih_familiar] id = 7361 -familiar_time = 18 [spirit_graahk_familiar] id = 7363 -familiar_time = 49 [spirit_kyatt_familiar] id = 7365 -familiar_time = 49 [void_shifter_familiar] id = 7367 -familiar_time = 94 [pyrelord_familiar] id = 7377 -familiar_time = 32 [void_ravager_familiar] id = 7370 -familiar_time = 27 [ravenous_locust_familiar] id = 7372 -familiar_time = 24 [iron_titan_familiar] id = 7375 -familiar_time = 60 [clay_familiar_class_1_familiar] id = 8240 @@ -322,7 +246,6 @@ id = 8248 [phoenix_familiar] id = 8575 -familiar_time = 30 [cub_bloodrager_familiar] id = 11106 diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index c99a9c06ed..3d967cdf71 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -183,7 +183,7 @@ fun Player.renewFamiliar() { } inventory.remove(pouchItem.id) - this["familiar_details_minutes_remaining"] = follower!!.def["familiar_time", 0] + this["familiar_details_minutes_remaining"] = follower!!.def["summoning_time_minutes", 0] this["familiar_details_seconds_remaining"] = 0 follower!!.gfx("summon_familiar_size_${follower!!.size}") } @@ -191,7 +191,7 @@ fun Player.renewFamiliar() { timerStart("familiar_timer") {player -> interval = 50 // 30 seconds - player["familiar_details_minutes_remaining"] = player.follower!!.def["familiar_time", 0] + player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] player["familiar_details_seconds_remaining"] = 0 } From c627a3328eeac48a9089ad1b4340c9a54838c958 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sun, 24 Aug 2025 16:49:40 -0300 Subject: [PATCH 29/46] Start gathering chathead anim IDs --- data/skill/summoning/summoning.varbits.toml | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index 0d2d73ce5b..586cae7fc5 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -4,10 +4,41 @@ format = "boolean" persist = true default = true +# TODO: Confirm animations for familiars above level 33 +# Others were confirmed from this video: https://www.youtube.com/watch?v=R8voU8lsXoY [follower_details_chathead_animation] id = 4282 format = "int" persist = true +#values = { +# # Confirmed +# dreadfowl = 2, +# granite_crab = 3, +# vampire_bat = 4, +# giant_chinchompa = 4, +# beaver = 4, +# spirit_spider = 6, +# spirit_scorpion = 6, +# spirit_wolf = 7, +# desert_wyrm = 7, +# albino_rat = 7, +# honey_badger = 7, +# thorny_snail = 12, +# hydra = 19, +# compost_mound = 20, +# spirit_mosquito = 31, +# spirit_tz_kih = 32, +# meerkats = 38 +# +# # Unconfirmed +# void_torcher = 4, +# spirit_kalphite = 6, +# minotaur = 7, +# bull_ant = 9, +# void_ravager = 13, +# void_spinner = 29, +# void_shifter = 30, +#} [pet_details_growth_percentage] id = 4285 From 776a13633c167c6234a6a9885e1bb85bf360feaf Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Fri, 29 Aug 2025 19:01:19 -0300 Subject: [PATCH 30/46] Despawn and respawn on logout and login --- data/skill/summoning/summoning.varps.toml | 2 + .../content/skill/summoning/Summoning.kts | 40 +++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/data/skill/summoning/summoning.varps.toml b/data/skill/summoning/summoning.varps.toml index 977a8f22d6..71a3d96fcc 100644 --- a/data/skill/summoning/summoning.varps.toml +++ b/data/skill/summoning/summoning.varps.toml @@ -1,8 +1,10 @@ +# Value is the pouch id of the summed familiar [follower_details_name] id = 448 format = "int" persist = true +# Value is the NPC id of the summoned familiar [follower_details_chathead] id = 1174 format = "int" diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 3d967cdf71..0b6a49db1b 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -4,6 +4,8 @@ import content.entity.player.dialogue.type.choice import content.entity.player.inv.inventoryItem import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.sendScript +import world.gregs.voidps.engine.client.ui.event.adminCommand import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.data.definition.ItemDefinitions @@ -15,6 +17,7 @@ import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.entity.item.Item +import world.gregs.voidps.engine.entity.playerSpawn import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove @@ -22,6 +25,7 @@ import world.gregs.voidps.engine.queue.softQueue import world.gregs.voidps.engine.timer.timerStart import world.gregs.voidps.engine.timer.timerStop import world.gregs.voidps.engine.timer.timerTick +import kotlin.math.log val enums: EnumDefinitions by inject() val npcs: NPCs by inject() @@ -52,7 +56,7 @@ inventoryItem("Summon", "*_pouch") { return@inventoryItem } - player.summonFamiliar(familiar) ?: return@inventoryItem + player.summonFamiliar(familiar, false) ?: return@inventoryItem player.inventory.remove(item.id) player.experience.add(Skill.Summoning, summoningXp) } @@ -114,7 +118,22 @@ interfaceOption("Call Follower", "*", "summoning_orb") { player.callFollower() } -fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { +playerSpawn {player -> + if (player["familiar_details_seconds_remaining", 0] == 0 && player["familiar_details_minutes_remaining", 0] == 0) { + return@playerSpawn + } + + val familiarDef = npcDefinitions.get(player["follower_details_chathead", -1]) + player.variables.send("follower_details_name") + player.variables.send("follower_details_chathead") + player.variables.send("familiar_details_minutes_remaining") + player.variables.send("familiar_details_seconds_remaining") + player.variables.send("follower_details_chathead_animation") + player.timers.restart("familiar_timer") + player.summonFamiliar(familiarDef, true) +} + +fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { if (follower != null) { // TODO: Find actual message for this message("You must dismiss your current follower before summoning another.") @@ -129,7 +148,7 @@ fun Player.summonFamiliar(familiar: NPCDefinition): NPC? { follower!!.gfx("summon_familiar_size_${follower!!.size}") player.updateFamiliarInterface() - timers.start("familiar_timer") + if(!restart) timers.start("familiar_timer") } return familiarNpc @@ -140,8 +159,8 @@ fun Player.dismissFamiliar() { follower = null interfaces.close("familiar_details") - this["follower_details_name"] = -1 - this["follower_details_chathead"] = -1 + this["follower_details_name"] = 0 + this["follower_details_chathead"] = 0 this["familiar_details_minutes_remaining"] = 0 this["familiar_details_seconds_remaining"] = 0 timers.stop("familiar_timer") @@ -191,8 +210,10 @@ fun Player.renewFamiliar() { timerStart("familiar_timer") {player -> interval = 50 // 30 seconds - player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] - player["familiar_details_seconds_remaining"] = 0 + if(!restart) { + player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] + player["familiar_details_seconds_remaining"] = 0 + } } timerTick("familiar_timer") {player -> @@ -207,6 +228,11 @@ timerTick("familiar_timer") {player -> } timerStop("familiar_timer") {player -> + if (logout) { + npcs.remove(player.follower) + return@timerStop + } + if (player.follower != null) { player.dismissFamiliar() } From 093f8ce5ee520f87cee923f20db5d20035c4fd2d Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sat, 30 Aug 2025 22:57:35 -0300 Subject: [PATCH 31/46] Remove unused imports --- game/src/main/kotlin/content/skill/summoning/Summoning.kts | 3 --- 1 file changed, 3 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 0b6a49db1b..6414e76a9f 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -4,8 +4,6 @@ import content.entity.player.dialogue.type.choice import content.entity.player.inv.inventoryItem import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message -import world.gregs.voidps.engine.client.sendScript -import world.gregs.voidps.engine.client.ui.event.adminCommand import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.data.definition.ItemDefinitions @@ -25,7 +23,6 @@ import world.gregs.voidps.engine.queue.softQueue import world.gregs.voidps.engine.timer.timerStart import world.gregs.voidps.engine.timer.timerStop import world.gregs.voidps.engine.timer.timerTick -import kotlin.math.log val enums: EnumDefinitions by inject() val npcs: NPCs by inject() From 143bf7db6b85094530473fd06a45b807863d5221 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sun, 31 Aug 2025 00:06:43 -0300 Subject: [PATCH 32/46] Move Player extensions to Summoning.kt and timers to their own file --- .../content/skill/summoning/Summoning.kt | 104 ++++++++++++++ .../content/skill/summoning/Summoning.kts | 131 ------------------ .../skill/summoning/SummoningTimers.kts | 36 +++++ 3 files changed, 140 insertions(+), 131 deletions(-) create mode 100644 game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index c60f0778cf..df036d31d7 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -1,7 +1,111 @@ package content.skill.summoning +import world.gregs.voidps.cache.definition.data.NPCDefinition +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.data.definition.EnumDefinitions +import world.gregs.voidps.engine.data.definition.ItemDefinitions import world.gregs.voidps.engine.entity.character.Character +import world.gregs.voidps.engine.entity.character.mode.Follow +import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.npc.NPCs +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.item.Item +import world.gregs.voidps.engine.inject +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.engine.queue.softQueue + +val itemDefinitions: ItemDefinitions by inject() +val npcs: NPCs by inject() +val enums: EnumDefinitions by inject() + val Character?.isFamiliar: Boolean get() = this != null && this is NPC && id.endsWith("_familiar") + +var Player.follower: NPC? + get() { + val index = this["follower_index", -1] + return world.gregs.voidps.engine.get().indexed(index) + } + set(value) { + if (value != null) { + this["follower_index"] = value.index + this["follower_id"] = value.id + } + } + +fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { + if (follower != null) { + // TODO: Find actual message for this + message("You must dismiss your current follower before summoning another.") + return null + } + + val familiarNpc = npcs.add(familiar.stringId, tile) + familiarNpc.mode = Follow(familiarNpc, this) + + softQueue("summon_familiar", 2) { + follower = familiarNpc + + follower!!.gfx("summon_familiar_size_${follower!!.size}") + player.updateFamiliarInterface() + if(!restart) timers.start("familiar_timer") + } + + return familiarNpc +} + +fun Player.dismissFamiliar() { + npcs.remove(follower) + follower = null + interfaces.close("familiar_details") + + this["follower_details_name"] = 0 + this["follower_details_chathead"] = 0 + this["familiar_details_minutes_remaining"] = 0 + this["familiar_details_seconds_remaining"] = 0 + timers.stop("familiar_timer") +} + +fun Player.updateFamiliarInterface() { + if (follower == null) return + + this.interfaces.open("familiar_details") + + this["follower_details_name"] = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) + this["follower_details_chathead"] = follower!!.def.id + + this["follower_details_chathead_animation"] = 1 +} + +fun Player.openFollowerLeftClickOptions() { + interfaces.open("follower_left_click_options") +} + +fun Player.confirmFollowerLeftClickOptions() { + this["summoning_orb_left_click_option"] = this["summoning_menu_left_click_option", -1] + interfaces.close("follower_left_click_options") +} + +fun Player.callFollower() { + follower!!.tele(steps.follow, clearMode = false) + follower!!.clearWatch() +} + +fun Player.renewFamiliar() { + val pouchId = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) + val pouchItem = Item(itemDefinitions.get(pouchId).stringId) + + if (!inventory.contains(pouchItem.id)) { + // TODO: Find the actual message used here in 2011 + message("You don't have the required pouch to renew your familiar.") + return + } + + inventory.remove(pouchItem.id) + this["familiar_details_minutes_remaining"] = follower!!.def["summoning_time_minutes", 0] + this["familiar_details_seconds_remaining"] = 0 + follower!!.gfx("summon_familiar_size_${follower!!.size}") +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts index 6414e76a9f..32a83fece7 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kts @@ -2,44 +2,18 @@ package content.skill.summoning import content.entity.player.dialogue.type.choice import content.entity.player.inv.inventoryItem -import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions -import world.gregs.voidps.engine.data.definition.ItemDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions -import world.gregs.voidps.engine.entity.character.mode.Follow -import world.gregs.voidps.engine.entity.character.move.tele -import world.gregs.voidps.engine.entity.character.npc.NPC -import world.gregs.voidps.engine.entity.character.npc.NPCs -import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.skill.Skill -import world.gregs.voidps.engine.entity.item.Item import world.gregs.voidps.engine.entity.playerSpawn import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove -import world.gregs.voidps.engine.queue.softQueue -import world.gregs.voidps.engine.timer.timerStart -import world.gregs.voidps.engine.timer.timerStop -import world.gregs.voidps.engine.timer.timerTick val enums: EnumDefinitions by inject() -val npcs: NPCs by inject() val npcDefinitions: NPCDefinitions by inject() -val itemDefinitions: ItemDefinitions by inject() - -var Player.follower: NPC? - get() { - val index = this["follower_index", -1] - return world.gregs.voidps.engine.get().indexed(index) - } - set(value) { - if (value != null) { - this["follower_index"] = value.index - this["follower_id"] = value.id - } - } inventoryItem("Summon", "*_pouch") { val familiarLevel = enums.get("summoning_pouch_levels").getInt(item.def.id) @@ -128,109 +102,4 @@ playerSpawn {player -> player.variables.send("follower_details_chathead_animation") player.timers.restart("familiar_timer") player.summonFamiliar(familiarDef, true) -} - -fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { - if (follower != null) { - // TODO: Find actual message for this - message("You must dismiss your current follower before summoning another.") - return null - } - - val familiarNpc = npcs.add(familiar.stringId, tile) - familiarNpc.mode = Follow(familiarNpc, this) - - softQueue("summon_familiar", 2) { - follower = familiarNpc - - follower!!.gfx("summon_familiar_size_${follower!!.size}") - player.updateFamiliarInterface() - if(!restart) timers.start("familiar_timer") - } - - return familiarNpc -} - -fun Player.dismissFamiliar() { - npcs.remove(follower) - follower = null - interfaces.close("familiar_details") - - this["follower_details_name"] = 0 - this["follower_details_chathead"] = 0 - this["familiar_details_minutes_remaining"] = 0 - this["familiar_details_seconds_remaining"] = 0 - timers.stop("familiar_timer") -} - -fun Player.updateFamiliarInterface() { - if (follower == null) return - - this.interfaces.open("familiar_details") - - this["follower_details_name"] = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) - this["follower_details_chathead"] = follower!!.def.id - - this["follower_details_chathead_animation"] = 1 -} - -fun Player.openFollowerLeftClickOptions() { - interfaces.open("follower_left_click_options") -} - -fun Player.confirmFollowerLeftClickOptions() { - this["summoning_orb_left_click_option"] = this["summoning_menu_left_click_option", -1] - interfaces.close("follower_left_click_options") -} - -fun Player.callFollower() { - follower!!.tele(steps.follow, clearMode = false) - follower!!.clearWatch() -} - -fun Player.renewFamiliar() { - val pouchId = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) - val pouchItem = Item(itemDefinitions.get(pouchId).stringId) - - if (!inventory.contains(pouchItem.id)) { - // TODO: Find the actual message used here in 2011 - message("You don't have the required pouch to renew your familiar.") - return - } - - inventory.remove(pouchItem.id) - this["familiar_details_minutes_remaining"] = follower!!.def["summoning_time_minutes", 0] - this["familiar_details_seconds_remaining"] = 0 - follower!!.gfx("summon_familiar_size_${follower!!.size}") -} - -timerStart("familiar_timer") {player -> - interval = 50 // 30 seconds - - if(!restart) { - player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] - player["familiar_details_seconds_remaining"] = 0 - } -} - -timerTick("familiar_timer") {player -> - if (player["familiar_details_seconds_remaining", 0] == 0) { - player.dec("familiar_details_minutes_remaining") - } - player["familiar_details_seconds_remaining"] = (player["familiar_details_seconds_remaining", 0] + 1) % 2 - - if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { - cancel() - } -} - -timerStop("familiar_timer") {player -> - if (logout) { - npcs.remove(player.follower) - return@timerStop - } - - if (player.follower != null) { - player.dismissFamiliar() - } } \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts new file mode 100644 index 0000000000..071d93a180 --- /dev/null +++ b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts @@ -0,0 +1,36 @@ +package content.skill.summoning + +import world.gregs.voidps.engine.timer.timerStart +import world.gregs.voidps.engine.timer.timerStop +import world.gregs.voidps.engine.timer.timerTick + +timerStart("familiar_timer") {player -> + interval = 50 // 30 seconds + + if(!restart) { + player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] + player["familiar_details_seconds_remaining"] = 0 + } +} + +timerTick("familiar_timer") {player -> + if (player["familiar_details_seconds_remaining", 0] == 0) { + player.dec("familiar_details_minutes_remaining") + } + player["familiar_details_seconds_remaining"] = (player["familiar_details_seconds_remaining", 0] + 1) % 2 + + if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { + cancel() + } +} + +timerStop("familiar_timer") {player -> + if (logout) { + npcs.remove(player.follower) + return@timerStop + } + + if (player.follower != null) { + player.dismissFamiliar() + } +} \ No newline at end of file From 5b671d26248bbc61bd0fad691e2a3c9ef39b4824 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sun, 14 Sep 2025 12:01:42 -0300 Subject: [PATCH 33/46] Convert kts files --- .../content/skill/summoning/Summoning.kt | 117 +++++++++++++++++- .../content/skill/summoning/Summoning.kts | 105 ---------------- .../skill/summoning/SummoningTimers.kt | 44 +++++++ .../skill/summoning/SummoningTimers.kts | 36 ------ 4 files changed, 156 insertions(+), 146 deletions(-) delete mode 100644 game/src/main/kotlin/content/skill/summoning/Summoning.kts create mode 100644 game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt delete mode 100644 game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index df036d31d7..8352baa37e 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -1,8 +1,19 @@ package content.skill.summoning -import world.gregs.voidps.cache.definition.data.NPCDefinition +import content.entity.player.dialogue.type.choice +import content.entity.player.inv.inventoryItem import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions +import world.gregs.voidps.engine.data.definition.NPCDefinitions +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.entity.playerSpawn +import world.gregs.voidps.engine.inject +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.engine.event.Script + +import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.data.definition.ItemDefinitions import world.gregs.voidps.engine.entity.character.Character import world.gregs.voidps.engine.entity.character.mode.Follow @@ -11,9 +22,6 @@ import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.item.Item -import world.gregs.voidps.engine.inject -import world.gregs.voidps.engine.inv.inventory -import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.engine.queue.softQueue val itemDefinitions: ItemDefinitions by inject() @@ -108,4 +116,103 @@ fun Player.renewFamiliar() { this["familiar_details_minutes_remaining"] = follower!!.def["summoning_time_minutes", 0] this["familiar_details_seconds_remaining"] = 0 follower!!.gfx("summon_familiar_size_${follower!!.size}") -} \ No newline at end of file +} +@Script +class Summoning { + + val enums: EnumDefinitions by inject() + val npcDefinitions: NPCDefinitions by inject() + + init { + inventoryItem("Summon", "*_pouch") { + val familiarLevel = enums.get("summoning_pouch_levels").getInt(item.def.id) + val familiarId = enums.get("summoning_familiar_ids").getInt(item.def.id) + val summoningXp = item.def["summon_experience", 0.0] + val familiar = npcDefinitions.get(familiarId) + + if (player.levels.get(Skill.Summoning) < familiarLevel) { + //TODO: Get actual message + player.message("You don't have the level needed to summon that familiar...") + return@inventoryItem + } + + player.summonFamiliar(familiar, false) ?: return@inventoryItem + player.inventory.remove(item.id) + player.experience.add(Skill.Summoning, summoningXp) + } + + interfaceOption("Select left-click option", id = "summoning_orb") { + player.openFollowerLeftClickOptions() + } + + interfaceOption("Select", id = "follower_left_click_options") { + val varbitValue = when { + component.startsWith("follower_details") -> 0 + component.startsWith("special_move") -> 1 + component.startsWith("attack") -> 2 + component.startsWith("call_follower") -> 3 + component.startsWith("dismiss_follower") -> 4 + component.startsWith("take_bob") -> 5 + component.startsWith("renew_familiar") -> 6 + else -> -1 + } + + player["summoning_menu_left_click_option"] = varbitValue + } + + interfaceOption("Confirm Selection", "confirm", "follower_left_click_options") { + player.confirmFollowerLeftClickOptions() + } + + interfaceOption("Dismiss", id = "summoning_orb") { + player.dismissFamiliar() + } + + interfaceOption("Renew Familiar", id = "summoning_orb") { + player.renewFamiliar() + } + + interfaceOption("Dismiss *", "dismiss", "familiar_details") { + when (option) { + "Dismiss Familiar" -> { + choice("Are you sure you want to dismiss your familiar?") { + option("Yes.") { + player.dismissFamiliar() + } + option("No.") + } + } + "Dismiss Now" -> player.dismissFamiliar() + } + } + + interfaceOption("Renew Familiar", "renew", "familiar_details") { + player.renewFamiliar() + } + + interfaceOption("Call *", "call", "*_details") { + player.callFollower() + } + + interfaceOption("Call Follower", "*", "summoning_orb") { + player.callFollower() + } + + playerSpawn {player -> + if (player["familiar_details_seconds_remaining", 0] == 0 && player["familiar_details_minutes_remaining", 0] == 0) { + return@playerSpawn + } + + val familiarDef = npcDefinitions.get(player["follower_details_chathead", -1]) + player.variables.send("follower_details_name") + player.variables.send("follower_details_chathead") + player.variables.send("familiar_details_minutes_remaining") + player.variables.send("familiar_details_seconds_remaining") + player.variables.send("follower_details_chathead_animation") + player.timers.restart("familiar_timer") + player.summonFamiliar(familiarDef, true) + } + + } + +} diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kts b/game/src/main/kotlin/content/skill/summoning/Summoning.kts deleted file mode 100644 index 32a83fece7..0000000000 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kts +++ /dev/null @@ -1,105 +0,0 @@ -package content.skill.summoning - -import content.entity.player.dialogue.type.choice -import content.entity.player.inv.inventoryItem -import world.gregs.voidps.engine.client.message -import world.gregs.voidps.engine.client.ui.interfaceOption -import world.gregs.voidps.engine.data.definition.EnumDefinitions -import world.gregs.voidps.engine.data.definition.NPCDefinitions -import world.gregs.voidps.engine.entity.character.player.skill.Skill -import world.gregs.voidps.engine.entity.playerSpawn -import world.gregs.voidps.engine.inject -import world.gregs.voidps.engine.inv.inventory -import world.gregs.voidps.engine.inv.remove - -val enums: EnumDefinitions by inject() -val npcDefinitions: NPCDefinitions by inject() - -inventoryItem("Summon", "*_pouch") { - val familiarLevel = enums.get("summoning_pouch_levels").getInt(item.def.id) - val familiarId = enums.get("summoning_familiar_ids").getInt(item.def.id) - val summoningXp = item.def["summon_experience", 0.0] - val familiar = npcDefinitions.get(familiarId) - - if (player.levels.get(Skill.Summoning) < familiarLevel) { - //TODO: Get actual message - player.message("You don't have the level needed to summon that familiar...") - return@inventoryItem - } - - player.summonFamiliar(familiar, false) ?: return@inventoryItem - player.inventory.remove(item.id) - player.experience.add(Skill.Summoning, summoningXp) -} - -interfaceOption("Select left-click option", id = "summoning_orb") { - player.openFollowerLeftClickOptions() -} - -interfaceOption("Select", id = "follower_left_click_options") { - val varbitValue = when { - component.startsWith("follower_details") -> 0 - component.startsWith("special_move") -> 1 - component.startsWith("attack") -> 2 - component.startsWith("call_follower") -> 3 - component.startsWith("dismiss_follower") -> 4 - component.startsWith("take_bob") -> 5 - component.startsWith("renew_familiar") -> 6 - else -> -1 - } - - player["summoning_menu_left_click_option"] = varbitValue -} - -interfaceOption("Confirm Selection", "confirm", "follower_left_click_options") { - player.confirmFollowerLeftClickOptions() -} - -interfaceOption("Dismiss", id = "summoning_orb") { - player.dismissFamiliar() -} - -interfaceOption("Renew Familiar", id = "summoning_orb") { - player.renewFamiliar() -} - -interfaceOption("Dismiss *", "dismiss", "familiar_details") { - when (option) { - "Dismiss Familiar" -> { - choice("Are you sure you want to dismiss your familiar?") { - option("Yes.") { - player.dismissFamiliar() - } - option("No.") - } - } - "Dismiss Now" -> player.dismissFamiliar() - } -} - -interfaceOption("Renew Familiar", "renew", "familiar_details") { - player.renewFamiliar() -} - -interfaceOption("Call *", "call", "*_details") { - player.callFollower() -} - -interfaceOption("Call Follower", "*", "summoning_orb") { - player.callFollower() -} - -playerSpawn {player -> - if (player["familiar_details_seconds_remaining", 0] == 0 && player["familiar_details_minutes_remaining", 0] == 0) { - return@playerSpawn - } - - val familiarDef = npcDefinitions.get(player["follower_details_chathead", -1]) - player.variables.send("follower_details_name") - player.variables.send("follower_details_chathead") - player.variables.send("familiar_details_minutes_remaining") - player.variables.send("familiar_details_seconds_remaining") - player.variables.send("follower_details_chathead_animation") - player.timers.restart("familiar_timer") - player.summonFamiliar(familiarDef, true) -} \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt new file mode 100644 index 0000000000..5afb6bd8e2 --- /dev/null +++ b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt @@ -0,0 +1,44 @@ +package content.skill.summoning + +import world.gregs.voidps.engine.timer.timerStart +import world.gregs.voidps.engine.timer.timerStop +import world.gregs.voidps.engine.timer.timerTick +import world.gregs.voidps.engine.event.Script +@Script +class SummoningTimers { + + init { + timerStart("familiar_timer") {player -> + interval = 50 // 30 seconds + + if(!restart) { + player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] + player["familiar_details_seconds_remaining"] = 0 + } + } + + timerTick("familiar_timer") {player -> + if (player["familiar_details_seconds_remaining", 0] == 0) { + player.dec("familiar_details_minutes_remaining") + } + player["familiar_details_seconds_remaining"] = (player["familiar_details_seconds_remaining", 0] + 1) % 2 + + if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { + cancel() + } + } + + timerStop("familiar_timer") {player -> + if (logout) { + npcs.remove(player.follower) + return@timerStop + } + + if (player.follower != null) { + player.dismissFamiliar() + } + } + + } + +} diff --git a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts deleted file mode 100644 index 071d93a180..0000000000 --- a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kts +++ /dev/null @@ -1,36 +0,0 @@ -package content.skill.summoning - -import world.gregs.voidps.engine.timer.timerStart -import world.gregs.voidps.engine.timer.timerStop -import world.gregs.voidps.engine.timer.timerTick - -timerStart("familiar_timer") {player -> - interval = 50 // 30 seconds - - if(!restart) { - player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] - player["familiar_details_seconds_remaining"] = 0 - } -} - -timerTick("familiar_timer") {player -> - if (player["familiar_details_seconds_remaining", 0] == 0) { - player.dec("familiar_details_minutes_remaining") - } - player["familiar_details_seconds_remaining"] = (player["familiar_details_seconds_remaining", 0] + 1) % 2 - - if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { - cancel() - } -} - -timerStop("familiar_timer") {player -> - if (logout) { - npcs.remove(player.follower) - return@timerStop - } - - if (player.follower != null) { - player.dismissFamiliar() - } -} \ No newline at end of file From d37907c6d108375a344c57dabe5721b80793cb90 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Sun, 21 Dec 2025 22:15:30 -0400 Subject: [PATCH 34/46] Refactor to work with new handlers --- .../modal/toplevel/gameframe.ifaces.toml | 47 ++++++- data/skill/summoning/summoning.ifaces.toml | 94 ++++++++++---- .../content/skill/summoning/Summoning.kt | 120 +++++++++--------- .../skill/summoning/SummoningTimers.kt | 43 ++++--- 4 files changed, 190 insertions(+), 114 deletions(-) diff --git a/data/entity/player/modal/toplevel/gameframe.ifaces.toml b/data/entity/player/modal/toplevel/gameframe.ifaces.toml index ec81322a07..eefa038d4e 100644 --- a/data/entity/player/modal/toplevel/gameframe.ifaces.toml +++ b/data/entity/player/modal/toplevel/gameframe.ifaces.toml @@ -188,9 +188,50 @@ id = 165 [summoning_orb] id = 747 type = "summoning_orb" -components = { - familiar_options = 8 -} + +[.leftclick_options] +id = 7 + +[.familiar_options] +id = 8 + +[.follower_details] +id = 9 + +[.call_follower] +id = 10 + +[.dismiss_follower] +id = 11 + +[.take_bob] +id = 12 + +[.renew_familiar] +id = 13 + +# Can't yet confirm that these 2 are cast / attack. +# Likely IDs 21 and 22 will be their left-click options as well +#[.n14] +#id = 14 +# +#[.n15] +#id = 15 + +[.leftclick_follower_details] +id = 16 + +[.leftclick_call_follower] +id = 17 + +[.leftclick_dismiss_follower] +id = 18 + +[.leftclick_take_bob] +id = 19 + +[.leftclick_renew_familiar] +id = 20 [health_orb] id = 748 diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index 8220b2a9b5..c2a0caa2c6 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -42,21 +42,31 @@ id = 79 [familiar_details] id = 662 type = "follower_details_tab" -components = { - call = 49, - dismiss = 51, - attack = 65, - take_bob_items = 67, - renew = 69, -} + +[.call] +id = 49 + +[.dismiss] +id = 51 + +[.attack] +id = 65 + +[.take_bob_items] +id = 67 + +[.renew] +id = 69 [pet_details] id = 663 type = "follower_details_tab" -components = { - call = 21, - dismiss = 23 -} + +[.call] +id = 21 + +[.dismiss] +id = 23 [summoning_scroll_creation] id = 666 @@ -92,23 +102,51 @@ type = "dialogue_box" [follower_left_click_options] id = 880 type = "overlay_tab" -components = { - follower_details_circle = 7, - follower_details = 8, - special_move_circle = 9, - special_move = 10, - attack_circle = 11, - attack = 12, - call_follower_circle = 13, - call_follower = 14, - dismiss_follower_cricle = 15, - dismiss_follower = 16, - take_bob_cricle = 17, - take_bob = 18, - renew_familiar_circle = 19, - renew_familiar = 20, - confirm = 21 -} + +[.follower_details_circle] +id = 7 + +[.follower_details] +id = 8 + +[.special_move_circle] +id = 9 + +[.special_move] +id = 10 + +[.attack_circle] +id = 11 + +[.attack] +id = 12 + +[.call_follower_circle] +id = 13 + +[.call_follower] +id = 14 + +[.dismiss_follower_cricle] +id = 15 + +[.dismiss_follower] +id = 16 + +[.take_bob_cricle] +id = 17 + +[.take_bob] +id = 18 + +[.renew_familiar_circle] +id = 19 + +[.renew_familiar] +id = 20 + +[.confirm] +id = 21 [summoning_side] id = 722 diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index 8352baa37e..c61ebbb5f8 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -1,34 +1,29 @@ package content.skill.summoning import content.entity.player.dialogue.type.choice -import content.entity.player.inv.inventoryItem +import world.gregs.voidps.cache.definition.data.NPCDefinition +import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message -import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions -import world.gregs.voidps.engine.data.definition.NPCDefinitions -import world.gregs.voidps.engine.entity.character.player.skill.Skill -import world.gregs.voidps.engine.entity.playerSpawn -import world.gregs.voidps.engine.inject -import world.gregs.voidps.engine.inv.inventory -import world.gregs.voidps.engine.inv.remove -import world.gregs.voidps.engine.event.Script - -import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.data.definition.ItemDefinitions +import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.Character import world.gregs.voidps.engine.entity.character.mode.Follow import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.entity.item.Item +import world.gregs.voidps.engine.inject +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.engine.queue.softQueue val itemDefinitions: ItemDefinitions by inject() val npcs: NPCs by inject() val enums: EnumDefinitions by inject() - val Character?.isFamiliar: Boolean get() = this != null && this is NPC && id.endsWith("_familiar") @@ -59,7 +54,7 @@ fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { follower!!.gfx("summon_familiar_size_${follower!!.size}") player.updateFamiliarInterface() - if(!restart) timers.start("familiar_timer") + if (!restart) timers.start("familiar_timer") } return familiarNpc @@ -117,35 +112,36 @@ fun Player.renewFamiliar() { this["familiar_details_seconds_remaining"] = 0 follower!!.gfx("summon_familiar_size_${follower!!.size}") } -@Script -class Summoning { + +class Summoning : Script { val enums: EnumDefinitions by inject() val npcDefinitions: NPCDefinitions by inject() - + init { - inventoryItem("Summon", "*_pouch") { - val familiarLevel = enums.get("summoning_pouch_levels").getInt(item.def.id) - val familiarId = enums.get("summoning_familiar_ids").getInt(item.def.id) - val summoningXp = item.def["summon_experience", 0.0] + itemOption("Summon", "*_pouch") { option -> + val familiarLevel = enums.get("summoning_pouch_levels").getInt(option.item.def.id) + val familiarId = enums.get("summoning_familiar_ids").getInt(option.item.def.id) + val summoningXp = option.item.def["summon_experience", 0.0] val familiar = npcDefinitions.get(familiarId) - - if (player.levels.get(Skill.Summoning) < familiarLevel) { - //TODO: Get actual message - player.message("You don't have the level needed to summon that familiar...") - return@inventoryItem + + if (levels.get(Skill.Summoning) < familiarLevel) { + // TODO: Get actual message + message("You don't have the level needed to summon that familiar...") + return@itemOption } - - player.summonFamiliar(familiar, false) ?: return@inventoryItem - player.inventory.remove(item.id) - player.experience.add(Skill.Summoning, summoningXp) + + summonFamiliar(familiar, false) ?: return@itemOption + inventory.remove(option.item.id) + experience.add(Skill.Summoning, summoningXp) } - interfaceOption("Select left-click option", id = "summoning_orb") { - player.openFollowerLeftClickOptions() + interfaceOption("Select left-click option", id = "summoning_orb:*") { + openFollowerLeftClickOptions() } - interfaceOption("Select", id = "follower_left_click_options") { + interfaceOption("Select", id = "follower_left_click_options:*") { option -> + val component = option.component val varbitValue = when { component.startsWith("follower_details") -> 0 component.startsWith("special_move") -> 1 @@ -156,63 +152,61 @@ class Summoning { component.startsWith("renew_familiar") -> 6 else -> -1 } - - player["summoning_menu_left_click_option"] = varbitValue + + set("summoning_menu_left_click_option", varbitValue) } - interfaceOption("Confirm Selection", "confirm", "follower_left_click_options") { - player.confirmFollowerLeftClickOptions() + interfaceOption("Confirm Selection", "follower_left_click_options:confirm") { + confirmFollowerLeftClickOptions() } - interfaceOption("Dismiss", id = "summoning_orb") { - player.dismissFamiliar() + interfaceOption("Dismiss", id = "summoning_orb:*") { + dismissFamiliar() } - interfaceOption("Renew Familiar", id = "summoning_orb") { - player.renewFamiliar() + interfaceOption("Renew Familiar", id = "summoning_orb:*") { + renewFamiliar() } - interfaceOption("Dismiss *", "dismiss", "familiar_details") { - when (option) { + interfaceOption("*", "familiar_details:dismiss") { option -> + when (option.option) { "Dismiss Familiar" -> { choice("Are you sure you want to dismiss your familiar?") { option("Yes.") { - player.dismissFamiliar() + dismissFamiliar() } option("No.") } } - "Dismiss Now" -> player.dismissFamiliar() + "Dismiss Now" -> dismissFamiliar() } } - interfaceOption("Renew Familiar", "renew", "familiar_details") { - player.renewFamiliar() + interfaceOption("Renew Familiar", "familiar_details:renew") { + renewFamiliar() } - interfaceOption("Call *", "call", "*_details") { - player.callFollower() + interfaceOption("Call Follower", "*_details:call") { + callFollower() } - interfaceOption("Call Follower", "*", "summoning_orb") { - player.callFollower() + interfaceOption("Call Follower", "summoning_orb:*") { + callFollower() } - playerSpawn {player -> - if (player["familiar_details_seconds_remaining", 0] == 0 && player["familiar_details_minutes_remaining", 0] == 0) { + playerSpawn { + if (get("familiar_details_seconds_remaining", 0) == 0 && get("familiar_details_minutes_remaining", 0) == 0) { return@playerSpawn } - - val familiarDef = npcDefinitions.get(player["follower_details_chathead", -1]) - player.variables.send("follower_details_name") - player.variables.send("follower_details_chathead") - player.variables.send("familiar_details_minutes_remaining") - player.variables.send("familiar_details_seconds_remaining") - player.variables.send("follower_details_chathead_animation") - player.timers.restart("familiar_timer") - player.summonFamiliar(familiarDef, true) - } + val familiarDef = npcDefinitions.get(get("follower_details_chathead", -1)) + variables.send("follower_details_name") + variables.send("follower_details_chathead") + variables.send("familiar_details_minutes_remaining") + variables.send("familiar_details_seconds_remaining") + variables.send("follower_details_chathead_animation") + timers.restart("familiar_timer") + summonFamiliar(familiarDef, true) + } } - } diff --git a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt index 5afb6bd8e2..63da78c15c 100644 --- a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt +++ b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt @@ -1,41 +1,44 @@ package content.skill.summoning -import world.gregs.voidps.engine.timer.timerStart -import world.gregs.voidps.engine.timer.timerStop -import world.gregs.voidps.engine.timer.timerTick -import world.gregs.voidps.engine.event.Script -@Script -class SummoningTimers { +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.timer.Timer +import world.gregs.voidps.engine.timer.toTicks +import java.util.concurrent.TimeUnit + +class SummoningTimers : Script { init { - timerStart("familiar_timer") {player -> - interval = 50 // 30 seconds + timerStart("familiar_timer") { restart -> if(!restart) { - player["familiar_details_minutes_remaining"] = player.follower!!.def["summoning_time_minutes", 0] - player["familiar_details_seconds_remaining"] = 0 + set("familiar_details_minutes_remaining", follower!!.def["summoning_time_minutes", 0]) + set("familiar_details_seconds_remaining", 0) } + + return@timerStart TimeUnit.SECONDS.toTicks(30) } - timerTick("familiar_timer") {player -> - if (player["familiar_details_seconds_remaining", 0] == 0) { - player.dec("familiar_details_minutes_remaining") + timerTick("familiar_timer") { + if (get("familiar_details_seconds_remaining", 0) == 0) { + dec("familiar_details_minutes_remaining") } - player["familiar_details_seconds_remaining"] = (player["familiar_details_seconds_remaining", 0] + 1) % 2 + set("familiar_details_seconds_remaining", (get("familiar_details_seconds_remaining", 0) + 1) % 2) - if (player["familiar_details_seconds_remaining", 0] <= 0 && player["familiar_details_minutes_remaining", 0] <= 0) { - cancel() + if (get("familiar_details_seconds_remaining", 0) <= 0 && get("familiar_details_minutes_remaining", 0) <= 0) { + return@timerTick Timer.CANCEL } + + return@timerTick Timer.CONTINUE } - timerStop("familiar_timer") {player -> + timerStop("familiar_timer") { logout -> if (logout) { - npcs.remove(player.follower) + npcs.remove(follower) return@timerStop } - if (player.follower != null) { - player.dismissFamiliar() + if (follower != null) { + dismissFamiliar() } } From 7e8c803c3784b221206f2e369c0c6ec4387878ab Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 22 Dec 2025 19:21:14 -0400 Subject: [PATCH 35/46] Add placeholder component defs for summoning_orb --- .../modal/toplevel/gameframe.ifaces.toml | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) diff --git a/data/entity/player/modal/toplevel/gameframe.ifaces.toml b/data/entity/player/modal/toplevel/gameframe.ifaces.toml index eefa038d4e..4866da9ae2 100644 --- a/data/entity/player/modal/toplevel/gameframe.ifaces.toml +++ b/data/entity/player/modal/toplevel/gameframe.ifaces.toml @@ -233,6 +233,219 @@ id = 19 [.leftclick_renew_familiar] id = 20 +[.n23] +id = 23 + +[.n24] +id = 24 + +[.n25] +id = 25 + +[.n26] +id = 26 + +[.n27] +id = 27 + +[.n28] +id = 28 + +[.n29] +id = 29 + +[.n30] +id = 30 + +[.n31] +id = 31 + +[.n32] +id = 32 + +[.n33] +id = 33 + +[.n34] +id = 34 + +[.n35] +id = 35 + +[.n36] +id = 36 + +[.n37] +id = 37 + +[.n38] +id = 38 + +[.n39] +id = 39 + +[.n40] +id = 40 + +[.n41] +id = 41 + +[.n42] +id = 42 + +[.n43] +id = 43 + +[.n44] +id = 44 + +[.n45] +id = 45 + +[.n46] +id = 46 + +[.n47] +id = 47 + +[.n48] +id = 48 + +[.n49] +id = 49 + +[.n50] +id = 50 + +[.n51] +id = 51 + +[.n52] +id = 52 + +[.n53] +id = 53 + +[.n54] +id = 54 + +[.n55] +id = 55 + +[.n56] +id = 56 + +[.n57] +id = 57 + +[.n58] +id = 58 + +[.n59] +id = 59 + +[.n60] +id = 60 + +[.n61] +id = 61 + +[.n62] +id = 62 + +[.n63] +id = 63 + +[.n64] +id = 64 + +[.n65] +id = 65 + +[.n66] +id = 66 + +[.n67] +id = 67 + +[.n68] +id = 68 + +[.n69] +id = 69 + +[.n70] +id = 70 + +[.n71] +id = 71 + +[.n72] +id = 72 + +[.n73] +id = 73 + +[.n74] +id = 74 + +[.n75] +id = 75 + +[.n76] +id = 76 + +[.n77] +id = 77 + +[.n78] +id = 78 + +[.n79] +id = 79 + +[.n80] +id = 80 + +[.n81] +id = 81 + +[.n82] +id = 82 + +[.n83] +id = 83 + +[.n84] +id = 84 + +[.n85] +id = 85 + +# Dungeoneering summon abilities +[.n86] +id = 86 + +[.n88] +id = 88 + +[.n89] +id = 89 + +[.n93] +id = 93 + +[.n94] +id = 94 + +[.n96] +id = 96 + +[.n97] +id = 97 + + + [health_orb] id = 748 type = "health_orb" From a7b04d97ab0c41ff8147c51cac68c3964f39f3cc Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 22 Dec 2025 19:49:13 -0400 Subject: [PATCH 36/46] Remove placesholders as they were incorrect --- ...kotlin-compiler-1736161099682289887.salive | 0 .../modal/toplevel/gameframe.ifaces.toml | 213 ------------------ .../content/skill/summoning/Summoning.kt | 8 +- 3 files changed, 4 insertions(+), 217 deletions(-) create mode 100644 .kotlin/sessions/kotlin-compiler-1736161099682289887.salive diff --git a/.kotlin/sessions/kotlin-compiler-1736161099682289887.salive b/.kotlin/sessions/kotlin-compiler-1736161099682289887.salive new file mode 100644 index 0000000000..e69de29bb2 diff --git a/data/entity/player/modal/toplevel/gameframe.ifaces.toml b/data/entity/player/modal/toplevel/gameframe.ifaces.toml index 4866da9ae2..eefa038d4e 100644 --- a/data/entity/player/modal/toplevel/gameframe.ifaces.toml +++ b/data/entity/player/modal/toplevel/gameframe.ifaces.toml @@ -233,219 +233,6 @@ id = 19 [.leftclick_renew_familiar] id = 20 -[.n23] -id = 23 - -[.n24] -id = 24 - -[.n25] -id = 25 - -[.n26] -id = 26 - -[.n27] -id = 27 - -[.n28] -id = 28 - -[.n29] -id = 29 - -[.n30] -id = 30 - -[.n31] -id = 31 - -[.n32] -id = 32 - -[.n33] -id = 33 - -[.n34] -id = 34 - -[.n35] -id = 35 - -[.n36] -id = 36 - -[.n37] -id = 37 - -[.n38] -id = 38 - -[.n39] -id = 39 - -[.n40] -id = 40 - -[.n41] -id = 41 - -[.n42] -id = 42 - -[.n43] -id = 43 - -[.n44] -id = 44 - -[.n45] -id = 45 - -[.n46] -id = 46 - -[.n47] -id = 47 - -[.n48] -id = 48 - -[.n49] -id = 49 - -[.n50] -id = 50 - -[.n51] -id = 51 - -[.n52] -id = 52 - -[.n53] -id = 53 - -[.n54] -id = 54 - -[.n55] -id = 55 - -[.n56] -id = 56 - -[.n57] -id = 57 - -[.n58] -id = 58 - -[.n59] -id = 59 - -[.n60] -id = 60 - -[.n61] -id = 61 - -[.n62] -id = 62 - -[.n63] -id = 63 - -[.n64] -id = 64 - -[.n65] -id = 65 - -[.n66] -id = 66 - -[.n67] -id = 67 - -[.n68] -id = 68 - -[.n69] -id = 69 - -[.n70] -id = 70 - -[.n71] -id = 71 - -[.n72] -id = 72 - -[.n73] -id = 73 - -[.n74] -id = 74 - -[.n75] -id = 75 - -[.n76] -id = 76 - -[.n77] -id = 77 - -[.n78] -id = 78 - -[.n79] -id = 79 - -[.n80] -id = 80 - -[.n81] -id = 81 - -[.n82] -id = 82 - -[.n83] -id = 83 - -[.n84] -id = 84 - -[.n85] -id = 85 - -# Dungeoneering summon abilities -[.n86] -id = 86 - -[.n88] -id = 88 - -[.n89] -id = 89 - -[.n93] -id = 93 - -[.n94] -id = 94 - -[.n96] -id = 96 - -[.n97] -id = 97 - - - [health_orb] id = 748 type = "health_orb" diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index c61ebbb5f8..3c811b2bc4 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -136,7 +136,7 @@ class Summoning : Script { experience.add(Skill.Summoning, summoningXp) } - interfaceOption("Select left-click option", id = "summoning_orb:*") { + interfaceOption("Select left-click option", id = "summoning_orb:leftclick_options") { openFollowerLeftClickOptions() } @@ -160,11 +160,11 @@ class Summoning : Script { confirmFollowerLeftClickOptions() } - interfaceOption("Dismiss", id = "summoning_orb:*") { + interfaceOption("Dismiss", id = "summoning_orb:*dismiss_follower") { dismissFamiliar() } - interfaceOption("Renew Familiar", id = "summoning_orb:*") { + interfaceOption("Renew Familiar", id = "summoning_orb:*renew_familiar") { renewFamiliar() } @@ -190,7 +190,7 @@ class Summoning : Script { callFollower() } - interfaceOption("Call Follower", "summoning_orb:*") { + interfaceOption("Call Follower", "summoning_orb:*call_follower") { callFollower() } From 5f9592a401d1e8bd9234f0605694fde67ac7c769 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 22 Dec 2025 21:48:30 -0400 Subject: [PATCH 37/46] Add familiar details cast button component defs --- data/skill/summoning/summoning.ifaces.toml | 210 +++++++++++++++++++++ 1 file changed, 210 insertions(+) diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index c2a0caa2c6..a16f7f2aba 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -58,6 +58,216 @@ id = 67 [.renew] id = 69 +[.cast_howl_scroll] +id = 75 + +[.cast_dreadfowl_strike_scroll] +id = 77 + +[.cast_rise_from_the_ashes_scroll] +id = 78 + +[.cast_vampire_touch_scroll] +id = 81 + +[.cast_herbcall_scroll] +id = 83 + +[.cast_stony_shell_scroll] +id = 85 + +[.cast_evil_flames_scroll] +id = 87 + +[.cast_fruitfall_scroll] +id = 89 + +[.cast_thieving_fingers_scroll] +id = 91 + +[.cast_egg_spawn_scroll] +id = 93 + +[.cast_fish_rain_scroll] +id = 95 + +[.cast_abyssal_stealth_scroll] +id = 97 + +[.cast_multichop_scroll] +id = 99 + +[.cast_unburden_scroll] +id = 101 + +[.cast_crushing_claw_scroll] +id = 103 + +[.cast_mantis_strike_scroll] +id = 105 + +[.cast_famine_scroll] +id = 107 + +[.cast_sandstorm_scroll] +id = 109 + +[.cast_venom_shot_scroll] +id = 111 + +[.cast_cheese_feast_scroll] +id = 113 + +[.cast_insane_ferocity_scroll] +id = 115 + +[.cast_toad_bark_scroll] +id = 117 + +[.cast_arctic_blast_scroll] +id = 119 + +[.cast_winter_storage_scroll] +id = 121 + +[.cast_healing_aura_scroll] +id = 123 + +[.cast_oph_incubation_scroll] +id = 125 + +[.cast_testudo_scroll] +id = 127 + +[.cast_slime_spray_scroll] +id = 129 + +[.cast_electric_lash_scroll] +id = 131 + +[.cast_dissolve_scroll] +id = 133 + +[.cast_abyssal_drain_scroll] +id = 135 + +[.cast_petrifying_gaze_scroll] +id = 137 + +[.cast_tireless_run_scroll] +id = 139 + +[.cast_blood_drain_scroll] +id = 141 + +[.cast_dust_cloud_scroll] +id = 143 + +[.cast_doomsphere_scroll] +id = 145 + +[.cast_generate_compost_scroll] +id = 147 + +[.cast_acorn_missile_scroll] +id = 149 + +[.cast_poisonous_blast_scroll] +id = 151 + +[.cast_deadly_claw_scroll] +id = 153 + +[.cast_regrowth_scroll] +id = 155 + +[.cast_spike_shot_scroll] +id = 157 + +[.cast_addy_bull_rush_scroll] +id = 159 + +[.cast_magic_focus_scroll] +id = 161 + +[.cast_swallow_whole_scroll] +id = 163 + +[.cast_swamp_plague_scroll] +id = 165 + +[.cast_call_to_arms_scroll] +id = 167 + +[.cast_titans_con_scroll] +id = 169 + +[.cast_boil_scroll] +id = 171 + +[.cast_steel_of_legends_scroll] +id = 173 + +[.cast_explode_scroll] +id = 175 + +[.cast_goad_scroll] +id = 177 + +[.cast_ambush_scroll] +id = 179 + +[.cast_ebon_thunder_scroll] +id = 181 + +[.cast_volcanic_str_scroll] +id = 183 + +[.cast_essence_shipment_scroll] +id = 185 + +[.cast_pester_scroll] +id = 187 + +[.cast_fireball_assault_scroll] +id = 189 + +[.cast_rending_scroll] +id = 191 + +[.cast_iron_within_scroll] +id = 193 + +[.cast_immense_heat_scroll] +id = 195 + +[.cast_inferno_scroll] +id = 197 + +[.cast_clay_deposit_scroll] +id = 199 + +[.cast_fetch_casket_scroll] +id = 200 + +[.cast_sundering_strike] +id = 203 + +[.cast_poisonous_shot] +id = 205 + +[.cast_snaring_wave] +id = 207 + +[.cast_aptitude] +id = 209 + +[.cast_second_wind] +id = 211 + +[.cast_glimmer_of_light] +id = 213 + [pet_details] id = 663 type = "follower_details_tab" From f4349d4492937aa41fc49f140caf8704f8fa8c8b Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Mon, 22 Dec 2025 22:04:59 -0400 Subject: [PATCH 38/46] Add cast component defs for summoning orb --- .../modal/toplevel/gameframe.ifaces.toml | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/data/entity/player/modal/toplevel/gameframe.ifaces.toml b/data/entity/player/modal/toplevel/gameframe.ifaces.toml index eefa038d4e..9f3fdbeea8 100644 --- a/data/entity/player/modal/toplevel/gameframe.ifaces.toml +++ b/data/entity/player/modal/toplevel/gameframe.ifaces.toml @@ -233,6 +233,217 @@ id = 19 [.leftclick_renew_familiar] id = 20 + +[.cast_fetch_casket] +id = 87 + +[.cast_poison_shot] +id = 90 + +[.cast_sundering_strike] +id = 91 + +[.cast_clay_deposit] +id = 92 + +[.cast_aptitude] +id = 95 + +[.cast_glimmer_of_light] +id = 98 + +[.cast_second_wind] +id = 99 + +[.cast_snaring_wave] +id = 100 + +[.cast_inferno] +id = 101 + +[.cast_immense_heat] +id = 102 + +[.cast_iron_within] +id = 103 + +[.cast_rending] +id = 104 + +[.cast_fireball_assault] +id = 105 + +[.cast_pester] +id = 106 + +[.cast_essence_shipment] +id = 107 + +[.cast_volcanic_strength] +id = 108 + +[.cast_ebon_thunder] +id = 109 + +[.cast_ambush] +id = 110 + +[.cast_goad] +id = 111 + +[.cast_explode] +id = 112 + +[.cast_steel_of_legends] +id = 113 + +[.cast_boil] +id = 114 + +[.cast_titans_constitution] +id = 115 + +[.cast_call_to_arms] +id = 116 + +[.cast_swamp_plague] +id = 117 + +[.cast_swallow_whole] +id = 118 + +[.cast_magic_focus] +id = 119 + +[.cast_bull_rush] +id = 120 + +[.cast_spike_shot] +id = 121 + +[.cast_regrowth] +id = 122 + +[.cast_deadly_claw] +id = 123 + +[.cast_poisonous_blast] +id = 124 + +[.cast_acorn_missile] +id = 125 + +[.cast_generate_compost] +id = 126 + +[.cast_doomsphere_device] +id = 127 + +[.cast_dust_cloud] +id = 128 + +[.cast_blood_drain] +id = 129 + +[.cast_tireless_run] +id = 130 + +[.cast_petrifying_gaze] +id = 131 + +[.cast_abyssal_drain] +id = 132 + +[.cast_dissolve] +id = 133 + +[.cast_electric_lash] +id = 134 + +[.cast_slime_spray] +id = 135 + +[.cast_testudo] +id = 136 + +[.cast_ophidian_incubation] +id = 137 + +[.cast_healing_aura] +id = 138 + +[.cast_winter_storage] +id = 139 + +[.cast_arctic_blast] +id = 140 + +[.cast_toad_bark] +id = 141 + +[.cast_insane_ferocity] +id = 142 + +[.cast_cheese_feast] +id = 143 + +[.cast_venom_shot] +id = 144 + +[.cast_sandstorm] +id = 145 + +[.cast_famine] +id = 146 + +[.cast_mantis_strike] +id = 147 + +[.cast_crushing_claw] +id = 148 + +[.cast_unburden] +id = 149 + +[.cast_multichop] +id = 150 + +[.cast_abyssal_stealth] +id = 151 + +[.cast_fish_rain] +id = 152 + +[.cast_egg_spawn] +id = 153 + +[.cast_thieving_fingers] +id = 154 + +[.cast_fruitfall] +id = 155 + +[.cast_evil_flames] +id = 156 + +[.cast_stony_shell] +id = 157 + +[.cast_herbcall] +id = 158 + +[.cast_vampire_touch] +id = 159 + +[.cast_rise_from_the_ashes] +id = 160 + +[.cast_dreadfowl_strike] +id = 161 + +[.cast_howl] +id = 162 + [health_orb] id = 748 type = "health_orb" From 5ea21dbf3964b631d6eb03e7abdeeaf4aeb28ce0 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 23 Dec 2025 15:52:54 -0400 Subject: [PATCH 39/46] Remove _scroll from end of summoning ifaces defs for consistency --- ...otlin-compiler-3185164159605468051.salive} | 0 data/skill/summoning/summoning.ifaces.toml | 128 +++++++++--------- 2 files changed, 64 insertions(+), 64 deletions(-) rename .kotlin/sessions/{kotlin-compiler-1736161099682289887.salive => kotlin-compiler-3185164159605468051.salive} (100%) diff --git a/.kotlin/sessions/kotlin-compiler-1736161099682289887.salive b/.kotlin/sessions/kotlin-compiler-3185164159605468051.salive similarity index 100% rename from .kotlin/sessions/kotlin-compiler-1736161099682289887.salive rename to .kotlin/sessions/kotlin-compiler-3185164159605468051.salive diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index a16f7f2aba..26d2fcdef2 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -58,196 +58,196 @@ id = 67 [.renew] id = 69 -[.cast_howl_scroll] +[.cast_howl] id = 75 -[.cast_dreadfowl_strike_scroll] +[.cast_dreadfowl_strike] id = 77 -[.cast_rise_from_the_ashes_scroll] +[.cast_rise_from_the_ashes] id = 78 -[.cast_vampire_touch_scroll] +[.cast_vampire_touch] id = 81 -[.cast_herbcall_scroll] +[.cast_herbcall] id = 83 -[.cast_stony_shell_scroll] +[.cast_stony_shell] id = 85 -[.cast_evil_flames_scroll] +[.cast_evil_flames] id = 87 -[.cast_fruitfall_scroll] +[.cast_fruitfall] id = 89 -[.cast_thieving_fingers_scroll] +[.cast_thieving_fingers] id = 91 -[.cast_egg_spawn_scroll] +[.cast_egg_spawn] id = 93 -[.cast_fish_rain_scroll] +[.cast_fish_rain] id = 95 -[.cast_abyssal_stealth_scroll] +[.cast_abyssal_stealth] id = 97 -[.cast_multichop_scroll] +[.cast_multichop] id = 99 -[.cast_unburden_scroll] +[.cast_unburden] id = 101 -[.cast_crushing_claw_scroll] +[.cast_crushing_claw] id = 103 -[.cast_mantis_strike_scroll] +[.cast_mantis_strike] id = 105 -[.cast_famine_scroll] +[.cast_famine] id = 107 -[.cast_sandstorm_scroll] +[.cast_sandstorm] id = 109 -[.cast_venom_shot_scroll] +[.cast_venom_shot] id = 111 -[.cast_cheese_feast_scroll] +[.cast_cheese_feast] id = 113 -[.cast_insane_ferocity_scroll] +[.cast_insane_ferocity] id = 115 -[.cast_toad_bark_scroll] +[.cast_toad_bark] id = 117 -[.cast_arctic_blast_scroll] +[.cast_arctic_blast] id = 119 -[.cast_winter_storage_scroll] +[.cast_winter_storage] id = 121 -[.cast_healing_aura_scroll] +[.cast_healing_aura] id = 123 -[.cast_oph_incubation_scroll] +[.cast_oph_incubation] id = 125 -[.cast_testudo_scroll] +[.cast_testudo] id = 127 -[.cast_slime_spray_scroll] +[.cast_slime_spray] id = 129 -[.cast_electric_lash_scroll] +[.cast_electric_lash] id = 131 -[.cast_dissolve_scroll] +[.cast_dissolve] id = 133 -[.cast_abyssal_drain_scroll] +[.cast_abyssal_drain] id = 135 -[.cast_petrifying_gaze_scroll] +[.cast_petrifying_gaze] id = 137 -[.cast_tireless_run_scroll] +[.cast_tireless_run] id = 139 -[.cast_blood_drain_scroll] +[.cast_blood_drain] id = 141 -[.cast_dust_cloud_scroll] +[.cast_dust_cloud] id = 143 -[.cast_doomsphere_scroll] +[.cast_doomsphere] id = 145 -[.cast_generate_compost_scroll] +[.cast_generate_compost] id = 147 -[.cast_acorn_missile_scroll] +[.cast_acorn_missile] id = 149 -[.cast_poisonous_blast_scroll] +[.cast_poisonous_blast] id = 151 -[.cast_deadly_claw_scroll] +[.cast_deadly_claw] id = 153 -[.cast_regrowth_scroll] +[.cast_regrowth] id = 155 -[.cast_spike_shot_scroll] +[.cast_spike_shot] id = 157 -[.cast_addy_bull_rush_scroll] +[.cast_addy_bull_rush] id = 159 -[.cast_magic_focus_scroll] +[.cast_magic_focus] id = 161 -[.cast_swallow_whole_scroll] +[.cast_swallow_whole] id = 163 -[.cast_swamp_plague_scroll] +[.cast_swamp_plague] id = 165 -[.cast_call_to_arms_scroll] +[.cast_call_to_arms] id = 167 -[.cast_titans_con_scroll] +[.cast_titans_con] id = 169 -[.cast_boil_scroll] +[.cast_boil] id = 171 -[.cast_steel_of_legends_scroll] +[.cast_steel_of_legends] id = 173 -[.cast_explode_scroll] +[.cast_explode] id = 175 -[.cast_goad_scroll] +[.cast_goad] id = 177 -[.cast_ambush_scroll] +[.cast_ambush] id = 179 -[.cast_ebon_thunder_scroll] +[.cast_ebon_thunder] id = 181 -[.cast_volcanic_str_scroll] +[.cast_volcanic_str] id = 183 -[.cast_essence_shipment_scroll] +[.cast_essence_shipment] id = 185 -[.cast_pester_scroll] +[.cast_pester] id = 187 -[.cast_fireball_assault_scroll] +[.cast_fireball_assault] id = 189 -[.cast_rending_scroll] +[.cast_rending] id = 191 -[.cast_iron_within_scroll] +[.cast_iron_within] id = 193 -[.cast_immense_heat_scroll] +[.cast_immense_heat] id = 195 -[.cast_inferno_scroll] +[.cast_inferno] id = 197 -[.cast_clay_deposit_scroll] +[.cast_clay_deposit] id = 199 -[.cast_fetch_casket_scroll] +[.cast_fetch_casket] id = 200 [.cast_sundering_strike] From b7fcb2250c055dea0e54d8baa9587d0692e21e06 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 23 Dec 2025 19:12:35 -0400 Subject: [PATCH 40/46] Fix cast option not clearing after dismissing a familiar --- ...otlin-compiler-13402367590910661585.salive} | 0 data/client/client.scripts.toml | 5 ++++- .../content/skill/summoning/Summoning.kt | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) rename .kotlin/sessions/{kotlin-compiler-3185164159605468051.salive => kotlin-compiler-13402367590910661585.salive} (100%) diff --git a/.kotlin/sessions/kotlin-compiler-3185164159605468051.salive b/.kotlin/sessions/kotlin-compiler-13402367590910661585.salive similarity index 100% rename from .kotlin/sessions/kotlin-compiler-3185164159605468051.salive rename to .kotlin/sessions/kotlin-compiler-13402367590910661585.salive diff --git a/data/client/client.scripts.toml b/data/client/client.scripts.toml index f0fe4242ac..ca6c3f9f44 100644 --- a/data/client/client.scripts.toml +++ b/data/client/client.scripts.toml @@ -282,4 +282,7 @@ params = [ ] [refresh_item_info] -id = 917 \ No newline at end of file +id = 917 + +[reset_summoning_orb] +id = 2471 \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index 3c811b2bc4..2fe58df491 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -4,7 +4,9 @@ import content.entity.player.dialogue.type.choice import world.gregs.voidps.cache.definition.data.NPCDefinition import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.sendScript import world.gregs.voidps.engine.data.definition.EnumDefinitions +import world.gregs.voidps.engine.data.definition.InterfaceDefinitions import world.gregs.voidps.engine.data.definition.ItemDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.Character @@ -23,6 +25,7 @@ import world.gregs.voidps.engine.queue.softQueue val itemDefinitions: ItemDefinitions by inject() val npcs: NPCs by inject() val enums: EnumDefinitions by inject() +val interfaceDefs: InterfaceDefinitions by inject() val Character?.isFamiliar: Boolean get() = this != null && this is NPC && id.endsWith("_familiar") @@ -64,11 +67,16 @@ fun Player.dismissFamiliar() { npcs.remove(follower) follower = null interfaces.close("familiar_details") - - this["follower_details_name"] = 0 - this["follower_details_chathead"] = 0 - this["familiar_details_minutes_remaining"] = 0 - this["familiar_details_seconds_remaining"] = 0 + sendScript("reset_summoning_orb") + + // Need to wait for the above sendScript to reach the client before resetting + // Cast option for previous familiar will not be cleared from summoning_orb right-click menu otherwise + softQueue("reset_familiar_vars", 1) { + player["follower_details_name"] = 0 + player["follower_details_chathead"] = 0 + player["familiar_details_minutes_remaining"] = 0 + player["familiar_details_seconds_remaining"] = 0 + } timers.stop("familiar_timer") } From 85a047b0b255078ff79240e87ebbdcb8980fd1db Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Tue, 23 Dec 2025 19:14:02 -0400 Subject: [PATCH 41/46] Remove unused interface defs inject --- game/src/main/kotlin/content/skill/summoning/Summoning.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index 2fe58df491..38add9f6a9 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -6,7 +6,6 @@ import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.sendScript import world.gregs.voidps.engine.data.definition.EnumDefinitions -import world.gregs.voidps.engine.data.definition.InterfaceDefinitions import world.gregs.voidps.engine.data.definition.ItemDefinitions import world.gregs.voidps.engine.data.definition.NPCDefinitions import world.gregs.voidps.engine.entity.character.Character @@ -25,7 +24,6 @@ import world.gregs.voidps.engine.queue.softQueue val itemDefinitions: ItemDefinitions by inject() val npcs: NPCs by inject() val enums: EnumDefinitions by inject() -val interfaceDefs: InterfaceDefinitions by inject() val Character?.isFamiliar: Boolean get() = this != null && this is NPC && id.endsWith("_familiar") From 2e569328c29a3edb6aaad74a036877f1179d1984 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 25 Dec 2025 18:46:49 -0400 Subject: [PATCH 42/46] Define additional summoning varbits --- ...tlin-compiler-18058149951275275357.salive} | 0 data/skill/summoning/summoning.varbits.toml | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+) rename .kotlin/sessions/{kotlin-compiler-13402367590910661585.salive => kotlin-compiler-18058149951275275357.salive} (100%) diff --git a/.kotlin/sessions/kotlin-compiler-13402367590910661585.salive b/.kotlin/sessions/kotlin-compiler-18058149951275275357.salive similarity index 100% rename from .kotlin/sessions/kotlin-compiler-13402367590910661585.salive rename to .kotlin/sessions/kotlin-compiler-18058149951275275357.salive diff --git a/data/skill/summoning/summoning.varbits.toml b/data/skill/summoning/summoning.varbits.toml index 586cae7fc5..06c21866e3 100644 --- a/data/skill/summoning/summoning.varbits.toml +++ b/data/skill/summoning/summoning.varbits.toml @@ -1,3 +1,27 @@ +# 1043 - 1048 hold numbers representing a string. First character will always be capitalized +# Characters are space as 0 and A-Z as 1-26 +[pet_name_char_1] +id = 1043 + +[pet_name_char_2] +id = 1044 + +[pet_name_char_3] +id = 1045 + +[pet_name_char_4] +id = 1046 + +[pet_name_char_6] +id = 1047 + +[pet_name_char_7] +id = 1048 + +# Displays text from 1043 - 1048 in the pet's name space if set to 1 in the pet details interface (663) +[override_pet_name] +id = 1049 + [show_summoning_orb] id = 4280 format = "boolean" From 6c2406ac114123c73a07020c3a327d3aabe5ba63 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 25 Dec 2025 19:00:02 -0400 Subject: [PATCH 43/46] Add comments to Summoning functions --- .../content/skill/summoning/Summoning.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index 38add9f6a9..c6a93c4a41 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -40,6 +40,13 @@ var Player.follower: NPC? } } +/** + * Summons the given familiar if the player doesn't already have a follower + * + * @param familiar: The [NPCDefinition] of the familiar being summoned + * @param restart: A boolean used to tell if this familiar is being summoned at log in. If set to false will start a new + * familiar timer + */ fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { if (follower != null) { // TODO: Find actual message for this @@ -61,6 +68,10 @@ fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { return familiarNpc } +/** + * Dismisses the familiar that is following the player and resets the summoning orb and varbits back to their default + * states. Also stops the familiar timer. + */ fun Player.dismissFamiliar() { npcs.remove(follower) follower = null @@ -78,6 +89,9 @@ fun Player.dismissFamiliar() { timers.stop("familiar_timer") } +/** + * Updates the familiar interface (663) with the details of the player's current follower + */ fun Player.updateFamiliarInterface() { if (follower == null) return @@ -89,20 +103,33 @@ fun Player.updateFamiliarInterface() { this["follower_details_chathead_animation"] = 1 } +/** + * Opens the interface used to set the left-click option of the summoning orb on the minimap + */ fun Player.openFollowerLeftClickOptions() { interfaces.open("follower_left_click_options") } +/** + * Confirms the selected option in the follower_left_click_options interface and sets the var. + */ fun Player.confirmFollowerLeftClickOptions() { this["summoning_orb_left_click_option"] = this["summoning_menu_left_click_option", -1] interfaces.close("follower_left_click_options") } +/** + * Teleports the player's follower to their position + */ fun Player.callFollower() { follower!!.tele(steps.follow, clearMode = false) follower!!.clearWatch() } +/** + * Resets the familiar back to its maximum remaining time based on the summoned familiar. Removes the pouch from the player's + * inventory and rewards xp. + */ fun Player.renewFamiliar() { val pouchId = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) val pouchItem = Item(itemDefinitions.get(pouchId).stringId) From 7443d346e181867734352f9fba29af1d0e5bebf0 Mon Sep 17 00:00:00 2001 From: Ilwyd Date: Thu, 25 Dec 2025 19:09:18 -0400 Subject: [PATCH 44/46] Change from this[] to set() and get() for vars --- .../content/skill/summoning/Summoning.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index c6a93c4a41..29e6af2870 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -30,13 +30,13 @@ val Character?.isFamiliar: Boolean var Player.follower: NPC? get() { - val index = this["follower_index", -1] + val index = get("follower_index", -1) return world.gregs.voidps.engine.get().indexed(index) } set(value) { if (value != null) { - this["follower_index"] = value.index - this["follower_id"] = value.id + set("follower_index", value.index) + set("follower_id", value.id) } } @@ -95,12 +95,12 @@ fun Player.dismissFamiliar() { fun Player.updateFamiliarInterface() { if (follower == null) return - this.interfaces.open("familiar_details") + interfaces.open("familiar_details") - this["follower_details_name"] = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) - this["follower_details_chathead"] = follower!!.def.id + set("follower_details_name", enums.get("summoning_familiar_ids").getKey(follower!!.def.id)) + set("follower_details_chathead", follower!!.def.id) - this["follower_details_chathead_animation"] = 1 + set("follower_details_chathead_animation", 1) } /** @@ -114,7 +114,7 @@ fun Player.openFollowerLeftClickOptions() { * Confirms the selected option in the follower_left_click_options interface and sets the var. */ fun Player.confirmFollowerLeftClickOptions() { - this["summoning_orb_left_click_option"] = this["summoning_menu_left_click_option", -1] + set("summoning_orb_left_click_option", get("summoning_menu_left_click_option", -1)) interfaces.close("follower_left_click_options") } @@ -141,8 +141,8 @@ fun Player.renewFamiliar() { } inventory.remove(pouchItem.id) - this["familiar_details_minutes_remaining"] = follower!!.def["summoning_time_minutes", 0] - this["familiar_details_seconds_remaining"] = 0 + set("familiar_details_minutes_remaining", follower!!.def["summoning_time_minutes", 0]) + set("familiar_details_seconds_remaining", 0) follower!!.gfx("summon_familiar_size_${follower!!.size}") } From 2a85f3386150f9291cba8de48a47fd81914379af Mon Sep 17 00:00:00 2001 From: GregHib Date: Wed, 18 Feb 2026 00:03:55 +0000 Subject: [PATCH 45/46] Update to latest version --- .../content/skill/summoning/Summoning.kt | 29 +++++++------------ .../skill/summoning/SummoningTimers.kt | 7 ++--- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/game/src/main/kotlin/content/skill/summoning/Summoning.kt b/game/src/main/kotlin/content/skill/summoning/Summoning.kt index 29e6af2870..df30716722 100644 --- a/game/src/main/kotlin/content/skill/summoning/Summoning.kt +++ b/game/src/main/kotlin/content/skill/summoning/Summoning.kt @@ -21,17 +21,13 @@ import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.engine.queue.softQueue -val itemDefinitions: ItemDefinitions by inject() -val npcs: NPCs by inject() -val enums: EnumDefinitions by inject() - val Character?.isFamiliar: Boolean get() = this != null && this is NPC && id.endsWith("_familiar") var Player.follower: NPC? get() { val index = get("follower_index", -1) - return world.gregs.voidps.engine.get().indexed(index) + return NPCs.indexed(index) } set(value) { if (value != null) { @@ -43,8 +39,8 @@ var Player.follower: NPC? /** * Summons the given familiar if the player doesn't already have a follower * - * @param familiar: The [NPCDefinition] of the familiar being summoned - * @param restart: A boolean used to tell if this familiar is being summoned at log in. If set to false will start a new + * @param familiar The [NPCDefinition] of the familiar being summoned + * @param restart A boolean used to tell if this familiar is being summoned at login. If set to false will start a new * familiar timer */ fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { @@ -54,7 +50,7 @@ fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { return null } - val familiarNpc = npcs.add(familiar.stringId, tile) + val familiarNpc = NPCs.add(familiar.stringId, tile) familiarNpc.mode = Follow(familiarNpc, this) softQueue("summon_familiar", 2) { @@ -73,7 +69,7 @@ fun Player.summonFamiliar(familiar: NPCDefinition, restart: Boolean): NPC? { * states. Also stops the familiar timer. */ fun Player.dismissFamiliar() { - npcs.remove(follower) + NPCs.remove(follower) follower = null interfaces.close("familiar_details") sendScript("reset_summoning_orb") @@ -97,7 +93,7 @@ fun Player.updateFamiliarInterface() { interfaces.open("familiar_details") - set("follower_details_name", enums.get("summoning_familiar_ids").getKey(follower!!.def.id)) + set("follower_details_name", world.gregs.voidps.engine.get().get("summoning_familiar_ids").getKey(follower!!.def.id)) set("follower_details_chathead", follower!!.def.id) set("follower_details_chathead_animation", 1) @@ -131,8 +127,8 @@ fun Player.callFollower() { * inventory and rewards xp. */ fun Player.renewFamiliar() { - val pouchId = enums.get("summoning_familiar_ids").getKey(follower!!.def.id) - val pouchItem = Item(itemDefinitions.get(pouchId).stringId) + val pouchId = world.gregs.voidps.engine.get().get("summoning_familiar_ids").getKey(follower!!.def.id) + val pouchItem = Item(ItemDefinitions.get(pouchId).stringId) if (!inventory.contains(pouchItem.id)) { // TODO: Find the actual message used here in 2011 @@ -146,17 +142,14 @@ fun Player.renewFamiliar() { follower!!.gfx("summon_familiar_size_${follower!!.size}") } -class Summoning : Script { - - val enums: EnumDefinitions by inject() - val npcDefinitions: NPCDefinitions by inject() +class Summoning(val enums: EnumDefinitions) : Script { init { itemOption("Summon", "*_pouch") { option -> val familiarLevel = enums.get("summoning_pouch_levels").getInt(option.item.def.id) val familiarId = enums.get("summoning_familiar_ids").getInt(option.item.def.id) val summoningXp = option.item.def["summon_experience", 0.0] - val familiar = npcDefinitions.get(familiarId) + val familiar = NPCDefinitions.get(familiarId) if (levels.get(Skill.Summoning) < familiarLevel) { // TODO: Get actual message @@ -232,7 +225,7 @@ class Summoning : Script { return@playerSpawn } - val familiarDef = npcDefinitions.get(get("follower_details_chathead", -1)) + val familiarDef = NPCDefinitions.get(get("follower_details_chathead", -1)) variables.send("follower_details_name") variables.send("follower_details_chathead") variables.send("familiar_details_minutes_remaining") diff --git a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt index 63da78c15c..6f54d46895 100644 --- a/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt +++ b/game/src/main/kotlin/content/skill/summoning/SummoningTimers.kt @@ -1,6 +1,7 @@ package content.skill.summoning import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.timer.Timer import world.gregs.voidps.engine.timer.toTicks import java.util.concurrent.TimeUnit @@ -9,12 +10,10 @@ class SummoningTimers : Script { init { timerStart("familiar_timer") { restart -> - - if(!restart) { + if (!restart) { set("familiar_details_minutes_remaining", follower!!.def["summoning_time_minutes", 0]) set("familiar_details_seconds_remaining", 0) } - return@timerStart TimeUnit.SECONDS.toTicks(30) } @@ -33,7 +32,7 @@ class SummoningTimers : Script { timerStop("familiar_timer") { logout -> if (logout) { - npcs.remove(follower) + NPCs.remove(follower) return@timerStop } From 604eff610792ef6d9a82ef7bde1b33c2fe8101d4 Mon Sep 17 00:00:00 2001 From: GregHib Date: Wed, 18 Feb 2026 00:04:17 +0000 Subject: [PATCH 46/46] Drop compiler salive file --- .kotlin/sessions/kotlin-compiler-18058149951275275357.salive | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .kotlin/sessions/kotlin-compiler-18058149951275275357.salive diff --git a/.kotlin/sessions/kotlin-compiler-18058149951275275357.salive b/.kotlin/sessions/kotlin-compiler-18058149951275275357.salive deleted file mode 100644 index e69de29bb2..0000000000