diff --git a/README.md b/README.md index 22d9690..03d8767 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # ![Logo](https://i.imgur.com/ktkHND1.png) This mod is FAR FROM FINISHED, and initially just created for our private Survival Server. -As a challenge I'm trying to make it as user-friendly as possible. (It ain't there yet tho ;) ) +As a challenge I'm trying to make it as user-friendly as possible. # Current feature-set ## Server Side @@ -26,26 +26,35 @@ As a challenge I'm trying to make it as user-friendly as possible. (It ain't the - Version "control" - Shared Ender Chest - Shared EC Access control (via config) + - Open/close EC block while opening/closing SEC + - Play open & close sounds - Vein miner ![VeinMiner](https://i.imgur.com/zOXWMNa.gif) +- Chat Calculator ### Commands - /spectator | Essentially server-side free-cam, you get put in spectator and are able to fly around, once you use the command again you get put back to where you were. - /slimechunk (/sc) | See if you're currently in a slimechunk -# Currently working on 1.3.2 - -## Server Side -- [x] Chat Calculator - ## Client Side -- [x] Teleportation Angle Viewer for [this machine](https://www.youtube.com/watch?v=FnUE-ZaALLw) -![Teleportation Keybindings](https://i.imgur.com/gjO1H3d.png) -- [x] Removed game fog (lava, water, etc.) - - [ ] Made it toggleable -- [ ] Mod Menu integration -# Features to come +- Teleportation Angle Viewer for [this machine](https://www.youtube.com/watch?v=FnUE-ZaALLw) + - Toggleable pitch/yaw lock while teleporting + ![Teleportation Keybindings](https://i.imgur.com/gjO1H3d.png) +- Remove game fog (lava, water, etc.) + - All types individually toggleable +- Mod Menu integration + - Automatic config adaption (currently booleans only) +- Remove darkness effect + - Toggleable +- Keybinding for /camera + +# To-do + +## General +- Rework config system + - Store server settings in world folder for better singleplayer use + - Rework Mod Menu integration to be more flexible ## Server Side - Telekinesis diff --git a/gradle.properties b/gradle.properties index 2660412..1ad2457 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.21.4+build.8 loader_version=0.16.10 # Mod Properties -mod_version=1.3.2 +mod_version=1.4.0 maven_group=wtf.hak.survivalfabric archives_base_name=survivalfabric diff --git a/src/client/java/wtf/hak/survivalfabric/SurvivalFabricClient.java b/src/client/java/wtf/hak/survivalfabric/SurvivalFabricClient.java index 4757a5c..099d664 100644 --- a/src/client/java/wtf/hak/survivalfabric/SurvivalFabricClient.java +++ b/src/client/java/wtf/hak/survivalfabric/SurvivalFabricClient.java @@ -3,12 +3,21 @@ package wtf.hak.survivalfabric; import net.fabricmc.api.ClientModInitializer; import wtf.hak.survivalfabric.config.client.ClientConfigManager; import wtf.hak.survivalfabric.features.AngleViewer; +import wtf.hak.survivalfabric.features.RemoveDarknessEffect; +import wtf.hak.survivalfabric.features.SFKeyBindings; public class SurvivalFabricClient implements ClientModInitializer { - @Override - public void onInitializeClient() { - ClientConfigManager.getConfig(); - AngleViewer.register(); - } + @Override + public void onInitializeClient() { + + // Config + ClientConfigManager.getConfig(); + + // Features + AngleViewer.register(); + RemoveDarknessEffect.register(); + SFKeyBindings.register(); + + } } \ No newline at end of file diff --git a/src/client/java/wtf/hak/survivalfabric/SurvivalFabricDataGenerator.java b/src/client/java/wtf/hak/survivalfabric/SurvivalFabricDataGenerator.java index b14e2d9..1385d79 100644 --- a/src/client/java/wtf/hak/survivalfabric/SurvivalFabricDataGenerator.java +++ b/src/client/java/wtf/hak/survivalfabric/SurvivalFabricDataGenerator.java @@ -4,8 +4,8 @@ import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; public class SurvivalFabricDataGenerator implements DataGeneratorEntrypoint { - @Override - public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { + @Override + public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { - } + } } diff --git a/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfig.java b/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfig.java index 86c9799..d9f5cb5 100644 --- a/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfig.java +++ b/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfig.java @@ -9,4 +9,6 @@ public class ClientConfig { public boolean renderLavaFog = false; public boolean renderWaterFog = false; public boolean renderSnowFog = false; + public boolean removeDarknessEffect = true; + public boolean lockTeleportHeadMovement = true; } diff --git a/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfigManager.java b/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfigManager.java index d0cedfd..84f9da2 100644 --- a/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfigManager.java +++ b/src/client/java/wtf/hak/survivalfabric/config/client/ClientConfigManager.java @@ -25,7 +25,7 @@ public class ClientConfigManager { } public static ClientConfig load() { - try(FileReader reader = new FileReader(CONFIG_FILE)) { + try (FileReader reader = new FileReader(CONFIG_FILE)) { INSTANCE = GSON.fromJson(reader, ClientConfig.class); if (INSTANCE.configVersion.equalsIgnoreCase(new Config().configVersion)) { return INSTANCE; @@ -41,12 +41,12 @@ public class ClientConfigManager { } } - public static void save(){ + public static void save() { save(INSTANCE); } public static void save(ClientConfig config) { - try(FileWriter writer = new FileWriter(CONFIG_FILE)) { + try (FileWriter writer = new FileWriter(CONFIG_FILE)) { GSON.toJson(config, writer); } catch (IOException e) { System.out.println("Error saving config: " + e.getMessage()); diff --git a/src/client/java/wtf/hak/survivalfabric/features/AngleViewer.java b/src/client/java/wtf/hak/survivalfabric/features/AngleViewer.java index 3a1ede1..1cdc78f 100644 --- a/src/client/java/wtf/hak/survivalfabric/features/AngleViewer.java +++ b/src/client/java/wtf/hak/survivalfabric/features/AngleViewer.java @@ -17,7 +17,7 @@ public class AngleViewer { public static boolean PREVENT_HEAD_MOVEMENT = false; public static void register() { - for(Angle angle : Angle.values()) { + for (Angle angle : Angle.values()) { KeyBinding keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding( "key.survivalfabric." + angle.name().toLowerCase(), InputUtil.Type.KEYSYM, @@ -28,14 +28,14 @@ public class AngleViewer { ClientTickEvents.END_CLIENT_TICK.register(mc -> { while (keyBinding.wasPressed()) { ClientPlayerEntity player = mc.player; - if(player == null) return; + if (player == null) return; player.setYaw(angle.yaw); player.setPitch(angle.pitch); PREVENT_HEAD_MOVEMENT = true; scheduler.schedule(() -> { - if(player == null) return; + if (player == null) return; PREVENT_HEAD_MOVEMENT = false; player.setPitch(-90); PREVENT_HEAD_MOVEMENT = true; diff --git a/src/client/java/wtf/hak/survivalfabric/features/RemoveDarknessEffect.java b/src/client/java/wtf/hak/survivalfabric/features/RemoveDarknessEffect.java new file mode 100644 index 0000000..c1d8d6c --- /dev/null +++ b/src/client/java/wtf/hak/survivalfabric/features/RemoveDarknessEffect.java @@ -0,0 +1,19 @@ +package wtf.hak.survivalfabric.features; + +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import wtf.hak.survivalfabric.config.client.ClientConfigManager; + +public class RemoveDarknessEffect { + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (client.player != null && ClientConfigManager.getConfig().removeDarknessEffect) { + StatusEffectInstance darknessEffect = client.player.getStatusEffect(StatusEffects.DARKNESS); + if (darknessEffect != null) + client.player.removeStatusEffect(darknessEffect.getEffectType()); + } + }); + } +} diff --git a/src/client/java/wtf/hak/survivalfabric/features/SFKeyBindings.java b/src/client/java/wtf/hak/survivalfabric/features/SFKeyBindings.java new file mode 100644 index 0000000..73df70b --- /dev/null +++ b/src/client/java/wtf/hak/survivalfabric/features/SFKeyBindings.java @@ -0,0 +1,22 @@ +package wtf.hak.survivalfabric.features; + +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; +import org.lwjgl.glfw.GLFW; + +public class SFKeyBindings { + + private static final KeyBinding CAMERA_BIND = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.survivalfabric.camera", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_PERIOD, "category.survivalfabric.survivalfabric")); + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if(client.player != null) { + if (CAMERA_BIND.wasPressed()) { + client.player.networkHandler.sendChatCommand("camera"); + } + } + }); + } +} diff --git a/src/client/java/wtf/hak/survivalfabric/mixin/client/BackgroundRendererMixin.java b/src/client/java/wtf/hak/survivalfabric/mixin/client/BackgroundRendererMixin.java index bc6fccc..0c42d31 100644 --- a/src/client/java/wtf/hak/survivalfabric/mixin/client/BackgroundRendererMixin.java +++ b/src/client/java/wtf/hak/survivalfabric/mixin/client/BackgroundRendererMixin.java @@ -8,6 +8,7 @@ import net.minecraft.client.render.FogShape; import net.minecraft.world.World; import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -17,26 +18,30 @@ import static wtf.hak.survivalfabric.config.client.ClientConfigManager.getConfig @Mixin(value = BackgroundRenderer.class, priority = 910) public abstract class BackgroundRendererMixin { + @Unique + private static final Fog EMPTY_FOG = new Fog(-8.0f, 1_000_000.0F, FogShape.CYLINDER, 0, 0, 0, 0); + @Inject(method = "applyFog", at = @At("RETURN"), cancellable = true) private static void applyFog(Camera camera, BackgroundRenderer.FogType fogType, Vector4f color, float viewDistance, boolean thickenFog, float tickProgress, CallbackInfoReturnable cir) { + CameraSubmersionType submersion = camera.getSubmersionType(); boolean renderFog = true; - CameraSubmersionType subType = camera.getSubmersionType(); - if(subType == CameraSubmersionType.NONE) { - World world = camera.getFocusedEntity().getWorld(); - if(world.getRegistryKey() == World.OVERWORLD && !getConfig().renderOverworldFog) - renderFog = false; - else if(world.getRegistryKey() == World.NETHER && !getConfig().renderNetherFog) - renderFog = false; - else if(world.getRegistryKey() == World.END && !getConfig().renderEndFog) - renderFog = false; - } else if(subType == CameraSubmersionType.WATER && !getConfig().renderWaterFog) - renderFog = false; - else if(subType == CameraSubmersionType.LAVA && !getConfig().renderLavaFog) - renderFog = false; - else if(subType == CameraSubmersionType.POWDER_SNOW && !getConfig().renderSnowFog) - renderFog = false; - if(!renderFog) - cir.setReturnValue(new Fog(-8.0f, 1_000_000.0F, FogShape.CYLINDER, 0,0,0,0)); + switch (submersion) { + case NONE -> { + World world = camera.getFocusedEntity().getWorld(); + if ((world.getRegistryKey() == World.OVERWORLD && !getConfig().renderOverworldFog) + || (world.getRegistryKey() == World.NETHER && !getConfig().renderNetherFog) + || (world.getRegistryKey() == World.END && !getConfig().renderEndFog)) { + renderFog = false; + } + } + case WATER -> renderFog = getConfig().renderWaterFog; + case LAVA -> renderFog = getConfig().renderLavaFog; + case POWDER_SNOW -> renderFog = getConfig().renderSnowFog; + } + + if (!renderFog) { + cir.setReturnValue(EMPTY_FOG); + } } } diff --git a/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java b/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java index 5aca6bd..df4ded4 100644 --- a/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java +++ b/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java @@ -6,6 +6,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import wtf.hak.survivalfabric.config.client.ClientConfigManager; import wtf.hak.survivalfabric.features.AngleViewer; @Mixin(Entity.class) @@ -13,8 +14,8 @@ public abstract class EntityMixin { @Inject(method = "setYaw", at = @At("HEAD"), cancellable = true) private void preventYawChange(float yaw, CallbackInfo ci) { - if((Object) this instanceof ClientPlayerEntity player) { - if(player.isMainPlayer() && AngleViewer.PREVENT_HEAD_MOVEMENT) { + if ((Object) this instanceof ClientPlayerEntity player) { + if (player.isMainPlayer() && AngleViewer.PREVENT_HEAD_MOVEMENT && ClientConfigManager.getConfig().lockTeleportHeadMovement) { ci.cancel(); } } @@ -22,8 +23,8 @@ public abstract class EntityMixin { @Inject(method = "setPitch", at = @At("HEAD"), cancellable = true) private void preventPitchChange(float pitch, CallbackInfo ci) { - if((Object) this instanceof ClientPlayerEntity player) { - if(player.isMainPlayer() && AngleViewer.PREVENT_HEAD_MOVEMENT) { + if ((Object) this instanceof ClientPlayerEntity player) { + if (player.isMainPlayer() && AngleViewer.PREVENT_HEAD_MOVEMENT && ClientConfigManager.getConfig().lockTeleportHeadMovement) { ci.cancel(); } } diff --git a/src/client/java/wtf/hak/survivalfabric/modmenu/ConfigScreen.java b/src/client/java/wtf/hak/survivalfabric/modmenu/ConfigScreen.java index 907c154..6b4843f 100644 --- a/src/client/java/wtf/hak/survivalfabric/modmenu/ConfigScreen.java +++ b/src/client/java/wtf/hak/survivalfabric/modmenu/ConfigScreen.java @@ -55,7 +55,6 @@ public class ConfigScreen extends Screen { } } - // Done button this.addDrawableChild(ButtonWidget.builder( Text.translatable("gui.done"), button -> this.client.setScreen(parent) diff --git a/src/client/java/wtf/hak/survivalfabric/modmenu/ModMenuIntegration.java b/src/client/java/wtf/hak/survivalfabric/modmenu/ModMenuIntegration.java index d2f93d7..cb7b2e2 100644 --- a/src/client/java/wtf/hak/survivalfabric/modmenu/ModMenuIntegration.java +++ b/src/client/java/wtf/hak/survivalfabric/modmenu/ModMenuIntegration.java @@ -10,7 +10,6 @@ public class ModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - System.out.println("Does ModMenuIntegration even load?"); - return parent -> new ConfigScreen(parent); + return ConfigScreen::new; } } diff --git a/src/client/resources/survivalfabric.client.mixins.json b/src/client/resources/survivalfabric.client.mixins.json index 9c10e21..6e215a6 100644 --- a/src/client/resources/survivalfabric.client.mixins.json +++ b/src/client/resources/survivalfabric.client.mixins.json @@ -8,5 +8,5 @@ ], "injectors": { "defaultRequire": 1 - } + } } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java b/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java index 3122f1d..0af8e4b 100644 --- a/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java +++ b/src/main/java/wtf/hak/survivalfabric/SurvivalFabric.java @@ -1,7 +1,6 @@ package wtf.hak.survivalfabric; import net.fabricmc.api.ModInitializer; - import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; @@ -11,37 +10,36 @@ import org.slf4j.LoggerFactory; import wtf.hak.survivalfabric.commands.ReloadConfigCommand; import wtf.hak.survivalfabric.commands.SlimeChunkCommand; import wtf.hak.survivalfabric.commands.SpectatorCommand; -import wtf.hak.survivalfabric.sharedenderchest.SharedEnderChest; -import wtf.hak.survivalfabric.veinminer.VeinMinerEvents; +import wtf.hak.survivalfabric.features.sharedenderchest.SharedEnderChest; +import wtf.hak.survivalfabric.features.veinminer.VeinMinerEvents; import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; public class SurvivalFabric implements ModInitializer { - public static final String MOD_ID = "survivalfabric"; + public static final String MOD_ID = "survivalfabric"; - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - @Override - public void onInitialize() { - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> SpectatorCommand.register(dispatcher, new String[] { "spectator", "s", "S", "camera", "c", "C", })); - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> ReloadConfigCommand.register(dispatcher, new String[] { "reloadsurvivalconfig" })); - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> SlimeChunkCommand.register(dispatcher, new String[] { "slimechunk", "sc" })); + @Override + public void onInitialize() { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> SpectatorCommand.register(dispatcher, "spectator", "s", "S", "camera", "c", "C")); + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> ReloadConfigCommand.register(dispatcher, "reloadsurvivalconfig")); + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> SlimeChunkCommand.register(dispatcher, "slimechunk", "sc")); - if(getConfig().sharedEnderChestEnabled) - new SharedEnderChest().onInitialize(); + if (getConfig().sharedEnderChestEnabled) + new SharedEnderChest().onInitialize(); - if(getConfig().veinMinerEnabled) { - PlayerBlockBreakEvents.BEFORE.register((world, player, pos, state, blockEntity) -> { - if (player instanceof ServerPlayerEntity serverPlayer) { - return VeinMinerEvents.beforeBlockBreak(world, serverPlayer, pos, state); - } - else { - return true; - } - }); + if (getConfig().veinMinerEnabled) { + PlayerBlockBreakEvents.BEFORE.register((world, player, pos, state, blockEntity) -> { + if (player instanceof ServerPlayerEntity serverPlayer) { + return VeinMinerEvents.beforeBlockBreak(world, serverPlayer, pos, state); + } else { + return true; + } + }); - ServerEntityEvents.ENTITY_LOAD.register(VeinMinerEvents::onEntityLoad); - } - } + ServerEntityEvents.ENTITY_LOAD.register(VeinMinerEvents::onEntityLoad); + } + } } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/commands/SlimeChunkCommand.java b/src/main/java/wtf/hak/survivalfabric/commands/SlimeChunkCommand.java index fa0e7de..bd0bc90 100644 --- a/src/main/java/wtf/hak/survivalfabric/commands/SlimeChunkCommand.java +++ b/src/main/java/wtf/hak/survivalfabric/commands/SlimeChunkCommand.java @@ -6,11 +6,9 @@ import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; -import net.minecraft.util.math.random.CheckedRandom; import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.util.math.random.Random; import net.minecraft.world.chunk.Chunk; -import wtf.hak.survivalfabric.config.ConfigManager; import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; @@ -31,7 +29,7 @@ public class SlimeChunkCommand { ServerPlayerEntity p = (ServerPlayerEntity) source.getEntity(); Chunk chunk = p.getServerWorld().getChunk(p.getBlockPos()); Random slimeRandom = ChunkRandom.getSlimeRandom(chunk.getPos().x, chunk.getPos().z, p.getServerWorld().getSeed(), 987234911L); - if(slimeRandom.nextInt(10) == 0) { + if (slimeRandom.nextInt(10) == 0) { p.sendMessage(Text.literal(getConfig().inSlimeChunkMessage)); } else p.sendMessage(Text.literal(getConfig().notInSlimeChunkMessage)); diff --git a/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java b/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java index 0fc1b4e..2e7c758 100644 --- a/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java +++ b/src/main/java/wtf/hak/survivalfabric/commands/SpectatorCommand.java @@ -8,7 +8,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.world.GameMode; -import wtf.hak.survivalfabric.utils.Utils; +import wtf.hak.survivalfabric.utils.PacketUtils; import java.util.HashMap; import java.util.Map; @@ -36,7 +36,7 @@ public class SpectatorCommand { player.teleport(data.world, data.x, data.y, data.z, Set.of(), data.yaw, data.pitch, false); player.changeGameMode(GameMode.SURVIVAL); spectating.remove(player); - Utils.updateListNames(player); + PacketUtils.updateListNames(player); } else { spectating.put(player, new LocationData(player @@ -47,7 +47,7 @@ public class SpectatorCommand { .getPitch(), player .getServerWorld())); player.changeGameMode(GameMode.SPECTATOR); - Utils.updateListNames(player); + PacketUtils.updateListNames(player); } return 1; } diff --git a/src/main/java/wtf/hak/survivalfabric/config/ConfigManager.java b/src/main/java/wtf/hak/survivalfabric/config/ConfigManager.java index 3742424..82c3023 100644 --- a/src/main/java/wtf/hak/survivalfabric/config/ConfigManager.java +++ b/src/main/java/wtf/hak/survivalfabric/config/ConfigManager.java @@ -24,7 +24,7 @@ public class ConfigManager { } public static Config load() { - try(FileReader reader = new FileReader(CONFIG_FILE)) { + try (FileReader reader = new FileReader(CONFIG_FILE)) { INSTANCE = GSON.fromJson(reader, Config.class); if (INSTANCE.configVersion.equalsIgnoreCase(new Config().configVersion)) { return INSTANCE; @@ -41,7 +41,7 @@ public class ConfigManager { } public static void save(Config config) { - try(FileWriter writer = new FileWriter(CONFIG_FILE)) { + try (FileWriter writer = new FileWriter(CONFIG_FILE)) { GSON.toJson(config, writer); } catch (IOException e) { System.out.println("Error saving config: " + e.getMessage()); diff --git a/src/main/java/wtf/hak/survivalfabric/sharedenderchest/SharedEnderChest.java b/src/main/java/wtf/hak/survivalfabric/features/sharedenderchest/SharedEnderChest.java similarity index 77% rename from src/main/java/wtf/hak/survivalfabric/sharedenderchest/SharedEnderChest.java rename to src/main/java/wtf/hak/survivalfabric/features/sharedenderchest/SharedEnderChest.java index 0923f02..2f8fde5 100644 --- a/src/main/java/wtf/hak/survivalfabric/sharedenderchest/SharedEnderChest.java +++ b/src/main/java/wtf/hak/survivalfabric/features/sharedenderchest/SharedEnderChest.java @@ -1,15 +1,9 @@ -package wtf.hak.survivalfabric.sharedenderchest; +package wtf.hak.survivalfabric.features.sharedenderchest; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; - -import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; - +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.block.Blocks; import net.minecraft.block.EnderChestBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventories; @@ -23,11 +17,14 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.WorldSavePath; import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import java.io.*; + import static wtf.hak.survivalfabric.SurvivalFabric.LOGGER; import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; @@ -37,6 +34,51 @@ public class SharedEnderChest implements ServerLifecycleEvents.ServerStopping, S private long ticksUntilSave = -20; + public static void saveInventory(MinecraftServer server) { + File inventoryFile = getFile(server); + NbtCompound nbt = new NbtCompound(); + DefaultedList inventoryItemStacks = DefaultedList.ofSize(getConfig().sharedEnderChestRows * 9, ItemStack.EMPTY); + Inventories.writeNbt(nbt, sharedInventory.getList(inventoryItemStacks), server.getRegistryManager()); + try (FileOutputStream inventoryFileOutputStream = new FileOutputStream(inventoryFile); + DataOutputStream inventoryFileDataOutput = new DataOutputStream(inventoryFileOutputStream)) { + inventoryFile.createNewFile(); + NbtIo.writeCompressed(nbt, inventoryFileDataOutput); + } catch (Exception e) { + LOGGER.error("Error while saving Shared Ender Chest: " + e); + } + } + + public static void openSharedEnderChest(PlayerEntity player, World world, BlockPos pos) { + fakeEnderChestOpen(world, pos, true); + sharedInventory.openedEnderChests.put(player, pos); + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((int_1, playerInventory, playerEntity) -> + new GenericContainerScreenHandler(getConfig().screenHandlerType(), int_1, playerInventory, sharedInventory, getConfig().sharedEnderChestRows), Text.of(getConfig().sharedEnderChestName))); + } + + public static void playEnderChestOpenSound(World world, BlockPos pos) { + world.playSound(null, pos, SoundEvents.BLOCK_ENDER_CHEST_OPEN, SoundCategory.BLOCKS, 0.5F, world.random.nextFloat() * 0.1F + 0.9F); + } + + public static void playEnderChestCloseSound(World world, BlockPos pos) { + world.playSound(null, pos, SoundEvents.BLOCK_ENDER_CHEST_CLOSE, SoundCategory.BLOCKS, 0.5F, world.random.nextFloat() * 0.1F + 0.9F); + } + + public static void fakeEnderChestOpen(World world, BlockPos pos, boolean open) { + if (!(world.getBlockState(pos).getBlock() instanceof EnderChestBlock)) { + return; + } + + if (open) + playEnderChestOpenSound(world, pos); + else + playEnderChestCloseSound(world, pos); + world.addSyncedBlockEvent(pos, Blocks.ENDER_CHEST, 1, open ? 1 : 0); + } + + private static File getFile(MinecraftServer server) { + return server.getSavePath(WorldSavePath.ROOT).resolve("sharedenderchest.sav").toFile(); + } + public void onServerStarted(MinecraftServer server) { File inventoryFile = getFile(server); if (inventoryFile.exists()) { @@ -55,19 +97,6 @@ public class SharedEnderChest implements ServerLifecycleEvents.ServerStopping, S } } - public static void saveInventory(MinecraftServer server) { - File inventoryFile = getFile(server); - NbtCompound nbt = new NbtCompound(); - DefaultedList inventoryItemStacks = DefaultedList.ofSize(getConfig().sharedEnderChestRows * 9, ItemStack.EMPTY); - Inventories.writeNbt(nbt, sharedInventory.getList(inventoryItemStacks), server.getRegistryManager()); - try (FileOutputStream inventoryFileOutputStream = new FileOutputStream(inventoryFile); - DataOutputStream inventoryFileDataOutput = new DataOutputStream(inventoryFileOutputStream)) { - inventoryFile.createNewFile(); - NbtIo.writeCompressed(nbt, inventoryFileDataOutput); - } catch (Exception e) { - LOGGER.error("Error while saving Shared Ender Chest: " + e); - } - } public void onServerStopping(MinecraftServer server) { saveInventory(server); } @@ -86,17 +115,15 @@ public class SharedEnderChest implements ServerLifecycleEvents.ServerStopping, S if (world.getBlockState(hitResult.getBlockPos()).getBlock() instanceof EnderChestBlock) { if (!player.isSpectator()) { - if(!getConfig().sharedEnderChestLimitedAccess) { + if (!getConfig().sharedEnderChestLimitedAccess) { if (world.isClient()) return ActionResult.SUCCESS; - playEnderChestOpenSound(world, hitResult.getBlockPos()); - openSharedEnderChest(player); + openSharedEnderChest(player, world, hitResult.getBlockPos()); return ActionResult.SUCCESS; } else { - for(String name : getConfig().sharedEnderChestNames) { - if(name.toLowerCase().strip().equalsIgnoreCase(player.getNameForScoreboard().toLowerCase())) { + for (String name : getConfig().sharedEnderChestNames) { + if (name.toLowerCase().strip().equalsIgnoreCase(player.getNameForScoreboard().toLowerCase())) { if (world.isClient()) return ActionResult.SUCCESS; - playEnderChestOpenSound(world, hitResult.getBlockPos()); - openSharedEnderChest(player); + openSharedEnderChest(player, world, hitResult.getBlockPos()); return ActionResult.SUCCESS; } } @@ -113,17 +140,4 @@ public class SharedEnderChest implements ServerLifecycleEvents.ServerStopping, S } - public static void openSharedEnderChest(PlayerEntity player) { - player.openHandledScreen(new SimpleNamedScreenHandlerFactory((int_1, playerInventory, playerEntity) -> - new GenericContainerScreenHandler(getConfig().screenHandlerType(), int_1, playerInventory, sharedInventory, getConfig().sharedEnderChestRows), Text.of(getConfig().sharedEnderChestName))); - } - - public static void playEnderChestOpenSound(World world, BlockPos pos) { - world.playSound(null, pos, SoundEvents.BLOCK_ENDER_CHEST_OPEN, SoundCategory.BLOCKS, 0.5F, world.random.nextFloat() * 0.1F + 0.9F); - } - - private static File getFile(MinecraftServer server) { - return server.getSavePath(WorldSavePath.ROOT).resolve("sharedenderchest.sav").toFile(); - } - } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/sharedenderchest/SharedInventory.java b/src/main/java/wtf/hak/survivalfabric/features/sharedenderchest/SharedInventory.java similarity index 73% rename from src/main/java/wtf/hak/survivalfabric/sharedenderchest/SharedInventory.java rename to src/main/java/wtf/hak/survivalfabric/features/sharedenderchest/SharedInventory.java index 20e721b..ec4dba6 100644 --- a/src/main/java/wtf/hak/survivalfabric/sharedenderchest/SharedInventory.java +++ b/src/main/java/wtf/hak/survivalfabric/features/sharedenderchest/SharedInventory.java @@ -1,13 +1,18 @@ -package wtf.hak.survivalfabric.sharedenderchest; +package wtf.hak.survivalfabric.features.sharedenderchest; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.BlockPos; + +import java.util.HashMap; +import java.util.Map; public class SharedInventory implements Inventory { + public final Map openedEnderChests = new HashMap<>(); private final DefaultedList stacks; public SharedInventory(int inventoryRows) { @@ -40,7 +45,7 @@ public class SharedInventory implements Inventory { } itemStack_1 = var1.next(); - } while(itemStack_1.isEmpty()); + } while (itemStack_1.isEmpty()); return false; } @@ -52,8 +57,7 @@ public class SharedInventory implements Inventory { @Override public ItemStack removeStack(int int_1, int int_2) { - ItemStack itemStack_1 = Inventories.splitStack(this.stacks, int_1, int_2); - return itemStack_1; + return Inventories.splitStack(this.stacks, int_1, int_2); } @Override @@ -80,4 +84,12 @@ public class SharedInventory implements Inventory { public void clear() { stacks.clear(); } + + @Override + public void onClose(PlayerEntity player) { + BlockPos pos = openedEnderChests.remove(player); + if (openedEnderChests.containsValue(pos)) + return; + SharedEnderChest.fakeEnderChestOpen(player.getWorld(), pos, false); + } } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/Drill.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/Drill.java similarity index 81% rename from src/main/java/wtf/hak/survivalfabric/veinminer/Drill.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/Drill.java index 7e40255..3ea597a 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/Drill.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/Drill.java @@ -1,10 +1,12 @@ -package wtf.hak.survivalfabric.veinminer; +package wtf.hak.survivalfabric.features.veinminer; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; public interface Drill { boolean canHandle(BlockState blockState); + boolean isRightTool(BlockPos pos); + boolean drill(BlockPos blockPos); } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/VeinMinerEvents.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/VeinMinerEvents.java similarity index 70% rename from src/main/java/wtf/hak/survivalfabric/veinminer/VeinMinerEvents.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/VeinMinerEvents.java index 320547a..9d3a301 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/VeinMinerEvents.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/VeinMinerEvents.java @@ -1,15 +1,14 @@ -package wtf.hak.survivalfabric.veinminer; +package wtf.hak.survivalfabric.features.veinminer; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.registry.Registries; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import wtf.hak.survivalfabric.veinminer.drills.LeavesDrill; -import wtf.hak.survivalfabric.veinminer.drills.OreDrill; -import wtf.hak.survivalfabric.veinminer.drills.WoodDrill; +import wtf.hak.survivalfabric.features.veinminer.drills.LeavesDrill; +import wtf.hak.survivalfabric.features.veinminer.drills.OreDrill; +import wtf.hak.survivalfabric.features.veinminer.drills.WoodDrill; public class VeinMinerEvents { @@ -21,26 +20,25 @@ public class VeinMinerEvents { boolean isVeinMining = VeinMinerSession.sessionForPlayer(player) != null; boolean canVeinMine = player.isInSneakingPose(); if (canVeinMine && !isVeinMining) { - VeinMinerSession session = VeinMinerSession.start(player, (ServerWorld)world, pos); + VeinMinerSession session = VeinMinerSession.start(player, (ServerWorld) world, pos); boolean shouldContinue = !mine(session); session.finish(); return shouldContinue; - } - else { + } else { return true; } } public static void onEntityLoad(Entity entity, ServerWorld world) { - BlockPos pos = entity.getBlockPos(); - VeinMinerSession session = VeinMinerSession.sessionForPosition(pos); - if (session != null) { - entity.setPos(session.initialPos.getX(), session.initialPos.getY(), session.initialPos.getZ()); - } + BlockPos pos = entity.getBlockPos(); + VeinMinerSession session = VeinMinerSession.sessionForPosition(pos); + if (session != null) { + entity.setPos(session.initialPos.getX(), session.initialPos.getY(), session.initialPos.getZ()); + } } private static boolean mine(VeinMinerSession session) { - Drill[] drills = new Drill[] { + Drill[] drills = new Drill[]{ new OreDrill(session), new WoodDrill(session), new LeavesDrill(session) diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/VeinMinerSession.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/VeinMinerSession.java similarity index 88% rename from src/main/java/wtf/hak/survivalfabric/veinminer/VeinMinerSession.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/VeinMinerSession.java index fa7b6f6..e727b60 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/VeinMinerSession.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/VeinMinerSession.java @@ -1,23 +1,31 @@ -package wtf.hak.survivalfabric.veinminer; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; +package wtf.hak.survivalfabric.features.veinminer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + public class VeinMinerSession { - private static ArrayList sessions = new ArrayList<>(); + private static final ArrayList sessions = new ArrayList<>(); public ServerPlayerEntity player; public ServerWorld world; public Set positions; public BlockPos initialPos; + private VeinMinerSession(ServerPlayerEntity player, ServerWorld world, BlockPos initialPos) { + this.player = player; + this.world = world; + this.initialPos = initialPos; + this.positions = new HashSet<>(); + positions.add(initialPos); + } + public static VeinMinerSession sessionForPlayer(ServerPlayerEntity player) { - for (var session: sessions) { + for (var session : sessions) { if (session.player == player) { return session; } @@ -26,7 +34,7 @@ public class VeinMinerSession { } public static VeinMinerSession sessionForPosition(BlockPos position) { - for (var session: sessions) { + for (var session : sessions) { if (session.positions.contains(position)) { return session; } @@ -44,14 +52,6 @@ public class VeinMinerSession { sessions.remove(session); } - private VeinMinerSession(ServerPlayerEntity player, ServerWorld world, BlockPos initialPos) { - this.player = player; - this.world = world; - this.initialPos = initialPos; - this.positions = new HashSet<>(); - positions.add(initialPos); - } - public void addPosition(BlockPos pos) { positions.add(pos); } diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/DrillBase.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java similarity index 82% rename from src/main/java/wtf/hak/survivalfabric/veinminer/drills/DrillBase.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java index 8d13d44..edf69da 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/DrillBase.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java @@ -1,15 +1,15 @@ -package wtf.hak.survivalfabric.veinminer.drills; +package wtf.hak.survivalfabric.features.veinminer.drills; + import net.minecraft.block.BlockState; - -import java.util.ArrayList; - import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.MutableText; import net.minecraft.text.PlainTextContent; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; -import wtf.hak.survivalfabric.veinminer.Drill; -import wtf.hak.survivalfabric.veinminer.VeinMinerSession; +import wtf.hak.survivalfabric.features.veinminer.Drill; +import wtf.hak.survivalfabric.features.veinminer.VeinMinerSession; + +import java.util.ArrayList; import static wtf.hak.survivalfabric.SurvivalFabric.LOGGER; @@ -37,14 +37,6 @@ public class DrillBase implements Drill { return session.player.getMainHandStack().isSuitableFor(blockState); } - protected interface ForXYZHandler { - public void handle(BlockPos pos); - } - - protected interface ForXYZCounter { - public int handle(BlockPos pos); - } - protected void forXYZ(BlockPos pos, int max, ForXYZHandler handler) { forXYZ(pos, max, handlerPos -> { handler.handle(handlerPos); @@ -72,33 +64,30 @@ public class DrillBase implements Drill { } } - String[] order = new String[] { "x", "y", "z" }; + String[] order = new String[]{"x", "y", "z"}; if (forceVertical) { - order = new String[] { "y", "x", "z" }; - } - else { + order = new String[]{"y", "x", "z"}; + } else { ServerPlayerEntity player = session.player; boolean majorPitchChange = player.getPitch() < -45.0 || player.getPitch() > 45.0; boolean majorYawChange = (player.getYaw() > 45.0 && player.getYaw() < 135.0) || (player.getYaw() < -45.0 && player.getYaw() > -135.0); if (majorPitchChange) { if (majorYawChange) { - order = new String[] { "y", "z", "x" }; + order = new String[]{"y", "z", "x"}; + } else { + order = new String[]{"y", "x", "z"}; } - else { - order = new String[] { "y", "x", "z" }; - } - } - else { + } else { if (majorYawChange) { - order = new String[] { "z", "y", "x" }; + order = new String[]{"z", "y", "x"}; } } } int counter = 0; - for (int i1: offsets) { - for (int i2: offsets) { - for (int i3: offsets) { + for (int i1 : offsets) { + for (int i2 : offsets) { + for (int i3 : offsets) { int ix = order[0] == "x" ? i1 : order[1] == "x" ? i2 : i3; int iy = order[0] == "y" ? i1 : order[1] == "y" ? i2 : i3; int iz = order[0] == "z" ? i1 : order[1] == "z" ? i2 : i3; @@ -130,4 +119,12 @@ public class DrillBase implements Drill { session.player.sendMessage(text); LOGGER.info(message); } + + protected interface ForXYZHandler { + void handle(BlockPos pos); + } + + protected interface ForXYZCounter { + int handle(BlockPos pos); + } } \ No newline at end of file diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/LeavesDrill.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/LeavesDrill.java similarity index 94% rename from src/main/java/wtf/hak/survivalfabric/veinminer/drills/LeavesDrill.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/LeavesDrill.java index 6718108..3b56798 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/LeavesDrill.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/LeavesDrill.java @@ -1,4 +1,4 @@ -package wtf.hak.survivalfabric.veinminer.drills; +package wtf.hak.survivalfabric.features.veinminer.drills; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -7,7 +7,7 @@ import net.minecraft.registry.tag.TagKey; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import wtf.hak.survivalfabric.veinminer.VeinMinerSession; +import wtf.hak.survivalfabric.features.veinminer.VeinMinerSession; import java.util.ArrayDeque; @@ -15,12 +15,12 @@ import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; public class LeavesDrill extends DrillBase { + public static final TagKey leavesTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "leaves")); + public LeavesDrill(VeinMinerSession session) { super(session); } - public static final TagKey leavesTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "leaves")); - @Override public boolean canHandle(BlockState blockState) { return blockState.isIn(leavesTag); diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/OreDrill.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/OreDrill.java similarity index 92% rename from src/main/java/wtf/hak/survivalfabric/veinminer/drills/OreDrill.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/OreDrill.java index fec8e6f..55675cc 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/OreDrill.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/OreDrill.java @@ -1,4 +1,4 @@ -package wtf.hak.survivalfabric.veinminer.drills; +package wtf.hak.survivalfabric.features.veinminer.drills; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -6,23 +6,21 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import wtf.hak.survivalfabric.features.veinminer.VeinMinerSession; import java.util.ArrayDeque; -import net.minecraft.registry.Registries; -import net.minecraft.util.math.BlockPos; -import wtf.hak.survivalfabric.veinminer.VeinMinerSession; - import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; public class OreDrill extends DrillBase { + public static final TagKey oreTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "ore")); + public OreDrill(VeinMinerSession session) { super(session); } - public static final TagKey oreTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "ore")); - @Override public boolean canHandle(BlockState blockState) { return blockState.isIn(oreTag); diff --git a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/WoodDrill.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/WoodDrill.java similarity index 86% rename from src/main/java/wtf/hak/survivalfabric/veinminer/drills/WoodDrill.java rename to src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/WoodDrill.java index 1e57a4c..1c32d9b 100644 --- a/src/main/java/wtf/hak/survivalfabric/veinminer/drills/WoodDrill.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/WoodDrill.java @@ -1,29 +1,27 @@ -package wtf.hak.survivalfabric.veinminer.drills; +package wtf.hak.survivalfabric.features.veinminer.drills; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; - +import net.minecraft.util.math.BlockPos; +import wtf.hak.survivalfabric.features.veinminer.VeinMinerSession; import java.util.ArrayDeque; -import net.minecraft.block.Block; -import net.minecraft.registry.Registries; -import net.minecraft.util.math.BlockPos; -import wtf.hak.survivalfabric.veinminer.VeinMinerSession; - import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; public class WoodDrill extends DrillBase { + public static final TagKey woodTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "wood")); + public WoodDrill(VeinMinerSession session) { super(session); } - public static final TagKey woodTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "wood")); - @Override public boolean canHandle(BlockState blockState) { return blockState.isIn(woodTag); @@ -33,8 +31,8 @@ public class WoodDrill extends DrillBase { public boolean drill(BlockPos startPos) { ServerWorld world = session.world; int broken = 0; - ArrayDeque pendingLogs = new ArrayDeque(); - ArrayDeque logBlocks = new ArrayDeque(); + ArrayDeque pendingLogs = new ArrayDeque<>(); + ArrayDeque logBlocks = new ArrayDeque<>(); pendingLogs.add(startPos); String leavesBlockId = Registries.BLOCK.getId(world.getBlockState(startPos).getBlock()).toString().replace("_log", "_leaves"); @@ -57,11 +55,8 @@ public class WoodDrill extends DrillBase { } } - // second round, leaves - // The pending blocks are all air now, ArrayDeque pendingLeaves = logBlocks; while (!pendingLeaves.isEmpty() && broken < getConfig().maxVeinSize) { - // remove the immediately surrounding leaves around the log blocks broken += forXYZ(pendingLeaves.remove(), 1, newPos -> { int brokenLeaves = 0; Block newBlock = world.getBlockState(newPos).getBlock(); diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java index e97cc76..b683469 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java @@ -1,10 +1,8 @@ package wtf.hak.survivalfabric.mixin; -import com.mojang.authlib.minecraft.client.MinecraftClient; import net.minecraft.network.ClientConnection; import net.minecraft.network.message.MessageType; import net.minecraft.network.message.SignedMessage; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ServerPlayerEntity; @@ -18,9 +16,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import wtf.hak.survivalfabric.commands.SpectatorCommand; import wtf.hak.survivalfabric.config.ConfigManager; -import java.awt.*; -import java.beans.Expression; -import java.util.Objects; import java.util.Set; @Mixin(PlayerManager.class) @@ -28,7 +23,7 @@ public abstract class PlayerManagerMixin { @Inject(method = {"onPlayerConnect"}, at = {@At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")}) public void onPlayerConnect(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) { - if(ConfigManager.getConfig().joinMessageEnabled && !player.getServer().isSingleplayer()) { + if (ConfigManager.getConfig().joinMessageEnabled && !player.getServer().isSingleplayer()) { Text text = Text.literal(String.format(ConfigManager.getConfig().joinMessage, player.getName().getString())); player.sendMessage(text, false); } @@ -36,7 +31,7 @@ public abstract class PlayerManagerMixin { @ModifyArg(method = {"onPlayerConnect"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")) private Text onPlayerConnect(Text text) { - if(ConfigManager.getConfig().joinMessageEnabled) { + if (ConfigManager.getConfig().joinMessageEnabled) { String name = text.getString().split(" ")[0]; return Text.literal(String.format(ConfigManager.getConfig().joinMessage, name)); } else @@ -45,42 +40,48 @@ public abstract class PlayerManagerMixin { @Inject(method = {"remove"}, at = {@At("HEAD")}) public void onPlayerLeave(ServerPlayerEntity player, CallbackInfo ci) { - if(SpectatorCommand.spectating.containsKey(player)) { + if (SpectatorCommand.spectating.containsKey(player)) { SpectatorCommand.LocationData loc = SpectatorCommand.spectating.remove(player); - player.teleport(loc.world, loc.x,loc.y,loc.z, Set.of(), loc.yaw, loc.pitch, false); + player.teleport(loc.world, loc.x, loc.y, loc.z, Set.of(), loc.yaw, loc.pitch, false); player.changeGameMode(GameMode.SURVIVAL); } } @Inject(method = {"broadcast(Lnet/minecraft/network/message/SignedMessage;Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/network/message/MessageType$Parameters;)V"}, at = {@At("HEAD")}, cancellable = true) private void onBroadcast(SignedMessage message, ServerPlayerEntity sender, MessageType.Parameters parameters, CallbackInfo ci) { - if(sender != null && ConfigManager.getConfig().chatMessageEnabled) { + if (sender != null) { String rawMessage = message.getContent().getString().trim(); - if(sender != null && ConfigManager.getConfig().chatCalcEnabled && rawMessage.endsWith("=")) { - String expression = rawMessage.substring(0, rawMessage.length() - 1).trim(); + boolean isCalcEnabled = ConfigManager.getConfig().chatCalcEnabled; + boolean isMsgEnabled = ConfigManager.getConfig().chatMessageEnabled; + + String processedMessage = rawMessage; + + if (isCalcEnabled) { + String expression = rawMessage.endsWith("=") ? rawMessage.substring(0, rawMessage.length() - 1).trim() : rawMessage; try { String result = String.valueOf(evaluateExpression(expression)); - if(rawMessage.contains(" ")) rawMessage += " "; - rawMessage += (result.endsWith(".0")) ? result.substring(0, result.length() - 2) : result; - } catch (Exception e) {} + StringBuilder sb = new StringBuilder(rawMessage).append("ยง6"); + + if (rawMessage.contains(" ")) sb.append(" "); + if (!rawMessage.endsWith("=")) sb.append("="); + if (rawMessage.contains(" ")) sb.append(" "); + + sb.append(result.endsWith(".0") ? result.substring(0, result.length() - 2) : result); + processedMessage = sb.toString(); + } catch (Exception ignored) {} } - Text text = Text.literal(String.format(ConfigManager.getConfig().chatMessage, sender.getName().getString(), rawMessage)); - sender.getServer().getPlayerManager().broadcast(text, false); + + if (isMsgEnabled) { + String formatted = String.format(ConfigManager.getConfig().chatMessage, sender.getName().getString(), processedMessage); + sender.getServer().getPlayerManager().broadcast(Text.literal(formatted), false); + } else if (isCalcEnabled) { + String formatted = "<" + sender.getName().getString() + "> " + processedMessage; + sender.getServer().getPlayerManager().broadcast(Text.literal(formatted), false); + } + ci.cancel(); - } else if (sender != null && ConfigManager.getConfig().chatCalcEnabled) { - String rawMessage = message.getContent().getString().trim(); - if (rawMessage.endsWith("=")) { - String expression = rawMessage.substring(0, rawMessage.length() - 1).trim(); - try { - String result = String.valueOf(evaluateExpression(expression)); - if(rawMessage.contains(" ")) rawMessage += " "; - rawMessage += (result.endsWith(".0")) ? result.substring(0, result.length() - 2) : result; - Text formattedMessage = Text.literal("<" + sender.getName().getString() + "> " + rawMessage); - sender.getServer().getPlayerManager().broadcast(formattedMessage, false); - ci.cancel(); - } catch (Exception e) {} - } } + } private double evaluateExpression(String expression) { diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java index c9c5294..8d2caf9 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayNetworkHandlerMixin.java @@ -12,7 +12,7 @@ public abstract class ServerPlayNetworkHandlerMixin { @ModifyArg(method = {"cleanUp"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")) private Text quitMessage(Text text) { - if(ConfigManager.getConfig().quitMessageEnabled) { + if (ConfigManager.getConfig().quitMessageEnabled) { String name = text.getString().split(" ")[0]; return Text.literal(String.format(ConfigManager.getConfig().quitMessage, name)); } diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java index 9628b7d..d0110f9 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerPlayerEntityMixin.java @@ -14,7 +14,7 @@ public abstract class ServerPlayerEntityMixin { @Inject(method = "getPlayerListName", at = @At("HEAD"), cancellable = true) private void changePlayerListName(CallbackInfoReturnable cir) { - if(ConfigManager.getConfig().dimensionIndicatorEnabled) { + if (ConfigManager.getConfig().dimensionIndicatorEnabled) { ServerPlayerEntity p = (ServerPlayerEntity) (Object) this; String world = p.getServerWorld().getRegistryKey().getValue().toTranslationKey(); String finalName; diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java index adc620a..d2ea4ae 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/ServerWorldMixin.java @@ -7,15 +7,15 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import wtf.hak.survivalfabric.utils.Utils; +import wtf.hak.survivalfabric.utils.PacketUtils; @Mixin(ServerWorld.class) public class ServerWorldMixin { @Inject(method = "onDimensionChanged", at = {@At("HEAD")}) public void onDimensionChange(Entity entity, CallbackInfo ci) { - if(entity instanceof ServerPlayerEntity) { - Utils.updateListNames((ServerPlayerEntity)entity); + if (entity instanceof ServerPlayerEntity) { + PacketUtils.updateListNames((ServerPlayerEntity) entity); } } } diff --git a/src/main/java/wtf/hak/survivalfabric/utils/Utils.java b/src/main/java/wtf/hak/survivalfabric/utils/PacketUtils.java similarity index 73% rename from src/main/java/wtf/hak/survivalfabric/utils/Utils.java rename to src/main/java/wtf/hak/survivalfabric/utils/PacketUtils.java index c7cbb0e..eec0313 100644 --- a/src/main/java/wtf/hak/survivalfabric/utils/Utils.java +++ b/src/main/java/wtf/hak/survivalfabric/utils/PacketUtils.java @@ -5,10 +5,10 @@ import net.minecraft.server.network.ServerPlayerEntity; import java.util.Objects; -public class Utils { +public class PacketUtils { public static void updateListNames(ServerPlayerEntity p) { - for(ServerPlayerEntity sp : Objects.requireNonNull(p.getServer()).getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity sp : Objects.requireNonNull(p.getServer()).getPlayerManager().getPlayerList()) { sp.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.UPDATE_DISPLAY_NAME, p)); } } diff --git a/src/main/resources/assets/survivalfabric/lang/en_us.json b/src/main/resources/assets/survivalfabric/lang/en_us.json index 7df7fde..92e23d7 100644 --- a/src/main/resources/assets/survivalfabric/lang/en_us.json +++ b/src/main/resources/assets/survivalfabric/lang/en_us.json @@ -15,5 +15,7 @@ "key.survivalfabric.angle12": "204.81 / -54.23", "key.survivalfabric.angle13": "245.14 / -54.23", "key.survivalfabric.angle14": "204.98 / -41.68", - "key.survivalfabric.angle15": "244.97 / -41.71" + "key.survivalfabric.angle15": "244.97 / -41.71", + "category.survivalfabric.survivalfabric": "Survival Fabric", + "key.survivalfabric.camera": "/camera" } \ No newline at end of file diff --git a/src/main/resources/survivalfabric.mixins.json b/src/main/resources/survivalfabric.mixins.json index 521879b..4795188 100644 --- a/src/main/resources/survivalfabric.mixins.json +++ b/src/main/resources/survivalfabric.mixins.json @@ -10,5 +10,5 @@ ], "injectors": { "defaultRequire": 1 - } + } } \ No newline at end of file