From cb2c7910cf700c4b703fbb99aa9abb814d1d64f0 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 13 Feb 2025 02:09:50 -0500 Subject: [PATCH] Brush Editor --- .../kamkeel/npcs/network/PacketHandler.java | 4 + .../java/kamkeel/npcs/network/PacketUtil.java | 11 ++ .../network/enums/EnumItemPacketType.java | 3 +- .../npcs/network/enums/EnumRequestPacket.java | 2 + .../packets/request/item/ColorSetPacket.java | 74 +++++++++ .../noppes/npcs/CustomNpcsPermissions.java | 4 + .../java/noppes/npcs/client/ClientProxy.java | 11 +- .../client/gui/item/GuiNpcPaintbrush.java | 141 ++++++++++++++++++ .../renderer/items/NpcItemToolRenderer.java | 15 +- .../noppes/npcs/constants/EnumGuiType.java | 3 +- .../java/noppes/npcs/items/ItemNpcTool.java | 25 +++- .../textures/items/paintbrush_brush.png | Bin 0 -> 184 bytes .../textures/items/paintbrush_handle.png | Bin 0 -> 180 bytes 13 files changed, 274 insertions(+), 19 deletions(-) create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/item/ColorSetPacket.java create mode 100644 src/main/java/noppes/npcs/client/gui/item/GuiNpcPaintbrush.java create mode 100644 src/main/resources/assets/customnpcs/textures/items/paintbrush_brush.png create mode 100644 src/main/resources/assets/customnpcs/textures/items/paintbrush_handle.png diff --git a/src/main/java/kamkeel/npcs/network/PacketHandler.java b/src/main/java/kamkeel/npcs/network/PacketHandler.java index ef010b3bb..75d4a8de6 100644 --- a/src/main/java/kamkeel/npcs/network/PacketHandler.java +++ b/src/main/java/kamkeel/npcs/network/PacketHandler.java @@ -37,6 +37,7 @@ import kamkeel.npcs.network.packets.request.effects.EffectSavePacket; import kamkeel.npcs.network.packets.request.effects.EffectsGetPacket; import kamkeel.npcs.network.packets.request.faction.*; import kamkeel.npcs.network.packets.request.feather.DimensionTeleportPacket; +import kamkeel.npcs.network.packets.request.item.ColorSetPacket; import kamkeel.npcs.network.packets.request.jobs.JobGetPacket; import kamkeel.npcs.network.packets.request.jobs.JobSavePacket; import kamkeel.npcs.network.packets.request.jobs.JobSpawnerAddPacket; @@ -307,6 +308,9 @@ public class PacketHandler { REQUEST_PACKET.registerPacket(new MovingPathSavePacket()); REQUEST_PACKET.registerPacket(new MovingPathGetPacket()); + // Tool Packets + REQUEST_PACKET.registerPacket(new ColorSetPacket()); + // Custom Effect Packets REQUEST_PACKET.registerPacket(new EffectGetPacket()); REQUEST_PACKET.registerPacket(new EffectsGetPacket()); diff --git a/src/main/java/kamkeel/npcs/network/PacketUtil.java b/src/main/java/kamkeel/npcs/network/PacketUtil.java index 3a95df786..50967d743 100644 --- a/src/main/java/kamkeel/npcs/network/PacketUtil.java +++ b/src/main/java/kamkeel/npcs/network/PacketUtil.java @@ -87,6 +87,13 @@ public class PacketUtil { return false; } break; + case BRUSH: + if (item.getItem() != CustomItems.tool || item.getItemDamage() != 1) { + LogWriter.error(String.format("%s attempted to utilize a %s Packet without a Pather, they could be a hacker", + player.getCommandSenderName(), type)); + return false; + } + break; } return true; } @@ -141,6 +148,8 @@ public class PacketUtil { return !(item.getItem() == Item.getItemFromBlock(CustomItems.waypoint) || item.getItem() == Item.getItemFromBlock(CustomItems.border) || item.getItem() == Item.getItemFromBlock(CustomItems.redstoneBlock)); + case BRUSH: + return item.getItem() == CustomItems.tool && item.getItemDamage() == 1; default: return false; } @@ -176,6 +185,8 @@ public class PacketUtil { return "Pather"; case BLOCK: return "valid Block"; + case BRUSH: + return "Paintbrush"; default: return type.toString(); } diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumItemPacketType.java b/src/main/java/kamkeel/npcs/network/enums/EnumItemPacketType.java index 8c1513966..14b1a4236 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumItemPacketType.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumItemPacketType.java @@ -7,5 +7,6 @@ public enum EnumItemPacketType { TELEPORTER, SCRIPTER, PATHER, - BLOCK + BLOCK, + BRUSH } diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java index 46aa7c7d4..78080ad3e 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java @@ -177,4 +177,6 @@ public enum EnumRequestPacket { EffectScriptGet, EffectRemove, EffectSave, + + ColorSet, } diff --git a/src/main/java/kamkeel/npcs/network/packets/request/item/ColorSetPacket.java b/src/main/java/kamkeel/npcs/network/packets/request/item/ColorSetPacket.java new file mode 100644 index 000000000..4231c3900 --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/item/ColorSetPacket.java @@ -0,0 +1,74 @@ +package kamkeel.npcs.network.packets.request.item; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.PacketUtil; +import kamkeel.npcs.network.enums.EnumItemPacketType; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.util.ByteBufUtils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.controllers.LinkedNpcController; + +import java.io.IOException; + +public final class ColorSetPacket extends AbstractPacket { + public static String packetName = "Request|ColorSet"; + + private int color; + + public ColorSetPacket(int color) { + this.color = color; + } + + public ColorSetPacket() {} + + @Override + public Enum getType() { + return EnumRequestPacket.ColorSet; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.NPC_BUILD; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + out.writeInt(this.color); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + if (!PacketUtil.verifyItemPacket(EnumItemPacketType.BRUSH, player)) + return; + + int color = in.readInt(); + ItemStack stack = player.getHeldItem(); + setBrushColor(stack, color); + } + + public static void setBrushColor(ItemStack brush, int color){ + NBTTagCompound brushCompound = brush.getTagCompound(); + if(brushCompound == null) + brushCompound = new NBTTagCompound(); + + brushCompound.setInteger("Color", color); + brush.setTagCompound(brushCompound); + } +} diff --git a/src/main/java/noppes/npcs/CustomNpcsPermissions.java b/src/main/java/noppes/npcs/CustomNpcsPermissions.java index 24898e8a4..93a8598ac 100644 --- a/src/main/java/noppes/npcs/CustomNpcsPermissions.java +++ b/src/main/java/noppes/npcs/CustomNpcsPermissions.java @@ -17,6 +17,10 @@ import java.util.List; public class CustomNpcsPermissions{ // Open GUI public static final Permission NPC_GUI = new Permission("customnpcs.npc.gui"); + public static final Permission PAINTBRUSH_GUI = new Permission("customnpcs.npc.paintbrush"); + + // Builder + public static final Permission NPC_BUILD = new Permission("customnpcs.npc.build"); // Modify NPC public static final Permission NPC_DELETE = new Permission("customnpcs.npc.delete"); diff --git a/src/main/java/noppes/npcs/client/ClientProxy.java b/src/main/java/noppes/npcs/client/ClientProxy.java index 8b461442e..911bd67f5 100644 --- a/src/main/java/noppes/npcs/client/ClientProxy.java +++ b/src/main/java/noppes/npcs/client/ClientProxy.java @@ -21,6 +21,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.Item; +import net.minecraft.item.ItemTool; import net.minecraft.stats.Achievement; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ReportedException; @@ -43,6 +44,7 @@ import noppes.npcs.client.fx.EntityRainbowFX; import noppes.npcs.client.gui.*; import noppes.npcs.client.gui.custom.GuiCustom; import noppes.npcs.client.gui.global.*; +import noppes.npcs.client.gui.item.GuiNpcPaintbrush; import noppes.npcs.client.gui.mainmenu.*; import noppes.npcs.client.gui.player.*; import noppes.npcs.client.gui.player.companion.GuiNpcCompanionInv; @@ -57,6 +59,7 @@ import noppes.npcs.client.model.*; import noppes.npcs.client.renderer.*; import noppes.npcs.client.renderer.blocks.*; import noppes.npcs.client.renderer.items.CustomItemRenderer; +import noppes.npcs.client.renderer.items.NpcItemToolRenderer; import noppes.npcs.client.renderer.items.ScriptedBlockItemRenderer; import noppes.npcs.config.ConfigClient; import noppes.npcs.config.ConfigMain; @@ -68,6 +71,7 @@ import noppes.npcs.controllers.data.PlayerData; import noppes.npcs.entity.*; import noppes.npcs.entity.data.ModelData; import noppes.npcs.entity.data.ModelPartData; +import noppes.npcs.items.ItemNpcTool; import noppes.npcs.items.ItemScripted; import org.lwjgl.input.Keyboard; import tconstruct.client.tabs.InventoryTabCustomNpc; @@ -409,6 +413,9 @@ public class ClientProxy extends CommonProxy { else if (gui == EnumGuiType.ScriptBlock) return new GuiScriptBlock(x,y,z); + else if (gui == EnumGuiType.Paintbrush) + return new GuiNpcPaintbrush(); + else if (gui == EnumGuiType.GlobalRemote) return new GuiNPCGlobalMainMenu(null); @@ -523,7 +530,9 @@ public class ClientProxy extends CommonProxy { public void registerItem(Item item) { if (item instanceof ItemScripted) { MinecraftForgeClient.registerItemRenderer(item, new CustomItemRenderer()); - } else { + } else if (item instanceof ItemNpcTool) { + MinecraftForgeClient.registerItemRenderer(item, new NpcItemToolRenderer()); + }else { MinecraftForgeClient.registerItemRenderer(item, new NpcItemRenderer()); } } diff --git a/src/main/java/noppes/npcs/client/gui/item/GuiNpcPaintbrush.java b/src/main/java/noppes/npcs/client/gui/item/GuiNpcPaintbrush.java new file mode 100644 index 000000000..43f0321df --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/item/GuiNpcPaintbrush.java @@ -0,0 +1,141 @@ +package noppes.npcs.client.gui.item; + +import kamkeel.npcs.network.PacketClient; +import kamkeel.npcs.network.packets.request.item.ColorSetPacket; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.IResource; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import noppes.npcs.client.gui.util.GuiNPCInterface; +import noppes.npcs.client.gui.util.GuiNpcButton; +import noppes.npcs.client.gui.util.GuiNpcTextField; +import org.lwjgl.opengl.GL11; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; + +public class GuiNpcPaintbrush extends GuiNPCInterface { + + private GuiNpcTextField textfield; + private int color = 0xffffff; // default color + private int colorX, colorY; + private static final ResourceLocation resource = new ResourceLocation("customnpcs:textures/gui/color.png"); + + public GuiNpcPaintbrush() { + super(); + xSize = 256; + setBackground("menubg.png"); + + ItemStack brush = this.player.getHeldItem(); + if(brush == null) + return; + + NBTTagCompound compound = brush.getTagCompound(); + if(compound != null && compound.hasKey("Color")) + color = compound.getInteger("Color"); + } + + @Override + public void initGui() { + super.initGui(); + + // Move the color picker slightly more to the left. + colorX = guiLeft + 20; // was guiLeft + 30 + colorY = guiTop + 50; + + // Add the hex color text field, also moved left accordingly. + this.addTextField(textfield = new GuiNpcTextField(0, this, guiLeft + 43, guiTop + 20, 70, 20, getColor())); + textfield.setTextColor(color); + + // Move the done button to the bottom right. + int margin = 10; + addButton(new GuiNpcButton(66, guiLeft + xSize - 55 - margin, guiTop + ySize - 20 - margin, 60, 20, "gui.done")); + } + + public String getColor() { + String str = Integer.toHexString(color); + while (str.length() < 6) + str = "0" + str; + return str; + } + + @Override + public void keyTyped(char c, int i) { + String prev = textfield.getText(); + super.keyTyped(c, i); + String newText = textfield.getText(); + if (!newText.equals(prev)) { + try { + color = Integer.parseInt(newText, 16); + textfield.setTextColor(color); + } catch (NumberFormatException e) { + textfield.setText(prev); + } + } + if (i == 1) { + close(); + } + } + + @Override + protected void actionPerformed(GuiButton guibutton) { + if (guibutton.id == 66) { + close(); + } + } + + @Override + public void close(){ + PacketClient.sendClient(new ColorSetPacket(this.color)); + super.close(); + } + + @Override + public void mouseClicked(int i, int j, int k) { + super.mouseClicked(i, j, k); + if (i < colorX || i > colorX + 117 || j < colorY || j > colorY + 117) + return; + + InputStream stream = null; + try { + IResource iresource = this.mc.getResourceManager().getResource(resource); + stream = iresource.getInputStream(); + BufferedImage bufferedimage = ImageIO.read(stream); + + // Calculate the corresponding pixel on the texture (scaling factor 4) + int imgX = (i - guiLeft - 20) * 4; + int imgY = (j - guiTop - 50) * 4; + color = bufferedimage.getRGB(imgX, imgY) & 0xFFFFFF; + textfield.setTextColor(color); + textfield.setText(getColor()); + } catch (IOException e) { + // Optionally log the error here + } finally { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + // Ignore quietly + } + } + } + } + + @Override + public void drawScreen(int par1, int par2, float par3) { + super.drawScreen(par1, par2, par3); + + // Draw the color picker on the left side + mc.getTextureManager().bindTexture(resource); + GL11.glColor4f(1, 1, 1, 1); + drawTexturedModalRect(colorX, colorY, 0, 0, 120, 120); + } + + @Override + public void save() { + // Implement save functionality if needed. + } +} diff --git a/src/main/java/noppes/npcs/client/renderer/items/NpcItemToolRenderer.java b/src/main/java/noppes/npcs/client/renderer/items/NpcItemToolRenderer.java index 24118d854..a3320db96 100644 --- a/src/main/java/noppes/npcs/client/renderer/items/NpcItemToolRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/items/NpcItemToolRenderer.java @@ -9,6 +9,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; +import noppes.npcs.items.ItemNpcTool; import noppes.npcs.items.ItemRenderInterface; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -16,8 +17,8 @@ import org.lwjgl.opengl.GL12; public class NpcItemToolRenderer implements IItemRenderer { // Textures for the assembled paintbrush parts: - private static final ResourceLocation PAINTBRUSH_HANDLE = new ResourceLocation("noppes", "textures/items/paintbrush_handle.png"); - private static final ResourceLocation PAINTBRUSH_BRUSH = new ResourceLocation("noppes", "textures/items/paintbrush_brush.png"); + private static final ResourceLocation PAINTBRUSH_HANDLE = new ResourceLocation("customnpcs", "textures/items/paintbrush_handle.png"); + private static final ResourceLocation PAINTBRUSH_BRUSH = new ResourceLocation("customnpcs", "textures/items/paintbrush_brush.png"); private static final ResourceLocation ENCHANT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); @Override @@ -34,25 +35,17 @@ public class NpcItemToolRenderer implements IItemRenderer { @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { // Ensure the item implements our render interface - if (!(item.getItem() instanceof ItemRenderInterface)) + if (!(item.getItem() instanceof ItemNpcTool)) return; EntityLivingBase entity = (EntityLivingBase) data[1]; GL11.glPushMatrix(); - // Apply base translations/rotations - GL11.glTranslatef(0.9375F, 0.0625F, 0.0F); - GL11.glRotatef(-315.0F, 0.0F, 0.0F, 1.0F); - // For meta==1 (paintbrush) we want to assemble the texture from two parts if (item.getItemDamage() == 1) { renderPaintbrush(entity, item); } else { // For other tools, fall back on the normal special render routine. - ((ItemRenderInterface) item.getItem()).renderSpecial(); - GL11.glRotatef(-20.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F); - GL11.glTranslatef(-0.09375F, 0.0625F, 0.0F); renderItem3d(entity, item); } GL11.glPopMatrix(); diff --git a/src/main/java/noppes/npcs/constants/EnumGuiType.java b/src/main/java/noppes/npcs/constants/EnumGuiType.java index a55db8ac7..16927bacc 100644 --- a/src/main/java/noppes/npcs/constants/EnumGuiType.java +++ b/src/main/java/noppes/npcs/constants/EnumGuiType.java @@ -66,5 +66,6 @@ public enum EnumGuiType { ManageLinked, CustomGui, ScriptItem, - ScriptBlock; + ScriptBlock, + Paintbrush; } diff --git a/src/main/java/noppes/npcs/items/ItemNpcTool.java b/src/main/java/noppes/npcs/items/ItemNpcTool.java index 005cf26ac..23561ed56 100644 --- a/src/main/java/noppes/npcs/items/ItemNpcTool.java +++ b/src/main/java/noppes/npcs/items/ItemNpcTool.java @@ -12,6 +12,9 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.IIcon; import net.minecraft.world.World; import noppes.npcs.CustomItems; +import noppes.npcs.CustomNpcs; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.constants.EnumGuiType; import java.util.List; @@ -30,6 +33,7 @@ public class ItemNpcTool extends Item { setHasSubtypes(true); setMaxDamage(0); setCreativeTab(CustomItems.tab); + CustomNpcs.proxy.registerItem(this); } @Override @@ -67,15 +71,26 @@ public class ItemNpcTool extends Item { @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - if(world.isRemote) { - int meta = stack.getItemDamage(); - if(meta < 0 || meta >= toolTypes.length) meta = 0; - // Send a simple chat message indicating which tool was used - player.addChatMessage(new ChatComponentTranslation("item.npc_tool." + toolTypes[meta] + ".use")); + if(!world.isRemote) + return stack; + + if(player.isSneaking() && isPaintbrush(stack)){ + + } else if(isPaintbrush(stack)){ + } + if(CustomNpcsPermissions.hasPermission(player, CustomNpcsPermissions.PAINTBRUSH_GUI)){ + CustomNpcs.proxy.openGui(0, 0, 0, EnumGuiType.Paintbrush, player); + } + else + player.addChatMessage(new ChatComponentTranslation("item.npc_tool." + toolTypes[stack.getItemDamage()] + ".use")); return stack; } + public boolean isPaintbrush(ItemStack itemStack){ + return itemStack.getItemDamage() == 1; + } + @Override public Item setUnlocalizedName(String name){ GameRegistry.registerItem(this, name); diff --git a/src/main/resources/assets/customnpcs/textures/items/paintbrush_brush.png b/src/main/resources/assets/customnpcs/textures/items/paintbrush_brush.png new file mode 100644 index 0000000000000000000000000000000000000000..7e6bec2d87f24f59722a53dd5ba5db596fd493e1 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL0?Z7#}EtuWQl?U97_wE{yQ+F8W}J#PT^!% zkz`;#!S>LUVRo8CgXAHWXNinIOq7}Duqjvz%P+{4IKZ$;@rB;um#jGqv7a?0WEvV7 Z86<2a1Uz2-TLv_k!PC{xWt~$(69DXoG1veA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/customnpcs/textures/items/paintbrush_handle.png b/src/main/resources/assets/customnpcs/textures/items/paintbrush_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..1a60a0ad0cb7368bc02700d6b63060cab2bf2e28 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK~GN?#}EtuWC_;8a)0KZ{2+ho2&cqC6E=ry zXJ+(8%Z70#nKm=Dsc6n}WN>9%Im@wu(@R)1;ReGEv68b#Zt<}zFrO%8Y;9;{WSDzW VGDT$fpB$i}44$rjF6*2UngAVRG;sg` literal 0 HcmV?d00001