diff --git a/Server/data/configs/interface_configs.json b/Server/data/configs/interface_configs.json index bb3d2219d..e255f7175 100644 --- a/Server/data/configs/interface_configs.json +++ b/Server/data/configs/interface_configs.json @@ -197,6 +197,12 @@ "walkable": "true", "tabIndex": "6" }, + { + "id": "195", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "198", "interfaceType": "1", diff --git a/Server/pom.xml b/Server/pom.xml index 6940b1ddf..ea1af300b 100644 --- a/Server/pom.xml +++ b/Server/pom.xml @@ -16,7 +16,7 @@ org.jetbrains.kotlin - kotlin-stdlib-jdk8 + kotlin-stdlib ${kotlin.version} compile diff --git a/Server/src/main/content/data/tables/AllotmentSeedDropTable.java b/Server/src/main/content/data/tables/AllotmentSeedDropTable.java index 4523be955..01b6f3f17 100644 --- a/Server/src/main/content/data/tables/AllotmentSeedDropTable.java +++ b/Server/src/main/content/data/tables/AllotmentSeedDropTable.java @@ -3,13 +3,13 @@ package content.data.tables; import core.api.StartupListener; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; +import core.tools.Log; import core.tools.RandomFunction; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import core.ServerConstants; -import core.tools.SystemLogger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -18,7 +18,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static core.tools.SystemLogger.logInfo; +import static core.api.ContentAPIKt.log; /** * Handles the allotment seed drop table. @@ -57,11 +57,11 @@ public final class AllotmentSeedDropTable implements StartupListener { @Override public void startup() { if(ServerConstants.ASDT_DATA_PATH != null && !new File(ServerConstants.ASDT_DATA_PATH).exists()){ - SystemLogger.logErr(this.getClass(), "Can't locate ASDT file at " + ServerConstants.ASDT_DATA_PATH); + log(this.getClass(), Log.ERR, "Can't locate ASDT file at " + ServerConstants.ASDT_DATA_PATH); return; } parse(ServerConstants.ASDT_DATA_PATH); - logInfo(this.getClass(), "Initialized Allotment Seed Drop Table from " + ServerConstants.ASDT_DATA_PATH); + log(this.getClass(), Log.FINE, "Initialized Allotment Seed Drop Table from " + ServerConstants.ASDT_DATA_PATH); } /** diff --git a/Server/src/main/content/data/tables/CELEMinorTable.java b/Server/src/main/content/data/tables/CELEMinorTable.java index bb19629f7..13313bc59 100644 --- a/Server/src/main/content/data/tables/CELEMinorTable.java +++ b/Server/src/main/content/data/tables/CELEMinorTable.java @@ -4,7 +4,7 @@ import core.api.StartupListener; import core.ServerConstants; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; -import core.tools.SystemLogger; +import core.tools.Log; import core.tools.RandomFunction; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -18,7 +18,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static core.tools.SystemLogger.logInfo; +import static core.api.ContentAPIKt.log; /** * Handles the Chaos Elemental's minor drop table. It is supposed to roll this table alongside its standard major drops on the main table. @@ -57,11 +57,11 @@ public final class CELEMinorTable implements StartupListener { @Override public void startup() { if(ServerConstants.CELEDT_DATA_PATH != null && !new File(ServerConstants.CELEDT_DATA_PATH).exists()){ - SystemLogger.logErr(this.getClass(), "Can't locate CELEDT file at " + ServerConstants.CELEDT_DATA_PATH); + log(this.getClass(), Log.ERR, "Can't locate CELEDT file at " + ServerConstants.CELEDT_DATA_PATH); return; } parse(ServerConstants.CELEDT_DATA_PATH); - logInfo(this.getClass(), "Loaded up Chaos Elemental drop table from " + ServerConstants.CELEDT_DATA_PATH); + log(this.getClass(), Log.FINE, "Loaded up Chaos Elemental drop table from " + ServerConstants.CELEDT_DATA_PATH); } /** diff --git a/Server/src/main/content/data/tables/GemDropTable.java b/Server/src/main/content/data/tables/GemDropTable.java index 8ec051d64..e9b486d28 100644 --- a/Server/src/main/content/data/tables/GemDropTable.java +++ b/Server/src/main/content/data/tables/GemDropTable.java @@ -3,13 +3,13 @@ package content.data.tables; import core.api.StartupListener; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; +import core.tools.Log; import core.tools.RandomFunction; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import core.ServerConstants; -import core.tools.SystemLogger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -18,7 +18,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static core.tools.SystemLogger.logInfo; +import static core.api.ContentAPIKt.log; /** * Handles the gem drop table. @@ -57,11 +57,11 @@ public final class GemDropTable implements StartupListener { @Override public void startup() { if(ServerConstants.GDT_DATA_PATH != null && !new File(ServerConstants.GDT_DATA_PATH).exists()){ - SystemLogger.logErr(this.getClass(), "Can't locate GDT file at " + ServerConstants.GDT_DATA_PATH); + log(this.getClass(), Log.ERR, "Can't locate GDT file at " + ServerConstants.GDT_DATA_PATH); return; } parse(ServerConstants.GDT_DATA_PATH); - logInfo(this.getClass(), "Initialized Gem Drop Table from " + ServerConstants.GDT_DATA_PATH); + log(this.getClass(), Log.FINE, "Initialized Gem Drop Table from " + ServerConstants.GDT_DATA_PATH); } /** diff --git a/Server/src/main/content/data/tables/HerbDropTable.java b/Server/src/main/content/data/tables/HerbDropTable.java index 063444231..efd03da2b 100644 --- a/Server/src/main/content/data/tables/HerbDropTable.java +++ b/Server/src/main/content/data/tables/HerbDropTable.java @@ -3,13 +3,13 @@ package content.data.tables; import core.api.StartupListener; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; +import core.tools.Log; import core.tools.RandomFunction; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import core.ServerConstants; -import core.tools.SystemLogger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -18,7 +18,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static core.tools.SystemLogger.logInfo; +import static core.api.ContentAPIKt.log; /** * Handles the herb drop table. @@ -57,11 +57,11 @@ public final class HerbDropTable implements StartupListener { @Override public void startup() { if(ServerConstants.HDT_DATA_PATH != null && !new File(ServerConstants.HDT_DATA_PATH).exists()){ - SystemLogger.logErr(this.getClass(), "Can't locate HDT file at " + ServerConstants.HDT_DATA_PATH); + log(this.getClass(), Log.ERR, "Can't locate HDT file at " + ServerConstants.HDT_DATA_PATH); return; } parse(ServerConstants.HDT_DATA_PATH); - logInfo(this.getClass(), "Initialized Herb Drop Table from " + ServerConstants.HDT_DATA_PATH); + log(this.getClass(), Log.FINE, "Initialized Herb Drop Table from " + ServerConstants.HDT_DATA_PATH); } /** diff --git a/Server/src/main/content/data/tables/RareDropTable.kt b/Server/src/main/content/data/tables/RareDropTable.kt index 6df2cc19e..253fc529a 100644 --- a/Server/src/main/content/data/tables/RareDropTable.kt +++ b/Server/src/main/content/data/tables/RareDropTable.kt @@ -2,15 +2,15 @@ package content.data.tables import core.ServerConstants import core.api.StartupListener +import core.api.log import core.api.shouldRemoveNothings import core.api.utils.WeightBasedTable import core.api.utils.WeightedItem import core.game.node.entity.Entity import core.game.node.entity.player.Player import core.game.node.item.Item +import core.tools.Log import core.tools.RandomFunction -import core.tools.SystemLogger.logErr -import core.tools.SystemLogger.logInfo import org.rs09.consts.Items import org.w3c.dom.Element import org.w3c.dom.Node @@ -26,11 +26,11 @@ import javax.xml.parsers.ParserConfigurationException class RareDropTable : StartupListener { override fun startup() { if (ServerConstants.RDT_DATA_PATH != null && !File(ServerConstants.RDT_DATA_PATH).exists()) { - logErr(this.javaClass, "Can't locate RDT file at " + ServerConstants.RDT_DATA_PATH) + log(this::class.java, Log.ERR, "Can't locate RDT file at " + ServerConstants.RDT_DATA_PATH) return } parse(ServerConstants.RDT_DATA_PATH) - logInfo(this.javaClass, "Initialized Rare Drop Table from " + ServerConstants.RDT_DATA_PATH) + log(this::class.java, Log.FINE, "Initialized Rare Drop Table from " + ServerConstants.RDT_DATA_PATH) } companion object { diff --git a/Server/src/main/content/data/tables/RareSeedDropTable.java b/Server/src/main/content/data/tables/RareSeedDropTable.java index 39c83efe1..0b892270d 100644 --- a/Server/src/main/content/data/tables/RareSeedDropTable.java +++ b/Server/src/main/content/data/tables/RareSeedDropTable.java @@ -3,13 +3,13 @@ package content.data.tables; import core.api.StartupListener; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; +import core.tools.Log; import core.tools.RandomFunction; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import core.ServerConstants; -import core.tools.SystemLogger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -18,7 +18,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static core.tools.SystemLogger.logInfo; +import static core.api.ContentAPIKt.log; /** * Handles the rare seed drop table. @@ -57,11 +57,11 @@ public final class RareSeedDropTable implements StartupListener { @Override public void startup() { if(ServerConstants.RSDT_DATA_PATH != null && !new File(ServerConstants.RSDT_DATA_PATH).exists()){ - SystemLogger.logErr(this.getClass(), "Can't locate RSDT file at " + ServerConstants.RSDT_DATA_PATH); + log(this.getClass(), Log.ERR, "Can't locate RSDT file at " + ServerConstants.RSDT_DATA_PATH); return; } parse(ServerConstants.RSDT_DATA_PATH); - logInfo(this.getClass(), "Initialized Rare Seed Drop Table from " + ServerConstants.RSDT_DATA_PATH); + log(this.getClass(), Log.FINE, "Initialized Rare Seed Drop Table from " + ServerConstants.RSDT_DATA_PATH); } /** diff --git a/Server/src/main/content/data/tables/UncommonSeedDropTable.java b/Server/src/main/content/data/tables/UncommonSeedDropTable.java index cf4537ece..1c76ca555 100644 --- a/Server/src/main/content/data/tables/UncommonSeedDropTable.java +++ b/Server/src/main/content/data/tables/UncommonSeedDropTable.java @@ -3,13 +3,13 @@ package content.data.tables; import core.api.StartupListener; import core.game.node.item.Item; import core.game.node.item.WeightedChanceItem; +import core.tools.Log; import core.tools.RandomFunction; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import core.ServerConstants; -import core.tools.SystemLogger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -18,7 +18,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import static core.tools.SystemLogger.logInfo; +import static core.api.ContentAPIKt.log; /** * Handles the uncommon seed drop table. @@ -57,11 +57,11 @@ public final class UncommonSeedDropTable implements StartupListener { @Override public void startup() { if(ServerConstants.USDT_DATA_PATH != null && !new File(ServerConstants.USDT_DATA_PATH).exists()){ - SystemLogger.logErr(this.getClass(), "Can't locate USDT file at " + ServerConstants.USDT_DATA_PATH); + log(this.getClass(), Log.ERR, "Can't locate USDT file at " + ServerConstants.USDT_DATA_PATH); return; } parse(ServerConstants.USDT_DATA_PATH); - logInfo(this.getClass(), "Initialized Uncommon Seed Drop Table from " + ServerConstants.USDT_DATA_PATH); + log(this.getClass(), Log.FINE, "Initialized Uncommon Seed Drop Table from " + ServerConstants.USDT_DATA_PATH); } /** diff --git a/Server/src/main/content/global/activity/penguinhns/LarryHandler.kt b/Server/src/main/content/global/activity/penguinhns/LarryHandler.kt index 842e85e83..4a4b3ba90 100644 --- a/Server/src/main/content/global/activity/penguinhns/LarryHandler.kt +++ b/Server/src/main/content/global/activity/penguinhns/LarryHandler.kt @@ -74,7 +74,7 @@ class LarryHandler(player: Player? = null) : core.game.dialogue.DialoguePlugin(p } val level = getStatLevel(player, skill) - System.out.println("Level: $level") + val expGained = points?.toDouble()?.times((level * 25)) System.out.print("exp: $expGained") player.skills.addExperience(skill,expGained!!) diff --git a/Server/src/main/content/global/activity/penguinhns/PenguinHNSEvent.kt b/Server/src/main/content/global/activity/penguinhns/PenguinHNSEvent.kt index a06fc625c..cac22bcd8 100644 --- a/Server/src/main/content/global/activity/penguinhns/PenguinHNSEvent.kt +++ b/Server/src/main/content/global/activity/penguinhns/PenguinHNSEvent.kt @@ -3,10 +3,12 @@ package content.global.activity.penguinhns import org.json.simple.JSONObject import core.ServerStore import core.api.StartupListener +import core.api.log import core.game.worldevents.PluginSet import core.game.worldevents.WorldEvent import core.game.world.GameWorld import core.plugin.ClassScanner +import core.tools.Log import core.tools.SystemLogger class PenguinHNSEvent : StartupListener { @@ -15,7 +17,7 @@ class PenguinHNSEvent : StartupListener { override fun startup() { manager.rebuildVars() ClassScanner.definePlugins(LarryHandler(), NotebookHandler()) - SystemLogger.logInfo(this::class.java, "Penguin HNS initialized.") + log(this::class.java, Log.FINE, "Penguin HNS initialized.") } companion object { diff --git a/Server/src/main/content/global/activity/penguinhns/PenguinManager.kt b/Server/src/main/content/global/activity/penguinhns/PenguinManager.kt index 51cdcdecc..c284214a7 100644 --- a/Server/src/main/content/global/activity/penguinhns/PenguinManager.kt +++ b/Server/src/main/content/global/activity/penguinhns/PenguinManager.kt @@ -7,6 +7,8 @@ import core.game.world.map.Location import org.json.simple.JSONArray import org.json.simple.JSONObject import core.ServerStore.Companion.toJSONArray +import core.api.log +import core.tools.Log import java.util.* class PenguinManager{ @@ -31,7 +33,7 @@ class PenguinManager{ private fun updateStoreFile(){ val jsonTags = JSONArray() tagMapping.filter { it.value.isNotEmpty() }.forEach { (ordinal,taggers) -> - SystemLogger.logInfo(this::class.java, "$ordinal - ${taggers.first()}") + log(this::class.java, Log.FINE, "$ordinal - ${taggers.first()}") val tag = JSONObject() tag["ordinal"] = ordinal tag["taggers"] = taggers @@ -64,8 +66,4 @@ class PenguinManager{ penguins = spawnedOrdinals.toMutableList() } } - - fun log(message: String){ - SystemLogger.logInfo(this::class.java, "[Penguins] $message") - } } \ No newline at end of file diff --git a/Server/src/main/content/global/activity/shootingstar/ShootingStarPlugin.kt b/Server/src/main/content/global/activity/shootingstar/ShootingStarPlugin.kt index fb8e1df9f..f1ce9d3ff 100644 --- a/Server/src/main/content/global/activity/shootingstar/ShootingStarPlugin.kt +++ b/Server/src/main/content/global/activity/shootingstar/ShootingStarPlugin.kt @@ -15,6 +15,7 @@ import core.game.interaction.IntType import core.tools.SystemLogger import core.game.system.command.Privilege import core.game.world.GameWorld +import core.tools.Log import core.tools.secondsToTicks class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Commands, StartupListener { @@ -112,7 +113,7 @@ class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Com } override fun startup() { - SystemLogger.logInfo(this::class.java, "Shooting Stars initialized.") + log(this::class.java, Log.FINE, "Shooting Stars initialized.") } private data class ScoreboardEntry(val player: String, val time: Int) diff --git a/Server/src/main/content/global/activity/ttrail/ClueScrollPlugin.java b/Server/src/main/content/global/activity/ttrail/ClueScrollPlugin.java index 5eeedb3c7..13efad3c6 100644 --- a/Server/src/main/content/global/activity/ttrail/ClueScrollPlugin.java +++ b/Server/src/main/content/global/activity/ttrail/ClueScrollPlugin.java @@ -3,6 +3,7 @@ package content.global.activity.ttrail; import core.game.component.Component; import core.game.node.entity.player.Player; import core.game.node.item.Item; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.map.zone.MapZone; import core.game.world.map.zone.ZoneBorders; @@ -15,6 +16,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Represents a clue scroll plugin. * @author Vexia @@ -138,7 +141,7 @@ public abstract class ClueScrollPlugin extends MapZone implements Plugin if(clue.getClueId() == 2681) return; if (CLUE_SCROLLS.containsKey(clue.getClueId())) { - SystemLogger.logErr(this.getClass(), "Error! Plugin already registered with clue id - " + clue.getClueId() + ", trying to register " + clue.getClass().getCanonicalName() + " the real plugin using the id is " + CLUE_SCROLLS.get(clue.getClueId()).getClass().getCanonicalName() + "!"); + log(this.getClass(), Log.ERR, "Error! Plugin already registered with clue id - " + clue.getClueId() + ", trying to register " + clue.getClass().getCanonicalName() + " the real plugin using the id is " + CLUE_SCROLLS.get(clue.getClueId()).getClass().getCanonicalName() + "!"); return; } List organized = (List) ORGANIZED.get(clue.getLevel()); @@ -169,7 +172,7 @@ public abstract class ClueScrollPlugin extends MapZone implements Plugin public static Item getClue(ClueLevel clueLevel) { List clues = ORGANIZED.get(clueLevel); if (clues == null) { - SystemLogger.logErr(ClueScrollPlugin.class, "Error! There are no clues for level " + clueLevel + "!"); + log(ClueScrollPlugin.class, Log.ERR, "Error! There are no clues for level " + clueLevel + "!"); return null; } ClueScrollPlugin clue = clues.get(RandomFunction.random(clues.size())); diff --git a/Server/src/main/content/global/ame/RandomEventManager.kt b/Server/src/main/content/global/ame/RandomEventManager.kt index 24cb490ee..5b37e039a 100644 --- a/Server/src/main/content/global/ame/RandomEventManager.kt +++ b/Server/src/main/content/global/ame/RandomEventManager.kt @@ -1,20 +1,17 @@ package content.global.ame -import core.api.Commands -import core.api.LoginListener +import core.api.* import core.game.event.EventHook import core.game.event.TickEvent -import core.api.getAttribute -import core.api.setAttribute import core.game.node.entity.Entity import core.game.node.entity.player.Player import core.game.world.map.zone.ZoneRestriction import core.tools.RandomFunction -import core.api.Event import core.tools.SystemLogger import core.game.system.command.Privilege import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import kotlin.random.Random class RandomEventManager(val player: Player? = null) : LoginListener, EventHook, Commands { @@ -30,7 +27,6 @@ class RandomEventManager(val player: Player? = null) : LoginListener, EventHook< setAttribute(player, "random-manager", instance) instance.rollNextSpawn() instance.enabled = true - SystemLogger.logRE("Initialized REManager for ${player.username}.") } override fun process(entity: Entity, event: TickEvent) { @@ -62,12 +58,12 @@ class RandomEventManager(val player: Player? = null) : LoginListener, EventHook< event = ame.npc.create(player,ame.loot,ame.type) if (event!!.spawnLocation == null) { nextSpawn = GameWorld.ticks + 3000 - SystemLogger.logWarn(this::class.java, "Tried to spawn random event for ${player.username} but spawn location was null!") + log(this::class.java, Log.WARN, "Tried to spawn random event for ${player.username} but spawn location was null!") return } event!!.init() rollNextSpawn() - SystemLogger.logRE("Fired ${event!!.name} for ${player.username}") + log(this::class.java, Log.FINE, "Fired ${event!!.name} for ${player.username}") } private fun rollNextSpawn() { diff --git a/Server/src/main/content/global/handlers/iface/ExperienceInterface.kt b/Server/src/main/content/global/handlers/iface/ExperienceInterface.kt index 9e93c3cef..7dd933efa 100644 --- a/Server/src/main/content/global/handlers/iface/ExperienceInterface.kt +++ b/Server/src/main/content/global/handlers/iface/ExperienceInterface.kt @@ -9,6 +9,7 @@ import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.skill.Skills import core.plugin.Initializable import core.plugin.Plugin +import core.tools.Log import core.tools.SystemLogger /** @@ -70,7 +71,7 @@ class ExperienceInterface() : ComponentPlugin() { 46 -> Skills.WOODCUTTING 40 -> Skills.FLETCHING 51 -> Skills.CONSTRUCTION - else -> Skills.SLAYER.also { SystemLogger.logWarn(this::class.java, "EXP_INTERFACE: Invalid SKILL CHOICE BUTTON: $button") } + else -> Skills.SLAYER.also { log(this::class.java, Log.WARN, "EXP_INTERFACE: Invalid SKILL CHOICE BUTTON: $button") } } player.setAttribute("exp_interface:skill",skill) } diff --git a/Server/src/main/content/global/handlers/iface/QuestTabInterface.java b/Server/src/main/content/global/handlers/iface/QuestTabInterface.java index 313e98b30..82839f982 100644 --- a/Server/src/main/content/global/handlers/iface/QuestTabInterface.java +++ b/Server/src/main/content/global/handlers/iface/QuestTabInterface.java @@ -41,7 +41,7 @@ public class QuestTabInterface extends ComponentPlugin { break; default: // if (GameWorld.isEconomyWorld()) { - //System.out.println("Quest button: " + button); + Quest quest = p.getQuestRepository().forButtonId(button); if (quest != null) { p.getInterfaceManager().open(new Component(275)); diff --git a/Server/src/main/content/global/handlers/iface/ShoppingPlugin.java b/Server/src/main/content/global/handlers/iface/ShoppingPlugin.java index 6f05c691f..175f20f33 100644 --- a/Server/src/main/content/global/handlers/iface/ShoppingPlugin.java +++ b/Server/src/main/content/global/handlers/iface/ShoppingPlugin.java @@ -51,7 +51,7 @@ public final class ShoppingPlugin extends ComponentPlugin { return true; } if (viewer == null) { - System.out.println("shop is null"); + return true; } final Container container = button == 0 ? player.getInventory() : viewer.getShop().getContainer(viewer.getTabIndex()); diff --git a/Server/src/main/content/global/handlers/iface/WorldMapInterface.java b/Server/src/main/content/global/handlers/iface/WorldMapInterface.java index 756600db3..113c28bfa 100644 --- a/Server/src/main/content/global/handlers/iface/WorldMapInterface.java +++ b/Server/src/main/content/global/handlers/iface/WorldMapInterface.java @@ -31,7 +31,7 @@ public final class WorldMapInterface extends ComponentPlugin { player.updateSceneGraph(true); return true; default: - //SystemLogger.logErr(this.getClass(), "World map: buttonid: " + button + ", opcode: " + opcode + ", slot: " + slot); + //log(this.getClass(), Log.ERR, "World map: buttonid: " + button + ", opcode: " + opcode + ", slot: " + slot); return true; } } diff --git a/Server/src/main/content/global/handlers/iface/ge/StockMarket.kt b/Server/src/main/content/global/handlers/iface/ge/StockMarket.kt index c952e9086..4f16d3453 100644 --- a/Server/src/main/content/global/handlers/iface/ge/StockMarket.kt +++ b/Server/src/main/content/global/handlers/iface/ge/StockMarket.kt @@ -17,6 +17,7 @@ import core.game.ge.GrandExchangeOffer import core.game.ge.GrandExchangeRecords import core.game.ge.PriceIndex import core.game.interaction.InterfaceListener +import core.tools.Log import core.tools.SystemLogger /** @@ -199,7 +200,7 @@ class StockMarket : InterfaceListener { { if(offer == null) { - SystemLogger.logWarn(this::class.java, "Opened offer was null and was attempted to be aborted!") + log(this::class.java, Log.WARN, "Opened offer was null and was attempted to be aborted!") return } sendMessage(player, "Abort request acknowledged. Please be aware that your offer may") @@ -207,7 +208,7 @@ class StockMarket : InterfaceListener { if(!offer.isActive) { - SystemLogger.logWarn(this::class.java, "Offer ${offer.uid}[${offer.index}]: ${if(offer.sell) "s" else "b"} ${offer.itemID}x ${offer.amount} was NO LONGER active when abort attempted") + log(this::class.java, Log.WARN, "Offer ${offer.uid}[${offer.index}]: ${if(offer.sell) "s" else "b"} ${offer.itemID}x ${offer.amount} was NO LONGER active when abort attempted") return } offer.offerState = OfferState.ABORTED @@ -341,7 +342,7 @@ class StockMarket : InterfaceListener { val item = offer.withdraw[index] if(item == null) { - SystemLogger.logWarn(this::class.java, "Offer withdraw[$index] is null!") + log(this::class.java, Log.WARN, "Offer withdraw[$index] is null!") return } diff --git a/Server/src/main/content/global/handlers/item/EnchantJewelleryTabOption.kt b/Server/src/main/content/global/handlers/item/EnchantJewelleryTabOption.kt index 987b32a5c..2627555bd 100644 --- a/Server/src/main/content/global/handlers/item/EnchantJewelleryTabOption.kt +++ b/Server/src/main/content/global/handlers/item/EnchantJewelleryTabOption.kt @@ -1,5 +1,6 @@ package content.global.handlers.item +import core.api.log import core.cache.def.impl.ItemDefinition import core.game.interaction.OptionHandler import core.game.node.Node @@ -8,6 +9,7 @@ import core.game.node.item.Item import core.game.world.update.flag.context.Animation import core.plugin.Initializable import core.plugin.Plugin +import core.tools.Log import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.rs09.consts.Items @@ -63,7 +65,7 @@ class EnchantJewelleryTabOption : OptionHandler(){ } if(items == null){ - SystemLogger.logWarn(this::class.java, "UNHANDLED ENCHANT ITEM TABLET [ID: ${node?.id}") + log(this::class.java, Log.WARN, "UNHANDLED ENCHANT ITEM TABLET [ID: ${node?.id}") return true } diff --git a/Server/src/main/content/global/skill/agility/shortcuts/RopeSwing.java b/Server/src/main/content/global/skill/agility/shortcuts/RopeSwing.java index b43424d25..e6853fe0c 100644 --- a/Server/src/main/content/global/skill/agility/shortcuts/RopeSwing.java +++ b/Server/src/main/content/global/skill/agility/shortcuts/RopeSwing.java @@ -14,7 +14,7 @@ import content.global.skill.agility.AgilityHandler; public class RopeSwing extends UseWithHandler { @Override public boolean handle(NodeUsageEvent event) { - System.out.println("Trying to handle."); + if(event.getUsedWith() instanceof Scenery){ Scenery object = event.getUsedWith().asScenery(); int objId = object.getId(); diff --git a/Server/src/main/content/global/skill/construction/BuildOptionPlugin.java b/Server/src/main/content/global/skill/construction/BuildOptionPlugin.java index 6ce643e9a..3fb866ea6 100644 --- a/Server/src/main/content/global/skill/construction/BuildOptionPlugin.java +++ b/Server/src/main/content/global/skill/construction/BuildOptionPlugin.java @@ -11,9 +11,12 @@ import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; import core.plugin.Initializable; import core.plugin.Plugin; +import core.tools.Log; import core.tools.SystemLogger; import core.plugin.ClassScanner; +import static core.api.ContentAPIKt.log; + /** * The build option handling plugin. * @author Emperor @@ -63,8 +66,8 @@ public final class BuildOptionPlugin extends OptionHandler { } Hotspot hotspot = player.getHouseManager().getHotspot(object); if (hotspot == null || !isBuildable(player, object, hotspot)) { - System.out.println(hotspot == null); - SystemLogger.logErr(this.getClass(), "Construction (building): " + hotspot + " : " + object + " chunkX = " + object.getLocation().getChunkX() + ", chunkY = " + object.getLocation().getChunkY()); + + log(this.getClass(), Log.ERR, "Construction (building): " + hotspot + " : " + object + " chunkX = " + object.getLocation().getChunkX() + ", chunkY = " + object.getLocation().getChunkY()); return true; } diff --git a/Server/src/main/content/global/skill/construction/BuildingUtils.java b/Server/src/main/content/global/skill/construction/BuildingUtils.java index 6f4fe295e..f13dece98 100644 --- a/Server/src/main/content/global/skill/construction/BuildingUtils.java +++ b/Server/src/main/content/global/skill/construction/BuildingUtils.java @@ -16,12 +16,15 @@ import core.game.world.update.flag.context.Animation; import core.net.packet.PacketRepository; import core.net.packet.context.ContainerContext; import core.net.packet.out.ContainerPacket; +import core.tools.Log; import org.jetbrains.annotations.NotNull; import core.tools.SystemLogger; import java.util.ArrayList; import java.util.Arrays; +import static core.api.ContentAPIKt.log; + /** * Utility class for building. * @author Emperor @@ -135,7 +138,7 @@ public final class BuildingUtils { player.getPacketDispatch().sendString("Level " + decoration.getLevel(), 396, 140 + menuIndex); //player.getPacketDispatch().sendItemZoomOnInterface(items[i].protocol(), 50000, 396, 49 + i); } - System.out.println(c261Value); + player.getConfigManager().set(261, c261Value); PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 8, items, false)); } @@ -287,7 +290,7 @@ public final class BuildingUtils { } } } else { - SystemLogger.logErr(BuildingUtils.class, "Couldn't find stairs! " + plane); + log(BuildingUtils.class, Log.ERR, "Couldn't find stairs! " + plane); } } } @@ -407,7 +410,7 @@ public final class BuildingUtils { } } } else { - SystemLogger.logErr(BuildingUtils.class, "Couldn't find stairs! " + plane); + log(BuildingUtils.class, Log.ERR, "Couldn't find stairs! " + plane); } } } @@ -549,7 +552,7 @@ public final class BuildingUtils { } } //(0=east, 1=south, 2=west, 3=north). - // System.out.println("Roof information: index=" + index + ", exit count=" + count + "; array=" + Arrays.toString(exits)); + if (count == 4) { room = Room.create(player, RoomProperties.ROOF_4_EXIT); } diff --git a/Server/src/main/content/global/skill/construction/ConstructionInterface.java b/Server/src/main/content/global/skill/construction/ConstructionInterface.java index e0dfe1c89..a36b0329b 100644 --- a/Server/src/main/content/global/skill/construction/ConstructionInterface.java +++ b/Server/src/main/content/global/skill/construction/ConstructionInterface.java @@ -10,8 +10,11 @@ import core.game.node.entity.skill.Skills; import core.game.node.scenery.Scenery; import core.plugin.Initializable; import core.plugin.Plugin; +import core.tools.Log; import core.tools.SystemLogger; +import static core.api.ContentAPIKt.log; + /** * Handles the creating of a decoration object. * @author Emperor @@ -38,12 +41,12 @@ public final class ConstructionInterface extends ComponentPlugin { Hotspot hotspot = player.getAttribute("con:hotspot"); Scenery object = player.getAttribute("con:hsobject"); if (hotspot == null || object == null) { - SystemLogger.logErr(this.getClass(), "Failed building decoration " + hotspot + " : " + object); + log(this.getClass(), Log.ERR, "Failed building decoration " + hotspot + " : " + object); break; } slot = ((slot % 2 != 0) ? 4 : 0) + (slot >> 1); if (slot >= hotspot.getHotspot().getDecorations().length) { - SystemLogger.logErr(this.getClass(), "Failed building decoration " + slot + "/" + hotspot.getHotspot().getDecorations().length); + log(this.getClass(), Log.ERR, "Failed building decoration " + slot + "/" + hotspot.getHotspot().getDecorations().length); break; } boolean debug = player.isStaff(); @@ -104,7 +107,7 @@ public final class ConstructionInterface extends ComponentPlugin { break; case 402: int index = button - 160; - SystemLogger.logErr(this.getClass(), "BuildRoom Interface Index: " + index); + log(this.getClass(), Log.FINE, "BuildRoom Interface Index: " + index); if (index > -1 && index < RoomProperties.values().length) { player.getDialogueInterpreter().open("con:room", RoomProperties.values()[index]); return true; diff --git a/Server/src/main/content/global/skill/construction/HouseManager.java b/Server/src/main/content/global/skill/construction/HouseManager.java index 3e2f05d88..49433b087 100644 --- a/Server/src/main/content/global/skill/construction/HouseManager.java +++ b/Server/src/main/content/global/skill/construction/HouseManager.java @@ -17,6 +17,7 @@ import core.game.world.map.build.DynamicRegion; import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; +import core.tools.Log; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.simple.JSONArray; @@ -27,6 +28,7 @@ import core.game.world.GameWorld; import java.awt.*; import java.nio.ByteBuffer; +import static core.api.ContentAPIKt.log; import static core.api.regionspec.RegionSpecificationKt.fillWith; import static core.api.regionspec.RegionSpecificationKt.using; @@ -323,7 +325,7 @@ public final class HouseManager { */ public Location getEnterLocation() { if (houseRegion == null) { - SystemLogger.logErr(this.getClass(), "House wasn't constructed yet!"); + log(this.getClass(), Log.ERR, "House wasn't constructed yet!"); return null; } for (int x = 0; x < 8; x++) { diff --git a/Server/src/main/content/global/skill/crafting/lightsources/LightSourceExtinguisher.kt b/Server/src/main/content/global/skill/crafting/lightsources/LightSourceExtinguisher.kt index d42a1a08b..357b69ca8 100644 --- a/Server/src/main/content/global/skill/crafting/lightsources/LightSourceExtinguisher.kt +++ b/Server/src/main/content/global/skill/crafting/lightsources/LightSourceExtinguisher.kt @@ -1,5 +1,6 @@ package content.global.skill.crafting.lightsources +import core.api.log import core.cache.def.impl.ItemDefinition import core.game.container.Container import core.game.interaction.OptionHandler @@ -9,6 +10,7 @@ import core.game.node.item.Item import core.tools.SystemLogger import core.plugin.Initializable import core.plugin.Plugin +import core.tools.Log /** @@ -28,7 +30,7 @@ class LightSourceExtinguisher : OptionHandler(){ val lightSource = LightSources.forId(node.id) - lightSource ?: return false.also { SystemLogger.logWarn(this::class.java, "UNHANDLED EXTINGUISH OPTION: ID = ${node.id}") } + lightSource ?: return false.also { log(this::class.java, Log.WARN, "UNHANDLED EXTINGUISH OPTION: ID = ${node.id}") } player.inventory.replace(node.asItem(), Item(lightSource.fullID)) return true diff --git a/Server/src/main/content/global/skill/farming/FarmingState.kt b/Server/src/main/content/global/skill/farming/FarmingState.kt index 03cf0c2a2..f6da3da8e 100644 --- a/Server/src/main/content/global/skill/farming/FarmingState.kt +++ b/Server/src/main/content/global/skill/farming/FarmingState.kt @@ -73,7 +73,6 @@ class FarmingState(player: Player? = null) : State(player) { val cBin = CompostBins.values()[binOrdinal] val b = cBin.getBinForPlayer(player) b.parse(bin["binData"] as JSONObject) - SystemLogger.logErr(this::class.java, "bin size " + binMap.size) } } if(_data.containsKey("farming-patches")){ diff --git a/Server/src/main/content/global/skill/farming/HealthChecker.kt b/Server/src/main/content/global/skill/farming/HealthChecker.kt index 990f6b167..cd4498f48 100644 --- a/Server/src/main/content/global/skill/farming/HealthChecker.kt +++ b/Server/src/main/content/global/skill/farming/HealthChecker.kt @@ -1,5 +1,6 @@ package content.global.skill.farming +import core.api.log import core.cache.def.impl.SceneryDefinition import core.game.interaction.OptionHandler import core.game.node.Node @@ -8,6 +9,7 @@ import core.game.node.entity.skill.Skills import core.tools.SystemLogger import core.plugin.Initializable import core.plugin.Plugin +import core.tools.Log import java.util.concurrent.TimeUnit @Initializable @@ -39,7 +41,7 @@ class HealthChecker : OptionHandler(){ PatchType.FRUIT_TREE -> patch.setCurrentState(patch.getCurrentState() - 14) PatchType.BUSH -> patch.setCurrentState(patch.plantable!!.value + patch.plantable!!.stages + 4) PatchType.CACTUS -> patch.setCurrentState(patch.plantable!!.value + patch.plantable!!.stages + 3) - else -> SystemLogger.logErr(this::class.java,"Unreachable patch type from when(type) switch in HealthChecker.kt line 36") + else -> log(this::class.java, Log.ERR, "Unreachable patch type from when(type) switch in HealthChecker.kt line 36") } if(type == PatchType.FRUIT_TREE){ diff --git a/Server/src/main/content/global/skill/farming/Patch.kt b/Server/src/main/content/global/skill/farming/Patch.kt index c57cf4d03..173886d65 100644 --- a/Server/src/main/content/global/skill/farming/Patch.kt +++ b/Server/src/main/content/global/skill/farming/Patch.kt @@ -1,6 +1,8 @@ package content.global.skill.farming +import core.api.log import core.game.node.entity.player.Player +import core.tools.Log import core.tools.RandomFunction import org.rs09.consts.Items import core.tools.SystemLogger @@ -110,7 +112,7 @@ class Patch(val player: Player, val patch: FarmingPatch, var plantable: Plantabl PatchType.FRUIT_TREE -> player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,plantable!!.value + plantable!!.stages + 20) PatchType.BUSH -> player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,250 + (plantable!!.ordinal - Plantable.REDBERRY_SEED.ordinal)) PatchType.CACTUS -> player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset, 31) - else -> SystemLogger.logWarn(this::class.java, "Invalid setting of isCheckHealth for patch type: " + patch.type.name) + else -> log(this::class.java, Log.WARN, "Invalid setting of isCheckHealth for patch type: " + patch.type.name) } } else { when(patch.type){ diff --git a/Server/src/main/content/global/skill/fishing/FishingSpot.java b/Server/src/main/content/global/skill/fishing/FishingSpot.java index 03fb8e437..fcaf85778 100644 --- a/Server/src/main/content/global/skill/fishing/FishingSpot.java +++ b/Server/src/main/content/global/skill/fishing/FishingSpot.java @@ -59,7 +59,7 @@ public enum FishingSpot { for(FishingOption o : this.options){ if(o.getName().equals(name)){return o;} } - System.out.println("Unhandled fishing spot option, spot id: " + this.ids[0] + " desired fishing option: " + name); + return FishingOption.SMALL_NET; //safe, default return. } diff --git a/Server/src/main/content/global/skill/gather/SkillingResource.java b/Server/src/main/content/global/skill/gather/SkillingResource.java index e2c2a982c..178f6679b 100644 --- a/Server/src/main/content/global/skill/gather/SkillingResource.java +++ b/Server/src/main/content/global/skill/gather/SkillingResource.java @@ -645,7 +645,6 @@ public enum SkillingResource { static { for (SkillingResource resource : SkillingResource.values()) { if (RESOURCES.containsKey(resource.id)) { - SystemLogger.logErr(SkillingResource.class, "Already contained resource " + resource.getId() + " - " + resource.name()); } RESOURCES.put(resource.id, resource); } diff --git a/Server/src/main/content/global/skill/gather/fishing/FishingPulse.kt b/Server/src/main/content/global/skill/gather/fishing/FishingPulse.kt index 6240e1da7..160485157 100644 --- a/Server/src/main/content/global/skill/gather/fishing/FishingPulse.kt +++ b/Server/src/main/content/global/skill/gather/fishing/FishingPulse.kt @@ -54,7 +54,7 @@ class FishingPulse(player: Player?, npc: NPC, private val option: FishingOption? } player.debug(player.inventory.containsItem(option.tool).toString()) if (!player.inventory.containsItem(option.tool) && !hasBarbTail()) { - //System.out.println(isBareHanded(player)); + player.dialogueInterpreter.sendDialogue("You need a " + option.tool.name.toLowerCase() + " to catch these fish.") stop() return false diff --git a/Server/src/main/content/global/skill/hunter/Traps.java b/Server/src/main/content/global/skill/hunter/Traps.java index 0555254a6..ab3314381 100644 --- a/Server/src/main/content/global/skill/hunter/Traps.java +++ b/Server/src/main/content/global/skill/hunter/Traps.java @@ -5,6 +5,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.node.scenery.Scenery; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; @@ -12,6 +13,8 @@ import core.game.world.update.flag.context.Animation; import java.util.ArrayList; import java.util.List; +import static core.api.ContentAPIKt.log; + /** * Represents a trap type. * @author Vexia @@ -101,7 +104,7 @@ public enum Traps { return; } if (instance.getWrapper(object) == null) { - SystemLogger.logErr(this.getClass(), "NO WRAPPER (HUNTER DISMANTLE)"); + log(this.getClass(), Log.ERR, "NO WRAPPER (HUNTER DISMANTLE)"); return; } player.faceLocation(object.getLocation()); diff --git a/Server/src/main/content/global/skill/hunter/tracking/HunterTracking.kt b/Server/src/main/content/global/skill/hunter/tracking/HunterTracking.kt index 6b21f5990..e5b448f8b 100644 --- a/Server/src/main/content/global/skill/hunter/tracking/HunterTracking.kt +++ b/Server/src/main/content/global/skill/hunter/tracking/HunterTracking.kt @@ -1,5 +1,6 @@ package content.global.skill.hunter.tracking +import core.api.log import core.game.interaction.OptionHandler import core.game.node.Node import core.game.node.scenery.Scenery @@ -14,6 +15,7 @@ import core.tools.RandomFunction import org.rs09.consts.Items import core.tools.SystemLogger import core.game.world.GameWorld +import core.tools.Log import java.util.* /** @@ -50,7 +52,7 @@ abstract class HunterTracking : OptionHandler(){ val trail = player.getAttribute(attribute, ArrayList()) val initialTrail = getInitialTrail(startobj) if(initialTrail == null) { - SystemLogger.logWarn(this::class.java, "UNHANDLED STARTING OBJECT FOR HUNTER TRACKING $startobj") + log(this::class.java, Log.WARN, "UNHANDLED STARTING OBJECT FOR HUNTER TRACKING $startobj") return } trail.add(initialTrail) diff --git a/Server/src/main/content/global/skill/magic/SpellListeners.kt b/Server/src/main/content/global/skill/magic/SpellListeners.kt index d90356132..d163c562a 100644 --- a/Server/src/main/content/global/skill/magic/SpellListeners.kt +++ b/Server/src/main/content/global/skill/magic/SpellListeners.kt @@ -1,7 +1,9 @@ package content.global.skill.magic +import core.api.log import core.game.node.Node import core.game.node.entity.player.Player +import core.tools.Log import core.tools.SystemLogger object SpellListeners { @@ -18,12 +20,12 @@ object SpellListeners { } fun get(spellID: Int, type: Int, book: String): ((Player,Node?) -> Unit)?{ - SystemLogger.logInfo(this::class.java, "Getting $book:$spellID:$type") + log(this::class.java, Log.FINE, "Getting $book:$spellID:$type") return castMap["$book:$spellID:$type"] } fun get(spellID: Int, type: Int, id: Int, book: String): ((Player,Node?) -> Unit)?{ - SystemLogger.logInfo(this::class.java, "Getting $book:$spellID:$type:$id") + log(this::class.java, Log.FINE, "Getting $book:$spellID:$type:$id") return castMap["$book:$spellID:$type:$id"] } diff --git a/Server/src/main/content/global/skill/magic/modern/ChargeOrbSpells.java b/Server/src/main/content/global/skill/magic/modern/ChargeOrbSpells.java index 115d5ebbb..c7ec67418 100644 --- a/Server/src/main/content/global/skill/magic/modern/ChargeOrbSpells.java +++ b/Server/src/main/content/global/skill/magic/modern/ChargeOrbSpells.java @@ -105,7 +105,7 @@ public final class ChargeOrbSpells extends MagicSpell { && objectId == 2151 && p.getInventory().containsItems(Runes.COSMIC_RUNE.getItem(15), Runes.WATER_RUNE.getItem(150), new Item(UNPOWERED_ORB.getId(), 5))) { p.setAttribute("/save:diary:seers:water-orb-can-earn", true); - System.out.println("can_earn_true"); + p.setAttribute("/save:diary:seers:water-orb", 1); } if (!meetsRequirements(entity, true, true)) { diff --git a/Server/src/main/content/global/skill/runecrafting/abyss/AbyssPlugin.kt b/Server/src/main/content/global/skill/runecrafting/abyss/AbyssPlugin.kt index 3c49446ee..567344657 100644 --- a/Server/src/main/content/global/skill/runecrafting/abyss/AbyssPlugin.kt +++ b/Server/src/main/content/global/skill/runecrafting/abyss/AbyssPlugin.kt @@ -4,7 +4,6 @@ import core.api.* import core.game.node.Node import core.plugin.ClassScanner.definePlugin import core.tools.colorize -import core.tools.SystemLogger.logInfo import core.game.node.scenery.Scenery import core.game.node.entity.impl.Animator import core.game.node.entity.npc.NPC @@ -28,6 +27,7 @@ import org.rs09.consts.Scenery as Sceneries import core.game.interaction.InteractionListener import core.game.interaction.IntType import core.game.world.GameWorld +import core.tools.Log import kotlin.math.cos import kotlin.math.sin import kotlin.random.Random @@ -255,7 +255,7 @@ class AbyssPlugin : InteractionListener { const val BURN_PROGRESS = 16 const val DISTRACT_PROGRESS = 18 fun handleObstacle(obstacle: Node, player: Player, skill: Int, varbitVal: Int?, animation: Animation, messages: Array): Boolean { - logInfo(this::class.java, "handled abyss ${obstacle.name}") + log(this::class.java, Log.FINE, "handled abyss ${obstacle.name}") player.lock() player.animate(animation) GameWorld.Pulser.submit(object : Pulse(1, player) { diff --git a/Server/src/main/content/global/skill/summoning/familiar/Familiar.java b/Server/src/main/content/global/skill/summoning/familiar/Familiar.java index ffef05556..63e12de2a 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/Familiar.java +++ b/Server/src/main/content/global/skill/summoning/familiar/Familiar.java @@ -23,6 +23,7 @@ import core.game.world.map.zone.ZoneRestriction; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; import core.plugin.Plugin; +import core.tools.Log; import core.tools.RandomFunction; import core.game.node.entity.combat.CombatPulse; import core.game.node.entity.combat.CombatSwingHandler; @@ -33,6 +34,8 @@ import content.global.skill.summoning.SummoningPouch; import java.util.ArrayList; import java.util.List; +import static core.api.ContentAPIKt.log; + /** * Represents a familiar. * @author Emperor @@ -579,7 +582,7 @@ public abstract class Familiar extends NPC implements Plugin { face(owner); } if (!isRenderable() && owner.isActive()) { - // SystemLogger.logErr(this.getClass(), "Familiar in inactive region!"); + // log(this.getClass(), Log.ERR, "Familiar in inactive region!"); getWalkingQueue().update(); getUpdateMasks().prepare(this); } @@ -628,7 +631,7 @@ public abstract class Familiar extends NPC implements Plugin { public Plugin newInstance(Object arg) throws Throwable { for (int id : getIds()) { if (FamiliarManager.getFamiliars().containsKey(id)) { - SystemLogger.logErr(this.getClass(), "Familiar " + id + " was already registered!"); + log(this.getClass(), Log.ERR, "Familiar " + id + " was already registered!"); return null; } FamiliarManager.getFamiliars().put(id, this); diff --git a/Server/src/main/content/global/skill/thieving/PickableDoorHandler.java b/Server/src/main/content/global/skill/thieving/PickableDoorHandler.java index 4b892914a..51c158f9f 100644 --- a/Server/src/main/content/global/skill/thieving/PickableDoorHandler.java +++ b/Server/src/main/content/global/skill/thieving/PickableDoorHandler.java @@ -75,7 +75,7 @@ public class PickableDoorHandler extends OptionHandler { door.pickLock(player, (Scenery) node); return true; } - System.out.println("Unhandled door: " + node.getId()); + return false; } diff --git a/Server/src/main/content/minigame/allfiredup/AFUBeacon.kt b/Server/src/main/content/minigame/allfiredup/AFUBeacon.kt index 54aeb81ba..9115b417c 100644 --- a/Server/src/main/content/minigame/allfiredup/AFUBeacon.kt +++ b/Server/src/main/content/minigame/allfiredup/AFUBeacon.kt @@ -1,8 +1,10 @@ package content.minigame.allfiredup +import core.api.log import core.game.node.entity.player.Player import core.tools.SystemLogger import core.game.world.map.Location +import core.tools.Log /** * Various data for beacons, such as varp and offset, required FM level, etc @@ -29,7 +31,7 @@ enum class AFUBeacon(val title: String, val fmLevel: Int, val varpId: Int, val o for (beacon in values()) { if (beacon.location.equals(location)) return beacon } - return content.minigame.allfiredup.AFUBeacon.RIVER_SALVE.also { SystemLogger.logWarn(this::class.java, "Unhandled Beacon Location ${location.toString()}") } + return content.minigame.allfiredup.AFUBeacon.RIVER_SALVE.also { log(this::class.java, Log.WARN, "Unhandled Beacon Location ${location.toString()}") } } fun resetAllBeacons(player: Player){ diff --git a/Server/src/main/content/minigame/barrows/BarrowsActivityPlugin.java b/Server/src/main/content/minigame/barrows/BarrowsActivityPlugin.java index b5089c978..096fe10be 100644 --- a/Server/src/main/content/minigame/barrows/BarrowsActivityPlugin.java +++ b/Server/src/main/content/minigame/barrows/BarrowsActivityPlugin.java @@ -97,7 +97,7 @@ public final class BarrowsActivityPlugin extends ActivityPlugin { } } int drain = 8; - System.out.println(getWorldTicks() % 30); + //if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) { // continue; //} diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt index 25750b873..be8c1cd9f 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt @@ -3,6 +3,7 @@ package content.minigame.fishingtrawler import core.api.LogoutListener import core.api.MapArea import core.api.getRegionBorders +import core.api.log import core.game.component.Component import core.game.node.entity.Entity import core.game.node.scenery.Scenery @@ -294,11 +295,11 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : Logo override fun areaEnter(entity: Entity) { super.areaEnter(entity) - SystemLogger.logInfo(this::class.java, "ENTERED FTZ") + log(this::class.java, Log.FINE, "ENTERED FTZ") } override fun areaLeave(entity: Entity, logout: Boolean) { super.areaLeave(entity, logout) - SystemLogger.logInfo(this::class.java, "EXITED FTZ") + log(this::class.java, Log.FINE, "EXITED FTZ") } } diff --git a/Server/src/main/content/minigame/fog/FOGRewardsInterface.kt b/Server/src/main/content/minigame/fog/FOGRewardsInterface.kt index d775e27ca..d09b39bdc 100644 --- a/Server/src/main/content/minigame/fog/FOGRewardsInterface.kt +++ b/Server/src/main/content/minigame/fog/FOGRewardsInterface.kt @@ -1,5 +1,6 @@ package content.minigame.fog +import core.api.log import core.cache.def.impl.ItemDefinition import core.game.component.Component import core.game.component.ComponentDefinition @@ -8,6 +9,7 @@ import core.game.node.entity.player.Player import core.game.node.item.Item import core.plugin.Initializable import core.plugin.Plugin +import core.tools.Log import core.tools.SystemLogger @Initializable @@ -52,7 +54,7 @@ class FOGRewardsInterface : ComponentPlugin(){ 176 -> choice = Air_Gloves 181 -> choice = Water_Gloves 186 -> choice = Earth_Gloves - else -> SystemLogger.logWarn(this::class.java, "Unhandled button ID for FOG interface: $button").also { return true } + else -> log(this::class.java, Log.WARN, "Unhandled button ID for FOG interface: $button").also { return true } } handleOpcode(choice,opcode,player!!) return true diff --git a/Server/src/main/content/minigame/pestcontrol/PCIslandZone.java b/Server/src/main/content/minigame/pestcontrol/PCIslandZone.java index 6f697b9bd..42cc5179d 100644 --- a/Server/src/main/content/minigame/pestcontrol/PCIslandZone.java +++ b/Server/src/main/content/minigame/pestcontrol/PCIslandZone.java @@ -21,7 +21,7 @@ public final class PCIslandZone extends MapZone { @Override public boolean death(Entity e, Entity killer) { if (e instanceof Player) { // Ensure players can't die on the island. - // System.out.println("[PCIslandZone] Saved player from death!"); + e.getProperties().setTeleportLocation(e.getLocation()); return true; } diff --git a/Server/src/main/content/region/asgarnia/trollheim/handlers/gwd/GodwarsMapzone.java b/Server/src/main/content/region/asgarnia/trollheim/handlers/gwd/GodwarsMapzone.java index c743fb66e..7b0b9a297 100644 --- a/Server/src/main/content/region/asgarnia/trollheim/handlers/gwd/GodwarsMapzone.java +++ b/Server/src/main/content/region/asgarnia/trollheim/handlers/gwd/GodwarsMapzone.java @@ -16,6 +16,7 @@ import core.game.node.entity.player.info.Rights; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.game.system.task.Pulse; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; import core.game.world.map.Direction; @@ -34,6 +35,8 @@ import core.plugin.Plugin; import core.tools.StringUtils; import core.game.node.entity.skill.Skills; +import static core.api.ContentAPIKt.log; + /** * Handles the god wars map zone. * @author Emperor @@ -368,7 +371,7 @@ public final class GodwarsMapzone extends MapZone implements Plugin { } if (DoorActionHandler.handleAutowalkDoor(player, object)) { - SystemLogger.logInfo(this.getClass(), player.getUsername() + " entered " + faction.name() + " gwd boss room"); + log(this.getClass(), Log.FINE, player.getUsername() + " entered " + faction.name() + " gwd boss room"); increaseKillcount(player, faction, -required); } return true; diff --git a/Server/src/main/content/region/desert/quest/thegolem/TheGolemQuest.kt b/Server/src/main/content/region/desert/quest/thegolem/TheGolemQuest.kt index aba40c179..6817725cd 100644 --- a/Server/src/main/content/region/desert/quest/thegolem/TheGolemQuest.kt +++ b/Server/src/main/content/region/desert/quest/thegolem/TheGolemQuest.kt @@ -266,7 +266,7 @@ class TheGolemListeners : InteractionListener { } fun placeStatuette(player: Player): Boolean { - System.out.println("Hello from placeStatuette") + if(player.inventory.remove(Item(4618))) { player.sendMessage("You insert the statuette into the alcove.") player.setAttribute("/save:the-golem:placed-statuette", true) diff --git a/Server/src/main/content/region/kandarin/quest/dwarfcannon/DwarfCannonPlugin.java b/Server/src/main/content/region/kandarin/quest/dwarfcannon/DwarfCannonPlugin.java index 1f0f52ffb..5c8031f96 100644 --- a/Server/src/main/content/region/kandarin/quest/dwarfcannon/DwarfCannonPlugin.java +++ b/Server/src/main/content/region/kandarin/quest/dwarfcannon/DwarfCannonPlugin.java @@ -16,6 +16,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.task.Pulse; import core.game.world.GameWorld; @@ -24,6 +25,8 @@ import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.tools.RandomFunction; +import static core.api.ContentAPIKt.log; + /** * Handles the dwarf cannon quest interactions. * @author Vexia @@ -289,7 +292,7 @@ public class DwarfCannonPlugin extends OptionHandler { } Part part = Part.forId(button); if (part == null) { - SystemLogger.logErr(this.getClass(), "Unhandled part id - " + button + "!"); + log(this.getClass(), Log.ERR, "Unhandled part id - " + button + "!"); return true; } if (this.tool.getPart() != part) { diff --git a/Server/src/main/content/region/kandarin/quest/fishingcontest/GarlicPipeInteraction.java b/Server/src/main/content/region/kandarin/quest/fishingcontest/GarlicPipeInteraction.java index 27ad753db..ec13a470a 100644 --- a/Server/src/main/content/region/kandarin/quest/fishingcontest/GarlicPipeInteraction.java +++ b/Server/src/main/content/region/kandarin/quest/fishingcontest/GarlicPipeInteraction.java @@ -26,7 +26,7 @@ public class GarlicPipeInteraction extends PluginInteraction { @Override public boolean handle(Player player, NodeUsageEvent event) { - System.out.println("Trying to handle it"); + if(event.getUsed() instanceof Item && event.getUsedWith() instanceof Scenery){ Scenery usedWith = event.getUsedWith().asScenery(); Item used = event.getUsedItem(); diff --git a/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop/EWListeners.kt b/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop/EWListeners.kt index fab55b910..b5439df82 100644 --- a/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop/EWListeners.kt +++ b/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop/EWListeners.kt @@ -16,6 +16,7 @@ import content.region.kandarin.seers.quest.elementalworkshop.EWUtils.WATER_WHEEL import content.region.kandarin.seers.quest.elementalworkshop.EWUtils.currentStage import core.game.interaction.InteractionListener import core.game.interaction.IntType +import core.tools.Log import core.tools.SystemLogger /** @@ -276,7 +277,7 @@ class EWListeners : InteractionListener { } // Sanity error check (Should never get thrown) if (!player.inventory.containsAll(*elementalShieldReqItems)) { - SystemLogger.logErr(this::class.java, "${player.username} tried to forge an elemental shield without all the required items.") + log(this::class.java, Log.ERR, "${player.username} tried to forge an elemental shield without all the required items.") return@onUseWith false } // Successfully smith the elemental shield @@ -451,7 +452,7 @@ class EWListeners : InteractionListener { else -> { offset = -1 enabled = 0 - SystemLogger.logErr(this::class.java, "Unhandled location when determining enabled water controls! ${player.location}") + log(this::class.java, Log.ERR, "Unhandled location when determining enabled water controls! ${player.location}") return@on false } } diff --git a/Server/src/main/content/region/misthalin/barbvillage/stronghold/playersafety/GuardDialoguePlugin.java b/Server/src/main/content/region/misthalin/barbvillage/stronghold/playersafety/GuardDialoguePlugin.java index ada88a5e8..777ffcfa3 100644 --- a/Server/src/main/content/region/misthalin/barbvillage/stronghold/playersafety/GuardDialoguePlugin.java +++ b/Server/src/main/content/region/misthalin/barbvillage/stronghold/playersafety/GuardDialoguePlugin.java @@ -5,10 +5,13 @@ import core.game.dialogue.DialoguePlugin; import core.game.dialogue.FacialExpression; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.task.Pulse; import core.game.world.GameWorld; +import static core.api.ContentAPIKt.log; + /** * @author Tyler Telis */ @@ -128,7 +131,7 @@ public class GuardDialoguePlugin extends DialoguePlugin { stage = -1; break; default: - SystemLogger.logErr(this.getClass(), "Unhandled dialogue stage=" + stage); + log(this.getClass(), Log.ERR, "Unhandled dialogue stage=" + stage); } return false; } diff --git a/Server/src/main/content/region/misthalin/lumbridge/handlers/TormentedDemonNPC.java b/Server/src/main/content/region/misthalin/lumbridge/handlers/TormentedDemonNPC.java index 5702373c2..87f5de168 100644 --- a/Server/src/main/content/region/misthalin/lumbridge/handlers/TormentedDemonNPC.java +++ b/Server/src/main/content/region/misthalin/lumbridge/handlers/TormentedDemonNPC.java @@ -203,7 +203,7 @@ public class TormentedDemonNPC extends AbstractNPC { * @param protectionStyle The protection style to switch to. */ public void transformDemon(CombatStyle attackStyle, CombatStyle protectionStyle) { - //System.out.println("Transforming demon, selected combat style = " + style + ", the selected protection style = " + protection); + // If either attackStyle or protectionStyle are null, use the current form's values if(attackStyle == null) { @@ -216,7 +216,7 @@ public class TormentedDemonNPC extends AbstractNPC { int oldHp = getSkills().getLifepoints(); transform(id); getSkills().setLifepoints(oldHp); - //System.out.println("The outcome demon, id = " + id + " combat style = " + getProperties().getCombatPulse().getStyle() + ", the protection style = " + getProperties().getProtectStyle()); + TD_SWING_HANDLER.style = getProperties().getCombatPulse().getStyle(); } diff --git a/Server/src/main/content/region/misthalin/varrock/handlers/VarrockGuardSignpost.kt b/Server/src/main/content/region/misthalin/varrock/handlers/VarrockGuardSignpost.kt index e6ca1ae8c..076b11fe3 100644 --- a/Server/src/main/content/region/misthalin/varrock/handlers/VarrockGuardSignpost.kt +++ b/Server/src/main/content/region/misthalin/varrock/handlers/VarrockGuardSignpost.kt @@ -9,6 +9,7 @@ import core.game.world.map.zone.ZoneBorders import core.GlobalStats import core.game.interaction.InteractionListener import core.game.interaction.IntType +import core.tools.Log import core.tools.SystemLogger class VarrockGuardSignpost : InteractionListener { @@ -29,7 +30,7 @@ class VarrockGuardSignpost : InteractionListener { on(31298, IntType.SCENERY, "read"){ player, _ -> val pickpocketCount = GlobalStats.getDailyGuardPickpockets() - SystemLogger.logInfo(this::class.java, "Is equal? ${pickpocketCount == 0}") + log(this::class.java, Log.FINE, "Is equal? ${pickpocketCount == 0}") when(pickpocketCount){ 0 -> sendDialogue(player, "The Varrock Palace guards are pleased to announce that crime is at an all-time low, without a single guard in the palace or at the city gates being pickpocketed today.") 1 -> sendDialogue(player, "One of the Varrock Palace guards was pickpocketed today. He was close to tears at having lost his last few gold pieces." ) diff --git a/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DSlayerDrainPlugin.java b/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DSlayerDrainPlugin.java index 5ad418238..c96b516a5 100644 --- a/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DSlayerDrainPlugin.java +++ b/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DSlayerDrainPlugin.java @@ -54,19 +54,19 @@ public final class DSlayerDrainPlugin extends UseWithHandler { player.animate(ANIMATION); player.getPacketDispatch().sendMessage("You pour the liquid down the drain."); if (quest.getStage(player) != 20) { - System.out.println("1"); + return true; } if (player.getAttribute("demon-slayer:just-poured", false)) { - System.out.println("2"); + return true; } if (!player.hasItem(DemonSlayer.FIRST_KEY)) { - System.out.println("3"); + player.getSavedData().getQuestData().getDemonSlayer()[0] = false; } if (quest.getStage(player) == 20 && !player.hasItem(DemonSlayer.FIRST_KEY) && !player.getSavedData().getQuestData().getDemonSlayer()[0]) { - System.out.println("4"); + player.getDialogueInterpreter().sendDialogues(player, null, "OK, I think I've washed the key down into the sewer.", "I'd better go down and get it!"); player.getSavedData().getQuestData().getDemonSlayer()[0] = true;// poured player.getConfigManager().set(222, 2660610, true); diff --git a/Server/src/main/content/region/misthalin/varrock/quest/familycrest/FamilyCrest.kt b/Server/src/main/content/region/misthalin/varrock/quest/familycrest/FamilyCrest.kt index 9bd882d9c..a8b82735a 100644 --- a/Server/src/main/content/region/misthalin/varrock/quest/familycrest/FamilyCrest.kt +++ b/Server/src/main/content/region/misthalin/varrock/quest/familycrest/FamilyCrest.kt @@ -2,11 +2,13 @@ package content.region.misthalin.varrock.quest.familycrest import core.api.addItem +import core.api.log import core.api.setAttribute import core.game.node.entity.player.Player import core.game.node.entity.player.link.quest.Quest import core.game.node.entity.skill.Skills import core.plugin.Initializable +import core.tools.Log import org.rs09.consts.Items import core.tools.SystemLogger @@ -118,7 +120,7 @@ class FamilyCrest: Quest("Family Crest", 59, 58, 1, 148, 0, 1, 11) { drawReward(player,"for the gauntlets",ln++) if (!addItem(player, Items.FAMILY_GAUNTLETS_778)) { - SystemLogger.logErr(this::class.java, "Failed to give gauntlets to ${player.username} at end of quest, this should not occur due to crest item removal needed to finish quest.") + log(this::class.java, Log.ERR, "Failed to give gauntlets to ${player.username} at end of quest, this should not occur due to crest item removal needed to finish quest.") } setAttribute(player, "/save:family-crest:gauntlets", Items.FAMILY_GAUNTLETS_778) } diff --git a/Server/src/main/content/region/morytania/quest/naturespirit/NSListeners.kt b/Server/src/main/content/region/morytania/quest/naturespirit/NSListeners.kt index 9c1263a1c..4fe37592f 100644 --- a/Server/src/main/content/region/morytania/quest/naturespirit/NSListeners.kt +++ b/Server/src/main/content/region/morytania/quest/naturespirit/NSListeners.kt @@ -19,6 +19,7 @@ import core.game.interaction.IntType import content.region.morytania.handlers.MortMyreGhastNPC import core.tools.SystemLogger import core.tools.END_DIALOGUE +import core.tools.Log class NSListeners : InteractionListener { @@ -114,7 +115,7 @@ class NSListeners : InteractionListener { } on(WASHING_BOWL, IntType.GROUNDITEM, "take"){ player, node -> - SystemLogger.logInfo(this::class.java, "Running listener") + log(this::class.java, Log.FINE, "Running listener") GroundItemManager.create(Item(MIRROR), node.location, player) PickupHandler.take(player, node as GroundItem) return@on true diff --git a/Server/src/main/content/region/wilderness/handlers/revenants/RevenantController.kt b/Server/src/main/content/region/wilderness/handlers/revenants/RevenantController.kt index 3d15eb0bc..dd6184aec 100644 --- a/Server/src/main/content/region/wilderness/handlers/revenants/RevenantController.kt +++ b/Server/src/main/content/region/wilderness/handlers/revenants/RevenantController.kt @@ -1,9 +1,5 @@ package content.region.wilderness.handlers.revenants -import core.api.Commands -import core.api.TickListener -import core.api.poofClear -import core.api.teleport import core.game.interaction.MovementPulse import core.game.node.entity.npc.NPC import core.game.node.entity.player.link.TeleportManager @@ -12,10 +8,12 @@ import core.game.world.map.Location import core.game.world.update.flag.context.Graphics import core.tools.RandomFunction import core.ServerConstants +import core.api.* import core.tools.SystemLogger import core.game.system.command.Privilege import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import java.lang.Integer.min import kotlin.collections.ArrayList import kotlin.collections.HashMap @@ -94,10 +92,10 @@ class RevenantController : TickListener, Commands { define("listrevs", Privilege.ADMIN) {player, strings -> for (rev in trackedRevenants) { - SystemLogger.logInfo(this::class.java, "REV ${rev.id}-${rev.name} @ ${rev.location.toString()}") + log(this::class.java, Log.FINE, "REV ${rev.id}-${rev.name} @ ${rev.location.toString()}") } - SystemLogger.logInfo(this::class.java, "Total of ${trackedRevenants.size} revenants spawned.") + log(this::class.java, Log.FINE, "Total of ${trackedRevenants.size} revenants spawned.") } define("clearrevs", Privilege.ADMIN) {_, _ -> diff --git a/Server/src/main/core/Server.kt b/Server/src/main/core/Server.kt index 09c36c40a..fd128d949 100644 --- a/Server/src/main/core/Server.kt +++ b/Server/src/main/core/Server.kt @@ -1,5 +1,6 @@ package core +import core.api.log import core.game.system.SystemManager import core.game.system.SystemState import core.net.NioReactor @@ -9,6 +10,7 @@ import core.tools.SystemLogger import core.game.system.config.ServerConfigParser import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import java.io.File import java.io.FileWriter import java.lang.management.ManagementFactory @@ -51,27 +53,27 @@ object Server { @JvmStatic fun main(args: Array) { if (args.isNotEmpty()) { - SystemLogger.logInfo(this::class.java, "Using config file: ${args[0]}") + log(this::class.java, Log.INFO, "Using config file: ${args[0]}") ServerConfigParser.parse(args[0]) } else { - SystemLogger.logInfo(this::class.java, "Using config file: ${"worldprops" + File.separator + "default.conf"}") + log(this::class.java, Log.INFO, "Using config file: ${"worldprops" + File.separator + "default.conf"}") ServerConfigParser.parse("worldprops" + File.separator + "default.conf") } startTime = System.currentTimeMillis() val t = TimeStamp() GameWorld.prompt(true) Runtime.getRuntime().addShutdownHook(ServerConstants.SHUTDOWN_HOOK) - SystemLogger.logInfo(this::class.java, "Starting networking...") + log(this::class.java, Log.INFO, "Starting networking...") try { reactor = NioReactor.configure(43594 + GameWorld.settings?.worldId!!) reactor!!.start() } catch (e: BindException) { - SystemLogger.logErr(this::class.java, "Port " + (43594 + GameWorld.settings?.worldId!!) + " is already in use!") + log(this::class.java, Log.ERR, "Port " + (43594 + GameWorld.settings?.worldId!!) + " is already in use!") throw e } //WorldCommunicator.connect() - SystemLogger.logInfo(this::class.java, GameWorld.settings?.name + " flags " + GameWorld.settings?.toString()) - SystemLogger.logInfo(this::class.java, GameWorld.settings?.name + " started in " + t.duration(false, "") + " milliseconds.") + log(this::class.java, Log.INFO, GameWorld.settings?.name + " flags " + GameWorld.settings?.toString()) + log(this::class.java, Log.INFO, GameWorld.settings?.name + " started in " + t.duration(false, "") + " milliseconds.") val scanner = Scanner(System.`in`) running = true @@ -80,7 +82,7 @@ object Server { val command = scanner.nextLine() when(command){ "stop" -> exitProcess(0) - "players" -> System.out.println("Players online: " + (Repository.LOGGED_IN_PLAYERS.size)) + "update" -> SystemManager.flag(SystemState.UPDATING) "help","commands" -> printCommands() "restartworker" -> SystemManager.flag(SystemState.ACTIVE) @@ -94,8 +96,8 @@ object Server { delay(20000) while (running) { if (System.currentTimeMillis() - lastHeartbeat > 7200 && running) { - SystemLogger.logErr(this::class.java, "Triggering reboot due to heartbeat timeout") - SystemLogger.logErr(this::class.java, "Creating thread dump...") + log(this::class.java, Log.ERR, "Triggering reboot due to heartbeat timeout") + log(this::class.java, Log.ERR, "Creating thread dump...") val dump = threadDump(true, true) withContext(Dispatchers.IO) { diff --git a/Server/src/main/core/ServerConstants.kt b/Server/src/main/core/ServerConstants.kt index d060ff29a..734158a4e 100644 --- a/Server/src/main/core/ServerConstants.kt +++ b/Server/src/main/core/ServerConstants.kt @@ -2,6 +2,7 @@ package core import core.game.system.SystemShutdownHook import core.game.world.map.Location +import core.tools.LogLevel import core.tools.mysql.Database import core.tools.secondsToTicks import java.math.BigInteger @@ -160,6 +161,12 @@ class ServerConstants { @JvmField var I_AM_A_CHEATER = false + @JvmField + var LOG_LEVEL = LogLevel.VERBOSE + + @JvmField + var JAVA_VERSION = 8 + //location names for the ::to command. val TELEPORT_DESTINATIONS = arrayOf( arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"), diff --git a/Server/src/main/core/ServerStore.kt b/Server/src/main/core/ServerStore.kt index 9535d15be..ec58ebfe1 100644 --- a/Server/src/main/core/ServerStore.kt +++ b/Server/src/main/core/ServerStore.kt @@ -2,8 +2,10 @@ package core import core.api.PersistWorld import core.api.getItemName +import core.api.log import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player +import core.tools.Log import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser @@ -38,7 +40,7 @@ class ServerStore : PersistWorld { fileMap[key] = data counter++ } catch (e: Exception){ - SystemLogger.logErr(this::class.java, "Failed parsing ${storeFile.name} - stack trace below.") + log(this::class.java, Log.ERR, "Failed parsing ${storeFile.name} - stack trace below.") e.printStackTrace() return@forEach } diff --git a/Server/src/main/core/api/ApiExtensions.kt b/Server/src/main/core/api/ApiExtensions.kt index cdd664c19..9a2e4c230 100644 --- a/Server/src/main/core/api/ApiExtensions.kt +++ b/Server/src/main/core/api/ApiExtensions.kt @@ -57,7 +57,15 @@ fun IntArray.isNextLast(element: Int) : Boolean { return this.isLast(this.getNext(element)) } -fun LinkedList.tryPop(default: T) : T { +fun LinkedList.tryPop(default: T?) : T? { this.peek() ?: return default return this.pop() +} + +inline fun > parseEnumEntry(name: String) : E? { + return try { + enumValueOf(name) + } catch (e: Exception) { + null + } } \ No newline at end of file diff --git a/Server/src/main/core/api/ContentAPI.kt b/Server/src/main/core/api/ContentAPI.kt index ab3b94db5..0d8cf593f 100644 --- a/Server/src/main/core/api/ContentAPI.kt +++ b/Server/src/main/core/api/ContentAPI.kt @@ -65,6 +65,7 @@ import core.game.world.GameWorld import core.game.world.GameWorld.Pulser import core.game.world.map.path.ProjectilePathfinder import core.game.world.repository.Repository +import core.tools.Log import core.tools.tick import kotlin.math.absoluteValue @@ -759,7 +760,7 @@ fun openDialogue(player: Player, dialogue: Any, vararg args: Any) { is Int -> player.dialogueInterpreter.open(dialogue, *args) is DialogueFile -> player.dialogueInterpreter.open(dialogue, *args) is SkillDialogueHandler -> dialogue.open() - else -> SystemLogger.logErr(ContentAPI::class.java, "Invalid object type passed to openDialogue() -> ${dialogue.javaClass.simpleName}") + else -> log(ContentAPI::class.java, Log.ERR, "Invalid object type passed to openDialogue() -> ${dialogue.javaClass.simpleName}") } } @@ -1045,7 +1046,7 @@ fun adjustCharge(node: Node, amount: Int) { when (node) { is Item -> node.charge += amount is Scenery -> node.charge += amount - else -> SystemLogger.logErr(ContentAPI::class.java, "Attempt to adjust the charge of invalid type: ${node.javaClass.simpleName}") + else -> log(ContentAPI::class.java, Log.ERR, "Attempt to adjust the charge of invalid type: ${node.javaClass.simpleName}") } } @@ -1058,7 +1059,7 @@ fun getCharge(node: Node): Int { when (node) { is Item -> return node.charge is Scenery -> return node.charge - else -> SystemLogger.logErr(ContentAPI::class.java, "Attempt to get charge of invalid type: ${node.javaClass.simpleName}") + else -> log(ContentAPI::class.java, Log.ERR, "Attempt to get charge of invalid type: ${node.javaClass.simpleName}") .also { return -1 } } } @@ -1072,7 +1073,7 @@ fun setCharge(node: Node, charge: Int) { when (node) { is Item -> node.charge = charge is Scenery -> node.charge = charge - else -> SystemLogger.logErr(ContentAPI::class.java, "Attempt to set the charge of invalid type: ${node.javaClass.simpleName}") + else -> log(ContentAPI::class.java, Log.ERR, "Attempt to set the charge of invalid type: ${node.javaClass.simpleName}") } } @@ -2266,6 +2267,16 @@ fun addDialogueAction(player: Player, action: core.game.dialogue.DialogueAction) player.dialogueInterpreter.addAction(action) } +/** + * Logs a message to the server console + * @param origin simply put (Kotlin) this::class.java or (Java) this.getClass() + * @param type the type of log: Log.FINE (default, visible on VERBOSE), Log.INFO (visible on DETAILED), Log.WARN (visible on CAUTIOUS), Log.ERR (always visible) + * @param message the actual message to log. + */ +fun log(origin: Class<*>, type: Log, message: String) { + SystemLogger.processLogEntry(origin, type, message) +} + /** * Used by content handlers to check if the entity is done moving yet */ @@ -2310,7 +2321,7 @@ fun clearScripts(entity: Entity) : Boolean { fun restartScript(entity: Entity) : Boolean { if (entity.scripts.getActiveScript()?.persist != true) { - SystemLogger.logErr(entity.scripts.getActiveScript()!!::class.java, "Tried to call restartScript on a non-persistent script! Either use stopExecuting() or make the script persistent.") + log(entity.scripts.getActiveScript()!!::class.java, Log.ERR, "Tried to call restartScript on a non-persistent script! Either use stopExecuting() or make the script persistent.") return clearScripts(entity) } return true @@ -2323,7 +2334,7 @@ fun keepRunning(entity: Entity) : Boolean { fun stopExecuting(entity: Entity) : Boolean { if (entity.scripts.getActiveScript()?.persist == true) { - SystemLogger.logErr(entity.scripts.getActiveScript()!!::class.java, "Tried to call stopExecuting() on a persistent script! To halt execution of a persistent script, you MUST call clearScripts()!") + log(entity.scripts.getActiveScript()!!::class.java, Log.ERR, "Tried to call stopExecuting() on a persistent script! To halt execution of a persistent script, you MUST call clearScripts()!") return clearScripts(entity) } return true diff --git a/Server/src/main/core/api/MapArea.kt b/Server/src/main/core/api/MapArea.kt index d7f12f06d..28631f54d 100644 --- a/Server/src/main/core/api/MapArea.kt +++ b/Server/src/main/core/api/MapArea.kt @@ -14,10 +14,10 @@ import core.game.world.map.zone.ZoneRestriction interface MapArea : ContentInterface { var zone: MapZone get(){ - return zoneMaps[this.javaClass.simpleName + "MapArea"]!! + return zoneMaps[this::class.java.simpleName + "MapArea"]!! } set(value) { - zoneMaps[this.javaClass.simpleName + "MapArea"] = value + zoneMaps[this::class.java.simpleName + "MapArea"] = value } fun defineAreaBorders() : Array diff --git a/Server/src/main/core/api/utils/GlobalKillCounter.kt b/Server/src/main/core/api/utils/GlobalKillCounter.kt index b89f82eea..eaecfe982 100644 --- a/Server/src/main/core/api/utils/GlobalKillCounter.kt +++ b/Server/src/main/core/api/utils/GlobalKillCounter.kt @@ -10,7 +10,9 @@ import java.io.FileWriter import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log import core.game.node.item.Item +import core.tools.Log import core.tools.SystemLogger.logShutdown import core.tools.SystemLogger.logStartup @@ -31,7 +33,7 @@ class GlobalKillCounter : StartupListener, ShutdownListener { val tmp_rare_drops = data.get("rare_drops") populate(rare_drops, tmp_rare_drops) } catch (e: Exception){ - SystemLogger.logErr(this::class.java, "Failed parsing ${file.name} - stack trace below.") + log(this::class.java, Log.ERR, "Failed parsing ${file.name} - stack trace below.") e.printStackTrace() } } diff --git a/Server/src/main/core/cache/Cache.java b/Server/src/main/core/cache/Cache.java index 1751622f7..ce4ed3c25 100644 --- a/Server/src/main/core/cache/Cache.java +++ b/Server/src/main/core/cache/Cache.java @@ -10,8 +10,11 @@ import core.cache.def.impl.GraphicDefinition; import core.cache.def.impl.ItemDefinition; import core.cache.def.impl.NPCDefinition; import core.cache.def.impl.SceneryDefinition; +import core.tools.Log; import core.tools.SystemLogger; +import static core.api.ContentAPIKt.log; + /** * A cache reader. * @@ -48,7 +51,7 @@ public final class Cache { * @throws Throwable When an exception occurs. */ public static void init(String path) throws Throwable { - SystemLogger.logInfo(Cache.class, "Initializing cache..."); + log(Cache.class, Log.FINE, "Initializing cache..."); byte[] cacheFileBuffer = new byte[520]; RandomAccessFile containersInformFile = new RandomAccessFile(path + File.separator + "main_file_cache.idx255", "r"); RandomAccessFile dataFile = new RandomAccessFile(path + File.separator + "main_file_cache.dat2", "r"); @@ -61,7 +64,7 @@ public final class Cache { CacheFile cacheFile = new CacheFile(i, new RandomAccessFile(f, "r"), dataFile, 1000000, cacheFileBuffer); cacheFileManagers[i] = new CacheFileManager(cacheFile, true); if (cacheFileManagers[i].getInformation() == null) { - SystemLogger.logErr(Cache.class, "Error loading cache index " + i + ": no information."); + log(Cache.class, Log.ERR, "Error loading cache index " + i + ": no information."); cacheFileManagers[i] = null; } } @@ -93,7 +96,7 @@ public final class Cache { public static ByteBuffer getArchiveData(int index, int archive, boolean priority, int encryptionValue) { byte[] data = index == 255 ? referenceFile.getContainerData(archive) : cacheFileManagers[index].getCacheFile().getContainerData(archive); if (data == null || data.length < 1) { - SystemLogger.logErr(Cache.class, "Invalid JS-5 request - " + index + ", " + archive + ", " + priority + ", " + encryptionValue + "!"); + log(Cache.class, Log.ERR, "Invalid JS-5 request - " + index + ", " + archive + ", " + priority + ", " + encryptionValue + "!"); return null; } int compression = data[0] & 0xff; diff --git a/Server/src/main/core/cache/def/impl/AnimationDefinition.java b/Server/src/main/core/cache/def/impl/AnimationDefinition.java index 9f54a1d61..a8ed65614 100644 --- a/Server/src/main/core/cache/def/impl/AnimationDefinition.java +++ b/Server/src/main/core/cache/def/impl/AnimationDefinition.java @@ -150,7 +150,7 @@ public final class AnimationDefinition { } else if (opcode == 14) { aBoolean2141 = true; } else { - System.out.println("Unhandled animation opcode " + opcode); + } } else anInt2162 = buffer.get() & 0xFF; diff --git a/Server/src/main/core/cache/def/impl/ClothDefinition.java b/Server/src/main/core/cache/def/impl/ClothDefinition.java index cf133443a..27c63cc53 100644 --- a/Server/src/main/core/cache/def/impl/ClothDefinition.java +++ b/Server/src/main/core/cache/def/impl/ClothDefinition.java @@ -77,11 +77,9 @@ public final class ClothDefinition { e.printStackTrace(); } int length = Cache.getIndexes()[2].getFilesSize(3); - System.out.println("Definition size: " + length + "."); + for (int i = 0; i < length; i++) { ClothDefinition def = forId(i); - if (def.unknownBool) - System.out.println("Clothing " + i + ": " + def.equipmentSlot + ", " + def.unknownBool + ", " + Arrays.toString(def.modelIds) + ", " + Arrays.toString(def.models)); } } diff --git a/Server/src/main/core/cache/def/impl/DataMap.java b/Server/src/main/core/cache/def/impl/DataMap.java index 06cfce47b..bdf4c82cc 100644 --- a/Server/src/main/core/cache/def/impl/DataMap.java +++ b/Server/src/main/core/cache/def/impl/DataMap.java @@ -3,12 +3,15 @@ package core.cache.def.impl; import core.cache.Cache; import core.cache.misc.buffer.ByteBufferUtils; import core.tools.CP1252; +import core.tools.Log; import core.tools.SystemLogger; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + public class DataMap { /** @@ -37,7 +40,7 @@ public class DataMap { public int getInt(int key){ if(!dataStore.containsKey(key)){ - SystemLogger.logErr(this.getClass(), "Invalid value passed for key: " + key + " map: " + id); + log(this.getClass(), Log.ERR, "Invalid value passed for key: " + key + " map: " + id); return -1; } return (int) dataStore.get(key); diff --git a/Server/src/main/core/cache/def/impl/GraphicDefinition.java b/Server/src/main/core/cache/def/impl/GraphicDefinition.java index d6512c10f..866aa8050 100644 --- a/Server/src/main/core/cache/def/impl/GraphicDefinition.java +++ b/Server/src/main/core/cache/def/impl/GraphicDefinition.java @@ -70,14 +70,14 @@ public class GraphicDefinition { } // 5046 - 5050 are related anims & 2148 GraphicDefinition d = GraphicDefinition.forId(803); - System.out.println("Graphic " + d.graphicsId + " anim id = " + d.animationId + ", " + d.defaultModel + "."); + for (int i = 0; i < 5000; i++) { GraphicDefinition def = GraphicDefinition.forId(i); if (def == null) { continue; } if ((def.animationId > 2000 && def.animationId < 2200) || (def.defaultModel >= 1300 && def.defaultModel < 1500)) { - System.out.println("Possible match [id=" + i + ", anim=" + def.animationId + "]."); + } } } diff --git a/Server/src/main/core/cache/def/impl/ItemDefinition.java b/Server/src/main/core/cache/def/impl/ItemDefinition.java index e4eb8f361..2bba67cab 100644 --- a/Server/src/main/core/cache/def/impl/ItemDefinition.java +++ b/Server/src/main/core/cache/def/impl/ItemDefinition.java @@ -12,6 +12,8 @@ import core.game.node.item.Item; import core.game.node.item.ItemPlugin; import core.net.packet.PacketRepository; import core.net.packet.out.WeightUpdate; +import core.plugin.Plugin; +import core.tools.Log; import core.tools.StringUtils; import core.tools.SystemLogger; import core.game.system.config.ItemConfigParser; @@ -25,6 +27,7 @@ import java.util.Map; import java.util.Arrays; import static core.api.ContentAPIKt.equipSlot; +import static core.api.ContentAPIKt.log; /** * Represents an item's definitions. @@ -268,7 +271,7 @@ public class ItemDefinition extends Definition { } ItemDefinition def = ItemDefinition.parseDefinition(itemId, ByteBuffer.wrap(data)); if (def == null) { - SystemLogger.logErr(ItemDefinition.class, "Could not load item definitions for id " + itemId + " - no definitions found!"); + log(ItemDefinition.class, Log.ERR, "Could not load item definitions for id " + itemId + " - no definitions found!"); return ; } if(itemId == 14958) @@ -447,7 +450,7 @@ public class ItemDefinition extends Definition { def.clientScriptData.put(key, value); } } else { - System.out.println("Unhandled item definition opcode - opcode: " + opcode); + break; } } @@ -1480,7 +1483,7 @@ public class ItemDefinition extends Definition { ItemDefinition def = forId(nodeId); if (def == null) { if (nodeId == 22937) - SystemLogger.logErr(ItemDefinition.class, "[ItemDefinition] No definition for item id " + nodeId + "!"); + log(ItemDefinition.class, Log.ERR, "[ItemDefinition] No definition for item id " + nodeId + "!"); return null; } OptionHandler handler = def.getConfiguration("option:" + name); diff --git a/Server/src/main/core/cache/def/impl/NPCDefinition.java b/Server/src/main/core/cache/def/impl/NPCDefinition.java index 4c6a851a1..cde8fa909 100644 --- a/Server/src/main/core/cache/def/impl/NPCDefinition.java +++ b/Server/src/main/core/cache/def/impl/NPCDefinition.java @@ -202,7 +202,7 @@ public final class NPCDefinition extends Definition { byte[] data = Cache.getIndexes()[18].getFileData(id >>> 7, id & 0x7f); if (data == null) { if (id != -1) { - // System.out.println("Failed loading NPC " + id + "."); + } } else { def.parse(ByteBuffer.wrap(data)); @@ -214,12 +214,12 @@ public final class NPCDefinition extends Definition { public static void main(String... args) throws Throwable { GameWorld.prompt(false); - System.out.println("Roar: " + NPCDefinition.forId(2329).standAnimation); + // for (int i = 0; i < 11000; i++) { // ItemDefinition def = ItemDefinition.forId(i); // if (def.getMaleWornModelId1() >= 1250 && def.getMaleWornModelId1() <= // 1550) { - // System.out.println(def.getName() + " " + i + ": " + + // def.getMaleWornModelId1()); // } // } diff --git a/Server/src/main/core/cache/def/impl/RenderAnimationDefinition.java b/Server/src/main/core/cache/def/impl/RenderAnimationDefinition.java index 8e1621a31..f68060e46 100644 --- a/Server/src/main/core/cache/def/impl/RenderAnimationDefinition.java +++ b/Server/src/main/core/cache/def/impl/RenderAnimationDefinition.java @@ -1,6 +1,7 @@ package core.cache.def.impl; import core.cache.Cache; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; @@ -9,6 +10,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.ByteBuffer; +import static core.api.ContentAPIKt.log; + /** * Holds definitions for render animations. * @author Jagex @@ -72,7 +75,7 @@ public class RenderAnimationDefinition { if (data != null) { defs.parse(ByteBuffer.wrap(data)); } else { - SystemLogger.logErr(RenderAnimationDefinition.class, "No definitions found for render animation " + animId + ", size=" + Cache.getIndexes()[2].getFilesSize(32) + "!"); + log(RenderAnimationDefinition.class, Log.ERR, "No definitions found for render animation " + animId + ", size=" + Cache.getIndexes()[2].getFilesSize(32) + "!"); } return defs; } @@ -291,7 +294,7 @@ public class RenderAnimationDefinition { public static void main(String...args) throws Throwable { GameWorld.prompt(false); RenderAnimationDefinition def = RenderAnimationDefinition.forId(1426); - System.out.println("size: " + def.getClass().getDeclaredFields().length); + for (Field f : def.getClass().getDeclaredFields()) { if (!Modifier.isStatic(f.getModifiers())) { if (f.getType().isArray()) { @@ -305,7 +308,7 @@ public class RenderAnimationDefinition { continue; } } - System.out.println(f.getName() + ", " + f.get(def)); + } } for (Field f : def.getClass().getSuperclass().getDeclaredFields()) { @@ -321,7 +324,7 @@ public class RenderAnimationDefinition { continue; } } - System.out.println(f.getName() + ", " + f.get(def)); + } } } diff --git a/Server/src/main/core/cache/def/impl/SceneryDefinition.java b/Server/src/main/core/cache/def/impl/SceneryDefinition.java index 50b277171..72ad95618 100644 --- a/Server/src/main/core/cache/def/impl/SceneryDefinition.java +++ b/Server/src/main/core/cache/def/impl/SceneryDefinition.java @@ -6,6 +6,7 @@ import core.cache.misc.buffer.ByteBufferUtils; import core.game.interaction.OptionHandler; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; @@ -13,6 +14,8 @@ import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Represents an object's definition. * @author Emperor @@ -520,14 +523,14 @@ public class SceneryDefinition extends Definition { // for (int id = 0; id <= 27325; id++) { // ObjectDefinition def = ObjectDefinition.forId(id); // if (def.mapIcon > 69) { - // System.out.println(id + " - " + def.getName() + " has map icon " + + // def.mapIcon); // } // } // return; 2105 // } /*ObjectDefinition def = ObjectDefinition.forId(2105); - System.out.println("size: " + def.getClass().getDeclaredFields().length); + for (Field f : def.getClass().getDeclaredFields()) { if (!Modifier.isStatic(f.getModifiers())) { if (f.getType().isArray()) { @@ -538,11 +541,11 @@ public class SceneryDefinition extends Definition { for (int i = 0; i < length; i++) { System.out.print(Array.get(object, i) + (i < (length - 1) ? ", " : "]")); } - System.out.println(); + continue; } } - System.out.println(f.getName() + ", " + f.get(def)); + } } for (Field f : def.getClass().getSuperclass().getDeclaredFields()) { @@ -555,11 +558,11 @@ public class SceneryDefinition extends Definition { for (int i = 0; i < length; i++) { System.out.print(Array.get(object, i) + (i < (length - 1) ? ", " : "]")); } - System.out.println(); + continue; } } - System.out.println(f.getName() + ", " + f.get(def)); + } }*/ } @@ -615,7 +618,7 @@ public class SceneryDefinition extends Definition { // SystemLogger.logErr("----------------------------------------------------\n\n\n"); while (true) { if (!buffer.hasRemaining()) { - SystemLogger.logErr(SceneryDefinition.class, "Buffer empty for " + objectId); + log(SceneryDefinition.class, Log.ERR, "Buffer empty for " + objectId); break; } int opcode = buffer.get() & 0xFF; @@ -801,7 +804,7 @@ public class SceneryDefinition extends Definition { } } else { if (opcode != 0) { - SystemLogger.logErr(SceneryDefinition.class, "Unhandled object definition opcode: " + opcode); + log(SceneryDefinition.class, Log.ERR, "Unhandled object definition opcode: " + opcode); } break; } diff --git a/Server/src/main/core/cache/def/impl/Struct.java b/Server/src/main/core/cache/def/impl/Struct.java index bd3d0a38e..92081ade0 100644 --- a/Server/src/main/core/cache/def/impl/Struct.java +++ b/Server/src/main/core/cache/def/impl/Struct.java @@ -2,12 +2,15 @@ package core.cache.def.impl; import core.cache.Cache; import core.cache.misc.buffer.ByteBufferUtils; +import core.tools.Log; import core.tools.SystemLogger; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + public class Struct { /** @@ -28,7 +31,7 @@ public class Struct { public int getInt(int key){ if(!dataStore.containsKey(key)){ - SystemLogger.logErr(this.getClass(), "Invalid value passed for key: " + key + " struct: " + id); + log(this.getClass(), Log.ERR, "Invalid value passed for key: " + key + " struct: " + id); return -1; } return (int) dataStore.get(key); diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 1f5ea3260..15ab8ff39 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -1,12 +1,15 @@ package core.game.activity; import core.game.node.entity.player.Player; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Manages the activities. * @author Emperor @@ -50,7 +53,7 @@ public final class ActivityManager { ActivityPlugin plugin = ACTIVITIES.get(name); if (plugin == null) { if (GameWorld.getSettings().isDevMode()) { - SystemLogger.logErr(ActivityManager.class, "Unhandled activity - " + name + "!"); + log(ActivityManager.class, Log.ERR, "Unhandled activity - " + name + "!"); } return false; } diff --git a/Server/src/main/core/game/activity/Cutscene.kt b/Server/src/main/core/game/activity/Cutscene.kt index 8de3fe6f4..d1627936f 100644 --- a/Server/src/main/core/game/activity/Cutscene.kt +++ b/Server/src/main/core/game/activity/Cutscene.kt @@ -25,6 +25,7 @@ import core.api.Event import core.api.utils.PlayerCamera import core.tools.SystemLogger import core.game.world.GameWorld +import core.tools.Log /** * A utility class for making cutscenes. @@ -259,7 +260,7 @@ abstract class Cutscene(val player: Player) { try { endActions?.invoke() } catch (e: Exception) { - SystemLogger.logErr(this::class.java, "There's some bad nasty code in ${this::class.java.simpleName} end actions!") + log(this::class.java, Log.ERR, "There's some bad nasty code in ${this::class.java.simpleName} end actions!") e.printStackTrace() } return true @@ -347,7 +348,7 @@ abstract class Cutscene(val player: Player) { fun logCutscene(message: String) { if(ServerConstants.LOG_CUTSCENE) - SystemLogger.logInfo(this::class.java, "$message") + log(this::class.java, Log.FINE, "$message") } fun clearNPCs() { diff --git a/Server/src/main/core/game/bots/AIPlayer.java b/Server/src/main/core/game/bots/AIPlayer.java index 288a1a9bb..79b631c14 100644 --- a/Server/src/main/core/game/bots/AIPlayer.java +++ b/Server/src/main/core/game/bots/AIPlayer.java @@ -217,7 +217,7 @@ public class AIPlayer extends Player { } } } catch (FileNotFoundException e) { - System.out.println("Missing " + fileName); + e.printStackTrace(); } } @@ -349,7 +349,7 @@ public class AIPlayer extends Player { int meX = this.getLocation().getX(); int meY = this.getLocation().getY(); //int meX2 = this.getLocation().getX(); - //System.out.println("local " + meX + " real x? " + meX2 ); + ArrayList nodes = new ArrayList(); for (NPC npc : RegionManager.getLocalNpcs(this, range)) { if (entrys.contains(npc.getId())) @@ -381,7 +381,7 @@ public class AIPlayer extends Player { public Node getClosestNodeWithEntryAndDirection(int range, int entry, Direction direction) { ArrayList nodeList = getNodeInRange(range, entry); if (nodeList.isEmpty()) { - //System.out.println("nodelist empty"); + return null; } Node node = getClosestNodeinNodeListWithDirection(nodeList, direction); @@ -391,7 +391,7 @@ public class AIPlayer extends Player { public Node getClosestNodeWithEntry(int range, int entry) { ArrayList nodeList = getNodeInRange(range, entry); if (nodeList.isEmpty()) { - //System.out.println("nodelist empty"); + return null; } Node node = getClosestNodeinNodeList(nodeList); @@ -401,7 +401,7 @@ public class AIPlayer extends Player { public Node getClosestNodeWithEntry(int range, List entrys) { ArrayList nodeList = getNodeInRange(range, entrys); if (nodeList.isEmpty()) { - //System.out.println("nodelist empty"); + return null; } Node node = getClosestNodeinNodeList(nodeList); @@ -453,7 +453,7 @@ public class AIPlayer extends Player { private Node getClosestNodeinNodeListWithDirection(ArrayList nodes, Direction direction) { if (nodes.isEmpty()) { - //System.out.println("nodelist empty"); + return null; } @@ -471,7 +471,7 @@ public class AIPlayer extends Player { private Node getClosestNodeinNodeList(ArrayList nodes) { if (nodes.isEmpty()) { - //System.out.println("nodelist empty"); + return null; } @@ -528,7 +528,7 @@ public class AIPlayer extends Player { Repository.getPlayers().remove(player); return; } - //SystemLogger.logErr(this.getClass(), "Could not deregister AIP#" + uid + ": UID not added to the mapping!"); + //log(this.getClass(), Log.ERR, "Could not deregister AIP#" + uid + ": UID not added to the mapping!"); } @Override diff --git a/Server/src/main/core/game/bots/ScriptAPI.kt b/Server/src/main/core/game/bots/ScriptAPI.kt index 5cd9979a9..bcead0b32 100644 --- a/Server/src/main/core/game/bots/ScriptAPI.kt +++ b/Server/src/main/core/game/bots/ScriptAPI.kt @@ -42,6 +42,7 @@ import core.tools.SystemLogger import core.game.system.config.ItemConfigParser import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import core.tools.colorize import java.util.* import java.util.concurrent.CountDownLatch @@ -78,7 +79,7 @@ class ScriptAPI(private val bot: Player) { val opt: Option? = node.interaction.options.filter {it != null && it.name.equals(option, true) }.firstOrNull() if(opt == null){ - SystemLogger.logWarn(this::class.java, "Invalid option name provided: $option") + log(this::class.java, Log.WARN, "Invalid option name provided: $option") return } @@ -491,7 +492,6 @@ class ScriptAPI(private val bot: Player) { } val canSell = GrandExchange.addBotOffer(actualId, itemAmt) if (canSell && saleIsBigNews(actualId, itemAmt)) { - SystemLogger.logAI(this::class.java, "Offered $itemAmt of $actualId on the GE.") Repository.sendNews(SERVER_GE_NAME + " just offered " + itemAmt + " " + ItemDefinition.forId(actualId).name.toLowerCase() + " on the GE.") } bot.bank.remove(Item(id, itemAmt)) diff --git a/Server/src/main/core/game/dialogue/DialoguePlugin.java b/Server/src/main/core/game/dialogue/DialoguePlugin.java index 04710cfb2..e4967e2e9 100644 --- a/Server/src/main/core/game/dialogue/DialoguePlugin.java +++ b/Server/src/main/core/game/dialogue/DialoguePlugin.java @@ -7,11 +7,13 @@ import core.game.node.entity.player.Player; import core.plugin.Plugin; import core.plugin.PluginManifest; import core.plugin.PluginType; +import core.tools.Log; import core.tools.SystemLogger; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import static core.api.ContentAPIKt.log; import static core.api.DialUtilsKt.splitLines; import static core.tools.DialogueConstKt.DIALOGUE_INITIAL_OPTIONS_HANDLE; import static core.tools.DialogueConstKt.START_DIALOGUE; @@ -197,7 +199,7 @@ public abstract class DialoguePlugin implements Plugin { } if (npc == null) { - SystemLogger.logWarn(this.getClass(), + log(this.getClass(), Log.WARN, args[0].getClass().getSimpleName() + "Is not assigning an NPC. Whoever did that should fix it." ); diff --git a/Server/src/main/core/game/ge/GrandExchange.kt b/Server/src/main/core/game/ge/GrandExchange.kt index 86eb9293c..9e1d9dafe 100644 --- a/Server/src/main/core/game/ge/GrandExchange.kt +++ b/Server/src/main/core/game/ge/GrandExchange.kt @@ -11,6 +11,7 @@ import core.game.system.command.Privilege import core.game.system.config.ItemConfigParser import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import core.tools.colorize import java.lang.Integer.max import java.util.concurrent.LinkedBlockingDeque @@ -218,7 +219,7 @@ class GrandExchange : StartupListener, Commands { if ( offer.offerState != OfferState.PENDING || offer.uid != 0L ) { - SystemLogger.logWarn(this::class.java, "[GE] DISPATCH FAILURE: ${offer.offerState.name}, UID: ${offer.uid}") + log(this::class.java, Log.WARN, "[GE] DISPATCH FAILURE: ${offer.offerState.name}, UID: ${offer.uid}") return false } diff --git a/Server/src/main/core/game/global/action/DigSpadeHandler.java b/Server/src/main/core/game/global/action/DigSpadeHandler.java index 265fd30c1..31735e452 100644 --- a/Server/src/main/core/game/global/action/DigSpadeHandler.java +++ b/Server/src/main/core/game/global/action/DigSpadeHandler.java @@ -3,6 +3,7 @@ package core.game.global.action; import core.game.node.entity.player.Player; import core.game.system.communication.CommunicationInfo; import content.global.handlers.item.SpadeDigListener; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.task.Pulse; import core.game.world.GameWorld; @@ -12,6 +13,8 @@ import core.game.world.update.flag.context.Animation; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Handles digging with a spade. * @author Emperor @@ -63,7 +66,7 @@ public final class DigSpadeHandler { */ public static boolean register(Location location, DigAction action) { if (ACTIONS.containsKey(location)) { - SystemLogger.logErr(CommunicationInfo.class, "Already contained dig reward for location " + location + "."); + log(CommunicationInfo.class, Log.ERR, "Already contained dig reward for location " + location + "."); return false; } ACTIONS.put(location, action); diff --git a/Server/src/main/core/game/global/action/PickupHandler.kt b/Server/src/main/core/game/global/action/PickupHandler.kt index 0f9249f62..10d7205fd 100644 --- a/Server/src/main/core/game/global/action/PickupHandler.kt +++ b/Server/src/main/core/game/global/action/PickupHandler.kt @@ -39,7 +39,6 @@ object PickupHandler { return true } if (player.getAttribute("droppedItem:" + item.id, 0) > GameWorld.ticks) { //Splinter - SystemLogger.logAlert(this::class.java, "$player tried to do the drop & quick pick-up Ground Item dupe.") return true } if (item !is GroundSpawnLoader.GroundSpawn && item.isRemainPrivate && !item.droppedBy(player)) { diff --git a/Server/src/main/core/game/interaction/DestinationFlag.java b/Server/src/main/core/game/interaction/DestinationFlag.java index cbaa15045..a5d9a0165 100644 --- a/Server/src/main/core/game/interaction/DestinationFlag.java +++ b/Server/src/main/core/game/interaction/DestinationFlag.java @@ -115,7 +115,7 @@ public class DestinationFlag { if (dir != null) { return getDestination(mover, object, sizeX, sizeY, dir, 3); } - // System.out.println(dir); + return getDestination(mover, object, sizeX, sizeY, Direction.getLogicalDirection(object.getLocation(), mover.getLocation()), 0); } diff --git a/Server/src/main/core/game/interaction/InteractPlugin.java b/Server/src/main/core/game/interaction/InteractPlugin.java index 7092ea372..c82d65691 100644 --- a/Server/src/main/core/game/interaction/InteractPlugin.java +++ b/Server/src/main/core/game/interaction/InteractPlugin.java @@ -13,9 +13,12 @@ import core.game.world.update.flag.player.FaceLocationFlag; import core.net.packet.PacketRepository; import core.net.packet.context.InteractionOptionContext; import core.net.packet.out.InteractionOption; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; +import static core.api.ContentAPIKt.log; + /** * Handles interaction between nodes. * @author Emperor @@ -85,7 +88,7 @@ public class InteractPlugin { player.dispatch(new InteractionEvent(node, option.getName().toLowerCase())); } catch (Exception e){ e.printStackTrace(); - SystemLogger.logErr(this.getClass(), this.getClass().getName() + e.getMessage()); + log(this.getClass(), Log.ERR, this.getClass().getName() + e.getMessage()); } } @@ -118,7 +121,7 @@ public class InteractPlugin { } } catch (Exception e){ e.printStackTrace(); - SystemLogger.logErr(this.getClass(), this.getClass().getName() + e.getMessage()); + log(this.getClass(), Log.ERR, this.getClass().getName() + e.getMessage()); } return true; } @@ -149,7 +152,7 @@ public class InteractPlugin { player.getPacketDispatch().sendMessage("Nothing interesting happens."); } catch (Exception e){ e.printStackTrace(); - SystemLogger.logErr(this.getClass(), this.getClass().getName() + e.getMessage()); + log(this.getClass(), Log.ERR, this.getClass().getName() + e.getMessage()); } return true; } @@ -187,7 +190,7 @@ public class InteractPlugin { } } catch (Exception e){ e.printStackTrace(); - SystemLogger.logErr(this.getClass(), this.getClass().getName() + e.getMessage()); + log(this.getClass(), Log.ERR, this.getClass().getName() + e.getMessage()); } return true; } diff --git a/Server/src/main/core/game/interaction/MovementPulse.java b/Server/src/main/core/game/interaction/MovementPulse.java index 9b30b48d2..f0ceab9ad 100644 --- a/Server/src/main/core/game/interaction/MovementPulse.java +++ b/Server/src/main/core/game/interaction/MovementPulse.java @@ -233,9 +233,6 @@ public abstract class MovementPulse extends Pulse { return; } if(destination.getLocation() == null){ - SystemLogger.logAlert(this.getClass(), destination.getId() + " < ID"); - SystemLogger.logAlert(this.getClass(), destination.getName() + " < NAME"); - SystemLogger.logAlert(this.getClass(), "ASDAD"); return; } boolean inside = isInsideEntity(mover.getLocation()); diff --git a/Server/src/main/core/game/interaction/Option.java b/Server/src/main/core/game/interaction/Option.java index 9e5a47065..8c99a1b57 100644 --- a/Server/src/main/core/game/interaction/Option.java +++ b/Server/src/main/core/game/interaction/Option.java @@ -88,7 +88,7 @@ public final class Option { if (node instanceof Item) { return ItemDefinition.getOptionHandler(nodeId, name); } - System.out.println("Unhandled node type " + node + "!"); + return null; } diff --git a/Server/src/main/core/game/interaction/OptionHandler.java b/Server/src/main/core/game/interaction/OptionHandler.java index 3528289cd..057bdacdb 100644 --- a/Server/src/main/core/game/interaction/OptionHandler.java +++ b/Server/src/main/core/game/interaction/OptionHandler.java @@ -3,6 +3,7 @@ package core.game.interaction; import core.cache.def.impl.SceneryDefinition; import core.game.node.Node; import core.game.node.entity.player.Player; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.map.Location; import core.plugin.Plugin; @@ -10,6 +11,8 @@ import core.plugin.Plugin; import java.util.ArrayList; import java.util.List; +import static core.api.ContentAPIKt.log; + /** * Handles an interaction option. * @author Emperor @@ -71,7 +74,7 @@ public abstract class OptionHandler implements Plugin { final SceneryDefinition definition = SceneryDefinition.forId(wrapper); final List list = new ArrayList<>(20); if (definition.getChildrenIds() == null) { - SystemLogger.logErr(this.getClass(), "Null child wrapper in option handler wrapperId=" + wrapper); + log(this.getClass(), Log.ERR, "Null child wrapper in option handler wrapperId=" + wrapper); return new int[] { wrapper }; } for (int child : definition.getChildrenIds()) { diff --git a/Server/src/main/core/game/interaction/ScriptProcessor.kt b/Server/src/main/core/game/interaction/ScriptProcessor.kt index ede813aa1..ab3e2491b 100644 --- a/Server/src/main/core/game/interaction/ScriptProcessor.kt +++ b/Server/src/main/core/game/interaction/ScriptProcessor.kt @@ -10,6 +10,7 @@ import core.game.node.scenery.Scenery import core.game.world.GameWorld import core.game.world.map.Location import core.game.world.map.path.Pathfinder +import core.tools.Log import core.tools.SystemLogger import java.lang.Integer.max @@ -150,7 +151,7 @@ class ScriptProcessor(val entity: Entity) { continue if (entity !is Player) { toRemove.add(script) - SystemLogger.logErr(this::class.java, "Tried to queue an item UseWith interaction for a non-player!") + log(this::class.java, Log.ERR, "Tried to queue an item UseWith interaction for a non-player!") continue } if (script.nextExecution > GameWorld.ticks) @@ -273,7 +274,7 @@ class ScriptProcessor(val entity: Entity) { fun addToQueue(script: Script<*>, strength: QueueStrength) { if (script !is QueuedScript && script !is QueuedUseWith) { - SystemLogger.logErr(this::class.java, "Tried to queue ${script::class.java.simpleName} as a queueable script but it's not!") + log(this::class.java, Log.ERR, "Tried to queue ${script::class.java.simpleName} as a queueable script but it's not!") return } if (strength == QueueStrength.STRONG && entity is Player) { diff --git a/Server/src/main/core/game/interaction/UseWithHandler.java b/Server/src/main/core/game/interaction/UseWithHandler.java index fa2b5e393..ff80e7e84 100644 --- a/Server/src/main/core/game/interaction/UseWithHandler.java +++ b/Server/src/main/core/game/interaction/UseWithHandler.java @@ -8,6 +8,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.node.scenery.Scenery; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.task.Pulse; import core.game.world.map.Location; @@ -19,6 +20,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Handles the "use {@code node a} with {@code node b}" option. * @@ -210,7 +213,7 @@ public abstract class UseWithHandler implements Plugin { final SceneryDefinition definition = SceneryDefinition.forId(wrapper); final List list = new ArrayList<>(20); if (definition.getChildrenIds() == null) { - SystemLogger.logErr(this.getClass(), "Null child wrapper in option handler wrapperId=" + wrapper); + log(this.getClass(), Log.ERR, "Null child wrapper in option handler wrapperId=" + wrapper); return new int[]{wrapper}; } for (int child : definition.getChildrenIds()) { diff --git a/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt b/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt index 52b6ee92d..4caa84ea6 100644 --- a/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt +++ b/Server/src/main/core/game/node/entity/combat/CombatSwingHandler.kt @@ -11,6 +11,7 @@ import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.player.link.prayer.PrayerType import core.game.node.entity.skill.Skills import content.global.skill.summoning.familiar.Familiar +import core.api.log import core.game.world.map.Direction import core.game.world.map.Location import core.game.world.map.RegionManager @@ -21,6 +22,7 @@ import core.game.world.update.flag.context.Animation import core.tools.RandomFunction import core.tools.SystemLogger import core.game.system.config.ItemConfigParser +import core.tools.Log import java.util.* import kotlin.math.floor @@ -187,7 +189,7 @@ abstract class CombatSwingHandler(var type: CombatStyle?) { val block = floor(101 - ratio) val acc = Math.random() * accuracy val def = Math.random() * block - return (acc > def).also { if(entity?.username?.toLowerCase() == "test10") SystemLogger.logInfo(this::class.java, "Should hit: $it") } + return (acc > def).also { if(entity?.username?.toLowerCase() == "test10") log(this::class.java, Log.FINE, "Should hit: $it") } } /** @@ -597,7 +599,7 @@ abstract class CombatSwingHandler(var type: CombatStyle?) { specialHandlers = HashMap() } if (specialHandlers!!.containsKey(itemId)) { - SystemLogger.logErr(this::class.java, "Already contained special attack handler for item " + itemId + " - [old=" + specialHandlers!![itemId]!!::class.java.simpleName + ", new=" + handler.javaClass.simpleName + "].") + log(this::class.java, Log.ERR, "Already contained special attack handler for item " + itemId + " - [old=" + specialHandlers!![itemId]!!::class.java.simpleName + ", new=" + handler.javaClass.simpleName + "].") return false } return specialHandlers!!.put(itemId, handler) == null diff --git a/Server/src/main/core/game/node/entity/combat/MeleeSwingHandler.kt b/Server/src/main/core/game/node/entity/combat/MeleeSwingHandler.kt index b54533a6b..608d07b88 100644 --- a/Server/src/main/core/game/node/entity/combat/MeleeSwingHandler.kt +++ b/Server/src/main/core/game/node/entity/combat/MeleeSwingHandler.kt @@ -211,7 +211,7 @@ open class MeleeSwingHandler override fun getSetMultiplier(e: Entity?, skillId: Int): Double { if (e!!.properties.armourSet === ArmourSet.DHAROK && skillId == Skills.STRENGTH) { -// System.out.println("Fiist number -> " + 1.0 + ((e.getSkills().getMaximumLifepoints() - e.getSkills().getLifepoints()) * 0.01)); + return 1.0 + (e!!.skills.maximumLifepoints - e.skills.lifepoints) * 0.01 } if(e is Player && e.isWearingVoid(CombatStyle.MELEE) && (skillId == Skills.ATTACK || skillId == Skills.STRENGTH)) { diff --git a/Server/src/main/core/game/node/entity/combat/RangeSwingHandler.kt b/Server/src/main/core/game/node/entity/combat/RangeSwingHandler.kt index 61593fd54..665171f59 100644 --- a/Server/src/main/core/game/node/entity/combat/RangeSwingHandler.kt +++ b/Server/src/main/core/game/node/entity/combat/RangeSwingHandler.kt @@ -1,6 +1,7 @@ package core.game.node.entity.combat import content.global.skill.skillcapeperks.SkillcapePerks +import core.api.log import core.game.container.impl.EquipmentContainer import core.game.node.entity.Entity import core.game.node.entity.combat.equipment.* @@ -20,6 +21,7 @@ import core.game.world.update.flag.context.Graphics import core.tools.RandomFunction import core.tools.SystemLogger import core.game.world.GameWorld +import core.tools.Log import java.util.* import kotlin.math.ceil import kotlin.math.floor @@ -75,7 +77,7 @@ open class RangeSwingHandler } var hit = 0 if (isAccurateImpact(entity, victim, CombatStyle.RANGE)) { - val max = calculateHit(entity, victim, 1.0).also { if(entity?.name?.toLowerCase() == "test10") SystemLogger.logInfo(this::class.java, "Damage: $it") } + val max = calculateHit(entity, victim, 1.0).also { if(entity?.name?.toLowerCase() == "test10") log(this::class.java, Log.FINE, "Damage: $it") } state.maximumHit = max hit = RandomFunction.random(max + 1) } @@ -106,7 +108,7 @@ open class RangeSwingHandler if (entity is Player) { val rw = RangeWeapon.get(entity.equipment.getNew(3).id) if (rw == null) { - SystemLogger.logErr(this::class.java, "Unhandled range weapon used - [item id=" + entity.equipment.getNew(3).id + "].") + log(this::class.java, Log.ERR, "Unhandled range weapon used - [item id=" + entity.equipment.getNew(3).id + "].") return } w = Weapon(entity.equipment[3], rw.ammunitionSlot, entity.equipment.getNew(rw.ammunitionSlot)) diff --git a/Server/src/main/core/game/node/entity/combat/equipment/RangeWeapon.java b/Server/src/main/core/game/node/entity/combat/equipment/RangeWeapon.java index e82601410..13265303a 100644 --- a/Server/src/main/core/game/node/entity/combat/equipment/RangeWeapon.java +++ b/Server/src/main/core/game/node/entity/combat/equipment/RangeWeapon.java @@ -95,7 +95,7 @@ public final class RangeWeapon { return false; } NodeList nodeList = doc.getDocumentElement().getChildNodes(); - System.out.println("Loading range weapon info..."); + for (short i = 1; i < nodeList.getLength(); i += 2) { Node n = nodeList.item(i); if (n != null) { @@ -131,7 +131,7 @@ public final class RangeWeapon { } } } - System.out.println("Loaded " + RANGE_WEAPONS.size() + " range weapon definitions."); + return true; } diff --git a/Server/src/main/core/game/node/entity/combat/spell/SpellType.java b/Server/src/main/core/game/node/entity/combat/spell/SpellType.java index 508400c17..0f151f236 100644 --- a/Server/src/main/core/game/node/entity/combat/spell/SpellType.java +++ b/Server/src/main/core/game/node/entity/combat/spell/SpellType.java @@ -107,10 +107,10 @@ public enum SpellType { BARRAGE(1.4) { @Override public int getImpactAmount(Entity e, Entity victim, int base) { - System.out.println("Attacker - >" + e.getName()); - System.out.println("Victim - >" + victim.getName()); - System.out.println("Accuracy Mod -> " + getAccuracyMod()); - System.out.println("Base Mod -> " + base); + + + + return 26 + base; } }, diff --git a/Server/src/main/core/game/node/entity/impl/WalkingQueue.java b/Server/src/main/core/game/node/entity/impl/WalkingQueue.java index 449b37841..4bfa60ba8 100644 --- a/Server/src/main/core/game/node/entity/impl/WalkingQueue.java +++ b/Server/src/main/core/game/node/entity/impl/WalkingQueue.java @@ -8,11 +8,14 @@ import core.game.world.map.Direction; import core.game.world.map.Location; import core.game.world.map.Point; import core.game.world.map.RegionManager; +import core.tools.Log; import core.tools.SystemLogger; import java.util.Deque; import java.util.LinkedList; +import static core.api.ContentAPIKt.log; + /** * The walking queue. * @author Emperor @@ -375,7 +378,7 @@ public final class WalkingQueue { Location loc = entity.getLocation(); if (loc == null) { - SystemLogger.logErr(this.getClass(), + log(this.getClass(), Log.ERR, "The entity location provided was null." + "Are you sure anything down the stack trace isn't providing an NPC with a null location?" ); diff --git a/Server/src/main/core/game/node/entity/npc/AbstractNPC.java b/Server/src/main/core/game/node/entity/npc/AbstractNPC.java index b0731b45b..dffe4e38c 100644 --- a/Server/src/main/core/game/node/entity/npc/AbstractNPC.java +++ b/Server/src/main/core/game/node/entity/npc/AbstractNPC.java @@ -1,5 +1,6 @@ package core.game.node.entity.npc; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.map.Location; import core.plugin.Plugin; @@ -7,6 +8,8 @@ import core.plugin.Plugin; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Used as superclass for "special NPC" plugins. * @author Emperor @@ -63,7 +66,7 @@ public abstract class AbstractNPC extends NPC implements Plugin { if (mapping.containsKey(id)) { String name = mapping.get(id).getClass().getSimpleName(); if (name != getClass().getSimpleName()) { - SystemLogger.logErr(this.getClass(), "[" + getClass().getSimpleName() + "] - Warning: Mapping already contained NPC id " + id + "! (" + name + ")"); + log(this.getClass(), Log.ERR, "[" + getClass().getSimpleName() + "] - Warning: Mapping already contained NPC id " + id + "! (" + name + ")"); continue; } } diff --git a/Server/src/main/core/game/node/entity/player/Player.java b/Server/src/main/core/game/node/entity/player/Player.java index b20f86de1..6d5af46da 100644 --- a/Server/src/main/core/game/node/entity/player/Player.java +++ b/Server/src/main/core/game/node/entity/player/Player.java @@ -56,9 +56,7 @@ import core.net.packet.context.SkillContext; import core.net.packet.out.BuildDynamicScene; import core.net.packet.out.SkillLevel; import core.net.packet.out.UpdateSceneGraph; -import core.tools.RandomFunction; -import core.tools.StringUtils; -import core.tools.TickUtilsKt; +import core.tools.*; import kotlin.Unit; import kotlin.jvm.functions.Function1; import org.rs09.consts.Items; @@ -73,7 +71,6 @@ import core.game.node.entity.combat.graves.GraveController; import core.game.node.entity.player.info.login.PlayerSaver; import core.game.node.entity.state.State; import core.game.node.entity.state.StateRepository; -import core.tools.SystemLogger; import core.game.world.GameWorld; import core.game.world.repository.Repository; import core.game.world.update.MapChunkRenderer; @@ -318,6 +315,8 @@ public class Player extends Entity { private int archeryTotal = 0; + public byte[] opCounts = new byte[255]; + /** * Constructs a new {@code Player} {@code Object}. * @param details The player's details. @@ -333,7 +332,7 @@ public class Player extends Entity { @Override public void init() { if(!artificial) - SystemLogger.logInfo(this.getClass(), getUsername() + " initialising..."); + log(this.getClass(), Log.INFO, getUsername() + " initialising..."); if (!artificial) { getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); getDetails().getSession().setObject(this); @@ -528,6 +527,7 @@ public class Player extends Entity { PlayerParser.saveImmediately(this); removeAttribute("flagged-for-save"); } + Arrays.fill(opCounts, (byte) 0); } @Override diff --git a/Server/src/main/core/game/node/entity/player/info/PlayerMonitor.kt b/Server/src/main/core/game/node/entity/player/info/PlayerMonitor.kt index 2b5f6ed7b..8e0a1d950 100644 --- a/Server/src/main/core/game/node/entity/player/info/PlayerMonitor.kt +++ b/Server/src/main/core/game/node/entity/player/info/PlayerMonitor.kt @@ -8,6 +8,7 @@ import core.integrations.discord.Discord import kotlinx.coroutines.* import org.sqlite.SQLiteDataSource import core.ServerConstants +import core.tools.Log import core.tools.SystemLogger import java.io.File import java.sql.Connection @@ -138,7 +139,7 @@ object PlayerMonitor { } @JvmStatic fun flushRemainingEventsImmediately() { - SystemLogger.logInfo(this::class.java, "Flushing player log events...") + core.api.log(this::class.java, Log.FINE, "Flushing player log events...") val path = ServerConstants.LOGS_PATH + "playerlogs.db" if (!File(path).exists()) { createSqliteDatabase(path) diff --git a/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java b/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java index 0340ce749..addc10d9e 100644 --- a/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java +++ b/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java @@ -14,6 +14,7 @@ import core.plugin.Plugin; import core.ServerConstants; import core.game.interaction.InteractionListeners; import content.global.handlers.iface.RulesAndInfo; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; import core.game.world.repository.Repository; @@ -26,6 +27,8 @@ import java.util.Random; import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; +import static core.api.ContentAPIKt.log; + /** * Sends the login configuration packets. @@ -209,7 +212,7 @@ public final class LoginConfiguration { */ public static final void config(final Player player) { if(!player.isArtificial()) - SystemLogger.logInfo(LoginConfiguration.class, "configuring player " + player.getUsername()); + log(LoginConfiguration.class, Log.INFO, "configuring player " + player.getUsername()); player.getInventory().refresh(); player.getEquipment().refresh(); player.getSkills().refresh(); @@ -226,7 +229,7 @@ public final class LoginConfiguration { player.getEmoteManager().refresh(); player.getInterfaceManager().openInfoBars(); if(!player.isArtificial()) - SystemLogger.logInfo(LoginConfiguration.class, "finished configuring player " + player.getUsername()); + log(LoginConfiguration.class, Log.INFO, "finished configuring player " + player.getUsername()); } /** diff --git a/Server/src/main/core/game/node/entity/player/info/login/PlayerParser.java b/Server/src/main/core/game/node/entity/player/info/login/PlayerParser.java index a0fd37aae..6eb56ff4c 100644 --- a/Server/src/main/core/game/node/entity/player/info/login/PlayerParser.java +++ b/Server/src/main/core/game/node/entity/player/info/login/PlayerParser.java @@ -2,10 +2,13 @@ package core.game.node.entity.player.info.login; import core.game.node.entity.player.Player; import core.ServerConstants; +import core.tools.Log; import core.tools.SystemLogger; import java.io.*; +import static core.api.ContentAPIKt.log; + /** * Class used to abstract the process of loading a player save. * @author Ceikry @@ -61,7 +64,7 @@ public final class PlayerParser { assert os != null; os.close(); } catch (Exception f){ - SystemLogger.logWarn(PlayerParser.class, "Unable to close file copiers in PlayerParser.java line 216."); + log(PlayerParser.class, Log.ERR, "Unable to close file copiers in PlayerParser.java line 216."); f.printStackTrace(); } } diff --git a/Server/src/main/core/game/node/entity/player/info/login/PlayerSaveParser.kt b/Server/src/main/core/game/node/entity/player/info/login/PlayerSaveParser.kt index a86fe536e..5b4e37007 100644 --- a/Server/src/main/core/game/node/entity/player/info/login/PlayerSaveParser.kt +++ b/Server/src/main/core/game/node/entity/player/info/login/PlayerSaveParser.kt @@ -14,10 +14,12 @@ import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log import core.game.node.entity.combat.graves.GraveController import core.game.node.entity.combat.graves.GraveType import core.tools.SystemLogger import core.game.world.GameWorld +import core.tools.Log import java.io.File import java.io.FileReader import java.util.* @@ -45,7 +47,7 @@ class PlayerSaveParser(val player: Player) { { reader = FileReader(JSON) } - reader ?: SystemLogger.logWarn(this::class.java, "Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false } + reader ?: log(this::class.java, Log.WARN, "Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false } if (read) { saveFile = parser.parse(reader) as JSONObject } @@ -120,7 +122,7 @@ class PlayerSaveParser(val player: Player) { "long" -> attr["value"].toString().toLong() "bool" -> attr["value"] as Boolean "byte" -> Base64.getDecoder().decode(attr["value"].toString())[0] - else -> null.also { SystemLogger.logWarn(this::class.java, "Invalid data type for key: $key in PlayerSaveParser.kt Line 115") } + else -> null.also { log(this::class.java, Log.WARN, "Invalid data type for key: $key in PlayerSaveParser.kt Line 115") } }) } } else { @@ -179,7 +181,6 @@ class PlayerSaveParser(val player: Player) { fun parseStates() { player.states.clear() - SystemLogger.logErr(this::class.java, "Parsing states") if (saveFile!!.containsKey("states")) { val states: JSONArray = saveFile!!["states"] as JSONArray for (state in states) { diff --git a/Server/src/main/core/game/node/entity/player/info/login/PlayerSaver.kt b/Server/src/main/core/game/node/entity/player/info/login/PlayerSaver.kt index 59d00d48f..0d7df18c4 100644 --- a/Server/src/main/core/game/node/entity/player/info/login/PlayerSaver.kt +++ b/Server/src/main/core/game/node/entity/player/info/login/PlayerSaver.kt @@ -1,17 +1,20 @@ package core.game.node.entity.player.info.login +import content.global.skill.summoning.familiar.BurdenBeast +import content.global.skill.summoning.pet.Pet +import core.ServerConstants import core.api.PersistPlayer +import core.api.log import core.game.container.Container import core.game.node.entity.player.Player import core.game.node.entity.player.link.IronmanMode import core.game.node.entity.skill.Skills -import content.global.skill.summoning.familiar.BurdenBeast -import content.global.skill.summoning.pet.Pet +import core.tools.Log +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext import org.json.simple.JSONArray import org.json.simple.JSONObject -import core.ServerConstants -import core.tools.SystemLogger import java.io.File import java.io.FileWriter import java.io.IOException @@ -59,24 +62,31 @@ class PlayerSaver (val player: Player){ } fun save() = runBlocking { if (!player.details.saveParsed) return@runBlocking - val manager = ScriptEngineManager() - val scriptEngine = manager.getEngineByName("JavaScript") - if (scriptEngine == null) { - SystemLogger.logErr(this::class.java, "Cannot save: Failed to load ScriptEngineManager, this is a known issue on non Java-11 versions. Set your Java version to 11 to avoid further bugs!") - return@runBlocking - } - scriptEngine.put("jsonString", populate().toJSONString()) - scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)") - val prettyPrintedJson = scriptEngine["result"] as String + val json: String + if (ServerConstants.JAVA_VERSION < 11) { + val manager = ScriptEngineManager() + val scriptEngine = manager.getEngineByName("JavaScript") + if (scriptEngine == null) { + log(this::class.java, Log.ERR, "Cannot save: Failed to load ScriptEngineManager, this is a known issue on non Java-11 versions. Set your Java version to 11 to avoid further bugs!") + return@runBlocking + } + scriptEngine.put("jsonString", populate().toJSONString()) + scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)") + json = scriptEngine["result"] as String + } else json = populate().toJSONString() try { if(!File("${ServerConstants.PLAYER_SAVE_PATH}${player.name}.json").exists()){ File("${ServerConstants.PLAYER_SAVE_PATH}").mkdirs() - File("${ServerConstants.PLAYER_SAVE_PATH}${player.name}.json").createNewFile() + withContext(Dispatchers.IO) { + File("${ServerConstants.PLAYER_SAVE_PATH}${player.name}.json").createNewFile() + } } - FileWriter("${ServerConstants.PLAYER_SAVE_PATH}${player.name}.json").use { file -> - file.write(prettyPrintedJson) - file.flush() + withContext(Dispatchers.IO) { + FileWriter("${ServerConstants.PLAYER_SAVE_PATH}${player.name}.json").use { file -> + file.write(json) + file.flush() + } } } catch (e: IOException) { e.printStackTrace() @@ -106,7 +116,7 @@ class PlayerSaver (val player: Player){ is Short -> "short" is String -> "str" is Byte -> "byte" - else -> "null".also { SystemLogger.logWarn(this::class.java, "Invalid attribute type for key: $key in PlayerSaver.kt Line 115") } + else -> "null".also { log(this::class.java, Log.WARN, "Invalid attribute type for key: $key in PlayerSaver.kt Line 115") } } attr.put("type",type) attr.put("key",key) diff --git a/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java b/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java index 47574f569..8da9eacf5 100644 --- a/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java +++ b/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java @@ -12,10 +12,12 @@ import core.net.packet.context.WindowsPaneContext; import core.net.packet.out.CloseInterface; import core.net.packet.out.Interface; import core.net.packet.out.WindowsPane; +import core.tools.Log; import org.rs09.consts.Components; import content.region.misc.tutisland.handlers.TutorialStage; import core.tools.SystemLogger; +import static core.api.ContentAPIKt.log; /** @@ -124,7 +126,7 @@ public final class InterfaceManager { public Component openWindowsPane(Component windowsPane, boolean overlap) { this.windowsPane = windowsPane; if (windowsPane.getDefinition().getType() != InterfaceType.WINDOW_PANE) { - SystemLogger.logErr(this.getClass(), "Set interface type to WINDOW_PANE for component " + windowsPane.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to WINDOW_PANE for component " + windowsPane.getId() + ", definition requires updating!"); windowsPane.getDefinition().setType(InterfaceType.WINDOW_PANE); } @@ -140,7 +142,7 @@ public final class InterfaceManager { public void openWindowsPane(Component windowsPane, int type) { this.windowsPane = windowsPane; if (windowsPane.getDefinition().getType() != InterfaceType.WINDOW_PANE) { - SystemLogger.logErr(this.getClass(), "Set interface type to WINDOW_PANE for component " + windowsPane.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to WINDOW_PANE for component " + windowsPane.getId() + ", definition requires updating!"); windowsPane.getDefinition().setType(InterfaceType.SINGLE_TAB); } @@ -268,7 +270,7 @@ public final class InterfaceManager { */ public Component openSingleTab(Component component) { if (component.getDefinition().getType() != InterfaceType.SINGLE_TAB) { - SystemLogger.logErr(this.getClass(), "Set interface type to SINGLE_TAB for component " + component.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to SINGLE_TAB for component " + component.getId() + ", definition requires updating!"); component.getDefinition().setType(InterfaceType.SINGLE_TAB); } component.open(player); @@ -453,11 +455,11 @@ public final class InterfaceManager { throw new IllegalStateException("Attack tab can only be instanced as " + WeaponInterface.class.getCanonicalName() + "!"); } if (component.getDefinition().getTabIndex() != slot) { - SystemLogger.logErr(this.getClass(), "Set tab index to " + slot + " for component " + component.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set tab index to " + slot + " for component " + component.getId() + ", definition requires updating!"); component.getDefinition().setTabIndex(slot); } if (component.getDefinition().getType() != InterfaceType.TAB) { - SystemLogger.logErr(this.getClass(), "Set interface type to TAB for component " + component.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to TAB for component " + component.getId() + ", definition requires updating!"); component.getDefinition().setType(InterfaceType.TAB); } component.open(player); @@ -470,7 +472,7 @@ public final class InterfaceManager { */ public void openTab(Component component) { if (component.getDefinition().getTabIndex() < 0) { - SystemLogger.logErr(this.getClass(), "No component definitions found for tab " + component.getId() + "!"); + log(this.getClass(), Log.WARN, "No component definitions found for tab " + component.getId() + "!"); return; } openTab(component.getDefinition().getTabIndex(), component); @@ -500,7 +502,7 @@ public final class InterfaceManager { } else { chatbox = component; if (chatbox.getDefinition().getType() != InterfaceType.DIALOGUE && chatbox.getDefinition().getType() != InterfaceType.CHATBOX && chatbox.getDefinition().getType() != InterfaceType.CS_CHATBOX) { - SystemLogger.logErr(this.getClass(), "Set interface type to CHATBOX for component " + component.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to CHATBOX for component " + component.getId() + ", definition requires updating!"); chatbox.getDefinition().setType(InterfaceType.DIALOGUE); } chatbox.open(player); @@ -606,7 +608,7 @@ public final class InterfaceManager { } overlay = component; if (overlay.getDefinition().getType() != InterfaceType.OVERLAY) { - SystemLogger.logErr(this.getClass(), "Set interface type to OVERLAY for component " + component.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to OVERLAY for component " + component.getId() + ", definition requires updating!"); overlay.getDefinition().setType(InterfaceType.OVERLAY); overlay.getDefinition().setWalkable(true); } @@ -623,7 +625,7 @@ public final class InterfaceManager { } wildyOverlay = component; if (wildyOverlay.getDefinition().getType() != InterfaceType.WILDERNESS_OVERLAY) { - SystemLogger.logErr(this.getClass(), "Set interface type to WILDERNESS_OVERLAY for component " + component.getId() + ", definition requires updating!"); + log(this.getClass(), Log.WARN, "Set interface type to WILDERNESS_OVERLAY for component " + component.getId() + ", definition requires updating!"); wildyOverlay.getDefinition().setType(InterfaceType.WILDERNESS_OVERLAY); wildyOverlay.getDefinition().setWalkable(true); } diff --git a/Server/src/main/core/game/node/entity/player/link/PacketDispatch.java b/Server/src/main/core/game/node/entity/player/link/PacketDispatch.java index 33f6f29e3..b0c890b5c 100644 --- a/Server/src/main/core/game/node/entity/player/link/PacketDispatch.java +++ b/Server/src/main/core/game/node/entity/player/link/PacketDispatch.java @@ -3,6 +3,7 @@ package core.game.node.entity.player.link; import core.game.node.entity.player.Varp; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.task.Pulse; import core.game.world.GameWorld; @@ -18,6 +19,8 @@ import core.net.packet.context.*; import core.net.packet.context.DisplayModelContext.ModelType; import core.net.packet.out.*; +import static core.api.ContentAPIKt.log; + /** * Represents the class used to dispatching packets. * @author Emperor @@ -64,7 +67,7 @@ public final class PacketDispatch { return; } if (message.length() > 255) { - SystemLogger.logErr(this.getClass(), "Message length out of bounds (" + message + ")!"); + log(this.getClass(), Log.ERR, "Message length out of bounds (" + message + ")!"); message = message.substring(0, 255); } PacketRepository.send(GameMessage.class, new GameMessageContext(player, message)); diff --git a/Server/src/main/core/game/node/entity/player/link/music/MusicPlayer.java b/Server/src/main/core/game/node/entity/player/link/music/MusicPlayer.java index 1ef960fab..e72f4f2d3 100644 --- a/Server/src/main/core/game/node/entity/player/link/music/MusicPlayer.java +++ b/Server/src/main/core/game/node/entity/player/link/music/MusicPlayer.java @@ -131,7 +131,7 @@ public final class MusicPlayer { int listIndex = entry.getIndex(); int index = (listIndex + 1) / 32; if (index >= CONFIG_IDS.length) { - System.out.println("Index out of range [index=" + index + ", list=" + listIndex + ", id=" + entry.getId() + ", name=" + entry.getName() + "]."); + continue; } values[index] |= 1 << (listIndex - (index * 32)); @@ -188,7 +188,7 @@ public final class MusicPlayer { public void unlock(int id, boolean play) { MusicEntry entry = MusicEntry.forId(id); if (entry == null) { -// System.out.println("Could not find music entry for id " + id + "!"); + return; } if (!unlocked.containsKey(entry.getIndex())) { diff --git a/Server/src/main/core/game/node/entity/player/link/quest/QuestRepository.java b/Server/src/main/core/game/node/entity/player/link/quest/QuestRepository.java index 421d28c1f..427ec4f59 100644 --- a/Server/src/main/core/game/node/entity/player/link/quest/QuestRepository.java +++ b/Server/src/main/core/game/node/entity/player/link/quest/QuestRepository.java @@ -2,6 +2,7 @@ package core.game.node.entity.player.link.quest; import core.game.node.entity.player.Player; +import core.tools.Log; import core.tools.SystemLogger; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -10,6 +11,8 @@ import java.util.HashMap; import java.util.TreeMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Manages the systems/players quest repository. * @@ -73,7 +76,7 @@ public final class QuestRepository { player.varpManager.get(config[0]).setVarbit(0,config[1]).send(player); player.varpManager.flagSave(config[0], false); player.setAttribute("/save:quest-varps-converted",true); -// System.out.println(quest.getName() + " - > stage = " + getStage(quest) + " - configs = { " + config[0] + " " + config[1] + " }"); + } } else { for(Quest quest : QUESTS.values()){ @@ -98,7 +101,7 @@ public final class QuestRepository { if(oldStage < stage) { quests.put(quest.getIndex(), stage); } else { - SystemLogger.logWarn(this.getClass(), String.format("Nonmonotonic QuestRepository.setStage call for player \"%s\", quest \"%s\", old stage %d, new stage %d", player.getName(), quest.getName(), oldStage, stage)); + log(this.getClass(), Log.WARN, String.format("Nonmonotonic QuestRepository.setStage call for player \"%s\", quest \"%s\", old stage %d, new stage %d", player.getName(), quest.getName(), oldStage, stage)); } } @@ -202,7 +205,7 @@ public final class QuestRepository { public boolean isComplete(String name) { Quest quest = getQuest(name); if (quest == null) { - SystemLogger.logErr(this.getClass(), "Error can't check if quest is complete for " + name); + log(this.getClass(), Log.ERR, "Error can't check if quest is complete for " + name); return false; } return quest.getStage(player) >= 100; @@ -217,7 +220,7 @@ public final class QuestRepository { public boolean hasStarted(String name) { Quest quest = getQuest(name); if (quest == null) { - SystemLogger.logErr(this.getClass(), "Error can't check if quest is complete for " + name); + log(this.getClass(), Log.ERR, "Error can't check if quest is complete for " + name); return false; } return quest.getStage(player) > 0; diff --git a/Server/src/main/core/game/node/entity/skill/Skills.java b/Server/src/main/core/game/node/entity/skill/Skills.java index 35175282e..e2502a07f 100644 --- a/Server/src/main/core/game/node/entity/skill/Skills.java +++ b/Server/src/main/core/game/node/entity/skill/Skills.java @@ -650,7 +650,7 @@ public final class Skills { Player assister = assist.getPlayer(); int index = assist.getSkillIndex(slot); if (index != -1 && !assist.isRestricted()) { - // System.out.println(index + ", " + + // assist.getSkills()[index] + ", " + SKILL_NAME[slot]); if (assist.getSkills()[index]) { int assistLevel = assister.getSkills().getLevel(slot); diff --git a/Server/src/main/core/game/node/scenery/SceneryBuilder.java b/Server/src/main/core/game/node/scenery/SceneryBuilder.java index 550fb14d1..6e2019747 100644 --- a/Server/src/main/core/game/node/scenery/SceneryBuilder.java +++ b/Server/src/main/core/game/node/scenery/SceneryBuilder.java @@ -2,6 +2,7 @@ package core.game.node.scenery; import core.game.node.item.GroundItem; import core.game.node.item.GroundItemManager; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.task.Pulse; import core.game.world.GameWorld; @@ -10,6 +11,8 @@ import core.game.world.map.RegionManager; import core.game.world.map.build.LandscapeParser; import core.game.world.update.flag.chunk.ObjectUpdateFlag; +import static core.api.ContentAPIKt.log; + /** * An aiding class for object constructing/removing. * @@ -44,7 +47,7 @@ public final class SceneryBuilder { Scenery current = LandscapeParser.removeScenery(remove); if (current == null) { if (GameWorld.getSettings().isDevMode()) { - SystemLogger.logErr(SceneryBuilder.class, "Object could not be replaced - object to remove is invalid."); + log(SceneryBuilder.class, Log.ERR, "Object could not be replaced - object to remove is invalid."); } return false; } @@ -119,7 +122,7 @@ public final class SceneryBuilder { Scenery current = LandscapeParser.removeScenery(remove); if (current == null) { if (GameWorld.getSettings().isDevMode()) { - SystemLogger.logErr(SceneryBuilder.class, "Object could not be replaced - object to remove is invalid."); + log(SceneryBuilder.class, Log.ERR, "Object could not be replaced - object to remove is invalid."); } return false; } diff --git a/Server/src/main/core/game/shops/Shops.kt b/Server/src/main/core/game/shops/Shops.kt index 1e2e3af62..88d5190ed 100644 --- a/Server/src/main/core/game/shops/Shops.kt +++ b/Server/src/main/core/game/shops/Shops.kt @@ -17,6 +17,7 @@ import core.game.interaction.InterfaceListener import core.tools.SystemLogger import core.game.system.command.Privilege import core.tools.END_DIALOGUE +import core.tools.Log import java.io.FileReader /** @@ -41,7 +42,7 @@ class Shops : StartupListener, TickListener, InteractionListener, InterfaceListe fun logShop(msg: String) { - SystemLogger.logInfo(this::class.java, "[SHOPS] $msg") + log(this::class.java, Log.FINE, "[SHOPS] $msg") } fun parseStock(stock: String, id: Int): ArrayList{ @@ -57,7 +58,7 @@ class Shops : StartupListener, TickListener, InteractionListener, InterfaceListe amount = "-1" val item = tokens[0].toInt() if(idsInStock[item] != null) { - SystemLogger.logWarn(this::class.java, "[SHOPS] MALFORMED STOCK IN SHOP ID $id FOR ITEM $item") + log(this::class.java, Log.WARN, "[SHOPS] MALFORMED STOCK IN SHOP ID $id FOR ITEM $item") items.forEach { if(it.itemId == item) { it.amount += amount.toInt() return@map diff --git a/Server/src/main/core/game/system/SystemShutdownHook.java b/Server/src/main/core/game/system/SystemShutdownHook.java index 1736c293e..850de35ed 100644 --- a/Server/src/main/core/game/system/SystemShutdownHook.java +++ b/Server/src/main/core/game/system/SystemShutdownHook.java @@ -1,7 +1,10 @@ package core.game.system; +import core.tools.Log; import core.tools.SystemLogger; +import static core.api.ContentAPIKt.log; + /** * Handles the shutdown hook. * @author Emperor @@ -13,7 +16,7 @@ public final class SystemShutdownHook implements Runnable { if (SystemManager.isTerminated()) { return; } - SystemLogger.logInfo(this.getClass(), "[SystemShutdownHook] Terminating..."); + log(this.getClass(), Log.INFO, "Terminating..."); SystemManager.flag(SystemState.TERMINATED); } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/SystemTermination.java b/Server/src/main/core/game/system/SystemTermination.java index 5c7fb2665..a1557f381 100644 --- a/Server/src/main/core/game/system/SystemTermination.java +++ b/Server/src/main/core/game/system/SystemTermination.java @@ -8,6 +8,7 @@ import core.ServerConstants; import core.ServerStore; import core.game.bots.AIRepository; import core.game.node.entity.player.info.PlayerMonitor; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; import core.game.world.repository.Repository; @@ -15,6 +16,8 @@ import core.game.world.repository.Repository; import java.io.File; import java.util.Iterator; +import static core.api.ContentAPIKt.log; + /** * Handles the terminating of the system. * @author Emperor @@ -35,14 +38,14 @@ public final class SystemTermination { * Terminates the system safely. */ public void terminate() { - SystemLogger.logInfo(this.getClass(), "Initializing termination sequence - do not shutdown!"); + log(this.getClass(), Log.INFO, "Initializing termination sequence - do not shutdown!"); try { - SystemLogger.logInfo(this.getClass(), "Shutting down networking..."); + log(this.getClass(), Log.INFO, "Shutting down networking..."); Server.setRunning(false); - SystemLogger.logInfo(this.getClass(), "Stopping all bots..."); + log(this.getClass(), Log.INFO, "Stopping all bots..."); AIRepository.clearAllBots(); Server.getReactor().terminate(); - SystemLogger.logInfo(this.getClass(), "Stopping all pulses..."); + log(this.getClass(), Log.INFO, "Stopping all pulses..."); GameWorld.getMajorUpdateWorker().stop(); for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { try { @@ -72,7 +75,7 @@ public final class SystemTermination { } catch (Throwable e) { e.printStackTrace(); } - SystemLogger.logInfo(this.getClass(), "Server successfully terminated!"); + log(this.getClass(), Log.INFO, "Server successfully terminated!"); } /** @@ -81,7 +84,7 @@ public final class SystemTermination { */ public void save(String directory) { File file = new File(directory); - SystemLogger.logInfo(this.getClass(), "Saving data [dir="+ file.getAbsolutePath() + "]..."); + log(this.getClass(), Log.INFO, "Saving data [dir="+ file.getAbsolutePath() + "]..."); if (!file.isDirectory()) { file.mkdirs(); } @@ -94,7 +97,6 @@ public final class SystemTermination { } catch (Exception ignored) {} } Repository.getDisconnectionQueue().update(); - SystemLogger.flushLogs(); Repository.getDisconnectionQueue().clear(); } } diff --git a/Server/src/main/core/game/system/SystemUpdate.java b/Server/src/main/core/game/system/SystemUpdate.java index bb5375ea0..e28fe342f 100644 --- a/Server/src/main/core/game/system/SystemUpdate.java +++ b/Server/src/main/core/game/system/SystemUpdate.java @@ -57,7 +57,7 @@ public final class SystemUpdate extends Pulse { */ public void notifyPlayers() { try { - System.out.println("BEGINNING UPDATE SEQUENCE - TIME TIL UPDATE " + getDelay() + " TICKS"); + int time = getDelay() + (createBackup ? BACKUP_TICK : 0); for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { Player p = it.next(); diff --git a/Server/src/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt b/Server/src/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt index e3e69ac3e..d47a9cffa 100644 --- a/Server/src/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt +++ b/Server/src/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt @@ -36,7 +36,6 @@ class RottenPotatoOptionHandler : OptionHandler() { if(player.rights != Rights.ADMINISTRATOR) { removeItem(player, Items.ROTTEN_POTATO_5733) - SystemLogger.logAlert(this::class.java, "Player ${player.username} had a rotten potato. It has been removed.") return false } diff --git a/Server/src/main/core/game/system/command/sets/DevelopmentCommandSet.kt b/Server/src/main/core/game/system/command/sets/DevelopmentCommandSet.kt index 2c5df9a9d..d8a8554cb 100644 --- a/Server/src/main/core/game/system/command/sets/DevelopmentCommandSet.kt +++ b/Server/src/main/core/game/system/command/sets/DevelopmentCommandSet.kt @@ -2,6 +2,7 @@ package core.game.system.command.sets import content.global.activity.jobs.JobManager import content.global.skill.slayer.Master +import core.api.log import core.api.removeAttribute import core.api.getItemName import core.api.sendMessage @@ -27,6 +28,7 @@ import java.io.BufferedWriter import java.io.File import java.io.FileWriter import core.net.packet.PacketWriteQueue +import core.tools.Log @Initializable class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { @@ -85,14 +87,14 @@ class DevelopmentCommandSet : CommandSet(Privilege.ADMIN) { val mapId = args[1].toIntOrNull() ?: return@define val def = Struct.get(mapId) - SystemLogger.logInfo(this::class.java, def.toString()) + log(this::class.java, Log.FINE, def.toString()) } define("datamap") {player, args -> val mapId = args[1].toIntOrNull() ?: return@define val def = DataMap.get(mapId) - SystemLogger.logInfo(this::class.java, def.toString()) + log(this::class.java, Log.FINE, def.toString()) } define("dumpstructs", Privilege.ADMIN, "", "Dumps all the cache structs to structs.txt") {player, _ -> diff --git a/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt index 5d4c5f450..b0c0a3d83 100644 --- a/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt +++ b/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt @@ -33,6 +33,7 @@ import core.tools.SystemLogger import core.game.system.command.CommandMapping import core.game.system.command.Privilege import core.game.world.repository.Repository +import core.tools.Log import core.tools.colorize import java.awt.HeadlessException import java.awt.Toolkit @@ -118,9 +119,9 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ notify(player, "Jagex: ${l.z}_${l.regionId shr 8}_${l.regionId and 0xFF}_${l.localX}_${l.localY}") notify(player,"Object: " + RegionManager.getObject(l).also{obj = it} + ".") notify(player,"Object Varp: " + obj?.definition?.configFile?.varpId + " offset: " + obj?.definition?.configFile?.startBit + " size: " + (obj?.definition?.configFile?.startBit?.minus(obj?.definition?.configFile?.startBit!!))) - SystemLogger.logInfo(this::class.java, "Viewport: " + l.getSceneX(player.playerFlags.lastSceneGraph) + "," + l.getSceneY(player.playerFlags.lastSceneGraph)) + log(this::class.java, Log.FINE, "Viewport: " + l.getSceneX(player.playerFlags.lastSceneGraph) + "," + l.getSceneY(player.playerFlags.lastSceneGraph)) val loc = "Location.create(" + l.x + ", " + l.y + ", " + l.z + ")" - SystemLogger.logInfo(this::class.java, loc + "; " + player.playerFlags.lastSceneGraph + ", " + l.localX + ", " + l.localY) + log(this::class.java, Log.FINE, loc + "; " + player.playerFlags.lastSceneGraph + ", " + l.localX + ", " + l.localY) try { val stringSelection = StringSelection(loc) val clpbrd = Toolkit.getDefaultToolkit().systemClipboard diff --git a/Server/src/main/core/game/system/command/sets/SpawnCommandSet.kt b/Server/src/main/core/game/system/command/sets/SpawnCommandSet.kt index ea8886494..4189fb575 100644 --- a/Server/src/main/core/game/system/command/sets/SpawnCommandSet.kt +++ b/Server/src/main/core/game/system/command/sets/SpawnCommandSet.kt @@ -1,5 +1,6 @@ package core.game.system.command.sets +import core.api.log import core.cache.Cache import core.game.node.scenery.Scenery import core.game.node.scenery.SceneryBuilder @@ -9,6 +10,7 @@ import core.tools.SystemLogger import core.game.system.command.CommandPlugin import core.plugin.Initializable import core.game.system.command.Privilege +import core.tools.Log import java.awt.Toolkit import java.awt.datatransfer.StringSelection @@ -68,7 +70,7 @@ class SpawnCommandSet : CommandSet(Privilege.ADMIN){ } val `object` = if (args.size > 3) Scenery(CommandPlugin.toInteger(args[1]!!), player!!.location, CommandPlugin.toInteger(args[2]!!), CommandPlugin.toInteger(args[3]!!)) else if (args.size == 3) Scenery(CommandPlugin.toInteger(args[1]!!), player!!.location, CommandPlugin.toInteger(args[2]!!)) else Scenery(CommandPlugin.toInteger(args[1]!!), player!!.location) SceneryBuilder.add(`object`) - SystemLogger.logInfo(this::class.java, "object = $`object`") + log(this::class.java, Log.FINE, "object = $`object`") } define("objectgrid") { player, args -> diff --git a/Server/src/main/core/game/system/command/sets/SystemCommandSet.kt b/Server/src/main/core/game/system/command/sets/SystemCommandSet.kt index e1803535e..724c928c1 100644 --- a/Server/src/main/core/game/system/command/sets/SystemCommandSet.kt +++ b/Server/src/main/core/game/system/command/sets/SystemCommandSet.kt @@ -43,7 +43,6 @@ class SystemCommandSet : CommandSet(Privilege.ADMIN) { 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(this::class.java, pass) runTask(player) { if (GameWorld.authenticator.checkPassword(player, pass)) { sendInputDialogue(player, InputType.STRING_SHORT, "Enter New Password:") { value2 -> diff --git a/Server/src/main/core/game/system/communication/CommunicationInfo.java b/Server/src/main/core/game/system/communication/CommunicationInfo.java index eb323277f..6aab0821a 100644 --- a/Server/src/main/core/game/system/communication/CommunicationInfo.java +++ b/Server/src/main/core/game/system/communication/CommunicationInfo.java @@ -2,6 +2,7 @@ package core.game.system.communication; import core.cache.misc.buffer.ByteBufferUtils; import core.game.node.entity.player.Player; +import core.tools.Log; import org.jetbrains.annotations.NotNull; import proto.management.PrivateMessage; import core.auth.UserAccountInfo; @@ -22,6 +23,8 @@ import java.nio.ByteBuffer; import java.util.*; import java.util.Map.Entry; +import static core.api.ContentAPIKt.log; + /** * Holds communication information. * @author Emperor @@ -351,7 +354,7 @@ public final class CommunicationInfo { CommunicationInfo info = player.getDetails().getCommunication(); Contact c = info.contacts.get(contact); if (c == null) { - SystemLogger.logErr(CommunicationInfo.class, "Could not find contact " + contact + " to update clan rank!"); + log(CommunicationInfo.class, Log.ERR, "Could not find contact " + contact + " to update clan rank!"); return; } c.setRank(clanRank); diff --git a/Server/src/main/core/game/system/config/CustomVarbitParser.kt b/Server/src/main/core/game/system/config/CustomVarbitParser.kt index 770117cc9..bf4647479 100644 --- a/Server/src/main/core/game/system/config/CustomVarbitParser.kt +++ b/Server/src/main/core/game/system/config/CustomVarbitParser.kt @@ -5,6 +5,8 @@ import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log +import core.tools.Log import core.tools.SystemLogger import java.io.FileReader @@ -30,6 +32,6 @@ class CustomVarbitParser { count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count custom varbit definitions.") + log(this::class.java, Log.FINE, "Parsed $count custom varbit definitions.") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/DoorConfigLoader.kt b/Server/src/main/core/game/system/config/DoorConfigLoader.kt index f1bc229b3..e6d52ba61 100644 --- a/Server/src/main/core/game/system/config/DoorConfigLoader.kt +++ b/Server/src/main/core/game/system/config/DoorConfigLoader.kt @@ -1,6 +1,8 @@ package core.game.system.config import core.ServerConstants +import core.api.log +import core.tools.Log import core.tools.SystemLogger import org.json.simple.JSONArray import org.json.simple.JSONObject @@ -31,7 +33,7 @@ class DoorConfigLoader { DOORS[door.id] = door count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count door configs.") + log(this::class.java, Log.FINE, "Parsed $count door configs.") } diff --git a/Server/src/main/core/game/system/config/DropTableParser.kt b/Server/src/main/core/game/system/config/DropTableParser.kt index 57cf98d79..4dc3b6793 100644 --- a/Server/src/main/core/game/system/config/DropTableParser.kt +++ b/Server/src/main/core/game/system/config/DropTableParser.kt @@ -5,8 +5,10 @@ import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log import core.api.utils.NPCDropTable import core.api.utils.WeightedItem +import core.tools.Log import core.tools.SystemLogger import java.io.FileReader @@ -29,7 +31,7 @@ class DropTableParser { count++ } } - SystemLogger.logInfo(this::class.java, "Parsed $count drop tables.") + log(this::class.java, Log.FINE, "Parsed $count drop tables.") } private fun parseTable(data: JSONArray, destTable: NPCDropTable, isAlways: Boolean, isCharms: Boolean = false) { diff --git a/Server/src/main/core/game/system/config/GroundSpawnLoader.kt b/Server/src/main/core/game/system/config/GroundSpawnLoader.kt index 39ea3df6e..981b9df3c 100644 --- a/Server/src/main/core/game/system/config/GroundSpawnLoader.kt +++ b/Server/src/main/core/game/system/config/GroundSpawnLoader.kt @@ -9,9 +9,11 @@ import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log import core.tools.SystemLogger import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import java.io.FileReader import java.nio.ByteBuffer @@ -34,7 +36,7 @@ class GroundSpawnLoader { count++ } } - SystemLogger.logInfo(this::class.java, "Initialized $count ground items.") + log(this::class.java, Log.FINE, "Initialized $count ground items.") } class GroundSpawn /** diff --git a/Server/src/main/core/game/system/config/InterfaceConfigParser.kt b/Server/src/main/core/game/system/config/InterfaceConfigParser.kt index a31b33dc1..d691bd167 100644 --- a/Server/src/main/core/game/system/config/InterfaceConfigParser.kt +++ b/Server/src/main/core/game/system/config/InterfaceConfigParser.kt @@ -1,7 +1,9 @@ package core.game.system.config import core.ServerConstants +import core.api.log import core.game.component.ComponentDefinition +import core.tools.Log import core.tools.SystemLogger import org.json.simple.JSONArray import org.json.simple.JSONObject @@ -24,6 +26,6 @@ class InterfaceConfigParser{ ComponentDefinition.getDefinitions()[id] = ComponentDefinition().parse(e["interfaceType"].toString(),e["walkable"].toString(),e["tabIndex"].toString()) count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count interface configs.") + log(this::class.java, Log.FINE, "Parsed $count interface configs.") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/ItemConfigParser.kt b/Server/src/main/core/game/system/config/ItemConfigParser.kt index 8bdb39f65..f3718d031 100644 --- a/Server/src/main/core/game/system/config/ItemConfigParser.kt +++ b/Server/src/main/core/game/system/config/ItemConfigParser.kt @@ -8,6 +8,8 @@ import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log +import core.tools.Log import core.tools.SystemLogger import java.io.FileReader @@ -295,6 +297,6 @@ class ItemConfigParser { } count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count item configs.") + log(this::class.java, Log.FINE, "Parsed $count item configs.") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/MusicConfigLoader.kt b/Server/src/main/core/game/system/config/MusicConfigLoader.kt index ff0136cab..2b11d4fff 100644 --- a/Server/src/main/core/game/system/config/MusicConfigLoader.kt +++ b/Server/src/main/core/game/system/config/MusicConfigLoader.kt @@ -2,11 +2,13 @@ package core.game.system.config import core.cache.def.impl.DataMap import core.ServerConstants +import core.api.log import core.game.node.entity.player.link.music.MusicEntry import core.game.node.entity.player.link.music.MusicZone import core.tools.SystemLogger import core.game.world.map.RegionManager import core.game.world.map.zone.ZoneBorders +import core.tools.Log import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser @@ -67,6 +69,6 @@ class MusicConfigLoader { } count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count music configs.") + log(this::class.java, Log.FINE, "Parsed $count music configs.") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/NPCConfigParser.kt b/Server/src/main/core/game/system/config/NPCConfigParser.kt index e3354f637..292c682e7 100644 --- a/Server/src/main/core/game/system/config/NPCConfigParser.kt +++ b/Server/src/main/core/game/system/config/NPCConfigParser.kt @@ -3,10 +3,12 @@ package core.game.system.config import core.ServerConstants import core.cache.def.impl.NPCDefinition import content.global.activity.ttrail.ClueLevel +import core.api.log import core.game.node.entity.combat.CombatStyle import core.game.node.entity.impl.Animator import core.tools.SystemLogger import core.game.world.update.flag.context.Animation +import core.tools.Log import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser @@ -259,12 +261,12 @@ NPCConfigParser { "facing_booth", "can_tolerate", "water_npc"-> configs.put(it.key.toString(), it.value.toString().toBoolean()) - else -> SystemLogger.logWarn(this::class.java, "Unhandled key for npc config: ${it.key.toString()}") + else -> log(this::class.java, Log.WARN, "Unhandled key for npc config: ${it.key.toString()}") } } } count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count NPC configurations") + log(this::class.java, Log.FINE, "Parsed $count NPC configurations") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/NPCSpawner.kt b/Server/src/main/core/game/system/config/NPCSpawner.kt index 9307d71dd..958b3e2d6 100644 --- a/Server/src/main/core/game/system/config/NPCSpawner.kt +++ b/Server/src/main/core/game/system/config/NPCSpawner.kt @@ -1,10 +1,12 @@ package core.game.system.config import core.ServerConstants +import core.api.log import core.game.node.entity.npc.NPC import core.tools.SystemLogger import core.game.world.map.Direction import core.game.world.map.Location +import core.tools.Log import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser @@ -38,6 +40,6 @@ class NPCSpawner { count++ } } - SystemLogger.logInfo(this::class.java, "Spawned $count NPCs") + log(this::class.java, Log.FINE, "Spawned $count NPCs") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/ObjectConfigParser.kt b/Server/src/main/core/game/system/config/ObjectConfigParser.kt index d38ebf8b2..0445909c2 100644 --- a/Server/src/main/core/game/system/config/ObjectConfigParser.kt +++ b/Server/src/main/core/game/system/config/ObjectConfigParser.kt @@ -1,7 +1,9 @@ package core.game.system.config import core.ServerConstants +import core.api.log import core.cache.def.impl.SceneryDefinition +import core.tools.Log import core.tools.SystemLogger import org.json.simple.JSONArray import org.json.simple.JSONObject @@ -35,7 +37,7 @@ class ObjectConfigParser { count++ } } - SystemLogger.logInfo(this::class.java, "Parsed $count object configs.") + log(this::class.java, Log.FINE, "Parsed $count object configs.") } } diff --git a/Server/src/main/core/game/system/config/RangedConfigLoader.kt b/Server/src/main/core/game/system/config/RangedConfigLoader.kt index 57d28cd4c..41a85f4b3 100644 --- a/Server/src/main/core/game/system/config/RangedConfigLoader.kt +++ b/Server/src/main/core/game/system/config/RangedConfigLoader.kt @@ -1,6 +1,7 @@ package core.game.system.config import core.ServerConstants +import core.api.log import core.cache.def.impl.ItemDefinition import core.game.node.entity.combat.equipment.Ammunition import core.game.node.entity.combat.equipment.BoltEffect @@ -11,6 +12,7 @@ import core.tools.SystemLogger import core.game.world.map.Location import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Graphics +import core.tools.Log import org.json.simple.JSONArray import org.json.simple.JSONObject import org.json.simple.parser.JSONParser @@ -55,7 +57,7 @@ class RangedConfigLoader { Ammunition.getAmmunition().put(Integer.parseInt(e["itemId"].toString()),ammo) count++ } - SystemLogger.logWarn(this::class.java, "Parsed $count ammo configs...") + log(this::class.java, Log.FINE, "Parsed $count ammo configs...") count = 0 reader = FileReader(ServerConstants.CONFIG_PATH + "ranged_weapon_configs.json") @@ -75,6 +77,6 @@ class RangedConfigLoader { RangeWeapon.getRangeWeapons().putIfAbsent(weapon.itemId,weapon) count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count ranged weapon configs...") + log(this::class.java, Log.FINE, "Parsed $count ranged weapon configs...") } } diff --git a/Server/src/main/core/game/system/config/ServerConfigParser.kt b/Server/src/main/core/game/system/config/ServerConfigParser.kt index 413e55cf7..6a4471f6c 100644 --- a/Server/src/main/core/game/system/config/ServerConfigParser.kt +++ b/Server/src/main/core/game/system/config/ServerConfigParser.kt @@ -4,9 +4,13 @@ import com.moandjiezana.toml.Toml import core.game.world.map.Location import core.tools.mysql.Database import core.ServerConstants +import core.api.log +import core.api.parseEnumEntry import core.tools.SystemLogger import core.game.world.GameSettings import core.game.world.GameWorld +import core.tools.Log +import core.tools.LogLevel import java.io.File import java.net.URL import kotlin.system.exitProcess @@ -32,17 +36,25 @@ object ServerConfigParser { private fun parseFromFile(confFile: File?) { if(!confFile!!.canonicalFile.exists()){ - SystemLogger.logErr(this::class.java, "${confFile.canonicalFile} does not exist.") + log(this::class.java, Log.ERR, "${confFile.canonicalFile} does not exist.") exitProcess(0) } else { try { tomlData = Toml().read(confFile) parseServerSettings() parseGameSettings() + val jvmString = System.getProperty("java.version") + if (jvmString.startsWith("1.")) { + ServerConstants.JAVA_VERSION = jvmString.substring(2,3).toInt() + } else if (!jvmString.startsWith("1.")) { + ServerConstants.JAVA_VERSION = jvmString.substring(0,2).toInt() + } else if (!jvmString.contains(".")) { + ServerConstants.JAVA_VERSION = jvmString.toInt() + } + log(this::class.java, Log.FINE, "It seems we are in a Java ${ServerConstants.JAVA_VERSION} environment.") } catch (e: java.lang.IllegalStateException) { - SystemLogger.logErr(this::class.java, "Passed config file is not a TOML file. Path: ${confFile.canonicalPath}") - SystemLogger.logErr(this::class.java, "Exception received: $e") - SystemLogger.logAlert(this::class.java, "Shutting down...") + log(this::class.java, Log.ERR, "Passed config file is not a TOML file. Path: ${confFile.canonicalPath}") + log(this::class.java, Log.ERR, "Exception received: $e") exitProcess(0) } } @@ -134,6 +146,9 @@ object ServerConfigParser { ServerConstants.NOAUTH_DEFAULT_ADMIN = data.getBoolean("server.noauth_default_admin", false) ServerConstants.DRAGON_AXE_USE_OSRS_SPEC = data.getBoolean("world.dragon_axe_use_osrs_spec", false) ServerConstants.ENABLE_GLOBALCHAT = data.getBoolean("world.enable_globalchat", true) + + val logLevel = data.getString("server.log_level", "VERBOSE").uppercase() + ServerConstants.LOG_LEVEL = parseEnumEntry(logLevel) ?: LogLevel.VERBOSE } @@ -141,7 +156,7 @@ object ServerConfigParser { try { return parsePath(getString(key).replace("@data", ServerConstants.DATA_PATH!!)) } catch (e: Exception){ - SystemLogger.logErr(this::class.java, "Error parsing key: $key") + log(this::class.java, Log.ERR, "Error parsing key: $key") exitProcess(0) } } diff --git a/Server/src/main/core/game/system/config/ShopParser.kt b/Server/src/main/core/game/system/config/ShopParser.kt index a81ce02f4..f896e53ee 100644 --- a/Server/src/main/core/game/system/config/ShopParser.kt +++ b/Server/src/main/core/game/system/config/ShopParser.kt @@ -4,6 +4,8 @@ import core.game.node.entity.player.Player import org.json.simple.JSONArray import org.json.simple.parser.JSONParser import core.ServerConstants +import core.api.log +import core.tools.Log import core.tools.SystemLogger import java.io.FileReader @@ -29,6 +31,6 @@ class ShopParser{ count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count shops.") + log(this::class.java, Log.FINE, "Parsed $count shops.") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/config/XteaParser.kt b/Server/src/main/core/game/system/config/XteaParser.kt index 7c4d1ec7b..6b7f81ad8 100644 --- a/Server/src/main/core/game/system/config/XteaParser.kt +++ b/Server/src/main/core/game/system/config/XteaParser.kt @@ -1,6 +1,8 @@ package core.game.system.config import core.ServerConstants +import core.api.log +import core.tools.Log import core.tools.SystemLogger import org.json.simple.JSONArray import org.json.simple.JSONObject @@ -13,9 +15,9 @@ class XteaParser { val REGION_XTEA = HashMap() val DEFAULT_REGION_KEYS = intArrayOf(14881828, -6662814, 58238456, 146761213) fun getRegionXTEA(regionId: Int): IntArray? { //Uses the xtea's from the sql to unlock regions - // System.out.println("USING SQL REGION KEYS");//Confirms we have unlocked those regions + return REGION_XTEA[regionId] - ?: // System.out.println("USING DEFAULT REGION KEYS FOR REGION " + regionId);//Used to check for missing regions + return DEFAULT_REGION_KEYS //This one grabs the keys from the SQL // return DEFAULT_REGION_KEYS;//This one only uses the default keys at the top,{ 14881828, -6662814, 58238456, 146761213 }. Unsure why they chose these numbers. } @@ -36,6 +38,6 @@ class XteaParser { REGION_XTEA[id] = intArrayOf(keys[0],keys[1],keys[2],keys[3]) count++ } - SystemLogger.logInfo(this::class.java, "Parsed $count region keys.") + log(this::class.java, Log.FINE, "Parsed $count region keys.") } } \ No newline at end of file diff --git a/Server/src/main/core/game/system/security/EncryptionManager.java b/Server/src/main/core/game/system/security/EncryptionManager.java index 0b038fb3b..617daa0fc 100644 --- a/Server/src/main/core/game/system/security/EncryptionManager.java +++ b/Server/src/main/core/game/system/security/EncryptionManager.java @@ -19,15 +19,15 @@ public class EncryptionManager { String pass = "lugi"; String salt = BCrypt.gensalt(workload); - System.out.println("pw=" + SystemManager.getEncryption().hashPassword(pass, salt)); System.out.println("Salt=" + salt); + - // System.out.println(BCrypt.checkpw("yes", + // "$2a$12$N3jCPMPEZTisbMf7PG9O7ePgTQEJjhNXGHOJ9zvovT8ibY3Uk.Xlm")); String hash = "$2a$12$N3jCPMPEZTisbMf7PG9O7ePgTQEJjhNXGHOJ9zvovT8ibY3Uk.Xlm"; salt = hash.substring(0, 29); - System.out.println("salt=" + salt); + String hsh = hash.substring(29, hash.length()); - System.out.println("hash=" + hsh); + } /** @@ -105,8 +105,8 @@ public class EncryptionManager { *

To check whether a plaintext password matches one that has * been hashed previously, use the checkpw method:

if * (BCrypt.checkpw(candidate_password, stored_hash))
- *     System.out.println("It matches");
else
    System.out.println("It does not match");
+ + *

The gensalt() method takes an optional parameter (log_rounds) * that determines the computational complexity of the hashing:

* String strong_salt = BCrypt.gensalt(10)
String stronger_salt = diff --git a/Server/src/main/core/game/world/DeadlockDetector.kt b/Server/src/main/core/game/world/DeadlockDetector.kt index cd2f968c8..36d571e3d 100644 --- a/Server/src/main/core/game/world/DeadlockDetector.kt +++ b/Server/src/main/core/game/world/DeadlockDetector.kt @@ -1,5 +1,7 @@ package core.game.world +import core.api.log +import core.tools.Log import core.tools.SystemLogger import java.lang.management.ManagementFactory @@ -17,9 +19,9 @@ class DeadlockDetector : Runnable { if (threadInfo != null) { for (thread in Thread.getAllStackTraces().keys) { if (thread.id == threadInfo.threadId) { - SystemLogger.logErr(this::class.java, threadInfo.toString().trim()) + log(this::class.java, Log.ERR, threadInfo.toString().trim()) for (ste in thread.stackTrace) { - SystemLogger.logErr(this::class.java, "\t" + ste.toString().trim { it <= ' ' }) + log(this::class.java, Log.ERR, "\t" + ste.toString().trim { it <= ' ' }) } } } diff --git a/Server/src/main/core/game/world/GameWorld.kt b/Server/src/main/core/game/world/GameWorld.kt index 3778ddf4c..ba47dc361 100644 --- a/Server/src/main/core/game/world/GameWorld.kt +++ b/Server/src/main/core/game/world/GameWorld.kt @@ -17,12 +17,11 @@ import core.ServerConstants import core.ServerStore import core.auth.AuthProvider import core.auth.Auth -import core.tools.SystemLogger -import core.tools.SystemLogger.logInfo import core.game.system.config.ConfigParser import core.game.world.repository.Repository import core.plugin.ClassScanner import core.storage.AccountStorageProvider +import core.tools.Log import core.worker.MajorUpdateWorker import java.text.SimpleDateFormat import java.util.* @@ -163,7 +162,7 @@ object GameWorld { */ @Throws(Throwable::class) fun prompt(run: Boolean, directory: String?){ - logInfo(GameWorld::class.java, "Prompting ${settings?.name} Game World...") + log(GameWorld::class.java, Log.FINE, "Prompting ${settings?.name} Game World...") Cache.init(ServerConstants.CACHE_PATH) //go overboard with checks to make sure dev mode authenticator never triggers on live Auth.configure() @@ -187,7 +186,6 @@ object GameWorld { } System.gc() - SystemLogger.initTradeLogger() } /** diff --git a/Server/src/main/core/game/world/PulseRunner.kt b/Server/src/main/core/game/world/PulseRunner.kt index a1feea43d..923dfd3dc 100644 --- a/Server/src/main/core/game/world/PulseRunner.kt +++ b/Server/src/main/core/game/world/PulseRunner.kt @@ -1,7 +1,9 @@ package core.game.world +import core.api.log import core.game.system.task.Pulse import core.game.bots.GeneralBotCreator +import core.tools.Log import core.tools.SystemLogger import java.util.concurrent.LinkedBlockingQueue @@ -26,7 +28,7 @@ class PulseRunner { pulses.add(pulse) } } catch (e: Exception) { - SystemLogger.logErr(this::class.java, "Pulse execution error. Stack trace below.") + log(this::class.java, Log.ERR, "Pulse execution error. Stack trace below.") e.printStackTrace() } } @@ -46,15 +48,15 @@ class PulseRunner { private fun notifyIfTooLong(pulse: Pulse, elapsedTime: Long) { if (elapsedTime >= 100) { if (pulse is GeneralBotCreator.BotScriptPulse) { - SystemLogger.logWarn(this::class.java, "CRITICALLY long bot-script tick - ${pulse.botScript.javaClass.name} took $elapsedTime ms") + log(this::class.java, Log.WARN, "CRITICALLY long bot-script tick - ${pulse.botScript.javaClass.name} took $elapsedTime ms") } else { - SystemLogger.logWarn(this::class.java, "CRITICALLY long running pulse - ${pulse.javaClass.name} took $elapsedTime ms") + log(this::class.java, Log.WARN, "CRITICALLY long running pulse - ${pulse.javaClass.name} took $elapsedTime ms") } } else if (elapsedTime >= 30) { if (pulse is GeneralBotCreator.BotScriptPulse) { - SystemLogger.logWarn(this::class.java, "Long bot-script tick - ${pulse.botScript.javaClass.name} took $elapsedTime ms") + log(this::class.java, Log.WARN, "Long bot-script tick - ${pulse.botScript.javaClass.name} took $elapsedTime ms") } else { - SystemLogger.logWarn(this::class.java, "Long running pulse - ${pulse.javaClass.name} took $elapsedTime ms") + log(this::class.java, Log.WARN, "Long running pulse - ${pulse.javaClass.name} took $elapsedTime ms") } } } diff --git a/Server/src/main/core/game/world/map/BuildRegionChunk.java b/Server/src/main/core/game/world/map/BuildRegionChunk.java index b89a72a0c..9fc4330db 100644 --- a/Server/src/main/core/game/world/map/BuildRegionChunk.java +++ b/Server/src/main/core/game/world/map/BuildRegionChunk.java @@ -6,6 +6,7 @@ import core.game.node.item.GroundItem; import core.game.node.item.Item; import core.game.node.scenery.Constructed; import core.game.node.scenery.Scenery; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.map.build.LandscapeParser; import core.net.packet.IoBuffer; @@ -13,6 +14,8 @@ import core.net.packet.out.ClearScenery; import core.net.packet.out.ConstructGroundItem; import core.net.packet.out.ConstructScenery; +import static core.api.ContentAPIKt.log; + import java.util.Arrays; /** @@ -89,7 +92,7 @@ public class BuildRegionChunk extends RegionChunk { @Override public void rotate(Direction direction) { if (rotation != 0) { - SystemLogger.logErr(this.getClass(), "Region chunk was already rotated!"); + log(this.getClass(), Log.ERR, "Region chunk was already rotated!"); return; } Scenery[][][] copy = new Scenery[ARRAY_SIZE][SIZE][SIZE]; @@ -258,7 +261,7 @@ public class BuildRegionChunk extends RegionChunk { System.err.print(", "); } } - SystemLogger.logErr(this.getClass(), "]!"); + log(this.getClass(), Log.ERR, "]!"); throw new IllegalStateException("Insufficient array length for storing all objects! "); } diff --git a/Server/src/main/core/game/world/map/Region.java b/Server/src/main/core/game/world/map/Region.java index c205eab7c..edc7af134 100644 --- a/Server/src/main/core/game/world/map/Region.java +++ b/Server/src/main/core/game/world/map/Region.java @@ -10,6 +10,7 @@ import core.game.world.map.build.DynamicRegion; import core.game.world.map.build.LandscapeParser; import core.game.world.map.build.MapscapeParser; import core.game.world.map.zone.RegionZone; +import core.tools.Log; import core.tools.SystemLogger; import core.game.system.config.XteaParser; import core.game.world.GameWorld; @@ -21,6 +22,8 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.TimeUnit; +import static core.api.ContentAPIKt.log; + /** * Represents a region. * @@ -344,13 +347,13 @@ public class Region { */ private static boolean unload(Region r) { if (r.isViewed()) { - SystemLogger.logErr(CommunicationInfo.class, "Players viewing region!"); + log(CommunicationInfo.class, Log.ERR, "Players viewing region!"); r.flagActive(); return false; } for (RegionPlane p : r.planes) { if (!p.getPlayers().isEmpty()) { - SystemLogger.logErr(CommunicationInfo.class, "Players still in region!"); + log(CommunicationInfo.class, Log.ERR, "Players still in region!"); r.flagActive(); return false; } @@ -393,7 +396,7 @@ public class Region { public int decrementViewAmount() { synchronized (this) { if (viewAmount < 1) { - //SystemLogger.logErr(this.getClass(), "View amount is " + (viewAmount - 1)); + //log(this.getClass(), Log.ERR, "View amount is " + (viewAmount - 1)); viewAmount++; } return --viewAmount; diff --git a/Server/src/main/core/game/world/map/RegionChunk.java b/Server/src/main/core/game/world/map/RegionChunk.java index 999d1644a..8c7876095 100644 --- a/Server/src/main/core/game/world/map/RegionChunk.java +++ b/Server/src/main/core/game/world/map/RegionChunk.java @@ -4,6 +4,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.GroundItem; import core.game.node.item.Item; import core.game.node.scenery.Scenery; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.map.build.DynamicRegion; import core.game.world.map.build.LandscapeParser; @@ -17,6 +18,8 @@ import core.net.packet.out.UpdateAreaPosition; import java.util.ArrayList; import java.util.List; +import static core.api.ContentAPIKt.log; + /** * Represents a region chunk. * @author Emperor @@ -182,7 +185,7 @@ public class RegionChunk { */ public void rotate(Direction direction) { if (rotation != 0) { - SystemLogger.logErr(this.getClass(), "Region chunk was already rotated!"); + log(this.getClass(), Log.ERR, "Region chunk was already rotated!"); return; } Scenery[][] copy = new Scenery[SIZE][SIZE]; diff --git a/Server/src/main/core/game/world/map/RegionManager.kt b/Server/src/main/core/game/world/map/RegionManager.kt index e205863b4..4eea03930 100644 --- a/Server/src/main/core/game/world/map/RegionManager.kt +++ b/Server/src/main/core/game/world/map/RegionManager.kt @@ -1,11 +1,13 @@ package core.game.world.map +import core.api.log import core.game.node.Node import core.game.node.entity.Entity import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.game.node.scenery.Scenery import core.game.world.map.zone.ZoneBorders +import core.tools.Log import core.tools.RandomFunction import core.tools.SystemLogger import java.util.* @@ -43,7 +45,7 @@ object RegionManager { LOCK.unlock() return REGION_CACHE[regionId]!! } - SystemLogger.logErr(this::class.java, "UNABLE TO OBTAIN LOCK WHEN GETTING REGION BY ID. RETURNING BLANK REGION.") + log(this::class.java, Log.ERR, "UNABLE TO OBTAIN LOCK WHEN GETTING REGION BY ID. RETURNING BLANK REGION.") return Region(0,0) } diff --git a/Server/src/main/core/game/world/map/build/LandscapeParser.java b/Server/src/main/core/game/world/map/build/LandscapeParser.java index 577ad4bfa..81025e7d6 100644 --- a/Server/src/main/core/game/world/map/build/LandscapeParser.java +++ b/Server/src/main/core/game/world/map/build/LandscapeParser.java @@ -47,7 +47,7 @@ public final class LandscapeParser { int z = location >> 12; r.setObjectCount(r.getObjectCount() + 1); if (x < 0 || y < 0 || x >= 64 || y >= 64) { - System.out.println("Object out of bounds: " + objectId + " - " + x + ", " + y + ", " + z); + } else { if ((mapscape[1][x][y] & 0x2) == 2) { z--; diff --git a/Server/src/main/core/game/world/objectparser/ObjectParser.java b/Server/src/main/core/game/world/objectparser/ObjectParser.java index 0fcec7846..39b445e31 100644 --- a/Server/src/main/core/game/world/objectparser/ObjectParser.java +++ b/Server/src/main/core/game/world/objectparser/ObjectParser.java @@ -19,7 +19,7 @@ public class ObjectParser implements StartupListener { if(ServerConstants.OBJECT_PARSER_PATH == null) return; File f = new File(ServerConstants.OBJECT_PARSER_PATH); if(!f.exists()){ - System.out.println("[ObjectParser]: Can't find file " + ServerConstants.OBJECT_PARSER_PATH); + return; } @@ -30,7 +30,7 @@ public class ObjectParser implements StartupListener { NodeList parseList = doc.getElementsByTagName("ObjectAction"); - System.out.println("Parsing " + parseList.getLength() + " object modifications."); + for(int i = 0; i < parseList.getLength(); i++){ Node parseNode = parseList.item(i); diff --git a/Server/src/main/core/game/world/repository/DisconnectionQueue.kt b/Server/src/main/core/game/world/repository/DisconnectionQueue.kt index e5e3ebef5..3cd3dae36 100644 --- a/Server/src/main/core/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/core/game/world/repository/DisconnectionQueue.kt @@ -1,10 +1,12 @@ package core.game.world.repository +import core.api.log import core.game.node.entity.player.Player import core.game.node.entity.player.info.login.PlayerParser import core.game.system.task.TaskExecutor import core.tools.SystemLogger import core.game.world.GameWorld +import core.tools.Log import java.util.* import java.util.concurrent.ConcurrentHashMap @@ -50,11 +52,11 @@ class DisconnectionQueue { return false } if (entry.isClear) { - SystemLogger.logInfo(this::class.java, "Clearing player...") + log(this::class.java, Log.FINE, "Clearing player...") player.clear() } Repository.removePlayer(player) - SystemLogger.logInfo(this::class.java, "Player cleared. Removed ${player.details.username}") + log(this::class.java, Log.INFO, "Player cleared. Removed ${player.details.username}") try { if(player.communication.clan != null) player.communication.clan.leave(player, false) diff --git a/Server/src/main/core/game/worldevents/WorldEvent.kt b/Server/src/main/core/game/worldevents/WorldEvent.kt index fae25a3dd..98f66aaf3 100644 --- a/Server/src/main/core/game/worldevents/WorldEvent.kt +++ b/Server/src/main/core/game/worldevents/WorldEvent.kt @@ -5,6 +5,7 @@ import core.plugin.Plugin import org.json.simple.JSONObject import core.ServerStore import core.plugin.ClassScanner +import core.tools.Log import java.util.* /** @@ -42,7 +43,7 @@ open class WorldEvent(var name: String) { * Used to log world event messages in a standard and organized way. */ fun log(message: String){ - SystemLogger.logInfo(this::class.java, "[World Events($name)] $message") + core.api.log(this::class.java, Log.FINE, "[World Events($name)] $message") } /** diff --git a/Server/src/main/core/net/IoEventHandler.java b/Server/src/main/core/net/IoEventHandler.java index 047569771..6b54b1fe2 100644 --- a/Server/src/main/core/net/IoEventHandler.java +++ b/Server/src/main/core/net/IoEventHandler.java @@ -72,7 +72,10 @@ public class IoEventHandler { session.disconnect(); if (session.getPlayer() != null) session.getPlayer().clear(true); - } else e.printStackTrace(); + } else { + key.cancel(); + return; + } } buffer.flip(); if (session == null) { diff --git a/Server/src/main/core/net/amsc/MSEventHandler.java b/Server/src/main/core/net/amsc/MSEventHandler.java index 8fc2420f1..70bea403d 100644 --- a/Server/src/main/core/net/amsc/MSEventHandler.java +++ b/Server/src/main/core/net/amsc/MSEventHandler.java @@ -1,5 +1,6 @@ package core.net.amsc; +import core.tools.Log; import core.tools.SystemLogger; import core.net.IoEventHandler; import core.net.IoSession; @@ -10,6 +11,8 @@ import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.concurrent.Executors; +import static core.api.ContentAPIKt.log; + /** * Handles the management server events. * @author Emperor @@ -38,7 +41,7 @@ public final class MSEventHandler extends IoEventHandler { } catch (Throwable t) { t.printStackTrace(); } - SystemLogger.logErr(this.getClass(), "Failed connecting to Management Server!"); + log(this.getClass(), Log.ERR, "Failed connecting to Management Server!"); WorldCommunicator.terminate(); } diff --git a/Server/src/main/core/net/amsc/WorldCommunicator.java b/Server/src/main/core/net/amsc/WorldCommunicator.java index 91e59e075..1c634d1d0 100644 --- a/Server/src/main/core/net/amsc/WorldCommunicator.java +++ b/Server/src/main/core/net/amsc/WorldCommunicator.java @@ -67,7 +67,6 @@ public final class WorldCommunicator { */ public static void connect() { try { - SystemLogger.logInfo(WorldCommunicator.class, "Attempting to connect to management server..."); setState(ManagementServerState.CONNECTING); /*if (isLocallyHosted()) { SystemLogger.log("Management server is hosted on local machine!"); @@ -77,7 +76,6 @@ public final class WorldCommunicator { //} reactor.start(); } catch (Throwable e) { - SystemLogger.logErr(WorldCommunicator.class, "Unable to connect to management server"); e.printStackTrace(); terminate(); } @@ -187,7 +185,6 @@ public final class WorldCommunicator { if (WorldCommunicator.state != state) { WorldCommunicator.state = state; state.set(); - SystemLogger.logInfo(WorldCommunicator.class, "Management server status: " + state + "."); } } diff --git a/Server/src/main/core/net/event/GameReadEvent.java b/Server/src/main/core/net/event/GameReadEvent.java index 37ba17f7d..0e5c061c4 100644 --- a/Server/src/main/core/net/event/GameReadEvent.java +++ b/Server/src/main/core/net/event/GameReadEvent.java @@ -1,5 +1,6 @@ package core.net.event; +import core.tools.Log; import core.tools.SystemLogger; import core.net.IoReadEvent; import core.net.IoSession; @@ -10,6 +11,8 @@ import core.net.packet.in.Packet; import java.nio.ByteBuffer; +import static core.api.ContentAPIKt.log; + /** * Handles game packet reading. * @author Emperor @@ -65,9 +68,6 @@ public final class GameReadEvent extends IoReadEvent { if (session == null || session.getPlayer() == null) { continue; } - if (opcode >= PACKET_SIZES.length) { - break; - } int header = PACKET_SIZES[opcode]; int size = header; if (header < 0) { @@ -93,16 +93,20 @@ public final class GameReadEvent extends IoReadEvent { byte[] data = new byte[size]; buffer.get(data); IoBuffer buf = new IoBuffer(opcode, null, ByteBuffer.wrap(data)); - //SystemLogger.log("Packet opcode " + opcode + "received."); - //IncomingPacket packet = PacketRepository.getIncoming(opcode); session.setLastPing(System.currentTimeMillis()); last = opcode; + //Authentic per-player per-tick limit on inbound packets + if (session.getPlayer().opCounts[opcode]++ >= 10) { + log(this.getClass(), Log.FINE, "Skipping packet " + opcode + " because already received more than 10!"); + return; + } + Packet processed = Decoders530.process(session.getPlayer(), opcode, buf); if (processed instanceof Packet.UnhandledOp) { - SystemLogger.logWarn(this.getClass(), "Unhandled opcode: " + opcode); + log(this.getClass(), Log.WARN, "Unhandled opcode: " + opcode); } else if (processed instanceof Packet.DecodingError) { - SystemLogger.logErr(this.getClass(), ((Packet.DecodingError) processed).getMessage()); + log(this.getClass(), Log.ERR, ((Packet.DecodingError) processed).getMessage()); } else if (!(processed instanceof Packet.NoProcess)) { PacketProcessor.enqueue(processed); } @@ -133,9 +137,9 @@ public final class GameReadEvent extends IoReadEvent { return buffer.getShort() & 0xFFFF; } if(header == -3){ - System.out.println(buffer.remaining()); + } - SystemLogger.logErr(this.getClass(), "Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "], header=" + header+"!"); + log(this.getClass(), Log.ERR, "Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "], header=" + header+"!"); return -1; } diff --git a/Server/src/main/core/net/event/HSReadEvent.java b/Server/src/main/core/net/event/HSReadEvent.java index 883ce2254..bf98d5ad0 100644 --- a/Server/src/main/core/net/event/HSReadEvent.java +++ b/Server/src/main/core/net/event/HSReadEvent.java @@ -4,6 +4,7 @@ import core.net.IoReadEvent; import core.net.IoSession; import core.net.lobby.WorldList; import core.net.registry.AccountRegister; +import core.tools.Log; import core.tools.RandomFunction; import core.tools.SystemLogger; @@ -11,6 +12,8 @@ import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * Handles handshake read events. * @author Emperor @@ -47,7 +50,7 @@ public final class HSReadEvent extends IoReadEvent { int revision = buffer.getInt(); //int sub_revision = buffer.getInt(); buffer.flip(); - System.out.println(buffer.limit()); + if (revision != 530 ){//|| sub_revision != Constants.CLIENT_BUILD) { session.disconnect(); break; @@ -64,7 +67,7 @@ public final class HSReadEvent extends IoReadEvent { WorldList.sendUpdate(session, updateStamp); break; default: - SystemLogger.logInfo(this.getClass(), "PKT " + opcode); + log(this.getClass(), Log.FINE, "PKT " + opcode); session.disconnect(); break; } diff --git a/Server/src/main/core/net/event/JS5ReadEvent.java b/Server/src/main/core/net/event/JS5ReadEvent.java index ded5d14d5..4b1571d44 100644 --- a/Server/src/main/core/net/event/JS5ReadEvent.java +++ b/Server/src/main/core/net/event/JS5ReadEvent.java @@ -25,7 +25,7 @@ public final class JS5ReadEvent extends IoReadEvent { public void read(IoSession session, ByteBuffer buffer) { while (buffer.hasRemaining()) { int opcode = buffer.get() & 0xFF; - //System.out.println("JS5 initiated! Opcode: " + opcode); + if (buffer.remaining() < 3) { queueBuffer(opcode); return; @@ -34,11 +34,11 @@ public final class JS5ReadEvent extends IoReadEvent { case 0: case 1: int request = ByteBufferUtils.getMedium(buffer); - //System.out.println("Requested file " + request); + int container = request >> 16 & 0xFF; - //System.out.println("In container " + container); + int archive = request & 0xFFFF; - //System.out.println("In archive " + archive); + session.getJs5Queue().queue(container, archive, opcode == 1); break; case 2: // music @@ -71,7 +71,7 @@ public final class JS5ReadEvent extends IoReadEvent { session.disconnect(); return; default: - System.out.println("Unhandled JS5 opcode " + opcode + "!"); + buffer.get(); buffer.getShort(); break; diff --git a/Server/src/main/core/net/event/MSReadEvent.java b/Server/src/main/core/net/event/MSReadEvent.java index 9a6f3da88..5c1edfe13 100644 --- a/Server/src/main/core/net/event/MSReadEvent.java +++ b/Server/src/main/core/net/event/MSReadEvent.java @@ -1,11 +1,14 @@ package core.net.event; +import core.tools.Log; import core.tools.SystemLogger; import core.net.IoReadEvent; import core.net.IoSession; import java.nio.ByteBuffer; +import static core.api.ContentAPIKt.log; + /** * Handles reading Management server packets. * @author Emperor @@ -85,7 +88,7 @@ public final class MSReadEvent extends IoReadEvent { } return buffer.getShort() & 0xFFFF; } - SystemLogger.logErr(this.getClass(), "Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "]!"); + log(this.getClass(), Log.ERR, "Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "]!"); return -1; } diff --git a/Server/src/main/core/net/event/RegistryReadEvent.java b/Server/src/main/core/net/event/RegistryReadEvent.java index 60e3d855d..bfbedd61a 100644 --- a/Server/src/main/core/net/event/RegistryReadEvent.java +++ b/Server/src/main/core/net/event/RegistryReadEvent.java @@ -1,5 +1,6 @@ package core.net.event; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; import core.net.IoReadEvent; @@ -10,6 +11,8 @@ import core.net.producer.MSEventProducer; import java.nio.ByteBuffer; +import static core.api.ContentAPIKt.log; + /** * Handles world registry read events. * @author Emperor @@ -36,23 +39,18 @@ public final class RegistryReadEvent extends IoReadEvent { switch (opcode) { case 0: WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); - SystemLogger.logErr(this.getClass(), "Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=World id out of bounds]!"); + log(this.getClass(), Log.ERR, "Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=World id out of bounds]!"); break; case 1: session.setProducer(PRODUCER); WorldCommunicator.setState(ManagementServerState.AVAILABLE); - SystemLogger.logInfo(this.getClass(), "Successfully registered world to AMS - [id=" + GameWorld.getSettings().getWorldId() + "]!"); break; case 2: - WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); - SystemLogger.logErr(this.getClass(), "Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=World id already in use]!"); + case 3: + WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); break; - case 3: - WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); - SystemLogger.logErr(this.getClass(), "Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=Exception in AMS]!"); - break; - default: - System.out.println("??" + opcode); + default: + break; } } diff --git a/Server/src/main/core/net/packet/PacketProcessor.kt b/Server/src/main/core/net/packet/PacketProcessor.kt index 7fb86cc21..ec84e5a18 100644 --- a/Server/src/main/core/net/packet/PacketProcessor.kt +++ b/Server/src/main/core/net/packet/PacketProcessor.kt @@ -42,6 +42,7 @@ import content.global.handlers.iface.ge.StockMarket import content.global.skill.magic.SpellListener import content.global.skill.magic.SpellListeners import content.global.skill.magic.SpellUtils +import core.api.log import core.game.interaction.* import core.game.node.entity.player.info.LogType import core.game.node.entity.player.info.PlayerMonitor @@ -52,6 +53,7 @@ import core.game.world.GameWorld import core.game.world.repository.Repository import core.net.packet.`in`.Packet import core.net.packet.`in`.RunScript +import core.tools.Log import core.worker.ManagementEvents import java.io.PrintWriter import java.io.StringWriter @@ -71,7 +73,7 @@ object PacketProcessor { val pw = PrintWriter(sw) var pkt: Packet while (countThisCycle-- > 0) { - pkt = queue.tryPop(Packet.NoProcess()) + pkt = queue.tryPop(Packet.NoProcess()) ?: return if (pkt is Packet.NoProcess) { queue.clear() return @@ -80,7 +82,7 @@ object PacketProcessor { process(pkt) } catch (e: Exception) { e.printStackTrace(pw) - SystemLogger.logErr(this::class.java, "Error Processing ${pkt::class.java.simpleName}: $sw") + log(this::class.java, Log.ERR, "Error Processing ${pkt::class.java.simpleName}: $sw") } } } @@ -286,7 +288,7 @@ object PacketProcessor { } - else -> SystemLogger.logWarn(this::class.java, "Unprocessed Packet: ${pkt::class.java.simpleName}") + else -> log(this::class.java, Log.WARN, "Unprocessed Packet: ${pkt::class.java.simpleName}") } } diff --git a/Server/src/main/core/net/packet/PacketRepository.java b/Server/src/main/core/net/packet/PacketRepository.java index e1f41fb43..a99537fff 100644 --- a/Server/src/main/core/net/packet/PacketRepository.java +++ b/Server/src/main/core/net/packet/PacketRepository.java @@ -2,11 +2,16 @@ package core.net.packet; import core.net.packet.out.GrandExchangePacket; import core.net.packet.out.*; +import core.tools.Log; import core.tools.SystemLogger; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; +import static core.api.ContentAPIKt.log; + /** * The packet repository. * @author Emperor @@ -82,11 +87,18 @@ public final class PacketRepository { if(context.getPlayer().getSession() == null) return; OutgoingPacket p = OUTGOING_PACKETS.get(clazz); if (p == null) { - SystemLogger.logErr(PacketRepository.class, "Invalid outgoing packet [handler=" + clazz + ", context=" + context + "]."); + log(PacketRepository.class, Log.ERR, "Invalid outgoing packet [handler=" + clazz + ", context=" + context + "]."); return; } if(!context.getPlayer().isArtificial()) { - PacketWriteQueue.handle(p, context); + try { + PacketWriteQueue.handle(p, context); + } catch (Exception e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + log(PacketRepository.class, Log.ERR, "Error writing packet out: " + sw); + } } } diff --git a/Server/src/main/core/net/packet/PacketWriteQueue.kt b/Server/src/main/core/net/packet/PacketWriteQueue.kt index 1bc60a382..131661b57 100644 --- a/Server/src/main/core/net/packet/PacketWriteQueue.kt +++ b/Server/src/main/core/net/packet/PacketWriteQueue.kt @@ -1,7 +1,9 @@ package core.net.packet +import core.api.log import core.api.tryPop import core.net.packet.out.* +import core.tools.Log import core.tools.SystemLogger import java.io.PrintWriter import java.io.StringWriter @@ -10,7 +12,7 @@ import java.util.concurrent.locks.ReentrantLock class PacketWriteQueue { companion object { - private val packetsToWrite = LinkedList?>() + private val packetsToWrite = LinkedList>() @JvmStatic fun handle(packet: OutgoingPacket, context: T) { @@ -27,6 +29,10 @@ class PacketWriteQueue { @JvmStatic fun push(packet: OutgoingPacket, context: T) { + if (context == null) { + log(this::class.java, Log.ERR, "${packet::class.java.simpleName} tried to queue with a null context!") + return + } packetsToWrite.add(QueuedPacket(packet, context)) } @@ -41,7 +47,7 @@ class PacketWriteQueue { write(pkt.out, pkt.context) } catch (e: Exception) { e.printStackTrace(pw) - SystemLogger.logErr(this::class.java, "Error flushing packet ${pkt.out::class.java}: $sw") + log(this::class.java, Log.ERR, "Error flushing packet ${pkt.out::class.java}: $sw") continue } } diff --git a/Server/src/main/core/net/packet/in/Decoders530.kt b/Server/src/main/core/net/packet/in/Decoders530.kt index 1f7d63f74..b6ae35734 100644 --- a/Server/src/main/core/net/packet/in/Decoders530.kt +++ b/Server/src/main/core/net/packet/in/Decoders530.kt @@ -1,8 +1,10 @@ package core.net.packet.`in` +import core.api.log import core.Util.clamp import core.game.node.entity.player.Player import core.net.packet.IoBuffer +import core.tools.Log import core.tools.StringUtils import core.tools.SystemLogger import java.io.PrintWriter @@ -692,7 +694,7 @@ enum class Decoders530(val opcode: Int) { 3,4 -> QCPacketType.STANDARD 5 -> QCPacketType.SINGLE 7 -> QCPacketType.DOUBLE - else -> QCPacketType.UNHANDLED.also { SystemLogger.logWarn(this::class.java, "UNHANDLED QC PACKET TYPE Size ${x.array().size}") } + else -> QCPacketType.UNHANDLED.also { log(this::class.java, Log.WARN, "UNHANDLED QC PACKET TYPE Size ${x.array().size}") } } val forClan = (buffer.get() and 0xFF) == 1 @@ -711,7 +713,7 @@ enum class Decoders530(val opcode: Int) { buffer.get() //discard selection_b_index = buffer.get() } - QCPacketType.UNHANDLED -> SystemLogger.logWarn(this::class.java, "Unhandled packet type, skipping remaining buffer contents.") + QCPacketType.UNHANDLED -> log(this::class.java, Log.WARN, "Unhandled packet type, skipping remaining buffer contents.") else -> {} } return Packet.QuickChat(player, selection_a_index, selection_b_index, forClan, multiplier, offset, packetType) diff --git a/Server/src/main/core/net/packet/in/Login.kt b/Server/src/main/core/net/packet/in/Login.kt index 4d4988e3c..0a413f269 100644 --- a/Server/src/main/core/net/packet/in/Login.kt +++ b/Server/src/main/core/net/packet/in/Login.kt @@ -15,12 +15,14 @@ import core.ServerConstants import core.ServerStore import core.ServerStore.Companion.addToList import core.ServerStore.Companion.getList +import core.api.log import core.auth.AuthResponse import core.game.node.entity.player.info.* import core.game.node.entity.player.info.login.LoginParser import core.tools.SystemLogger import core.game.world.GameWorld import core.game.world.repository.Repository +import core.tools.Log import core.worker.ManagementEvents.publish import java.math.BigInteger import java.nio.BufferUnderflowException @@ -45,7 +47,7 @@ object Login { return Pair(AuthResponse.Updated, null) } if (info.opcode != NORMAL_LOGIN_OP && info.opcode != RECONNECT_LOGIN_OP) { - SystemLogger.logInfo(this::class.java, "Invalid Login Opcode: ${info.opcode}") + log(this::class.java, Log.WARN, "Invalid Login Opcode: ${info.opcode}") return Pair(AuthResponse.InvalidLoginServer, null) } @@ -82,7 +84,7 @@ object Login { return Pair(AuthResponse.Success, info) } catch (e: Exception) { - SystemLogger.logErr(this::class.java, "Exception encountered during login packet parsing! See stack trace below.") + log(this::class.java, Log.ERR, "Exception encountered during login packet parsing! See stack trace below.") e.printStackTrace() return Pair(AuthResponse.UnexpectedError, null) } diff --git a/Server/src/main/core/net/packet/in/QuickChatPacketHandler.kt b/Server/src/main/core/net/packet/in/QuickChatPacketHandler.kt index de7a3f7fe..785775288 100644 --- a/Server/src/main/core/net/packet/in/QuickChatPacketHandler.kt +++ b/Server/src/main/core/net/packet/in/QuickChatPacketHandler.kt @@ -1,11 +1,13 @@ package core.net.packet.`in` +import core.api.log import core.game.node.entity.player.Player import core.net.packet.IncomingPacket import core.net.packet.IoBuffer import core.net.packet.QCRepository import core.tools.SystemLogger import core.game.world.GameWorld +import core.tools.Log /** * Decodes the quick chat packet @@ -31,7 +33,7 @@ class QuickChatPacketHandler : IncomingPacket { 3,4 -> QCPacketType.STANDARD 5 -> QCPacketType.SINGLE 7 -> QCPacketType.DOUBLE - else -> QCPacketType.UNHANDLED.also { SystemLogger.logWarn(this::class.java, "UNHANDLED QC PACKET TYPE Size ${x.array().size}") } + else -> QCPacketType.UNHANDLED.also { log(this::class.java, Log.WARN, "UNHANDLED QC PACKET TYPE Size ${x.array().size}") } } val forClan = (buffer.get() and 0xFF) == 1 @@ -50,7 +52,7 @@ class QuickChatPacketHandler : IncomingPacket { buffer.get() //discard selection_b_index = buffer.get() } - QCPacketType.UNHANDLED -> SystemLogger.logWarn(this::class.java, "Unhandled packet type, skipping remaining buffer contents.") + QCPacketType.UNHANDLED -> log(this::class.java, Log.WARN, "Unhandled packet type, skipping remaining buffer contents.") else -> {} } @@ -58,12 +60,12 @@ class QuickChatPacketHandler : IncomingPacket { //Prints the values of each byte in the buffer to server log //If the world is in dev mode if(GameWorld.settings?.isDevMode == true) { - SystemLogger.logInfo(this::class.java, "Begin QuickChat Packet Buffer Dump---------") - SystemLogger.logInfo(this::class.java, "Packet Type: ${packetType.name} Chat Type: ${if(forClan) "Clan" else "Public"}") + log(this::class.java, Log.FINE, "Begin QuickChat Packet Buffer Dump---------") + log(this::class.java, Log.FINE, "Packet Type: ${packetType.name} Chat Type: ${if(forClan) "Clan" else "Public"}") x?.array()?.forEach { - SystemLogger.logInfo(this::class.java, "$it") + log(this::class.java, Log.FINE, "$it") } - SystemLogger.logInfo(this::class.java, "End QuickChat Packet Buffer Dump-----------") + log(this::class.java, Log.FINE, "End QuickChat Packet Buffer Dump-----------") } QCRepository.sendQC(player,multiplier,offset,packetType,selection_a_index,selection_b_index,forClan) diff --git a/Server/src/main/core/net/packet/out/CommunicationMessage.java b/Server/src/main/core/net/packet/out/CommunicationMessage.java index 0af702b1c..5cd5e592d 100644 --- a/Server/src/main/core/net/packet/out/CommunicationMessage.java +++ b/Server/src/main/core/net/packet/out/CommunicationMessage.java @@ -41,7 +41,6 @@ public final class CommunicationMessage implements OutgoingPacket for (int regionX = (player.getLocation().getRegionX() - 6) / 8; regionX <= ((player.getLocation().getRegionX() + 6) / 8); regionX++) { for (int regionY = (player.getLocation().getRegionY() - 6) / 8; regionY <= ((player.getLocation().getRegionY() + 6) / 8); regionY++) { int[] keys = XteaParser.Companion.getRegionXTEA(regionX << 8 | regionY); - for (int i = 0; i < keys.length; i++) { - buffer.putIntB(keys[i]); + for (int i = 0; i < 4; i++) { + if (keys != null) + buffer.putIntB(keys[i]); + else + buffer.putIntB(0); } } } diff --git a/Server/src/main/core/net/registry/AccountRegister.java b/Server/src/main/core/net/registry/AccountRegister.java index 349613841..dff9f3fc0 100644 --- a/Server/src/main/core/net/registry/AccountRegister.java +++ b/Server/src/main/core/net/registry/AccountRegister.java @@ -6,6 +6,7 @@ import core.net.Constants; import core.net.IoSession; import core.ServerConstants; import core.auth.UserAccountInfo; +import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; import core.net.packet.in.Login; @@ -14,6 +15,8 @@ import java.nio.ByteBuffer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static core.api.ContentAPIKt.log; + /** * Handles the registry of new accounts. * @author Vexia @@ -50,11 +53,11 @@ public class AccountRegister { break; } if (invalidUsername(username)) { - System.out.println("AHAHHA " + username); + response(session,RegistryResponse.INVALID_USERNAME); break; } - System.out.println(username); + if (!GameWorld.getAuthenticator().canCreateAccountWith(info)) { response(session, RegistryResponse.NOT_AVAILBLE_USER); return; @@ -62,11 +65,10 @@ public class AccountRegister { response(session, RegistryResponse.SUCCESS); break; case 36://Register details - SystemLogger.logInfo(AccountRegister.class, "Made it to final stage"); buffer.get(); //Useless size being written that is already written in the RSA block buffer = Login.decryptRSABuffer(buffer, ServerConstants.EXPONENT, ServerConstants.MODULUS); if(buffer.get() != 10){ //RSA header (aka did this decrypt properly) - SystemLogger.logInfo(AccountRegister.class, "Decryption failed during registration :("); + log(AccountRegister.class, Log.ERR, "Decryption failed during registration :("); response(session, RegistryResponse.CANNOT_CREATE); break; } @@ -115,7 +117,7 @@ public class AccountRegister { }); break; default: - SystemLogger.logErr(AccountRegister.class, "Unhandled account registry opcode = " + opcode); + log(AccountRegister.class, Log.ERR, "Unhandled account registry opcode = " + opcode); break; } } diff --git a/Server/src/main/core/plugin/ClassScanner.kt b/Server/src/main/core/plugin/ClassScanner.kt index e2358e981..be189598c 100644 --- a/Server/src/main/core/plugin/ClassScanner.kt +++ b/Server/src/main/core/plugin/ClassScanner.kt @@ -22,6 +22,7 @@ import core.game.node.entity.player.info.login.PlayerSaver import core.tools.SystemLogger import core.tools.SystemLogger.logStartup import core.game.world.GameWorld +import core.tools.Log import java.util.function.Consumer /** @@ -64,10 +65,10 @@ object ClassScanner { loadContentInterfacesFrom(scanResults) logStartup("Loaded $amountLoaded content interfaces.") } catch (t: Throwable) { - SystemLogger.logErr(this::class.java, "Error initializing Plugins -> " + t.localizedMessage + " for file -> " + lastLoaded) + log(this::class.java, Log.ERR, "Error initializing Plugins -> " + t.localizedMessage + " for file -> " + lastLoaded) t.printStackTrace() } catch (e: Exception) { - SystemLogger.logErr(this::class.java, "Error initializing Plugins -> " + e.localizedMessage + " for file -> " + lastLoaded) + log(this::class.java, Log.ERR, "Error initializing Plugins -> " + e.localizedMessage + " for file -> " + lastLoaded) e.printStackTrace() } } @@ -110,12 +111,12 @@ object ClassScanner { } for(border in clazz.defineAreaBorders()) zone.register(border) ZoneBuilder.configure(zone) - SystemLogger.logInfo(this::class.java, "Configured zone: ${clazz.javaClass.simpleName + "MapArea"}") + log(this::class.java, Log.FINE, "Configured zone: ${clazz.javaClass.simpleName + "MapArea"}") MapArea.zoneMaps[clazz.javaClass.simpleName + "MapArea"] = zone } amountLoaded++ } catch (e: Exception) { - SystemLogger.logErr(this::class.java, "Error loading content: ${it.simpleName}, ${e.localizedMessage}") + log(this::class.java, Log.ERR, "Error loading content: ${it.simpleName}, ${e.localizedMessage}") e.printStackTrace() } } @@ -136,10 +137,10 @@ object ClassScanner { definePlugin(clazz) } } catch (t: Throwable) { - SystemLogger.logErr(this::class.java, "Failed to load plugin ${p.name}."); + log(this::class.java, Log.ERR, "Failed to load plugin ${p.name}."); if (t is NoSuchMethodException && p.superclass.simpleName == core.game.dialogue.DialoguePlugin::class.simpleName) { - SystemLogger.logErr(this::class.java, + log(this::class.java, Log.ERR, "Make sure the constructor signature matches " + "`${p.simpleName}(player: Player? = null) : DialoguePlugin(player)'." ) @@ -196,7 +197,7 @@ object ClassScanner { plugin.newInstance(null) QuestRepository.register(plugin as Quest) } - else -> SystemLogger.logWarn(this::class.java, "Unknown Manifest: " + manifest.type) + else -> log(this::class.java, Log.WARN, "Unknown Manifest: " + manifest.type) } } numPlugins++ diff --git a/Server/src/main/core/tools/RandomFunction.java b/Server/src/main/core/tools/RandomFunction.java index a162c25e6..3cd1fa0e6 100644 --- a/Server/src/main/core/tools/RandomFunction.java +++ b/Server/src/main/core/tools/RandomFunction.java @@ -269,7 +269,7 @@ public class RandomFunction { rand -= item.weight; } //We should get here if and only if the weighted chance table is empty. - //System.out.println("ERROR ROLLING WEIGHTED CHANCE: WEIGHT SUM AND INDIVIDUAL WEIGHTS DO NOT MATCH!!"); + return null; } diff --git a/Server/src/main/core/tools/SystemLogger.kt b/Server/src/main/core/tools/SystemLogger.kt index 48334133f..86f682bf9 100644 --- a/Server/src/main/core/tools/SystemLogger.kt +++ b/Server/src/main/core/tools/SystemLogger.kt @@ -2,11 +2,11 @@ package core.tools import com.github.ajalt.mordant.rendering.TextColors import com.github.ajalt.mordant.terminal.* +import com.google.protobuf.ByteString.Output import core.ServerConstants -import java.io.BufferedWriter -import java.io.File -import java.io.FileWriter -import java.io.Writer +import core.api.log +import java.io.OutputStream +import java.io.PrintStream import java.text.SimpleDateFormat import java.util.* @@ -17,105 +17,76 @@ import java.util.* */ object SystemLogger { val t = Terminal() + val errT = t.forStdErr() val formatter = SimpleDateFormat("HH:mm:ss") - var tradeLog: Writer? = null - var tradeLogWriter: BufferedWriter? = null - @JvmStatic - fun initTradeLogger(){ - if(!File(ServerConstants.LOGS_PATH + "trade" + File.separator + "test").exists()){ - File(ServerConstants.LOGS_PATH + "trade" + File.separator + "test").mkdirs() - } - tradeLog = FileWriter(ServerConstants.LOGS_PATH + "trade" + File.separator + SimpleDateFormat("dd-MM-yyyy").format(System.currentTimeMillis()) + ".log") - tradeLogWriter = BufferedWriter(tradeLog!!) - } - - @JvmStatic() - fun flushLogs() { - try { - tradeLogWriter?.flush() - tradeLogWriter?.close() - } catch(ignored: Exception) {} - } - - fun getTime(): String{ + private fun getTime(): String{ return "[" + formatter.format(Date(System.currentTimeMillis())) +"]" } @JvmStatic - fun logInfo(clazz: Class<*>, vararg messages: String){ - for(m in messages){ - val msg = "${getTime()}: [${clazz.simpleName}] $m" - if(m.isNotBlank()) { + fun processLogEntry(clazz: Class<*>, log: Log, message: String) { + when (log) { + Log.FINE -> { + if (ServerConstants.LOG_LEVEL < LogLevel.VERBOSE) + return + val msg = TextColors.gray("${getTime()}: [${clazz.simpleName}] $message") t.println(msg) } - } - } - @JvmStatic - fun logErr(clazz: Class<*>, message: String){ - val msg = "${getTime()}: [${clazz.simpleName}] $message" - if(message.isNotBlank()) { - t.println(msg) - } - } + Log.INFO -> { + if (ServerConstants.LOG_LEVEL < LogLevel.DETAILED) + return - @JvmStatic - fun logWarn(clazz: Class<*>, message: String){ - val msg = "${getTime()}: [${clazz.simpleName}] $message" - if(message.isNotBlank()) { - t.println(msg) - } - } + val msg = "${getTime()}: [${clazz.simpleName}] $message" + t.println(msg) + } - @JvmStatic - fun logAlert(clazz: Class<*>, message: String){ - val msg = "${getTime()}: [${clazz.simpleName}] $message" - if(message.isNotBlank()) { - t.println(msg) - } - } + Log.WARN -> { + if (ServerConstants.LOG_LEVEL < LogLevel.CAUTIOUS) + return - @JvmStatic - fun logAI(clazz: Class<*>, message: String){ - val msg = "${getTime()}: [${clazz.simpleName}] $message" - if(message.isNotBlank()) { - t.println(msg) - } - } + val msg = TextColors.yellow("${getTime()}: [${clazz.simpleName}] $message") + t.println(msg) + } - @JvmStatic - fun logRE(message: String){ - if(message.isNotBlank()) t.println("${getTime()}: ${TextColors.gray("[RAND] $message")}") + Log.ERR -> { + val msg = "${getTime()}: [${clazz.simpleName}] $message" + errT.println(msg) + } + } } @JvmStatic fun logGE(message: String){ - if(message.isNotBlank()) t.println("${getTime()}: ${TextColors.gray("[ GE] $message")}") - } - - @JvmStatic - fun logTrade(message: String){ - try { - if (message.isNotBlank()) { - if (tradeLogWriter == null) logWarn(this::class.java, "Trade Logger is null!") - tradeLogWriter?.write("${getTime()}: $message") - tradeLogWriter?.newLine() - } - } catch(ignored: Exception){} + log(this::class.java, Log.FINE, "[ GE] $message") } @JvmStatic fun logStartup(message: String) { - logInfo(this::class.java, "[STARTUP] $message") + log(this::class.java, Log.FINE, "[STARTUP] $message") } @JvmStatic fun logShutdown(message: String) { - logInfo(this::class.java,"[SHUTDOWN] $message") + log(this::class.java, Log.FINE, "[SHUTDOWN] $message") } fun logMS(s: String) { - if(s.isNotBlank()) t.println("${getTime()}: ${TextColors.gray("[ MS] $s")}") + log(this::class.java, Log.FINE, "[ MS] $s") } +} + +enum class LogLevel { + SILENT, + CAUTIOUS, + DETAILED, + VERBOSE +} + +enum class Log { + FINE, + INFO, + WARN, + ERR } \ No newline at end of file diff --git a/Server/src/main/core/tools/TimeStamp.java b/Server/src/main/core/tools/TimeStamp.java index 13934b1fc..f0762e846 100644 --- a/Server/src/main/core/tools/TimeStamp.java +++ b/Server/src/main/core/tools/TimeStamp.java @@ -51,7 +51,7 @@ public final class TimeStamp { long current = System.currentTimeMillis(); long difference = current - interval; if (debug || difference > 100) { - System.out.println("Interval " + info + " - time elapsed=" + difference + "ms."); + } interval = current; return difference; @@ -65,7 +65,7 @@ public final class TimeStamp { long current = System.currentTimeMillis(); long difference = current - start; if (debug) { - System.out.println("Interval " + info + " - time elapsed=" + difference + "ms."); + } return difference; } diff --git a/Server/src/main/core/tools/mysql/Results.java b/Server/src/main/core/tools/mysql/Results.java index 6efc2333b..b803566e6 100644 --- a/Server/src/main/core/tools/mysql/Results.java +++ b/Server/src/main/core/tools/mysql/Results.java @@ -22,7 +22,7 @@ public class Results { return result; } catch (Exception e) { - System.out.println("Column '" + column + "' not found."); + } return null; @@ -38,7 +38,7 @@ public class Results { return result; } catch (Exception e) { - System.out.println("Column '" + column + "' not found."); + } return -1; @@ -60,7 +60,7 @@ public class Results { return columns; } catch (Exception e) { - System.out.println("Unable to gather columns."); + } return null; @@ -72,7 +72,7 @@ public class Results { try { return !set().next(); } catch (Exception e) { - System.out.println("Error occurred, while checking for results."); + } return true; diff --git a/Server/src/main/core/worker/MajorUpdateWorker.kt b/Server/src/main/core/worker/MajorUpdateWorker.kt index 88c4c8261..b4b892ebc 100644 --- a/Server/src/main/core/worker/MajorUpdateWorker.kt +++ b/Server/src/main/core/worker/MajorUpdateWorker.kt @@ -6,12 +6,14 @@ import core.plugin.CorePluginTypes.Managers import core.Server import core.ServerConstants import core.ServerStore +import core.api.log import core.tools.SystemLogger import core.game.world.GameWorld import core.game.world.repository.Repository import core.game.world.update.UpdateSequence import core.net.packet.PacketProcessor import core.net.packet.PacketWriteQueue +import core.tools.Log import core.tools.colorize import java.lang.Long.max import java.text.SimpleDateFormat @@ -76,7 +78,7 @@ class MajorUpdateWorker { Thread.sleep(max(600 - (end - start), 0)) } - SystemLogger.logInfo(this::class.java, "Update worker stopped.") + log(this::class.java, Log.FINE, "Update worker stopped.") } fun handleTickActions(skipPulseUpdate: Boolean = false) { diff --git a/Server/src/main/core/worker/ManagementEvents.kt b/Server/src/main/core/worker/ManagementEvents.kt index 61922c708..556e13325 100644 --- a/Server/src/main/core/worker/ManagementEvents.kt +++ b/Server/src/main/core/worker/ManagementEvents.kt @@ -276,7 +276,6 @@ object ManagementEvents { info.username = ServerConstants.SERVER_NAME info.password = ServerConstants.MS_SECRET_KEY info.rights = 2 - SystemLogger.logAlert(this::class.java, "Creating default server account: ${info.username}, password is your MS_SECRET_KEY!") GameWorld.authenticator.createAccountWith(info) info = GameWorld.accountStorage.getAccountInfo(event.clanOwner) } diff --git a/Server/src/test/kotlin/TestUtils.kt b/Server/src/test/kotlin/TestUtils.kt index 23de9d029..f0f2e101e 100644 --- a/Server/src/test/kotlin/TestUtils.kt +++ b/Server/src/test/kotlin/TestUtils.kt @@ -10,6 +10,7 @@ import core.net.IoSession import core.net.packet.IoBuffer import org.rs09.consts.Items import core.ServerConstants +import core.api.log import core.game.shops.Shop import core.game.shops.ShopItem import core.tools.SystemLogger @@ -18,6 +19,7 @@ import core.game.system.config.ServerConfigParser import core.game.world.GameWorld import core.game.world.repository.Repository import core.game.world.update.UpdateSequence +import core.tools.Log import java.net.URI import java.nio.ByteBuffer @@ -66,7 +68,7 @@ object TestUtils { } fun advanceTicks(amount: Int, skipPulseUpdates: Boolean = true) { - SystemLogger.logInfo(this::class.java, "Advancing ticks by $amount.") + log(this::class.java, Log.FINE, "Advancing ticks by $amount.") for(i in 0 until amount) { GameWorld.majorUpdateWorker.handleTickActions(skipPulseUpdates) } diff --git a/Server/src/test/kotlin/core/storage/SQLStorageProviderTests.kt b/Server/src/test/kotlin/core/storage/SQLStorageProviderTests.kt index c88745158..7dac61bba 100644 --- a/Server/src/test/kotlin/core/storage/SQLStorageProviderTests.kt +++ b/Server/src/test/kotlin/core/storage/SQLStorageProviderTests.kt @@ -4,7 +4,9 @@ import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import core.ServerConstants +import core.api.log import core.auth.UserAccountInfo +import core.tools.Log import core.tools.SystemLogger import java.sql.SQLDataException @@ -20,9 +22,9 @@ class SQLStorageProviderTests { } @AfterAll @JvmStatic fun cleanup() { - SystemLogger.logInfo(this::class.java, "Cleaning up unit test accounts") + log(this::class.java, Log.FINE, "Cleaning up unit test accounts") testAccountNames.forEach {name -> - SystemLogger.logInfo(this::class.java, "Removing test account $name") + log(this::class.java, Log.FINE, "Removing test account $name") val info = UserAccountInfo.createDefault() info.username = name storage.remove(info) diff --git a/Server/worldprops/default.conf b/Server/worldprops/default.conf index c32123166..a4fc78959 100644 --- a/Server/worldprops/default.conf +++ b/Server/worldprops/default.conf @@ -1,4 +1,10 @@ [server] +#Log Level - the level of verbosity used for logs. +#"verbose" - ALL logs are shown +#"detailed" - FINE logs are hidden, which is generally bulk/debug info. +#"cautious" - FINE, INFO logs are hidden, meaning this level only shows warnings and errors. +#"silent" - FINE, INFO, WARN logs are hidden, meaning this level only shows errors. +log_level = "verbose" #Secret key - this is sent by the client during login. #Client/Server MUST match or connection is refused. secret_key = "2009scape_development"