-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
TickRegion.java
100 lines (82 loc) · 2.73 KB
/
TickRegion.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package me.nallar.tickthreading.minecraft.tickregion;
import java.util.LinkedHashSet;
import java.util.Set;
import me.nallar.tickthreading.minecraft.TickManager;
import me.nallar.tickthreading.util.TableFormatter;
import net.minecraft.world.World;
public abstract class TickRegion implements Runnable {
protected final Object tickStateLock = new Object();
protected volatile boolean ticking = false;
protected final Set toRemove = new LinkedHashSet();
protected final Set toAdd = new LinkedHashSet();
final World world;
final TickManager manager;
public final int hashCode;
protected final int regionX;
protected final int regionZ;
private float averageTickTime = 1;
public boolean profilingEnabled = false;
TickRegion(World world, TickManager manager, int regionX, int regionZ) {
super();
this.world = world;
this.manager = manager;
this.hashCode = TickManager.getHashCodeFromRegionCoords(regionX, regionZ);
this.regionX = regionX;
this.regionZ = regionZ;
}
public void die() {
}
@Override
public void run() {
if (shouldTick()) {
long startTime = System.nanoTime();
synchronized (tickStateLock) {
ticking = true;
}
doTick();
synchronized (tickStateLock) {
ticking = false;
}
averageTickTime = ((averageTickTime * 127) + (System.nanoTime() - startTime)) / 128;
}
}
boolean shouldTick() {
return !manager.variableTickRate || averageTickTime < 55000000 || Math.random() < 55000000d / averageTickTime;
}
protected abstract void doTick();
public float getAverageTickTime() {
return averageTickTime / 1000000f;
}
public TableFormatter writeStats(TableFormatter tf) {
return tf
.row(this.getShortTypeName())
.row(regionX * manager.regionSize)
.row(regionZ * manager.regionSize)
.row(size())
.row(getAverageTickTime());
}
protected abstract String getShortTypeName();
public String getStats() {
return this.getClass().getSimpleName() + " - X: " + regionX * manager.regionSize + ", Z: " + regionZ * manager.regionSize + ", time: " + getAverageTickTime() + "ms"
+ "\n size: " + size();
}
@Override
public String toString() {
return "rX: " + regionX + ", rZ: " + regionZ + ", hashCode: " + hashCode;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof TickRegion)) {
return false;
}
TickRegion otherTickRegion = (TickRegion) other;
return otherTickRegion.hashCode == this.hashCode && this.getClass().isInstance(other);
}
protected abstract TickRegion getCallable(int regionX, int regionZ);
public abstract boolean isEmpty();
public abstract int size();
public abstract void processChanges();
}