Jump to content

sttwolf

Members
  • Posts

    17
  • Joined

  • Last visited

Everything posted by sttwolf

  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. Thanks for everything !
  5. It works, but, only down, the skin gets displayed only when opening inventory, got an idea on that ?
  6. Then how to make it happen just one time ? Changing the event ?
  7. 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)); } } }
  8. 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 ?
  9. 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.
  10. 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
  11. Thanks, I will try, but that still doesn't tell me why it's working on my eclipse
  12. 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.
  13. Which part of code ?
  14. 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(); } }
  15. 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 ?
  16. Should I do this ? : if (arg1.equals("beu")) { return patchClassASM(arg1, arg2, true); } if (arg1.equals("net.minecraft.client.entity.AbstractClientPlayer")) { return patchClassASM(arg1, arg2, false); } instead of if (arg0.equals("beu")) { return patchClassASM(arg0, arg2, true); } if (arg0.equals("net.minecraft.client.entity.AbstractClientPlayer")) { return patchClassASM(arg0, arg2, false); } ?
  17. Hi, I'm currently modding my 1.6.4 client with forge to set-up custom skins on my server. I searched how to manage this mod, and I found the ASM patching way. I used the code that I will paste, and everything worked out fine but only while running my mod in eclipse's environnement (so only in an un-obfuscated minecraft) . Otherwise when I test with the official launcher, I get a crash with lots of errors. And I don't understand why or how to fix it. Help me ! :'( Here is the code + the stacktrace of the error : SkinTransformer.java 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(arg0, arg2, true); } if (arg0.equals("net.minecraft.client.entity.AbstractClientPlayer")) { return patchClassASM(arg0, arg2, false); } return arg2; } public byte[] patchClassASM(String name, byte[] bytes, boolean obfuscated) { String targetMethod1Name = "", targetMethod2Name = ""; boolean ok1 = false, ok2 = false; if(obfuscated == true) { targetMethod1Name ="d"; targetMethod2Name = "e"; } else { 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; } 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; } if(ok1 && ok2) break; } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); classNode.accept(writer); return writer.toByteArray(); } } SkinPlayer.java package pkg; import java.net.HttpURLConnection; import java.net.URL; import net.minecraft.util.StringUtils; public class SkinPlayer { private static String connexion (String adress, String par0Str){ int code = 404; try { URL u = new URL (adress); HttpURLConnection huc = ( HttpURLConnection ) u.openConnection (); huc.setRequestMethod ("GET"); huc.connect () ; code = huc.getResponseCode() ; if (code == HttpURLConnection.HTTP_OK) return adress; else if (code == HttpURLConnection.HTTP_MOVED_TEMP || code == HttpURLConnection.HTTP_MOVED_PERM || code == HttpURLConnection.HTTP_SEE_OTHER) { String newUrl = huc.getHeaderField("Location"); huc = (HttpURLConnection) new URL(newUrl).openConnection(); huc.setRequestMethod ("GET"); huc.connect (); code = huc.getResponseCode(); if (code == HttpURLConnection.HTTP_OK) return newUrl; } } catch(Exception e){ } return String.format("official minecraft.net skins url", new Object[] {StringUtils.stripControlCodes(par0Str)}); } public static String getURLSkinCustom(String par0Str) { String adress=String.format("http://www.somesite.com/skin/%s", new Object[] {StringUtils.stripControlCodes(par0Str)}); return connexion(adress, par0Str); } public static String getURLCapeCustom(String par0Str) { String adress=String.format("http://www.somesite.com/cape/%s", new Object[] {StringUtils.stripControlCodes(par0Str)}); return connexion(adress, par0Str); } } SkinFMLLoadingPlugin.java package pkg; import java.io.File; import java.util.Map; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion; @MCVersion(value = "1.6.4") public class SkinFMLLoadingPlugin implements cpw.mods.fml.relauncher.IFMLLoadingPlugin { @Override public String[] getLibraryRequestClass() { return null; } @Override public String[] getASMTransformerClass() { return new String[]{SkinClassTransformer.class.getName()}; } @Override public String getModContainerClass() { return SkinDummyContainer.class.getName(); } @Override public String getSetupClass() { return null; } @Override public void injectData(Map<String, Object> data) { } } SkinDummyContainer.java package pkg; import java.util.Arrays; import net.minecraftforge.common.Configuration; import net.minecraftforge.event.ForgeSubscribe; import com.google.common.eventbus.EventBus; import cpw.mods.fml.common.DummyModContainer; import cpw.mods.fml.common.LoadController; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.ModMetadata; import cpw.mods.fml.common.event.FMLConstructionEvent; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; public class SkinDummyContainer extends DummyModContainer { public SkinDummyContainer() { super(new ModMetadata()); ModMetadata meta = getMetadata(); meta.modId = "something"; meta.name = "something"; meta.version = "1.0"; meta.credits = "something"; meta.authorList = Arrays.asList("something"); meta.description = "something"; meta.url = "something"; meta.updateUrl = ""; meta.screenshots = new String[0]; meta.logoFile = ""; } @ForgeSubscribe public boolean registerBus(EventBus bus, LoadController controller) { bus.register(this); return true; } @EventHandler public void modConstruction(FMLConstructionEvent event){ } @EventHandler public void init(FMLInitializationEvent evt) { } @EventHandler public void preInit(FMLPreInitializationEvent event) { } @EventHandler public void postInit(FMLPostInitializationEvent evt) { } } The MANIFEST file inside mod's jarfile : MANIFEST.MF Manifest-Version: 1.0 FMLCorePlugin: pkg.SkinFMLLoadingPlugin -Dfml.coreMods.load=pkg.SkinFMLLoadingPlugin And now the stacktrace, and I repeat that it happen ONLY WHEN TESTING OUTSIDE ECLIPSE : Client> 2014-06-05 00:13:39 [GRAVE] [ForgeModLoader] Unable to launch Client> java.lang.reflect.InvocationTargetException Client> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) Client> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) Client> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) Client> at java.lang.reflect.Method.invoke(Unknown Source) Client> at net.minecraft.launchwrapper.Launch.launch(Launch.java:131) Client> at net.minecraft.launchwrapper.Launch.main(Launch.java:27) Client> Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/entity/EntityClientPlayerMP Client> at net.minecraft.client.main.Main.main(SourceFile:37) Client> ... 6 more Client> Caused by: java.lang.ClassNotFoundException: net.minecraft.client.entity.EntityClientPlayerMP Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:186) Client> at java.lang.ClassLoader.loadClass(Unknown Source) Client> at java.lang.ClassLoader.loadClass(Unknown Source) Client> ... 7 more Client> Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/entity/EntityPlayerSP Client> at java.lang.ClassLoader.defineClass1(Native Method) Client> at java.lang.ClassLoader.defineClass(Unknown Source) Client> at java.security.SecureClassLoader.defineClass(Unknown Source) Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:178) Client> ... 9 more Client> Caused by: java.lang.ClassNotFoundException: net.minecraft.client.entity.EntityPlayerSP Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:186) Client> at java.lang.ClassLoader.loadClass(Unknown Source) Client> at java.lang.ClassLoader.loadClass(Unknown Source) Client> ... 13 more Client> Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/entity/AbstractClientPlayer Client> at java.lang.ClassLoader.defineClass1(Native Method) Client> at java.lang.ClassLoader.defineClass(Unknown Source) Client> at java.security.SecureClassLoader.defineClass(Unknown Source) Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:178) Client> ... 15 more Client> Caused by: java.lang.ClassNotFoundException: net.minecraft.client.entity.AbstractClientPlayer Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:186) Client> at java.lang.ClassLoader.loadClass(Unknown Source) Client> at java.lang.ClassLoader.loadClass(Unknown Source) Client> ... 19 more Client> Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: bic Client> at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source) Client> at org.objectweb.asm.ClassWriter.a(Unknown Source) Client> at org.objectweb.asm.Frame.a(Unknown Source) Client> at org.objectweb.asm.Frame.a(Unknown Source) Client> at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source) Client> at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) Client> at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) Client> at org.objectweb.asm.tree.ClassNode.accept(Unknown Source) Client> at vertebro.SkinClassTransformer.patchClassASM(SkinClassTransformer.java:86) Client> at vertebro.SkinClassTransformer.transform(SkinClassTransformer.java:23) Client> at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:274) Client> at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:172) Client> ... 21 more Thanks !
×
×
  • Create New...

Important Information

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