From c61ed93aa03504dcf23eab3228191be93d331afd Mon Sep 17 00:00:00 2001 From: u9g <43508353+u9g@users.noreply.github.com> Date: Sun, 2 Oct 2022 14:48:39 -0400 Subject: 1.8.9 support --- settings.gradle | 17 ++- .../lucko/spark/forge/Forge1710CommandSender.java | 92 ------------- .../lucko/spark/forge/Forge1710PlatformInfo.java | 52 ------- .../spark/forge/Forge1710PlayerPingProvider.java | 48 ------- .../me/lucko/spark/forge/Forge1710SparkMod.java | 82 ----------- .../me/lucko/spark/forge/Forge1710TickHook.java | 59 -------- .../lucko/spark/forge/Forge1710TickReporter.java | 65 --------- .../spark/forge/Forge1710WorldInfoProvider.java | 150 -------------------- .../forge/plugin/Forge1710ClientSparkPlugin.java | 104 -------------- .../forge/plugin/Forge1710ServerSparkPlugin.java | 149 -------------------- .../spark/forge/plugin/Forge1710SparkPlugin.java | 145 -------------------- spark-forge1710/src/main/resources/mcmod.info | 7 - spark-forge189/bin/main/mcmod.info | 8 ++ .../lucko/spark/forge/Forge189CommandSender.class | Bin 0 -> 3976 bytes .../lucko/spark/forge/Forge189PlatformInfo.class | Bin 0 -> 1075 bytes .../me/lucko/spark/forge/Forge189SparkMod.class | Bin 0 -> 3137 bytes .../me/lucko/spark/forge/Forge189TickHook.class | Bin 0 -> 1744 bytes .../lucko/spark/forge/Forge189TickReporter.class | Bin 0 -> 2318 bytes .../forge/plugin/Forge189ClientSparkPlugin.class | Bin 0 -> 3317 bytes .../forge/plugin/Forge189ServerSparkPlugin.class | Bin 0 -> 4904 bytes .../spark/forge/plugin/Forge189SparkPlugin.class | Bin 0 -> 7416 bytes spark-forge189/build.gradle | 91 +++++++++++++ spark-forge189/gradle.properties | 2 + .../lucko/spark/forge/Forge189CommandSender.java | 92 +++++++++++++ .../me/lucko/spark/forge/Forge189PlatformInfo.java | 52 +++++++ .../spark/forge/Forge189PlayerPingProvider.java | 48 +++++++ .../me/lucko/spark/forge/Forge189SparkMod.java | 81 +++++++++++ .../me/lucko/spark/forge/Forge189TickHook.java | 59 ++++++++ .../me/lucko/spark/forge/Forge189TickReporter.java | 65 +++++++++ .../spark/forge/Forge189WorldInfoProvider.java | 151 +++++++++++++++++++++ .../forge/plugin/Forge189ClientSparkPlugin.java | 105 ++++++++++++++ .../forge/plugin/Forge189ServerSparkPlugin.java | 147 ++++++++++++++++++++ .../spark/forge/plugin/Forge189SparkPlugin.java | 150 ++++++++++++++++++++ spark-forge189/src/main/resources/mcmod.info | 8 ++ 34 files changed, 1075 insertions(+), 954 deletions(-) delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710CommandSender.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlatformInfo.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710SparkMod.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickHook.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickReporter.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java delete mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java delete mode 100644 spark-forge1710/src/main/resources/mcmod.info create mode 100644 spark-forge189/bin/main/mcmod.info create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/Forge189CommandSender.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/Forge189PlatformInfo.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/Forge189SparkMod.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickHook.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickReporter.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.class create mode 100644 spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189SparkPlugin.class create mode 100644 spark-forge189/build.gradle create mode 100644 spark-forge189/gradle.properties create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189CommandSender.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlatformInfo.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlayerPingProvider.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189SparkMod.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickHook.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickReporter.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/Forge189WorldInfoProvider.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.java create mode 100644 spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189SparkPlugin.java create mode 100644 spark-forge189/src/main/resources/mcmod.info diff --git a/settings.gradle b/settings.gradle index fe12f64..ed8f373 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,12 +5,27 @@ pluginManagement { url = 'https://maven.fabricmc.net/' } gradlePluginPortal() + maven { url = "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url = "https://maven.architectury.dev/" } + maven { url = "https://maven.fabricmc.net" } + maven { url = "https://maven.minecraftforge.net/" } + maven { url = "https://repo.spongepowered.org/maven/" } + maven { url = "https://repo.sk1er.club/repository/maven-releases/" } } + +// resolutionStrategy { +// eachPlugin { +// if (requested.id.id == "gg.essential.loom") { +// useModule("gg.essential:architectury-loom:"+requested.version) +// } +// } +// } } rootProject.name = 'spark' include ( 'spark-api', 'spark-common', - 'spark-forge1710' + 'spark-forge1710', + 'spark-forge189' ) diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710CommandSender.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710CommandSender.java deleted file mode 100644 index 71344a3..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710CommandSender.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import me.lucko.spark.common.command.sender.AbstractCommandSender; -import me.lucko.spark.forge.plugin.Forge1710SparkPlugin; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.rcon.RConConsoleSource; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.common.ForgeHooks; - -import java.util.UUID; - -public class Forge1710CommandSender extends AbstractCommandSender { - private final Forge1710SparkPlugin plugin; - - public Forge1710CommandSender(ICommandSender source, Forge1710SparkPlugin plugin) { - super(source); - this.plugin = plugin; - } - - @Override - public String getName() { - if (super.delegate instanceof EntityPlayer) { - return ((EntityPlayer) super.delegate).getGameProfile().getName(); - } else if (super.delegate instanceof MinecraftServer) { - return "Console"; - } else if (super.delegate instanceof RConConsoleSource) { - return "RCON Console"; - } else { - return "unknown:" + super.delegate.getClass().getSimpleName(); - } - } - - @Override - public UUID getUniqueId() { - if (super.delegate instanceof EntityPlayer) { - return ((EntityPlayer) super.delegate).getUniqueID(); - } - return null; - } - - @Override - public void sendMessage(Component message) { - /* - * Due to limitations in 1.7.10, messages with \n render incorrectly on the client. - * To work around this, we convert the message to a string first, split it by newline, - * and send each line individually. - * - * This adds a performance penalty, but avoids any weirdness with this old client. - */ - LegacyComponentSerializer serializer = LegacyComponentSerializer.builder() - .character(LegacyComponentSerializer.SECTION_CHAR) - .extractUrls() - .build(); - String output = serializer.serialize(message); - for(String line : output.split("\n")) { - Component deserialized = serializer.deserialize(line); - IChatComponent mcComponent = IChatComponent.Serializer.jsonToComponent(GsonComponentSerializer.gson().serialize(deserialized)); - super.delegate.addChatMessage(mcComponent); - } - } - - @Override - public boolean hasPermission(String permission) { - return this.plugin.hasPermission(super.delegate, permission); - } -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlatformInfo.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlatformInfo.java deleted file mode 100644 index d9c8351..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlatformInfo.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import me.lucko.spark.common.platform.PlatformInfo; -import net.minecraftforge.common.ForgeVersion; - -public class Forge1710PlatformInfo implements PlatformInfo { - private final Type type; - - public Forge1710PlatformInfo(Type type) { - this.type = type; - } - - @Override - public Type getType() { - return this.type; - } - - @Override - public String getName() { - return "Forge"; - } - - @Override - public String getVersion() { - return ForgeVersion.getVersion(); - } - - @Override - public String getMinecraftVersion() { - return "1.7.10"; - } -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java deleted file mode 100644 index 11ee45a..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import com.google.common.collect.ImmutableMap; - -import me.lucko.spark.common.monitor.ping.PlayerPingProvider; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.server.MinecraftServer; - -import java.util.List; -import java.util.Map; - -public class Forge1710PlayerPingProvider implements PlayerPingProvider { - private final MinecraftServer server; - - public Forge1710PlayerPingProvider(MinecraftServer server) { - this.server = server; - } - - @Override - public Map poll() { - ImmutableMap.Builder builder = ImmutableMap.builder(); - for (EntityPlayerMP player : (List)this.server.getConfigurationManager().playerEntityList) { - builder.put(player.getGameProfile().getName(), player.ping); - } - return builder.build(); - } -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710SparkMod.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710SparkMod.java deleted file mode 100644 index 5cdd62e..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710SparkMod.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.event.FMLServerStoppingEvent; -import cpw.mods.fml.relauncher.Side; -import me.lucko.spark.forge.plugin.Forge1710ClientSparkPlugin; -import me.lucko.spark.forge.plugin.Forge1710ServerSparkPlugin; - -import java.nio.file.Path; - -@Mod( - modid = "spark", - name = "spark", - version = "@version@", - acceptableRemoteVersions = "*" -) -public class Forge1710SparkMod { - - private Path configDirectory; - private Forge1710ServerSparkPlugin activeServerPlugin; - - public String getVersion() { - return Forge1710SparkMod.class.getAnnotation(Mod.class).version(); - } - - @EventHandler - public void preInit(FMLPreInitializationEvent e) { - this.configDirectory = e.getModConfigurationDirectory().toPath(); - } - - @EventHandler - public void clientInit(FMLInitializationEvent e) { - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { - Forge1710ClientSparkPlugin.register(this); - } - } - - @EventHandler - public void serverInit(FMLServerStartingEvent e) { - this.activeServerPlugin = Forge1710ServerSparkPlugin.register(this, e); - } - - @EventHandler - public void serverStop(FMLServerStoppingEvent e) { - if (this.activeServerPlugin != null) { - this.activeServerPlugin.disable(); - this.activeServerPlugin = null; - } - } - - public Path getConfigDirectory() { - if (this.configDirectory == null) { - throw new IllegalStateException("Config directory not set"); - } - return this.configDirectory; - } -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickHook.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickHook.java deleted file mode 100644 index 44cb11a..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickHook.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import me.lucko.spark.common.tick.AbstractTickHook; -import me.lucko.spark.common.tick.TickHook; - -public class Forge1710TickHook extends AbstractTickHook implements TickHook { - private final TickEvent.Type type; - - public Forge1710TickHook(TickEvent.Type type) { - this.type = type; - } - - @SubscribeEvent - public void onTick(TickEvent e) { - if (e.phase != TickEvent.Phase.START) { - return; - } - - if (e.type != this.type) { - return; - } - - onTick(); - } - - @Override - public void start() { - FMLCommonHandler.instance().bus().register(this); - } - - @Override - public void close() { - FMLCommonHandler.instance().bus().unregister(this); - } - -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickReporter.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickReporter.java deleted file mode 100644 index d46c4d6..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710TickReporter.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import me.lucko.spark.common.tick.SimpleTickReporter; -import me.lucko.spark.common.tick.TickReporter; - -public class Forge1710TickReporter extends SimpleTickReporter implements TickReporter { - private final TickEvent.Type type; - - public Forge1710TickReporter(TickEvent.Type type) { - this.type = type; - } - - @SubscribeEvent - public void onTick(TickEvent e) { - if (e.type != this.type) { - return; - } - - switch (e.phase) { - case START: - onStart(); - break; - case END: - onEnd(); - break; - default: - throw new AssertionError(e.phase); - } - } - - @Override - public void start() { - FMLCommonHandler.instance().bus().register(this); - } - - @Override - public void close() { - FMLCommonHandler.instance().bus().unregister(this); - super.close(); - } - -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java deleted file mode 100644 index 232f88b..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import me.lucko.spark.common.platform.world.AbstractChunkInfo; -import me.lucko.spark.common.platform.world.CountMap; -import me.lucko.spark.common.platform.world.WorldInfoProvider; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ChunkProviderClient; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.WorldServer; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.IChunkProvider; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public abstract class Forge1710WorldInfoProvider implements WorldInfoProvider { - public static final class Server extends Forge1710WorldInfoProvider { - private final MinecraftServer server; - - public Server(MinecraftServer server) { - this.server = server; - } - - @Override - public ChunksResult pollChunks() { - ChunksResult data = new ChunksResult<>(); - - for (WorldServer level : this.server.worldServers) { - ArrayList list = new ArrayList<>(); - for(Chunk chunk : (List)level.theChunkProviderServer.loadedChunks) { - list.add(new ForgeChunkInfo(chunk)); - } - data.put(level.provider.getDimensionName(), list); - } - - return data; - } - - @Override - public CountsResult pollCounts() { - int players = this.server.getCurrentPlayerCount(); - int entities = 0; - int chunks = 0; - - for (WorldServer level : this.server.worldServers) { - entities += level.loadedEntityList.size(); - chunks += level.getChunkProvider().getLoadedChunkCount(); - } - - return new CountsResult(players, entities, -1, chunks); - } - } - - @SideOnly(Side.CLIENT) - public static final class Client extends Forge1710WorldInfoProvider { - private final Minecraft client; - - public Client(Minecraft client) { - this.client = client; - } - - @Override - public ChunksResult pollChunks() { - ChunksResult data = new ChunksResult<>(); - - WorldClient level = this.client.theWorld; - if (level == null) { - return null; - } - - ArrayList list = new ArrayList<>(); - IChunkProvider provider = level.getChunkProvider(); - if(provider instanceof ChunkProviderClient) { - List chunks = ReflectionHelper.getPrivateValue(ChunkProviderClient.class, (ChunkProviderClient)provider, "chunkListing", "field_73237_c"); - for(Chunk chunk : chunks) { - list.add(new ForgeChunkInfo(chunk)); - } - } - - data.put(level.provider.getDimensionName(), list); - - return data; - } - - @Override - public CountsResult pollCounts() { - WorldClient level = this.client.theWorld; - if (level == null) { - return null; - } - - return new CountsResult(-1, level.loadedEntityList.size(), -1, level.getChunkProvider().getLoadedChunkCount()); - } - } - - static final class ForgeChunkInfo extends AbstractChunkInfo> { - private final CountMap> entityCounts; - - ForgeChunkInfo(Chunk chunk) { - super(chunk.xPosition, chunk.zPosition); - - this.entityCounts = new CountMap.Simple<>(new HashMap<>()); - for(List entityList : chunk.entityLists) { - entityList.forEach(entity -> { - this.entityCounts.increment(entity.getClass()); - }); - } - } - - @Override - public CountMap> getEntityCounts() { - return this.entityCounts; - } - - @Override - public String entityTypeName(Class type) { - return (String)EntityList.classToStringMapping.get(type); - } - } - - -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java deleted file mode 100644 index 446a0c9..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge.plugin; - -import cpw.mods.fml.common.gameevent.TickEvent; -import me.lucko.spark.common.platform.PlatformInfo; -import me.lucko.spark.common.platform.world.WorldInfoProvider; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.common.tick.TickHook; -import me.lucko.spark.common.tick.TickReporter; -import me.lucko.spark.forge.*; -import net.minecraft.client.Minecraft; -import net.minecraft.command.ICommandSender; -import net.minecraftforge.client.ClientCommandHandler; -import net.minecraftforge.common.MinecraftForge; - -import java.util.stream.Stream; - -public class Forge1710ClientSparkPlugin extends Forge1710SparkPlugin { - - public static void register(Forge1710SparkMod mod) { - Forge1710ClientSparkPlugin plugin = new Forge1710ClientSparkPlugin(mod, Minecraft.getMinecraft()); - plugin.enable(); - - // register listeners - MinecraftForge.EVENT_BUS.register(plugin); - - // register commands - ClientCommandHandler.instance.registerCommand(plugin); - } - - private final Minecraft minecraft; - private final ThreadDumper gameThreadDumper; - - public Forge1710ClientSparkPlugin(Forge1710SparkMod mod, Minecraft minecraft) { - super(mod); - this.minecraft = minecraft; - this.gameThreadDumper = new ThreadDumper.Specific(minecraft.mcThread); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return this.gameThreadDumper; - } - - @Override - public boolean hasPermission(ICommandSender sender, String permission) { - return true; - } - - @Override - public Stream getCommandSenders() { - return Stream.of(new Forge1710CommandSender(this.minecraft.thePlayer, this)); - } - - @Override - public TickHook createTickHook() { - return new Forge1710TickHook(TickEvent.Type.CLIENT); - } - - @Override - public TickReporter createTickReporter() { - return new Forge1710TickReporter(TickEvent.Type.CLIENT); - } - - @Override - public WorldInfoProvider createWorldInfoProvider() { - return new Forge1710WorldInfoProvider.Client(Minecraft.getMinecraft()); - } - - @Override - public void executeSync(Runnable task) { - this.minecraft.addScheduledTask(task); - } - - @Override - public PlatformInfo getPlatformInfo() { - return new Forge1710PlatformInfo(PlatformInfo.Type.CLIENT); - } - - @Override - public String getCommandName() { - return "sparkc"; - } - -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java deleted file mode 100644 index 03f55d7..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge.plugin; - -import com.google.common.collect.Queues; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import me.lucko.spark.common.platform.PlatformInfo; -import me.lucko.spark.common.platform.world.WorldInfoProvider; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.common.tick.TickHook; -import me.lucko.spark.common.tick.TickReporter; -import me.lucko.spark.forge.*; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.server.MinecraftServer; - -import java.util.List; -import java.util.Queue; -import java.util.stream.Stream; - -public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin { - private final Queue scheduledServerTasks = Queues.newArrayDeque(); - - private final ThreadDumper.GameThread gameThreadDumper; - - public static Forge1710ServerSparkPlugin register(Forge1710SparkMod mod, FMLServerStartingEvent event) { - Forge1710ServerSparkPlugin plugin = new Forge1710ServerSparkPlugin(mod, event.getServer()); - plugin.enable(); - - FMLCommonHandler.instance().bus().register(plugin); - - // register commands & permissions - event.registerServerCommand(plugin); - - return plugin; - } - - @Override - public void disable() { - super.disable(); - FMLCommonHandler.instance().bus().unregister(this); - } - - @SubscribeEvent - public void onServerTickEnd(TickEvent.ServerTickEvent event) { - if(event.phase == TickEvent.Phase.START) { - synchronized(scheduledServerTasks) { - while (!scheduledServerTasks.isEmpty()) - { - scheduledServerTasks.poll().run(); - } - } - } - } - - private final MinecraftServer server; - - public Forge1710ServerSparkPlugin(Forge1710SparkMod mod, MinecraftServer server) { - super(mod); - this.server = server; - this.gameThreadDumper = new ThreadDumper.GameThread(); - this.gameThreadDumper.setThread(Thread.currentThread()); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return this.gameThreadDumper.get(); - } - - @Override - public boolean hasPermission(ICommandSender sender, String permission) { - if (sender instanceof EntityPlayerMP) { - EntityPlayerMP player = (EntityPlayerMP)sender; - if(isOp(player)) - return true; - else { - String serverOwner = MinecraftServer.getServer().getServerOwner(); - if(player.getGameProfile().getName() != null && serverOwner != null) - return serverOwner.equals(player.getGameProfile().getName()); - else - return false; - } - } else { - return true; - } - } - - @Override - public Stream getCommandSenders() { - return Stream.concat( - ((List)this.server.getConfigurationManager().playerEntityList).stream(), - Stream.of(this.server) - ).map(sender -> new Forge1710CommandSender(sender, this)); - } - - @Override - public TickHook createTickHook() { - return new Forge1710TickHook(TickEvent.Type.SERVER); - } - - @Override - public TickReporter createTickReporter() { - return new Forge1710TickReporter(TickEvent.Type.SERVER); - } - - @Override - public WorldInfoProvider createWorldInfoProvider() { - return new Forge1710WorldInfoProvider.Server(FMLCommonHandler.instance().getMinecraftServerInstance()); - } - - @Override - public void executeSync(Runnable task) { - synchronized (scheduledServerTasks) { - scheduledServerTasks.add(task); - } - } - - @Override - public PlatformInfo getPlatformInfo() { - return new Forge1710PlatformInfo(PlatformInfo.Type.SERVER); - } - - @Override - public String getCommandName() { - return "spark"; - } -} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java deleted file mode 100644 index 26e1752..0000000 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge.plugin; - -import cpw.mods.fml.common.FMLCommonHandler; -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.forge.Forge1710CommandSender; -import me.lucko.spark.forge.Forge1710SparkMod; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.logging.Level; - -public abstract class Forge1710SparkPlugin implements SparkPlugin, ICommand { - - private final Forge1710SparkMod mod; - private final Logger logger; - protected final ScheduledExecutorService scheduler; - protected final SparkPlatform platform; - - protected Forge1710SparkPlugin(Forge1710SparkMod mod) { - this.mod = mod; - this.logger = LogManager.getLogger("spark"); - this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { - Thread thread = Executors.defaultThreadFactory().newThread(r); - thread.setName("spark-forge-async-worker"); - thread.setDaemon(true); - return thread; - }); - this.platform = new SparkPlatform(this); - } - - public void enable() { - this.platform.enable(); - } - - public void disable() { - this.platform.disable(); - this.scheduler.shutdown(); - } - - public abstract boolean hasPermission(ICommandSender sender, String permission); - - @Override - public String getVersion() { - return this.mod.getVersion(); - } - - @Override - public Path getPluginDirectory() { - return this.mod.getConfigDirectory(); - } - - @Override - public void executeAsync(Runnable task) { - this.scheduler.execute(task); - } - - @Override - public void log(Level level, String msg) { - if (level == Level.INFO) { - this.logger.info(msg); - } else if (level == Level.WARNING) { - this.logger.warn(msg); - } else if (level == Level.SEVERE) { - this.logger.error(msg); - } else { - throw new IllegalArgumentException(level.getName()); - } - } - - // implement ICommand - - @Override - public String getCommandName() { - return getCommandName(); - } - - @Override - public String getCommandUsage(ICommandSender iCommandSender) { - return "/" + getCommandName(); - } - - @Override - public List getCommandAliases() { - return Collections.singletonList(getCommandName()); - } - - @Override - public void processCommand(ICommandSender sender, String[] args) { - this.platform.executeCommand(new Forge1710CommandSender(sender, this), args); - } - - @Override - public List addTabCompletionOptions(ICommandSender sender, String[] args) { - return this.platform.tabCompleteCommand(new Forge1710CommandSender(sender, this), args); - } - - @Override - public boolean canCommandSenderUseCommand(ICommandSender sender) { - return this.platform.hasPermissionForAnyCommand(new Forge1710CommandSender(sender, this)); - } - - @Override - public boolean isUsernameIndex(String[] strings, int i) { - return false; - } - - @Override - public int compareTo(Object o) { - return getCommandName().compareTo(((ICommand)o).getCommandName()); - } - - protected boolean isOp(EntityPlayer player) { - return FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().canSendCommands(player.getGameProfile()); - } - -} diff --git a/spark-forge1710/src/main/resources/mcmod.info b/spark-forge1710/src/main/resources/mcmod.info deleted file mode 100644 index 1c2c241..0000000 --- a/spark-forge1710/src/main/resources/mcmod.info +++ /dev/null @@ -1,7 +0,0 @@ -[{ - "modid": "spark", - "name": "spark", - "description": "${pluginDescription}", - "version": "${pluginVersion}", - "authors": ["Luck"] -}] diff --git a/spark-forge189/bin/main/mcmod.info b/spark-forge189/bin/main/mcmod.info new file mode 100644 index 0000000..50e5509 --- /dev/null +++ b/spark-forge189/bin/main/mcmod.info @@ -0,0 +1,8 @@ +[{ + "modid": "spark", + "name": "spark", + "description": "${pluginDescription}", + "version": "${pluginVersion}", + "authors": ["Luck"], + "mcversion": "1.8.9" +}] diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/Forge189CommandSender.class b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189CommandSender.class new file mode 100644 index 0000000..7d43775 Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189CommandSender.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/Forge189PlatformInfo.class b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189PlatformInfo.class new file mode 100644 index 0000000..123c3cb Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189PlatformInfo.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/Forge189SparkMod.class b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189SparkMod.class new file mode 100644 index 0000000..45bbd69 Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189SparkMod.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickHook.class b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickHook.class new file mode 100644 index 0000000..60f9e75 Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickHook.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickReporter.class b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickReporter.class new file mode 100644 index 0000000..73e467d Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/Forge189TickReporter.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.class b/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.class new file mode 100644 index 0000000..16965e1 Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.class b/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.class new file mode 100644 index 0000000..03d22ed Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.class differ diff --git a/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189SparkPlugin.class b/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189SparkPlugin.class new file mode 100644 index 0000000..450a3fd Binary files /dev/null and b/spark-forge189/bin/main/me/lucko/spark/forge/plugin/Forge189SparkPlugin.class differ diff --git a/spark-forge189/build.gradle b/spark-forge189/build.gradle new file mode 100644 index 0000000..f3cb184 --- /dev/null +++ b/spark-forge189/build.gradle @@ -0,0 +1,91 @@ +import dev.architectury.pack200.java.Pack200Adapter + +plugins { + id 'idea' + id 'java' + id 'gg.essential.loom' version '0.10.0.+' + id 'dev.architectury.architectury-pack200' version '0.1.3' + id 'com.github.johnrengelman.shadow' version '7.1.2' +} + +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 +compileJava.options.encoding = 'UTF-8' + +sourceSets { + main { + output.resourcesDir = java.classesDirectory + } +} + +loom { + + forge { + pack200Provider = new Pack200Adapter() + } +} + +configurations { + embed + implementation.extendsFrom(embed) +} + +repositories { + mavenCentral() + maven { url = "https://repo.sk1er.club/repository/maven-public/" } + maven { url = "https://jitpack.io/" } + maven { url = "https://repo.spongepowered.org/repository/maven-public/" } +} + +dependencies { + minecraft 'com.mojang:minecraft:1.8.9' + mappings 'de.oceanlabs.mcp:mcp_stable:22-1.8.9' + forge 'net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9' + + embed project(':spark-common') +} + +jar { + archiveClassifier.set("deobf") +} + +shadowJar { + archiveFileName.set("spark-forge189.jar") + configurations = [project.configurations.embed] + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +remapJar { + archiveClassifier.set("USETHISONE") + from shadowJar + input.set(shadowJar.archiveFile) +} + +artifacts { + archives shadowJar + shadow shadowJar +} + +build.dependsOn(shadowJar) + +processResources { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version': project.version + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } + + from(file("LICENSE")) +} \ No newline at end of file diff --git a/spark-forge189/gradle.properties b/spark-forge189/gradle.properties new file mode 100644 index 0000000..38d70d1 --- /dev/null +++ b/spark-forge189/gradle.properties @@ -0,0 +1,2 @@ +loom.platform=forge +org.gradle.jvmargs=-Xmx2g \ No newline at end of file diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189CommandSender.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189CommandSender.java new file mode 100644 index 0000000..6c8bd5a --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189CommandSender.java @@ -0,0 +1,92 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import me.lucko.spark.common.command.sender.AbstractCommandSender; +import me.lucko.spark.forge.plugin.Forge189SparkPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.network.rcon.RConConsoleSource; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.common.ForgeHooks; + +import java.util.UUID; + +public class Forge189CommandSender extends AbstractCommandSender { + private final Forge189SparkPlugin plugin; + + public Forge189CommandSender(ICommandSender source, Forge189SparkPlugin plugin) { + super(source); + this.plugin = plugin; + } + + @Override + public String getName() { + if (super.delegate instanceof EntityPlayer) { + return ((EntityPlayer) super.delegate).getGameProfile().getName(); + } else if (super.delegate instanceof MinecraftServer) { + return "Console"; + } else if (super.delegate instanceof RConConsoleSource) { + return "RCON Console"; + } else { + return "unknown:" + super.delegate.getClass().getSimpleName(); + } + } + + @Override + public UUID getUniqueId() { + if (super.delegate instanceof EntityPlayer) { + return ((EntityPlayer) super.delegate).getUniqueID(); + } + return null; + } + + @Override + public void sendMessage(Component message) { + /* + * Due to limitations in 1.7.10, messages with \n render incorrectly on the client. + * To work around this, we convert the message to a string first, split it by newline, + * and send each line individually. + * + * This adds a performance penalty, but avoids any weirdness with this old client. + */ + LegacyComponentSerializer serializer = LegacyComponentSerializer.builder() + .character(LegacyComponentSerializer.SECTION_CHAR) + .extractUrls() + .build(); + String output = serializer.serialize(message); + for(String line : output.split("\n")) { + Component deserialized = serializer.deserialize(line); + IChatComponent mcComponent = IChatComponent.Serializer.jsonToComponent(GsonComponentSerializer.gson().serialize(deserialized)); + super.delegate.addChatMessage(mcComponent); + } + } + + @Override + public boolean hasPermission(String permission) { + return this.plugin.hasPermission(super.delegate, permission); + } +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlatformInfo.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlatformInfo.java new file mode 100644 index 0000000..6058f51 --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlatformInfo.java @@ -0,0 +1,52 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import me.lucko.spark.common.platform.PlatformInfo; +import net.minecraftforge.common.ForgeVersion; + +public class Forge189PlatformInfo implements PlatformInfo { + private final Type type; + + public Forge189PlatformInfo(Type type) { + this.type = type; + } + + @Override + public Type getType() { + return this.type; + } + + @Override + public String getName() { + return "Forge"; + } + + @Override + public String getVersion() { + return ForgeVersion.getVersion(); + } + + @Override + public String getMinecraftVersion() { + return "1.8.9"; + } +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlayerPingProvider.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlayerPingProvider.java new file mode 100644 index 0000000..149ca1a --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189PlayerPingProvider.java @@ -0,0 +1,48 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import com.google.common.collect.ImmutableMap; + +import me.lucko.spark.common.monitor.ping.PlayerPingProvider; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; + +import java.util.List; +import java.util.Map; + +public class Forge189PlayerPingProvider implements PlayerPingProvider { + private final MinecraftServer server; + + public Forge189PlayerPingProvider(MinecraftServer server) { + this.server = server; + } + + @Override + public Map poll() { + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (EntityPlayerMP player : (List)this.server.getConfigurationManager().playerEntityList) { + builder.put(player.getGameProfile().getName(), player.ping); + } + return builder.build(); + } +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189SparkMod.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189SparkMod.java new file mode 100644 index 0000000..5fce36a --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189SparkMod.java @@ -0,0 +1,81 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import me.lucko.spark.forge.plugin.Forge189ClientSparkPlugin; +import me.lucko.spark.forge.plugin.Forge189ServerSparkPlugin; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; +import net.minecraftforge.fml.relauncher.Side; + +import java.nio.file.Path; + +@Mod( + modid = "spark", + name = "spark", + version = "@version@", + acceptableRemoteVersions = "*" +) +public class Forge189SparkMod { + + private Path configDirectory; + private Forge189ServerSparkPlugin activeServerPlugin; + + public String getVersion() { + return Forge189SparkMod.class.getAnnotation(Mod.class).version(); + } + + @Mod.EventHandler + public void preInit(FMLPreInitializationEvent e) { + this.configDirectory = e.getModConfigurationDirectory().toPath(); + } + + @Mod.EventHandler + public void clientInit(FMLInitializationEvent e) { + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + Forge189ClientSparkPlugin.register(this); + } + } + + @Mod.EventHandler + public void serverInit(FMLServerStartingEvent e) { + this.activeServerPlugin = Forge189ServerSparkPlugin.register(this, e); + } + + @Mod.EventHandler + public void serverStop(FMLServerStoppingEvent e) { + if (this.activeServerPlugin != null) { + this.activeServerPlugin.disable(); + this.activeServerPlugin = null; + } + } + + public Path getConfigDirectory() { + if (this.configDirectory == null) { + throw new IllegalStateException("Config directory not set"); + } + return this.configDirectory; + } +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickHook.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickHook.java new file mode 100644 index 0000000..f375d56 --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickHook.java @@ -0,0 +1,59 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import me.lucko.spark.common.tick.AbstractTickHook; +import me.lucko.spark.common.tick.TickHook; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class Forge189TickHook extends AbstractTickHook implements TickHook { + private final TickEvent.Type type; + + public Forge189TickHook(TickEvent.Type type) { + this.type = type; + } + + @SubscribeEvent + public void onTick(TickEvent e) { + if (e.phase != TickEvent.Phase.START) { + return; + } + + if (e.type != this.type) { + return; + } + + onTick(); + } + + @Override + public void start() { + FMLCommonHandler.instance().bus().register(this); + } + + @Override + public void close() { + FMLCommonHandler.instance().bus().unregister(this); + } + +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickReporter.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickReporter.java new file mode 100644 index 0000000..b489e8b --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189TickReporter.java @@ -0,0 +1,65 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import me.lucko.spark.common.tick.SimpleTickReporter; +import me.lucko.spark.common.tick.TickReporter; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class Forge189TickReporter extends SimpleTickReporter implements TickReporter { + private final TickEvent.Type type; + + public Forge189TickReporter(TickEvent.Type type) { + this.type = type; + } + + @SubscribeEvent + public void onTick(TickEvent e) { + if (e.type != this.type) { + return; + } + + switch (e.phase) { + case START: + onStart(); + break; + case END: + onEnd(); + break; + default: + throw new AssertionError(e.phase); + } + } + + @Override + public void start() { + FMLCommonHandler.instance().bus().register(this); + } + + @Override + public void close() { + FMLCommonHandler.instance().bus().unregister(this); + super.close(); + } + +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189WorldInfoProvider.java b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189WorldInfoProvider.java new file mode 100644 index 0000000..d98fe41 --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/Forge189WorldInfoProvider.java @@ -0,0 +1,151 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge; + +import me.lucko.spark.common.platform.world.AbstractChunkInfo; +import me.lucko.spark.common.platform.world.CountMap; +import me.lucko.spark.common.platform.world.WorldInfoProvider; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ChunkProviderClient; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ClassInheritanceMultiMap; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.fml.relauncher.ReflectionHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public abstract class Forge189WorldInfoProvider implements WorldInfoProvider { + public static final class Server extends Forge189WorldInfoProvider { + private final MinecraftServer server; + + public Server(MinecraftServer server) { + this.server = server; + } + + @Override + public ChunksResult pollChunks() { + ChunksResult data = new ChunksResult<>(); + + for (WorldServer level : this.server.worldServers) { + ArrayList list = new ArrayList<>(); + for(Chunk chunk : (List)level.theChunkProviderServer.loadedChunks) { + list.add(new ForgeChunkInfo(chunk)); + } + data.put(level.provider.getDimensionName(), list); + } + + return data; + } + + @Override + public CountsResult pollCounts() { + int players = this.server.getCurrentPlayerCount(); + int entities = 0; + int chunks = 0; + + for (WorldServer level : this.server.worldServers) { + entities += level.loadedEntityList.size(); + chunks += level.getChunkProvider().getLoadedChunkCount(); + } + + return new CountsResult(players, entities, -1, chunks); + } + } + + @SideOnly(Side.CLIENT) + public static final class Client extends Forge189WorldInfoProvider { + private final Minecraft client; + + public Client(Minecraft client) { + this.client = client; + } + + @Override + public ChunksResult pollChunks() { + ChunksResult data = new ChunksResult<>(); + + WorldClient level = this.client.theWorld; + if (level == null) { + return null; + } + + ArrayList list = new ArrayList<>(); + IChunkProvider provider = level.getChunkProvider(); + if(provider instanceof ChunkProviderClient) { + List chunks = ReflectionHelper.getPrivateValue(ChunkProviderClient.class, (ChunkProviderClient)provider, "chunkListing", "field_73237_c"); + for(Chunk chunk : chunks) { + list.add(new ForgeChunkInfo(chunk)); + } + } + + data.put(level.provider.getDimensionName(), list); + + return data; + } + + @Override + public CountsResult pollCounts() { + WorldClient level = this.client.theWorld; + if (level == null) { + return null; + } + + return new CountsResult(-1, level.loadedEntityList.size(), -1, level.getChunkProvider().getLoadedChunkCount()); + } + } + + static final class ForgeChunkInfo extends AbstractChunkInfo> { + private final CountMap> entityCounts; + + ForgeChunkInfo(Chunk chunk) { + super(chunk.xPosition, chunk.zPosition); + + this.entityCounts = new CountMap.Simple<>(new HashMap<>()); + for(ClassInheritanceMultiMap entityList : chunk.getEntityLists()) { + entityList.forEach(entity -> { + this.entityCounts.increment(entity.getClass()); + }); + } + } + + @Override + public CountMap> getEntityCounts() { + return this.entityCounts; + } + + @Override + public String entityTypeName(Class type) { + return (String)EntityList.classToStringMapping.get(type); + } + } + + +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.java b/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.java new file mode 100644 index 0000000..b2cef1d --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ClientSparkPlugin.java @@ -0,0 +1,105 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge.plugin; + +import me.lucko.spark.common.platform.PlatformInfo; +import me.lucko.spark.common.platform.world.WorldInfoProvider; +import me.lucko.spark.common.sampler.ThreadDumper; +import me.lucko.spark.common.tick.TickHook; +import me.lucko.spark.common.tick.TickReporter; +import me.lucko.spark.forge.*; +import net.minecraft.client.Minecraft; +import net.minecraft.command.ICommandSender; +import net.minecraftforge.client.ClientCommandHandler; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.relauncher.ReflectionHelper; + +import java.util.stream.Stream; + +public class Forge189ClientSparkPlugin extends Forge189SparkPlugin { + + public static void register(Forge189SparkMod mod) { + Forge189ClientSparkPlugin plugin = new Forge189ClientSparkPlugin(mod, Minecraft.getMinecraft()); + plugin.enable(); + + // register listeners + MinecraftForge.EVENT_BUS.register(plugin); + + // register commands + ClientCommandHandler.instance.registerCommand(plugin); + } + + private final Minecraft minecraft; + private final ThreadDumper gameThreadDumper; + + public Forge189ClientSparkPlugin(Forge189SparkMod mod, Minecraft minecraft) { + super(mod); + this.minecraft = minecraft; + this.gameThreadDumper = new ThreadDumper.Specific((Thread) ReflectionHelper.getPrivateValue(Minecraft.class, minecraft, "mcThread", "field_152352_aC", "aO")); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return this.gameThreadDumper; + } + + @Override + public boolean hasPermission(ICommandSender sender, String permission) { + return true; + } + + @Override + public Stream getCommandSenders() { + return Stream.of(new Forge189CommandSender(this.minecraft.thePlayer, this)); + } + + @Override + public TickHook createTickHook() { + return new Forge189TickHook(TickEvent.Type.CLIENT); + } + + @Override + public TickReporter createTickReporter() { + return new Forge189TickReporter(TickEvent.Type.CLIENT); + } + + @Override + public WorldInfoProvider createWorldInfoProvider() { + return new Forge189WorldInfoProvider.Client(Minecraft.getMinecraft()); + } + + @Override + public void executeSync(Runnable task) { + this.minecraft.addScheduledTask(task); + } + + @Override + public PlatformInfo getPlatformInfo() { + return new Forge189PlatformInfo(PlatformInfo.Type.CLIENT); + } + + @Override + public String getCommandName() { + return "sparkc"; + } + +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.java b/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.java new file mode 100644 index 0000000..a8ab211 --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189ServerSparkPlugin.java @@ -0,0 +1,147 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge.plugin; + +import com.google.common.collect.Queues; +import me.lucko.spark.common.platform.PlatformInfo; +import me.lucko.spark.common.platform.world.WorldInfoProvider; +import me.lucko.spark.common.sampler.ThreadDumper; +import me.lucko.spark.common.tick.TickHook; +import me.lucko.spark.common.tick.TickReporter; +import me.lucko.spark.forge.*; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +import java.util.Queue; +import java.util.stream.Stream; + +public class Forge189ServerSparkPlugin extends Forge189SparkPlugin { + private final Queue scheduledServerTasks = Queues.newArrayDeque(); + + private final ThreadDumper.GameThread gameThreadDumper; + + public static Forge189ServerSparkPlugin register(Forge189SparkMod mod, FMLServerStartingEvent event) { + Forge189ServerSparkPlugin plugin = new Forge189ServerSparkPlugin(mod, event.getServer()); + plugin.enable(); + + FMLCommonHandler.instance().bus().register(plugin); + + // register commands & permissions + event.registerServerCommand(plugin); + + return plugin; + } + + @Override + public void disable() { + super.disable(); + FMLCommonHandler.instance().bus().unregister(this); + } + + @SubscribeEvent + public void onServerTickEnd(TickEvent.ServerTickEvent event) { + if(event.phase == TickEvent.Phase.START) { + synchronized(scheduledServerTasks) { + while (!scheduledServerTasks.isEmpty()) + { + scheduledServerTasks.poll().run(); + } + } + } + } + + private final MinecraftServer server; + + public Forge189ServerSparkPlugin(Forge189SparkMod mod, MinecraftServer server) { + super(mod); + this.server = server; + this.gameThreadDumper = new ThreadDumper.GameThread(); + this.gameThreadDumper.setThread(Thread.currentThread()); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return this.gameThreadDumper.get(); + } + + @Override + public boolean hasPermission(ICommandSender sender, String permission) { + if (sender instanceof EntityPlayerMP) { + EntityPlayerMP player = (EntityPlayerMP)sender; + if(isOp(player)) + return true; + else { + String serverOwner = MinecraftServer.getServer().getServerOwner(); + if(player.getGameProfile().getName() != null && serverOwner != null) + return serverOwner.equals(player.getGameProfile().getName()); + else + return false; + } + } else { + return true; + } + } + + @Override + public Stream getCommandSenders() { + return Stream.concat( + this.server.getConfigurationManager().playerEntityList.stream(), + Stream.of(this.server) + ).map(sender -> new Forge189CommandSender(sender, this)); + } + + @Override + public TickHook createTickHook() { + return new Forge189TickHook(TickEvent.Type.SERVER); + } + + @Override + public TickReporter createTickReporter() { + return new Forge189TickReporter(TickEvent.Type.SERVER); + } + + @Override + public WorldInfoProvider createWorldInfoProvider() { + return new Forge189WorldInfoProvider.Server(FMLCommonHandler.instance().getMinecraftServerInstance()); + } + + @Override + public void executeSync(Runnable task) { + synchronized (scheduledServerTasks) { + scheduledServerTasks.add(task); + } + } + + @Override + public PlatformInfo getPlatformInfo() { + return new Forge189PlatformInfo(PlatformInfo.Type.SERVER); + } + + @Override + public String getCommandName() { + return "spark"; + } +} diff --git a/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189SparkPlugin.java b/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189SparkPlugin.java new file mode 100644 index 0000000..6ada30c --- /dev/null +++ b/spark-forge189/src/main/java/me/lucko/spark/forge/plugin/Forge189SparkPlugin.java @@ -0,0 +1,150 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge.plugin; + +import com.google.common.collect.Lists; +import me.lucko.spark.common.SparkPlatform; +import me.lucko.spark.common.SparkPlugin; +import me.lucko.spark.forge.Forge189CommandSender; +import me.lucko.spark.forge.Forge189SparkMod; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockPos; +import net.minecraftforge.fml.common.FMLCommonHandler; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.logging.Level; + +public abstract class Forge189SparkPlugin implements SparkPlugin, ICommand { + + private final Forge189SparkMod mod; + private final Logger logger; + protected final ScheduledExecutorService scheduler; + protected final SparkPlatform platform; + + protected Forge189SparkPlugin(Forge189SparkMod mod) { + this.mod = mod; + this.logger = LogManager.getLogger("spark"); + this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { + Thread thread = Executors.defaultThreadFactory().newThread(r); + thread.setName("spark-forge-async-worker"); + thread.setDaemon(true); + return thread; + }); + this.platform = new SparkPlatform(this); + } + + public void enable() { + this.platform.enable(); + } + + public void disable() { + this.platform.disable(); + this.scheduler.shutdown(); + } + + public abstract boolean hasPermission(ICommandSender sender, String permission); + + @Override + public String getVersion() { + return this.mod.getVersion(); + } + + @Override + public Path getPluginDirectory() { + return this.mod.getConfigDirectory(); + } + + @Override + public void executeAsync(Runnable task) { + this.scheduler.execute(task); + } + + @Override + public void log(Level level, String msg) { + if (level == Level.INFO) { + this.logger.info(msg); + } else if (level == Level.WARNING) { + this.logger.warn(msg); + } else if (level == Level.SEVERE) { + this.logger.error(msg); + } else { + throw new IllegalArgumentException(level.getName()); + } + } + + // implement ICommand + + @Override + public String getCommandName() { + return "sparkc"; + } + + @Override + public String getCommandUsage(ICommandSender iCommandSender) { + return "/" + getCommandName(); + } + + private final List aliases = Lists.newArrayList("sparkc", "sparkclient"); + + @Override + public List getCommandAliases() { + return aliases; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + this.platform.executeCommand(new Forge189CommandSender(sender, this), args); + } + + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { + return this.platform.tabCompleteCommand(new Forge189CommandSender(sender, this), args); + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return this.platform.hasPermissionForAnyCommand(new Forge189CommandSender(sender, this)); + } + + @Override + public boolean isUsernameIndex(String[] strings, int i) { + return false; + } + + @Override + public int compareTo(@NotNull ICommand o) { + return getCommandName().compareTo(o.getCommandName()); + } + + protected boolean isOp(EntityPlayer player) { + return FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().canSendCommands(player.getGameProfile()); + } + +} diff --git a/spark-forge189/src/main/resources/mcmod.info b/spark-forge189/src/main/resources/mcmod.info new file mode 100644 index 0000000..50e5509 --- /dev/null +++ b/spark-forge189/src/main/resources/mcmod.info @@ -0,0 +1,8 @@ +[{ + "modid": "spark", + "name": "spark", + "description": "${pluginDescription}", + "version": "${pluginVersion}", + "authors": ["Luck"], + "mcversion": "1.8.9" +}] -- cgit