diff --git a/Server/src/main/kotlin/api/ContentAPI.kt b/Server/src/main/kotlin/api/ContentAPI.kt
index 1859bd6e0..0dc908e46 100644
--- a/Server/src/main/kotlin/api/ContentAPI.kt
+++ b/Server/src/main/kotlin/api/ContentAPI.kt
@@ -2,6 +2,7 @@ package api
import core.cache.def.impl.ItemDefinition
import core.game.component.Component
+import core.game.content.dialogue.FacialExpression
import core.game.node.Node
import core.game.node.`object`.GameObject
import core.game.node.`object`.ObjectBuilder
@@ -833,4 +834,68 @@ object ContentAPI {
Container.INVENTORY -> player.inventory.remove(Item(it, amountInInventory(player, it)))
}
}
+
+ /**
+ * Sends a string to a specific interface child
+ * @param player the player to send the packet to
+ * @param string the string to send to the child
+ * @param iface the ID of the interface to use
+ * @param child the index of the child to send the string to
+ */
+ @JvmStatic
+ fun setInterfaceText(player: Player, string: String, iface: Int, child: Int){
+ player.packetDispatch.sendString(string,iface,child)
+ }
+
+ /**
+ * Closes any open (non-chat) interfaces for the player
+ * @param player the player to close the interface for
+ */
+ @JvmStatic
+ fun closeInterface(player: Player){
+ player.interfaceManager.close()
+ }
+
+ /**
+ * Closes any opened tab interfaces for the player
+ * @param player the player to close the tab for
+ */
+ @JvmStatic
+ fun closeTabInterface(player: Player){
+ player.interfaceManager.closeSingleTab()
+ }
+
+ /**
+ * Sends a dialogue that uses the player's chathead.
+ * @param player the player to send the dialogue to
+ * @param msg the message to send.
+ * @param expr the FacialExpression to use. An enum exists for these called FacialExpression. Defaults to FacialExpression.FRIENDLY
+ */
+ @JvmStatic
+ fun sendPlayerDialogue(player: Player, msg: String, expr: FacialExpression = FacialExpression.FRIENDLY){
+ player.dialogueInterpreter.sendDialogues(player, expr, *DialUtils.splitLines(msg))
+ }
+
+ /**
+ * Sends a player model to a specific interface child
+ * @param player the player to send the packet to and whose model to use
+ * @param iface the ID of the interface to send it to
+ * @param child the index of the child on the interface to send the model to
+ */
+ @JvmStatic
+ fun sendPlayerOnInterface(player: Player, iface: Int, child: Int){
+ player.packetDispatch.sendPlayerOnInterface(iface,child)
+ }
+
+ /**
+ * Sends an animation to a specific interface child
+ * @param player the player to send the packet to
+ * @param anim the ID of the animation to send to the interface
+ * @param iface the ID of the interface to send the animation to
+ * @param child the index of the child on the interface to send the model to
+ */
+ @JvmStatic
+ fun sendAnimationOnInterface(player: Player, anim: Int, iface: Int, child: Int){
+ player.packetDispatch.sendAnimationInterface(anim,iface,child)
+ }
}
\ No newline at end of file
diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/CreditShopInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/CreditShopInterface.kt
index a089eba16..93df9cc84 100644
--- a/Server/src/main/kotlin/rs09/game/interaction/inter/CreditShopInterface.kt
+++ b/Server/src/main/kotlin/rs09/game/interaction/inter/CreditShopInterface.kt
@@ -1,5 +1,6 @@
package rs09.game.interaction.inter
+import api.ContentAPI
import core.game.node.entity.player.Player
import core.game.node.item.Item
import org.rs09.consts.Components
@@ -16,7 +17,7 @@ class CreditShopInterface : InterfaceListener() {
val item = getItem(buttonID)
if(opcode == 155){
- player.dialogueInterpreter.sendDialogue("This item costs ${item.price} credits.")
+ ContentAPI.sendDialogue(player, "This item costs ${item.price} credits.")
return@on true
}
@@ -58,19 +59,19 @@ class CreditShopInterface : InterfaceListener() {
}
fun sendCredits(player: Player){
- player.packetDispatch.sendString("You have ${player.details.credits} credits to spend.",CREDIT_SHOP,TEXT_CHILD)
+ ContentAPI.setInterfaceText(player, "You have ${player.details.credits} credits to spend.", CREDIT_SHOP, TEXT_CHILD)
}
fun attemptPurchase(player: Player, item: Int, price: Int){
if(player.details.credits < price){
- player.dialogueInterpreter.sendDialogue("You don't have enough credits for that.")
+ ContentAPI.sendDialogue(player, "You don't have enough credits for that.")
return
}
if(player.inventory.add(Item(item))){
player.details.credits -= price
} else {
- player.dialogueInterpreter.sendDialogue("You don't have enough inventory space for that.")
+ ContentAPI.sendDialogue(player, "You don't have enough inventory space for that.")
}
sendCredits(player)
}
diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/ExperienceInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/ExperienceInterface.kt
index 015235db6..ce9dd3038 100644
--- a/Server/src/main/kotlin/rs09/game/interaction/inter/ExperienceInterface.kt
+++ b/Server/src/main/kotlin/rs09/game/interaction/inter/ExperienceInterface.kt
@@ -1,5 +1,6 @@
package rs09.game.interaction.inter
+import api.ContentAPI
import core.game.component.Component
import core.game.component.ComponentDefinition
import core.game.component.ComponentPlugin
@@ -40,8 +41,8 @@ class ExperienceInterface() : ComponentPlugin() {
if(caller is Plugin<*>)
caller.handleSelectionCallback(confirmedSkill, player)
else (caller as (Int,Player) -> Unit).invoke(confirmedSkill,player)
- player.audioManager.send(SOUND)
- player.interfaceManager.close()
+ ContentAPI.playAudio(player, SOUND)
+ ContentAPI.closeInterface(player)
}
} else {
val skill = when (button) {
diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt
index 9665bc980..1d22efd58 100644
--- a/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt
+++ b/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt
@@ -1,6 +1,8 @@
package rs09.game.interaction.inter
+import api.ContentAPI
import core.game.component.Component
+import core.game.content.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.TeleportManager
import core.game.system.task.Pulse
@@ -35,13 +37,13 @@ class FairyRingInterface : InterfaceListener(){
}
onClose(RINGS){player, _ ->
- player.interfaceManager.closeSingleTab()
+ ContentAPI.closeTabInterface(player)
player.removeAttribute("fr:ring1")
player.removeAttribute("fr:ring2")
player.removeAttribute("fr:ring3")
- player.varpManager.get(816).clearBitRange(0,31)
- player.varpManager.get(816).send(player)
- player.interfaceManager.closeSingleTab()
+ ContentAPI.clearVarp(player, 816)
+ ContentAPI.setVarbit(player, 816, 0, 0)
+ ContentAPI.closeTabInterface(player)
return@onClose true
}
@@ -74,7 +76,7 @@ class FairyRingInterface : InterfaceListener(){
toSet = !toSet
player.setAttribute("fr:sortorder",toSet)
if(toSet) {
- player.configManager.forceSet(816, ring1index, false)
+ ContentAPI.setVarbit(player, 816, 0, ring1index)
player.setAttribute("fr:ring2",0)
player.setAttribute("fr:ring3",0)
}
@@ -108,7 +110,7 @@ class FairyRingInterface : InterfaceListener(){
val ring: FairyRing? = FairyRing.valueOf(code.toUpperCase())
var tile = ring?.tile
if(ring == FairyRing.CIP){
- player.dialogueInterpreter.sendDialogue("The ring seems to reject you.")
+ ContentAPI.sendDialogue(player, "The ring seems to reject you.")
}
if (ring == null || tile == null) {
val center = Location(2412, 4434, 0)
@@ -122,7 +124,7 @@ class FairyRingInterface : InterfaceListener(){
}
GameWorld.Pulser.submit(object : Pulse(4, player) {
override fun pulse(): Boolean {
- player.dialogueInterpreter.sendDialogues(player, null, "Wow, fairy magic sure is useful, I hardly moved at all!")
+ ContentAPI.sendPlayerDialogue(player, "Wow, fairy magic sure is useful, I hardly moved at all!", FacialExpression.AMAZED)
return true
}
})
@@ -131,8 +133,8 @@ class FairyRingInterface : InterfaceListener(){
player.savedData.globalData.setTravelLog(ring.ordinal)
}
}
- player.interfaceManager.close()
- player.teleporter.send(tile,TeleportManager.TeleportType.FAIRY_RING)
+ ContentAPI.closeInterface(player)
+ ContentAPI.teleport(player, tile!!, TeleportManager.TeleportType.FAIRY_RING)
}
}
@@ -190,7 +192,7 @@ enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int
if (ring.childId == -1) {
continue
}
- player.packetDispatch.sendString("
" + ring.tip, 735, ring.childId)
+ ContentAPI.setInterfaceText(player, "
${ring.tip}", 735, ring.childId)
}
}
}
diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/FurClothingInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/FurClothingInterface.kt
index 31934405e..26ad97c93 100644
--- a/Server/src/main/kotlin/rs09/game/interaction/inter/FurClothingInterface.kt
+++ b/Server/src/main/kotlin/rs09/game/interaction/inter/FurClothingInterface.kt
@@ -1,5 +1,6 @@
package rs09.game.interaction.inter
+import api.ContentAPI
import core.game.component.Component
import core.game.component.ComponentDefinition
import core.game.component.ComponentPlugin
@@ -96,8 +97,8 @@ class FurClothingInterface : ComponentPlugin(){
val checkedFurs = arrayListOf()
for(CLOTHING in FUR_CLOTHING.values()){
if(checkedFurs.contains(CLOTHING.textContent)) continue
- if(player.inventory.containsItem(CLOTHING.requiredFur)){
- player.packetDispatch.sendString(colorize("%G" + CLOTHING.textContent), FUR_CLOTHING_COMPONENT_ID,CLOTHING.textChildID)
+ if(ContentAPI.inInventory(player, CLOTHING.requiredFur.id, CLOTHING.requiredFur.amount)){
+ ContentAPI.setInterfaceText(player, colorize("%G${CLOTHING.textContent}"), FUR_CLOTHING_COMPONENT_ID, CLOTHING.textChildID)
checkedFurs.add(CLOTHING.textContent)
}
}
@@ -143,7 +144,7 @@ class FurClothingInterface : ComponentPlugin(){
}
private fun value(player: Player, clothing: FUR_CLOTHING){
- player.sendMessage("${clothing.product.name} requires ${clothing.requiredFur.amount} ${clothing.requiredFur.name.toLowerCase()} and costs ${clothing.price} coins.")
+ ContentAPI.sendMessage(player,"${clothing.product.name} requires ${clothing.requiredFur.amount} ${clothing.requiredFur.name.toLowerCase()} and costs ${clothing.price} coins.")
}
private fun buy(player: Player, clothing: FUR_CLOTHING, amount: Int){
@@ -151,19 +152,19 @@ class FurClothingInterface : ComponentPlugin(){
val amtFurRequired = clothing.requiredFur.amount * amount
val requiredFur = Item(clothing.requiredFur.id,amtFurRequired)
- if(!player.inventory.containsItem(requiredFur)){
- player.dialogueInterpreter.sendDialogue("You don't have enough fur for that.")
+ if(!ContentAPI.inInventory(player, requiredFur.id, requiredFur.amount)){
+ ContentAPI.sendDialogue(player, "You don't have enough fur for that.")
return
}
- if(!player.inventory.containsItem(coins)){
- player.dialogueInterpreter.sendDialogue("You can't afford that.")
+ if(!ContentAPI.inInventory(player, coins.id, coins.amount)){
+ ContentAPI.sendDialogue(player,"You can't afford that.")
return
}
- player.inventory.remove(requiredFur)
- player.inventory.remove(coins)
- player.inventory.add(Item(clothing.product.id,amount))
+ ContentAPI.removeItem(player, requiredFur, api.Container.INVENTORY)
+ ContentAPI.removeItem(player, coins, api.Container.INVENTORY)
+ ContentAPI.addItem(player, clothing.product.id, amount)
}
override fun newInstance(arg: Any?): Plugin {
diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/HairDresserInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/HairDresserInterface.kt
index 1452c0abb..edd15a528 100644
--- a/Server/src/main/kotlin/rs09/game/interaction/inter/HairDresserInterface.kt
+++ b/Server/src/main/kotlin/rs09/game/interaction/inter/HairDresserInterface.kt
@@ -1,5 +1,6 @@
package rs09.game.interaction.inter
+import api.ContentAPI
import core.game.component.Component
import core.game.component.ComponentDefinition
import core.game.component.ComponentPlugin
@@ -141,9 +142,9 @@ class HairDresserInterface : ComponentPlugin(){
HAIRDRESSER_MALE_COMPONENT_ID -> 61
else -> 0
}
- player.packetDispatch.sendPlayerOnInterface(usedInterface,player_model_child)
- player.packetDispatch.sendAnimationInterface(FacialExpression.HAPPY.animationId,usedInterface,player_head_child)
- player.packetDispatch.sendPlayerOnInterface(usedInterface,player_head_child)
+ ContentAPI.sendPlayerOnInterface(player, usedInterface, player_model_child)
+ ContentAPI.sendPlayerOnInterface(player, usedInterface, player_head_child)
+ ContentAPI.sendAnimationOnInterface(player, FacialExpression.HAPPY.animationId, usedInterface, player_head_child)
player.toggleWardrobe(true)
component?.setCloseEvent{pl,_ ->
diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/MainGameInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/MainGameInterface.kt
index 128a78073..c4b36792a 100644
--- a/Server/src/main/kotlin/rs09/game/interaction/inter/MainGameInterface.kt
+++ b/Server/src/main/kotlin/rs09/game/interaction/inter/MainGameInterface.kt
@@ -1,5 +1,6 @@
package rs09.game.interaction.inter
+import api.ContentAPI
import core.game.component.CloseEvent
import core.game.component.Component
import core.game.content.quest.tutorials.tutorialisland.TutorialSession
@@ -32,15 +33,15 @@ class MainGameInterface : InterfaceListener() {
on(TOPLEVEL_FS){player, _, _, buttonID, _, _ ->
when (buttonID) {
- 12 -> player.packetDispatch.sendString(
- "When you have finished playing " + settings!!.name + ", always use the button below to logout safely. ",
- 182,
- 0
+ 12 -> ContentAPI.setInterfaceText(player,
+ "When you have finished playing " + settings!!.name + ", always use the button below to logout safely. ",
+ 182,
+ 0
)
- 49 -> player.packetDispatch.sendString(
- "Friends List - " + settings!!.name + " " + settings!!.worldId,
- 550,
- 3
+ 49 -> ContentAPI.setInterfaceText(player,
+ "Friends List - " + settings!!.name + " " + settings!!.worldId,
+ 550,
+ 3
)
110 -> configureWorldMap(player)
}