-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
TickThreading.java
78 lines (70 loc) · 3.53 KB
/
TickThreading.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package me.nallar.tickthreading.minecraft;
import java.lang.reflect.Field;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import me.nallar.tickthreading.Log;
import me.nallar.tickthreading.minecraft.entitylist.LoadedEntityList;
import me.nallar.tickthreading.minecraft.entitylist.LoadedTileEntityList;
import me.nallar.tickthreading.minecraft.entitylist.overrideList;
import net.minecraft.src.TileEntity;
import net.minecraft.src.World;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.Property;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.WorldEvent;
@SuppressWarnings ("WeakerAccess")
@Mod (modid = "TickThreading", name = "TickThreading", version = "1.0")
@NetworkMod (clientSideRequired = false, serverSideRequired = false)
public class TickThreading {
// TODO: Not hardcoded field names
private final String loadedTileEntityFieldName = "";
private final String loadedEntityFieldName = "";
private int tileEntityRegionSize = 16;
private int entityRegionSize = 64;
private Configuration config;
@Mod.Init
public void init(FMLInitializationEvent event) {
MinecraftForge.EVENT_BUS.register(this);
}
@Mod.PreInit
public void preInit(FMLPreInitializationEvent event) {
config = new Configuration(event.getSuggestedConfigurationFile());
config.load();
Property tileEntityRegionSizeProperty = config.get(Configuration.CATEGORY_GENERAL, "tileEntityRegionSize", String.valueOf(tileEntityRegionSize));
tileEntityRegionSizeProperty.comment = "width/length of tile entity tick regions, specified in blocks.";
Property entityRegionSizeProperty = config.get(Configuration.CATEGORY_GENERAL, "entityRegionSize", String.valueOf(entityRegionSize));
tileEntityRegionSizeProperty.comment = "width/length of entity tick regions, specified in blocks.";
config.save();
tileEntityRegionSize = tileEntityRegionSizeProperty.getInt(tileEntityRegionSize);
entityRegionSize = entityRegionSizeProperty.getInt(entityRegionSize);
}
@ForgeSubscribe
public void onWorldLoad(WorldEvent.Load event) {
ThreadManager manager = new ThreadManager(event.world, tileEntityRegionSize, entityRegionSize);
try {
Field loadedTileEntityField = World.class.getDeclaredField(loadedTileEntityFieldName);
Field loadedEntityField = World.class.getDeclaredField(loadedEntityFieldName);
new LoadedTileEntityList<TileEntity>(event.world, loadedTileEntityField, manager);
new LoadedEntityList<TileEntity>(event.world, loadedEntityField, manager);
} catch (Exception e) {
Log.severe("Failed to initialise tile threading for world " + event.world.getWorldInfo().getWorldName(), e);
}
}
@ForgeSubscribe
public void onWorldUnload(WorldEvent.Unload event) {
try {
Field loadedTileEntityField = World.class.getDeclaredField(loadedTileEntityFieldName);
Object loadedTileEntityList = loadedTileEntityField.get(event.world);
if (loadedTileEntityList instanceof overrideList) {
((overrideList) loadedTileEntityList).unload();
} else {
Log.severe("Looks like another mod broke threading for world, probably a long time ago: " + event.world.getWorldInfo().getWorldName());
}
} catch (Exception e) {
Log.severe("Probable memory leak: Failed to unload tile threading for world " + event.world.getWorldInfo().getWorldName(), e);
}
}
}