Migrate src outside since there is no need to separate api
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package io.akarin.server.mixin.core;
|
||||
|
||||
import java.io.PrintStream;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.bukkit.craftbukkit.Main;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(value = Main.class, remap = false)
|
||||
public class Bootstrap {
|
||||
private final static Logger logger = LogManager.getLogger("Akarin");
|
||||
|
||||
@Inject(method = "main([Ljava/lang/String;)V", at = @At("HEAD"))
|
||||
private static void configureMixin(CallbackInfo info) {
|
||||
;
|
||||
}
|
||||
|
||||
/*
|
||||
* Notify message
|
||||
*/
|
||||
@Redirect(method = "main", at = @At(
|
||||
value = "INVOKE_STRING",
|
||||
target = "Ljava/io/PrintStream;println(Ljava/lang/String;)V",
|
||||
args = "ldc=*** Warning, you've not updated in a while! ***"
|
||||
))
|
||||
private static void notifyUpdate(PrintStream stream, String text) {
|
||||
logger.warn("You've not updated in a while, the current version may outdated");
|
||||
}
|
||||
|
||||
@Redirect(method = "main", at = @At(
|
||||
value = "INVOKE_STRING",
|
||||
target = "Ljava/io/PrintStream;println(Ljava/lang/String;)V",
|
||||
args = "ldc=*** Please download a new build as per instructions from https://paperci.emc.gs/ ***"
|
||||
))
|
||||
private static void notifyWebsite(PrintStream stream, String text) {
|
||||
logger.warn("Visit our website for latest information https://akarin.io/");
|
||||
}
|
||||
|
||||
@Redirect(method = "main", at = @At(
|
||||
value = "INVOKE_STRING",
|
||||
target = "Ljava/io/PrintStream;println(Ljava/lang/String;)V",
|
||||
args = "ldc=Loading libraries, please wait..."
|
||||
))
|
||||
private static void notifyLoading(PrintStream stream, String text) {
|
||||
logger.info("Loading libraries, please wait..");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package io.akarin.server.mixin.core;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import net.minecraft.server.EULA;
|
||||
|
||||
@Mixin(value = EULA.class, remap = false)
|
||||
public class DummyEula {
|
||||
/**
|
||||
* Read then check the EULA file <i>formerly</i>
|
||||
* @param file
|
||||
* @return true
|
||||
*/
|
||||
@Overwrite
|
||||
public boolean a(File file) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the EULA has been accepted <i>formerly</i>
|
||||
* @return true
|
||||
*/
|
||||
@Overwrite
|
||||
public boolean a() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate an EULA file <i>formerly</i>
|
||||
*/
|
||||
@Overwrite
|
||||
public void b() {}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.akarin.server.mixin.core;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
|
||||
@Mixin(value = MinecraftServer.class, remap = false)
|
||||
public class MixinMinecraftServer {
|
||||
@Overwrite
|
||||
public String getServerModName() {
|
||||
return "Akarin";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
package io.akarin.server.mixin.core;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.ThreadInfo;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.CraftServer;
|
||||
import org.spigotmc.RestartCommand;
|
||||
import org.spigotmc.WatchdogThread;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
|
||||
@Mixin(value = WatchdogThread.class, remap = false)
|
||||
public class Watchcat extends Thread {
|
||||
@Shadow private static WatchdogThread instance;
|
||||
@Shadow private @Final long timeoutTime;
|
||||
@Shadow private @Final boolean restart;
|
||||
@Shadow private volatile long lastTick;
|
||||
@Shadow private volatile boolean stopping;
|
||||
|
||||
@Shadow private static void dumpThread(ThreadInfo thread, Logger log) {}
|
||||
|
||||
@Inject(method = "<init>(JZ)V", at = @At("RETURN"))
|
||||
private void hook(CallbackInfo info) {
|
||||
setName("Akarin Watchcat Thread");
|
||||
}
|
||||
|
||||
@Override
|
||||
@Overwrite
|
||||
public void run() {
|
||||
while (!stopping) {
|
||||
//
|
||||
if (lastTick != 0 && System.currentTimeMillis() > lastTick + timeoutTime && !Boolean.getBoolean("disable.watchdog")) { // Paper - Add property to disable
|
||||
Logger log = Bukkit.getServer().getLogger();
|
||||
log.log(Level.SEVERE, "Server has stopped responding!");
|
||||
log.log(Level.SEVERE, "Please report this to https://github.com/Akarin-project/Akarin/issues");
|
||||
log.log(Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports");
|
||||
log.log(Level.SEVERE, "Akarin version: " + Bukkit.getServer().getVersion());
|
||||
//
|
||||
if (net.minecraft.server.World.haveWeSilencedAPhysicsCrash) {
|
||||
log.log(Level.SEVERE, "------------------------------");
|
||||
log.log(Level.SEVERE, "During the run of the server, a physics stackoverflow was supressed");
|
||||
log.log(Level.SEVERE, "near " + net.minecraft.server.World.blockLocation);
|
||||
}
|
||||
// Paper start - Warn in watchdog if an excessive velocity was ever set
|
||||
if (CraftServer.excessiveVelEx != null) {
|
||||
log.log(Level.SEVERE, "------------------------------");
|
||||
log.log(Level.SEVERE, "During the run of the server, a plugin set an excessive velocity on an entity");
|
||||
log.log(Level.SEVERE, "This may be the cause of the issue, or it may be entirely unrelated");
|
||||
log.log(Level.SEVERE, CraftServer.excessiveVelEx.getMessage());
|
||||
for (StackTraceElement stack : CraftServer.excessiveVelEx.getStackTrace()) {
|
||||
log.log(Level.SEVERE, "\t\t" + stack);
|
||||
}
|
||||
}
|
||||
// Paper end
|
||||
log.log(Level.SEVERE, "------------------------------");
|
||||
log.log(Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Akarin!):");
|
||||
dumpThread(ManagementFactory.getThreadMXBean().getThreadInfo(MinecraftServer.getServer().primaryThread.getId(), Integer.MAX_VALUE), log);
|
||||
log.log(Level.SEVERE, "------------------------------");
|
||||
//
|
||||
log.log(Level.SEVERE, "Entire Thread Dump:");
|
||||
ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
|
||||
for (ThreadInfo thread : threads) {
|
||||
dumpThread(thread, log);
|
||||
}
|
||||
log.log(Level.SEVERE, "------------------------------");
|
||||
|
||||
if (restart) RestartCommand.restart();
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
sleep(9000); // Akarin
|
||||
} catch (InterruptedException ex) {
|
||||
interrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package io.akarin.server.mixin.core.network;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.ServerConnection;
|
||||
|
||||
@Mixin(value = ServerConnection.class, remap = false)
|
||||
public class NonblockingServerConnection {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user