Jump to content

Modifying Jar Classes


BlueSpud

Recommended Posts

I want to modify some of the functions in the jar, but I know installing modified class files is a haste. I thought ASM transformers were what I needed, but I haven't had any luck. If someone could point me in the right direction, that would be greatly appreciated. Thanks.

Link to comment
Share on other sites

EDIT: I was able to make the coremod load by adding a command line load in Eclipse, but I still don't know how I would override functions, so I can change them completely.

 

 

I do need base edits, I'm modifying several functions that Forge can't change. My problem is that the coremod won't load. I'm in eclipse, and here is all my code:

 

Transformer

package DHNCore.asm;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import cpw.mods.fml.common.asm.transformers.AccessTransformer;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions;


public class DHNAccessTransformer extends AccessTransformer {
  private static DHNAccessTransformer instance;
      private static List mapFiles = new LinkedList();
      public DHNAccessTransformer() throws IOException {
              super();
              instance = this;
              // add your access transformers here!
              mapFiles.add("DHN_at.cfg");
              Iterator it = mapFiles.iterator();
              while (it.hasNext()) {
                      String file = (String)it.next();
                      this.readMapFile(file);
              }
              
      }
      public static void addTransformerMap(String mapFileName) {
              if (instance == null) {
                      mapFiles.add(mapFileName);
              }
              else {
                      instance.readMapFile(mapFileName);
              }
      }
      private void readMapFile(String name) {
              System.out.println("Adding transformer map: " + name);
              try {
                      // get a method from AccessTransformer
                      Method e = AccessTransformer.class.getDeclaredMethod("readMapFile", new Class[]{String.class});
                      e.setAccessible(true);
                      // run it with the file given.
                      e.invoke(this, new Object[]{name});
                      
              }
              catch (Exception ex) {
                      throw new RuntimeException(ex);
              }
      }
      
}

Loader

package DHNCore.asm;

import java.util.Map;

import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions;

@TransformerExclusions({"DHNCore.asm"})
public class DHNLoadingPlugin implements IFMLLoadingPlugin {

@Override
public String[] getLibraryRequestClass() {
	// TODO Auto-generated method stub
	return null;
}

@Override
public String[] getASMTransformerClass() {
	// TODO Auto-generated method stub
	return new String[] {"DHNCore.asm.DHNAccessTransformer"};
}

@Override
public String getModContainerClass() {
	// TODO Auto-generated method stub
	return "DHNCore.asm.DHNModContainer";
}

@Override
public String getSetupClass() {
	// TODO Auto-generated method stub
	return null;
}

@Override
public void injectData(Map<String, Object> data) {
	// TODO Auto-generated method stub

}

}

Mod Container

package DHNCore.asm;

import cpw.mods.fml.common.DummyModContainer;


import java.util.Arrays;
import java.util.Random;


import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

import cpw.mods.fml.common.DummyModContainer;
import cpw.mods.fml.common.LoadController;
import cpw.mods.fml.common.ModMetadata;
import cpw.mods.fml.common.event.FMLServerStartingEvent;

public class DHNModContainer extends DummyModContainer {
        public DHNModContainer() {
                super(new ModMetadata());
                /* ModMetadata is the same as mcmod.info */
                ModMetadata myMeta = super.getMetadata();
                myMeta.authorList = Arrays.asList(new String[] { "BlueSpud" });
                myMeta.description = "Dishonored Core Mod";
                myMeta.modId = "DHNCORE";
                myMeta.version = "1.6.1";
                myMeta.name = "Dishonored Core";
                myMeta.url = "";
        }
        
        public boolean registerBus(EventBus bus, LoadController controller) {
        bus.register(this);
        return true;
        }
        /* 
         * Use this in place of @Init, @Preinit, @Postinit in the file.
         */
        @Subscribe                 /* Remember to use the right event! */
        public void onServerStarting(FMLServerStartingEvent ev) {
                ev.getServer().worldServerForDimension(0).spawnHostileMobs = false;
                System.out.printf("DHNCore has Loaded%n");
        }
        
}

for the config I just copied the tutorial on the wiki

 

