diff --git a/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java b/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java new file mode 100644 index 0000000..33941cd --- /dev/null +++ b/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java @@ -0,0 +1,231 @@ +package org.ultramine.commands.basic; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInvBasic; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryBasic; +import net.minecraft.inventory.InventoryEnderChest; +import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntityEnderChest; +import net.minecraftforge.common.util.FakePlayer; + +import org.ultramine.commands.Command; +import org.ultramine.commands.CommandContext; +import org.ultramine.commands.OfflinePlayer; + +import com.google.common.base.Function; + +public class OpenInvCommands +{ + @Command( + name = "openinv", + group = "admin", + permissions = {"command.admin.openinv"}, + syntax = {""} + ) + public static void openinv(final CommandContext ctx) + { + final EntityPlayerMP sender = ctx.getSenderAsPlayer(); + final OfflinePlayer offline = ctx.get("player").asOfflinePlayer(); + offline.loadPlayer(new Function() + { + @Override + public Void apply(EntityPlayerMP player) + { + if(player.isDead) + ctx.sendMessage("command.openinv.fail.dead"); + else + sender.displayGUIChest(new PlayerWrappedInventory(ctx.getServer(), player.inventory, player instanceof FakePlayer ? offline : null)); + return null; + } + }); + } + + @Command( + name = "openender", + group = "admin", + permissions = {"command.admin.openender"}, + syntax = {""} + ) + public static void openender(final CommandContext ctx) + { + final EntityPlayerMP sender = ctx.getSenderAsPlayer(); + final OfflinePlayer offline = ctx.get("player").asOfflinePlayer(); + offline.loadPlayer(new Function() + { + @Override + public Void apply(EntityPlayerMP player) + { + InventoryEnderChest inv = player.getInventoryEnderChest(); + WrappedTileEntityEnderChest tile = new WrappedTileEntityEnderChest(sender, player, player instanceof FakePlayer ? offline : null); + inv.func_146031_a(tile); + if(player instanceof FakePlayer) + inv.func_110134_a(tile); + + sender.displayGUIChest(inv); + return null; + } + }); + } + + private static class PlayerWrappedInventory implements IInventory + { + private final MinecraftServer server; + + private InventoryPlayer inv; + private OfflinePlayer offline; + + public PlayerWrappedInventory(MinecraftServer server, InventoryPlayer player, OfflinePlayer offline) + { + this.server = server; + this.inv = player; + this.offline = offline; + } + + @Override + public int getSizeInventory() + { + return 45; + } + + @Override + public ItemStack getStackInSlot(int var1) + { + if(var1 < inv.getSizeInventory()) + { + return inv.getStackInSlot(var1); + } + + return null; + } + + @Override + public ItemStack decrStackSize(int var1, int var2) + { + if(var1 < inv.getSizeInventory()) + { + return inv.decrStackSize(var1, var2); + } + + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int var1) + { + if(var1 < inv.getSizeInventory()) + { + return inv.getStackInSlotOnClosing(var1); + } + + return null; + } + + @Override + public void setInventorySlotContents(int var1, ItemStack var2) + { + if(var1 < inv.getSizeInventory()) + { + inv.setInventorySlotContents(var1, var2); + } + } + + @Override + public String getInventoryName() + { + return inv.getInventoryName(); + } + + @Override + public int getInventoryStackLimit() + { + return inv.getInventoryStackLimit(); + } + + @Override + public void markDirty() + { + inv.markDirty(); + if(offline != null) + { + EntityPlayerMP p = offline.getIfOnline(); + if(p != null) + { + inv = p.inventory; + offline = null; + } + } + } + + @Override + public boolean isUseableByPlayer(EntityPlayer var1) + { + return offline != null || !inv.player.isDead; + } + + @Override + public void openInventory(){} + + @Override + public void closeInventory() + { + if(offline != null && offline.getIfOnline() == null) + offline.saveFakePlayer((EntityPlayerMP)inv.player); + } + + @Override + public boolean hasCustomInventoryName() + { + return inv.hasCustomInventoryName(); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return inv.isItemValidForSlot(i, itemstack); + } + } + + private static class WrappedTileEntityEnderChest extends TileEntityEnderChest implements IInvBasic + { + private EntityPlayer opener; + private EntityPlayer player; + private OfflinePlayer offline; + + public WrappedTileEntityEnderChest(EntityPlayer opener, EntityPlayer player, OfflinePlayer offline) + { + this.opener = opener; + this.player = player; + this.offline = offline; + } + + @Override public void updateEntity(){} + @Override public boolean receiveClientEvent(int par1, int par2){return false;} + @Override public void invalidate(){} + @Override public void func_145969_a(){} + @Override public boolean func_145971_a(EntityPlayer par1EntityPlayer){return true;} + + @Override + public void onInventoryChanged(InventoryBasic var1) + { + if(offline != null) + { + EntityPlayer p = offline.getIfOnline(); + if(p != null) + opener.closeScreen(); + } + } + + @Override + public void func_145970_b() + { + if(offline != null) + { + offline.saveFakePlayer((EntityPlayerMP)player); + } + } + } +} diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 1c7ef0a..a8202df 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -9,6 +9,24 @@ import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.MinecraftForge; +import org.ultramine.commands.CommandRegistry; +import org.ultramine.commands.basic.BasicCommands; +import org.ultramine.commands.basic.FastWarpCommand; +import org.ultramine.commands.basic.OpenInvCommands; +import org.ultramine.commands.basic.TechCommands; +import org.ultramine.commands.basic.VanillaCommands; +import org.ultramine.commands.syntax.DefaultCompleters; +import org.ultramine.economy.EconomyCommands; +import org.ultramine.permission.IPermissionManager; +import org.ultramine.permission.commands.BasicPermissionCommands; +import org.ultramine.server.chunk.ChunkProfiler; +import org.ultramine.server.data.Databases; +import org.ultramine.server.data.ServerDataLoader; +import org.ultramine.server.data.player.PlayerCoreData; +import org.ultramine.server.tools.ButtonCommand; +import org.ultramine.server.tools.ItemBlocker; +import org.ultramine.server.tools.WarpProtection; + import com.google.common.collect.ImmutableList; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; @@ -31,23 +49,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import org.ultramine.commands.CommandRegistry; -import org.ultramine.commands.basic.BasicCommands; -import org.ultramine.commands.basic.FastWarpCommand; -import org.ultramine.commands.basic.TechCommands; -import org.ultramine.commands.basic.VanillaCommands; -import org.ultramine.commands.syntax.DefaultCompleters; -import org.ultramine.economy.EconomyCommands; -import org.ultramine.permission.IPermissionManager; -import org.ultramine.permission.commands.BasicPermissionCommands; -import org.ultramine.server.chunk.ChunkProfiler; -import org.ultramine.server.data.Databases; -import org.ultramine.server.data.ServerDataLoader; -import org.ultramine.server.data.player.PlayerCoreData; -import org.ultramine.server.tools.ButtonCommand; -import org.ultramine.server.tools.ItemBlocker; -import org.ultramine.server.tools.WarpProtection; - public class UltramineServerModContainer extends DummyModContainer { private static UltramineServerModContainer instance; @@ -131,6 +132,7 @@ e.registerCommands(BasicCommands.class); e.registerCommands(TechCommands.class); e.registerCommands(EconomyCommands.class); + e.registerCommands(OpenInvCommands.class); for(String perm : new String[]{ "command.help", diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 068abb9..257b231 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -201,6 +201,13 @@ command.buttoncommand.get.head=Command list: command.buttoncommand.noperms=You don't have permissions to use this button +command.openinv.usage=/openinv +command.openinv.description=Opens the player's inventory +command.openinv.fail.dead=The player is dead (has no inventory) + +command.openender.usage=/openender +command.openender.description=Opens the player's ender chest + #Technical commands command.id.usage=/id command.id.description=Displays information about specified item id diff --git a/src/main/resources/assets/ultramine/lang/ru_RU.lang b/src/main/resources/assets/ultramine/lang/ru_RU.lang index 67b1601..24f8dff 100644 --- a/src/main/resources/assets/ultramine/lang/ru_RU.lang +++ b/src/main/resources/assets/ultramine/lang/ru_RU.lang @@ -201,6 +201,13 @@ command.buttoncommand.get.head=Список команд: command.buttoncommand.noperms=У вас нет прав для использования данной кнопки +command.openinv.usage=/openinv <игрок> +command.openinv.description=Открывает инвентарь указанного игрока +command.openinv.fail.dead=Игрок мертв (инвентаря нет) + +command.openender.usage=/openender <игрок> +command.openender.description=Открывает сундук края указанного игрока + #Technical commands command.id.usage=/id command.id.description=Показывает информацию об указанном id