diff --git a/build.gradle b/build.gradle index 0b480cf..23c2095 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 archivesBaseName = project.archives_base_name -version = project.mod_version +version = project.minecraft_version + "-" + project.mod_version group = project.maven_group dependencies { diff --git a/gradle.properties b/gradle.properties index 15ef8b5..bf47026 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,11 +4,11 @@ org.gradle.jvmargs=-Xmx1G # check these on https://modmuss50.me/fabric.html minecraft_version=1.16.2 yarn_mappings=1.16.2+build.26 -loader_version=0.9.2+build.206 +loader_version=0.9.1+build.205 # Mod Properties mod_version=1.0.0 maven_group=us.potatoboy archives_base_name=InvView # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.19.0+build.398-1.16 +fabric_version=0.18.0+build.397-1.16 diff --git a/src/main/java/us/potatoboy/invview/CombinedInv.java b/src/main/java/us/potatoboy/invview/CombinedInv.java new file mode 100644 index 0000000..63b490b --- /dev/null +++ b/src/main/java/us/potatoboy/invview/CombinedInv.java @@ -0,0 +1,51 @@ +package us.potatoboy.invview; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.EnderChestInventory; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.collection.DefaultedList; + +public class CombinedInv extends PlayerInventory { + private PlayerInventory inventory; + + public CombinedInv(ServerPlayerEntity player) { + super(player); + inventory = player.inventory; + inventory.setStack(42, new ItemStack(Items.RED_STAINED_GLASS_PANE)); + } + + @Override + public int size() { + return 45; + } + + @Override + public void onClose(PlayerEntity player) { + InvView.SavePlayerData((ServerPlayerEntity) super.player); + } + + @Override + public ItemStack getStack(int slot) { + return inventory.getStack(slot); + } + + @Override + public void setStack(int slot, ItemStack stack) { + if (slot > 40) return; + inventory.setStack(slot, stack); + } + + @Override + public void markDirty() { + inventory.markDirty(); + } + + @Override + public ItemStack removeStack(int slot, int amount) { + return inventory.removeStack(slot, amount); + } +} diff --git a/src/main/java/us/potatoboy/invview/CombinedInventory.java b/src/main/java/us/potatoboy/invview/CombinedInventory.java deleted file mode 100644 index 6256cdd..0000000 --- a/src/main/java/us/potatoboy/invview/CombinedInventory.java +++ /dev/null @@ -1,131 +0,0 @@ -package us.potatoboy.invview; - -import com.google.common.collect.ImmutableList; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventories; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Nameable; -import net.minecraft.util.collection.DefaultedList; - -import java.util.Iterator; -import java.util.List; - -public class CombinedInventory implements Inventory, Nameable { - public final List> combined; - private int changeCount; - - public CombinedInventory(DefaultedList main, DefaultedList armor, DefaultedList offhand) { - this.combined = ImmutableList.of(main, armor, offhand); - } - - @Override - public int size() { - return 45; - } - - @Override - public boolean isEmpty() { - return combined.isEmpty(); - } - - @Override - public ItemStack getStack(int slot) { - List list = null; - - DefaultedList defaultedList; - for(Iterator var3 = combined.iterator(); var3.hasNext(); slot -= defaultedList.size()) { - defaultedList = (DefaultedList)var3.next(); - if (slot < defaultedList.size()) { - list = defaultedList; - break; - } - } - - return list == null ? ItemStack.EMPTY : (ItemStack)list.get(slot); - } - - @Override - public ItemStack removeStack(int slot, int amount) { - List list = null; - - DefaultedList defaultedList; - for(Iterator var4 = combined.iterator(); var4.hasNext(); slot -= defaultedList.size()) { - defaultedList = (DefaultedList)var4.next(); - if (slot < defaultedList.size()) { - list = defaultedList; - break; - } - } - - return list != null && !((ItemStack)list.get(slot)).isEmpty() ? Inventories.splitStack(list, slot, amount) : ItemStack.EMPTY; - } - - @Override - public ItemStack removeStack(int slot) { - DefaultedList defaultedList = null; - - DefaultedList defaultedList2; - for(Iterator var3 = combined.iterator(); var3.hasNext(); slot -= defaultedList2.size()) { - defaultedList2 = (DefaultedList)var3.next(); - if (slot < defaultedList2.size()) { - defaultedList = defaultedList2; - break; - } - } - - if (defaultedList != null && !((ItemStack)defaultedList.get(slot)).isEmpty()) { - ItemStack itemStack = (ItemStack)defaultedList.get(slot); - defaultedList.set(slot, ItemStack.EMPTY); - return itemStack; - } else { - return ItemStack.EMPTY; - } - } - - @Override - public void setStack(int slot, ItemStack stack) { - DefaultedList defaultedList = null; - - DefaultedList defaultedList2; - for(Iterator var4 = combined.iterator(); var4.hasNext(); slot -= defaultedList2.size()) { - defaultedList2 = (DefaultedList)var4.next(); - if (slot < defaultedList2.size()) { - defaultedList = defaultedList2; - break; - } - } - - if (defaultedList != null) { - defaultedList.set(slot, stack); - } - - } - - @Override - public void markDirty() { - ++this.changeCount; - } - - @Override - public boolean canPlayerUse(PlayerEntity player) { - return true; - } - - @Override - public void clear() { - Iterator var1 = combined.iterator(); - - while(var1.hasNext()) { - List list = (List)var1.next(); - list.clear(); - } - - } - - @Override - public Text getName() { - return null; - } -} diff --git a/src/main/java/us/potatoboy/invview/EnderChestSavable.java b/src/main/java/us/potatoboy/invview/EnderChestSavable.java new file mode 100644 index 0000000..b53d1d4 --- /dev/null +++ b/src/main/java/us/potatoboy/invview/EnderChestSavable.java @@ -0,0 +1,45 @@ +package us.potatoboy.invview; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EnderChestInventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.ListTag; +import net.minecraft.server.network.ServerPlayerEntity; + +public class EnderChestSavable extends EnderChestInventory { + private ServerPlayerEntity target; + private EnderChestInventory enderChestInventory; + + public EnderChestSavable(ServerPlayerEntity target) { + super(); + this.target = target; + this.enderChestInventory = target.getEnderChestInventory(); + } + + @Override + public void onClose(PlayerEntity player) { + InvView.SavePlayerData(target); + } + + @Override + public void readTags(ListTag tags) { + enderChestInventory.readTags(tags); + } + + @Override + public ItemStack getStack(int slot) { + return enderChestInventory.getStack(slot); + } + + @Override + public ItemStack removeStack(int slot, int amount) { + return enderChestInventory.removeStack(slot, amount); + } + + @Override + public void setStack(int slot, ItemStack stack) { + enderChestInventory.setStack(slot, stack); + } +} diff --git a/src/main/java/us/potatoboy/invview/InvView.java b/src/main/java/us/potatoboy/invview/InvView.java index 1aabd0e..b9f0376 100644 --- a/src/main/java/us/potatoboy/invview/InvView.java +++ b/src/main/java/us/potatoboy/invview/InvView.java @@ -3,11 +3,24 @@ import com.mojang.brigadier.tree.LiteralCommandNode; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; -import net.minecraft.command.argument.EntityArgumentType; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.network.C2SPacketTypeCallback; +import net.minecraft.command.argument.GameProfileArgumentType; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Util; +import net.minecraft.util.WorldSavePath; +import org.apache.logging.log4j.LogManager; + +import java.io.File; public class InvView implements ModInitializer { + private static MinecraftServer minecraftServer; + @Override public void onInitialize() { CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { @@ -15,20 +28,19 @@ public void onInitialize() { LiteralCommandNode viewNode = CommandManager .literal("view") + .requires((source -> source.hasPermissionLevel(2))) .build(); LiteralCommandNode invNode = CommandManager .literal("inv") - .requires((source -> source.hasPermissionLevel(2))) - .then(CommandManager.argument("target", EntityArgumentType.player()) - .executes(ViewCommand::inv)) + .then(CommandManager.argument("target", GameProfileArgumentType.gameProfile()) + .executes(ViewCommand::Inv)) .build(); LiteralCommandNode echestNode = CommandManager .literal("echest") - .requires((source -> source.hasPermissionLevel(2))) - .then(CommandManager.argument("target", EntityArgumentType.player()) - .executes(ViewCommand::echest)) + .then(CommandManager.argument("target", GameProfileArgumentType.gameProfile()) + .executes(ViewCommand::EChest)) .build(); dispatcher.getRoot().addChild(viewNode); @@ -36,5 +48,29 @@ public void onInitialize() { viewNode.addChild(echestNode); }); + ServerLifecycleEvents.SERVER_STARTING.register(this::onLogicalServerStarting); + } + + private void onLogicalServerStarting(MinecraftServer server) { + minecraftServer = server; + } + + public static MinecraftServer getMinecraftServer() { + return minecraftServer; } + + public static void SavePlayerData(ServerPlayerEntity player) { + File playerDataDir = minecraftServer.getSavePath(WorldSavePath.PLAYERDATA).toFile(); + try { + CompoundTag compoundTag = player.toTag(new CompoundTag()); + File file = File.createTempFile(player.getUuidAsString() + "-", ".dat", playerDataDir); + NbtIo.writeCompressed(compoundTag, file); + File file2 = new File(playerDataDir, player.getUuidAsString() + ".dat"); + File file3 = new File(playerDataDir, player.getUuidAsString() + ".dat_old"); + Util.backupAndReplace(file2, file, file3); + } catch (Exception var6) { + LogManager.getLogger().warn("Failed to save player data for {}", player.getName().getString()); + } + } + } diff --git a/src/main/java/us/potatoboy/invview/ViewCommand.java b/src/main/java/us/potatoboy/invview/ViewCommand.java index e6cf6c4..e3c1c41 100644 --- a/src/main/java/us/potatoboy/invview/ViewCommand.java +++ b/src/main/java/us/potatoboy/invview/ViewCommand.java @@ -1,47 +1,68 @@ package us.potatoboy.invview; -import com.google.gson.internal.$Gson$Preconditions; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.authlib.GameProfile; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.command.argument.EntityArgumentType; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.command.argument.GameProfileArgumentType; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.EnderChestInventory; -import net.minecraft.screen.*; -import net.minecraft.server.command.CommandManager; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.screen.SimpleNamedScreenHandlerFactory; +import net.minecraft.screen.slot.Slot; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.world.GameMode; +import net.minecraft.util.Util; +import net.minecraft.util.WorldSavePath; +import org.apache.logging.log4j.LogManager; -import java.util.Collection; +import java.io.File; public class ViewCommand { - public static int inv(CommandContext context) throws CommandSyntaxException { + private static MinecraftServer minecraftServer = InvView.getMinecraftServer(); + + public static int Inv(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); - ServerPlayerEntity requestedPlayer = EntityArgumentType.getPlayer(context, "target"); + ServerPlayerEntity requestedPlayer = GetRequestedPlayer(context); PlayerInventory requestedInventory = requestedPlayer.inventory; - CombinedInventory combinedInventory = new CombinedInventory(requestedInventory.main, requestedInventory.armor, requestedInventory.offHand); - player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> { - return new GenericContainerScreenHandler(ScreenHandlerType.GENERIC_9X5, syncId, player.inventory, combinedInventory, 5); - }, requestedPlayer.getDisplayName())); + CombinedInv combinedInventory = new CombinedInv(requestedPlayer); + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> + new GenericContainerScreenHandler(ScreenHandlerType.GENERIC_9X5, syncId, player.inventory, combinedInventory, 5), + requestedPlayer.getDisplayName() + )); + return 1; } - public static int echest(CommandContext context) throws CommandSyntaxException { + public static int EChest(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); - ServerPlayerEntity requestedPlayer = EntityArgumentType.getPlayer(context, "target"); - EnderChestInventory requestedEchest = requestedPlayer.getEnderChestInventory(); + ServerPlayerEntity requestedPlayer = GetRequestedPlayer(context); + EnderChestSavable requestedEchest = new EnderChestSavable(requestedPlayer); + + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> + GenericContainerScreenHandler.createGeneric9x3(syncId, player.inventory, requestedEchest), + requestedPlayer.getDisplayName() + )); - player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> { - return GenericContainerScreenHandler.createGeneric9x3(syncId, player.inventory, requestedEchest); - }, requestedPlayer.getDisplayName())); return 1; } + + private static ServerPlayerEntity GetRequestedPlayer(CommandContext context) throws CommandSyntaxException { + GameProfile requestedProfile = GameProfileArgumentType.getProfileArgument(context, "target").iterator().next(); + ServerPlayerEntity requestedPlayer = minecraftServer.getPlayerManager().getPlayer(requestedProfile.getName()); + + if (requestedPlayer == null) { + requestedPlayer = minecraftServer.getPlayerManager().createPlayer(requestedProfile); + minecraftServer.getPlayerManager().loadPlayerData(requestedPlayer); + } + + return requestedPlayer; + } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 78f160a..6d9397b 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -8,11 +8,13 @@ "Potatoboy9999" ], "contact": { - "website": "test.com", - "repo": "test.com" + "website": "https://www.curseforge.com/minecraft/mc-mods/inv-view", + "sources": "https://github.com/PotatoPresident/InvView", + "issues": "https://github.com/PotatoPresident/InvView/issues", + "homepage": "https://www.curseforge.com/minecraft/mc-mods/inv-view" }, "license": "MIT", - "icon": "assets/invview/icon.png", + "icon": "logo.png", "environment": "*", "entrypoints": { "main": [ @@ -23,7 +25,7 @@ "InvView.mixins.json" ], "depends": { - "fabricloader": ">=0.9.2+build.206", + "fabricloader": ">=0.7.2", "fabric": "*", "minecraft": ">=1.16.2" } diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png new file mode 100644 index 0000000..b0652b3 Binary files /dev/null and b/src/main/resources/logo.png differ