diff --git a/Server/src/main/kotlin/api/Commands.kt b/Server/src/main/kotlin/api/Commands.kt index 406350e26..7225c3365 100644 --- a/Server/src/main/kotlin/api/Commands.kt +++ b/Server/src/main/kotlin/api/Commands.kt @@ -41,9 +41,9 @@ interface Commands : ContentInterface { * @param name the name of the command. Example: ::example would be just "example" * @param privilege the rights level needed to execute the command. Options are [Privilege.STANDARD], [Privilege.MODERATOR], [Privilege.ADMIN]. Defaults to [Privilege.STANDARD] */ - fun define(name: String, privilege: Privilege = Privilege.STANDARD, handle: (Player, Array) -> Unit){ - CommandMapping.register(Command(name, privilege, handle)) + fun define(name: String, privilege: Privilege = Privilege.STANDARD, usage: String = "", description: String = "", handle: (Player, Array) -> Unit){ + CommandMapping.register(Command(name, privilege, usage, description, handle)) } fun defineCommands() -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/Command.kt b/Server/src/main/kotlin/rs09/game/system/command/Command.kt index ebf819e47..a029badba 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/Command.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/Command.kt @@ -2,19 +2,19 @@ package rs09.game.system.command import core.game.node.entity.player.Player import rs09.game.world.GameWorld +import kotlin.collections.ArrayList /** * Base class for Commands in the new system. Can pass a lambda as part of the constructor or after the constructor. * @author Ceikry */ -class Command(val name: String, val privilege: Privilege, val handle: (Player, Array) -> Unit) { +class Command(val name: String, val privilege: Privilege, val usage: String = "UNDOCUMENTED", val description: String = "UNDOCUMENTED", val handle: (Player, Array) -> Unit) { fun attemptHandling(player: Player, args: Array?){ args ?: return if(player.rights.ordinal >= privilege.ordinal || GameWorld.settings?.isDevMode == true){ handle(player,args) } } - } object CommandMapping { @@ -35,4 +35,24 @@ object CommandMapping { fun getNames(): Array { return mapping.keys.toTypedArray() } -} \ No newline at end of file + + fun getPageIndices(rights: Int): IntArray { + val list = ArrayList() + list.add(0) + + var lineCounter = 0 + for ((index, command) in getCommands().filter { it.privilege.ordinal <= rights }.withIndex()) { + + lineCounter += 2 + if (command.usage.isNotEmpty()) lineCounter++ + if (command.description.isNotEmpty()) lineCounter++ + + if (lineCounter > 306) { + list.add(index) + lineCounter = 0 + } + } + + return list.toIntArray() + } +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt index 244f6abc1..917414af5 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/AnimationCommandSet.kt @@ -20,7 +20,7 @@ class AnimationCommandSet : CommandSet(Privilege.ADMIN) { /** * Force the player to play animation */ - define("anim"){ player, args -> + define("anim", Privilege.ADMIN, "::anim Animation ID", "Plays the animation with the given ID."){ player, args -> if (args.size < 2) { reject(player, "Syntax error: ::anim ") } @@ -31,7 +31,7 @@ class AnimationCommandSet : CommandSet(Privilege.ADMIN) { /** * Force the player to loop animation */ - define("loopanim"){ player, args -> + define("loopanim", Privilege.ADMIN, "::loopanim Animation ID Times", "Plays the animation with the given ID the given number of times"){ player, args -> if (args.size < 2) { reject(player, "Syntax error: ::loopanim ") } @@ -53,7 +53,7 @@ class AnimationCommandSet : CommandSet(Privilege.ADMIN) { /** * Change the player's render animation to */ - define("ranim"){ player, args -> + define("ranim", Privilege.ADMIN, "::ranim Render Anim ID", "Sets the player's render (walk/idle) animation."){ player, args -> if (args.size < 2) { reject(player, "Syntax error: ::ranim ") } @@ -69,11 +69,11 @@ class AnimationCommandSet : CommandSet(Privilege.ADMIN) { /** * Reset the player's render animation to default */ - define("ranimreset"){ player, _ -> + define("ranimreset", Privilege.ADMIN, "", "Resets the player's render (walk/idle) animation to default."){ player, _ -> player.appearance.prepareBodyData(player) player.appearance.setDefaultAnimations() player.appearance.setAnimations() player.appearance.sync() } } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt index e95d4e6b2..1d53091b3 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt @@ -14,6 +14,11 @@ import rs09.tools.stringtools.colorize @Initializable class BottingCommandSet : CommandSet(Privilege.STANDARD) { override fun defineCommands() { + + if (GameWorld.settings?.enabled_botting != true) { + return + } + define("scripts"){player, _ -> if(GameWorld.settings?.enabled_botting != true){ player.sendChat("I just tried to do something silly!") @@ -69,4 +74,4 @@ class BottingCommandSet : CommandSet(Privilege.STANDARD) { player.interfaceManager.closeOverlay() } } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt index 0aa55e0e1..5e68b2ee1 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/CommandSet.kt @@ -51,7 +51,7 @@ abstract class CommandSet(val defaultPrivilege: Privilege) : Plugin { * @param name the name of the command. Example: ::example would be just "example" * @param privilege (optional) privilege override from the set default. */ - fun define(name: String, privilege: Privilege = defaultPrivilege, handle: (Player, Array) -> Unit){ - CommandMapping.register(Command(name, privilege, handle)) + fun define(name: String, privilege: Privilege = defaultPrivilege, usage: String = "", description: String = "", handle: (Player, Array) -> Unit){ + CommandMapping.register(Command(name, privilege, usage, description, handle)) } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt index 7b9e496f1..6205a86c2 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/ConfigCommandSet.kt @@ -41,7 +41,7 @@ class ConfigCommandSet : CommandSet(Privilege.ADMIN){ /** * Opens an interface component */ - define("iface"){player, args -> + define("iface", Privilege.ADMIN, "::iface Interface ID", "Opens the interface with the given ID."){player, args -> if (args.size < 2) { reject(player, "usage: iface id") return@define @@ -50,4 +50,4 @@ class ConfigCommandSet : CommandSet(Privilege.ADMIN){ player.interfaceManager.openComponent(id as Int) } } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt index 91bf7da96..8f3147c93 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/DevelopmentCommandSet.kt @@ -33,7 +33,7 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { /** * Gives the player a set of tools used to test farming stuff. */ - define("farmkit"){player,_ -> + define("farmkit", Privilege.ADMIN, "", "Provides a kit of various farming equipment."){player,_ -> for(item in farmKitItems){ player.inventory.add(Item(item)) } @@ -51,11 +51,11 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { sendMessage(player, "All achievement diaries cleared successfully.") } - define("region") {player, args -> + define("region", Privilege.STANDARD, "", "Prints your current Region ID.") {player, args -> sendMessage(player, "Region ID: ${player.viewport.region.regionId}") } - define("spellbook"){player, args -> + define("spellbook", Privilege.ADMIN, "::spellbook book ID (0 = MODERN, 1 = ANCIENTS, 2 = LUNARS)", "Swaps your spellbook to the given book ID."){player, args -> if(args.size < 2){ reject(player,"Usage: ::spellbook [int]. 0 = MODERN, 1 = ANCIENTS, 2 = LUNARS") } @@ -64,7 +64,7 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { player.spellBookManager.update(player) } - define("killme") { player, _ -> + define("killme", Privilege.ADMIN, "", "Does exactly what it says on the tin.") { player, _ -> player.impactHandler.manualHit(player, player.skills.lifepoints, HitsplatType.NORMAL) } @@ -82,7 +82,7 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { SystemLogger.logInfo(def.toString()) } - define("dumpstructs") {player, _ -> + define("dumpstructs", Privilege.ADMIN, "", "Dumps all the cache structs to structs.txt") {player, _ -> val dump = File("structs.txt") val writer = BufferedWriter(FileWriter(dump)) val index = Cache.getIndexes()[2] @@ -101,7 +101,7 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { writer.close() } - define("dumpdatamaps") {player, _ -> + define("dumpdatamaps", Privilege.ADMIN, "", "Dumps all the cache data maps to datamaps.txt") {player, _ -> val index = Cache.getIndexes()[17] val containers = index.information.containersIndexes @@ -126,7 +126,7 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { writer.close() } - define("rolldrops") { player: Player, args: Array -> + define("rolldrops", Privilege.ADMIN, "::rolldrops NPC ID AMOUNT", "Rolls the given NPC drop table AMOUNT times.") { player: Player, args: Array -> if(args.size < 2){ reject(player,"Usage: ::rolldrops npcid amount") } @@ -146,9 +146,9 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { container.open(player) } - define("varbits") { player, args -> + define("varbits", Privilege.ADMIN, "::varbits Varp ID", "Lists all the varbits assigned to the given varp.") { player, args -> if(args.size < 2) - reject(player, "Usage: ::list_varbits varpIndex") + reject(player, "Usage: ::varbits varpIndex") val varp = args[1].toIntOrNull() ?: reject(player, "Please use a valid int for the varpIndex.") GlobalScope.launch { diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt index 59a99fc96..aa0f86b90 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/FunCommandSet.kt @@ -29,7 +29,7 @@ class FunCommandSet : CommandSet(Privilege.ADMIN) { /** * Force animation + messages on all NPCs in a radius of 10 from the player. */ - define("npcareaanim") { player, args -> + define("npcareaanim", Privilege.ADMIN, "::npcareaanim Animation ID String") { player, args -> if (args.size < 3) { reject(player, "Syntax error: ::npcareaanim ") } @@ -47,7 +47,7 @@ class FunCommandSet : CommandSet(Privilege.ADMIN) { /** * Transform a player's appearance into that of an NPC. */ - define("pnpc", Privilege.MODERATOR){ player, args -> + define("pnpc", Privilege.MODERATOR, "::pnpc NPC ID", "Transforms the player into the given NPC."){ player, args -> if(args.size < 2){ reject(player, "Usage: ::pnpc ") return@define @@ -66,14 +66,14 @@ class FunCommandSet : CommandSet(Privilege.ADMIN) { /** * Open bank */ - define("bank"){ player, _ -> + define("bank", Privilege.ADMIN, "", "Opens your bank."){ player, _ -> player.getBank().open() } /** * Toggle invisibility */ - define("invis"){ player, _ -> + define("invis", Privilege.ADMIN, "", "Makes you invisible to others."){ player, _ -> player.isInvisible = !player.isInvisible notify(player,"You are now ${if (player.isInvisible) "invisible" else "visible"} to others.") } @@ -82,7 +82,7 @@ class FunCommandSet : CommandSet(Privilege.ADMIN) { /** * Toggle 1-hit kills */ - define("1hit"){ player, _ -> + define("1hit", Privilege.ADMIN, "", "Makes you kill things in 1 hit."){ player, _ -> player.setAttribute("1hko", !player.getAttribute("1hko", false)) notify(player,"1-hit KO mode " + if (player.getAttribute("1hko", false)) "on." else "off.") } @@ -91,7 +91,7 @@ class FunCommandSet : CommandSet(Privilege.ADMIN) { /** * Toggle god mode */ - define("god"){ player, _ -> + define("god", Privilege.ADMIN, "", "Makes you invulnerable to damage."){ player, _ -> player.setAttribute("godMode", !player.getAttribute("godMode", false)) notify(player,"God mode ${if (player.getAttribute("godMode", false)) "enabled." else "disabled."}") } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt index 22ed85969..b4657dff7 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt @@ -45,11 +45,11 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Toggles debug mode */ - define("debug", Privilege.STANDARD){ player, _ -> + define("debug", Privilege.STANDARD, "", "Toggles debug mode."){ player, _ -> player.toggleDebug() } - define("calc_accuracy", Privilege.STANDARD){ player, args -> + define("calc_accuracy", Privilege.STANDARD, "::calc_accuracy NPC ID", "Calculates and prints your current chance to hit a given NPC."){ player, args -> val handler = player.getSwingHandler(false) player.sendMessage("handler type: ${handler.type}") player.sendMessage("calculateAccuracy: ${handler.calculateAccuracy(player)}") @@ -64,7 +64,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ } } - define("movcam", Privilege.ADMIN) {player, args -> + define("movcam", Privilege.ADMIN, "::movcam Region X Region Y [Height Speed]", "Moves the camera to the given region-local coordinates.") {player, args -> val regionX = args[1].toIntOrNull() ?: return@define val regionY = args[2].toIntOrNull() ?: return@define var height = 300 @@ -83,7 +83,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ PlayerCamera(player).panTo(globalLoc.x, globalLoc.y, height, speed) } - define("rotcam", Privilege.ADMIN) {player, args -> + define("rotcam", Privilege.ADMIN, "::rotcam Region X Region Y [Height Speed]", "Rotates the camera to face the given region-local coordinates.") {player, args -> val regionX = args[1].toIntOrNull() ?: return@define val regionY = args[2].toIntOrNull() ?: return@define var height = 300 @@ -109,7 +109,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Prints player's current location */ - define("loc", Privilege.STANDARD){ player, _-> + define("loc", Privilege.STANDARD, "", "Prints quite a lot of information about your current location."){ player, _-> val l = player.location val r = player.viewport.region var obj: Scenery? = null @@ -145,7 +145,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ notify(player, "Do you mean ::loc?") } - define("calcmaxhit", Privilege.STANDARD) { player, _ -> + define("calcmaxhit", Privilege.STANDARD, "", "Calculates and shows you your current max hit.") { player, _ -> val swingHandler = player.getSwingHandler(false) val hit = swingHandler.calculateHit(player, player, 1.0) notify(player, "max hit (${(swingHandler as Object).getClass().getName()}): ${hit}") @@ -155,7 +155,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ * Empty a player's inventory * ADMIN only (for obvious reasons) */ - define("empty"){player,_-> + define("empty", Privilege.ADMIN, "", "Empties your inventory."){player,_-> player.inventory.clear() player.inventory.refresh() } @@ -163,7 +163,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Announces a message in chat (NEWS) */ - define("announce"){_,args -> + define("announce", Privilege.ADMIN, "::announce String", "Sends the given string as a News message."){_,args -> val message = args.slice(1 until args.size).joinToString(" ") Repository.sendNews(message) } @@ -171,7 +171,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Lists the players currently online */ - define("players", Privilege.MODERATOR){ player, _ -> + define("players", Privilege.MODERATOR, "", "Lists the online players."){ player, _ -> val rights = player.rights.ordinal if (player!!.interfaceManager.isOpened && player.interfaceManager.opened.id != Components.QUESTJOURNAL_SCROLL_275 || player.locks.isMovementLocked || player.locks.isTeleportLocked) { reject(player, "Please finish what you're doing first.") @@ -198,14 +198,14 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Opens the credit/voting shop */ - define("shop", Privilege.STANDARD){ player, _ -> + define("shop", Privilege.STANDARD, "", "Opens the credit shop."){ player, _ -> player.interfaceManager.open(Component(Components.CREDIT_SHOP)) } /** * Shows the player a list of currently active GE sell offers */ - define("ge", Privilege.STANDARD) { player, args -> + define("ge", Privilege.STANDARD, "::ge MODE (Modes: buying, selling, search, bots, botsearch)", "Various commands for viewing GE offers.") { player, args -> if(args.size < 2){ reject(player, "Usage: ::ge mode", "Available modes: buying, selling, search, bots, botsearch") } @@ -232,21 +232,64 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * List all commands */ - define("commands"){player,_ -> + define("commands", Privilege.STANDARD, "::commands page", "Lists all the commands (you are here.)"){player, args -> + val page = if (args.size > 1) (args[1].toIntOrNull() ?: 1) - 1 else 0 + var lineid = 11 + var pages = CommandMapping.getPageIndices(player.rights.ordinal) + var end = if (page < (pages.size - 1)) pages[page + 1] else CommandMapping.getCommands().size + + player.interfaceManager.close() + + if (page < 0) { + reject(player, "Usage: ::commands page") + } + for (i in 0..310) { player.packetDispatch.sendString("", Components.QUESTJOURNAL_SCROLL_275, i) } - var lineid = 11 - player.packetDispatch.sendString("Commands",Components.QUESTJOURNAL_SCROLL_275,2) - for(line in CommandMapping.getNames().sorted()) - player.packetDispatch.sendString(line,Components.QUESTJOURNAL_SCROLL_275,lineid++) + + player.packetDispatch.sendString( + "Commands" + if (pages.size > 1) " (${page + 1}/${pages.size})" else "", + Components.QUESTJOURNAL_SCROLL_275, + 2 + ) + + + for(i in pages[page] until end) { + var command = CommandMapping.getCommands()[i] + var title = "${command.name}" + var rights = command.privilege.ordinal + var icon = rights - 1 + + + if (rights > player.rights.ordinal) continue + + if (rights > 0) + title = "() $title" + + player.packetDispatch.sendString(title, Components.QUESTJOURNAL_SCROLL_275, lineid++) + + if (command.usage.isNotEmpty()) + player.packetDispatch.sendString("Usage: ${command.usage}", Components.QUESTJOURNAL_SCROLL_275, lineid++) + + if (command.description.isNotEmpty()) + player.packetDispatch.sendString(command.description, Components.QUESTJOURNAL_SCROLL_275, lineid++) + + player.packetDispatch.sendString("-------------------------------", Components.QUESTJOURNAL_SCROLL_275, lineid++) + + if (lineid > 306) { + player.packetDispatch.sendString("To view the next page, use ::commands ${page + 2}", Components.QUESTJOURNAL_SCROLL_275, lineid) + break + } + + } player.interfaceManager.open(Component(Components.QUESTJOURNAL_SCROLL_275)) } /** * Reply to PMs (also enables tab-to-reply) */ - define("reply", Privilege.STANDARD){ player, _ -> + define("reply", Privilege.STANDARD, "", "Opens a reply prompt to your last DM. Same as pressing tab."){ player, _ -> if(player.interfaceManager.isOpened){ reject(player, "Please finish what you're doing first.") } @@ -266,7 +309,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Max account stats */ - define("max"){player,_ -> + define("max", Privilege.ADMIN, "", "Gives you all 99s."){player,_ -> var index = 0 Skills.SKILL_NAME.forEach { player.skills.setStaticLevel(index,99) @@ -276,7 +319,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.skills.updateCombatLevel() } - define("noobme"){ player,_ -> + define("noobme", Privilege.ADMIN, "", "Sets you back to default stats."){ player,_ -> var index = 0 Skills.SKILL_NAME.forEach { if (index == Skills.HITPOINTS) { @@ -295,7 +338,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ /** * Set a specific skill to a specific level */ - define("setlevel"){player,args -> + define("setlevel", Privilege.ADMIN, "::setlevel SKILL NAME LEVEL", "Sets SKILL NAME to LEVEL."){player,args -> if(args.size < 2) reject(player,"Usage: ::setlevel skillname level") val skillname = args[1] val desiredLevel: Int? = args[2].toIntOrNull() @@ -312,7 +355,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.skills.updateCombatLevel() } - define("completediaries"){player,_ -> + define("completediaries", Privilege.ADMIN, "", "Completes all diaries."){player,_ -> player.achievementDiaryManager.diarys.forEach { for(level in it.taskCompleted.indices){ for(task in it.taskCompleted[level].indices){ @@ -322,7 +365,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ } } - define("log"){player,_ -> + define("log", Privilege.ADMIN){player,_ -> var log: ArrayList? = player.getAttribute("loc-log") log = log ?: ArrayList() val locString = "{${player.location.x},${player.location.y},${player.location.z},1,0}" @@ -350,7 +393,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.setAttribute("loc-log",log) } - define("rolltrawlerloot"){player,args -> + define("rolltrawlerloot", Privilege.ADMIN, "::rolltrawlerloot ROLL COUNT", "Rolls some trawler loot."){player,args -> val rolls = if(args.size < 2){ 100 } else { @@ -359,18 +402,18 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.bank.add(*TrawlerLoot.getLoot(player.skills.getLevel(Skills.FISHING), rolls, false).toTypedArray()) } - define("fillbank"){player,_ -> + define("fillbank", Privilege.ADMIN, "", "Right as it says on the tin."){player,_ -> for(i in 0 until ServerConstants.BANK_SIZE){ player.bank.add(Item(i)) } } - define("emptybank"){player,_ -> + define("emptybank", Privilege.ADMIN, "", "Right as it says on the tin."){player,_ -> player.bank.clear() player.bank.update() } - define("setconfig"){player,args -> + define("setconfig", Privilege.ADMIN, "", "DEPRECATED: Use setvarp or setvarbit."){player,args -> if(args.size < 3){ reject(player,"Syntax: ::setconfig configID value") } @@ -387,7 +430,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ notify(player, "${VarbitDefinition.forObjectID(SceneryDefinition.forId(objectID).varbitID).configId}") } - define("define_varbit"){ player, args -> + define("define_varbit", Privilege.ADMIN, "::define_varbit VARBIT ID", "Prints information about the given varbit."){ player, args -> if(args.size < 2) { reject(player, "Syntax: ::define_varbit varbitId") } @@ -466,7 +509,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ notify(player,"Slayer task tracker is now " + (if(disabled) colorize("%RON") else colorize("%ROFF")) + ".") } - define("setvarbit", Privilege.ADMIN){ + define("setvarbit", Privilege.ADMIN, "::setvarbit VARBIT ID VALUE", ""){ player,args -> if(args.size != 3){ reject(player,"Usage: ::setvarbit varbit value") @@ -481,7 +524,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.varpManager.setVarbit(index!!, value!!) } - define("setvarp", Privilege.ADMIN){ + define("setvarp", Privilege.ADMIN, "::setvarp VARP ID BIT OFFSET VALUE", "Sets the value starting at the BIT OFFSET of the varp."){ player,args -> if(args.size < 4){ reject(player,"Usage: ::setvarp index offset value") @@ -497,7 +540,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.varpManager.get(index!!).setVarbit(offset!!, value!!).send(player) } - define("setvarc", Privilege.ADMIN) { player, args -> + define("setvarc", Privilege.ADMIN, "::setvarc VARC ID VALUE") { player, args -> if(args.size < 3){ reject(player,"Usage: ::setvarc index value") } @@ -511,7 +554,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.packetDispatch.sendVarcUpdate(index!!, value!!) } - define("grow", Privilege.ADMIN){ player, _ -> + define("grow", Privilege.ADMIN, "", "Grows all planted crops by 1 stage."){ player, _ -> val state: FarmingState = player.states.get("farming") as FarmingState? ?: return@define for(patch in state.getPatches()){ @@ -519,7 +562,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ } } - define("finishbins", Privilege.ADMIN){ player, _ -> + define("finishbins", Privilege.ADMIN, "", "Finishes any in-progress compost bins."){ player, _ -> val state: FarmingState = player.states.get("farming") as FarmingState? ?: return@define for(bin in state.getBins()){ @@ -541,12 +584,12 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ player.details.credits += 100 } - define("resetgwdropes", Privilege.STANDARD){ player, _ -> + define("resetgwdropes", Privilege.STANDARD, "", "OLD: Was used for fixing broken data."){ player, _ -> player.varpManager.get(1048).clearBitRange(0,31) player.varpManager.get(1048).send(player) } - define("resetmistag", Privilege.STANDARD){ player, _ -> + define("resetmistag", Privilege.STANDARD, "", "OLD: Was used for fixing broken data."){ player, _ -> player.removeAttribute("mistag-greeted") } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt index fbe793351..7a93125b4 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/ModerationCommandSet.kt @@ -41,7 +41,7 @@ class ModerationCommandSet : CommandSet(Privilege.MODERATOR){ * Ban a player * ============================================================================================================= */ - define("ban", Privilege.ADMIN){ player, args -> + define("ban", Privilege.ADMIN, "::ban USERNAME TIME", "Bans the user. Time format: INTd/s/m/h ex: 30d for 30 days."){ player, args -> val name = args[1] if(!GameWorld.accountStorage.checkUsernameTaken(name)) { reject(player, "Invalid username: $name") @@ -88,7 +88,7 @@ class ModerationCommandSet : CommandSet(Privilege.MODERATOR){ * Mute a player * ============================================================================================================= */ - define("mute", Privilege.MODERATOR){ player, args -> + define("mute", Privilege.MODERATOR, "::mute USERNAME TIME", "Mutes the user. Time format: INTd/s/m/h ex: 30d for 30 days."){ player, args -> val name = args[1] if(!GameWorld.accountStorage.checkUsernameTaken(name)) { reject(player, "Invalid username: $name") @@ -136,7 +136,7 @@ class ModerationCommandSet : CommandSet(Privilege.MODERATOR){ * Jail a player * ============================================================================================================= */ - define("jail"){player,args -> + define("jail", Privilege.MODERATOR, "::jail SECONDS USERNAME", "Sends the player to the jail cells in Varrock."){player,args -> if(args.size < 3) { reject(player,"Usage: ::jail ") } @@ -179,4 +179,4 @@ class ModerationCommandSet : CommandSet(Privilege.MODERATOR){ * ============================================================================================================= */ } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt index b062537aa..df4e776e4 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/SystemCommandSet.kt @@ -40,7 +40,7 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { /** * Allows a player to reset their password */ - define("resetpassword", Privilege.STANDARD) { player, args -> + define("resetpassword", Privilege.STANDARD, "", "WARNING: Case insensitive due to dialogue limitations.") { player, args -> sendInputDialogue(player, InputType.STRING_SHORT, "Enter Current Password:"){value -> val pass = value.toString() SystemLogger.logInfo(pass) @@ -69,7 +69,7 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { /** * Allows an Administrator to reset a password */ - define("setpasswordother", Privilege.ADMIN) { player, args -> + define("setpasswordother", Privilege.ADMIN, "::resetpasswordother USERNAME NEW", "Gives the username password NEW.") { player, args -> if (args.size != 3) { reject(player, "Usage: ::resetpasswordother user new", "WARNING: THIS IS PERMANENT.", "WARNING: PASSWORD CAN NOT CONTAIN SPACES.") } @@ -94,7 +94,7 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { } } - define("giveitem", Privilege.ADMIN) { player, args -> + define("giveitem", Privilege.ADMIN, "::giveitem USERNAME ITEM ID AMOUNT", "Gives the user the amount of the given item.") { player, args -> if (args.size == 3 || args.size == 4) { val victim = Repository.getPlayerByName(args[1]) val itemID = args[2].toIntOrNull() @@ -130,7 +130,7 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { } } - define("removeitem", Privilege.ADMIN) { player, args -> + define("removeitem", Privilege.ADMIN, "::removeitem LOC USERNAME ITEM ID AMOUNT", "LOC = bank,inventory,equipment") { player, args -> if (args.size == 4 || args.size == 5) { val itemLoc = args[1].toLowerCase() val victim = Repository.getPlayerByName(args[2]) @@ -181,7 +181,7 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { } } - define("removeitemall", Privilege.ADMIN) { player, args -> + define("removeitemall", Privilege.ADMIN, "::removeitemall USERNAME ITEM ID", "Removes ALL of a given item from the player.") { player, args -> if (args.size == 3) { val victim = Repository.getPlayerByName(args[1]) val itemID = args[2].toIntOrNull() @@ -229,7 +229,7 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { } } - define("potato") { player, _ -> + define("potato", Privilege.ADMIN, "", "Gives you a rotten potato.") { player, _ -> player.inventory.add(Item(Items.ROTTEN_POTATO_5733)) } @@ -238,4 +238,4 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { } } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt index 29848ba8b..00e000ca6 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/TeleportCommandSet.kt @@ -17,7 +17,7 @@ class TeleportCommandSet : CommandSet(Privilege.ADMIN){ /** * Allows teleporting by location name */ - define("to"){player,args -> + define("to", Privilege.ADMIN, "::to String", "See ServerConstants.TELEPORT_DESTINATIONS"){player,args -> var destination: Location? = null val place = args.slice(1 until args.size).joinToString(" ") for (destinations in ServerConstants.TELEPORT_DESTINATIONS) { @@ -40,7 +40,7 @@ class TeleportCommandSet : CommandSet(Privilege.ADMIN){ /** * Teleport to location using coordinates */ - define("tele"){player,args -> + define("tele", Privilege.ADMIN, "::tele X Y Z OR JAGCOORD", "JAGCOORD is Z_REGIONX_REGIONY_LOCALX_LOCALY"){player,args -> if (args.size == 2 && args[1].contains(",")) { val args2 = args[1].split(",".toRegex()).toTypedArray() val x = args2[1].toInt() shl 6 or args2[3].toInt() @@ -102,7 +102,7 @@ class TeleportCommandSet : CommandSet(Privilege.ADMIN){ /** * Teleport to the first object with the given name in the given regionX regionY */ - define("teleobj"){player, args -> + define("teleobj", Privilege.ADMIN, "::teleobj RX_RY OBJ NAME", "Teleports to the first object with the given name."){player, args -> if(args.size < 3) reject(player, "Usage: regionX_regionY Object Name") var objName = "" for(i in 2 until args.size) objName += (args[i] + if(i + 1 == args.size) "" else " ") @@ -141,7 +141,7 @@ class TeleportCommandSet : CommandSet(Privilege.ADMIN){ /** * Teleport to a specific player */ - define("teleto"){player,args -> + define("teleto", Privilege.ADMIN, "::teleto USERNAME", "Teleports to the named player."){player,args -> if (args.size < 1) { reject(player,"syntax error: name") } @@ -160,7 +160,7 @@ class TeleportCommandSet : CommandSet(Privilege.ADMIN){ /** * Teleport a specific player to you */ - define("teletome"){player,args -> + define("teletome", Privilege.ADMIN, "::teletome USERNAME", "Teleports the given user to you."){player,args -> if (args.size < 1) { reject(player,"syntax error: name") } @@ -179,8 +179,8 @@ class TeleportCommandSet : CommandSet(Privilege.ADMIN){ /** * Teleports to the server's home location */ - define("home"){player,_ -> + define("home", Privilege.ADMIN, "", "Teleports to ServerConstants.HOME_LOCATION"){player,_ -> player.properties.teleportLocation = ServerConstants.HOME_LOCATION } } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/system/config/ConfigParser.kt b/Server/src/main/kotlin/rs09/game/system/config/ConfigParser.kt index b9d49e86d..508c84d4f 100644 --- a/Server/src/main/kotlin/rs09/game/system/config/ConfigParser.kt +++ b/Server/src/main/kotlin/rs09/game/system/config/ConfigParser.kt @@ -1,9 +1,16 @@ package rs09.game.system.config +import api.* + +import rs09.game.world.repository.Repository +import rs09.game.system.command.Privilege +import core.game.world.map.RegionManager +import core.game.node.item.GroundItemManager + import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -class ConfigParser { +class ConfigParser : Commands { fun prePlugin() { NPCConfigParser().load() ItemConfigParser().load() @@ -20,4 +27,32 @@ class ConfigParser { MusicConfigLoader().load() RangedConfigLoader().load() } -} \ No newline at end of file + + fun reloadConfigs(callback: () -> Unit) { + GlobalScope.launch { + Repository.npcs.toTypedArray().forEach { npc -> + npc.isRespawn = false + npc.clear() + Repository.npcs.remove(npc) + Repository.removeRenderableNPC(npc) + } + + GroundItemManager.getItems().toTypedArray().forEach {gi -> + GroundItemManager.getItems().remove(gi) + RegionManager.getRegionPlane(gi.location).remove(gi) + } + + prePlugin() + postPlugin() + + callback.invoke() + } + } + + override fun defineCommands() { + define("reloadjson", Privilege.ADMIN, "", "Reloads all the JSON configs.") { player, _ -> + notify(player, "Reloading JSON...") + reloadConfigs() { notify(player, "JSON reloaded.") } + } + } +}