diff --git a/src/client/java/jesse/keeblarcraft/mixin/ClientPlayerInteractionManagerMixin.java b/src/client/java/jesse/keeblarcraft/mixin/ClientPlayerInteractionManagerMixin.java index 4e4b352..1fa709f 100644 --- a/src/client/java/jesse/keeblarcraft/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/client/java/jesse/keeblarcraft/mixin/ClientPlayerInteractionManagerMixin.java @@ -9,9 +9,9 @@ import net.minecraft.client.network.ClientPlayerInteractionManager; @Mixin(ClientPlayerInteractionManager.class) public abstract class ClientPlayerInteractionManagerMixin { - // This initial - @Inject(method = "getReachDistance()F", at = @At ("HEAD"), cancellable = true) - public void getReachDistance(CallbackInfoReturnable cir) { - cir.setReturnValue(10.0f); - } + // This initial basically lets the player highlight the block at 10 blocks away. Does NOT let them break it, that is all handled in the new server mixin + // @Inject(method = "getReachDistance()F", at = @At ("HEAD"), cancellable = true) + // public void getReachDistance(CallbackInfoReturnable cir) { + // cir.setReturnValue(10.0f); + // } } diff --git a/src/main/java/jesse/keeblarcraft/Commands/FactionCommands.java b/src/main/java/jesse/keeblarcraft/Commands/FactionCommands.java index 168c773..7079614 100644 --- a/src/main/java/jesse/keeblarcraft/Commands/FactionCommands.java +++ b/src/main/java/jesse/keeblarcraft/Commands/FactionCommands.java @@ -2,11 +2,13 @@ package jesse.keeblarcraft.Commands; import java.util.List; +import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import jesse.keeblarcraft.FactionMgr.FactionManager; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; @@ -27,6 +29,11 @@ public class FactionCommands { var disbandFaction = CommandManager.literal("disband").build(); var promote = CommandManager.literal("promote").build(); var demote = CommandManager.literal("demote").build(); + var kick = CommandManager.literal("kick").build(); + var info = CommandManager.literal("info") + .executes(context -> GetFactionInformation(context.getSource().getPlayer())) + .build(); + var invite = CommandManager.literal("invite").build(); // The below nodes are duplicates but are necessary to make the execute path jump correctly var createFactionName = CommandManager.argument("faction_name", StringArgumentType.greedyString()) @@ -45,10 +52,22 @@ public class FactionCommands { ) ).build(); + var promoteName = CommandManager.argument("target_name", EntityArgumentType.player()) + .executes(context -> PromotePlayerInFaction(context, EntityArgumentType.getPlayer(context, "target_name"))) + .build(); + var demoteName = CommandManager.argument("target_name", EntityArgumentType.player()) + .executes(context -> DemotePlayerInFaction(context, EntityArgumentType.getPlayer(context, "target_name"))) + .build(); + var kickName = CommandManager.argument("target_name", EntityArgumentType.player()) + .executes(context -> KickPlayerFromFaction(context, EntityArgumentType.getPlayer(context, "target_name"))) + .build(); + var inviteName = CommandManager.argument("target_name", EntityArgumentType.player()) + .executes(context -> InvitePlayerToFaction(context, EntityArgumentType.getPlayer(context, "target_name"))) + .build(); + var leaveFaction = CommandManager.literal("leave").executes(context -> LeaveFaction(context) ).build(); - var listAll = CommandManager.literal("list") .executes(context -> ListAllFactions(context.getSource().getPlayer())).build(); @@ -61,10 +80,52 @@ public class FactionCommands { factionNode.addChild(createFaction); factionNode.addChild(disbandFaction); factionNode.addChild(leaveFaction); + factionNode.addChild(promote); + factionNode.addChild(demote); + factionNode.addChild(kick); + factionNode.addChild(info); + factionNode.addChild(invite); + + promote.addChild(promoteName); + demote.addChild(demoteName); + kick.addChild(kickName); + invite.addChild(inviteName); createFaction.addChild(createFactionName); disbandFaction.addChild(disbandFactionName); }); + + // I'll refactor the above one later! LOL + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + var factionNode = CommandManager.literal("faction").build(); + var powerNode = CommandManager.literal("power") + .executes(context -> GetFactionPower(context.getSource().getPlayer())) + .build(); + var setNode = CommandManager.literal("set").build(); + var factionNameNode = CommandManager.argument("faction_name", StringArgumentType.string()).build(); + + var powerAmountNode = CommandManager.argument("power_amount", IntegerArgumentType.integer()) + .executes(context -> SetFactionPower(context.getSource().getPlayer(), StringArgumentType.getString(context, "faction_name"), IntegerArgumentType.getInteger(context, "power_amount"))) + .build(); + + + dispatcher.getRoot().addChild(factionNode); + factionNode.addChild(powerNode); + + powerNode.addChild(setNode); + setNode.addChild(factionNameNode); + setNode.addChild(powerAmountNode); + }); + } + + public int SetFactionPower(ServerPlayerEntity caller, String faction, Integer amount) { + FactionManager.GetInstance().SetFactionPower(caller, faction, amount); + return 0; + } + + public int GetFactionPower(ServerPlayerEntity player) { + FactionManager.GetInstance().GetFactionPower(player); + return 0; } ///////////////////////////////////////////////////////////////////////////// @@ -109,10 +170,9 @@ public class FactionCommands { return retValue; } - private int AddPlayerToFaction() { - int retValue = -1; - - return retValue; + private int InvitePlayerToFaction(CommandContext context, ServerPlayerEntity player) { + FactionManager.GetInstance().InvitePlayerToFaction(context.getSource().getPlayer(), player.getUuidAsString(), player.getEntityName()); + return 0; } ///////////////////////////////////////////////////////////////////////////// @@ -130,22 +190,26 @@ public class FactionCommands { return 0; } - private int KickPlayerFromFaction() { + private int GetFactionInformation(ServerPlayerEntity player) { + return 0; + } + + private int KickPlayerFromFaction(CommandContext context, ServerPlayerEntity player) { int retValue = -1; return retValue; } - private int PromotePlayerInFaction() { - int retValue = -1; - - return retValue; + private int PromotePlayerInFaction(CommandContext context, ServerPlayerEntity player) { + ServerPlayerEntity caller = context.getSource().getPlayer(); + FactionManager.GetInstance().PromotePlayer(caller, player.getUuidAsString(), player.getEntityName()); + return 0; } - private int DemotePlayerInFaction() { - int retValue = -1; - - return retValue; + private int DemotePlayerInFaction(CommandContext context, ServerPlayerEntity player) { + ServerPlayerEntity caller = context.getSource().getPlayer(); + FactionManager.GetInstance().DemotePlayer(caller, player.getUuidAsString(), player.getEntityName()); + return 0; } private int SetPlayerRoleInFaction() { diff --git a/src/main/java/jesse/keeblarcraft/Commands/MailCommands.java b/src/main/java/jesse/keeblarcraft/Commands/MailCommands.java new file mode 100644 index 0000000..ee5b332 --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/Commands/MailCommands.java @@ -0,0 +1,30 @@ +package jesse.keeblarcraft.Commands; + +import com.mojang.brigadier.arguments.StringArgumentType; + +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.network.ServerPlayerEntity; + +public class MailCommands { + public void RegisterMailCommands() { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + var mailRoot = CommandManager.literal("mail").build(); + var sendNode = CommandManager.literal("send").build(); + var playerName = CommandManager.argument("target_name", StringArgumentType.string()).build(); + var message = CommandManager.argument("mail_msg", StringArgumentType.greedyString()) + .executes(context -> SendMsg(context.getSource().getPlayer(), StringArgumentType.getString(context, "mail_msg"))) + .build(); + + dispatcher.getRoot().addChild(mailRoot); + + mailRoot.addChild(sendNode); + sendNode.addChild(playerName); + playerName.addChild(message); + }); + } + + private int SendMsg(ServerPlayerEntity source, String mail) { + return 0; + } +} diff --git a/src/main/java/jesse/keeblarcraft/Commands/NoteCommands.java b/src/main/java/jesse/keeblarcraft/Commands/NoteCommands.java index e1720b2..e441149 100644 --- a/src/main/java/jesse/keeblarcraft/Commands/NoteCommands.java +++ b/src/main/java/jesse/keeblarcraft/Commands/NoteCommands.java @@ -27,20 +27,20 @@ public class NoteCommands { ///////////////////////////////////////////////////////////////////////////// public NoteCommands() { // Check if directory exists - // if (notesConfig.DoesDirectoryExist(NOTES_GLOBAL_DIRECTORY) == false) { - // // Attempt to create the directory - // try { - // if (notesConfig.CreateDirectory(NOTES_GLOBAL_DIRECTORY) == true) { - // System.out.println(ChatUtil.ColoredString("Created notes directory successfully!", CONSOLE_COLOR.BLUE)); //TODO: Success! - // } else { - // System.out.println(ChatUtil.ColoredString("ERROR: Notes directory FAILED to create!! Either the directory already exists or we are missing permissions!", CONSOLE_COLOR.RED)); //TODO: Critical failure --not specfic enough to mark it as a red or blue - // } - // } catch (DIRECTORY_CREATE_EXCEPTION e) { - // System.out.println(ChatUtil.ColoredString("Directory creation failed", CONSOLE_COLOR.RED)); - // } - // } else { - // System.out.println(ChatUtil.ColoredString("Notes directory already exists. Skipping creation...", CONSOLE_COLOR.BLUE)); //TODO: Success! - // } + if (notesConfig.DoesDirectoryExist(NOTES_GLOBAL_DIRECTORY) == false) { + // Attempt to create the directory + try { + if (notesConfig.CreateDirectory(NOTES_GLOBAL_DIRECTORY) == true) { + System.out.println(ChatUtil.ColoredString("Created notes directory successfully!", CONSOLE_COLOR.BLUE)); //TODO: Success! + } else { + System.out.println(ChatUtil.ColoredString("ERROR: Notes directory FAILED to create!! Either the directory already exists or we are missing permissions!", CONSOLE_COLOR.RED)); //TODO: Critical failure --not specfic enough to mark it as a red or blue + } + } catch (DIRECTORY_CREATE_EXCEPTION e) { + System.out.println(ChatUtil.ColoredString("Directory creation failed", CONSOLE_COLOR.RED)); + } + } else { + System.out.println(ChatUtil.ColoredString("Notes directory already exists. Skipping creation...", CONSOLE_COLOR.BLUE)); //TODO: Success! + } } //TODO: Rework note commands upon story mode release @@ -51,69 +51,69 @@ public class NoteCommands { ///////////////////////////////////////////////////////////////////////////// public void RegisterNoteCommands() { // Command: "/addnote note goes here" + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + dispatcher.register(CommandManager.literal("addnote") + .then(CommandManager.argument("value", StringArgumentType.greedyString()) + .executes(context -> AddNote(StringArgumentType.getString(context, "value"), context)))); + }); + + // Command: "/delnote noteIdHere" // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // dispatcher.register(CommandManager.literal("addnote") + // dispatcher.register(CommandManager.literal("delnote") // .then(CommandManager.argument("value", StringArgumentType.greedyString()) // .executes(context -> AddNote(StringArgumentType.getString(context, "value"), context)))); // }); - // // Command: "/delnote noteIdHere" - // // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // // dispatcher.register(CommandManager.literal("delnote") - // // .then(CommandManager.argument("value", StringArgumentType.greedyString()) - // // .executes(context -> AddNote(StringArgumentType.getString(context, "value"), context)))); - // // }); + // Command: "/purgenotes" + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + dispatcher.register(CommandManager.literal("purgenotes") + .executes(context -> PurgeAllNotes(context))); + }); - // // Command: "/purgenotes" - // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // dispatcher.register(CommandManager.literal("purgenotes") - // .executes(context -> PurgeAllNotes(context))); - // }); + // Command: "/modifynote noteIdHere new_note_string_here" + // Alises: "/editnote" + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + final var mNote = dispatcher.register(CommandManager.literal("editnote") + .then(CommandManager.argument("note_id", IntegerArgumentType.integer()) + .then(CommandManager.argument("new_note", StringArgumentType.string()) + .executes(context -> ModifyNote( + IntegerArgumentType.getInteger(context, "note_id"), + StringArgumentType.getString(context, "new_note"), + context))))); - // // Command: "/modifynote noteIdHere new_note_string_here" - // // Alises: "/editnote" - // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // final var mNote = dispatcher.register(CommandManager.literal("editnote") - // .then(CommandManager.argument("note_id", IntegerArgumentType.integer()) - // .then(CommandManager.argument("new_note", StringArgumentType.string()) - // .executes(context -> ModifyNote( - // IntegerArgumentType.getInteger(context, "note_id"), - // StringArgumentType.getString(context, "new_note"), - // context))))); + dispatcher.register(CommandManager.literal("editnote").redirect(mNote)); + }); - // dispatcher.register(CommandManager.literal("editnote").redirect(mNote)); - // }); + // Command Root: "/delnote noteIdHere" + // Aliases: "/rmnote", "/deletenote" + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + final var rootDeleteCmd = dispatcher.register(CommandManager.literal("delnote") + .then(CommandManager.argument("value", IntegerArgumentType.integer()) + .executes(context -> DeleteNote(IntegerArgumentType.getInteger(context, "value"), context)))); - // // Command Root: "/delnote noteIdHere" - // // Aliases: "/rmnote", "/deletenote" - // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // final var rootDeleteCmd = dispatcher.register(CommandManager.literal("delnote") - // .then(CommandManager.argument("value", IntegerArgumentType.integer()) - // .executes(context -> DeleteNote(IntegerArgumentType.getInteger(context, "value"), context)))); + // Alias redirects + dispatcher.register(CommandManager.literal("rmnote").redirect(rootDeleteCmd)); + dispatcher.register(CommandManager.literal("deletenote").redirect(rootDeleteCmd)); + }); - // // Alias redirects - // dispatcher.register(CommandManager.literal("rmnote").redirect(rootDeleteCmd)); - // dispatcher.register(CommandManager.literal("deletenote").redirect(rootDeleteCmd)); - // }); + // Command Root: "/notegui" + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + dispatcher.register(CommandManager.literal("notegui") + .executes(context -> { OpenNoteGui(context); + return 0; + })); + }); - // // Command Root: "/notegui" - // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // dispatcher.register(CommandManager.literal("notegui") - // .executes(context -> { OpenNoteGui(context); - // return 0; - // })); - // }); + // Command Root: "/notelist" + // Aliases: "/listnotes" + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + final var rootListNotes = dispatcher.register(CommandManager.literal("notelist") + .executes(context -> { ListNotes(context); + return 0; + })); - // // Command Root: "/notelist" - // // Aliases: "/listnotes" - // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - // final var rootListNotes = dispatcher.register(CommandManager.literal("notelist") - // .executes(context -> { ListNotes(context); - // return 0; - // })); - - // dispatcher.register(CommandManager.literal("listnotes").redirect(rootListNotes)); - // }); + dispatcher.register(CommandManager.literal("listnotes").redirect(rootListNotes)); + }); } ///////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java b/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java index 4d864e2..dc09693 100644 --- a/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java +++ b/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java @@ -56,6 +56,7 @@ public class ConfigManager { // Check 2: If the file does not exist, attempt to create it if (ret == false) { try { + file.mkdirs(); ret = file.createNewFile(); } catch (IOException e) { // The file could not be created diff --git a/src/main/java/jesse/keeblarcraft/EventMgr/PlayerJoinListener.java b/src/main/java/jesse/keeblarcraft/EventMgr/PlayerJoinListener.java index 7293e67..71b5077 100644 --- a/src/main/java/jesse/keeblarcraft/EventMgr/PlayerJoinListener.java +++ b/src/main/java/jesse/keeblarcraft/EventMgr/PlayerJoinListener.java @@ -1,7 +1,10 @@ package jesse.keeblarcraft.EventMgr; +import java.util.HashMap; + import jesse.keeblarcraft.AttributeMgr.AttributeMgr; import jesse.keeblarcraft.AttributeMgr.AttributeTree; +import jesse.keeblarcraft.ConfigMgr.ConfigManager; import jesse.keeblarcraft.ConfigMgr.GeneralConfig; import jesse.keeblarcraft.Utils.DirectionalVec; import net.fabricmc.fabric.api.networking.v1.PacketSender; @@ -13,6 +16,13 @@ import net.minecraft.text.Text; public class PlayerJoinListener { private static PlayerJoinListener static_inst; + ConfigManager config = new ConfigManager(); + String CACHED_PLAYER_LOGIN_CONFIG = "misc/cached_uuids.json"; + + private class CachedUUIDConfig { + HashMap cached_uuids = new HashMap(); + } + CachedUUIDConfig cachedPlayerConfig; // Get the static instance for this class public static PlayerJoinListener GetInstance() { @@ -22,6 +32,27 @@ public class PlayerJoinListener { return static_inst; } + public PlayerJoinListener() { + Boolean existingFile = false; + cachedPlayerConfig = new CachedUUIDConfig(); + + try { + cachedPlayerConfig = config.GetJsonObjectFromFile(CACHED_PLAYER_LOGIN_CONFIG, CachedUUIDConfig.class); + existingFile = true; + } catch (Exception e) { + // intentionally empty + } + + if (!existingFile) { + try { + config.CreateFile(CACHED_PLAYER_LOGIN_CONFIG); + FlashCachedConfig(); + } catch (Exception e) { + System.out.println("Failed to parse or create cached uuid file"); + } + } + } + ///////////////////////////////////////////////////////////////////////////// /// @fn HandleServerJoinEvent /// @@ -44,6 +75,7 @@ public class PlayerJoinListener { // Handle first time joining events (world spawn teleport, MOTD, etc) System.out.println("Running first time login stuff"); IsFirstTimeLogin(player, server); + CachePlayersUuid(player.getUuidAsString(), player.getEntityName()); } ///////////////////////////////////////////////////////////////////////////// @@ -74,4 +106,29 @@ public class PlayerJoinListener { } } } + + public String TryGetPlayerUuidByName(String name) { + String uuid = ""; + if (cachedPlayerConfig != null && cachedPlayerConfig.cached_uuids.containsKey(name)) { + uuid = cachedPlayerConfig.cached_uuids.get(name); + } + return uuid; + } + + private void CachePlayersUuid(String uuid, String entityName) { + if (cachedPlayerConfig.cached_uuids.containsKey(entityName)) { + return; + } else { + cachedPlayerConfig.cached_uuids.put(entityName, uuid); + FlashCachedConfig(); + } + } + + private void FlashCachedConfig() { + try { + config.WriteToJsonFile(CACHED_PLAYER_LOGIN_CONFIG, cachedPlayerConfig); + } catch (Exception e) { + System.out.println("Encountered exception in writing cached uuid file!"); + } + } } diff --git a/src/main/java/jesse/keeblarcraft/FactionMgr/FactionConfig.java b/src/main/java/jesse/keeblarcraft/FactionMgr/FactionConfig.java index 290e498..e2a573c 100644 --- a/src/main/java/jesse/keeblarcraft/FactionMgr/FactionConfig.java +++ b/src/main/java/jesse/keeblarcraft/FactionMgr/FactionConfig.java @@ -91,6 +91,26 @@ public class FactionConfig { return success; } + // It is assumed that the person calling this function has verified that the person + // can in fact set faction power. This is generally just an admin command + public Boolean SetPower(String factionName, Integer amount) { + Boolean success = false; + if (IsValid(factionName)) { + allFactions.get(factionName).factionPower = amount; + success = true; + } + return success; + } + + // The user should verify the faction exists prior to calling this. 0 is default + // return if faction does not exist (or the faction actually has a balance of 0) + public Integer GetPower(String factionName) { + Integer amount = 0; + if (IsValid(factionName)) { + amount = allFactions.get(factionName).factionPower; + } + return amount; + } ///////////////////////////////////////////////////////////////////////////// /// @fn DeleteFaction diff --git a/src/main/java/jesse/keeblarcraft/FactionMgr/FactionManager.java b/src/main/java/jesse/keeblarcraft/FactionMgr/FactionManager.java index 2b8cc3e..36f9d6e 100644 --- a/src/main/java/jesse/keeblarcraft/FactionMgr/FactionManager.java +++ b/src/main/java/jesse/keeblarcraft/FactionMgr/FactionManager.java @@ -12,6 +12,7 @@ package jesse.keeblarcraft.FactionMgr; import java.util.List; import jesse.keeblarcraft.ConfigMgr.ConfigManager; +import jesse.keeblarcraft.MailSystem.MailMgr; import jesse.keeblarcraft.Utils.ChatUtil; import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR; import jesse.keeblarcraft.Utils.CustomExceptions.FILE_WRITE_EXCEPTION; @@ -185,6 +186,45 @@ public class FactionManager { return factionConfig.factions.FindFactionOfPlayer(playerUuid); } + public Boolean InvitePlayerToFaction(ServerPlayerEntity caller, String inviteeUuid, String inviteeDisplayName) { + String playerFaction = factionConfig.factions.FindFactionOfPlayer(caller.getUuidAsString()); + Boolean success = false; + if (!playerFaction.equals("")) { + success = factionConfig.factions.InvitePlayerToFaction(playerFaction, caller.getUuidAsString(), inviteeUuid); + } else { + caller.sendMessage(Text.of("You aren't in a faction!")); + } + + if (success) { + String mailMsg = "You receive a faction invite from " + caller.getEntityName() + "! You can join with /faction join " + playerFaction; + MailMgr.GetInstance().SendMail(inviteeUuid, mailMsg); + } + return success; + } + + public Boolean SetFactionPower(ServerPlayerEntity caller, String factionName, Integer amount) { + Boolean success = false; + + if (caller.hasPermissionLevel(4)) { + factionConfig.factions.SetPower(factionName, amount); + } else { + caller.sendMessage(Text.of("You do not have permission to use this command")); + } + + return success; + } + + public Integer GetFactionPower(ServerPlayerEntity caller) { + Integer amount = 0; + + String playerFaction = factionConfig.factions.FindFactionOfPlayer(caller.getUuidAsString()); + if (!playerFaction.equals("")) { + amount = factionConfig.factions.GetPower(playerFaction); + caller.sendMessage(Text.of("[" + playerFaction + " - POWER]: " + Integer.toString(amount))); + } + return amount; + } + public Boolean PromotePlayer(ServerPlayerEntity caller, String promoteeUuid, String promoteeDisplayName) { Boolean success = factionConfig.factions.PromotePlayer(GetFactionOfPlayer(caller.getUuidAsString()), caller.getUuidAsString(), promoteeUuid, promoteeDisplayName); @@ -234,4 +274,4 @@ public class FactionManager { System.out.println("config writing of faction file failed. oh well!"); } } -} +} \ No newline at end of file diff --git a/src/main/java/jesse/keeblarcraft/MailSystem/MailMgr.java b/src/main/java/jesse/keeblarcraft/MailSystem/MailMgr.java new file mode 100644 index 0000000..12e171c --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/MailSystem/MailMgr.java @@ -0,0 +1,81 @@ +package jesse.keeblarcraft.MailSystem; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import jesse.keeblarcraft.ConfigMgr.ConfigManager; + +public class MailMgr { + ConfigManager config = new ConfigManager(); + MailConfigClass mailConfig; + String CONFIG_FILE = "mail/player_mail.json"; + + private static MailMgr static_inst; + public static MailMgr GetInstance() { + if (static_inst == null) { + static_inst = new MailMgr(); + } + return static_inst; + } + + private class MailConfigClass { + private HashMap> mailList = new HashMap>(); + } + + public MailMgr() { + System.out.println("Mail manager called"); + Boolean existingFile = false; + try { + mailConfig = config.GetJsonObjectFromFile(CONFIG_FILE, MailConfigClass.class); + existingFile = true; + } catch (Exception e) { + System.out.println("Mail config could not correctly parse json file or it did not exist"); + } + + if (!existingFile) { + try { + config.CreateFile(CONFIG_FILE); + } catch (Exception e) { + System.out.println("Failed to correctly make or parse mail config file"); + } + } + } + + public void SendMail(String playerUuid, String mail) { + if (mailConfig != null) { + if (mailConfig.mailList.containsKey(playerUuid)) { + mailConfig.mailList.get(playerUuid).add(mail); + } else { + mailConfig.mailList.put(playerUuid, new ArrayList<>(Arrays.asList(mail))); + } + } else { + System.out.println("Mail config is null. Cannot send"); + } + } + + public List GetMail(String playerUuid) { + List mail = null; + if (mailConfig.mailList.containsKey(playerUuid)) { + mail = mailConfig.mailList.get(playerUuid); + } + return mail; + } + + public void ClearMail(String playerUuid) { + if (mailConfig != null && mailConfig.mailList.containsKey(playerUuid)) { + mailConfig.mailList.remove(playerUuid); + } + } + + public void FlashConfig() { + if (mailConfig != null) { + try { + config.WriteToJsonFile(CONFIG_FILE, mailConfig); + } catch (Exception e) { + System.out.println("Could not flash mail config"); + } + } + } +} diff --git a/src/main/java/jesse/keeblarcraft/mixin/PlayerEntityInteractionHandler.java b/src/main/java/jesse/keeblarcraft/mixin/PlayerEntityInteractionHandler.java index d534c4a..86b7861 100644 --- a/src/main/java/jesse/keeblarcraft/mixin/PlayerEntityInteractionHandler.java +++ b/src/main/java/jesse/keeblarcraft/mixin/PlayerEntityInteractionHandler.java @@ -14,17 +14,17 @@ import net.minecraft.server.network.ServerPlayNetworkHandler; @Mixin(targets = "net.minecraft.server.network.ServerPlayNetworkHandler$1") public abstract class PlayerEntityInteractionHandler implements PlayerInteractEntityC2SPacket.Handler { // Unsure what @Shadow is doing, but I'm sure fabric wiki can explain - @Shadow(aliases = "field_28963") @Final private ServerPlayNetworkHandler field_28963; // I assume this is just a bad named field which is the ServerPlayNetworkHandler - @Shadow(aliases = "field_28962") @Final private Entity field_28962; // I assume this is just a bad named field which is the Entity in question depending on the function + // @Shadow(aliases = "field_28963") @Final private ServerPlayNetworkHandler field_28963; // I assume this is just a bad named field which is the ServerPlayNetworkHandler + // @Shadow(aliases = "field_28962") @Final private Entity field_28962; // I assume this is just a bad named field which is the Entity in question depending on the function - // Probably not required for a tool since this is hitting, but you would need to check this if you DID want to make a longer reaching sword or something. Attack is - // in PlayerEntity but this mixin targets the server handler because the server dictates hitting between stuff - @Inject(method = "attack()V", at = @At("HEAD"), require = 1, allow = 1, cancellable = true) - private void isActuallyInHitRange(final CallbackInfo callback) { - // All we are doing in this class is telling the 'attack' function to return false immediately if the two entities are not within a squared distance of each other. - // 100 hard coded because value of hit range is hard coded '10' in the ClientPlayerInteractionManagerMixin in the client section (10^2) - if (!(this.field_28963.player.squaredDistanceTo(this.field_28962) <= 100)) { // 10^2 becauses 10 blocks chosen in Client mixin - callback.cancel(); - } - } + // // Probably not required for a tool since this is hitting, but you would need to check this if you DID want to make a longer reaching sword or something. Attack is + // // in PlayerEntity but this mixin targets the server handler because the server dictates hitting between stuff + // @Inject(method = "attack()V", at = @At("HEAD"), require = 1, allow = 1, cancellable = true) + // private void isActuallyInHitRange(final CallbackInfo callback) { + // // All we are doing in this class is telling the 'attack' function to return false immediately if the two entities are not within a squared distance of each other. + // // 100 hard coded because value of hit range is hard coded '10' in the ClientPlayerInteractionManagerMixin in the client section (10^2) + // if (!(this.field_28963.player.squaredDistanceTo(this.field_28962) <= 100)) { // 10^2 becauses 10 blocks chosen in Client mixin + // callback.cancel(); + // } + // } } diff --git a/src/main/java/jesse/keeblarcraft/mixin/ServerPlayNetworkHandlerMixin.java b/src/main/java/jesse/keeblarcraft/mixin/ServerPlayNetworkHandlerMixin.java index b206e65..592c21c 100644 --- a/src/main/java/jesse/keeblarcraft/mixin/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/jesse/keeblarcraft/mixin/ServerPlayNetworkHandlerMixin.java @@ -14,27 +14,27 @@ import net.minecraft.server.network.ServerPlayNetworkHandler; public abstract class ServerPlayNetworkHandlerMixin implements ServerPlayPacketListener { // Truth be told not required for a pickaxe or tool probably - @Redirect( - method = "onPlayerInteractEntity(Lnet/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket;)V", - at = @At(value = "FIELD", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;MAX_BREAK_SQUARED_DISTANCE:D", opcode = Opcodes.GETSTATIC)) - private double getActualAttackRange() { - return 100; // 10^2 becauses 10 blocks chosen in Client mixin - } + // @Redirect( + // method = "onPlayerInteractEntity(Lnet/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket;)V", + // at = @At(value = "FIELD", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;MAX_BREAK_SQUARED_DISTANCE:D", opcode = Opcodes.GETSTATIC)) + // private double getActualAttackRange() { + // return 100; // 10^2 becauses 10 blocks chosen in Client mixin + // } - // Essentially replaces the 'MAX_BREAK_SQUARED_DISTANCE' value with the value we have in the function (100), or 10 blocks which bc 10^2 - @Redirect( - method = "onPlayerInteractBlock(Lnet/minecraft/network/packet/c2s/play/PlayerInteractBlockC2SPacket;)V", - at = @At(value = "FIELD", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;MAX_BREAK_SQUARED_DISTANCE:D", opcode = Opcodes.GETSTATIC)) - private double getActualReachDistance() { - return 100; // 10^2 becauses 10 blocks chosen in Client mixin - } + // // Essentially replaces the 'MAX_BREAK_SQUARED_DISTANCE' value with the value we have in the function (100), or 10 blocks which bc 10^2 + // @Redirect( + // method = "onPlayerInteractBlock(Lnet/minecraft/network/packet/c2s/play/PlayerInteractBlockC2SPacket;)V", + // at = @At(value = "FIELD", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;MAX_BREAK_SQUARED_DISTANCE:D", opcode = Opcodes.GETSTATIC)) + // private double getActualReachDistance() { + // return 100; // 10^2 becauses 10 blocks chosen in Client mixin + // } - // Search '64' inside the same onPlayerInteractBlock, would also need to replace that value maybe. This is in the github reference for that block breaking - // im not 100% sure what this is doing. If it's squared then sqrt(64) = 8 blocks but I'm not sure what 8 would represent here. - @ModifyConstant( - method = "onPlayerInteractBlock(Lnet/minecraft/network/packet/c2s/play/PlayerInteractBlockC2SPacket;)V", - require = 1, allow = 1, constant = @Constant(doubleValue = 64.0)) - private double getActualReachDistance(final double reachDistance) { - return 100; // 10^2 becauses 10 blocks chosen in Client mixin - } + // // Search '64' inside the same onPlayerInteractBlock, would also need to replace that value maybe. This is in the github reference for that block breaking + // // im not 100% sure what this is doing. If it's squared then sqrt(64) = 8 blocks but I'm not sure what 8 would represent here. + // @ModifyConstant( + // method = "onPlayerInteractBlock(Lnet/minecraft/network/packet/c2s/play/PlayerInteractBlockC2SPacket;)V", + // require = 1, allow = 1, constant = @Constant(doubleValue = 64.0)) + // private double getActualReachDistance(final double reachDistance) { + // return 100; // 10^2 becauses 10 blocks chosen in Client mixin + // } } diff --git a/src/main/java/jesse/keeblarcraft/mixin/ServerPlayerInteractionManagerMixin.java b/src/main/java/jesse/keeblarcraft/mixin/ServerPlayerInteractionManagerMixin.java index 2ccf017..978c0d4 100644 --- a/src/main/java/jesse/keeblarcraft/mixin/ServerPlayerInteractionManagerMixin.java +++ b/src/main/java/jesse/keeblarcraft/mixin/ServerPlayerInteractionManagerMixin.java @@ -13,12 +13,12 @@ import net.minecraft.server.network.ServerPlayerInteractionManager; // This class is needed to validate the actual block breaking @Mixin(ServerPlayerInteractionManager.class) public abstract class ServerPlayerInteractionManagerMixin { - @Shadow @Final protected ServerPlayerEntity player; +// @Shadow @Final protected ServerPlayerEntity player; - @Redirect( - method = "processBlockBreakingAction", - at = @At(value = "FIELD", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;MAX_BREAK_SQUARED_DISTANCE:D", opcode = Opcodes.GETSTATIC)) - private double getActualReachDistance() { - return 100; // 10^2 becauses 10 blocks chosen in Client mixin - } +// @Redirect( +// method = "processBlockBreakingAction", +// at = @At(value = "FIELD", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;MAX_BREAK_SQUARED_DISTANCE:D", opcode = Opcodes.GETSTATIC)) +// private double getActualReachDistance() { +// return 100; // 10^2 becauses 10 blocks chosen in Client mixin +// } }