Jump to content

sttwolf

Members
  • Posts

    17
  • Joined

  • Last visited

Converted

  • Gender
    Undisclosed
  • Personal Text
    I am new!

sttwolf's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. Yes of course, and I'm here because I once had problems with modding on forge, and had good answers. So I ensure that there are competent people here. Well my question would be : Is there a way to do it without Forge ? See, my question now involves forge.
  2. Is there a way to do it without forge ? Modifying the vanilla classes. I'm using a custom launcher, so this doesn't matter.
  3. Hi, so I was wondering on how to hide the armor for players, and only for them, because I want to see armor on NPCs. This is because I run my own server, with really nice skins, and I don't want armor to ruin the RP. I've got plugins to show health and armor bars on top of players, so don't worry. I believe I need to modify a function in RenderPlayer.java, the function setArmorModel /** * Set the specified armor model as the player model. Args: player, armorSlot, partialTick */ protected int setArmorModel(AbstractClientPlayer par1AbstractClientPlayer, int par2, float par3) { ItemStack var4 = par1AbstractClientPlayer.inventory.armorItemInSlot(3 - par2); if (var4 != null) { Item var5 = var4.getItem(); if (var5 instanceof ItemArmor) { ItemArmor var6 = (ItemArmor)var5; this.bindTexture(RenderBiped.func_110857_a(var6, par2)); ModelBiped var7 = par2 == 2 ? this.modelArmor : this.modelArmorChestplate; var7.bipedHead.showModel = par2 == 0; var7.bipedHeadwear.showModel = par2 == 0; var7.bipedBody.showModel = par2 == 1 || par2 == 2; var7.bipedRightArm.showModel = par2 == 1; var7.bipedLeftArm.showModel = par2 == 1; var7.bipedRightLeg.showModel = par2 == 2 || par2 == 3; var7.bipedLeftLeg.showModel = par2 == 2 || par2 == 3; this.setRenderPassModel(var7); var7.onGround = this.mainModel.onGround; var7.isRiding = this.mainModel.isRiding; var7.isChild = this.mainModel.isChild; float var8 = 1.0F; if (var6.getArmorMaterial() == EnumArmorMaterial.CLOTH) { int var9 = var6.getColor(var4); float var10 = (float)(var9 >> 16 & 255) / 255.0F; float var11 = (float)(var9 >> 8 & 255) / 255.0F; float var12 = (float)(var9 & 255) / 255.0F; GL11.glColor3f(var8 * var10, var8 * var11, var8 * var12); if (var4.isItemEnchanted()) { return 31; } return 16; } GL11.glColor3f(var8, var8, var8); if (var4.isItemEnchanted()) { return 15; } return 1; } } return -1; } The problem is that, when I modify it, armor are not showing, which is good, but skins also don't get displayed. What's wrong ? Thanks !
  4. It works, but, only down, the skin gets displayed only when opening inventory, got an idea on that ?
  5. Then how to make it happen just one time ? Changing the event ?
  6. Sorry to bother you again, but, does this code would work ? public class PlayerRenderEvent { @ForgeSubscribe public void onPlayerRender(RenderPlayerEvent.Specials.Pre event) { AbstractClientPlayer player = (AbstractClientPlayer)event.entityPlayer; if(player.username != null && !player.username.isEmpty()) { ObfuscationReflectionHelper.setPrivateValue(AbstractClientPlayer.class, player, this.getDownloadImageSkin(this.getLocationSkin(player.username), player.username), "field_110315_c", "downloadImageSkin", "c"); ObfuscationReflectionHelper.setPrivateValue(AbstractClientPlayer.class, player, this.getLocationCape(player.username), "field_110313_e", "locationCape", "e"); } } public static ThreadDownloadImageData getDownloadImageSkin(ResourceLocation resourceLocation, String playerName) { return getDownloadImage(resourceLocation, getSkinUrl(playerName), (ResourceLocation)null, (IImageBuffer)null); } private static ThreadDownloadImageData getDownloadImage(ResourceLocation res, String link, ResourceLocation defRes, IImageBuffer image) { TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager(); Object object = texturemanager.getTexture(res); if(object == null) { object = new ThreadDownloadImageData(link, defRes, image); texturemanager.loadTexture(res, (TextureObject)object); } return (ThreadDownloadImageData)object; } public static String getSkinUrl(String playerName) { return String.format("somesite/%s.png", new Object[] {StringUtils.stripControlCodes(playerName)}); } public static ResourceLocation getLocationSkin(String playerName) { return new ResourceLocation("modid", "skins/" + StringUtils.stripControlCodes(playerName)); } } }
  7. Thanks, it's more clear to me now. You see, I'm new to minecraft modding, especially in forge. I know Java, but I never used the ASM thingy. I followed a tutorial that told me it could work. So now I will look at RenderPlayerEvent, I'm just wondering, do I have to do the entire code for modeling the player or I can just modify the skin straight away ?
  8. What a really nice contribution, if only you wrote that much in order to help my problem, you would have been useful, which your post shows you are not. Anyway, thanks the tip, I will check that.
  9. Nope. That's why I did this : if(obfuscated == true) { targetMethod1Name ="d"; targetMethod2Name = "e"; } else { targetMethod1Name ="getSkinUrl"; targetMethod2Name = "getCapeUrl"; } Yeah it's really really weird
  10. Thanks, I will try, but that still doesn't tell me why it's working on my eclipse
  11. Which part of code ? So I modified but still the same error public byte[] transform(String arg0, String arg1, byte[] arg2) { if (arg1.equals("beu")) { return patchClassASM(arg1, arg2, true); } if (arg1.equals("net.minecraft.client.entity.AbstractClientPlayer")) { return patchClassASM(arg1, arg2, false); } return arg2; } Sorry for double post.
  12. Here it is : package pkg; import static org.objectweb.asm.Opcodes.ARETURN; import static org.objectweb.asm.Opcodes.ALOAD; import static org.objectweb.asm.Opcodes.INVOKESTATIC; import java.util.Iterator; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.VarInsnNode; public class SkinClassTransformer implements net.minecraft.launchwrapper.IClassTransformer { @Override public byte[] transform(String arg0, String arg1, byte[] arg2) { if (arg0.equals("beu")) { return patchClassASM(arg1, arg2, true); } if (arg0.equals("net.minecraft.client.entity.AbstractClientPlayer")) { return patchClassASM(arg1, arg2, false); } return arg2; } public byte[] patchClassASM(String name, byte[] bytes, boolean obfuscated) { String targetMethod1Name = "", targetMethod2Name = ""; boolean ok1 = false, ok2 = false; targetMethod1Name ="getSkinUrl"; targetMethod2Name = "getCapeUrl"; ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0); Iterator<MethodNode> methods = classNode.methods.iterator(); while(methods.hasNext()) { MethodNode m = methods.next(); if ((m.name.equals(targetMethod1Name) && m.desc.equals("(Ljava/lang/String;)Ljava/lang/String;"))) { InsnList toInject = new InsnList(); toInject.add(new VarInsnNode(ALOAD, 0)); toInject.add(new MethodInsnNode(INVOKESTATIC, "pkg/SkinPlayer", "getURLSkinCustom", "(Ljava/lang/String;)Ljava/lang/String;")); toInject.add(new InsnNode(ARETURN)); m.instructions = toInject; ok1 = true; break; } else if ((m.name.equals(targetMethod2Name) && m.desc.equals("(Ljava/lang/String;)Ljava/lang/String;"))) { InsnList toInject = new InsnList(); toInject.add(new VarInsnNode(ALOAD, 0)); toInject.add(new MethodInsnNode(INVOKESTATIC, "pkg/SkinPlayer", "getURLCapeCustom", "(Ljava/lang/String;)Ljava/lang/String;")); toInject.add(new InsnNode(ARETURN)); m.instructions = toInject; ok2 = true; break; } if(ok1 && ok2) break; } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); classNode.accept(writer); return writer.toByteArray(); } }
  13. I did replace the path, but it still isn't working, what's wrong ? If I understood it good, I must return the full path, not the obfuscated one ?
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.