Added support for varying log levels configurable in the server config (see log_level in default.conf)

Error logs now properly print to stderr when possible
Colour-coded logs
Addressed a scenario in which outgoing packet writes could get hung up
Fixed interface incorrect definition message on server startup
This commit is contained in:
Ceikry
2023-03-01 08:01:14 +00:00
committed by Ryan
parent e1faa64af7
commit 88a2f354b4
171 changed files with 723 additions and 475 deletions
+11 -9
View File
@@ -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<String>) {
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) {
+7
View File
@@ -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"),
+3 -1
View File
@@ -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
}
+9 -1
View File
@@ -57,7 +57,15 @@ fun IntArray.isNextLast(element: Int) : Boolean {
return this.isLast(this.getNext(element))
}
fun <T> LinkedList<T>.tryPop(default: T) : T {
fun <T> LinkedList<T>.tryPop(default: T?) : T? {
this.peek() ?: return default
return this.pop()
}
inline fun <reified E: Enum<E>> parseEnumEntry(name: String) : E? {
return try {
enumValueOf<E>(name)
} catch (e: Exception) {
null
}
}
+17 -6
View File
@@ -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
+2 -2
View File
@@ -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<ZoneBorders>
@@ -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()
}
}
+6 -3
View File
@@ -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;
@@ -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;
+1 -3
View File
@@ -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));
}
}
+4 -1
View File
@@ -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);
+2 -2
View File
@@ -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 + "].");
}
}
}
+6 -3
View File
@@ -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<Item> {
}
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<Item> {
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<Item> {
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);
+3 -3
View File
@@ -202,7 +202,7 @@ public final class NPCDefinition extends Definition<NPC> {
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<NPC> {
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());
// }
// }
@@ -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));
}
}
}
+11 -8
View File
@@ -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<Scenery> {
// 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<Scenery> {
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<Scenery> {
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<Scenery> {
// 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<Scenery> {
}
} else {
if (opcode != 0) {
SystemLogger.logErr(SceneryDefinition.class, "Unhandled object definition opcode: " + opcode);
log(SceneryDefinition.class, Log.ERR, "Unhandled object definition opcode: " + opcode);
}
break;
}
+4 -1
View File
@@ -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);
@@ -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;
}
@@ -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() {
+8 -8
View File
@@ -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<Node> nodes = new ArrayList<Node>();
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<Node> 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<Node> 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<Integer> entrys) {
ArrayList<Node> 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<Node> 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<Node> 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
+2 -2
View File
@@ -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))
@@ -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<Player> {
}
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."
);
@@ -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
}
@@ -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);
@@ -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)) {
@@ -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);
}
@@ -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;
}
@@ -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());
@@ -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;
}
@@ -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<Object> {
final SceneryDefinition definition = SceneryDefinition.forId(wrapper);
final List<Integer> 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()) {
@@ -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) {
@@ -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<Object> {
final SceneryDefinition definition = SceneryDefinition.forId(wrapper);
final List<Integer> 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()) {
@@ -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
@@ -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)) {
@@ -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))
@@ -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;
}
@@ -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;
}
},
@@ -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?"
);
@@ -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<Object> {
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;
}
}
@@ -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
@@ -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)
@@ -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());
}
/**
@@ -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();
}
}
@@ -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) {
@@ -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)
@@ -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);
}
@@ -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));
@@ -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())) {
@@ -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;
@@ -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);
@@ -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;
}
+3 -2
View File
@@ -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<ShopItem>{
@@ -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
@@ -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);
}
}
@@ -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<Player> 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();
}
}
@@ -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<Player> it = Repository.getPlayers().iterator(); it.hasNext();) {
Player p = it.next();
@@ -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
}
@@ -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, _ ->
@@ -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
@@ -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 ->
@@ -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 ->
@@ -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);
@@ -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.")
}
}
@@ -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.")
}
@@ -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) {
@@ -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
/**
@@ -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.")
}
}
@@ -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.")
}
}
@@ -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.")
}
}
@@ -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")
}
}
@@ -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")
}
}
@@ -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.")
}
}
@@ -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...")
}
}
@@ -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) ?: 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)
}
}
@@ -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.")
}
}
@@ -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<Int,IntArray>()
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.")
}
}
@@ -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 {
* </code> <p> To check whether a plaintext password matches one that has
* been hashed previously, use the checkpw method: <p> <code> if
* (BCrypt.checkpw(candidate_password, stored_hash))<br />
* &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("It matches");<br /> else<br
* /> &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("It does not match");<br />
* </code> <p> The gensalt() method takes an optional parameter (log_rounds)
* that determines the computational complexity of the hashing: <p> <code>
* String strong_salt = BCrypt.gensalt(10)<br /> String stronger_salt =
@@ -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 <= ' ' })
}
}
}
+2 -4
View File
@@ -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()
}
/**
@@ -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")
}
}
}
@@ -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! ");
}
@@ -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;
@@ -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];
@@ -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)
}
@@ -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--;
@@ -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);
@@ -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)
@@ -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")
}
/**
+4 -1
View File
@@ -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) {
@@ -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();
}
@@ -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 + ".");
}
}
@@ -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;
}
@@ -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;
}
@@ -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;
@@ -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;
}
@@ -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;
}
}
@@ -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}")
}
}
@@ -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);
}
}
}
@@ -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<QueuedPacket<*>?>()
private val packetsToWrite = LinkedList<QueuedPacket<*>>()
@JvmStatic
fun <T> handle(packet: OutgoingPacket<T>, context: T) {
@@ -27,6 +29,10 @@ class PacketWriteQueue {
@JvmStatic
fun <T> push(packet: OutgoingPacket<T>, 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
}
}
@@ -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)
+4 -2
View File
@@ -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)
}

Some files were not shown because too many files have changed in this diff Show More