Skip to content

Commit 44fd8e9

Browse files
committed
Malisis Doors compat
#202
1 parent 3de05d0 commit 44fd8e9

6 files changed

Lines changed: 248 additions & 1 deletion

File tree

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ dependencies {
107107
compileOnly(deobfCurse("hbm-ntm-235439:5534354"))
108108
// TechGuns 1.2
109109
compileOnly(deobfCurse("techguns-244201:2429662"))
110+
// Malisis Core 0.14.3
111+
compileOnly(deobfCurse("malisiscore-223896:2283267"))
110112

111113
compileOnly("codechicken:codechickencore-mc1.7.10:1.4.0-mega:dev")
112114
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package com.falsepattern.falsetweaks.mixin.mixins.client.threadedupdates.malisis;
2+
3+
import com.falsepattern.falsetweaks.api.threading.ThreadSafeBlockRenderer;
4+
import net.malisis.core.renderer.IRenderWorldLast;
5+
import net.malisis.core.renderer.MalisisRenderer;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Unique;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
12+
13+
import net.minecraft.block.Block;
14+
import net.minecraft.client.renderer.RenderBlocks;
15+
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
16+
import net.minecraft.item.ItemStack;
17+
import net.minecraft.tileentity.TileEntity;
18+
import net.minecraft.world.IBlockAccess;
19+
20+
import net.minecraftforge.client.IItemRenderer;
21+
import net.minecraftforge.client.event.RenderWorldLastEvent;
22+
23+
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
24+
25+
import java.util.concurrent.atomic.AtomicInteger;
26+
import java.util.concurrent.locks.ReentrantLock;
27+
28+
@Mixin(MalisisRenderer.class)
29+
public abstract class MalisisRendererMixin extends TileEntitySpecialRenderer
30+
implements ISimpleBlockRenderingHandler, IItemRenderer, IRenderWorldLast, ThreadSafeBlockRenderer {
31+
@Unique
32+
private static final ReentrantLock ft$lock = new ReentrantLock();
33+
@Unique
34+
private static final AtomicInteger ft$lockCounter = new AtomicInteger(0);
35+
@Inject(method = "renderInventoryBlock",
36+
at = @At("HEAD"),
37+
remap = false,
38+
require = 1)
39+
private void beginRIB(Block block, int metadata, int modelId, RenderBlocks renderer, CallbackInfo ci) {
40+
ft$lock();
41+
}
42+
43+
@Inject(method = "renderWorldBlock",
44+
at = @At("HEAD"),
45+
remap = false,
46+
require = 1)
47+
private void beginRWB(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer, CallbackInfoReturnable<Boolean> cir) {
48+
ft$lock();
49+
}
50+
51+
@Inject(method = "renderItem",
52+
at = @At("HEAD"),
53+
remap = false,
54+
require = 1)
55+
private void beginRI(IItemRenderer.ItemRenderType type, ItemStack item, Object[] data, CallbackInfo ci) {
56+
ft$lock();
57+
}
58+
59+
@Inject(method = "renderTileEntityAt",
60+
at = @At("HEAD"),
61+
require = 1)
62+
private void beginRTEA(TileEntity te, double x, double y, double z, float partialTick, CallbackInfo ci) {
63+
ft$lock();
64+
}
65+
66+
@Inject(method = "renderWorldLastEvent",
67+
at = @At("HEAD"),
68+
remap = false,
69+
require = 1)
70+
private void beginRWLE(RenderWorldLastEvent event, IBlockAccess world, CallbackInfo ci) {
71+
ft$lock();
72+
}
73+
74+
@Inject(method = "renderInventoryBlock",
75+
at = @At("RETURN"),
76+
remap = false,
77+
require = 1)
78+
private void endRIB(Block block, int metadata, int modelId, RenderBlocks renderer, CallbackInfo ci) {
79+
ft$unlock();
80+
}
81+
82+
@Inject(method = "renderWorldBlock",
83+
at = @At("RETURN"),
84+
remap = false,
85+
require = 1)
86+
private void endRWB(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer, CallbackInfoReturnable<Boolean> cir) {
87+
ft$unlock();
88+
}
89+
90+
@Inject(method = "renderItem",
91+
at = @At("RETURN"),
92+
remap = false,
93+
require = 1)
94+
private void endRI(IItemRenderer.ItemRenderType type, ItemStack item, Object[] data, CallbackInfo ci) {
95+
ft$unlock();
96+
}
97+
98+
@Inject(method = "renderTileEntityAt",
99+
at = @At("RETURN"),
100+
require = 1)
101+
private void endRTEA(TileEntity te, double x, double y, double z, float partialTick, CallbackInfo ci) {
102+
ft$unlock();
103+
}
104+
105+
@Inject(method = "renderWorldLastEvent",
106+
at = @At("RETURN"),
107+
remap = false,
108+
require = 1)
109+
private void endRWLE(RenderWorldLastEvent event, IBlockAccess world, CallbackInfo ci) {
110+
ft$unlock();
111+
}
112+
113+
@Unique
114+
private static void ft$lock() {
115+
if (!ft$lock.isHeldByCurrentThread()) {
116+
while (!ft$lock.tryLock()) {
117+
Thread.yield();
118+
}
119+
}
120+
ft$lockCounter.incrementAndGet();
121+
}
122+
123+
@Unique
124+
private static void ft$unlock() {
125+
if (ft$lockCounter.decrementAndGet() == 0) {
126+
ft$lock.unlock();
127+
}
128+
}
129+
130+
@Override
131+
public ISimpleBlockRenderingHandler forCurrentThread() {
132+
return this;
133+
}
134+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.falsepattern.falsetweaks.mixin.mixins.client.threadedupdates.malisis;
2+
3+
import lombok.val;
4+
import net.malisis.core.renderer.Parameter;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Overwrite;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
9+
@Mixin(value = Parameter.class,
10+
remap = false)
11+
public abstract class ParameterMixin<T> {
12+
@Shadow
13+
private T value;
14+
15+
@Shadow
16+
private T defaultValue;
17+
18+
/**
19+
* @author FalsePattern
20+
* @reason Thread safe
21+
*/
22+
@Overwrite
23+
public T get() {
24+
val v = this.value;
25+
return v != null ? v : defaultValue;
26+
}
27+
28+
/**
29+
* @author FalsePattern
30+
* @reason Thread safe
31+
*/
32+
@Overwrite
33+
public Object get(int index) {
34+
val value = this.value;
35+
if (value == null) {
36+
return null;
37+
}
38+
if (!(value instanceof Object[])) {
39+
throw new IllegalStateException("Trying to access indexed element of non-array Parameter");
40+
}
41+
42+
Object[] v = (Object[]) value;
43+
if (index < 0 || index >= v.length) {
44+
return null;
45+
}
46+
47+
return v[index];
48+
}
49+
50+
/**
51+
* @author FalsePattern
52+
* @reason Thread safe
53+
*/
54+
@Overwrite
55+
public void merge(Parameter<T> parameter) {
56+
val pv = parameter.getValue();
57+
if (pv != null) {
58+
value = pv;
59+
}
60+
}
61+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.falsepattern.falsetweaks.mixin.mixins.client.threadedupdates.malisis.nh;
2+
3+
import lombok.val;
4+
import net.malisis.core.renderer.Parameter;
5+
import org.spongepowered.asm.mixin.Dynamic;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Overwrite;
8+
import org.spongepowered.asm.mixin.Shadow;
9+
10+
@Mixin(value = Parameter.class,
11+
remap = false)
12+
public abstract class ParameterMixin<T> {
13+
@Shadow
14+
private T value;
15+
16+
@Shadow
17+
private T defaultValue;
18+
19+
/**
20+
* @author FalsePattern
21+
* @reason Thread safe
22+
*/
23+
@Dynamic
24+
@Overwrite
25+
public T merged(Parameter<T> other) {
26+
val v = this.value;
27+
@SuppressWarnings("unchecked")
28+
val ov = ((ParameterMixin<T>) (Object) other).value;
29+
if (ov != null) {
30+
return ov;
31+
} else if (v != null) {
32+
return v;
33+
} else {
34+
return defaultValue;
35+
}
36+
}
37+
}

src/main/java/com/falsepattern/falsetweaks/mixin/plugin/standard/Mixin.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,17 @@ public enum Mixin implements IMixin {
236236
ThreadedUpdates_Techguns_RenderLadderMixin(Side.CLIENT,
237237
THREADING.and(require(TargetedMod.TECHGUNS)),
238238
"threadedupdates.techguns.RenderLadderMixin"),
239+
240+
// Malisis Mods
241+
ThreadedUpdates_Malisis_MalisisRendererMixin(Side.CLIENT,
242+
THREADING.and(require(TargetedMod.MALISIS)),
243+
"threadedupdates.malisis.MalisisRendererMixin"),
244+
ThreadedUpdates_Malisis_ParameterMixin(Side.CLIENT,
245+
THREADING.and(require(TargetedMod.MALISIS)),
246+
"threadedupdates.malisis.ParameterMixin"),
247+
ThreadedUpdates_Malisis_NH_ParameterMixin(Side.CLIENT,
248+
THREADING.and(require(TargetedMod.MALISIS_NH)),
249+
"threadedupdates.malisis.nh.ParameterMixin"),
239250
//endregion Threaded Chunk Updates
240251

241252
//region Texture Optimizations Module

src/main/java/com/falsepattern/falsetweaks/mixin/plugin/standard/TargetedMod.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ public enum TargetedMod implements ITargetedMod {
5353
COMPUTRONICS("Computronics", false, contains("Computronics-")),
5454
EXTRA_CELLS("Extra Cells 2", false, contains("ExtraCells-")),
5555
AUTOMAGY("Automagy", false, contains("Automagy-")),
56-
TECHGUNS("Techguns", false, contains("techguns"))
56+
TECHGUNS("Techguns", false, contains("techguns")),
57+
MALISIS("Malisis Mods", false, contains("malisis")),
58+
MALISIS_NH("Malisis Mods NH", false, contains("malisis").and(contains("gtnh"))),
5759
;
5860

5961
public static Predicate<List<ITargetedMod>> REQUIRE_OPTIFINE_WITHOUT_SHADERS = require(OPTIFINE_WITHOUT_SHADERS).or(require(OPTIFINE_WITH_DYNAMIC_LIGHTS));

0 commit comments

Comments
 (0)