From 52bd9b0af454553089c2e529a107afcf420e0532 Mon Sep 17 00:00:00 2001 From: Toshayo Date: Fri, 13 Feb 2026 13:15:52 +0100 Subject: [PATCH 1/2] Added halo part --- .../kamkeel/MorePlayerModelsPermissions.java | 1 + .../mpm/client/gui/GuiCreationParts.java | 67 ++++++++ .../noppes/mpm/client/model/ModelMPM.java | 4 + .../mpm/client/model/part/head/ModelHalo.java | 152 ++++++++++++++++++ .../java/noppes/mpm/config/ConfigPerm.java | 2 + .../java/noppes/mpm/constants/EnumParts.java | 3 +- .../assets/moreplayermodels/lang/en_US.lang | 7 + .../moreplayermodels/textures/halo/halo.png | Bin 0 -> 1579 bytes 8 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java create mode 100644 src/main/resources/assets/moreplayermodels/textures/halo/halo.png diff --git a/src/main/java/kamkeel/MorePlayerModelsPermissions.java b/src/main/java/kamkeel/MorePlayerModelsPermissions.java index e8a8867..624ede8 100644 --- a/src/main/java/kamkeel/MorePlayerModelsPermissions.java +++ b/src/main/java/kamkeel/MorePlayerModelsPermissions.java @@ -32,6 +32,7 @@ public class MorePlayerModelsPermissions { public static final Permission PARTS_FIN = new Permission("mpm.parts.fin", ConfigPerm.PARTS_FIN); public static final Permission PARTS_HAIR = new Permission("mpm.parts.hair", ConfigPerm.PARTS_HAIR); public static final Permission PARTS_HORNS = new Permission("mpm.parts.horns", ConfigPerm.PARTS_HORNS); + public static final Permission PARTS_HALO = new Permission("mpm.parts.halo", ConfigPerm.PARTS_HALO); public static final Permission PARTS_LEGS = new Permission("mpm.parts.legs", ConfigPerm.PARTS_LEGS); public static final Permission PARTS_MOHAWK = new Permission("mpm.parts.mohawk", ConfigPerm.PARTS_MOHAWK); public static final Permission PARTS_PARTICLES = new Permission("mpm.parts.particles", ConfigPerm.PARTS_PARTICLES); diff --git a/src/main/java/noppes/mpm/client/gui/GuiCreationParts.java b/src/main/java/noppes/mpm/client/gui/GuiCreationParts.java index cf94f38..0b6f758 100644 --- a/src/main/java/noppes/mpm/client/gui/GuiCreationParts.java +++ b/src/main/java/noppes/mpm/client/gui/GuiCreationParts.java @@ -2,6 +2,7 @@ import kamkeel.MorePlayerModelsPermissions; import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.util.StatCollector; import noppes.mpm.ModelData; import noppes.mpm.ModelPartData; @@ -12,6 +13,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.function.Consumer; public class GuiCreationParts extends GuiCreationScreenInterface implements ITextfieldListener, ICustomScrollListener{ private GuiCustomScroll scroll; @@ -51,6 +53,9 @@ public GuiCreationParts(){ if(ClientPermController.hasPermission(MorePlayerModelsPermissions.PARTS_HORNS)){ partList.add(new GuiPartHorns()); } + if(ClientPermController.hasPermission(MorePlayerModelsPermissions.PARTS_HALO)){ + partList.add(new GuiPartHalo()); + } if(ClientPermController.hasPermission(MorePlayerModelsPermissions.PARTS_HAIR)){ partList.add(new GuiPartHair()); } @@ -317,6 +322,68 @@ public int initGui(){ return y; } } + class GuiPartHalo extends GuiPart{ + public GuiPartHalo() { + super(EnumParts.HALO); + types = new String[]{"gui.none", "gui.halo.base", "gui.halo.base_textured", "gui.halo.thin", "gui.halo.thin_textured"}; + noPlayerOptions(); + } + + @Override + public int initGui() { + int y = super.initGui(); + if(data != null && data.type >= 2){ + GuiCreationParts.this.addSlider(new GuiNpcSlider(new FakeGui(this::actionPerformed), 49, guiLeft + 145, y, StatCollector.translateToLocal("gui.halo.width"), (data.pattern & 0xF) / 15F)); + GuiCreationParts.this.addSlider(new GuiNpcSlider(new FakeGui(this::actionPerformed), 50, guiLeft + 145, y + 24, StatCollector.translateToLocal("gui.halo.elevation"), (data.pattern >> 4 & 0xF) / 15F)); + } + return y; + } + + @Override + protected void actionPerformed(GuiButton btn) { + switch (btn.id) { + case 49: + data.pattern = (byte) ((data.pattern & 0xF0) | (int) (((GuiNpcSlider) btn).sliderValue * 15)); + break; + case 50: + data.pattern = (byte) ((data.pattern & 0xF) | (int) (((GuiNpcSlider) btn).sliderValue * 15) << 4); + break; + case 20: + int i = ((GuiNpcButton) btn).getValue(); + if (i == 0 && canBeDeleted) + playerdata.removePart(part); + else { + data = playerdata.getOrCreatePart(part); + data.setCustomResource(""); + data.playerTexture = false; + data.pattern = 0b111 << 4 | 0b111; + data.setType(i - 1); + } + GuiCreationParts.this.initGui(); + break; + default: + super.actionPerformed(btn); + break; + } + } + + class FakeGui extends GuiScreen implements ISliderListener { + private Consumer listener; + private FakeGui(Consumer listener) { + this.listener = listener; + } + @Override + public void mouseDragged(GuiNpcSlider guiNpcSlider) { + listener.accept(guiNpcSlider); + } + + @Override + public void mousePressed(GuiNpcSlider guiNpcSlider) {} + + @Override + public void mouseReleased(GuiNpcSlider guiNpcSlider) {} + } + } class GuiPartHair extends GuiPart{ public GuiPartHair() { super(EnumParts.HAIR); diff --git a/src/main/java/noppes/mpm/client/model/ModelMPM.java b/src/main/java/noppes/mpm/client/model/ModelMPM.java index c7970bf..346afd6 100644 --- a/src/main/java/noppes/mpm/client/model/ModelMPM.java +++ b/src/main/java/noppes/mpm/client/model/ModelMPM.java @@ -42,6 +42,7 @@ public class ModelMPM extends ModelBiped{ private ModelPartInterface fin; private ModelPartInterface skirt; private ModelPartInterface horns; + private ModelPartInterface halo; private ModelPartInterface clawsR; private ModelPartInterface clawsL; private ModelCape cape; @@ -189,6 +190,7 @@ public ModelMPM(float par1, boolean alex) { // Completed this.bipedHead.addChild(snout = new ModelSnout(this)); this.bipedHead.addChild(horns = new ModelHorns(this)); + this.bipedHead.addChild(halo = new ModelHalo(this)); // Completed tail = new ModelTail(this); @@ -306,6 +308,7 @@ public ModelMPM(float par1, int alexArms) { // Completed this.bipedHead.addChild(snout = new ModelSnout(this)); this.bipedHead.addChild(horns = new ModelHorns(this)); + this.bipedHead.addChild(halo = new ModelHalo(this)); // Completed tail = new ModelTail(this); @@ -333,6 +336,7 @@ public void setPlayerData(ModelData data, EntityLivingBase entity){ clawsR.setData(data, player); skirt.setData(data, player); horns.setData(data, player); + halo.setData(data, player); } breasts.setData(data, player); legs.setData(data, player); diff --git a/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java b/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java new file mode 100644 index 0000000..00d9b1a --- /dev/null +++ b/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java @@ -0,0 +1,152 @@ +package noppes.mpm.client.model.part.head; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import noppes.mpm.ModelData; +import noppes.mpm.ModelPartData; +import noppes.mpm.client.ClientEventHandler; +import noppes.mpm.client.model.ModelMPM; +import noppes.mpm.client.model.ModelPartInterface; +import noppes.mpm.constants.EnumParts; +import org.lwjgl.opengl.GL11; + +public class ModelHalo extends ModelPartInterface { + private static final ResourceLocation haloTexture = new ResourceLocation("moreplayermodels", "textures/halo/halo.png"); + private AbstractClientPlayer entity; + private boolean applyTexture; + private boolean thinHalo; + private byte haloWidth; + private byte haloElevation; + + private final ModelRenderer haloBase; + private final ModelRenderer haloThin; + public final ModelRenderer[] haloSegments; + public final ModelRenderer[] haloSegmentsThin; + + public ModelHalo(ModelMPM base) { + super(base); + this.textureWidth = 81; + this.textureHeight = 34; + + haloBase = new ModelRenderer(base, 0, 34); + haloBase.setTextureSize((int) textureWidth, (int) textureHeight); + haloBase.setRotationPoint(0.0F, 0.0F, 0.0F); + haloBase.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0, 0.0F); + + haloThin = new ModelRenderer(base, 0, 34); + haloThin.setTextureSize((int) textureWidth, (int) textureHeight); + haloThin.setRotationPoint(0.0F, 0.0F, 0.0F); + haloThin.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0, 0.0F); + + haloSegments = new ModelRenderer[12]; + + for(int i = 0; i < haloSegments.length; i++) { + haloSegments[i] = new ModelRenderer(base, 0, 32); + haloSegments[i].setTextureSize((int) textureWidth, (int) textureHeight); + if(i == 0) { + haloSegments[i].setRotationPoint(0.0F, -9.0F, -3.85F); + } else { + haloSegments[i].setRotationPoint(2F, 0F, 0F); + } + haloSegments[i].addBox(0F, -1F, 0F, 2, 1, 1, 0F); + if(i == 0) { + setRotateAngle(haloSegments[i], 0F, (float) (-Math.PI / haloSegments.length), 0F); + } else { + setRotateAngle(haloSegments[i], 0F, (float) (-2D * Math.PI / haloSegments.length), 0F); + haloSegments[i - 1].addChild(haloSegments[i]); + } + } + haloBase.addChild(haloSegments[0]); + + haloSegmentsThin = new ModelRenderer[48]; + + for(int i = 0; i < haloSegmentsThin.length; i++) { + haloSegmentsThin[i] = new ModelRenderer(base, 0, 32); + haloSegmentsThin[i].setTextureSize((int) textureWidth, (int) textureHeight); + haloSegmentsThin[i].setRotationPoint(0F, -9.0F, 0F); + haloSegmentsThin[i].addBox((float) (40F/Math.PI), -1F, -1, 1, 1, 2, 0F); + setRotateAngle(haloSegmentsThin[i], 0F, i * (float) (-2D * Math.PI / haloSegmentsThin.length), 0F); + haloThin.addChild(haloSegmentsThin[i]); + } + + addChild(haloBase); + addChild(haloThin); + } + + @Override + public void setData(ModelData data, AbstractClientPlayer entity) { + super.setData(data, entity); + this.entity = entity; + } + + @Override + public void render(float f5) { + if (this.isHidden || !this.showModel) + return; + GL11.glPushMatrix(); + GL11.glRotatef((float)entity.worldObj.getTotalWorldTime(), 0.0F, 1.0F, 0.0F); + float f = (float)entity.ticksExisted + ClientEventHandler.partialTicks; + float f1 = MathHelper.sin(f * 0.2F) / 2.0F + 0.5F; + f1 = f1 * f1 + f1; + GL11.glTranslatef(0.0F, -0.2F + f1 * 0.05F, 0.0F); + if (entity.isSneaking()) { + GL11.glTranslatef(0.0F, 0.2F, 0.0F); + } + + if(!applyTexture) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + } + if(thinHalo) { + float width = haloWidth * 0.05F - 0.4F; + float elevation = haloElevation * 0.05F - 0.4F; + // GL11.glTranslatef(0F, -0.2F, 0F); // Above head <-> around head + GL11.glTranslatef(0F, -0.4F - elevation, 0F); // Above head + GL11.glScalef(0.7F + width, 0.3F, 0.7F + width); + } + + float prevX = OpenGlHelper.lastBrightnessX; + float prevY = OpenGlHelper.lastBrightnessY; + GL11.glDisable(GL11.GL_LIGHTING); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); + + super.render(f5); + + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, prevX, prevY); + GL11.glEnable(GL11.GL_LIGHTING); + + if(!applyTexture) { + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glPopMatrix(); + } + + private void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + @Override + public void initData(ModelData data) { + ModelPartData config = data.getPartData(EnumParts.HALO); + if(config == null) { + isHidden = true; + return; + } + isHidden = false; + this.color = config.color; + + thinHalo = config.type > 1; + haloBase.isHidden = thinHalo; + haloThin.isHidden = !thinHalo; + haloWidth = (byte) (config.pattern & 0xF); + haloElevation = (byte) ((config.pattern >> 4) & 0xF); + + applyTexture = config.type % 2 == 1; + location = haloTexture; + } +} diff --git a/src/main/java/noppes/mpm/config/ConfigPerm.java b/src/main/java/noppes/mpm/config/ConfigPerm.java index 39db916..c0b4fd8 100644 --- a/src/main/java/noppes/mpm/config/ConfigPerm.java +++ b/src/main/java/noppes/mpm/config/ConfigPerm.java @@ -31,6 +31,7 @@ public class ConfigPerm { public static boolean PARTS_FIN; public static boolean PARTS_HAIR; public static boolean PARTS_HORNS; + public static boolean PARTS_HALO; public static boolean PARTS_LEGS; public static boolean PARTS_MOHAWK; public static boolean PARTS_PARTICLES; @@ -89,6 +90,7 @@ public static void init(File configFile) { PARTS_FIN = permConfig.get(PART, "PARTS_FIN", true).getBoolean(); PARTS_HAIR = permConfig.get(PART, "PARTS_HAIR", true).getBoolean(); PARTS_HORNS = permConfig.get(PART, "PARTS_HORNS", true).getBoolean(); + PARTS_HALO = permConfig.get(PART, "PARTS_HALO", true).getBoolean(); PARTS_LEGS = permConfig.get(PART, "PARTS_LEGS", true).getBoolean(); PARTS_MOHAWK = permConfig.get(PART, "PARTS_MOHAWK", true).getBoolean(); PARTS_PARTICLES = permConfig.get(PART, "PARTS_PARTICLES", true).getBoolean(); diff --git a/src/main/java/noppes/mpm/constants/EnumParts.java b/src/main/java/noppes/mpm/constants/EnumParts.java index 9e8a1e0..fcaa876 100644 --- a/src/main/java/noppes/mpm/constants/EnumParts.java +++ b/src/main/java/noppes/mpm/constants/EnumParts.java @@ -18,7 +18,8 @@ public enum EnumParts { BREASTS("breasts"), PARTICLES("particles"), ARMS("arms"), - CAPE("cape"); + CAPE("cape"), + HALO("halo"); public String name; diff --git a/src/main/resources/assets/moreplayermodels/lang/en_US.lang b/src/main/resources/assets/moreplayermodels/lang/en_US.lang index 38af897..c7984f4 100644 --- a/src/main/resources/assets/moreplayermodels/lang/en_US.lang +++ b/src/main/resources/assets/moreplayermodels/lang/en_US.lang @@ -37,6 +37,12 @@ gui.resettoplayer=Reset To Player gui.player=Player gui.new=New gui.hide=Hide +gui.halo.base=Base +gui.halo.base_textured=Textured +gui.halo.thin=Thin +gui.halo.thin_textured=Thin Textured +gui.halo.width=Width +gui.halo.elevation=Elevation animation.sleep=Sleep animation.crawl=Crawl @@ -55,6 +61,7 @@ scale.shared=Shared part.ears=Ears part.horns=Horns +part.halo=Halo part.hair=Hair part.mohawk=Mohawk part.snout=Snout diff --git a/src/main/resources/assets/moreplayermodels/textures/halo/halo.png b/src/main/resources/assets/moreplayermodels/textures/halo/halo.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a00c5acae48e65f12894720f401041be8a3e8d GIT binary patch literal 1579 zcmeAS@N?(olHy`uVBq!ia0vp^fk3Rp!3-n?o*&I-U|?nl@Ck7Ra)Dsq!SnkMo!fu- z{QoCg4;;F9@bIOBM=l&Xdhy`VO9zi#Jap{R;iFfM9KU?*<85?R!t}+<$iW!Sj0$UqGBRN{)sA z9YVlLXwCsBV7?icNiRvwPVd?pRz7Hv*q8kyNf1msbffeueN@V66<7P zrjnjc36b}iOQ+af=<#~I==ELkZkJ>8Z#kdY8!lW}7W#_)t?$F07-i1Q@@!u&_JxJT zywI4s&)VXeGXsOV=%cjO8xIUj((O$b8o6k;9Z_Af;b7~t9g6X`UQ9}D3Ku>qe{BeH zGS*skQcLuS6<@~}`6*K(N=!G3$ed+<&{I5VZPp^|gFEc2_M{3F|JZ0_-1Ov!;|J+u z!3EnMunV96TcA}fvh!N~G3V9p-`~VPw12$+;N_Gv%^Qwu>9_cPPE}fzUSK(Sv;X2J zs$1_(sFzoD(SNq_%fmZ<{)uwS!_KP>_kBI-3I&tnq`ET6PTuHSN} zt~aKq?aKXEw~aTMe^iW*|12iD(sixHrdF` zZu5M_m!MwlneCjG|8~D?{JDc)IM$3*&QEJom#E2W_6*%zeJvP0MPQ zYvhL2sTU4i%@&DlS?b(#GWBQp|bu&f2(l4$C>I!kQIZWRtX8zDRz%xOI)5uh3J!Bi}vNZkoHv#@68J lyWRGp|5 literal 0 HcmV?d00001 From 13cdab072f71784c6feedf7073299095a5f5014a Mon Sep 17 00:00:00 2001 From: Toshayo Date: Fri, 13 Feb 2026 13:24:22 +0100 Subject: [PATCH 2/2] This one was not intended to remain --- src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java b/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java index 00d9b1a..8dc62a2 100644 --- a/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java +++ b/src/main/java/noppes/mpm/client/model/part/head/ModelHalo.java @@ -102,8 +102,7 @@ public void render(float f5) { if(thinHalo) { float width = haloWidth * 0.05F - 0.4F; float elevation = haloElevation * 0.05F - 0.4F; - // GL11.glTranslatef(0F, -0.2F, 0F); // Above head <-> around head - GL11.glTranslatef(0F, -0.4F - elevation, 0F); // Above head + GL11.glTranslatef(0F, -0.4F - elevation, 0F); GL11.glScalef(0.7F + width, 0.3F, 0.7F + width); }