Fix modification and packet sending for 1.7.10

This commit is contained in:
Jesse Boyd 2016-08-29 19:11:53 +10:00
parent 421b992b67
commit 26fc8b781c
2 changed files with 40 additions and 80 deletions

View File

@ -32,6 +32,11 @@ public class BukkitChunk_1_7 extends CharFaweChunk<Chunk> {
return datas[i];
}
@Override
public void setBlock(int x, int y, int z, int id) {
this.setBlock(x, y, z, id, 0);
}
@Override
public void setBlock(int x, int y, int z, int id, int data) {
int i = FaweCache.CACHE_I[y][z][x];
@ -47,8 +52,7 @@ public class BukkitChunk_1_7 extends CharFaweChunk<Chunk> {
this.count[i]++;
switch (id) {
case 0:
this.air[i]++;
vs[j] = -1;
vs[j] = 0;
vs2[j] = (char) 1;
return;
case 11:
@ -62,81 +66,19 @@ public class BukkitChunk_1_7 extends CharFaweChunk<Chunk> {
case 138:
case 169:
case 213:
this.relight[i]++;
case 2:
case 4:
case 13:
case 14:
case 15:
case 20:
case 21:
case 22:
case 30:
case 32:
case 37:
case 41:
case 42:
case 45:
case 46:
case 47:
case 48:
case 49:
case 55:
case 56:
case 57:
case 58:
case 60:
case 7:
case 73:
case 79:
case 80:
case 81:
case 82:
case 83:
case 85:
case 87:
case 88:
case 101:
case 102:
case 103:
case 110:
case 112:
case 113:
case 121:
case 129:
case 133:
case 165:
case 166:
case 170:
case 172:
case 173:
case 174:
case 188:
case 189:
case 190:
case 191:
case 192:
vs[j] = (byte) (id);
vs2[j] = (char) (id << 4);
return;
case 130:
case 76:
case 62:
case 50:
case 10:
this.relight[i]++;
case 54:
case 146:
case 61:
case 65:
case 68: // removed
default:
vs2[j] = (char) ((id << 4) + data);
vs[j] = (byte) id;
if (data != 0) {
NibbleArray dataArray = datas[i];
if (dataArray == null) {
datas[i] = dataArray = new NibbleArray(4096, 4);
datas[i] = dataArray = new NibbleArray(new byte[2048], 4);
}
dataArray.a(x, y & 15, z, data);
}

View File

@ -65,9 +65,22 @@ import org.bukkit.generator.ChunkGenerator;
public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSection> {
private static Field fieldData;
private static Field fieldIds;
public BukkitQueue17(final String world) {
super(world);
checkVersion("v1_7_R4");
if (fieldData == null) {
try {
fieldData = ChunkSection.class.getDeclaredField("blockData");
fieldData.setAccessible(true);
fieldIds = ChunkSection.class.getDeclaredField("blockIds");
fieldIds.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
@Override
@ -358,24 +371,31 @@ public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSec
if ((section == null) || (fs.getCount(j) >= 4096)) {
sections[j] = section = new ChunkSection(j << 4, flag);
section.setIdArray(newIdArray);
section.setDataArray(newDataArray);
if (newDataArray != null) {
section.setDataArray(newDataArray);
}
continue;
}
byte[] currentIdArray = section.getIdArray();
NibbleArray currentDataArray = section.getDataArray();
byte[] currentIdArray = (byte[]) fieldIds.get(section);
NibbleArray currentDataArray = (NibbleArray) fieldData.get(section);
boolean data = currentDataArray != null;
if (!data) {
if (!data && newDataArray != null) {
section.setDataArray(newDataArray);
}
if (currentIdArray == null) {
section.setIdArray(newIdArray);
continue;
}
boolean fill = true;
int solid = 0;
char[] charArray = fs.getIdArray(j);
for (int k = 0; k < newIdArray.length; k++) {
byte n = newIdArray[k];
switch (n) {
char combined = charArray[k];
switch (combined) {
case 0:
fill = false;
continue;
case -1:
case 1:
fill = false;
if (currentIdArray[k] != 0) {
solid++;
@ -384,16 +404,14 @@ public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSec
continue;
default:
solid++;
currentIdArray[k] = n;
currentIdArray[k] = newIdArray[k];
if (data) {
int dataByte = FaweCache.getData(combined);
int x = FaweCache.CACHE_X[0][k];
int y = FaweCache.CACHE_Y[0][k];
int z = FaweCache.CACHE_Z[0][k];
int newData = newDataArray == null ? 0 : newDataArray.a(x, y, z);
int currentData = currentDataArray == null ? 0 : currentDataArray.a(x, y, z);
if (newData != currentData) {
currentDataArray.a(x, y, z, newData);
}
int newData = newDataArray.a(x, y, z);
currentDataArray.a(x, y, z, newData);
}
continue;
}
@ -489,13 +507,13 @@ public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSec
// Send chunks
int mask = fc.getBitMask();
if (mask == 65535 && hasEntities(nmsChunk)) {
PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, 65280, 25);
PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, 65280, 5);
for (EntityPlayer player : players) {
player.playerConnection.sendPacket(packet);
}
mask = 255;
}
PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, mask, 25);
PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, mask, 5);
for (EntityPlayer player : players) {
player.playerConnection.sendPacket(packet);
}