Files
2009scape/Server/src/main/kotlin/api/ContentAPI.kt
T
2021-06-29 17:39:21 -05:00

997 lines
35 KiB
Kotlin

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`.Scenery
import core.game.node.`object`.SceneryBuilder
import core.game.node.entity.Entity
import core.game.node.entity.combat.ImpactHandler
import core.game.node.entity.impl.Animator
import core.game.node.entity.impl.Projectile
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.RunScript
import core.game.node.entity.player.link.TeleportManager
import core.game.node.entity.player.link.audio.Audio
import core.game.node.entity.player.link.emote.Emotes
import core.game.node.entity.skill.gather.SkillingTool
import core.game.node.item.GroundItem
import core.game.node.item.GroundItemManager
import core.game.node.item.Item
import core.game.system.task.Pulse
import core.game.world.map.Location
import core.game.world.map.RegionManager
import core.game.world.map.path.Pathfinder
import core.game.world.update.flag.context.Animation
import core.game.world.update.flag.context.Graphics
import core.tools.RandomFunction
import rs09.game.content.dialogue.DialogueFile
import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld
import rs09.game.world.GameWorld.Pulser
import rs09.game.world.repository.Repository
object ContentAPI {
/**
* Gets a skilling tool which the player has the level to use and is in their inventory.
* @param player the player to get the tool for
* @param pickaxe whether or not we are trying to get a pickaxe.
* @return the tool which meets the requirements or null if none.
*/
@JvmStatic
fun getTool(player: Player, pickaxe: Boolean): SkillingTool? {
return if(pickaxe) SkillingTool.getPickaxe(player) else SkillingTool.getHatchet(player)
}
/**
* Check if a player has a given level (buffable/debuffable)
* @param player the player to check the stat for
* @param skill the Skill to check. There is an enum for this called Skills. Example: Skills.STRENGTH
* @param level the level to check against
* @return true if the check succeeds, false otherwise
*/
@JvmStatic
fun hasLevelDyn(player: Player, skill: Int, level: Int): Boolean {
return player.skills.getLevel(skill) >= level
}
/**
* Check if a player's static skill level meets a certain value
* @param player the player to check the stat for
* @param skill the Skill to check. There is an enum for this called Skills. Example: Skills.STRENGTH
* @param level the level to check against
* @return true if the check succeeds, false otherwise
*/
@JvmStatic
fun hasLevelStat(player: Player, skill: Int, level: Int): Boolean {
return player.skills.getStaticLevel(skill) >= level
}
/**
* Check if an item exists in a player's inventory
* @param player the player whose inventory to check
* @param item the ID of the item to check for
* @param amount the amount to check for
* @return true if the player has >= the given item in the given amount, false otherwise.
*/
@JvmStatic
fun inInventory(player: Player, item: Int, amount: Int = 1): Boolean {
return player.inventory.contains(item, amount)
}
/**
* Check the amount of a given item in the player's inventory
* @param player the player whose inventory to check
* @param id the ID of the item to check for the amount of
* @return the amount of the given ID in the player's inventory
*/
@JvmStatic
fun amountInInventory(player: Player, id: Int): Int{
return player.inventory.getAmount(id)
}
/**
* Check the amount of a given item in the player's bank
* @param player the player to check
* @param id the ID of the item to check for
* @return the amount of the ID in the player's bank.
*/
@JvmStatic
fun amountInBank(player: Player, id: Int): Int{
return player.bank.getAmount(id)
}
/**
* Check the amount of a given item in the player's equipment slots
* @param player the player to check
* @param id the ID of the item to check for
* @return the amount of the ID in the player's equipment.
*/
@JvmStatic
fun amountInEquipment(player: Player, id: Int): Int{
return player.equipment.getAmount(id)
}
/**
* Remove an item from a player's inventory
* @param player the player whose inventory to remove the item from
* @param item the ID or Item object to remove from the player's inventory
* @param container the Container to remove the items from. An enum exists for this in the api package called Container. Ex: api.Container.BANK
*/
@JvmStatic
fun <T> removeItem(player: Player, item: T, container: Container): Boolean {
item ?: return false
val it = when (item) {
is Item -> item
is Int -> Item(item)
else -> throw IllegalStateException("Invalid value passed for item")
}
return when(container){
Container.INVENTORY -> player.inventory.remove(it)
Container.BANK -> player.bank.remove(it)
Container.EQUIPMENT -> player.equipment.remove(it)
}
}
/**
* Add an item to a player's inventory
* @param player the player whose inventory to add an item to
* @param id the ID of the item to add
* @param amount the amount of the item to add, defaults to 1
* @return true if the item exists in the given amount in the player's inventory
*/
@JvmStatic
fun addItem(player: Player, id: Int, amount: Int = 1): Boolean{
return player.inventory.add(Item(id,amount))
}
/**
* Add an item with a variable quantity or drop it if a player does not have enough space
* @param player the player whose inventory to add to
* @param id the ID of the item to add to the player's inventory
* @param amount the amount of the ID to add to the player's inventory, defaults to 1
*/
@JvmStatic
fun addItemOrDrop(player: Player, id: Int, amount: Int = 1){
val item = Item(id, amount)
if(!player.inventory.add(item)) GroundItemManager.create(item,player)
}
/**
* Check if an item exists in a player's bank
* @param player the player whose bank to check
* @param item the ID of the item to check for
* @param amount the amount to check for, defaults to 1
* @return true if the item exists in the given amount in the player's bank
*/
@JvmStatic
fun inBank(player: Player, item: Int, amount: Int = 1): Boolean {
return player.bank.contains(item, amount)
}
/**
* Check if an item exists in a player's equipment
* @param player the player whose equipment to check
* @param item the ID of the item to check for
* @param amount the amount to check for, defaults to 1
* @return true if the item exists in the given amount in the player's equipment
*/
@JvmStatic
fun inEquipment(player: Player, item: Int, amount: Int = 1): Boolean {
return player.equipment.contains(item, amount)
}
/**
* Get number of free slots in a player's inventory
* @param player the player to check
* @return the number of free slots in the player's inventory
*/
@JvmStatic
fun freeSlots(player: Player): Int {
return player.inventory.freeSlots()
}
/**
* Get an animation by ID.
* @param id the ID of the animation to use
* @return an Animation object with the given ID.
*/
@JvmStatic
fun getAnimation(id: Int): Animation {
return Animation(id)
}
/**
* Get an animation by ID with priority
* @param id the ID of the animation to get
* @param priority the Animator.Priority enum instance to represent the desired priority
* @return an Animation object with the given ID and priority
*/
@JvmStatic
fun getAnimationWithPriority(id: Int, priority: Animator.Priority): Animation {
return Animation(id, Animator.Priority.values()[priority.ordinal])
}
/**
* Reset a player's animator
* @param player the player whose animator to reset
*/
@JvmStatic
fun resetAnimator(player: Player) {
player.animator.animate(Animation(-1, Animator.Priority.VERY_HIGH))
}
/**
* Get the number of ticks an animation lasts
* @param animation the Animation object to check the duration of
* @return the number of ticks the given animation lasts for
*/
@JvmStatic
fun animationDuration(animation: Animation): Int {
return animation.definition.durationTicks
}
/**
* Give a player some amount of experience in a specific skill
* @param player the player to award XP to
* @param skill the Skill ID to reward XP for. There is a Skills enum you can use for this. Example: Skills.STRENGTH
* @param amount the amount, including decimal place, of experience to award
*/
@JvmStatic
fun rewardXP(player: Player, skill: Int, amount: Double) {
player.skills.addExperience(skill, amount)
}
/**
* Replace an object with the given revert timer
* @param toReplace the GameObject instance we are replacing
* @param with the ID of the GameObject we wish to replace toReplace with
* @param for_ticks the number of ticks the object should be replaced for. Use -1 for permanent.
*/
@JvmStatic
fun replaceScenery(toReplace: Scenery, with: Int, for_ticks: Int) {
if (for_ticks == -1) {
SceneryBuilder.replace(toReplace, toReplace.transform(with))
} else {
SceneryBuilder.replace(toReplace, toReplace.transform(with), for_ticks)
}
toReplace.isActive = false
}
/**
* Gets the name of an item.
* @param id the ID of the item to get the name of
* @return the name of the item
*/
@JvmStatic
fun getItemName(id: Int): String {
return ItemDefinition.forId(id).name
}
/**
* Removes a ground item
* @param node the GroundItem object to remove
*/
@JvmStatic
fun removeGroundItem(node: GroundItem) {
GroundItemManager.destroy(node)
}
/**
* Checks if a ground item is valid/still exists/should exist
* @param node the GroundItem object to check the validity of
* @return true if the node is valid, false otherwise
*/
@JvmStatic
fun isValidGroundItem(node: GroundItem): Boolean {
return GroundItemManager.getItems().contains(node)
}
/**
* Checks if a player has space for an item
* @param player the player whose inventory to check
* @param item the Item to check against
* @return true if the player's inventory has space for the item
*/
@JvmStatic
fun hasSpaceFor(player: Player, item: Item): Boolean {
return player.inventory.hasSpaceFor(item)
}
/**
* Get the number of ticks passed since server startup
*/
@JvmStatic
fun getWorldTicks(): Int {
return GameWorld.ticks
}
/**
* Gets an Audio object with specified id, volume, etc
*/
@JvmStatic
fun getAudio(id: Int, volume: Int = 10, delay: Int = 1): Audio {
return Audio(id, volume, delay)
}
/**
* Impact an enemy with the given amount of damage and the given hitsplat type
* @param entity the entity to damage
* @param amount the amount of damage to deal
* @param type the type of hit splat to use, ImpactHandler.HitsplatType is an enum containing these options.
*/
@JvmStatic
fun impact(entity: Entity, amount: Int, type: ImpactHandler.HitsplatType) {
entity.impactHandler.manualHit(entity, amount, type)
}
/**
* Get an item's definition
* @param id the ID of the item to get the definition of
* @return the ItemDefinition for the given ID.
*/
@JvmStatic
fun itemDefinition(id: Int): ItemDefinition {
return ItemDefinition.forId(id)
}
/**
* Send an object animation
*/
@JvmStatic
fun animateScenery(player: Player, obj: Scenery, animationId: Int, global: Boolean = false) {
player.packetDispatch.sendSceneryAnimation(obj, getAnimation(animationId), global)
}
/**
* Produce a ground item owned by the player
*/
@JvmStatic
fun produceGroundItem(player: Player, item: Int) {
GroundItemManager.create(Item(item), player)
}
/**
* Spawns a projectile
*/
@JvmStatic
fun spawnProjectile(source: Entity, dest: Entity, projectileId: Int) {
Projectile.create(source, dest, projectileId).send()
}
/**
* Causes the given entity to face the given toFace
* @param entity the entity you wish to face something
* @param toFace the thing to face
* @param duration how long you wish to face the thing for
*/
@JvmStatic
fun face(entity: Entity, toFace: Node, duration: Int = -1) {
if (duration == -1) {
when (toFace) {
is Location -> entity.faceLocation(toFace)
is Entity -> entity.face(toFace)
}
} else {
when (toFace) {
is Location -> entity.faceTemporary(toFace.asNpc(), duration)
else -> entity.faceTemporary(toFace as Entity, duration)
}
}
}
/**
* Opens the given interface for the given player
* @param player the player to open the interface for
* @param id the ID of the interface to open
*/
@JvmStatic
fun openInterface(player: Player, id: Int) {
player.interfaceManager.open(Component(id))
}
/**
* Runs the given Emote for the given Entity
* @param entity the entity to run the emote on
* @param emote the Emotes enum entry to run
*/
@JvmStatic
fun emote(entity: Entity, emote: Emotes) {
entity.animate(emote.animation)
}
/**
* Sends a message to the given player.
* @param player the player to send the message to.
*/
@JvmStatic
fun sendMessage(player: Player, message: String) {
player.sendMessage(message)
}
/**
* Forces an above-head chat message for the given entity
* @param entity the entity to send the chat for
* @param message the message to display
*/
@JvmStatic
fun sendChat(entity: Entity, message: String) {
entity.sendChat(message)
}
/**
* Sends a message to a player's dialogue box
* @param player the player to send the dialogue to
* @param message the message to send, lines are split automatically.
*/
@JvmStatic
fun sendDialogue(player: Player, message: String) {
player.dialogueInterpreter.sendDialogue(*DialUtils.splitLines(message))
}
/**
* Plays an animation on the entity
* @param entity the entity to animate
* @param anim the animation to play, can be an ID or an Animation object.
* @param forced whether or not to force the animation (usually not necessary)
*/
@JvmStatic
fun <T> animate(entity: Entity, anim: T, forced: Boolean = false) {
val animation = when(anim){
is Int -> Animation(anim)
is Animation -> anim
else -> throw IllegalStateException("Invalid value passed for anim")
}
if (forced) {
entity.animator.forceAnimation(animation)
} else {
entity.animator.animate(animation)
}
}
/**
* Plays the given Audio for the given Entity
* @param player the player to play the audio for
* @param audio the Audio to play
* @param global if other nearby entities should be able to hear it
*/
@JvmStatic
fun playAudio(player: Player, audio: Audio, global: Boolean = false) {
player.audioManager.send(audio, global)
}
/**
* Opens a dialogue with the given dialogue key or dialogue file, depending which is passed.
* @param player the player to open the dialogue for
* @param dialogue either the dialogue key or an instance of a DialogueFile
* @param args various args to pass to the opened dialogue
*/
@JvmStatic
fun openDialogue(player: Player, dialogue: Any, vararg args: Any) {
when (dialogue) {
is Int -> player.dialogueInterpreter.open(dialogue, args)
is DialogueFile -> player.dialogueInterpreter.open(dialogue, args)
else -> SystemLogger.logErr("Invalid object type passed to openDialogue() -> ${dialogue.javaClass.simpleName}")
}
}
/**
* Gets an NPC with the given ID from the repository.
* @param id the ID of the NPC to locate
* @returns an NPC instance matching the ID if it finds one, null otherwise
*/
@JvmStatic
fun findNPC(id: Int): NPC? {
return Repository.findNPC(id)
}
/**
* Gets an NPC within render distance of the refLoc that matches the given ID
* @param refLoc the Location to find the closes NPC to
* @param id the ID of the NPC to locate
* @returns an NPC instance matching the ID if it finds one, null otherwise
*/
@JvmStatic
fun findNPC(refLoc: Location, id: Int): NPC? {
return Repository.npcs.firstOrNull { it.id == id && it.location.withinDistance(refLoc) }
}
/**
* Gets an NPC with the given ID in the same general area as the given Entity
* @param entity the entity to search around
* @param id the ID of the NPC to locate
* @returns an NPC matching the given ID or null if none is found
*/
@JvmStatic
fun findLocalNPC(entity: Entity, id: Int): NPC? {
return RegionManager.getLocalNpcs(entity).firstOrNull { it.id == id }
}
/**
* Gets the value of an attribute key from the Entity's attributes store
* @param entity the entity to get the attribute from
* @param attribute the attribute key to use
* @param default the default value to return if the attribute does not exist
*/
@JvmStatic
fun <T> getAttribute(entity: Entity, attribute: String, default: T): T {
return entity.getAttribute(attribute, default)
}
/**
* Sets an attribute key to the given value in an Entity's attribute store
* @param entity the entity to set the attribute for
* @param attribute the attribute key to use
* @param value the value to set the attribute to
*/
@JvmStatic
fun <T> setAttribute(entity: Entity, attribute: String, value: T) {
entity.setAttribute(attribute, value)
}
/**
* Locks the given entity for the given number of ticks
* @param entity the entity to lock
* @param duration the number of ticks to lock for
*/
@JvmStatic
fun lock(entity: Entity, duration: Int) {
entity.lock(duration)
}
/**
* Locks specifically an entity's interactions, allowing movement still
* @param entity the entity to lock
* @param duration the duration in ticks to lock for
*/
@JvmStatic
fun lockInteractions(entity: Entity, duration: Int) {
entity.locks.lockInteractions(duration)
}
/**
* Unlocks the given entity
* @param entity the entity to unlock
*/
@JvmStatic
fun unlock(entity: Entity) {
entity.unlock()
}
/**
* Transforms an NPC for the given number of ticks
* @param npc the NPC object to transform
* @param transformTo the ID of the NPC to turn into
* @param restoreTicks the number of ticks until the NPC returns to normal
*/
@JvmStatic
fun transformNpc(npc: NPC, transformTo: Int, restoreTicks: Int){
npc.transform(transformTo)
Pulser.submit(object : Pulse(restoreTicks){
override fun pulse(): Boolean {
npc.reTransform()
return true
}
})
}
/**
* Produces a Location object using the given x,y,z values
*/
@JvmStatic
fun location(x: Int, y: Int, z: Int): Location{
return Location.create(x,y,z)
}
/**
* AHeals the given entity for the given number of hitpoints
*/
@JvmStatic
fun heal(entity: Entity, amount: Int){
entity.skills.heal(amount)
}
/**
* Sets the given varbit for the given player
* @param player the player to set the varbit for
* @param varpIndex the index of the VARP that contains the desired varbit.
* @param offset the offset of the desired varbit inside the varp.
* @param value the value to set the varbit to
*/
@JvmStatic
fun setVarbit(player: Player, varpIndex: Int, offset: Int, value: Int){
player.varpManager.get(varpIndex).setVarbit(offset,value).send(player)
}
/**
* Clears all bits for a given varp index
* @param player the player to clear for
* @param varpIndex the index of the varp to clear
*/
@JvmStatic
fun clearVarp(player: Player, varpIndex: Int){
player.varpManager.get(varpIndex).clear()
}
/**
* Gets the value of all bits collected together from a given varp
* @param player the player to get the varp for
* @param varpIndex the index of the varp to calculate the value of
* @return the value of the varp
*/
@JvmStatic
fun getVarpValue(player: Player, varpIndex: Int): Int{
return player.varpManager.get(varpIndex).getValue()
}
/**
* Gets the value of a specific varbit
* @param player the player to get the value for
* @param varpIndex the index of th varp containinig the desired varbit
* @param offset the offset of the varbit inside the varp
* @return the value of the given varbit
*/
@JvmStatic
fun getVarbitValue(player: Player, varpIndex: Int, offset: Int): Int {
return player.varpManager.get(varpIndex).getVarbitValue(offset)
}
/**
* Force an entity to walk to a given destination.
* @param entity the entity to forcewalk
* @param dest the Location object to walk to
* @param type the type of pathfinder to use. "smart" for the SMART pathfinder, anything else for DUMB.
*/
@JvmStatic
fun forceWalk(entity: Entity, dest: Location, type: String){
val pathfinder = when(type){
"smart" -> Pathfinder.SMART
else -> Pathfinder.DUMB
}
val path = Pathfinder.find(entity, dest, true, pathfinder)
path.walk(entity)
}
/**
* Interrupts a given entity's walking queue
* @param entity the entity to interrupt
*/
@JvmStatic
fun stopWalk(entity: Entity){
entity.walkingQueue.reset()
}
/**
* Gets the item in the given equipment slot for the given player
* @param player the player whose equipment to pull from
* @param slot the Equipment slot to use, EquipmentSlot enum contains the options.
* @return the Item in the given slot, or null if none.
*/
@JvmStatic
fun getItemFromEquipment(player: Player, slot: EquipmentSlot): Item? {
return player.equipment.get(slot.ordinal)
}
/**
* Adjusts the charge for the given node.
* @param node the node to adjust the charge of
* @param amount the amount to adjust by
*/
@JvmStatic
fun adjustCharge(node: Node, amount: Int){
when(node){
is Item -> node.charge += amount
is Scenery -> node.charge += amount
else -> SystemLogger.logErr("Attempt to adjust the charge of invalid type: ${node.javaClass.simpleName}")
}
}
/**
* Get the current charge of the given node
* @param node the node whose charge to check
* @return amount of charges the node has, or -1 if the node does not accept charges.
*/
@JvmStatic
fun getCharge(node: Node): Int{
when(node){
is Item -> return node.charge
is Scenery -> return node.charge
else -> SystemLogger.logErr("Attempt to get charge of invalid type: ${node.javaClass.simpleName}").also { return -1 }
}
}
/**
* Set the charge of the given node to the given amount.
* @param node the node to set the charge for
* @param charge the amount to set the node's charge to (default is 1000)
*/
@JvmStatic
fun setCharge(node: Node, charge: Int){
when(node){
is Item -> node.charge = charge
is Scenery -> node.charge = charge
else -> SystemLogger.logErr("Attempt to set the charge of invalid type: ${node.javaClass.simpleName}")
}
}
/**
* Gets the used option in the context of an interaction.
* @param player the player to get the used option for.
* @return the option the player used
*/
@JvmStatic
fun getUsedOption(player: Player): String {
return player.getAttribute("interact:option","INVALID")
}
/**
* Used to play both an Animation and Graphics object simultaneously.
* @param entity the entity to perform this on
* @param anim the Animation object to use, can also be an ID.
* @param gfx the Graphics object to use, can also be an ID.
*/
@JvmStatic
fun <A,G> visualize(entity: Entity, anim: A, gfx: G){
val animation = when(anim){
is Int -> Animation(anim)
is Animation -> anim
else -> throw IllegalStateException("Invalid parameter passed for animation.")
}
val graphics = when(gfx){
is Int -> Graphics(gfx)
is Graphics -> gfx
else -> throw IllegalStateException("Invalid parameter passed for graphics.")
}
entity.visualize(animation,graphics)
}
/**
* Used to submit a pulse to the GameWorld's Pulser.
* @param pulse the Pulse object to submit
*/
@JvmStatic
fun submitWorldPulse(pulse: Pulse){
GameWorld.Pulser.submit(pulse)
}
/**
* Teleports or "instantly moves" an entity to a given Location object.
* @param entity the entity to move
* @param loc the Location object to move them to
* @param type the teleport type to use (defaults to instant). An enum exists as TeleportManager.TeleportType.
*/
@JvmStatic
fun teleport(entity: Entity, loc: Location, type: TeleportManager.TeleportType = TeleportManager.TeleportType.INSTANT){
if(type == TeleportManager.TeleportType.INSTANT) entity.properties.teleportLocation = loc
else entity.teleporter.send(loc,type)
}
/**
* Sets the dynamic or "temporary" (restores) level of a skill.
* @param entity the entity to set the level for
* @param skill the Skill to set. A Skills enum exists that can be used. Ex: Skills.STRENGTH
* @param level the level to set the skill to
*/
@JvmStatic
fun setTempLevel(entity: Entity, skill: Int, level: Int){
entity.skills.setLevel(skill, level)
}
/**
* Gets the static (unchanging/max) level of an entity's skill
* @param entity the entity to get the level for
* @param skill the Skill to get the level of. A Skills enum exists that can be used. Ex: Skills.STRENGTH
* @return the static level of the skill
*/
@JvmStatic
fun getStatLevel(entity: Entity, skill: Int): Int {
return entity.skills.getStaticLevel(skill)
}
/**
* Gets the dynamic (boostable/debuffable/restoring) level of an entity's skill
* @param entity the entity to get the level for
* @param skill the Skill to get the level of. A Skills enum exists that can be used. Ex: Skills.STRENGTH
* @return the dynamic level of the skill
*/
@JvmStatic
fun getDynLevel(entity: Entity, skill: Int): Int {
return entity.skills.getLevel(skill)
}
/**
* Adjusts (buffs/debuffs) the given Skill by the amount given.
* @param entity the entity to adjust the skill for
* @param skill the Skill to adjust. A Skills enum exists that can be used. Ex: Skills.STRENGTH
* @param amount the amount to adjust the skill by. Ex-Buff: 5, Ex-Debuff: -5
*/
@JvmStatic
fun adjustLevel(entity: Entity, skill: Int, amount: Int){
entity.skills.setLevel(skill, entity.skills.getStaticLevel(skill) + amount)
}
/**
* Remove all of a given item from the given container
* @param player the player to remove the item from
* @param item the item to remove. Can be an Item object or an ID.
* @param container the Container to remove the item from. An enum exists for this called Container. Ex: Container.BANK
*/
@JvmStatic
fun <T> removeAll(player: Player, item: T, container: Container){
val it = when(item){
is Item -> item.id
is Int -> item
else -> throw IllegalStateException("Invalid value passed as item")
}
when(container){
Container.EQUIPMENT -> player.equipment.remove(Item(it, amountInEquipment(player, it)))
Container.BANK -> player.bank.remove(Item(it, amountInBank(player, it)))
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 a dialogue that uses the player's chathead.
* @param player the player to send the dialogue to
* @param npc the ID of the NPC to use for the chathead
* @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 sendNPCDialogue(player: Player, npc: Int, msg: String, expr: FacialExpression = FacialExpression.FRIENDLY){
player.dialogueInterpreter.sendDialogues(npc, expr, *DialUtils.splitLines(msg))
}
/**
* 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)
}
/**
* Register a logout listener to a player. Logout listeners are methods that run when a player logs out.
* @param player the player to register the listener for
* @param handler the method to run when the listener is invoked (when the player logs out)
*/
@JvmStatic
fun registerLogoutListener(player: Player, key: String, handler: (p: Player) -> Unit){
player.logoutListeners[key] = handler
}
/**
* Removes a logout listener based on the key from a player
* @param player the player to remove the logout listner from
* @param key the key of the logout listener to remove.
*/
@JvmStatic
fun clearLogoutListener(player: Player, key: String){
player.logoutListeners.remove(key)
}
/**
* Sends an item to a specific child on an interface
* @param player the player to send the packet to
* @param iface the ID of the interface to send the item onto
* @Param child the index of the child on the interface to send the item onto
* @param item the ID of the item to send
* @param amount the amount of the item to send - defaults to 1
*/
@JvmStatic
fun sendItemOnInterface(player: Player, iface: Int, child: Int, item: Int, amount: Int = 1){
player.packetDispatch.sendItemOnInterface(item,amount,iface,child)
}
/**
* Send an input dialogue to retrieve a specified value from the player
* @param player the player to send the input dialogue to
* @param numeric whether or not the input is numeric
* @param prompt what to prompt the player
* @param handler the method that handles the value gained from the input dialogue
*/
@JvmStatic
fun sendInputDialogue(player: Player, numeric: Boolean, prompt: String, handler: (value: Any) -> Unit){
player.dialogueInterpreter.sendInput(!numeric, prompt)
player.setAttribute("runscript",handler) //Handled in RunScriptPacketHandler
}
/**
* Forces an NPC to "flee" from a player or other entity
* @param entity the entity to make flee
* @param from the entity to flee from
*/
@JvmStatic
fun flee(entity: Entity, from: Entity){
lock(entity, 5)
face(entity, from, 5)
val diffX = entity.location.x - from.location.x
val diffY = entity.location.y - from.location.y
forceWalk(entity, entity.location.transform(diffX,diffY,0), "DUMB")
}
/**
* Submits an individual or "weak" pulse to a specific entity's pulse manager. Pulses submitted this way can be overridden by other pulses.
* @param entity the entity to submit the pulse to
* @param pulse the pulse to submit
*/
@JvmStatic
fun submitIndividualPulse(entity: Entity, pulse: Pulse){
entity.pulseManager.run(pulse)
}
/**
* Gets the number of QP a player has
* @param player the player to get the QP for
* @return the number of QP the player has
*/
@JvmStatic
fun getQP(player: Player): Int{
return player.questRepository.points
}
}