Skip to content

Commit 22cffb4

Browse files
authored
Fix EID incompatibilities for IC2, BoP, Witchery (#891)
1 parent 2837e27 commit 22cffb4

5 files changed

Lines changed: 175 additions & 1 deletion

File tree

src/main/java/com/mitchej123/hodgepodge/config/FixesConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,10 @@ public class FixesConfig {
546546
@Config.DefaultBoolean(true)
547547
public static boolean fixBOPCascadingKelp;
548548

549+
@Config.Comment("Fix EndlessIds incompatibility with BoP")
550+
@Config.DefaultBoolean(true)
551+
public static boolean fixBoPEid;
552+
549553
// Candycraft
550554

551555
@Config.Comment("Fix NPE when interacting with sugar block")
@@ -724,6 +728,10 @@ public class FixesConfig {
724728
@Config.DefaultBoolean(true)
725729
public static boolean fixIc2TinCan;
726730

731+
@Config.Comment("Fix EndlessIds incompatibility with IC2")
732+
@Config.DefaultBoolean(true)
733+
public static boolean fixIc2Eid;
734+
727735
// Journey Map
728736

729737
@Config.Comment("Prevents journeymap from using illegal character in file paths")
@@ -876,6 +884,10 @@ public class FixesConfig {
876884
@Config.DefaultBoolean(true)
877885
public static boolean fixWitcheryDemonShiftClick;
878886

887+
@Config.Comment("Fix EndlessIds incompatibility with Witchery")
888+
@Config.DefaultBoolean(true)
889+
public static boolean fixWitcheryEid;
890+
879891
// Xaero's Minimap
880892
@Config.Comment("Fixes the player entity dot rendering when arrow is chosen")
881893
@Config.DefaultBoolean(true)

src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,12 +1156,19 @@ public enum Mixins implements IMixins {
11561156
.setApplyIf(() -> FixesConfig.fixIc2KeybindsIgnoreKeyState)
11571157
.addRequiredMod(TargetedMod.IC2)
11581158
.setPhase(Phase.LATE)),
1159-
// endregion
11601159
IC2_TIN_CAN(new MixinBuilder("Fix IC2 filled tin cans not running logic on both client and server")
11611160
.addCommonMixins("ic2.MixinIc2TinCan")
11621161
.setApplyIf(() -> FixesConfig.fixIc2TinCan)
11631162
.addRequiredMod(TargetedMod.IC2)
11641163
.setPhase(Phase.LATE)),
1164+
IC2_EID_COMPAT(new MixinBuilder("Fix EndlessIds incompatibility with IC2")
1165+
.addCommonMixins("ic2.MixinIC2TileEntityTerra_EIDCompat")
1166+
.setApplyIf(() -> FixesConfig.fixIc2Eid)
1167+
.addRequiredMod(TargetedMod.IC2)
1168+
.addRequiredMod(TargetedMod.ENDLESSIDS)
1169+
.setPhase(Phase.LATE)),
1170+
// endregion
1171+
11651172

11661173
// Disable update checkers
11671174
COFH_CORE_UPDATE_CHECK(new MixinBuilder("Yeet COFH Core Update Check")
@@ -1407,6 +1414,12 @@ public enum Mixins implements IMixins {
14071414
.setApplyIf(() -> FixesConfig.fixBOPCascadingKelp)
14081415
.addRequiredMod(TargetedMod.BOP)
14091416
.setPhase(Phase.LATE)),
1417+
BOP_EID_COMPAT(new MixinBuilder("Fix EndlessIds incompatibility with BoP")
1418+
.addCommonMixins("biomesoplenty.MixinBOPBiomeUtils_EIDCompat")
1419+
.setApplyIf(() -> FixesConfig.fixBoPEid)
1420+
.addRequiredMod(TargetedMod.BOP)
1421+
.addRequiredMod(TargetedMod.ENDLESSIDS)
1422+
.setPhase(Phase.LATE)),
14101423

14111424
// Bibliowood Recipe Fix
14121425
BIBLIOWOODS_RECIPE_FIX(new MixinBuilder("Fixes Bibliowoods Forestry recipes")
@@ -1787,6 +1800,12 @@ public enum Mixins implements IMixins {
17871800
.setApplyIf(() -> MemoryConfig.allocs.fixWitcheryEnumValuesSpam)
17881801
.addRequiredMod(TargetedMod.WITCHERY)
17891802
.setPhase(Phase.LATE)),
1803+
WITCHERY_EID_COMPAT(new MixinBuilder()
1804+
.addCommonMixins("witchery.MixinRiteClimateChange_EIDCompat")
1805+
.setApplyIf(() -> FixesConfig.fixWitcheryEid)
1806+
.addRequiredMod(TargetedMod.WITCHERY)
1807+
.addRequiredMod(TargetedMod.ENDLESSIDS)
1808+
.setPhase(Phase.LATE)),
17901809

17911810
// Various Exploits/Fixes
17921811
BIBLIOCRAFT_PACKET_FIX(new MixinBuilder("Packet Fix")
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.mitchej123.hodgepodge.mixins.late.biomesoplenty;
2+
3+
import net.minecraft.world.World;
4+
import net.minecraft.world.biome.BiomeGenBase;
5+
import net.minecraft.world.chunk.Chunk;
6+
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Overwrite;
9+
10+
import com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook;
11+
12+
import biomesoplenty.common.utils.BiomeUtils;
13+
14+
@Mixin(BiomeUtils.class)
15+
public class MixinBOPBiomeUtils_EIDCompat {
16+
17+
/**
18+
* @author tiffit
19+
* @reason EID compat
20+
*/
21+
@Overwrite(remap = false)
22+
public static void setBiomeAt(World world, int x, int z, BiomeGenBase biome) {
23+
Chunk chunk = world.getChunkFromBlockCoords(x, z);
24+
short[] array = ((ChunkBiomeHook) chunk).getBiomeShortArray();
25+
array[(z & 15) << 4 | x & 15] = (short) (biome.biomeID & 0xff_ff);
26+
((ChunkBiomeHook) chunk).setBiomeShortArray(array);
27+
}
28+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.mitchej123.hodgepodge.mixins.late.ic2;
2+
3+
import net.minecraft.world.World;
4+
import net.minecraft.world.biome.BiomeGenBase;
5+
import net.minecraft.world.chunk.Chunk;
6+
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Overwrite;
9+
10+
import com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook;
11+
12+
import ic2.core.block.machine.tileentity.TileEntityTerra;
13+
14+
@Mixin(TileEntityTerra.class)
15+
public class MixinIC2TileEntityTerra_EIDCompat {
16+
17+
/**
18+
* @author tiffit
19+
* @reason EID compat
20+
*/
21+
@Overwrite(remap = false)
22+
public static void setBiomeAt(World world, int x, int z, BiomeGenBase biome) {
23+
Chunk chunk = world.getChunkFromBlockCoords(x, z);
24+
short[] array = ((ChunkBiomeHook) chunk).getBiomeShortArray();
25+
array[(z & 15) << 4 | x & 15] = (short) (biome.biomeID & 0xff_ff);
26+
((ChunkBiomeHook) chunk).setBiomeShortArray(array);
27+
}
28+
29+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.mitchej123.hodgepodge.mixins.late.witchery;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import net.minecraft.init.Blocks;
8+
import net.minecraft.world.World;
9+
import net.minecraft.world.chunk.Chunk;
10+
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Overwrite;
13+
import org.spongepowered.asm.mixin.Unique;
14+
import org.spongepowered.asm.mixin.injection.At;
15+
import org.spongepowered.asm.mixin.injection.Inject;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
17+
18+
import com.emoniph.witchery.blocks.BlockCircle.TileEntityCircle.ActivatedRitual;
19+
import com.emoniph.witchery.ritual.RitualStep.Result;
20+
import com.emoniph.witchery.ritual.rites.RiteClimateChange;
21+
import com.emoniph.witchery.ritual.rites.RiteClimateChange.WeatherChange;
22+
import com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook;
23+
import com.llamalad7.mixinextras.sugar.Local;
24+
25+
import it.unimi.dsi.fastutil.ints.IntIntImmutablePair;
26+
import it.unimi.dsi.fastutil.ints.IntIntPair;
27+
28+
@Mixin(targets = { "com.emoniph.witchery.ritual.rites.RiteClimateChange$StepClimateChange" })
29+
public class MixinRiteClimateChange_EIDCompat {
30+
31+
@Unique
32+
private Map<IntIntPair, short[]> hodgepodge$biomeOverrides;
33+
34+
@Inject(method = "process", at = @At(value = "HEAD"), remap = false)
35+
private void hodgepodge$setBiomeOverrides(World world, int posX, int posY, int posZ, long ticks,
36+
ActivatedRitual ritual, CallbackInfoReturnable<Result> cir) {
37+
hodgepodge$biomeOverrides = new HashMap<>();
38+
}
39+
40+
@Inject(
41+
method = "process",
42+
at = @At(
43+
value = "INVOKE",
44+
target = "Lnet/minecraft/network/play/server/S26PacketMapChunkBulk;<init>(Ljava/util/List;)V"))
45+
private void hodgepodge$setBiomeArrayProperly(World world, int posX, int posY, int posZ, long ticks,
46+
ActivatedRitual ritual, CallbackInfoReturnable<Result> cir,
47+
@Local(name = "chunks") ArrayList<Chunk> chunks) {
48+
for (Map.Entry<IntIntPair, short[]> entry : hodgepodge$biomeOverrides.entrySet()) {
49+
IntIntPair chunkCoords = entry.getKey();
50+
Chunk chunk = world.getChunkFromChunkCoords(chunkCoords.leftInt(), chunkCoords.rightInt());
51+
((ChunkBiomeHook) chunk).setBiomeShortArray(entry.getValue());
52+
chunks.add(chunk);
53+
}
54+
hodgepodge$biomeOverrides = null;
55+
}
56+
57+
/**
58+
* @author tiffit
59+
* @reason use EID biome arrays
60+
*
61+
* The chunkMap is ignored in favor of hodgepodge$biomeOverrides
62+
*/
63+
@Overwrite(remap = false)
64+
protected void drawLine(World world, int x1, int x2, int z, HashMap<?, byte[]> chunkMap, WeatherChange weather,
65+
int biomeID) {
66+
for (int x = x1; x <= x2; ++x) {
67+
IntIntPair coord = IntIntImmutablePair.of(x >> 4, z >> 4);
68+
short[] map = hodgepodge$biomeOverrides.get(coord);
69+
if (map == null) {
70+
Chunk chunk = world.getChunkFromBlockCoords(x, z);
71+
map = ((ChunkBiomeHook) chunk).getBiomeShortArray().clone();
72+
hodgepodge$biomeOverrides.put(coord, map);
73+
}
74+
75+
map[(z & 15) << 4 | x & 15] = (short) biomeID;
76+
if (weather == RiteClimateChange.WeatherChange.SUN) {
77+
int y = world.getTopSolidOrLiquidBlock(x, z);
78+
if (world.getBlock(x, y, z) == Blocks.snow) {
79+
world.setBlockToAir(x, y, z);
80+
}
81+
}
82+
}
83+
84+
}
85+
86+
}

0 commit comments

Comments
 (0)