diff --git a/.github/ISSUE_TEMPLATE/bug-oder-fehler.md b/.github/ISSUE_TEMPLATE/bug-oder-fehler.md new file mode 100644 index 0000000..6568971 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-oder-fehler.md @@ -0,0 +1,28 @@ +--- +name: Bug oder Fehler +about: Melde hier einen Bug oder Fehler für das Projekt +title: UCAB - Füge hier eine kurze Beschreibung ein +labels: bug +assignees: '' + +--- + +**Beschreibe den Bug oder Fehler** +Eine klare und präzise Beschreibung des Fehlers. + +**Wie kann der Bug oder Fehler reproduziert werden?** +Schritte zum Reproduzieren des Verhaltens: +1. Gehen zu "..." +2. Klicke auf "..." +3. Scrolle nach unten zu "..." +4. Dort ist der Fehler + +**Erwartetes Verhalten** +Eine klare und präzise Beschreibung dessen, was erwartet wurde. + +**Screenshots** +Füge gegebenenfalls Screenshots hinzu, um das Problem zu erläutern. + +**Weitere Informationen (bitte ausfüllen):** +Minecraft Version: `1.16.5` +Addon Version: `x.y.z` diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..a29b05d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,19 @@ +--- +name: Feature +about: Stelle hier eine Idee oder Erweiterung für das Projekt vor +title: UCAF - Füge hier eine kurze Beschreibung ein +labels: enhancement +assignees: '' + +--- + +**Aus welchem Grund ist die Idee oder Erweiterung hilfreich?** +Eine klare und präzise Beschreibung der Idee oder Erweiterung. + +**Was soll passieren, wie soll die Idee oder Erweiterung umgesetzt werden?** +Eine klare und präzise Beschreibung dessen, was passieren soll. +- [ ] ... +- [ ] ... + +**Sonstiges** +Füge hier jeglichen anderen Kontext oder Screenshots zur Funktionsanfrage hinzu. diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 0f2b1a4..f8d34bb 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -3,12 +3,10 @@ name: Gradle build on: push: branches: - - master - main - develop pull_request: branches: - - master - main - develop @@ -26,9 +24,4 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew downloadAPI build - - name: Upload jar - uses: actions/upload-artifact@v1 - with: - name: Artifacts - path: build/libs/ \ No newline at end of file + run: ./gradlew downloadAPI build \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..10a3c08 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,30 @@ +name: Gradle release + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew downloadAPI shadowJar + - name: Upload jar + uses: actions/upload-artifact@v1 + with: + name: Artifacts + path: build/libs/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index 46fc282..c9096a8 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ buildscript { dependencies { classpath group: 'com.github.ImpactDevelopment', name: 'ForgeGradle', version: '3.0.115' classpath group: 'com.github.ImpactDevelopment', name: 'MixinGradle', version: '0.6.2' + classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1' } } @@ -22,6 +23,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' apply plugin: 'org.spongepowered.mixin' +apply plugin: 'com.github.johnrengelman.shadow' version = '1.0.0' group = 'com.rettichlp.UnicacityAddon' // http://maven.apache.org/guides/mini/guide-naming-conventions.html @@ -78,12 +80,12 @@ repositories { mavenLocal() } - dependencies { annotationProcessor("org.spongepowered:mixin:0.8.2:processor") minecraft 'com.github.ImpactDevelopment:Vanilla:1.16.5' compile(files('libs/lm_api_mc1.16.5.jar')) + // compile(files('libs/reflections-0.10.2.jar')) compile('org.ow2.asm:asm-analysis:9.3') { transitive = false } compile('org.ow2.asm:asm-util:9.3') { transitive = false } @@ -91,11 +93,11 @@ dependencies { compile("org.spongepowered:mixin:0.8.2") { transitive = false } compile("net.minecraft:launchwrapper:1.12") { transitive = false } + implementation 'org.jetbrains:annotations:23.0.0' implementation 'org.reflections:reflections:0.10.2' } jar { - // Excludes the start file exclude("**/launch") } @@ -110,5 +112,7 @@ task downloadAPI(type: Download) { src "https://dl.labymod.net/latest/api/files/lm_api_mc1.16.5.jar" dest 'libs/' -} + // src "https://github.com/ronmamo/reflections/releases/download/0.10.2/reflections-0.10.2.jar" + // dest 'libs/' +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/UnicacityAddon.java b/src/main/java/com/rettichlp/UnicacityAddon/UnicacityAddon.java index 4f30c72..f160b2e 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/UnicacityAddon.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/UnicacityAddon.java @@ -1,122 +1,42 @@ package com.rettichlp.UnicacityAddon; -import com.google.gson.JsonObject; -import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; -import com.rettichlp.UnicacityAddon.base.command.CommandHandler; -import com.rettichlp.UnicacityAddon.base.text.ColorCode; -import com.rettichlp.UnicacityAddon.base.text.Message; +import com.rettichlp.UnicacityAddon.base.config.ConfigSettings; +import com.rettichlp.UnicacityAddon.base.event.UCEventHandler; +import com.rettichlp.UnicacityAddon.base.faction.FactionHandler; +import com.rettichlp.UnicacityAddon.base.module.UCModuleHandler; import net.labymod.api.LabyModAddon; -import net.labymod.main.LabyMod; -import net.labymod.settings.elements.HeaderElement; +import net.labymod.ingamegui.ModuleCategoryRegistry; import net.labymod.settings.elements.SettingsElement; -import net.minecraft.client.Minecraft; import java.util.List; -import java.util.logging.Logger; /** * @author RettichLP */ public class UnicacityAddon extends LabyModAddon { - public static final String VERSION = "1.0.0"; - public static Logger LOGGER = Logger.getLogger("UnicacityAddon"); - public static JsonObject CONFIG; - public static final LabyMod LABYMOD = LabyMod.getInstance(); - public static final Minecraft MINECRAFT = Minecraft.getInstance(); + public static final String VERSION = "1.0.0-beta"; + public static UnicacityAddon ADDON; @Override public void onEnable() { - // CommandHandler - AbstractionLayer.getLabymod().getEventService().registerListener(new CommandHandler()); + ADDON = this; - // Events + UCEventHandler.registerEvents(); + UCModuleHandler.registerModules(); + + FactionHandler.getPlayerFactionMap(); + FactionHandler.getPlayerRankMap(); + + ModuleCategoryRegistry.loadCategory(UCModuleHandler.UNICACITY); } - @Override public void loadConfig() { - CONFIG = getConfig(); + @Override + public void loadConfig() { } @Override protected void fillSettings(List list) { - - list.add(new HeaderElement(Message.getBuilder() - .of("U").color(ColorCode.RED).bold().advance() - .of("nica").color(ColorCode.BLUE).bold().advance() - .of("C").color(ColorCode.RED).bold().advance() - .of("ity").color(ColorCode.BLUE).bold().advance() - .of("A").color(ColorCode.RED).bold().advance() - .of("ddon").color(ColorCode.BLUE).bold().advance() - .space() - .of("v" + VERSION).color(ColorCode.BLUE).bold().advance() - .space() - .of("-").color(ColorCode.GRAY).bold().advance() - .space() - .of("by RettichLP").color(ColorCode.GOLD).advance() - .create())); - - /* - // jobs - list.add(new HeaderElement(Message.getBuilder() - .of("Jobs").color(ColorCode.WHITE).bold().advance() - .create())); - - list.add(new BooleanElement("Auto /dropammo", - this, - new ControlElement.IconData(Material.ARROW), - "command.jobs.dropammo", - AbstractionLayer.getConfig().getCommandJobsDropammo())); - - list.add(new BooleanElement("Automatisch /droptransport", - this, - new ControlElement.IconData(Material.CHEST), - "command.jobs.droptransport", - AbstractionLayer.getConfig().getCommandJobsDroptransport())); - - list.add(new BooleanElement("Auto /dropwaste", - this, - new ControlElement.IconData(Material.CAULDRON), - "command.jobs.dropwaste", - AbstractionLayer.getConfig().getCommandJobsDropwaste())); - - // factions - list.add(new HeaderElement(Message.getBuilder() - .of("Fraktionen").color(ColorCode.WHITE).bold().advance() - .create())); - - list.add(new BooleanElement("Toggle1", - this, - new ControlElement.IconData(Material.CAULDRON), - "config.factions.toggle1", - UnicacityAddonConfig.factions_toggle1)); - - // any - list.add(new HeaderElement(Message.getBuilder() - .of("").color(ColorCode.WHITE).bold().advance() - .create())); - - list.add(new BooleanElement("Tankwarnung", - this, - new ControlElement.IconData(Material.BUCKET), - "config.car.tankWarning", - AbstractionLayer.getConfig().getEventCarTankWarning())); - - - BooleanElement jobs = new BooleanElement("Jobs", - this, - new ControlElement.IconData(Material.FISHING_ROD), - "config.job", - true); - jobs.setSubSettings(jobSettings); - list.add(jobs); - - BooleanElement faction = new BooleanElement("Fraktion", - this, - new ControlElement.IconData(Material.FISHING_ROD), - "config.faction", - true); - faction.setSubSettings(factionSettings); - list.add(faction); - */ + ConfigSettings.createConfig(this, list); } -} +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/AbstractionLayer.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/AbstractionLayer.java index bc4d96c..3df549b 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/AbstractionLayer.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/AbstractionLayer.java @@ -1,6 +1,5 @@ package com.rettichlp.UnicacityAddon.base.abstraction; -import com.rettichlp.UnicacityAddon.base.exceptions.ConfigClassCannotBeInstantiated; import com.rettichlp.UnicacityAddon.base.exceptions.LabymodClassCannotBeInstantiated; import com.rettichlp.UnicacityAddon.base.exceptions.UPlayerClassCannotBeInstantiated; @@ -12,18 +11,9 @@ */ public class AbstractionLayer { - private static final Class configClass = ConfigImpl.class; private static final Class labymodClass = LabymodImpl.class; private static final Class uplayerClass = UPlayerImpl.class; - public static Config getConfig() { - try { - return configClass.getDeclaredConstructor().newInstance(); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new ConfigClassCannotBeInstantiated("Class " + configClass + " cannot be instantiated.", e); - } - } - public static Labymod getLabymod() { try { return labymodClass.getDeclaredConstructor().newInstance(); diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Config.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Config.java deleted file mode 100644 index 081adf2..0000000 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Config.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.rettichlp.UnicacityAddon.base.abstraction; - -import com.google.gson.JsonObject; - -/** - * @author RettichLP - * @see UCUtils by paulzhng - */ -public interface Config { - - JsonObject getConfig(); - - boolean getEventCarTankWarning(); - - boolean getCommandJobsDropammo(); - - boolean getCommandJobsDroptransport(); - - boolean getCommandJobsDropwaste(); -} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/ConfigImpl.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/ConfigImpl.java deleted file mode 100644 index 74b0af1..0000000 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/ConfigImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.rettichlp.UnicacityAddon.base.abstraction; - -import com.google.gson.JsonObject; -import com.rettichlp.UnicacityAddon.UnicacityAddon; - -/** - * @author RettichLP - * @see UCUtils by paulzhng - */ -public class ConfigImpl implements Config { - - // this.numberExample = getConfig().has( "number" ) ? getConfig().get( "number" ).getAsInt() : 5; // <- default value '5' - - @Override - public JsonObject getConfig() { - return UnicacityAddon.CONFIG; - } - - @Override // default = true - public boolean getEventCarTankWarning() { - return !getConfig().has("event.car.tankWarning") || getConfig().get("event.car.tankWarning").getAsBoolean(); - } - - @Override // default = true - public boolean getCommandJobsDropammo() { - return !getConfig().has("command.jobs.dropammo") || getConfig().get("command.jobs.dropammo").getAsBoolean(); - } - - @Override // default = true - public boolean getCommandJobsDroptransport() { - return !getConfig().has("command.jobs.droptransport") || getConfig().get("command.jobs.droptransport").getAsBoolean(); - } - - @Override // default = true - public boolean getCommandJobsDropwaste() { - return !getConfig().has("command.jobs.dropwaste") || getConfig().get("command.jobs.dropwaste").getAsBoolean(); - } -} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Labymod.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Labymod.java index 4ab5327..26fa751 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Labymod.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/Labymod.java @@ -1,18 +1,10 @@ package com.rettichlp.UnicacityAddon.base.abstraction; +import com.google.gson.JsonObject; +import com.rettichlp.UnicacityAddon.UnicacityAddon; +import net.labymod.api.LabyModAPI; import net.labymod.api.event.EventService; import net.labymod.main.LabyMod; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.network.play.ClientPlayNetHandler; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.PlayerContainer; -import net.minecraft.scoreboard.Scoreboard; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.world.World; - -import java.util.UUID; /** * @author RettichLP @@ -20,7 +12,13 @@ */ public interface Labymod { + UnicacityAddon getAddon(); + LabyMod getLabymod(); EventService getEventService(); + + LabyModAPI getApi(); + + JsonObject getConfig(); } diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/LabymodImpl.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/LabymodImpl.java index 004b4ca..da8d3e2 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/LabymodImpl.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/LabymodImpl.java @@ -1,6 +1,8 @@ package com.rettichlp.UnicacityAddon.base.abstraction; +import com.google.gson.JsonObject; import com.rettichlp.UnicacityAddon.UnicacityAddon; +import net.labymod.api.LabyModAPI; import net.labymod.api.event.EventService; import net.labymod.main.LabyMod; @@ -10,13 +12,23 @@ */ public class LabymodImpl implements Labymod { - @Override - public LabyMod getLabymod() { - return UnicacityAddon.LABYMOD; + @Override public UnicacityAddon getAddon() { + return UnicacityAddon.ADDON; } - @Override - public EventService getEventService() { + @Override public LabyMod getLabymod() { + return LabyMod.getInstance(); + } + + @Override public EventService getEventService() { return getLabymod().getEventService(); } + + @Override public LabyModAPI getApi() { + return getAddon().getApi(); + } + + @Override public JsonObject getConfig() { + return getAddon().getConfig(); + } } diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayer.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayer.java index 5911c43..1960239 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayer.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayer.java @@ -1,5 +1,6 @@ package com.rettichlp.UnicacityAddon.base.abstraction; +import com.rettichlp.UnicacityAddon.base.faction.Faction; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.network.play.ClientPlayNetHandler; import net.minecraft.entity.player.PlayerInventory; @@ -7,6 +8,7 @@ import net.minecraft.scoreboard.Scoreboard; import net.minecraft.server.MinecraftServer; import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; @@ -32,10 +34,14 @@ public interface UPlayer { World getWorld(); + BlockPos getPosition(); + void sendMessage(ITextComponent message); void sendMessageAsString(String message); + void sendChatMessage(String message); + void playSound(SoundEvent soundEvent, Float volume, Float pitch); PlayerInventory getInventory(); @@ -43,4 +49,6 @@ public interface UPlayer { PlayerContainer getContainer(); ClientPlayNetHandler getConnection(); + + Faction getFaction(); } diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayerImpl.java b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayerImpl.java index 2e73dac..d873132 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayerImpl.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/abstraction/UPlayerImpl.java @@ -1,6 +1,8 @@ package com.rettichlp.UnicacityAddon.base.abstraction; -import com.rettichlp.UnicacityAddon.UnicacityAddon; +import com.rettichlp.UnicacityAddon.base.faction.Faction; +import com.rettichlp.UnicacityAddon.base.faction.FactionHandler; +import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.network.play.ClientPlayNetHandler; import net.minecraft.entity.player.PlayerInventory; @@ -8,6 +10,7 @@ import net.minecraft.scoreboard.Scoreboard; import net.minecraft.server.MinecraftServer; import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; @@ -21,7 +24,7 @@ public class UPlayerImpl implements UPlayer { @Override public ClientPlayerEntity getPlayer() { - return UnicacityAddon.MINECRAFT.player; + return Minecraft.getInstance().player; } @Override @@ -51,7 +54,12 @@ public Scoreboard getScoreboard() { @Override public World getWorld() { - return getPlayer().getEntityWorld(); + return Minecraft.getInstance().world; + } + + @Override + public BlockPos getPosition() { + return getPlayer().getPosition(); } @Override @@ -64,6 +72,11 @@ public void sendMessageAsString(String message) { sendMessage(ITextComponent.getTextComponentOrEmpty(message)); } + @Override + public void sendChatMessage(String message) { + getPlayer().sendChatMessage(message); + } + @Override public void playSound(SoundEvent soundEvent, Float volume, Float pitch) { getPlayer().playSound(soundEvent, volume, pitch); @@ -83,4 +96,10 @@ public PlayerContainer getContainer() { public ClientPlayNetHandler getConnection() { return getPlayer().connection; } + + @Override + public Faction getFaction() { + if (FactionHandler.getPlayerFactionMap().containsKey(getName())) return FactionHandler.getPlayerFactionMap().get(getName()); + return Faction.NULL; + } } diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/command/CommandHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/base/command/CommandHandler.java deleted file mode 100644 index d44735e..0000000 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/command/CommandHandler.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.rettichlp.UnicacityAddon.base.command; - -import com.rettichlp.UnicacityAddon.UnicacityAddon; -import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; -import com.rettichlp.UnicacityAddon.base.abstraction.UPlayer; -import com.rettichlp.UnicacityAddon.base.text.ColorCode; -import com.rettichlp.UnicacityAddon.base.text.Message; -import net.labymod.api.event.Subscribe; -import net.labymod.api.event.events.client.chat.MessageSendEvent; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.reflections.util.ClasspathHelper; -import org.reflections.util.ConfigurationBuilder; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -/** - * @author RettichLP - */ -public class CommandHandler { - - @Subscribe - public void onMessage(MessageSendEvent e) { - String msg = e.getMessage(); - if (!msg.startsWith("/")) return; - e.setCancelled(true); - - String label = msg.split(" ")[0].substring(1); - String[] args = msg.substring(label.length() + 2).split(" "); - - try { - Map> commandMap = getCommandMap(); - if (!commandMap.containsKey(label)) return; - - Class commandClass = commandMap.get(label); - Method commandMethod = commandClass.getDeclaredMethod("onCommand", UPlayer.class, String[].class); - - Object commandClassInstance = commandClass.newInstance(); - boolean success = (boolean) commandMethod.invoke(commandClassInstance, AbstractionLayer.getPlayer(), args); - - if (!success) { - Message.getBuilder() - .error() - .space() - .of(commandMethod.getAnnotation(Command.class).usage().replace("%label%", label)).color(ColorCode.GRAY).advance() - .sendTo(AbstractionLayer.getPlayer().getPlayer()); - UnicacityAddon.LOGGER.warning("Syntax error in executed command: " + label + " by: " + AbstractionLayer.getPlayer().getName()); - } else - UnicacityAddon.LOGGER.info("Successfully executed command: " + label + " by: " + AbstractionLayer.getPlayer().getName()); - - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | InstantiationException ex) { - UnicacityAddon.LOGGER.severe("Error in CommandHandler during execution: " + label); - throw new RuntimeException(ex); - } - } - - private Map> getCommandMap() { - Map> commandMap = new HashMap<>(); - - ConfigurationBuilder configurationBuilder = new ConfigurationBuilder() - .setUrls(ClasspathHelper.forPackage("com.rettichlp.UnicacityAddon")) - .setScanners(Scanners.MethodsAnnotated); - - Reflections reflections = new Reflections(configurationBuilder); - - reflections.getMethodsAnnotatedWith(Command.class).forEach(method -> { - Command commandAnnotation = method.getAnnotation(Command.class); - - for (int i = 0; i < commandAnnotation.value().length; i++) { - commandMap.put(commandAnnotation.value()[i], method.getDeclaringClass()); - } - - }); - - return commandMap; - } -} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/command/Command.java b/src/main/java/com/rettichlp/UnicacityAddon/base/command/UCCommand.java similarity index 92% rename from src/main/java/com/rettichlp/UnicacityAddon/base/command/Command.java rename to src/main/java/com/rettichlp/UnicacityAddon/base/command/UCCommand.java index 1b52c48..3761e17 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/command/Command.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/command/UCCommand.java @@ -10,10 +10,10 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) -public @interface Command { +public @interface UCCommand { String[] value(); String usage() default "/%label%"; -} +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/command/UCCommandHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/base/command/UCCommandHandler.java new file mode 100644 index 0000000..7995c5a --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/command/UCCommandHandler.java @@ -0,0 +1,82 @@ +package com.rettichlp.UnicacityAddon.base.command; + +import com.rettichlp.UnicacityAddon.UnicacityAddon; +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import com.rettichlp.UnicacityAddon.base.event.UCEvent; +import com.rettichlp.UnicacityAddon.base.text.ColorCode; +import com.rettichlp.UnicacityAddon.base.text.Message; +import net.labymod.api.event.Subscribe; +import net.labymod.api.event.events.client.chat.MessageSendEvent; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.reflections.scanners.Scanners.MethodsAnnotated; + +/** + * @author RettichLP + */ +@UCEvent +public class UCCommandHandler { + + @Subscribe + public void onMessageSend(MessageSendEvent e) { + String msg = e.getMessage(); + if (!msg.startsWith("/")) return; + + String label = msg.substring(1); + List args = new ArrayList<>(); + + if (msg.contains(" ")) { + label = msg.split(" ")[0].substring(1); + args = Arrays.asList(msg.substring(label.length() + 2).split(" ")); + } + + Map commandMap = getCommandMap(); + if (!commandMap.containsKey(label)) return; + e.setCancelled(true); + + Method method = commandMap.get(label); + Class clazz = method.getDeclaringClass(); + + try { + Object commandClassInstance = clazz.newInstance(); + boolean success = (boolean) method.invoke(commandClassInstance, AbstractionLayer.getPlayer(), args); + + if (!success) Message.getBuilder() + .error() + .space() + .of("Syntax: " + method.getAnnotation(UCCommand.class).usage().replace("%label%", label)).color(ColorCode.GRAY).advance() + .sendTo(AbstractionLayer.getPlayer().getPlayer()); + + } catch (InvocationTargetException ex) { + ex.getCause().printStackTrace(); + throw new RuntimeException(ex); + } catch (InstantiationException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + private Map getCommandMap() { + Map commandMap = new HashMap<>(); + + Reflections reflections = new Reflections(UnicacityAddon.class.getPackage().getName(), Scanners.values()); + reflections.get(MethodsAnnotated.with(UCCommand.class).as(Method.class)).forEach(method -> { + UCCommand ucCommand = method.getAnnotation(UCCommand.class); + System.out.println(Arrays.toString(ucCommand.value())); + + for (int i = 0; i < ucCommand.value().length; i++) { + commandMap.put(ucCommand.value()[i], method); + } + }); + + return commandMap; + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/command/UnicacityCommand.java b/src/main/java/com/rettichlp/UnicacityAddon/base/command/UnicacityCommand.java index 16069ba..e2adf59 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/command/UnicacityCommand.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/command/UnicacityCommand.java @@ -2,10 +2,12 @@ import com.rettichlp.UnicacityAddon.base.abstraction.UPlayer; +import java.util.List; + /** * @author RettichLP */ public interface UnicacityCommand { - boolean onCommand(UPlayer p, String[] args); + boolean onCommand(UPlayer p, List args); } \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/config/ConfigElements.java b/src/main/java/com/rettichlp/UnicacityAddon/base/config/ConfigElements.java new file mode 100644 index 0000000..ad0bcb6 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/config/ConfigElements.java @@ -0,0 +1,115 @@ +package com.rettichlp.UnicacityAddon.base.config; + +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import com.rettichlp.UnicacityAddon.base.faction.Faction; +import com.rettichlp.UnicacityAddon.base.text.ColorCode; +import org.jetbrains.annotations.NotNull; + +public class ConfigElements { + + // FACTION + public static boolean getNameTagFaction() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_FACTION") && AbstractionLayer.getLabymod().getConfig().get("NAMETAG_FACTION") + .getAsBoolean(); // default = false + } + + public static ColorCode getNameTagFactionColor() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_FACTION_COLOR") ? + ColorCode.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_FACTION_COLOR").getAsString()) : + ColorCode.BLUE; // default = BLUE + } + + public static void setNameTagFactionColor(@NotNull ColorCode factionColor) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_FACTION_COLOR", factionColor.toString()); + } + + // FACTIONSUFFIX + public static boolean getNameTagFactionSuffix() { + return !AbstractionLayer.getLabymod().getConfig().has("NAMETAG_FACTIONSUFFIX") || AbstractionLayer.getLabymod().getConfig().get("NAMETAG_FACTIONSUFFIX") + .getAsBoolean(); // default = true + } + + // HOUSEBAN + public static boolean getNameTagHouseban() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_HOUSEBAN") && AbstractionLayer.getLabymod().getConfig().get("NAMETAG_HOUSEBAN") + .getAsBoolean(); // default = false + } + + // ALLIANCE + public static boolean getNameTagAlliance() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_ALLIANCE") && AbstractionLayer.getLabymod().getConfig().get("NAMETAG_ALLIANCE") + .getAsBoolean(); // default = false + } + + public static ColorCode getNameTagAllianceColor() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_ALLIANCE_COLOR") ? + ColorCode.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_ALLIANCE_COLOR").getAsString()) : + ColorCode.DARK_PURPLE; // default = DARK_PURPLE + } + + public static Faction getNameTagAlliance1() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_ALLIANCE1") ? + Faction.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_ALLIANCE1").getAsString()) : + Faction.NULL; // default = NULL + } + + public static Faction getNameTagAlliance2() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_ALLIANCE2") ? + Faction.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_ALLIANCE2").getAsString()) : + Faction.NULL; // default = NULL + } + + public static void setNameTagAllianceColor(@NotNull ColorCode allianceColor) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_ALLIANCE_COLOR", allianceColor.toString()); + } + + public static void setNameTagAlliance1(@NotNull Faction allianceFaction1) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_ALLIANCE1", allianceFaction1.toString()); + } + + public static void setNameTagAlliance2(@NotNull Faction allianceFaction2) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_ALLIANCE2", allianceFaction2.toString()); + } + + // STREETWAR + public static boolean getNameTagStreetwar() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_STREETWAR") && AbstractionLayer.getLabymod().getConfig().get("NAMETAG_STREETWAR") + .getAsBoolean(); // default = false + } + + public static ColorCode getNameTagStreetwarColor() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_STREETWAR_COLOR") ? + ColorCode.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_STREETWAR_COLOR").getAsString()) : + ColorCode.DARK_RED; // default = DARK_RED + } + + public static Faction getNameTagStreetwar1() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_STREETWAR1") ? + Faction.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_STREETWAR1").getAsString()) : + Faction.NULL; // default = NULL + } + + public static Faction getNameTagStreetwar2() { + return AbstractionLayer.getLabymod().getConfig().has("NAMETAG_STREETWAR2") ? + Faction.valueOf(AbstractionLayer.getLabymod().getConfig().get("NAMETAG_STREETWAR2").getAsString()) : + Faction.NULL; // default = NULL + } + + public static void setNameTagStreetwarColor(@NotNull ColorCode streetwarColor) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_STREETWAR_COLOR", streetwarColor.toString()); + } + + public static void setNameTagStreetwar1(@NotNull Faction streetwarFaction1) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_STREETWAR1", streetwarFaction1.toString()); + } + + public static void setNameTagStreetwar2(@NotNull Faction streetwarFaction2) { + AbstractionLayer.getLabymod().getConfig().addProperty("NAMETAG_STREETWAR2", streetwarFaction2.toString()); + } + + // ATMINFO + public static boolean getEventATMInfo() { + return !AbstractionLayer.getLabymod().getConfig().has("EVENT_ATMINFO") || AbstractionLayer.getLabymod().getConfig().get("EVENT_ATMINFO") + .getAsBoolean(); // default = true + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/config/ConfigSettings.java b/src/main/java/com/rettichlp/UnicacityAddon/base/config/ConfigSettings.java new file mode 100644 index 0000000..b3f3437 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/config/ConfigSettings.java @@ -0,0 +1,146 @@ +package com.rettichlp.UnicacityAddon.base.config; + +import com.rettichlp.UnicacityAddon.UnicacityAddon; +import com.rettichlp.UnicacityAddon.base.faction.Faction; +import com.rettichlp.UnicacityAddon.base.text.ColorCode; +import com.rettichlp.UnicacityAddon.base.text.Message; +import net.labymod.gui.elements.DropDownMenu; +import net.labymod.main.LabyMod; +import net.labymod.settings.Settings; +import net.labymod.settings.elements.BooleanElement; +import net.labymod.settings.elements.ControlElement; +import net.labymod.settings.elements.DropDownElement; +import net.labymod.settings.elements.HeaderElement; +import net.labymod.settings.elements.SettingsElement; +import net.labymod.utils.Material; + +import java.util.List; + +public class ConfigSettings { + + public static void createConfig(UnicacityAddon unicacityAddon, List list) { + list.add(new HeaderElement(Message.getBuilder() + .of("U").color(ColorCode.RED).bold().advance() + .of("nica").color(ColorCode.BLUE).bold().advance() + .of("C").color(ColorCode.RED).bold().advance() + .of("ity").color(ColorCode.BLUE).bold().advance() + .of("A").color(ColorCode.RED).bold().advance() + .of("ddon").color(ColorCode.BLUE).bold().advance() + .space() + .of("v" + UnicacityAddon.VERSION).color(ColorCode.BLUE).bold().advance() + .space() + .of("-").color(ColorCode.GRAY).bold().advance() + .space() + .of("by RettichLP").color(ColorCode.GOLD).advance() + .create())); + + list.add(new HeaderElement(Message.getBuilder() + .of("Einstellungen").color(ColorCode.WHITE).advance() + .create())); + + BooleanElement nameTagFactionSuffix = new BooleanElement("Fraktionsinfo", unicacityAddon, new ControlElement.IconData(Material.NAME_TAG), "NAMETAG_FACTIONSUFFIX", + ConfigElements.getNameTagFactionSuffix()); + list.add(nameTagFactionSuffix); + + BooleanElement nameTagFaction = new BooleanElement("Fraktion", unicacityAddon, new ControlElement.IconData(Material.BLUE_DYE), "NAMETAG_FACTION", + ConfigElements.getNameTagFaction()); + nameTagFaction.setSubSettings(nameTagFactionSettings()); + list.add(nameTagFaction); + + BooleanElement nameTagAlliance = new BooleanElement("Bündnis", unicacityAddon, new ControlElement.IconData(Material.PURPLE_DYE), "NAMETAG_ALLIANCE", + ConfigElements.getNameTagAlliance()); + nameTagAlliance.setSubSettings(nameTagAllianceSettings()); + list.add(nameTagAlliance); + + BooleanElement nameTagStreetwar = new BooleanElement("Streetwar", unicacityAddon, new ControlElement.IconData(Material.DIAMOND_HORSE_ARMOR), "NAMETAG_STREETWAR", + ConfigElements.getNameTagStreetwar()); + nameTagStreetwar.setSubSettings(nameTagStreetwarSettings()); + list.add(nameTagStreetwar); + + BooleanElement nameTagForHouseBan = new BooleanElement("Hausverbot", unicacityAddon, new ControlElement.IconData(Material.SPAWNER), "NAMETAG_HOUSEBAN", + ConfigElements.getNameTagHouseban()); + list.add(nameTagForHouseBan); + + list.add(new HeaderElement(Message.getBuilder() + .of("").color(ColorCode.WHITE).advance() + .create())); + + BooleanElement eventATMInfo = new BooleanElement("ATM Info", unicacityAddon, new ControlElement.IconData(Material.SEA_LANTERN), "EVENT_ATMINFO", + ConfigElements.getEventATMInfo()); + list.add(eventATMInfo); + } + + private static Settings nameTagAllianceSettings() { + Settings settings = new Settings(); + + DropDownMenu dropDownMenu0 = new DropDownMenu("Farbe", 0, 0, 0, 0).fill(ColorCode.values()); + dropDownMenu0.setSelected(ConfigElements.getNameTagAllianceColor()); + dropDownMenu0.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, ColorCode.valueOf(object.toString().toUpperCase()).toString(), x, y)); + DropDownElement dropDownElement0 = new DropDownElement<>("", dropDownMenu0); + dropDownElement0.setChangeListener(ConfigElements::setNameTagAllianceColor); + + DropDownMenu dropDownMenu1 = new DropDownMenu("Bündnisfraktion 1", 0, 0, 0, 0).fill(Faction.values()); + dropDownMenu1.setSelected(ConfigElements.getNameTagAlliance1()); + dropDownMenu1.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, Faction.valueOf(object.toString().toUpperCase()).getDisplayName(), x, y)); + DropDownElement dropDownElement1 = new DropDownElement<>("", dropDownMenu1); + dropDownElement1.setChangeListener(ConfigElements::setNameTagAlliance1); + + DropDownMenu dropDownMenu2 = new DropDownMenu("Bündnisfraktion 2 (optional)", 0, 0, 0, 0).fill(Faction.values()); + dropDownMenu2.setSelected(ConfigElements.getNameTagAlliance2()); + dropDownMenu2.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, Faction.valueOf(object.toString().toUpperCase()).getDisplayName(), x, y)); + DropDownElement dropDownElement2 = new DropDownElement<>("", dropDownMenu2); + dropDownElement2.setChangeListener(ConfigElements::setNameTagAlliance2); + + settings.add(dropDownElement0); + settings.add(dropDownElement1); + settings.add(dropDownElement2); + return settings; + } + + private static Settings nameTagFactionSettings() { + Settings settings = new Settings(); + + DropDownMenu dropDownMenu0 = new DropDownMenu("Farbe", 0, 0, 0, 0).fill(ColorCode.values()); + dropDownMenu0.setSelected(ConfigElements.getNameTagFactionColor()); + dropDownMenu0.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, ColorCode.valueOf(object.toString().toUpperCase()).toString(), x, y)); + DropDownElement dropDownElement0 = new DropDownElement<>("", dropDownMenu0); + dropDownElement0.setChangeListener(ConfigElements::setNameTagFactionColor); + + settings.add(dropDownElement0); + return settings; + } + + private static Settings nameTagStreetwarSettings() { + Settings settings = new Settings(); + + DropDownMenu dropDownMenu0 = new DropDownMenu("Farbe", 0, 0, 0, 0).fill(ColorCode.values()); + dropDownMenu0.setSelected(ConfigElements.getNameTagStreetwarColor()); + dropDownMenu0.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, ColorCode.valueOf(object.toString().toUpperCase()).toString(), x, y)); + DropDownElement dropDownElement0 = new DropDownElement<>("", dropDownMenu0); + dropDownElement0.setChangeListener(ConfigElements::setNameTagStreetwarColor); + + DropDownMenu dropDownMenu1 = new DropDownMenu("Streetwarfraktion 1", 0, 0, 0, 0).fill(Faction.values()); + dropDownMenu1.setSelected(ConfigElements.getNameTagStreetwar1()); + dropDownMenu1.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, Faction.valueOf(object.toString().toUpperCase()).getDisplayName(), x, y)); + DropDownElement dropDownElement1 = new DropDownElement<>("", dropDownMenu1); + dropDownElement1.setChangeListener(ConfigElements::setNameTagStreetwar1); + + DropDownMenu dropDownMenu2 = new DropDownMenu("Streetwarfraktion 2 (optional)", 0, 0, 0, 0).fill(Faction.values()); + dropDownMenu2.setSelected(ConfigElements.getNameTagStreetwar2()); + dropDownMenu2.setEntryDrawer((object, matrixStack, x, y, string) -> LabyMod.getInstance().getDrawUtils() + .drawString(matrixStack, Faction.valueOf(object.toString().toUpperCase()).getDisplayName(), x, y)); + DropDownElement dropDownElement2 = new DropDownElement<>("", dropDownMenu2); + dropDownElement2.setChangeListener(ConfigElements::setNameTagStreetwar2); + + settings.add(dropDownElement0); + settings.add(dropDownElement1); + settings.add(dropDownElement2); + return settings; + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/event/UCEvent.java b/src/main/java/com/rettichlp/UnicacityAddon/base/event/UCEvent.java new file mode 100644 index 0000000..e932a50 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/event/UCEvent.java @@ -0,0 +1,13 @@ +package com.rettichlp.UnicacityAddon.base.event; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author RettichLP + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface UCEvent {} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/event/UCEventHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/base/event/UCEventHandler.java new file mode 100644 index 0000000..09a2aa7 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/event/UCEventHandler.java @@ -0,0 +1,29 @@ +package com.rettichlp.UnicacityAddon.base.event; + +import com.rettichlp.UnicacityAddon.UnicacityAddon; +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; + +import java.util.Set; + +import static org.reflections.scanners.Scanners.TypesAnnotated; + +/** + * @author RettichLP + */ +public class UCEventHandler { + + public static void registerEvents() { + Reflections reflections = new Reflections(UnicacityAddon.class.getPackage().getName(), Scanners.values()); + Set> events = reflections.get(TypesAnnotated.with(UCEvent.class).asClass()); + + events.forEach(clazz -> { + try { + AbstractionLayer.getLabymod().getEventService().registerListener(clazz.newInstance()); + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/faction/Faction.java b/src/main/java/com/rettichlp/UnicacityAddon/base/faction/Faction.java new file mode 100644 index 0000000..b6fdc6b --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/faction/Faction.java @@ -0,0 +1,104 @@ +package com.rettichlp.UnicacityAddon.base.faction; + +import com.rettichlp.UnicacityAddon.base.text.ColorCode; +import com.rettichlp.UnicacityAddon.base.text.Message; +import com.rettichlp.UnicacityAddon.base.utils.WebsiteAPI; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public enum Faction { + + NULL("", "Keine Auswahl", ""), + CALDERON("calderon", "Calderon Kartell", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("☀").color(ColorCode.GOLD).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + FBI("fbi", "F.B.I", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("✯").color(ColorCode.DARK_BLUE).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + HITMAN("hitman", "Hitman", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("➹").color(ColorCode.AQUA).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + KERZAKOV("kerzakov", "Kerzakov Familie", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("☭").color(ColorCode.RED).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + KIRCHE("kirche", "Kirche", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("†").color(ColorCode.LIGHT_PURPLE).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + LACOSANOSTRA("lacosanostra", "La Cosa Nostra", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("⚜").color(ColorCode.DARK_AQUA).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + NEWS("news", "News", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("✉").color(ColorCode.YELLOW).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + OBRIEN("obrien", "O'brien", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("☘").color(ColorCode.DARK_GREEN).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + POLIZEI("polizei", "Polizei", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("✯").color(ColorCode.BLUE).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + RETTUNGSDIENST("rettungsdienst", "Rettungsdienst", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("✚").color(ColorCode.DARK_RED).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + TERRORISTEN("terroristen", "Terroristen", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("❇").color(ColorCode.GRAY).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + TRIADEN("triaden", "Triaden", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("是").color(ColorCode.RED).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()), + WESTSIDEBALLAS("westsideballas", "Westsideballas", Message.getBuilder() + .of("◤").color(ColorCode.DARK_GRAY).advance() + .of("☠").color(ColorCode.DARK_PURPLE).advance() + .of("◢").color(ColorCode.DARK_GRAY).advance().create()); + + private final String apiName; + private final String displayName; + private final String nameTagSuffix; + + Faction(String apiName, String displayName, String nameTagSuffix) { + this.apiName = apiName; + this.displayName = displayName; + this.nameTagSuffix = nameTagSuffix; + } + + public String getApiName() { + return this.apiName; + } + + public String getDisplayName() { + return this.displayName; + } + + public String getNameTagSuffix() { + return this.nameTagSuffix; + } + + public String getWebsiteUrl() { + if (this.equals(Faction.NULL)) return null; + return "https://unicacity.de/fraktionen/" + getApiName(); + } + + public String getWebsiteSource() { + return WebsiteAPI.websiteToString(this.getWebsiteUrl()); + } + + public List getMember() { + return FactionHandler.getPlayerFactionMap().entrySet().stream() + .filter(entry -> entry.getValue().equals(this)) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/faction/FactionHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/base/faction/FactionHandler.java new file mode 100644 index 0000000..0987458 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/faction/FactionHandler.java @@ -0,0 +1,58 @@ +package com.rettichlp.UnicacityAddon.base.faction; + +import com.rettichlp.UnicacityAddon.base.text.PatternHandler; +import com.rettichlp.UnicacityAddon.base.utils.ListUtils; +import com.rettichlp.UnicacityAddon.base.utils.WebsiteAPI; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FactionHandler { + + private static Map playerFactionMap = new HashMap<>(); + private static Map playerRankMap = new HashMap<>(); + private static String websiteSource = ""; + + public static Map getPlayerFactionMap() { + if (!playerFactionMap.isEmpty()) return playerFactionMap; + return playerFactionMap = getPlayerFactions(); + } + + public static Map getPlayerRankMap() { + if (!playerRankMap.isEmpty()) return playerRankMap; + return playerRankMap = getPlayerRanks(); + } + + public static boolean checkPlayerHouseBan(String playerName) { + if (websiteSource.isEmpty()) websiteSource = WebsiteAPI.websiteToString("https://fuzzlemann.de/commons/houseBans"); + return websiteSource.contains(playerName); + } + + private static Map getPlayerFactions() { + Map playerFactions = new HashMap<>(); + + for (Faction faction : Faction.values()) { + List nameList = ListUtils.getAllMatchesFromString(PatternHandler.NAME_PATTERN, faction.getWebsiteSource()); + nameList.forEach(name -> playerFactions.put(name.replace("

", ""), faction)); + } + + return playerFactions; + } + + private static Map getPlayerRanks() { + Map playerRankMap = new HashMap<>(); + + for (Faction faction : Faction.values()) { + List nameList = ListUtils.getAllMatchesFromString(PatternHandler.NAME_PATTERN, faction.getWebsiteSource()); + List rankList = ListUtils.getAllMatchesFromString(PatternHandler.RANK_PATTERN, faction.getWebsiteSource()); + nameList.forEach(name -> playerRankMap.put( + name.replace("

", ""), + Integer.parseInt(String.valueOf(rankList.get(nameList.indexOf(name)) + .replace("Rang ", "") + .charAt(0))))); + } + + return playerRankMap; + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/module/UCModule.java b/src/main/java/com/rettichlp/UnicacityAddon/base/module/UCModule.java new file mode 100644 index 0000000..36b2ec0 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/module/UCModule.java @@ -0,0 +1,13 @@ +package com.rettichlp.UnicacityAddon.base.module; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author RettichLP + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface UCModule {} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/module/UCModuleHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/base/module/UCModuleHandler.java new file mode 100644 index 0000000..dca30b3 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/module/UCModuleHandler.java @@ -0,0 +1,35 @@ +package com.rettichlp.UnicacityAddon.base.module; + +import com.rettichlp.UnicacityAddon.UnicacityAddon; +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import net.labymod.ingamegui.Module; +import net.labymod.ingamegui.ModuleCategory; +import net.labymod.settings.elements.ControlElement; +import net.labymod.utils.Material; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; + +import java.util.Set; + +import static org.reflections.scanners.Scanners.TypesAnnotated; + +/** + * @author RettichLP + */ +public class UCModuleHandler { + + public static final ModuleCategory UNICACITY = new ModuleCategory("Unicacity", true, new ControlElement.IconData(Material.DIAMOND)); + + public static void registerModules() { + Reflections reflections = new Reflections(UnicacityAddon.class.getPackage().getName(), Scanners.values()); + Set> events = reflections.get(TypesAnnotated.with(UCModule.class).asClass()); + + events.forEach(clazz -> { + try { + AbstractionLayer.getLabymod().getApi().registerModule((Module) clazz.newInstance()); + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/text/Message.java b/src/main/java/com/rettichlp/UnicacityAddon/base/text/Message.java index d52673d..c3de2fd 100644 --- a/src/main/java/com/rettichlp/UnicacityAddon/base/text/Message.java +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/text/Message.java @@ -1,7 +1,6 @@ package com.rettichlp.UnicacityAddon.base.text; import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.text.StringTextComponent; import java.util.ArrayList; diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/text/PatternHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/base/text/PatternHandler.java new file mode 100644 index 0000000..02b68c0 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/text/PatternHandler.java @@ -0,0 +1,23 @@ +package com.rettichlp.UnicacityAddon.base.text; + +import java.util.regex.Pattern; + +public class PatternHandler { + + /** + * {@link com.rettichlp.UnicacityAddon.base.faction.FactionHandler} + */ + public static final Pattern NAME_PATTERN = Pattern.compile("

([a-zA-Z0-9_]+)"); + public static final Pattern RANK_PATTERN = Pattern.compile("Rang (\\d)( \\(Leader\\))*"); + + /** + * {@link com.rettichlp.UnicacityAddon.events.ATMInfoEventHandler} + */ + public static final Pattern KONTOAUSZUG_PATTERN = Pattern.compile("^Ihr Bankguthaben beträgt: [+-](\\d)+\\$$"); + + /** + * {@link com.rettichlp.UnicacityAddon.modules.BombTimerModule} + */ + public static final Pattern BOMB_PLACED_PATTERN = Pattern.compile("^News: ACHTUNG! Es wurde eine Bombe in der Nähe von .+ gefunden!$"); + public static final Pattern BOMB_REMOVED_PATTERN = Pattern.compile("^News: Die Bombe konnte (?:nicht|erfolgreich) entschärft werden!$"); +} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/utils/ListUtils.java b/src/main/java/com/rettichlp/UnicacityAddon/base/utils/ListUtils.java new file mode 100644 index 0000000..7dd40a0 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/utils/ListUtils.java @@ -0,0 +1,22 @@ +package com.rettichlp.UnicacityAddon.base.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ListUtils { + + public static List getAllMatchesFromString(Pattern pattern, String content) { + List list = new ArrayList<>(); + Matcher matcher = pattern.matcher(content); + while (matcher.find()) list.add(matcher.group()); + return list; + } + + public static List replaceAllInList(List list, String target, String replacement) { + List output = new ArrayList<>(); + list.forEach(s -> output.add(s.replace(target, replacement))); + return output; + } +} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/base/utils/WebsiteAPI.java b/src/main/java/com/rettichlp/UnicacityAddon/base/utils/WebsiteAPI.java new file mode 100644 index 0000000..8eeb209 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/base/utils/WebsiteAPI.java @@ -0,0 +1,29 @@ +package com.rettichlp.UnicacityAddon.base.utils; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Scanner; + +public class WebsiteAPI { + + public static String websiteToString(String urlString) { + + Scanner scanner; + StringBuilder websiteSource = new StringBuilder(); + + if (urlString != null) { + try { + URLConnection openConnection = new URL(urlString).openConnection(); + openConnection.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0"); + scanner = new Scanner(new InputStreamReader(openConnection.getInputStream())); + while (scanner.hasNextLine()) websiteSource.append(scanner.nextLine()).append("\n\r"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return websiteSource.toString(); + } +} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/commands/TestCommand.java b/src/main/java/com/rettichlp/UnicacityAddon/commands/TestCommand.java deleted file mode 100644 index 749d6f7..0000000 --- a/src/main/java/com/rettichlp/UnicacityAddon/commands/TestCommand.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.rettichlp.UnicacityAddon.commands; - -import com.rettichlp.UnicacityAddon.base.abstraction.UPlayer; -import com.rettichlp.UnicacityAddon.base.command.Command; -import com.rettichlp.UnicacityAddon.base.command.UnicacityCommand; - -/** - * @author RettichLP - */ -public class TestCommand implements UnicacityCommand { - - @Override - @Command(value = {"test1", "test2"}, usage = "/%label% [test] [test]") - public boolean onCommand(UPlayer p, String[] args) { - System.out.println("test1"); - return false; - } -} diff --git a/src/main/java/com/rettichlp/UnicacityAddon/events/ATMInfoEventHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/events/ATMInfoEventHandler.java new file mode 100644 index 0000000..bb99263 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/events/ATMInfoEventHandler.java @@ -0,0 +1,22 @@ +package com.rettichlp.UnicacityAddon.events; + +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import com.rettichlp.UnicacityAddon.base.event.UCEvent; +import com.rettichlp.UnicacityAddon.base.config.ConfigElements; +import com.rettichlp.UnicacityAddon.base.text.PatternHandler; +import net.labymod.api.event.Subscribe; +import net.labymod.api.event.events.client.chat.MessageReceiveEvent; + +import java.util.regex.Matcher; + +@UCEvent +public class ATMInfoEventHandler { + + @Subscribe + public void onMessageReceive(MessageReceiveEvent e) { + if (!ConfigElements.getEventATMInfo()) return; + + Matcher kontoauszugMatcher = PatternHandler.KONTOAUSZUG_PATTERN.matcher(e.getComponent().getString()); + if (kontoauszugMatcher.find()) AbstractionLayer.getPlayer().sendChatMessage("/atminfo"); + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/events/NameTagEventHandler.java b/src/main/java/com/rettichlp/UnicacityAddon/events/NameTagEventHandler.java new file mode 100644 index 0000000..bfaa3e2 --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/events/NameTagEventHandler.java @@ -0,0 +1,129 @@ +package com.rettichlp.UnicacityAddon.events; + +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import com.rettichlp.UnicacityAddon.base.config.ConfigElements; +import com.rettichlp.UnicacityAddon.base.event.UCEvent; +import com.rettichlp.UnicacityAddon.base.faction.Faction; +import com.rettichlp.UnicacityAddon.base.faction.FactionHandler; +import com.rettichlp.UnicacityAddon.base.text.ColorCode; +import com.rettichlp.UnicacityAddon.base.text.FormattingCode; +import com.rettichlp.UnicacityAddon.base.text.Message; +import net.labymod.api.event.Subscribe; +import net.labymod.api.event.events.client.TickEvent; +import net.labymod.api.event.events.client.renderer.RenderNameTagEvent; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.Items; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +@UCEvent +public class NameTagEventHandler { + + private static int tick; + + @Subscribe + public void onRenderNameTag(RenderNameTagEvent e) { + String playerName = e.getDisplayName().getString(); + String houseban = getHouseban(playerName); + String prefix = getPrefix(playerName); + String suffix = getSuffix(playerName); + e.setDisplayName(ITextComponent.getTextComponentOrEmpty(houseban + prefix + playerName + suffix)); + } + + @Subscribe + public void onTick(TickEvent e) { + if (e.getPhase() != TickEvent.Phase.PRE) return; + if (AbstractionLayer.getPlayer().getWorld() == null) return; + if (tick++ != 20) return; + + getCorpsesInRange(30).forEach(itemEntity -> { + String name = itemEntity.getCustomName().getString(); + String playerName = name.substring(3); + + if (!FactionHandler.getPlayerFactionMap().containsKey(name.substring(3))) return; + if (name.contains("◤")) return; // already edited + + String prefix = getPrefix(playerName); + String suffix = getSuffix(playerName); + + if (name.startsWith(ColorCode.DARK_GRAY.getCode())) { // non-revivable + itemEntity.setCustomName(ITextComponent.getTextComponentOrEmpty(ColorCode.DARK_GRAY.getCode() + "✟" + playerName + suffix)); + return; + } + + itemEntity.setCustomName(ITextComponent.getTextComponentOrEmpty(ColorCode.GRAY.getCode() + prefix + "✟" + playerName + suffix)); + }); + + tick = 0; + } + + private @NotNull String getHouseban(String playerName) { + StringBuilder houseban = new StringBuilder(); + houseban.append(FormattingCode.RESET.getCode()); + + if (ConfigElements.getNameTagHouseban()) { + if (FactionHandler.checkPlayerHouseBan(playerName)) houseban.append(Message.getBuilder() + .of("[").color(ColorCode.DARK_GRAY).advance() + .of("HV").color(ColorCode.RED).advance() + .of("]").color(ColorCode.DARK_GRAY).advance() + .add(FormattingCode.RESET.getCode()) + .create()); + } + + return houseban.toString(); + } + + private @NotNull String getPrefix(String playerName) { + StringBuilder prefix = new StringBuilder(); + prefix.append(FormattingCode.RESET.getCode()); + + if (FactionHandler.getPlayerFactionMap().containsKey(playerName)) { + Faction targetPlayerFaction = FactionHandler.getPlayerFactionMap().get(playerName); + + if (ConfigElements.getNameTagFaction()) { + if (targetPlayerFaction.equals(AbstractionLayer.getPlayer().getFaction())) + prefix.append(ConfigElements.getNameTagFactionColor().getCode()); + } + + if (ConfigElements.getNameTagAlliance()) { + if (targetPlayerFaction.equals(ConfigElements.getNameTagAlliance1()) || targetPlayerFaction.equals(ConfigElements.getNameTagAlliance2())) + prefix.append(ConfigElements.getNameTagAllianceColor().getCode()); + } + + if (ConfigElements.getNameTagStreetwar()) { + if (targetPlayerFaction.equals(ConfigElements.getNameTagStreetwar1()) || targetPlayerFaction.equals(ConfigElements.getNameTagStreetwar2())) + prefix.append(ConfigElements.getNameTagStreetwarColor().getCode()); + } + } + + return prefix.toString(); + } + + private @NotNull String getSuffix(String playerName) { + StringBuilder suffix = new StringBuilder(); + suffix.append(FormattingCode.RESET.getCode()); + + if (FactionHandler.getPlayerFactionMap().containsKey(playerName)) { + Faction targetPlayerFaction = FactionHandler.getPlayerFactionMap().get(playerName); + if (ConfigElements.getNameTagFactionSuffix()) suffix.append(" ").append(targetPlayerFaction.getNameTagSuffix()); + } + + return suffix.toString(); + } + + private List getCorpsesInRange(int range) { + BlockPos pos = AbstractionLayer.getPlayer().getPosition(); + return AbstractionLayer.getPlayer().getWorld().getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB( + pos.getX() - range, + pos.getY() - range, + pos.getZ() - range, + pos.getX() + range, + pos.getY() + range, + pos.getZ() + range), + itemEntity -> itemEntity != null && itemEntity.hasCustomName() && itemEntity.getItem().getItem().equals(Items.SKELETON_SKULL)); + } +} \ No newline at end of file diff --git a/src/main/java/com/rettichlp/UnicacityAddon/modules/BombTimerModule.java b/src/main/java/com/rettichlp/UnicacityAddon/modules/BombTimerModule.java new file mode 100644 index 0000000..010f63f --- /dev/null +++ b/src/main/java/com/rettichlp/UnicacityAddon/modules/BombTimerModule.java @@ -0,0 +1,101 @@ +package com.rettichlp.UnicacityAddon.modules; + +import com.rettichlp.UnicacityAddon.base.abstraction.AbstractionLayer; +import com.rettichlp.UnicacityAddon.base.event.UCEvent; +import com.rettichlp.UnicacityAddon.base.module.UCModule; +import com.rettichlp.UnicacityAddon.base.module.UCModuleHandler; +import com.rettichlp.UnicacityAddon.base.text.ColorCode; +import com.rettichlp.UnicacityAddon.base.text.PatternHandler; +import net.labymod.api.event.Subscribe; +import net.labymod.api.event.events.client.TickEvent; +import net.labymod.api.event.events.client.chat.MessageReceiveEvent; +import net.labymod.ingamegui.ModuleCategory; +import net.labymod.ingamegui.moduletypes.SimpleModule; +import net.labymod.settings.elements.ControlElement; +import net.labymod.utils.Material; +import net.labymod.utils.ModUtils; + +@UCModule +@UCEvent +public class BombTimerModule extends SimpleModule { + + private int currentCount = 0; + private int currentTick = 0; + private static boolean isBomb = false; + private String timer = ""; + + public BombTimerModule() { + AbstractionLayer.getLabymod().getEventService().registerListener(this); + } + + @Override public String getControlName() { + return "Bomben-Timer"; + } + + @Override public String getSettingName() { + return null; + } + + @Override public String getDisplayName() { + return "Bombe"; + } + + @Override public String getDisplayValue() { + return this.timer; + } + + @Override public String getDefaultValue() { + return "00:00"; + } + + @Override public String getDescription() { + return "Zeigt die Zeit an, die seit dem Legen einer Bombe vergangen ist."; + } + + @Override public ControlElement.IconData getIconData() { + return new ControlElement.IconData(Material.TNT); + } + + @Override public ModuleCategory getCategory() { + return UCModuleHandler.UNICACITY; + } + + @Override public boolean isShown() { + return !this.timer.isEmpty(); + } + + @Override public int getSortingId() { + return 0; + } + + @Override public void loadSettings() { + } + + @Subscribe + public void onTick(TickEvent event) { + if (event.getPhase() != TickEvent.Phase.POST) return; + + if (!isBomb || ++this.currentTick != 20) return; + this.currentTick = 0; + + if (this.currentCount++ >= 780) this.timer = ColorCode.RED.getCode() + ModUtils.parseTimer(this.currentCount); + else this.timer = ModUtils.parseTimer(this.currentCount); + } + + @Subscribe + public void onMesageReceive(MessageReceiveEvent e) { + String msg = e.getComponent().getString(); + + if (PatternHandler.BOMB_PLACED_PATTERN.matcher(msg).find()) { + isBomb = true; + this.timer = "00:00"; + return; + } + + if (PatternHandler.BOMB_REMOVED_PATTERN.matcher(msg).find()) { + isBomb = false; + this.currentCount = 0; + this.timer = ""; + } + } +} \ No newline at end of file