Skip to content

Commit 4babc39

Browse files
authored
Merge pull request #371 from jchung01/memory-leaks
Fix memory leaks for CB Multipart, MrTJPCore, Thaumic Wonders
2 parents 89b5c1f + fc886cb commit 4babc39

14 files changed

+235
-18
lines changed

README.md

+18-11
Original file line numberDiff line numberDiff line change
@@ -208,30 +208,34 @@ All changes are toggleable via config files.
208208
### **⚙️ MOD INTEGRATION**
209209

210210
* **AbyssalCraft**
211-
* **Optimized Item Transport:** Makes an optimization to reduce tick overhead of AbyssalCraft's item transport system
211+
* **Optimized Item Transport:** Optimizes AbyssalCraft's item transport system to reduce tick overhead
212212
* **Actually Additions**
213213
* **Duplication Fixes:** Fixes various duplication exploits
214214
* **Advent of Ascension**
215-
* **Inventory-less GUI Compatibility:** Fixes AoA player ticking in certain GUIs without player inventories (i.e. Flux Networks GUI)
215+
* **Inventory-less GUI Compatibility:** Fixes AoA player ticking in certain GUIs without player inventories (i.e. Flux Networks, Nuclearcraft)
216216
* **Arcane Archives**
217217
* **Duplication Fixes:** Fixes various duplication exploits
218-
* **Blood Magic**
219-
* **Duplication Fixes:** Fixes various duplication exploits
220-
* **Optimized Hellfire Forge:** Optimizes the Hellfire/Soul Forge to reduce tick time
221-
* **World Unload Memory Leak Fix:** Fixes memory leak related to unloading worlds/switching dimensions
222218
* **Binnie's Mods**
223219
* **Gather Windfall:** Allows Forestry farms to pick up ExtraTrees fruit
224220
* **Biomes O' Plenty**
225221
* **Hot Spring Water:** Fixes rapid inflection of regeneration effects in hot spring water
222+
* **Blood Magic**
223+
* **Duplication Fixes:** Fixes various duplication exploits
224+
* **Optimized Hellfire Forge:** Optimizes the Hellfire/Soul Forge to reduce tick time
225+
* **World Unload Memory Leak Fix:** Fixes memory leak when unloading worlds/switching dimensions
226226
* **Botania**
227227
* **Duplication Fixes:** Fixes various duplication exploits
228228
* **Fancy Skybox:** Enables the Botania Garden of Glass skybox for custom dimensions
229+
* **CB Multipart**
230+
* **Memory Leak Fix:** Fixes a memory leak associated with EntityPlayer
229231
* **Chisel**
230232
* **Duplication Fixes:** Fixes various duplication exploits
231-
* **CoFH Core**
232-
* **Vorpal Enchantment Damage:** Sets the damage multiplier of the Vorpal enchantment
233233
* **Chocolate Quest Repoured**
234234
* **Legacy Golden Feather:** Restores the golden feather behavior from the original Better Dungeons mod
235+
* **CoFH Core**
236+
* **Vorpal Enchantment Damage:** Sets the damage multiplier of the Vorpal enchantment
237+
* **Compact Machines**
238+
* **Invisible Wall Render Fix:** Fixes some compact machine walls being invisible if [Nothirium](https://www.curseforge.com/minecraft/mc-mods/nothirium) 0.2.x (and up) or [Vintagium](https://github.com/Asek3/sodium-1.12) is installed
235239
* **Elementary Staffs**
236240
* **Electric Staff Port:** Reintroduces the 1.5 electric staff behavior along with some subtle particles
237241
* **Elenai Dodge 2**
@@ -262,18 +266,20 @@ All changes are toggleable via config files.
262266
* **Duplication Fixes:** Fixes various duplication exploits
263267
* **Mob Stages**
264268
* **Spawning Rules Fixes:** Fixes mob replacement ignoring entity spawning rules
269+
* **MrTJPCore**
270+
* **Memory Leak Fix:** Fixes a memory leak associated with EntityPlayer
265271
* **Nether Chest**
266272
* **Duplication Fixes:** Fixes various duplication exploits
267273
* **Netherrocks**
268274
* **Right Click Harvesting Fix:** Prevents crashing with mods implementing right click crop harvesting
269275
* **NuclearCraft**
270-
* **Radiation Environment Map:** Changes the data table of the radiation environment handler to improve performance
276+
* **Radiation Environment Map:** Changes the data table of the radiation environment handler to improve tick time
271277
* **ProjectRed**
272278
* **Duplication Fixes:** Fixes various duplication exploits
273279
* **Quark**
274280
* **Duplication Fixes:** Fixes various duplication exploits
275281
* **Roost**
276-
* **Early Register CT Chickens:** Improves load time by registering CT chickens early for Roost to detect them
282+
* **Early Register CT Chickens:** Improves load time by registering ContentTweaker chickens early for Roost to detect them
277283
* **Simple Difficulty**
278284
* **Iron Canteen Interaction Fix:** Fixes the interaction of iron canteens with rain collectors
279285
* **Simply Jetpacks**
@@ -299,6 +305,7 @@ All changes are toggleable via config files.
299305
* **Wisp Particles:** Increases particle size of wisps similar to legacy versions
300306
* **Thaumic Wonders**
301307
* **Duplication Fixes:** Fixes various duplication exploits
308+
* **Memory Leak Fix:** Fixes a client-side memory leak when wearing Void Fortress armor
302309
* **The Erebus**
303310
* **Preserved Blocks Fix:** Prevents HWYLA/TOP crashes with preserved blocks
304311
* **The Farlanders**
@@ -313,6 +320,6 @@ All changes are toggleable via config files.
313320
* **Offhand Shuriken:** Suppresses special abilities of long swords and rapiers when shurikens are wielded in the offhand
314321
* **Ore Dictionary Cache:** Caches all ore dictionary smelting recipes to speed up game loading
315322
* **Projectile Despawning:** Despawns unbreakable projectiles faster to improve framerates
316-
* **Tool Customization:** Sets the attack damage cutoff at which diminishing returns start and sets the rate at which a tool's attack damage incrementally decays depending on its damage cutoff for any Tinkers' tool
323+
* **Tool Customization:** Sets the attack damage cutoff at which diminishing returns start for any Tinkers' tool and sets the rate at which a tool's attack damage incrementally decays depending on its damage cutoff
317324
* **Tiny Progressions**
318325
* **Duplication Fixes:** Fixes various duplication exploits

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ dependencies {
175175
compileOnly 'curse.maven:endercore-231868:2972849'
176176
compileOnly 'curse.maven:enderio-64578:2989201'
177177
compileOnly 'curse.maven:extrautilities-225561:2678374'
178-
compileOnly 'curse.maven:forgemultipartcbe-258426:2755790'
178+
compileOnly 'curse.maven:forgemultipartcbe-258426:2755790' // aka "CB Multipart"
179179
compileOnly 'curse.maven:guideapi-228832:2645992'
180180
compileOnly 'curse.maven:industrialcraft-242638:3078604'
181181
compileOnly 'curse.maven:ironbackpacks-227049:2564573'

src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java

+35-6
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public class UTConfigMods
4343
@Config.Name("Botania")
4444
public static final BotaniaCategory BOTANIA = new BotaniaCategory();
4545

46+
@Config.LangKey("cfg.universaltweaks.modintegration.cbmultipart")
47+
@Config.Name("CB Multipart/Forge Multipart CBE")
48+
public static final CBMultipartCategory CB_MULTIPART = new CBMultipartCategory();
49+
4650
@Config.LangKey("cfg.universaltweaks.modintegration.chisel")
4751
@Config.Name("Chisel")
4852
public static final ChiselCategory CHISEL = new ChiselCategory();
@@ -111,6 +115,10 @@ public class UTConfigMods
111115
@Config.Name("Mob Stages")
112116
public static final MobStagesCategory MOB_STAGES = new MobStagesCategory();
113117

118+
@Config.LangKey("cfg.universaltweaks.modintegration.mrtjpcore")
119+
@Config.Name("MrTJPCore")
120+
public static final MrTJPCoreCategory MRTJPCORE = new MrTJPCoreCategory();
121+
114122
@Config.LangKey("cfg.universaltweaks.modintegration.netherchest")
115123
@Config.Name("Nether Chest")
116124
public static final NetherChestCategory NETHER_CHEST = new NetherChestCategory();
@@ -195,7 +203,7 @@ public static class AbyssalCraftCategory
195203
{
196204
@Config.RequiresMcRestart
197205
@Config.Name("Optimized Item Transport")
198-
@Config.Comment("Makes an optimization to reduce tick overhead of AbyssalCraft's item transport system")
206+
@Config.Comment("Optimizes AbyssalCraft's item transport system to reduce tick overhead")
199207
public boolean utOptimizedItemTransferToggle = true;
200208
}
201209

@@ -219,7 +227,7 @@ public static class AOACategory
219227
{
220228
@Config.RequiresMcRestart
221229
@Config.Name("Inventory-less GUI Compatibility")
222-
@Config.Comment("Fixes AoA player ticking in certain GUIs without player inventories (i.e. Flux Networks GUI)")
230+
@Config.Comment("Fixes AoA player ticking in certain GUIs without player inventories (i.e. Flux Networks, Nuclearcraft)")
223231
public boolean utFixPlayerTickInInventorylessGui = false;
224232
}
225233

@@ -240,7 +248,7 @@ public static class BloodMagicCategory
240248

241249
@Config.RequiresMcRestart
242250
@Config.Name("World Unload Memory Leak Fix")
243-
@Config.Comment("Fixes memory leak related to unloading worlds/switching dimensions")
251+
@Config.Comment("Fixes memory leak when unloading worlds/switching dimensions")
244252
public boolean utBMWorldUnloadToggle = true;
245253

246254
@Config.RequiresMcRestart
@@ -267,6 +275,14 @@ public static class BotaniaCategory
267275
public boolean utDuplicationFixesToggle = true;
268276
}
269277

278+
public static class CBMultipartCategory
279+
{
280+
@Config.RequiresMcRestart
281+
@Config.Name("Memory Leak Fix")
282+
@Config.Comment("Fixes a memory leak associated with EntityPlayer")
283+
public boolean utMemoryLeakFixToggle = true;
284+
}
285+
270286
public static class ChiselCategory
271287
{
272288
@Config.RequiresMcRestart
@@ -294,7 +310,7 @@ public static class CompactMachinesCoreCategory
294310
{
295311
@Config.RequiresMcRestart
296312
@Config.Name("Invisible Wall Render Fix")
297-
@Config.Comment("Fixes some compact machine walls being invisible if Nothirium 0.2.x+ or Vintagium is installed")
313+
@Config.Comment("Fixes some compact machine walls being invisible if Nothirium 0.2.x (and up) or Vintagium is installed")
298314
public boolean utCMRenderFixToggle = true;
299315
}
300316

@@ -460,6 +476,14 @@ public static class MobStagesCategory
460476
public boolean utSpawningRules = true;
461477
}
462478

479+
public static class MrTJPCoreCategory
480+
{
481+
@Config.RequiresMcRestart
482+
@Config.Name("Memory Leak Fix")
483+
@Config.Comment("Fixes a memory leak associated with EntityPlayer")
484+
public boolean utMemoryLeakFixToggle = true;
485+
}
486+
463487
public static class NetherChestCategory
464488
{
465489
@Config.RequiresMcRestart
@@ -482,7 +506,7 @@ public static class NuclearCraftCategory
482506
@Config.Name("Radiation Environment Map")
483507
@Config.Comment
484508
({
485-
"Changes the data table of the radiation environment handler to improve performance",
509+
"Changes the data table of the radiation environment handler to improve tick time",
486510
"CONCURRENT_HASHMAP: NuclearCraft default",
487511
"CONCURRENT_LINKED_HASHMAP: Keeps order of radiation environment info to improve iteration - Better performance",
488512
"CONCURRENT_LINKED_QUEUE: Uses a queue to avoid iteration - Best performance"
@@ -519,7 +543,7 @@ public static class RoostCategory
519543
@Config.Name("ContentTweaker: Early Register CT Chickens")
520544
@Config.Comment
521545
({
522-
"Improves load time by registering CT chickens early for Roost to detect them",
546+
"Improves load time by registering ContentTweaker chickens early for Roost to detect them",
523547
"Note: If you would like to use ContentTweaker's MaterialSystem Parts for the layed item, in your script you must:",
524548
"1) Use '#loader finalize_contenttweaker', not '#loader contenttweaker'",
525549
"2) Use the Material Part Bracket Handler to reference the item"
@@ -718,6 +742,11 @@ public static class ThaumicWondersCategory
718742
@Config.Name("Duplication Fixes")
719743
@Config.Comment("Fixes various duplication exploits")
720744
public boolean utDuplicationFixesToggle = true;
745+
746+
@Config.RequiresMcRestart
747+
@Config.Name("Memory Leak Fix")
748+
@Config.Comment("Fixes a client-side memory leak when wearing Void Fortress armor")
749+
public boolean utMemoryLeakFixToggle = true;
721750
}
722751

723752
public static class TheFarlandersCategory

src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java

+12
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ public List<String> getMixinConfigs()
1818
if (UTLoadingPlugin.isClient)
1919
{
2020
configs.add("mixins.mods.aoa3.json");
21+
configs.add("mixins.mods.cbmultipart.client.json");
2122
configs.add("mixins.mods.compactmachines.json");
2223
configs.add("mixins.mods.crafttweaker.json");
2324
configs.add("mixins.mods.roost.json");
2425
configs.add("mixins.mods.storagedrawers.client.json");
2526
configs.add("mixins.mods.thaumcraft.entities.client.json");
27+
configs.add("mixins.mods.thaumicwonders.client.json");
2628
}
2729
// COMMON
2830
configs.add("mixins.mods.abyssalcraft.json");
@@ -33,6 +35,7 @@ public List<String> getMixinConfigs()
3335
configs.add("mixins.mods.bloodmagic.json");
3436
configs.add("mixins.mods.botania.dupes.json");
3537
configs.add("mixins.mods.botania.json");
38+
configs.add("mixins.mods.cbmultipart.json");
3639
configs.add("mixins.mods.ceramics.json");
3740
configs.add("mixins.mods.chisel.tcomplement.dupes.json");
3841
configs.add("mixins.mods.cofhcore.json");
@@ -54,6 +57,7 @@ public List<String> getMixinConfigs()
5457
configs.add("mixins.mods.itemstages.json");
5558
configs.add("mixins.mods.mekanism.dupes.json");
5659
configs.add("mixins.mods.mobstages.json");
60+
configs.add("mixins.mods.mrtjpcore.json");
5761
configs.add("mixins.mods.netherchest.dupes.json");
5862
configs.add("mixins.mods.netherrocks.json");
5963
configs.add("mixins.mods.nuclearcraft.json");
@@ -90,6 +94,8 @@ public boolean shouldMixinConfigQueue(String mixinConfig)
9094
{
9195
case "mixins.mods.aoa3.json":
9296
return Loader.isModLoaded("aoa3") && (Loader.isModLoaded("fluxnetworks") || Loader.isModLoaded("nuclearcraft"));
97+
case "mixins.mods.cbmultipart.client.json":
98+
return Loader.isModLoaded("forgemultipartcbe") && UTConfigMods.CB_MULTIPART.utMemoryLeakFixToggle;
9399
case "mixins.mods.compactmachines.json":
94100
return Loader.isModLoaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utCMRenderFixToggle;
95101
case "mixins.mods.crafttweaker.json":
@@ -100,6 +106,8 @@ public boolean shouldMixinConfigQueue(String mixinConfig)
100106
return Loader.isModLoaded("storagedrawers");
101107
case "mixins.mods.thaumcraft.entities.client.json":
102108
return Loader.isModLoaded("thaumcraft");
109+
case "mixins.mods.thaumicwonders.client.json":
110+
return Loader.isModLoaded("thaumicwonders") && UTConfigMods.THAUMIC_WONDERS.utMemoryLeakFixToggle;
103111
}
104112
}
105113
switch (mixinConfig)
@@ -120,6 +128,8 @@ public boolean shouldMixinConfigQueue(String mixinConfig)
120128
return Loader.isModLoaded("botania");
121129
case "mixins.mods.botania.dupes.json":
122130
return Loader.isModLoaded("botania") && UTConfigMods.BOTANIA.utDuplicationFixesToggle;
131+
case "mixins.mods.cbmultipart.json":
132+
return Loader.isModLoaded("forgemultipartcbe") && UTConfigMods.CB_MULTIPART.utMemoryLeakFixToggle;
123133
case "mixins.mods.ceramics.json":
124134
return Loader.isModLoaded("ceramics");
125135
case "mixins.mods.cofhcore.json":
@@ -160,6 +170,8 @@ public boolean shouldMixinConfigQueue(String mixinConfig)
160170
return Loader.isModLoaded("mekanism") && UTConfigMods.MEKANISM.utDuplicationFixesToggle;
161171
case "mixins.mods.mobstages.json":
162172
return Loader.isModLoaded("mobstages");
173+
case "mixins.mods.mrtjpcore.json":
174+
return Loader.isModLoaded("mrtjpcore") && UTConfigMods.MRTJPCORE.utMemoryLeakFixToggle;
163175
case "mixins.mods.netherchest.dupes.json":
164176
return Loader.isModLoaded("netherchest") && UTConfigMods.NETHER_CHEST.utDuplicationFixesToggle;
165177
case "mixins.mods.netherrocks.json":
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package mod.acgaming.universaltweaks.mods.cbmultipart.mixin;
2+
3+
import net.minecraft.entity.player.EntityPlayer;
4+
5+
import codechicken.multipart.ControlKeyHandler$;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.ModifyArg;
9+
10+
// Courtesy of jchung01
11+
@Mixin(value = ControlKeyHandler$.class, remap = false)
12+
public class UTControlKeyHandlerMixin
13+
{
14+
@ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lscala/collection/mutable/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Lscala/Option;"), index = 0)
15+
private Object utPutWithUUID(Object playerObj)
16+
{
17+
return ((EntityPlayer) playerObj).getUniqueID();
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package mod.acgaming.universaltweaks.mods.cbmultipart.mixin;
2+
3+
import java.util.UUID;
4+
5+
import net.minecraft.entity.player.EntityPlayer;
6+
7+
import codechicken.multipart.ControlKeyModifer;
8+
import codechicken.multipart.ControlKeyModifer$;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Mutable;
12+
import org.spongepowered.asm.mixin.Shadow;
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.ModifyArg;
17+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
18+
19+
// Courtesy of jchung01
20+
/**
21+
* Note: To my knowledge, {@link ControlKeyModifer#isControlDown(EntityPlayer)} is never called in any mod, so this mixin isn't very useful.
22+
*/
23+
@Mixin(value = ControlKeyModifer.ControlKeyValue.class, remap = false)
24+
public class UTControlKeyValueMixin
25+
{
26+
@Final
27+
@Mutable
28+
@Shadow
29+
private EntityPlayer p;
30+
@Unique
31+
private UUID universalTweaks$id;
32+
33+
@Inject(method = "<init>", at = @At(value = "RETURN"))
34+
private void utSetUUID(EntityPlayer p, CallbackInfo ci)
35+
{
36+
universalTweaks$id = p.getUniqueID();
37+
this.p = null;
38+
}
39+
40+
/**
41+
* @see ControlKeyModifer$#isControlDown(EntityPlayer) for where this is called
42+
*/
43+
@ModifyArg(method = "isControlDown", at = @At(value = "INVOKE", target = "Lscala/collection/mutable/Map;apply(Ljava/lang/Object;)Ljava/lang/Object;"))
44+
private Object utGetByUUID(Object thisPlayer)
45+
{
46+
return universalTweaks$id;
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package mod.acgaming.universaltweaks.mods.cbmultipart.mixin;
2+
3+
import net.minecraft.entity.player.EntityPlayer;
4+
5+
import codechicken.multipart.handler.MultipartSPH$;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.ModifyArg;
9+
10+
// Courtesy of jchung01
11+
@Mixin(value = MultipartSPH$.class, remap = false)
12+
public class UTMultipartSPHMixin
13+
{
14+
@ModifyArg(method = "handlePacket", at = @At(value = "INVOKE", target = "Lscala/collection/mutable/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Lscala/Option;"), index = 0)
15+
private Object utPutWithUUID(Object senderObj)
16+
{
17+
return ((EntityPlayer) senderObj).getUniqueID();
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package mod.acgaming.universaltweaks.mods.mrtjpcore.mixin;
2+
3+
import net.minecraft.entity.player.EntityPlayer;
4+
5+
import mrtjp.core.data.KeyTracking$;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.ModifyArg;
9+
10+
// Courtesy of jchung01
11+
@Mixin(value = KeyTracking$.class, remap = false)
12+
public class UTKeyTrackingMixin
13+
{
14+
@ModifyArg(method = "updatePlayerKey", at = @At(value = "INVOKE", target = "Lscala/Predef$;ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;"))
15+
private Object utUpdateUUIDKey(Object playerObj)
16+
{
17+
// Set key as UUID, not EntityPlayer
18+
return ((EntityPlayer) playerObj).getUniqueID();
19+
}
20+
21+
@ModifyArg(method = "isKeyDown", at = @At(value = "INVOKE", target = "Lscala/collection/MapLike;apply(Ljava/lang/Object;)Ljava/lang/Object;"), index = 0)
22+
private Object utIsKeyDownForUUID(Object playerObj)
23+
{
24+
// Get value using UUID key
25+
return ((EntityPlayer) playerObj).getUniqueID();
26+
}
27+
}

0 commit comments

Comments
 (0)