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]; return datas[i];
} }
@Override
public void setBlock(int x, int y, int z, int id) {
this.setBlock(x, y, z, id, 0);
}
@Override @Override
public void setBlock(int x, int y, int z, int id, int data) { public void setBlock(int x, int y, int z, int id, int data) {
int i = FaweCache.CACHE_I[y][z][x]; int i = FaweCache.CACHE_I[y][z][x];
@ -47,8 +52,7 @@ public class BukkitChunk_1_7 extends CharFaweChunk<Chunk> {
this.count[i]++; this.count[i]++;
switch (id) { switch (id) {
case 0: case 0:
this.air[i]++; vs[j] = 0;
vs[j] = -1;
vs2[j] = (char) 1; vs2[j] = (char) 1;
return; return;
case 11: case 11:
@ -62,81 +66,19 @@ public class BukkitChunk_1_7 extends CharFaweChunk<Chunk> {
case 138: case 138:
case 169: case 169:
case 213: 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 130:
case 76: case 76:
case 62: case 62:
case 50: case 50:
case 10: case 10:
this.relight[i]++; this.relight[i]++;
case 54:
case 146:
case 61:
case 65:
case 68: // removed
default: default:
vs2[j] = (char) ((id << 4) + data); vs2[j] = (char) ((id << 4) + data);
vs[j] = (byte) id; vs[j] = (byte) id;
if (data != 0) { if (data != 0) {
NibbleArray dataArray = datas[i]; NibbleArray dataArray = datas[i];
if (dataArray == null) { 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); 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> { public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSection> {
private static Field fieldData;
private static Field fieldIds;
public BukkitQueue17(final String world) { public BukkitQueue17(final String world) {
super(world); super(world);
checkVersion("v1_7_R4"); 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 @Override
@ -358,24 +371,31 @@ public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSec
if ((section == null) || (fs.getCount(j) >= 4096)) { if ((section == null) || (fs.getCount(j) >= 4096)) {
sections[j] = section = new ChunkSection(j << 4, flag); sections[j] = section = new ChunkSection(j << 4, flag);
section.setIdArray(newIdArray); section.setIdArray(newIdArray);
section.setDataArray(newDataArray); if (newDataArray != null) {
section.setDataArray(newDataArray);
}
continue; continue;
} }
byte[] currentIdArray = section.getIdArray(); byte[] currentIdArray = (byte[]) fieldIds.get(section);
NibbleArray currentDataArray = section.getDataArray(); NibbleArray currentDataArray = (NibbleArray) fieldData.get(section);
boolean data = currentDataArray != null; boolean data = currentDataArray != null;
if (!data) { if (!data && newDataArray != null) {
section.setDataArray(newDataArray); section.setDataArray(newDataArray);
} }
if (currentIdArray == null) {
section.setIdArray(newIdArray);
continue;
}
boolean fill = true; boolean fill = true;
int solid = 0; int solid = 0;
char[] charArray = fs.getIdArray(j);
for (int k = 0; k < newIdArray.length; k++) { for (int k = 0; k < newIdArray.length; k++) {
byte n = newIdArray[k]; char combined = charArray[k];
switch (n) { switch (combined) {
case 0: case 0:
fill = false; fill = false;
continue; continue;
case -1: case 1:
fill = false; fill = false;
if (currentIdArray[k] != 0) { if (currentIdArray[k] != 0) {
solid++; solid++;
@ -384,16 +404,14 @@ public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSec
continue; continue;
default: default:
solid++; solid++;
currentIdArray[k] = n; currentIdArray[k] = newIdArray[k];
if (data) { if (data) {
int dataByte = FaweCache.getData(combined);
int x = FaweCache.CACHE_X[0][k]; int x = FaweCache.CACHE_X[0][k];
int y = FaweCache.CACHE_Y[0][k]; int y = FaweCache.CACHE_Y[0][k];
int z = FaweCache.CACHE_Z[0][k]; int z = FaweCache.CACHE_Z[0][k];
int newData = newDataArray == null ? 0 : newDataArray.a(x, y, z); int newData = newDataArray.a(x, y, z);
int currentData = currentDataArray == null ? 0 : currentDataArray.a(x, y, z); currentDataArray.a(x, y, z, newData);
if (newData != currentData) {
currentDataArray.a(x, y, z, newData);
}
} }
continue; continue;
} }
@ -489,13 +507,13 @@ public class BukkitQueue17 extends BukkitQueue_0<Chunk, ChunkSection[], ChunkSec
// Send chunks // Send chunks
int mask = fc.getBitMask(); int mask = fc.getBitMask();
if (mask == 65535 && hasEntities(nmsChunk)) { 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) { for (EntityPlayer player : players) {
player.playerConnection.sendPacket(packet); player.playerConnection.sendPacket(packet);
} }
mask = 255; mask = 255;
} }
PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, mask, 25); PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, mask, 5);
for (EntityPlayer player : players) { for (EntityPlayer player : players) {
player.playerConnection.sendPacket(packet); player.playerConnection.sendPacket(packet);
} }