Skip to content

Commit 7fc2114

Browse files
author
asbyth
committed
mod
0 parents  commit 7fc2114

14 files changed

+424
-0
lines changed

.gitignore

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# eclipse
2+
eclipse
3+
bin
4+
*.launch
5+
.settings
6+
.metadata
7+
.classpath
8+
.project
9+
10+
# idea
11+
out
12+
classes
13+
*.ipr
14+
*.iws
15+
*.iml
16+
.idea
17+
18+
# gradle
19+
build
20+
.gradle
21+
22+
#Netbeans
23+
.nb-gradle
24+
.nb-gradle-properties
25+
26+
# other
27+
run
28+
.DS_Store
29+
Thumbs.db

build.gradle

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
buildscript {
2+
repositories {
3+
jcenter()
4+
maven {
5+
name = "forge"
6+
url = "https://files.minecraftforge.net/maven"
7+
}
8+
}
9+
dependencies {
10+
classpath "net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT"
11+
}
12+
}
13+
14+
apply plugin: "net.minecraftforge.gradle.forge"
15+
16+
version = modVersion
17+
group = modGroup
18+
archivesBaseName = modBaseName
19+
20+
sourceCompatibility = targetCompatibility = 1.8
21+
22+
minecraft {
23+
version = project.forgeVersion
24+
runDir = "run"
25+
26+
// the mappings can be changed at any time, and must be in the following format.
27+
// snapshot_YYYYMMDD snapshot are built nightly.
28+
// stable_# stables are built at the discretion of the MCP team.
29+
// Use non-default mappings at your own risk. they may not always work.
30+
// simply re-run your setup task after changing the mappings to update your workspace.
31+
mappings = project.mcpVersion
32+
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
33+
}
34+
35+
repositories {
36+
mavenCentral()
37+
}
38+
39+
dependencies {
40+
}
41+
42+
processResources {
43+
// this will ensure that this task is redone when the versions change.
44+
inputs.property "version", project.version
45+
inputs.property "mcversion", project.minecraft.version
46+
47+
// replace stuff in mcmod.info, nothing else
48+
from(sourceSets.main.resources.srcDirs) {
49+
include "mcmod.info"
50+
51+
// replace version and mcversion
52+
expand "version": project.version, "mcversion": project.minecraft.version
53+
}
54+
55+
// copy everything else, thats not the mcmod.info
56+
from(sourceSets.main.resources.srcDirs) {
57+
exclude "mcmod.info"
58+
}
59+
}
60+
61+
jar {
62+
manifest {
63+
attributes("FMLCorePlugin": "club.sk1er.items.tweaker.ItemTweaker", "ForceLoadAsMod": true, FMLCorePluginContainsFMLMod: true, "ModSide": "CLIENT")
64+
}
65+
}

gradle.properties

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
modGroup=club.sk1er
2+
modVersion=1.0
3+
modBaseName=ItemOptimizations
4+
forgeVersion=1.8.9-11.15.1.2318-1.8.9
5+
mcpVersion=stable_22
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#Fri Jan 10 20:36:02 EST 2020
2+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip
3+
distributionBase=GRADLE_USER_HOME
4+
distributionPath=wrapper/dists
5+
zipStorePath=wrapper/dists
6+
zipStoreBase=GRADLE_USER_HOME

mod_info.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>Item Optimizations provides a minor optimization to item searching & disables the enchantment glint on both potions and enchanted books, allowing for better performance in situations where there could be a lot of them on the ground.</p>