# Tutorial Access Transformers.
########### THESE ARE DIFFERENT IN 1.4 ################
# Lines starting with a '#' are comments and aren't needed, although it's a good idea to label them so you know what changes what.

# World
# So to make a field public, put something like this:
public abr.E # spawnHostileMobs
# In 1.4, the above line would be "public xe.F"

Manifest

Manifest-Version: 1.0
FMLCorePlugin: DHNCORE.asm.DHNLoadingPlugin

Link to comment
Share on other sites

1) ASM should ALWAYS be a last resort, so what are you trying to do?

2) Your transformer is a lot more cplicated then it needs to be...

This is Forge's

public class ForgeAccessTransformer extends AccessTransformer
{
    public ForgeAccessTransformer() throws IOException
    {
        super("forge_at.cfg");
    }
}

And for as to why your coremod isnt loading, you need to pass in the proper environment parameters. fml.coreMods.load

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Link to comment
Share on other sites

1) ASM should ALWAYS be a last resort, so what are you trying to do?

2) Your transformer is a lot more cplicated then it needs to be...

This is Forge's

public class ForgeAccessTransformer extends AccessTransformer
{
    public ForgeAccessTransformer() throws IOException
    {
        super("forge_at.cfg");
    }
}

And for as to why your coremod isnt loading, you need to pass in the proper environment parameters. fml.coreMods.load

 

After looking around more, I found I needed to add the environment parameters. I also found a tutorial, but I'm having trouble replacing the instructions. Here is the link: http://www.minecraftforum.net/topic/1854988-tutorial-152161-changing-vanilla-without-editing-base-classes-coremods-and-events-very-advanced/ If you could help, that would still be great. (PS I downloaded the bytecode addon for eclipse, but after a bit of trying, I haven't' had any luck :( )

I also changed my code from above, and here it is:

package DHNCore.asm;

import static org.objectweb.asm.Opcodes.FDIV;

import java.io.IOException;
import java.util.Iterator;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import org.omg.CORBA.portable.InputStream;


public class DHNTransformer implements net.minecraft.launchwrapper.IClassTransformer {
public byte[] patch (String name, byte[] bytes, String obfname, String iFile, String rname) throws IOException
{
	ClassNode cn = new ClassNode();
	ClassReader cr = new ClassReader(bytes);

	java.io.InputStream in = DHNTransformer.class.getResourceAsStream("/DHNCore/asm/Methods.class");
	ClassNode cnr = new ClassNode();
	ClassReader crr = new ClassReader(in);
	crr.accept(cnr, 0);
	cr.accept(cn, 0);
	Iterator<MethodNode> methods = cn.methods.iterator();
	Iterator<MethodNode> methodsr = cnr.methods.iterator();
	MethodNode mnr = null;
	while (methodsr.hasNext())
	{
		MethodNode temp = methodsr.next();
		System.out.printf("Methods that can be used to replaced are: %s %n", temp.name);
		if (temp.name.equals("rname"))
		{
			mnr = temp;
		}
	}

	while(methods.hasNext())
	{
		MethodNode mn = methods.next();
		System.out.printf("METHOD FOUND: %s %n",mn.name);
		if (mn.name.equals(name) || mn.name.equals(obfname))
			{
			//begin patching
			System.out.printf("Beginning the patching of the method %s %n",name);
			//patching jargin here
			mn.instructions = mnr.instructions;
			System.out.printf("Pathcing has been completed %n");
			}
	}
	ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
	cn.accept(cw);

	return cw.toByteArray();

}
@Override
public byte[] transform(String arg0, String arg1, byte[] arg2) 
{
	if (arg0.equals("bgy")) {
		System.out.println("Doing RenderPlayer transformers in a obfuscated environment");

		}

		if (arg0.equals("net.minecraft.client.renderer.entity.RenderPlayer")) {
		System.out.println("Doing RenderPlayer transformers in a de-obfuscated environment");
		try {
			return patch("renderFirstPersonArm", arg2, "","","renderFirstPersonArm");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	return arg2;

}


}

 

Link to comment
Share on other sites

I did some reading up, and I figured out the problem. My end goal was to replace a function in the jar with a function I can write anywhere in the rest of my mod. I achieved exactly what I needed to, thank you for all your help.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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