aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/interfaces
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/interfaces')
-rw-r--r--src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java293
1 files changed, 293 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java b/src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java
new file mode 100644
index 0000000000..bc0bf4a9e8
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java
@@ -0,0 +1,293 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.world.World;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+// If you are adding very late-game content feel free to tap into this interface.
+// The eventual goal is to bypass laser/dynamo stuff and have energy deposited directly from ultra-endgame
+// multi-blocks directly into the users network.
+public interface IGlobalWirelessEnergy {
+
+ // --------------------- NEVER access these maps! Use the methods provided! ---------------------
+
+ // Global EU map.
+ HashMap<String, BigInteger> GlobalEnergy = new HashMap<>(100, 0.9f);
+
+ // Maps user IDs to usernames and vice versa. Seems redundant but this makes accessing this
+ // easier in certain locations (like gt commands).
+ HashMap<String, String> GlobalEnergyName = new HashMap<>(100, 0.9f);
+
+ // Maps UUIDs to other UUIDs. This allows users to join a team.
+ HashMap<String, String> GlobalEnergyTeam = new HashMap<>(100, 0.9f);
+
+ // ----------------------------------------------------------------------------------------------
+
+ // Folder
+ String GlobalEnergyFolderName = "GlobalEnergyInformationStorage";
+
+ // 3 txt file names. Do not change.
+ String GlobalEnergyMapFileName = "GlobalEnergyMap";
+ String GlobalEnergyNameFileName = "GlobalEnergyNameMap";
+ String GlobalEnergyTeamFileName = "GlobalEnergyTeamMap";
+
+ // User 0 will join user 1 by calling this function. They will share the same energy network.
+ default void JoinUserNetwork(String user_uuid_0, String user_uuid_1) {
+ GlobalEnergyTeam.put(user_uuid_0, user_uuid_1);
+ }
+
+ // --- Save data for global energy network --
+
+ default void SaveGlobalEnergyInfo(String world_name) {
+ CreateStorageIfNotExist(world_name);
+ SaveGlobalEnergyMap(world_name);
+ SaveGlobalEnergyName(world_name);
+ SaveGlobalEnergyTeam(world_name);
+
+ }
+
+ default void SaveGlobalEnergyMap(String world_name) {
+ try {
+ List<String> lines = GlobalEnergy.entrySet()
+ .stream()
+ .map(entry -> entry.getKey() + ":" + entry.getValue())
+ .collect(Collectors.toList());
+
+ Path path = Paths.get("./saves/" + world_name + "/" + GlobalEnergyFolderName + "/" + GlobalEnergyMapFileName + ".txt").toAbsolutePath();
+ Files.write(path, lines);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ default void SaveGlobalEnergyName(String world_name) {
+ try {
+ List<String> lines = GlobalEnergyName.entrySet()
+ .stream()
+ .map(entry -> entry.getKey() + ":" + entry.getValue())
+ .collect(Collectors.toList());
+
+ Path path = Paths.get("./saves/" + world_name + "/" + GlobalEnergyFolderName + "/" + GlobalEnergyNameFileName + ".txt").toAbsolutePath();
+ Files.write(path, lines);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ default void SaveGlobalEnergyTeam(String world_name) {
+ try {
+ List<String> lines = GlobalEnergyTeam.entrySet()
+ .stream()
+ .map(entry -> entry.getKey() + ":" + entry.getValue())
+ .collect(Collectors.toList());
+
+ Path path = Paths.get("./saves/" + world_name + "/" + GlobalEnergyFolderName + "/" + GlobalEnergyTeamFileName + ".txt").toAbsolutePath();
+ Files.write(path, lines);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // --- Load data for global energy network ---
+
+ default void LoadGlobalEnergyInfo(World world) {
+ CreateStorageIfNotExist(world.getWorldInfo().getWorldName());
+ LoadGlobalEnergyMap(world);
+ LoadGlobalEnergyName(world);
+ LoadGlobalEnergyTeam(world);
+ }
+
+ default void LoadGlobalEnergyMap(World world) {
+ try {
+ Path path = Paths.get("./saves/" + world.getWorldInfo().getWorldName() + "/" + GlobalEnergyFolderName + "/" + GlobalEnergyMapFileName + ".txt").toAbsolutePath();
+
+ String[] data;
+ for(String line : Files.readAllLines(path)) {
+ data = line.split(":");
+
+ String UUID = data[0];
+ BigInteger num = new BigInteger(data[1]);
+
+ GlobalEnergy.put(UUID, num);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ default void LoadGlobalEnergyName(World world) {
+ try {
+ Path path = Paths.get("./saves/" + world.getWorldInfo().getWorldName() + "/"
+ + GlobalEnergyFolderName + "/" + GlobalEnergyNameFileName + ".txt").toAbsolutePath();
+
+ String[] data;
+ for(String line : Files.readAllLines(path)) {
+ data = line.split(":");
+
+ GlobalEnergyName.put(data[0], data[1]);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ default void LoadGlobalEnergyTeam(World world) {
+ try {
+ Path path = Paths.get("./saves/" + world.getWorldInfo().getWorldName() + "/"
+ + GlobalEnergyFolderName + "/" + GlobalEnergyTeamFileName + ".txt").toAbsolutePath();
+
+ String[] data;
+ for(String line : Files.readAllLines(path)) {
+ data = line.split(":");
+
+ GlobalEnergyName.put(data[0], data[1]);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // ------------------
+
+ default void CreateStorageIfNotExist(String world_name) {
+ Path folder_path = Paths.get("./saves/" + world_name + "/" + GlobalEnergyFolderName).toAbsolutePath();
+
+ // Create folder for storing global energy network info.
+ try {
+ Files.createDirectories(folder_path);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // Create txt files.
+ try {
+ File file_0 = new File(folder_path + "/" + GlobalEnergyMapFileName + ".txt");
+ file_0.createNewFile();
+ File file_1 = new File(folder_path + "/" + GlobalEnergyNameFileName + ".txt");
+ file_1.createNewFile();
+ File file_2 = new File(folder_path + "/" + GlobalEnergyTeamFileName + ".txt");
+ file_2.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ // Adds a user to the energy map if they do not already exist. Otherwise, do nothing. Will also check if the user
+ // has changed their username and adjust the maps accordingly. This should be called infrequently. Ideally on first
+ // tick of a machine being placed only.
+
+ default void StrongCheckOrAddUser(EntityPlayer user) {
+ StrongCheckOrAddUser(user.getUniqueID().toString(), user.getDisplayName());
+ }
+
+ default void StrongCheckOrAddUser(UUID user_uuid, String user_name) {
+ StrongCheckOrAddUser(user_uuid.toString(), user_name);
+ }
+
+ default void StrongCheckOrAddUser(String user_uuid, String user_name) {
+
+ // Check if the user has a team. Add them if not.
+ GlobalEnergyTeam.putIfAbsent(user_uuid, user_uuid);
+
+ // Check if the user is in the global energy map.
+ GlobalEnergy.putIfAbsent(user_uuid, BigInteger.ZERO);
+
+ // If the username linked to the users fixed uuid is not equal to their current name then remove it.
+ // This indicates that their username has changed.
+ if (!(GlobalEnergyName.getOrDefault(user_uuid, "").equals(user_name))) {
+ String old_name = GlobalEnergyName.get(user_uuid);
+ GlobalEnergyName.remove(old_name);
+ }
+
+ // Add UUID -> Name, Name -> UUID.
+ GlobalEnergyName.put(user_name, user_uuid);
+ GlobalEnergyName.put(user_uuid, user_name);
+ }
+
+ // ------------------------------------------------------------------------------------
+ // Add EU to the users global energy. You can enter a negative number to subtract it.
+ // If the value goes below 0 it will return false and not perform the operation.
+ // BigIntegers have much slower operations than longs/ints. You should call these methods
+ // as infrequently as possible and bulk store values to add to the global map.
+ default boolean addEUToGlobalEnergyMap(String user_uuid, BigInteger EU) {
+
+ // Get the team UUID. Users are by default in a team with a UUID equal to their player UUID.
+ String team_uuid = GlobalEnergyTeam.getOrDefault(user_uuid, user_uuid);
+
+ // Get the teams total energy stored. If they are not in the map, return 0 EU.
+ BigInteger total_eu = GlobalEnergy.getOrDefault(team_uuid, BigInteger.ZERO);
+ total_eu = total_eu.add(EU);
+
+ // If there is sufficient EU then complete the operation and return true.
+ if (total_eu.signum() >= 0) {
+ GlobalEnergy.put(team_uuid, total_eu);
+ return true;
+ }
+
+ // There is insufficient EU so cancel the operation and return false.
+ return false;
+ }
+
+ default boolean addEUToGlobalEnergyMap(UUID user_uuid, BigInteger EU) {
+ return addEUToGlobalEnergyMap(user_uuid.toString(), EU);
+ }
+
+ default boolean addEUToGlobalEnergyMap(UUID user_uuid, long EU) {
+ return addEUToGlobalEnergyMap(user_uuid.toString(), BigInteger.valueOf(EU));
+ }
+
+ default boolean addEUToGlobalEnergyMap(UUID user_uuid, int EU) {
+ return addEUToGlobalEnergyMap(user_uuid.toString(), BigInteger.valueOf(EU));
+ }
+
+ default boolean addEUToGlobalEnergyMap(String user_uuid, long EU) {
+ return addEUToGlobalEnergyMap(user_uuid, BigInteger.valueOf(EU));
+ }
+
+ default boolean addEUToGlobalEnergyMap(String user_uuid, int EU) {
+ return addEUToGlobalEnergyMap(user_uuid, BigInteger.valueOf(EU));
+ }
+
+ // ------------------------------------------------------------------------------------
+
+ default BigInteger GetUserEU(String user_uuid) {
+ return GlobalEnergy.getOrDefault(GlobalEnergyTeam.getOrDefault(user_uuid, user_uuid), BigInteger.ZERO);
+ }
+
+ // This overwrites the EU in the network. Only use this if you are absolutely sure you know what you are doing.
+ default void SetUserEU(String user_uuid, BigInteger EU) {
+ GlobalEnergy.put(GlobalEnergyTeam.get(user_uuid), EU);
+ }
+
+ default String GetUsernameFromUUID(String uuid) {
+ return GlobalEnergyName.getOrDefault(GlobalEnergyTeam.getOrDefault(uuid, ""), "");
+ }
+
+ default String GetUUIDFromUsername(String username) {
+ return GlobalEnergyTeam.getOrDefault(GlobalEnergyName.getOrDefault(username, ""), "");
+ }
+
+ default void ClearMaps() {
+ // Do not use this unless you are 100% certain you know what you are doing.
+ GlobalEnergy.clear();
+ GlobalEnergyName.clear();
+ GlobalEnergyTeam.clear();
+ }
+
+}
+
+