/
TickRegion.java
88 lines (72 loc) · 2.45 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
package nallar.tickthreading.minecraft.tickregion;
import java.util.Random;
import nallar.tickthreading.minecraft.TickManager;
import nallar.tickthreading.minecraft.TickThreading;
import nallar.tickthreading.util.TableFormatter;
import net.minecraft.world.World;
public abstract class TickRegion implements Runnable {
private static final boolean variableTickRate = TickThreading.instance.variableTickRate;
private static final Random rand = new Random();
final World world;
final TickManager manager;
public final int hashCode;
public final int regionX;
public final int regionZ;
private long 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;
}
@Override
public synchronized void run() {
long averageTickTime = this.averageTickTime;
if (shouldTick(averageTickTime)) {
long startTime = System.nanoTime();
doTick();
if (isEmpty()) {
manager.queueForRemoval(this);
}
this.averageTickTime = ((averageTickTime * 31) + (System.nanoTime() - startTime)) / 32;
}
}
private static boolean shouldTick(long averageTickTime) {
return !variableTickRate || averageTickTime < 20000000 || rand.nextFloat() < 20000000f / averageTickTime;
}
protected abstract void doTick();
public float getAverageTickTime() {
return averageTickTime / 1000000f;
}
public TableFormatter writeStats(TableFormatter tf) {
return tf
.row(this.getShortTypeName())
.row(regionX * TickManager.regionSize)
.row(regionZ * TickManager.regionSize)
.row(size())
.row(getAverageTickTime());
}
protected abstract String getShortTypeName();
@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);
}
public abstract boolean isEmpty();
protected abstract int size();
public abstract void die();
public abstract void dump(final TableFormatter tf);
}