-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
PatchPlayerInstanceForge.java
109 lines (91 loc) · 3.9 KB
/
PatchPlayerInstanceForge.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
101
102
103
104
105
106
107
108
109
package me.nallar.patched.world.tracking;
import me.nallar.tickthreading.patcher.Declare;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.packet.Packet51MapChunk;
import net.minecraft.server.management.PlayerInstance;
import net.minecraft.server.management.PlayerManager;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.ChunkWatchEvent;
public abstract class PatchPlayerInstanceForge extends PlayerInstance {
private static byte[] unloadSequence;
@Declare
public boolean loaded_;
public PatchPlayerInstanceForge(PlayerManager par1PlayerManager, int par2, int par3) {
super(par1PlayerManager, par2, par3);
}
public static void staticConstruct() {
unloadSequence = new byte[]{0x78, (byte) 0x9C, 0x63, 0x64, 0x1C, (byte) 0xD9, 0x00, 0x00, (byte) 0x81, (byte) 0x80, 0x01, 0x01};
}
public void construct() {
myManager.getWorldServer().theChunkProviderServer.getChunkAt(chunkLocation.chunkXPos, chunkLocation.chunkZPos, new LoadRunnable(this));
}
@Override
public void addPlayerToChunkWatchingList(final EntityPlayerMP par1EntityPlayerMP) {
if (this.playersInChunk.contains(par1EntityPlayerMP)) {
throw new IllegalStateException("Failed to add player. " + par1EntityPlayerMP + " already is in chunk " + this.chunkLocation.chunkXPos + ", " + this.chunkLocation.chunkZPos);
} else {
this.playersInChunk.add(par1EntityPlayerMP);
if (loaded) {
par1EntityPlayerMP.loadedChunks.add(chunkLocation);
} else {
myManager.getWorldServer().theChunkProviderServer.getChunkAt(chunkLocation.chunkXPos, chunkLocation.chunkZPos, new AddToPlayerRunnable(par1EntityPlayerMP, chunkLocation));
}
}
}
@Override
@Declare
public void clearTileCount() {
this.numberOfTilesToUpdate = 0;
}
@Override
public void sendThisChunkToPlayer(EntityPlayerMP par1EntityPlayerMP) {
if (this.playersInChunk.remove(par1EntityPlayerMP)) {
Packet51MapChunk packet51MapChunk = new Packet51MapChunk();
packet51MapChunk.includeInitialize = true;
packet51MapChunk.xCh = chunkLocation.chunkXPos;
packet51MapChunk.zCh = chunkLocation.chunkZPos;
packet51MapChunk.yChMax = 0;
packet51MapChunk.yChMin = 0;
packet51MapChunk.setData(unloadSequence);
par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(packet51MapChunk);
par1EntityPlayerMP.loadedChunks.remove(this.chunkLocation);
MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.UnWatch(chunkLocation, par1EntityPlayerMP));
if (this.playersInChunk.isEmpty()) {
long var2 = (long) this.chunkLocation.chunkXPos + 2147483647L | (long) this.chunkLocation.chunkZPos + 2147483647L << 32;
this.myManager.getChunkWatchers().remove(var2);
if (numberOfTilesToUpdate > 0) {
this.myManager.playerUpdateLock.lock();
try {
this.myManager.getChunkWatcherWithPlayers().remove(this);
} finally {
this.myManager.playerUpdateLock.unlock();
}
}
this.myManager.getWorldServer().theChunkProviderServer.unloadChunksIfNotNearSpawn(this.chunkLocation.chunkXPos, this.chunkLocation.chunkZPos);
}
}
}
public static class AddToPlayerRunnable implements Runnable {
private final EntityPlayerMP par1EntityPlayerMP;
private final ChunkCoordIntPair chunkLocation;
public AddToPlayerRunnable(EntityPlayerMP par1EntityPlayerMP, ChunkCoordIntPair chunkLocation) {
this.par1EntityPlayerMP = par1EntityPlayerMP;
this.chunkLocation = chunkLocation;
}
@Override
public void run() {
par1EntityPlayerMP.loadedChunks.add(chunkLocation);
}
}
public static class LoadRunnable implements Runnable {
final PlayerInstance playerInstance;
public LoadRunnable(PlayerInstance playerInstance) {
this.playerInstance = playerInstance;
}
@Override
public void run() {
playerInstance.loaded = true;
}
}
}