2014-04-29 10:54:20 +10:00
|
|
|
package codechicken.nei;
|
|
|
|
|
|
|
|
|
|
import codechicken.core.CommonUtils;
|
|
|
|
|
import codechicken.core.ServerUtils;
|
2015-05-29 18:05:13 +10:00
|
|
|
import codechicken.lib.inventory.SlotDummy;
|
2014-04-29 10:54:20 +10:00
|
|
|
import codechicken.lib.packet.PacketCustom;
|
|
|
|
|
import codechicken.lib.packet.PacketCustom.IServerPacketHandler;
|
|
|
|
|
import codechicken.lib.vec.BlockCoord;
|
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
2022-06-24 12:32:13 +01:00
|
|
|
import java.util.LinkedList;
|
|
|
|
|
import java.util.Set;
|
2014-04-29 10:54:20 +10:00
|
|
|
import net.minecraft.entity.item.EntityItem;
|
|
|
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
|
|
|
import net.minecraft.inventory.InventoryBasic;
|
|
|
|
|
import net.minecraft.inventory.Slot;
|
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
import net.minecraft.network.play.INetHandlerPlayServer;
|
|
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
|
import net.minecraft.tileentity.TileEntityMobSpawner;
|
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
|
|
2022-06-24 12:32:13 +01:00
|
|
|
public class NEISPH implements IServerPacketHandler {
|
2014-04-29 10:54:20 +10:00
|
|
|
@Override
|
|
|
|
|
public void handlePacket(PacketCustom packet, EntityPlayerMP sender, INetHandlerPlayServer netHandler) {
|
2022-06-24 12:32:13 +01:00
|
|
|
if (!NEIServerConfig.authenticatePacket(sender, packet)) return;
|
2014-04-29 10:54:20 +10:00
|
|
|
|
|
|
|
|
switch (packet.getType()) {
|
|
|
|
|
case 1:
|
|
|
|
|
handleGiveItem(sender, packet);
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
NEIServerUtils.deleteAllItems(sender);
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
setInventorySlot(sender, packet);
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
NEIServerUtils.toggleMagnetMode(sender);
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
NEIServerUtils.setHourForward(sender.worldObj, packet.readUByte(), true);
|
|
|
|
|
break;
|
|
|
|
|
case 8:
|
|
|
|
|
NEIServerUtils.healPlayer(sender);
|
|
|
|
|
break;
|
|
|
|
|
case 9:
|
|
|
|
|
NEIServerUtils.toggleRaining(sender.worldObj, true);
|
|
|
|
|
break;
|
|
|
|
|
case 10:
|
|
|
|
|
sendLoginState(sender);
|
|
|
|
|
break;
|
|
|
|
|
case 11:
|
|
|
|
|
sender.sendContainerAndContentsToPlayer(sender.openContainer, sender.openContainer.getInventory());
|
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
handlePropertyChange(sender, packet);
|
|
|
|
|
break;
|
|
|
|
|
case 13:
|
|
|
|
|
NEIServerUtils.setGamemode(sender, packet.readUByte());
|
|
|
|
|
break;
|
|
|
|
|
case 14:
|
|
|
|
|
NEIServerUtils.cycleCreativeInv(sender, packet.readInt());
|
|
|
|
|
break;
|
|
|
|
|
case 15:
|
|
|
|
|
handleMobSpawnerID(sender.worldObj, packet.readCoord(), packet.readString());
|
|
|
|
|
break;
|
2022-11-30 02:21:45 +09:00
|
|
|
case 16:
|
|
|
|
|
handleRequestContainer(sender, packet.readInt());
|
|
|
|
|
break;
|
2014-04-29 10:54:20 +10:00
|
|
|
case 21:
|
|
|
|
|
openEnchantmentGui(sender);
|
|
|
|
|
break;
|
|
|
|
|
case 22:
|
|
|
|
|
modifyEnchantment(sender, packet.readUByte(), packet.readUByte(), packet.readBoolean());
|
|
|
|
|
break;
|
|
|
|
|
case 23:
|
|
|
|
|
processCreativeInv(sender, packet.readBoolean());
|
|
|
|
|
break;
|
|
|
|
|
case 24:
|
|
|
|
|
openPotionGui(sender, packet);
|
|
|
|
|
break;
|
|
|
|
|
case 25:
|
|
|
|
|
handleDummySlotSet(sender, packet);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void handleDummySlotSet(EntityPlayerMP sender, PacketCustom packet) {
|
|
|
|
|
int slotNumber = packet.readShort();
|
|
|
|
|
ItemStack stack = packet.readItemStack(true);
|
|
|
|
|
|
|
|
|
|
Slot slot = sender.openContainer.getSlot(slotNumber);
|
2022-06-24 12:32:13 +01:00
|
|
|
if (slot instanceof SlotDummy) slot.putStack(stack);
|
2014-04-29 10:54:20 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void handleMobSpawnerID(World world, BlockCoord coord, String mobtype) {
|
|
|
|
|
TileEntity tile = world.getTileEntity(coord.x, coord.y, coord.z);
|
|
|
|
|
if (tile instanceof TileEntityMobSpawner) {
|
|
|
|
|
((TileEntityMobSpawner) tile).func_145881_a().setEntityName(mobtype);
|
|
|
|
|
tile.markDirty();
|
|
|
|
|
world.markBlockForUpdate(coord.x, coord.y, coord.z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-30 02:21:45 +09:00
|
|
|
private void handleRequestContainer(EntityPlayerMP sender, int containerSize) {
|
|
|
|
|
if (sender.openContainer.getInventory().size() != containerSize) return;
|
|
|
|
|
sender.sendContainerToPlayer(sender.openContainer);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-29 10:54:20 +10:00
|
|
|
private void handlePropertyChange(EntityPlayerMP sender, PacketCustom packet) {
|
|
|
|
|
String name = packet.readString();
|
|
|
|
|
if (NEIServerConfig.canPlayerPerformAction(sender.getCommandSenderName(), name))
|
|
|
|
|
NEIServerConfig.disableAction(sender.dimension, name, packet.readBoolean());
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-03 15:26:48 +10:00
|
|
|
public static void processCreativeInv(EntityPlayerMP sender, boolean open) {
|
2014-04-29 10:54:20 +10:00
|
|
|
if (open) {
|
2022-06-24 12:32:13 +01:00
|
|
|
ServerUtils.openSMPContainer(
|
|
|
|
|
sender,
|
|
|
|
|
new ContainerCreativeInv(
|
|
|
|
|
sender,
|
|
|
|
|
new ExtendedCreativeInv(
|
|
|
|
|
NEIServerConfig.forPlayer(sender.getCommandSenderName()), Side.SERVER)),
|
|
|
|
|
(player, windowId) -> {
|
|
|
|
|
PacketCustom packet = new PacketCustom(channel, 23);
|
|
|
|
|
packet.writeBoolean(true);
|
|
|
|
|
packet.writeByte(windowId);
|
|
|
|
|
packet.sendToPlayer(player);
|
|
|
|
|
});
|
2014-04-29 10:54:20 +10:00
|
|
|
} else {
|
|
|
|
|
sender.closeContainer();
|
|
|
|
|
PacketCustom packet = new PacketCustom(channel, 23);
|
|
|
|
|
packet.writeBoolean(false);
|
|
|
|
|
packet.sendToPlayer(sender);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void handleGiveItem(EntityPlayerMP player, PacketCustom packet) {
|
|
|
|
|
NEIServerUtils.givePlayerItem(player, packet.readItemStack(true), packet.readBoolean(), packet.readBoolean());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void setInventorySlot(EntityPlayerMP player, PacketCustom packet) {
|
|
|
|
|
boolean container = packet.readBoolean();
|
|
|
|
|
int slot = packet.readShort();
|
|
|
|
|
ItemStack item = packet.readItemStack();
|
|
|
|
|
|
|
|
|
|
ItemStack old = NEIServerUtils.getSlotContents(player, slot, container);
|
2022-06-24 12:32:13 +01:00
|
|
|
boolean deleting = item == null
|
|
|
|
|
|| old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
|
2014-04-29 10:54:20 +10:00
|
|
|
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), deleting ? "delete" : "item"))
|
|
|
|
|
NEIServerUtils.setSlotContents(player, slot, item, container);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void modifyEnchantment(EntityPlayerMP player, int e, int lvl, boolean add) {
|
|
|
|
|
ContainerEnchantmentModifier containerem = (ContainerEnchantmentModifier) player.openContainer;
|
|
|
|
|
if (add) {
|
|
|
|
|
containerem.addEnchantment(e, lvl);
|
|
|
|
|
} else {
|
|
|
|
|
containerem.removeEnchantment(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void openEnchantmentGui(EntityPlayerMP player) {
|
2022-06-24 12:32:13 +01:00
|
|
|
ServerUtils.openSMPContainer(
|
|
|
|
|
player,
|
|
|
|
|
new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0),
|
|
|
|
|
(player1, windowId) -> {
|
|
|
|
|
PacketCustom packet = new PacketCustom(channel, 21);
|
|
|
|
|
packet.writeByte(windowId);
|
|
|
|
|
packet.sendToPlayer(player1);
|
|
|
|
|
});
|
2014-04-29 10:54:20 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void openPotionGui(EntityPlayerMP player, PacketCustom packet) {
|
|
|
|
|
InventoryBasic b = new InventoryBasic("potionStore", true, 9);
|
2022-06-24 12:32:13 +01:00
|
|
|
for (int i = 0; i < b.getSizeInventory(); i++) b.setInventorySlotContents(i, packet.readItemStack());
|
2019-12-30 20:19:16 -08:00
|
|
|
ServerUtils.openSMPContainer(player, new ContainerPotionCreator(player.inventory, b), (player1, windowId) -> {
|
|
|
|
|
PacketCustom packet1 = new PacketCustom(channel, 24);
|
|
|
|
|
packet1.writeByte(windowId);
|
|
|
|
|
packet1.sendToPlayer(player1);
|
2014-04-29 10:54:20 +10:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void sendActionDisabled(int dim, String name, boolean disable) {
|
2022-06-24 12:32:13 +01:00
|
|
|
new PacketCustom(channel, 11).writeString(name).writeBoolean(disable).sendToDimension(dim);
|
2014-04-29 10:54:20 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void sendActionEnabled(EntityPlayerMP player, String name, boolean enable) {
|
2022-06-24 12:32:13 +01:00
|
|
|
new PacketCustom(channel, 12).writeString(name).writeBoolean(enable).sendToPlayer(player);
|
2014-04-29 10:54:20 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void sendLoginState(EntityPlayerMP player) {
|
2019-12-30 20:19:16 -08:00
|
|
|
LinkedList<String> actions = new LinkedList<>();
|
|
|
|
|
LinkedList<String> disabled = new LinkedList<>();
|
|
|
|
|
LinkedList<String> enabled = new LinkedList<>();
|
|
|
|
|
LinkedList<ItemStack> bannedItems = new LinkedList<>();
|
2014-04-29 10:54:20 +10:00
|
|
|
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
|
|
|
|
|
|
|
|
|
|
for (String name : NEIActions.nameActionMap.keySet()) {
|
2022-06-24 12:32:13 +01:00
|
|
|
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name)) actions.add(name);
|
|
|
|
|
if (NEIServerConfig.isActionDisabled(player.dimension, name)) disabled.add(name);
|
|
|
|
|
if (playerSave.isActionEnabled(name)) enabled.add(name);
|
2014-04-29 10:54:20 +10:00
|
|
|
}
|
|
|
|
|
for (ItemStackMap.Entry<Set<String>> entry : NEIServerConfig.bannedItems.entries())
|
|
|
|
|
if (!NEIServerConfig.isPlayerInList(player.getCommandSenderName(), entry.value, true))
|
|
|
|
|
bannedItems.add(entry.key);
|
|
|
|
|
|
|
|
|
|
PacketCustom packet = new PacketCustom(channel, 10);
|
|
|
|
|
|
|
|
|
|
packet.writeByte(actions.size());
|
2022-06-24 12:32:13 +01:00
|
|
|
for (String s : actions) packet.writeString(s);
|
2014-04-29 10:54:20 +10:00
|
|
|
|
|
|
|
|
packet.writeByte(disabled.size());
|
2022-06-24 12:32:13 +01:00
|
|
|
for (String s : disabled) packet.writeString(s);
|
2014-04-29 10:54:20 +10:00
|
|
|
|
|
|
|
|
packet.writeByte(enabled.size());
|
2022-06-24 12:32:13 +01:00
|
|
|
for (String s : enabled) packet.writeString(s);
|
2014-04-29 10:54:20 +10:00
|
|
|
|
|
|
|
|
packet.writeInt(bannedItems.size());
|
2022-06-24 12:32:13 +01:00
|
|
|
for (ItemStack stack : bannedItems) packet.writeItemStack(stack);
|
2014-04-29 10:54:20 +10:00
|
|
|
|
|
|
|
|
packet.sendToPlayer(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void sendHasServerSideTo(EntityPlayerMP player) {
|
|
|
|
|
NEIServerConfig.logger.debug("Sending serverside check to: " + player.getCommandSenderName());
|
|
|
|
|
PacketCustom packet = new PacketCustom(channel, 1);
|
|
|
|
|
packet.writeByte(NEIActions.protocol);
|
|
|
|
|
packet.writeString(CommonUtils.getWorldName(player.worldObj));
|
|
|
|
|
|
|
|
|
|
packet.sendToPlayer(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void sendAddMagneticItemTo(EntityPlayerMP player, EntityItem item) {
|
|
|
|
|
PacketCustom packet = new PacketCustom(channel, 13);
|
|
|
|
|
packet.writeInt(item.getEntityId());
|
|
|
|
|
|
|
|
|
|
packet.sendToPlayer(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static final String channel = "NEI";
|
|
|
|
|
}
|