From 540bf968cc596cb71e0d234c1bc7ec5ff60d44a7 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 6 Oct 2022 20:36:50 -0400 Subject: [PATCH] Deleted Mockito and a few other things --- .../java/de/butzlabben/world/WorldSystem.java | 40 ++- .../world/commands/commands/BaseCommand.java | 33 ++- .../world/config/LanguageConfig.java | 266 +++++++++++++++++- .../butzlabben/world/config/PluginConfig.java | 2 +- .../butzlabben/world/utils/PluginRunner.java | 23 +- .../de/butzlabben/world/MockWorldSystem.java | 42 ++- .../de/butzlabben/world/TestWorldSystem.java | 15 +- .../world/config/TestLanguageConfig.java | 68 ++++- .../world/config/TestPluginConfig.java | 20 ++ .../de/butzlabben/world/WorldSystem.class | Bin 2649 -> 3023 bytes .../commands/WorldSystemCommandExecuter.class | Bin 2931 -> 3434 bytes .../world/commands/commands/BaseCommand.class | Bin 0 -> 668 bytes .../commands/WorldSystemTabComplete.class | Bin 1590 -> 2168 bytes .../world/config/LanguageConfig.class | Bin 0 -> 12034 bytes .../world/config/PluginConfig.class | Bin 8041 -> 7980 bytes .../butzlabben/world/utils/PluginRunner.class | Bin 0 -> 763 bytes .../de/butzlabben/world/MockWorldSystem.class | Bin 0 -> 1812 bytes .../de/butzlabben/world/TestWorldSystem.class | Bin 0 -> 809 bytes .../world/config/TestLanguageConfig.class | Bin 0 -> 1805 bytes .../world/config/TestPluginConfig.class | Bin 5002 -> 5558 bytes 20 files changed, 473 insertions(+), 36 deletions(-) create mode 100644 target/classes/de/butzlabben/world/commands/commands/BaseCommand.class create mode 100644 target/classes/de/butzlabben/world/config/LanguageConfig.class create mode 100644 target/classes/de/butzlabben/world/utils/PluginRunner.class create mode 100644 target/test-classes/de/butzlabben/world/MockWorldSystem.class create mode 100644 target/test-classes/de/butzlabben/world/TestWorldSystem.class create mode 100644 target/test-classes/de/butzlabben/world/config/TestLanguageConfig.class diff --git a/src/main/java/de/butzlabben/world/WorldSystem.java b/src/main/java/de/butzlabben/world/WorldSystem.java index 67fdec6..1bac44d 100644 --- a/src/main/java/de/butzlabben/world/WorldSystem.java +++ b/src/main/java/de/butzlabben/world/WorldSystem.java @@ -4,32 +4,37 @@ import de.butzlabben.world.commands.WorldSystemCommandExecuter; import de.butzlabben.world.commands.commands.DebugCommandTest; import de.butzlabben.world.commands.commands.WorldSystemTabComplete; import de.butzlabben.world.config.PluginConfig; -import org.bukkit.plugin.PluginDescriptionFile; +import de.butzlabben.world.utils.PluginRunner; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; import java.io.File; import java.io.FileNotFoundException; +import java.io.InputStream; -public class WorldSystem extends JavaPlugin +public class WorldSystem { + private PluginRunner runner; + protected static WorldSystem activeInst = null; private static PluginConfig cfg; - public WorldSystem() - { - super(); + + private WorldSystem(PluginRunner run) { + runner = run; } - protected WorldSystem(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) - { - super(loader, description, dataFolder, file); + protected WorldSystem() { + runner = null; + } + + public void saveDefaultConfig() + { + runner.saveDefaultConfig(); } - @Override public void onEnable() { createConfigs(); - createCommands(); } @@ -42,12 +47,12 @@ public class WorldSystem extends JavaPlugin cmdExecuter.addCommand("test", new DebugCommandTest()); } - this.getCommand("ws").setExecutor(cmdExecuter); - this.getCommand("ws").setTabCompleter(new WorldSystemTabComplete(cmdExecuter)); + runner.getCommand("ws").setExecutor(cmdExecuter); + runner.getCommand("ws").setTabCompleter(new WorldSystemTabComplete(cmdExecuter)); } private void createConfigs() { - File folder = getInstance().getDataFolder(); + File folder = runner.getInstance().getDataFolder(); try { cfg = new PluginConfig(new File(folder, "config.yml")); @@ -63,7 +68,14 @@ public class WorldSystem extends JavaPlugin } public static WorldSystem getInstance() { - return JavaPlugin.getPlugin(WorldSystem.class); + if (activeInst == null) { + activeInst = new WorldSystem(JavaPlugin.getPlugin(PluginRunner.class)); + } + return activeInst; + } + + public InputStream getResource(String filename) { + return runner.getResource(filename); } } diff --git a/src/main/java/de/butzlabben/world/commands/commands/BaseCommand.java b/src/main/java/de/butzlabben/world/commands/commands/BaseCommand.java index 1abc1c3..0a5288c 100644 --- a/src/main/java/de/butzlabben/world/commands/commands/BaseCommand.java +++ b/src/main/java/de/butzlabben/world/commands/commands/BaseCommand.java @@ -1,2 +1,33 @@ -package de.butzlabben.world.commands.commands;public class BaseCommand { +package de.butzlabben.world.commands.commands; + +import de.butzlabben.world.WorldSystem; +import de.butzlabben.world.commands.WorldSystemCommand; +import org.bukkit.command.CommandSender; + +import java.util.List; + +public class BaseCommand implements WorldSystemCommand +{ + @Override + public boolean run(CommandSender sender) + { + return false; + +// String prefix = WorldSystem.getWSConfig().getPrefix(); +// sender.sendMessage( +// prefix + "WorldSystem by Butzlabben v" + WorldSystem.getInstance().getDescription().getVersion()); +// sender.sendMessage(prefix + "Contributors: Jubeki, montlikadani, jstoeckm2"); +// List cmdHelp = MessageConfig.getCommandHelp(); +// cmdHelp.forEach(s -> sender.sendMessage(prefix + s)); +// if (sender.hasPermission("ws.delete")) +// { +// sender.sendMessage(MessageConfig.getDeleteCommandHelp()); +// } + } + + @Override + public String[] arguments() + { + return new String[0]; + } } diff --git a/src/main/java/de/butzlabben/world/config/LanguageConfig.java b/src/main/java/de/butzlabben/world/config/LanguageConfig.java index 5452ea9..d8e4569 100644 --- a/src/main/java/de/butzlabben/world/config/LanguageConfig.java +++ b/src/main/java/de/butzlabben/world/config/LanguageConfig.java @@ -1,11 +1,21 @@ package de.butzlabben.world.config; -import java.io.File; +import com.fastasyncworldedit.core.configuration.file.YamlConfiguration; +import de.butzlabben.world.WorldSystem; +import org.bukkit.ChatColor; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; -public class MessageConfig +public class LanguageConfig { + + //TODO NEXT Logger private static final List defaultCmdHelp = new ArrayList<>(20); private static File languageFile; @@ -25,4 +35,256 @@ public class MessageConfig defaultCmdHelp.add("/ws reset §8- §7Will reset your World"); } + //limit Constructor Access + private LanguageConfig() { + } + + public static void checkConfig(File f) { + languageFile = f; + if (!languageFile.exists()) { + try { + String[] fileName = f.getName().split("/"); + InputStream in = WorldSystem.getInstance().getResource("languages/" + fileName[fileName.length - 1]); + + if (in == null) { + in = WorldSystem.getInstance().getResource("custom.yml"); + } + Files.copy(in, languageFile.toPath()); + } catch (IOException e) { + System.err.println("Wasn't able to create Message file"); + e.printStackTrace(); //TODO Replace with Logger + } + } + } + + private static YamlConfiguration getConfig() { + try { + return YamlConfiguration.loadConfiguration(new InputStreamReader(new FileInputStream(languageFile), StandardCharsets.UTF_8)); + } catch (FileNotFoundException e) { + e.printStackTrace();//TODO Replace with Logger + } + return null; + } + + private static String getRawMessage(String path, String alt) { + return ChatColor.translateAlternateColorCodes('&', getConfig().getString(path, alt)); + } + + private static String getMessage(String path, String alt) { + return WorldSystem.getWSConfig().getPrefix() + getRawMessage(path, alt); + } + + public static String getNoPermission() { + return getMessage("nopermission", "§cYou don't have permissions!"); + } + + public static String getSettingUpWorld() { + return getMessage("world.setting_up", "§aSetting up world..."); + } + + public static String getPlayerList() { + return getMessage("world.playerlist", "Player in this world: %player"); + } + + public static String getLagDetection() { + return getMessage("lagdetection", "Lagdetection in world from: §c%world"); + } + + public static String getWrongUsage() { + return getMessage("wrong_usage", "§c%usage"); + } + + public static String getNoWorldOwn() { + return getMessage("world.does_not_exists.own", "§cYou don't have a world!"); + } + + public static String getNoWorldOther() { + return getMessage("world.does_not_exists.other", "§cThis player doesn't has a world!"); + } + + public static String getNotRegistered() { + return getMessage("not_registered", "§cThis player hasn't joined yet!"); + } + + public static String getAlreadyMember() { + return getMessage("member.already_added", "§cThis player is already a member!"); + } + + public static String getMemberAdded() { + return getMessage("member.added", "You have added &c%player&6 to your World!"); + } + + public static String getUnknownError() { + return getMessage("unknown_error", "§cSomething went wrong..."); + } + + public static String getDeleteWorldOwn() { + return getMessage("world.delete.own", "§cYour world was deleted!"); + } + + public static String getDeleteWorldOther() { + return getMessage("world.delete.other", "You deleted the world of §c%player§6!"); + } + + public static String getNoMemberOwn() { + return getMessage("member.not_added.own", "§cThis player isn't a member!"); + } + + public static String getMemberRemoved() { + return getMessage("member.removed", "You removed §c%player§6 from your world!"); + } + + public static String getNoMemberAdded() { + return getMessage("member.no_one_added", "§cThere are no members added"); + } + + public static String getWorldAlreadyExists() { + return getMessage("world.already_exists", "§cYou already have a world!"); + } + + public static String getWorldCreated() { + return getMessage("world.created", "Your world is now ready. Get there with §a/ws home"); + } + + public static String getWorldStillCreating() { + return getMessage("world.still_creating", "§cWorld is still creating"); + } + + public static String getNotOnWorld() { + return getMessage("world.not_on", "§cYou are not on a world!"); + } + + public static String getWorldStillLoaded() { + return getMessage("world.still_loaded", "§cYour world is still loaded!"); + } + + public static String getNoRequestSend() { + return getMessage("request.not_sent", "§cYou didn't send a request!"); + } + + public static String getWorldReseted() { + return getMessage("world.reseted", "Your world was reseted!"); + } + + public static String getInvalidInput() { + return getMessage("request.invalid_input", "§c%input is not a valid input!"); + } + + public static String getRequestAlreadySent() { + return getMessage("request.already_sent", "§cYou already sent a request!"); + } + + public static String getRequestExpired() { + return getMessage("request.expired", "§cYou request is expired!"); + } + + public static String getTimeUntilExpires() { + return getMessage("request.until_expire", "§cYour request expires in %time seconds!"); + } + + public static String getConfirmRequest() { + return getMessage("request.confirm", "§cPlease confirm reset of your world: %command"); + } + + public static String getNoMemberOther() { + return getMessage("member.not_added.other", "§cYou are not added to this world!"); + } + + public static String getInfoOwner() { + return getMessage("info.owner", "Owner: %data"); + } + + public static String getInfoId() { + return getMessage("info.id", "ID: %data"); + } + + public static String getInfoMember() { + return getMessage("info.member", "Member: %data"); + } + + public static String getInfoTnt() { + return getMessage("info.tnt", "TNT: %data"); + } + + public static String getInfoFire() { + return getMessage("info.fire", "Fire: %data"); + } + + public static String getInfoEnabled() { + return getRawMessage("info.enabled", "§aOn"); + } + + public static String getInfoDisabled() { + return getRawMessage("info.disabled", "§cOff"); + } + + public static String getToggleGameModeEnabled() { + return getMessage("toggle.gamemode.enabled", "§a%player§6 can now change his gamemode!"); + } + + public static String getToggleGameModeDisabled() { + return getMessage("toggle.gamemode.disabled", "§c%player§6 can no longer change his gamemode!"); + } + + public static String getToggleTeleportEnabled() { + return getMessage("toggle.teleport.enabled", "§a%player§6 can now teleport!"); + } + + public static String getToggleTeleportDisabled() { + return getMessage("toggle.teleport.disabled", "§c%player§6 can no longer teleport!"); + } + + public static String getToggleBuildEnabled() { + return getMessage("toggle.build.enabled", "§a%player§6 can now build!"); + } + + public static String getToggleBuildDisabled() { + return getMessage("toggle.build.disabled", "§c%player§6 can no longer build!"); + } + + public static String getToggleWorldeditEnabled() { + return getMessage("toggle.worldedit.enabled", "§a%player§6 can now use WorldEdit!"); + } + + public static String getToggleWorldeditDisabled() { + return getMessage("toggle.worldedit.disabled", "§c%player§6 can no longer use WorldEdit!"); + } + + + public static String getToggleFireEnabled() { + return getMessage("toggle.fire.enabled", "§aYou activated fire!"); + } + + public static String getToggleFireDisabled() { + return getMessage("toggle.fire.disabled", "§cYou deactivated fire!"); + } + + public static String getToggleTntEnabled() { + return getMessage("toggle.tnt.enabled", "§aYou activated TNT-Damage!"); + } + + public static String getToggleTntDisabled() { + return getMessage("toggle.tnt.disabled", "§cYou deactivated TNT-Damage!"); + } + + public static String getDeleteCommandHelp() { + return getMessage("command_help.delete_command", "/ws delete §8- §7Will delete a World"); + } + + public static List getCommandHelp() { + List list = getConfig().getStringList("command_help.list"); + if (list == null) + list = defaultCmdHelp; + list = list.stream().map(s -> ChatColor.translateAlternateColorCodes('&', s)).collect(Collectors.toList()); + return list; + } + + public static String getHomeSet() { + return getMessage("world.set_home", "You set the home"); + } + + public static String getNotEnoughMoney() { + return getMessage("not_enough_money", "You do not have enough money"); + } + } diff --git a/src/main/java/de/butzlabben/world/config/PluginConfig.java b/src/main/java/de/butzlabben/world/config/PluginConfig.java index a739fc5..029692c 100644 --- a/src/main/java/de/butzlabben/world/config/PluginConfig.java +++ b/src/main/java/de/butzlabben/world/config/PluginConfig.java @@ -29,7 +29,7 @@ public class PluginConfig { public PluginConfig(File configFile) throws FileNotFoundException { this.configFile = configFile; if (!configFile.exists()) { - JavaPlugin.getPlugin(WorldSystem.class).saveDefaultConfig(); + WorldSystem.getInstance().saveDefaultConfig(); } try { diff --git a/src/main/java/de/butzlabben/world/utils/PluginRunner.java b/src/main/java/de/butzlabben/world/utils/PluginRunner.java index f96416b..8422324 100644 --- a/src/main/java/de/butzlabben/world/utils/PluginRunner.java +++ b/src/main/java/de/butzlabben/world/utils/PluginRunner.java @@ -1,29 +1,22 @@ -package de.butzlabben.world; +package de.butzlabben.world.utils; -import de.butzlabben.world.commands.WorldSystemCommandExecuter; -import de.butzlabben.world.commands.commands.DebugCommandTest; -import de.butzlabben.world.commands.commands.WorldSystemTabComplete; -import de.butzlabben.world.config.PluginConfig; -import org.bukkit.World; -import org.bukkit.plugin.PluginDescriptionFile; +import de.butzlabben.world.WorldSystem; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.java.JavaPluginLoader; -import java.io.File; -import java.io.FileNotFoundException; - -public class main extends JavaPlugin +public class PluginRunner extends JavaPlugin { private WorldSystem plugin; + @Override public void onEnable() { - plugin = new WorldSystem(); + plugin = WorldSystem.getInstance(); plugin.onEnable(); } - public static main getInstance() { - return JavaPlugin.getPlugin(main.class); + public static PluginRunner getInstance() { + return JavaPlugin.getPlugin(PluginRunner.class); } + } diff --git a/src/test/java/de/butzlabben/world/MockWorldSystem.java b/src/test/java/de/butzlabben/world/MockWorldSystem.java index c07272b..5249e8c 100644 --- a/src/test/java/de/butzlabben/world/MockWorldSystem.java +++ b/src/test/java/de/butzlabben/world/MockWorldSystem.java @@ -1,2 +1,42 @@ -package de.butzlabben.world;public class MockWorldSystem { +package de.butzlabben.world; + +import org.apache.commons.io.FileUtils; + +import java.io.*; + +public class MockWorldSystem extends WorldSystem +{ + private File configFile; + + public MockWorldSystem(File cfg) { + activeInst = this; + configFile = cfg; + } + + public MockWorldSystem() { + activeInst = this; + configFile = null; + } + + @Override + public void saveDefaultConfig() { + File source = new File("src/main/resources/config.yml"); + try { + FileUtils.copyFile(source, configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public InputStream getResource(String filename) { + try + { + return new FileInputStream("src/main/resources/" + filename); + } + catch (FileNotFoundException e) + { + return null; + } + } } diff --git a/src/test/java/de/butzlabben/world/TestWorldSystem.java b/src/test/java/de/butzlabben/world/TestWorldSystem.java index f19dece..bb309b0 100644 --- a/src/test/java/de/butzlabben/world/TestWorldSystem.java +++ b/src/test/java/de/butzlabben/world/TestWorldSystem.java @@ -1,2 +1,15 @@ -package de.butzlabben.world;public class TestWorldSystem { +package de.butzlabben.world; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class TestWorldSystem +{ + @Test + public void testMockInstance() { + WorldSystem mock = new MockWorldSystem(null); + assertEquals(mock, WorldSystem.getInstance()); + } + } diff --git a/src/test/java/de/butzlabben/world/config/TestLanguageConfig.java b/src/test/java/de/butzlabben/world/config/TestLanguageConfig.java index c9407ab..7513806 100644 --- a/src/test/java/de/butzlabben/world/config/TestLanguageConfig.java +++ b/src/test/java/de/butzlabben/world/config/TestLanguageConfig.java @@ -1,2 +1,68 @@ -package de.butzlabben.world.config;public class TestLanguageConfig { +package de.butzlabben.world.config; + +import de.butzlabben.world.MockWorldSystem; +import de.butzlabben.world.WorldSystem; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TestLanguageConfig +{ + @BeforeAll + static void CleanLastTest() throws IOException + { + FileUtils.cleanDirectory(new File("TestFiles/workingDir/")); + } + + @Test + public void testInitEN() { + File languages = new File("TestFiles/en.yml"); + + //Fails if something went Wrong + LanguageConfig.checkConfig(languages); + } + + @Test + public void testInitES() { + File languages = new File("TestFiles/es.yml"); + + //Fails if something went Wrong + LanguageConfig.checkConfig(languages); + } + + @Test + public void testInitENnoExist() { + WorldSystem mock = new MockWorldSystem(); + File languages = new File("TestFiles/workingDir/en.yml"); + + //Fails if something went Wrong + LanguageConfig.checkConfig(languages); + } + + @Test + public void testHelpEN() { + File languages = new File("TestFiles/en.yml"); + + //Fails if something went Wrong + LanguageConfig.checkConfig(languages); + + assertEquals(16,LanguageConfig.getCommandHelp().size()); + + assertEquals( "/ws get §8- §7Will give you a world",LanguageConfig.getCommandHelp().get(0)); + } + +// @Test +// public void testNoPermEN() { +// File languages = new File("TestFiles/en.yml"); +// +// //Fails if something went Wrong +// LanguageConfig.checkConfig(languages); +// +// assertEquals( "§cYou do not have permission to that command!", LanguageConfig.getNoPermission()); +// } } diff --git a/src/test/java/de/butzlabben/world/config/TestPluginConfig.java b/src/test/java/de/butzlabben/world/config/TestPluginConfig.java index df40d2a..e4e6b7b 100644 --- a/src/test/java/de/butzlabben/world/config/TestPluginConfig.java +++ b/src/test/java/de/butzlabben/world/config/TestPluginConfig.java @@ -1,19 +1,30 @@ package de.butzlabben.world.config; import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.MockPlugin; import be.seeseemelk.mockbukkit.ServerMock; +import de.butzlabben.world.MockWorldSystem; import de.butzlabben.world.WorldSystem; +import org.apache.commons.io.FileUtils; import org.bukkit.Difficulty; import org.bukkit.GameMode; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.io.File; import java.io.FileNotFoundException; +import java.io.IOException; import static org.junit.jupiter.api.Assertions.*; public class TestPluginConfig { + @BeforeAll + static void CleanLastTest() throws IOException + { + FileUtils.cleanDirectory(new File("TestFiles/workingDir/")); + } @Test public void testPluginConfigInit() throws FileNotFoundException { @@ -21,6 +32,15 @@ public class TestPluginConfig { PluginConfig cfg = new PluginConfig(cfgFile); } + @Test + public void testNoPluginConfigInit() throws FileNotFoundException { + File cfgFile = new File("TestFiles/workingDir/TestConfigNoExist.yml"); + WorldSystem mock = new MockWorldSystem(cfgFile); + + PluginConfig cfg = new PluginConfig(cfgFile); + } + + //TODO ADD Invalid Config Test diff --git a/target/classes/de/butzlabben/world/WorldSystem.class b/target/classes/de/butzlabben/world/WorldSystem.class index 4d179c60db265f3f713403a314db8f1f1dbccdde..ea7a1e603a6c0b660eb03ef869e843c593fef3af 100644 GIT binary patch literal 3023 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 diff --git a/target/classes/de/butzlabben/world/commands/WorldSystemCommandExecuter.class b/target/classes/de/butzlabben/world/commands/WorldSystemCommandExecuter.class index 42766f41a4ca5960185c97e2221a8faa2213bab4..f6c1dbce5949af7c92dc2caca8b5b6a1f2d57b37 100644 GIT binary patch delta 711 zcmbV}%}*0i6vfZ$%yb?PB-k2aX)uFn!$++(CS7PFY80hf3(`bVT;P;U3uQV}r&B~x zD}MY1vv;XRS!iOEXwaP|{ugfD!p4nw9|>{qBsafvPwqSS<;`~guL1Gn&!;Z{&fwWQ z@tk)U4ki)_&uY4!Uu@epH76LJYV>sCwHr%R_Y#mRwj7GcV8;C!=BgRw`VG?68 zRXLgZfWD2>nz8|gA&en~LljV=00E8bI?wCmT%^92{2}zy#9^cn#{_xfv?`4duHY&( zxfJP3xJ*LI03|CTB-a=^LHR(Yr`N?RhlT>M{Y*~q{lwKlEyhDrUJTw0tY9^64DLW0 zq}qqU7iau z1N z36B}HdZVLb_6MjPDo6Ho6d3kwVOUZ4;Bw0n(zx@LYa3nP^SHEwad5%|(Mqa1iVVh7 z+GX6OeIJCvOGymbmTwD&vgt^17I~IX7u<5GvS|8U?sm9x;yf*8!y6}H*f*#CGtxOB zuSp}TNHT2KO<(nBxWT{)zb7$LJ#8Uvp_+{=+Eg%%8Mgk%GvvAIMV^o$sjJo-*XDTj z$yVwALfem2SDZTWc$EolyD=D>$kX{4=IE9hc{(B4dCCm(jC^kA1?-uE3`%6!JYW|1?s4mUjP6A literal 0 HcmV?d00001 diff --git a/target/classes/de/butzlabben/world/commands/commands/WorldSystemTabComplete.class b/target/classes/de/butzlabben/world/commands/commands/WorldSystemTabComplete.class index cf0fb715b193c6eb94ac343e19f3553724fece6a..33b638b1496f98716c4a715fecd28e79e13c4175 100644 GIT binary patch delta 704 zcmbV}&u-H|5XQfa?btGDl{!MG{Am}6o4BPd5-m_dOIv73Xp#P@@cuUCRmGVh2`v}Ghi zp0m3-9_(|wyI^;DyVs4lA4I$^xlgVJRt(q%at0g&a|Y4|E;6KB)8eUE^n~ABbffUV zZ|c}!NK%ish!|G#gD=Wdzglm}MpSTiTYqI2Qn-yfCN{CfaN+lE$@64Wc)!lP^{gQ~ z(LvzrxXW-d|F2JcSq&u9Nq%1o3MctD)Ps2%oVUkt? z6R>Eo%3xf3+<#7AG>V+LBk0Ny*Dn!O;yh6!PO2o5BxVmWHbmxCT#5?4lTZy^H*jvG z88tbDDbh4tY92tQ^dek3w>Aq{)8TjDI3!ou%DFa)|TytQ*M> zNSuC2I_?rbR58*vah}$4O|c5@3!EX|BxZ=K#1q6dqEb_>TW(FW*4-ht-=nzq=q+|W gQ6(GQq6qC6*)kYSM#rX(@-g)PipcN^*(R{`1JzKAyZ`_I delta 147 zcmew%u#Jc7)W2Q(7#J9A8B8~Fy<-t$P-Ng^U}9iokOX2T20;cPpd{1eM7EUBD4+-{ zkjJ65g@JbmgYX8B41+9?WCO}DFo-kA0Z9{x8U}d=1t1Tonn9I84J^;Wpw6HH)BzIH XWYA(@2C*i)v!`+arHz3cCI%A#K~4|m diff --git a/target/classes/de/butzlabben/world/config/LanguageConfig.class b/target/classes/de/butzlabben/world/config/LanguageConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..237817790b2c14db7d62c3e016453a177a361043 GIT binary patch literal 12034 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 literal 0 HcmV?d00001 diff --git a/target/classes/de/butzlabben/world/config/PluginConfig.class b/target/classes/de/butzlabben/world/config/PluginConfig.class index 1389a7c39d4baeedd3c00c9cc68ceac1329e549d..9629852e288a42bfd850dcf0dcdc8aeb51e7cecc 100644 GIT binary patch literal 7980 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 literal 0 HcmV?d00001 diff --git a/target/test-classes/de/butzlabben/world/TestWorldSystem.class b/target/test-classes/de/butzlabben/world/TestWorldSystem.class new file mode 100644 index 0000000000000000000000000000000000000000..3d12a2ee982b72d25ae867414b464ea8d01e5830 GIT binary patch literal 809 zcmah{?M@Rx6g|@xmTp&Q`4R*bM6}g}d4Qq`A(EIZm% zK7bEJyt8dWB{l4iJA3BNJ@?#?KeyMv0ldR2A0?DMR02$4nxWno7lJ23_xPu%FJsFv zy{ojc?-|O?R>#8(!&X=FD7QZo5k*q-?mx^Vb;T3fI1os&nFR%kulVI(tgyL6*`tApxFu^2xh!O%Eh_jds!w^tBlSV0#Seu-*S-bDAYeTc^XSMT871Y!gk!`v56JhGxwFi z+@_IzLWtAJ=$v|U3HGaSuaR|b&;qTK4TcZ!6we6Ju8_A>1RtVYkT!1Mov}+)!?#xm rt}uT`G)qr_8mdH7r=4?z%fp}%VHGpjAbkuk$mbGo6=`0QEn)jF{ff)Z literal 0 HcmV?d00001 diff --git a/target/test-classes/de/butzlabben/world/config/TestLanguageConfig.class b/target/test-classes/de/butzlabben/world/config/TestLanguageConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..d97315fa656a594f1d343e5ca6ebe5ab05e1ddd3 GIT binary patch literal 1805 zcmb7EU02gs6y3Kiq=rziDCmG11|3@jGLDYo)Q`bh$BqGJtb@zP+i~nJe`~Tn10PdinBZI7loPiOHGEDC9*W7Zs z*RnR7JHm+=MsG_`Mt2#qrSg`BJcE%WN#A-XU6F^*aQdkTBNc_#8$Z~UUh9DjEFBsQ z1w2j}CA$aRhyqHfl(%$DU{b?L14T?RT=0XI#rL@LQdo}PZu?$nr8NIU(hV63jw`rF z;3Ult_8Cs5xM><;=5dYZBdCW7+_5}7h z*3-IR;36(j!7UM0$qMdmKN9X9L$OruI2n^8mMz1mGKR}2X($_5#1-0-7~TEMkPGEI zk@T;wV;L(NECWB|DubyE--)Tebl;Pa2*`eEt%acoB1!gBvw0HKUd3EBV5C&9E03=+ zT(aJTCdo6uykA|W+s$XvbJr8h;}ceuO7 z1F7QlWiEOtscg&sE|v;hoNFFC7_Aw;0$B~#svOpvkzk_7GOTtO0GG^uz&OJZC z1v{z8B(n9Tfr^S`2~Z+W%XD5ZVVZtf<+$0|-gSHe8`z|(ifMhBZ|eK2OYPB4W#ZzX ziIbCu`0*otVmQQ7@fQlRA8|cH(Q41%X+j6CQt8*J^c&>zD(Sk_XTf6EXLG2}f7AX9 Go_qzT;*@Uy literal 0 HcmV?d00001 diff --git a/target/test-classes/de/butzlabben/world/config/TestPluginConfig.class b/target/test-classes/de/butzlabben/world/config/TestPluginConfig.class index 0a9cab48a57ebada9d50c3b93d8947f79586808e..ec6dc84b1a75189574f14ccf055da38f08767ce5 100644 GIT binary patch literal 5558 zcmbuB`BU8H8OOf@>|NIK1sH4$7~2U3?0DOxah%{BTqdMkF^3IlnutXU0__TGwFcZa zSKFLTdgbVqCOwlTJz}S|Nt|Y;ogOp&d-`*y-$&AF1s2C(X4uuf$MbyN?{mER&;LIC z9KikfJb@CF#!#kW8@4OhGpk+FlBSlOP7Y4a>M2LT_A^G-a2`-l+T1c0LtKICE;6j- zS;N%hNGRAhqURj>l}j#I_MDNO?lSCT0x_s!cqdmh_Z3YKJ2scJwTvaO8+&5dtD*vx z3JzKJbW)qwQZsroWo0r}Hkb6>j5>yyQ?M&#>ROh@iDubL3ikST{bjTn$36x7i$LTX193DeDABXx?}&<{xJ|*1Y2E2# z9P-+YJ)XuxgQ&jCsia1-0lhnNyfjZ;!fP9U?bAzpiGwF@h>B>i#Et4>D!x)M6wHk1nR!!l^qe2!uc~-L=TZd&&>GrU3 zSr;Zv#UxS+DhnEV)16$zRBWb*QRR}Cx=;35DNR!N&MxYqBOSxEiW%{F+h#T~#&mi? zw$7@UlYKHUQH~6z2BOm!13YHb7Q?@?S0IkaGVP(+z91VILI?X zG&`)@mvmdEGp>P}mHDw^--3!oFb72xZ{P5|wvZjNj4WGk)22irz}G~QuPZpRu^O`Y zDHTr_L>QNW**KnK2`)%ql30C9#kVEwlJ6dtn?3_PlT5#$;zc=aHK&J6ZArJi?DCH+ zOI}v-ill69KBtG4^l3S#5KO85S5>@*@3Px@jp;1g5+yHVDe!Kn#`jhHK;)4;4p}K` z6vOKZjz^u^Z|BmT!!4c0JKd=4?lZFbKt406+aubfNv{GH1qMdfpM4 zoNM@KW4G&+@|M#IfPzH#VoINPyKoF|Gv0+Ow0AI=VF8`XXB~FOF(YRXp*@?m95?St zaM;bgo7;Pbp0;eg-8AX7iZ!|7w7t9x*cnpkX}O%)AieHhxGdR)Ii(=F^dc_Awite^ zpuPYvMh7hCtd-ABg^p3T2C7Iw%4(q;u)C3JZ;k9_Vs`0ngALjvJugThaUkfF zECgBY!g+nq-zDAA4_s){Z;CG6P3^=-zPVkv!cvq~70atlwuI`Z*qdCc(L#yl!sW^L z7vEE8XMsA@q!Pnc-cIRWg1Ik(;mDqpT)|=dknfrDw-4+y*v`*4_$$e8h2Ps+uS2=Q zhZ4NWPnnjbZ}C(07T`ztF@MGJ6V8^pn_KuTe>-m=HeOMF9Xpn>ON=P45qYx(YH8pg ze#)mZj{gil=aZO!$6fbsU~GcM#9WnYtcu3^ZlHSn_;u{>FM{oI*Bn9uji}_Q1hCQD z=L04<_Y3@z9xD0&EBu-i1@FHJyuasqe?Rbkkv7UWR_}VR^}N@K_lEug#y}CH!d-kj zT{Y27GhZQFT$EPNNPtoqpd|1+d_a^sAF6ass1F0EX+nu49@I)nDh{2vhQrIaeKpiQ zggQ;Ad+F-FkUsU1Q0wdS`^}*oC(0cWC=U|lA)>SsrQ;S+{;(;OJyk^c!ZNr54M&Az-NrSaxi{ zawT9feU>8;ETzlnCCnhdB6tk)%#vr0O~wrI90_>#2Ryqs;JF&`tXt8;q#2DsnJ3Cc zqS#EBTnJ?=75(w%P%aQnT z&xTmGk}-b?SQh<^X^qMll0110Q-mq?9*q@T)x21N=gIW~xn4p8Ugo{C!b^rZ{`fkc!XW z@HOM(Gb=Q!rA6?yAc42Z_zpFD7p>IhZeHQVE^sQ)?L?s4(G7H44p`T%x@QUa%?R1v zBhvds`hcnaVF+a_Rrg7NvT+EXk6`(TELX^Kl_C5%#IltTej2doeh3dngpi`Vw2bep zzDAb`@(Dq1@U`x<5XiwGK6``s#5ah~jR0h$T>4%pm-t-BB|b*w(%;DVcQXEix%5xw V(!ZEX{|>QkC6_*9j+WrB{|D83)I9(I literal 5002 zcmbuC>vI%k7RH}W0+S34fe;cdAsYch2$xZj$Zh})xvutU4uDZHfT8dRbX_bG#{yqEI@_D;^dOFZBsgMsd-S6d`-+Rt;&O75_ZN(59z_nOd-HVXjV`oOu4E>MJqNd zSW^&gn#U<=1)-q1YtPLLNo>Wo1lm+=N4tU!%Pyp5OFT0_=X6)tDQ!+q^*N5PUEMMr z20-&(2A?Wv248na59WuhH{vE3k$fErw$6FyaZ;z{Av24PD~kTJBe{2|*jeWGRt)I2 z9KTydCw41X%kxZ_hNaDn>qVZ3Ng0+0*dyt?6|CwS9+sZ=DQM|D{8;C~h?~yCXFEE3 zq_qPoQqoHUt&Q0tuV0j-_o}#0`dG)&0bvMN^yPW{2HcNB3G}FV0Ed}I8K3FWg$oSO zfS%9mxsu^7DySRm%SFKjto^bE8v)yI;37gQK1`a$vcW#+U6bIj6B zcCgN61%&{X49T2=9o3^D7uzbFau6ovz`1(Nvji7pWy@S$RIw=2F7@tXdGZM%BC5F6? zrI3|YUQ+S043E@t#7ZSb30zjNH}2Fy6P8^)+K6eq-^)s4S~taLsW>g{ac$b5*Cq*O zWHnot@4;Z5dtRqJ_s5F!7Cw5}uUQ>S{0_4%vqp3Ig1l|ms{B4%z600~Ii(=J2x2Z2 z`bZ95%!xU#vnTL(1>2*y+oz5C`v(CS4w+cA`z$v%jR#waUHJ!GQ4k zS=f!}+0!it!p211$<-d5-)4ecvKa;0iA)AP$fLWddIRK}tFvXvjAu?32yYTO5s_=9 z6?jw=<%)2k)u3Q!U@x+>OdaV7$&6L9bHZ2Arg6_x<#)ybsR7)DSNQ8l{%r)y8msyF zD&JE4R`|WD`x=z*_)vq__$jA>M!e2X)n9-&@JGHW_!DPqz0FhnuH{(sk4Q{5HC)4* z^p99Kx%V2@k5p`}^VcAWO?2Mk+3X0$e49zm{TY9uZ3*{R{EZZE(rz8!-oo2_l05Ht z-ro(q7Xt6wW4t$Q+;BBcZl+jWuY|fCCdJo zsPq!$2vLp_<=7pfd=R4K1Ff{hXr+cE_rwIHpCkh$8N@aWMM&C0sWgRBX{aKV4?~jk z0ZDrd$rT(V%dcai@(5YdWEtTv`2x zyudiU7-3mSoIVX%E(dYyxka32ufk+-)*m4ipPve1#z%Ka%(l`ZaG8v+lJRxM>>*gmK#!#%*VnxP2C~-nQyW1YC#-+nYpsi%4%%>hDBQR#J8U2~n!2@KOxR z2W0t>EFUq2A4gbLlETkJ77?UyTTBWWl;2&)b2nb2pAzIVf_%<@W4?%hYzyhJeA0k@fb6HD#jMLKBWc-GV-%?B8QA<~-rSBuGE78(_snHsI`3ucHE~Nkf