sk1er_mod.properties

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
mod_id=item_optimization
2+
display_name=Item Optimizations
3+
not_complete=false
4+
hide=false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package club.sk1er.items;
2+
3+
import net.minecraftforge.fml.common.Mod;
4+
5+
@Mod(modid = "item_optimization", name = "Item Optimization", version = "1.0")
6+
public class ItemOptimization {
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package club.sk1er.items.asm;
2+
3+
import club.sk1er.items.tweaker.transform.ItemTransformer;
4+
import org.objectweb.asm.Opcodes;
5+
import org.objectweb.asm.tree.ClassNode;
6+
import org.objectweb.asm.tree.FieldInsnNode;
7+
import org.objectweb.asm.tree.InsnList;
8+
import org.objectweb.asm.tree.InsnNode;
9+
import org.objectweb.asm.tree.JumpInsnNode;
10+
import org.objectweb.asm.tree.LabelNode;
11+
import org.objectweb.asm.tree.MethodInsnNode;
12+
import org.objectweb.asm.tree.MethodNode;
13+
import org.objectweb.asm.tree.VarInsnNode;
14+
15+
public class EntityItemTransformer implements ItemTransformer {
16+
@Override
17+
public String[] getClassNames() {
18+
return new String[]{"net.minecraft.entity.item.EntityItem"};
19+
}
20+
21+
@Override
22+
public void transform(ClassNode classNode, String name) {
23+
for (MethodNode methodNode : classNode.methods) {
24+
String methodName = mapMethodName(classNode, methodNode);
25+
26+
if (methodName.equals("searchForOtherItemsNearby") || methodName.equals("func_85054_d")) {
27+
methodNode.instructions.insertBefore(methodNode.instructions.getFirst(), stopSearch());
28+
}
29+
30+
if (methodName.equals("combineItems") || methodName.equals("func_70289_a")) {
31+
methodNode.instructions.insertBefore(methodNode.instructions.getFirst(), stopSearchBoolean());
32+
}
33+
}
34+
}
35+
36+
private InsnList stopSearch() {
37+
InsnList list = new InsnList();
38+
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
39+
list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/item/EntityItem", "func_92059_d",
40+
"()Lnet/minecraft/item/ItemStack;", false));
41+
list.add(new VarInsnNode(Opcodes.ASTORE, 1));
42+
list.add(new VarInsnNode(Opcodes.ALOAD, 1));
43+
list.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/item/ItemStack", "field_77994_a", "I"));
44+
list.add(new VarInsnNode(Opcodes.ALOAD, 1));
45+
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", "func_77976_d", "()I", false));
46+
LabelNode ificmplt = new LabelNode();
47+
list.add(new JumpInsnNode(Opcodes.IF_ICMPLT, ificmplt));
48+
list.add(new InsnNode(Opcodes.RETURN));
49+
list.add(ificmplt);
50+
return list;
51+
}
52+
53+
private InsnList stopSearchBoolean() {
54+
InsnList list = new InsnList();
55+
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
56+
list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/item/EntityItem", "func_92059_d",
57+
"()Lnet/minecraft/item/ItemStack;", false));
58+
list.add(new VarInsnNode(Opcodes.ASTORE, 2));
59+
list.add(new VarInsnNode(Opcodes.ALOAD, 2));
60+
list.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/item/ItemStack", "field_77994_a", "I"));
61+
list.add(new VarInsnNode(Opcodes.ALOAD, 2));
62+
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", "func_77976_d", "()I", false));
63+
LabelNode labelNode = new LabelNode();
64+
list.add(new JumpInsnNode(Opcodes.IF_ICMPLT, labelNode));
65+
list.add(new InsnNode(Opcodes.ICONST_0));
66+
list.add(new InsnNode(Opcodes.IRETURN));
67+
list.add(labelNode);
68+
return list;
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package club.sk1er.items.asm;
2+
3+
import club.sk1er.items.tweaker.transform.ItemTransformer;
4+
import org.objectweb.asm.Opcodes;
5+
import org.objectweb.asm.tree.ClassNode;
6+
import org.objectweb.asm.tree.InsnList;
7+
import org.objectweb.asm.tree.InsnNode;
8+
import org.objectweb.asm.tree.MethodNode;
9+
10+
public class ItemEnchantedBookTransformer implements ItemTransformer {
11+
@Override
12+
public String[] getClassNames() {
13+
return new String[]{"net.minecraft.item.ItemEnchantedBook"};
14+
}
15+
16+
@Override
17+
public void transform(ClassNode classNode, String name) {
18+
for (MethodNode methodNode : classNode.methods) {
19+
String methodName = mapMethodName(classNode, methodNode);
20+
21+
if (methodName.equals("hasEffect") || methodName.equals("func_77636_d")) {
22+
methodNode.instructions.clear();
23+
methodNode.localVariables.clear();
24+
methodNode.instructions.add(returnFalse());
25+
}
26+
}
27+
}
28+
29+
private InsnList returnFalse() {
30+
InsnList list = new InsnList();
31+
list.add(new InsnNode(Opcodes.ICONST_0));
32+
list.add(new InsnNode(Opcodes.IRETURN));
33+
return list;
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package club.sk1er.items.asm;
2+
3+
import club.sk1er.items.tweaker.transform.ItemTransformer;
4+
import org.objectweb.asm.Opcodes;
5+
import org.objectweb.asm.tree.ClassNode;
6+
import org.objectweb.asm.tree.InsnList;
7+
import org.objectweb.asm.tree.InsnNode;
8+
import org.objectweb.asm.tree.MethodNode;
9+
10+
public class ItemPotionTransformer implements ItemTransformer {
11+
@Override
12+
public String[] getClassNames() {
13+
return new String[]{"net.minecraft.item.ItemPotion"};
14+
}
15+
16+
@Override
17+
public void transform(ClassNode classNode, String name) {
18+
for (MethodNode methodNode : classNode.methods) {
19+
String methodName = mapMethodName(classNode, methodNode);
20+
21+
if (methodName.equals("hasEffect") || methodName.equals("func_77636_d")) {
22+
methodNode.instructions.clear();
23+
methodNode.localVariables.clear();
24+
methodNode.instructions.add(returnFalse());
25+
}
26+
}
27+
}
28+
29+
private InsnList returnFalse() {
30+
InsnList list = new InsnList();
31+
list.add(new InsnNode(Opcodes.ICONST_0));
32+
list.add(new InsnNode(Opcodes.IRETURN));
33+
return list;
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package club.sk1er.items.tweaker;
2+
3+
import club.sk1er.items.asm.EntityItemTransformer;
4+
import club.sk1er.items.asm.ItemEnchantedBookTransformer;
5+
import club.sk1er.items.tweaker.transform.ItemTransformer;
6+
import com.google.common.collect.ArrayListMultimap;
7+
import com.google.common.collect.Multimap;
8+
import club.sk1er.items.asm.ItemPotionTransformer;
9+
import net.minecraft.launchwrapper.IClassTransformer;
10+
import org.apache.logging.log4j.LogManager;
11+
import org.apache.logging.log4j.Logger;
12+
import org.objectweb.asm.ClassReader;
13+
import org.objectweb.asm.ClassWriter;
14+
import org.objectweb.asm.tree.ClassNode;
15+
16+
import java.util.Collection;
17+
18+
public class ClassTransformer implements IClassTransformer {
19+
20+
private static final Logger LOGGER = LogManager.getLogger("ItemTransformer");
21+
private final Multimap<String, ItemTransformer> transformerMap = ArrayListMultimap.create();
22+
23+
public ClassTransformer() {
24+
registerTransformer(new EntityItemTransformer());
25+
registerTransformer(new ItemPotionTransformer());
26+
registerTransformer(new ItemEnchantedBookTransformer());
27+
}
28+
29+
private void registerTransformer(ItemTransformer transformer) {
30+
for (String cls : transformer.getClassNames()) {
31+
transformerMap.put(cls, transformer);
32+
}
33+
}
34+
35+
@Override
36+
public byte[] transform(String name, String transformedName, byte[] bytes) {
37+
if (bytes == null) return null;
38+
39+
Collection<ItemTransformer> transformers = transformerMap.get(transformedName);
40+
if (transformers.isEmpty()) return bytes;
41+
42+
LOGGER.info("Found {} transformers for {}", transformers.size(), transformedName);
43+
44+
ClassReader classReader = new ClassReader(bytes);
45+
ClassNode classNode = new ClassNode();
46+
classReader.accept(classNode, ClassReader.EXPAND_FRAMES);
47+
48+
transformers.forEach(transformer -> {
49+
LOGGER.info("Applying transformer {} on {}...", transformer.getClass().getName(), transformedName);
50+
transformer.transform(classNode, transformedName);
51+
});
52+
53+
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
54+
55+
try {
56+
classNode.accept(classWriter);
57+
} catch (Throwable e) {
58+
System.out.println("Exception when transforming " + transformedName + " : " + e.getClass().getSimpleName());
59+
e.printStackTrace();
60+
}
61+
62+
return classWriter.toByteArray();
63+
}
64+
}

0 commit comments

Comments
 (0)