mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-10 10:20:41 -07:00
Fix ring of forging bug, ported ContentAPI.kt
This commit is contained in:
parent
8086869a3e
commit
8ea95973ab
4 changed files with 787 additions and 0 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
package core.game.node.entity.skill.smithing.smelting;
|
package core.game.node.entity.skill.smithing.smelting;
|
||||||
|
|
||||||
|
import api.ContentAPI;
|
||||||
|
import api.EquipmentSlot;
|
||||||
import core.game.container.impl.EquipmentContainer;
|
import core.game.container.impl.EquipmentContainer;
|
||||||
import org.rs09.consts.Items;
|
import org.rs09.consts.Items;
|
||||||
import core.game.world.map.Location;
|
import core.game.world.map.Location;
|
||||||
|
|
@ -187,6 +189,15 @@ public class SmeltingPulse extends SkillPulse<Item> {
|
||||||
public boolean success(Player player) {
|
public boolean success(Player player) {
|
||||||
if (bar == Bar.IRON && !superHeat) {
|
if (bar == Bar.IRON && !superHeat) {
|
||||||
if (hasForgingRing(player)) {
|
if (hasForgingRing(player)) {
|
||||||
|
Item ring = ContentAPI.getItemFromEquipment(player, EquipmentSlot.RING);
|
||||||
|
if(ring != null){
|
||||||
|
if(ContentAPI.getCharge(ring) == 1000) ContentAPI.setCharge(ring, 140);
|
||||||
|
ContentAPI.adjustCharge(ring, -1);
|
||||||
|
if(ContentAPI.getCharge(ring) == 0){
|
||||||
|
player.getEquipment().remove(ring);
|
||||||
|
ContentAPI.sendMessage(player, "Your ring of forging uses up its last charge and disintegrates.");
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return RandomFunction.getRandom(100) <= (player.getSkills().getLevel(Skills.SMITHING) >= 45 ? 80 : 50);
|
return RandomFunction.getRandom(100) <= (player.getSkills().getLevel(Skills.SMITHING) >= 45 ? 80 : 50);
|
||||||
|
|
|
||||||
705
Server/src/main/kotlin/api/ContentAPI.kt
Normal file
705
Server/src/main/kotlin/api/ContentAPI.kt
Normal file
|
|
@ -0,0 +1,705 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import core.cache.def.impl.ItemDefinition
|
||||||
|
import core.game.component.Component
|
||||||
|
import core.game.node.Node
|
||||||
|
import core.game.node.`object`.GameObject
|
||||||
|
import core.game.node.`object`.ObjectBuilder
|
||||||
|
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.audio.Audio
|
||||||
|
import core.game.node.entity.player.link.emote.Emotes
|
||||||
|
import core.game.node.entity.skill.Skills
|
||||||
|
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 rs09.ServerConstants
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun <T> removeItem(player: Player, item: T): Boolean {
|
||||||
|
item ?: return false
|
||||||
|
when (item) {
|
||||||
|
is Item -> return player.inventory.remove(item)
|
||||||
|
is Int -> return player.inventory.remove(Item(item))
|
||||||
|
else -> SystemLogger.logErr("Attempted to pass a non-item and non-int to removeItem")
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 replaceObject(toReplace: GameObject, with: Int, for_ticks: Int) {
|
||||||
|
if (for_ticks == -1) {
|
||||||
|
ObjectBuilder.replace(toReplace, toReplace.transform(with))
|
||||||
|
} else {
|
||||||
|
ObjectBuilder.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 animateObject(player: Player, obj: GameObject, animationId: Int, global: Boolean = false) {
|
||||||
|
player.packetDispatch.sendObjectAnimation(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
|
||||||
|
* @param forced whether or not to force the animation (usually not necessary)
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun animate(entity: Entity, anim: Animation, forced: Boolean = false) {
|
||||||
|
if (forced) {
|
||||||
|
entity.animator.forceAnimation(anim)
|
||||||
|
} else {
|
||||||
|
entity.animator.animate(anim)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 GameObject -> 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 GameObject -> 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 GameObject -> node.charge = charge
|
||||||
|
else -> SystemLogger.logErr("Attempt to set the charge of invalid type: ${node.javaClass.simpleName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
53
Server/src/main/kotlin/api/DialUtils.kt
Normal file
53
Server/src/main/kotlin/api/DialUtils.kt
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
import rs09.game.system.SystemLogger
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
object DialUtils {
|
||||||
|
|
||||||
|
//Number of chars per line. Line is split at the nearest whole word that doesn't exceed this length. This should remain constant once a perfect value is found
|
||||||
|
const val LINE_SIZE = 52.0
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
/**
|
||||||
|
* Automatically split a single continuous string into multiple comma-separated lines.
|
||||||
|
* Should this not work out for any reason, you should fallback to standard npc and player methods for dialogue.
|
||||||
|
*/
|
||||||
|
fun splitLines(message: String): Array<String>{
|
||||||
|
val chars = message.split("").toTypedArray().size.toDouble()
|
||||||
|
val words = message.split(" ").toTypedArray()
|
||||||
|
val lines = Math.ceil(chars / LINE_SIZE).toInt()
|
||||||
|
|
||||||
|
if(lines > 4){
|
||||||
|
SystemLogger.logErr("INVALID NUM LINES. NUM CHARS: $chars")
|
||||||
|
}
|
||||||
|
|
||||||
|
val messages = ArrayList<String>()
|
||||||
|
|
||||||
|
var index = 0
|
||||||
|
|
||||||
|
for (msg in 0 until lines) {
|
||||||
|
var length = 0
|
||||||
|
val line = StringBuilder()
|
||||||
|
while (length <= LINE_SIZE && !(index == words.size)) {
|
||||||
|
var currentWord = ""
|
||||||
|
try {
|
||||||
|
currentWord = words[index] + if (length + words[index].length + 1 <= LINE_SIZE) " " else ""
|
||||||
|
} catch (e: Exception){
|
||||||
|
SystemLogger.logWarn("INDEX: $index WORDSIZE: ${words.size}")
|
||||||
|
for(word in words.indices){
|
||||||
|
SystemLogger.logErr("Word $word: ${words[word]}")
|
||||||
|
}
|
||||||
|
exitProcess(0)
|
||||||
|
}
|
||||||
|
length += currentWord.length
|
||||||
|
if (length <= LINE_SIZE) {
|
||||||
|
line.append(currentWord)
|
||||||
|
++index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
messages.add(line.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages.toTypedArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
18
Server/src/main/kotlin/api/EquipmentSlot.kt
Normal file
18
Server/src/main/kotlin/api/EquipmentSlot.kt
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
enum class EquipmentSlot {
|
||||||
|
HAT,
|
||||||
|
CAPE,
|
||||||
|
AMULET,
|
||||||
|
WEAPON,
|
||||||
|
CHEST,
|
||||||
|
SHIELD,
|
||||||
|
HIDDEN_1,
|
||||||
|
LEGS,
|
||||||
|
HIDDEN_2,
|
||||||
|
HANDS,
|
||||||
|
FEET,
|
||||||
|
HIDDEN_3,
|
||||||
|
RING,
|
||||||
|
AMMO
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue