From 58a41e4eba804a4d9eb6e9d8eb3c97458a920224 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 13 Jan 2019 22:07:44 +0200 Subject: [PATCH] Implement a configurable races whitelist --- .../com/minelittlepony/unicopia/UConfig.java | 74 ++++++++++++++++++ .../com/minelittlepony/unicopia/Unicopia.java | 2 + .../unicopia/command/CommandRacelist.java | 78 +++++++++++++++++++ .../unicopia/command/CommandSpecies.java | 2 +- .../unicopia/command/Commands.java | 1 + .../unicopia/player/PlayerSpeciesList.java | 21 ++++- 6 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/UConfig.java create mode 100644 src/main/java/com/minelittlepony/unicopia/command/CommandRacelist.java diff --git a/src/main/java/com/minelittlepony/unicopia/UConfig.java b/src/main/java/com/minelittlepony/unicopia/UConfig.java new file mode 100644 index 00000000..42744e18 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/UConfig.java @@ -0,0 +1,74 @@ +package com.minelittlepony.unicopia; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.List; + +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +public class UConfig { + + private static UConfig instance; + + private static final Gson gson = new GsonBuilder() + .excludeFieldsWithoutExposeAnnotation() + .setPrettyPrinting() + .create(); + + public static UConfig getInstance() { + return instance; + } + + static void init(File directory) { + File file = new File(directory, "unicopia.json"); + + try { + if (!file.exists()) { + file.createNewFile(); + } + + try(JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file)));) { + instance = gson.fromJson(reader, UConfig.class); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (instance == null) { + instance = new UConfig(); + } + } + + instance.file = file; + + } + + private File file; + + @Expose + private final List speciesWhiteList = Lists.newArrayList(); + + public List getSpeciesWhiteList() { + return speciesWhiteList; + } + + public void save() { + if (file.exists()) { + file.delete(); + } + + try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file)))) { + gson.toJson(this, UConfig.class, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index e992ac52..d7fe0298 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -101,6 +101,8 @@ public class Unicopia implements IGuiHandler { @EventHandler public void preInit(FMLPreInitializationEvent event) { + UConfig.init(event.getModConfigurationDirectory()); + if (UClient.isClientSide()) { UEntities.preInit(); } diff --git a/src/main/java/com/minelittlepony/unicopia/command/CommandRacelist.java b/src/main/java/com/minelittlepony/unicopia/command/CommandRacelist.java new file mode 100644 index 00000000..fcb55a50 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/command/CommandRacelist.java @@ -0,0 +1,78 @@ +package com.minelittlepony.unicopia.command; + +import java.util.ArrayList; +import java.util.List; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.player.PlayerSpeciesList; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; + +class CommandRacelist extends CommandBase { + + public String getName() { + return "racelist"; + } + + public int getRequiredPermissionLevel() { + return 4; + } + + public String getUsage(ICommandSender sender) { + return "commands.racelist.usage"; + } + + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + if (args.length < 2) { + throw new WrongUsageException(getUsage(sender)); + } + + EntityPlayer player = getCommandSenderAsPlayer(sender); + + Race race = Race.fromName(args[1], Race.HUMAN); + + TextComponentTranslation formattedName = new TextComponentTranslation(race.name().toLowerCase()); + + if (race == Race.HUMAN) { + player.sendMessage(new TextComponentTranslation("commands.racelist.illegal", formattedName)); + } else if (args[0].contentEquals("allow")) { + PlayerSpeciesList.instance().whiteListRace(race); + + player.sendMessage(new TextComponentTranslation("commands.racelist.allowed", formattedName)); + } else if (args[0].contentEquals("disallow")) { + PlayerSpeciesList.instance().unwhiteListRace(race); + + player.sendMessage(new TextComponentTranslation("commands.racelist.disallowed", formattedName)); + } else { + throw new WrongUsageException(getUsage(sender)); + } + } + + /** + * Adds the strings available in this command to the given list of tab completion options. + */ + public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) { + if (args.length == 1) { + return getListOfStringsMatchingLastWord(args, "allow", "disallow"); + } + + if (args.length == 2) { + ArrayList names = new ArrayList(); + + for (Race i : Race.values()) { + names.add(i.name().toLowerCase()); + } + + return getListOfStringsMatchingLastWord(args, names.stream().toArray(String[]::new)); + } + + return null; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/command/CommandSpecies.java b/src/main/java/com/minelittlepony/unicopia/command/CommandSpecies.java index 79a52e84..d6c9ee65 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/CommandSpecies.java +++ b/src/main/java/com/minelittlepony/unicopia/command/CommandSpecies.java @@ -158,7 +158,7 @@ class CommandSpecies extends CommandBase { } } - return getListOfStringsMatchingLastWord(args, names.toArray(new String[names.size()])); + return getListOfStringsMatchingLastWord(args, names.stream().toArray(String[]::new)); } if ((args.length == 3 && args[0].contentEquals("set")) || (args[0].contentEquals("get") && args.length == 2)) { diff --git a/src/main/java/com/minelittlepony/unicopia/command/Commands.java b/src/main/java/com/minelittlepony/unicopia/command/Commands.java index e6ddeafb..8b322275 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/Commands.java +++ b/src/main/java/com/minelittlepony/unicopia/command/Commands.java @@ -7,6 +7,7 @@ public class Commands { public static void init(FMLServerStartingEvent event) { event.registerServerCommand(new CommandOverrideGameMode()); event.registerServerCommand(new CommandSpecies()); + event.registerServerCommand(new CommandRacelist()); event.getServer().setAllowFlight(true); } diff --git a/src/main/java/com/minelittlepony/unicopia/player/PlayerSpeciesList.java b/src/main/java/com/minelittlepony/unicopia/player/PlayerSpeciesList.java index f0bcdd5e..44fecc61 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/PlayerSpeciesList.java +++ b/src/main/java/com/minelittlepony/unicopia/player/PlayerSpeciesList.java @@ -1,10 +1,9 @@ package com.minelittlepony.unicopia.player; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.UConfig; import com.minelittlepony.unicopia.forgebullshit.FBS; import net.minecraft.entity.Entity; @@ -19,14 +18,28 @@ public class PlayerSpeciesList { return instance; } - private List serverPermittedRaces = new ArrayList<>(); + public boolean whiteListRace(Race race) { + boolean result = UConfig.getInstance().getSpeciesWhiteList().add(race); + + UConfig.getInstance().save(); + + return result; + } + + public boolean unwhiteListRace(Race race) { + boolean result = UConfig.getInstance().getSpeciesWhiteList().remove(race); + + UConfig.getInstance().save(); + + return result; + } public boolean speciesPermitted(Race race, EntityPlayer sender) { if (race == Race.ALICORN && (sender == null || !sender.capabilities.isCreativeMode)) { return false; } - return race.isDefault() || serverPermittedRaces.isEmpty() || serverPermittedRaces.contains(race); + return race.isDefault() || UConfig.getInstance().getSpeciesWhiteList().isEmpty() || UConfig.getInstance().getSpeciesWhiteList().contains(race); } public IRaceContainer emptyContainer(Entity entity) {