FastAsyncWorldedit/core/src/main/java/com/boydti/fawe/example/CharFaweChunk.java

361 lines
8.6 KiB
Java

package com.boydti.fawe.example;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.object.FaweChunk;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.util.MathMan;
import com.sk89q.jnbt.CompoundTag;
import java.util.*;
public abstract class CharFaweChunk<T, V extends FaweQueue> extends FaweChunk<T> {
public final char[][] ids;
public final short[] count;
public final short[] air;
public final byte[] heightMap;
public byte[] biomes;
public HashMap<Short, CompoundTag> tiles;
public HashSet<CompoundTag> entities;
public HashSet<UUID> entityRemoves;
public T chunk;
public CharFaweChunk(FaweQueue parent, int x, int z, char[][] ids, short[] count, short[] air, byte[] heightMap) {
super(parent, x, z);
this.ids = ids;
this.count = count;
this.air = air;
this.heightMap = heightMap;
}
/**
* A FaweSections object represents a chunk and the blocks that you wish to change in it.
*
* @param parent
* @param x
* @param z
*/
public CharFaweChunk(FaweQueue parent, int x, int z) {
super(parent, x, z);
this.ids = new char[HEIGHT >> 4][];
this.count = new short[HEIGHT >> 4];
this.air = new short[HEIGHT >> 4];
this.heightMap = new byte[256];
}
@Override
public V getParent() {
return (V) super.getParent();
}
@Override
public T getChunk() {
if (this.chunk == null) {
this.chunk = getNewChunk();
}
return this.chunk;
}
public abstract T getNewChunk();
@Override
public void setLoc(final FaweQueue parent, int x, int z) {
super.setLoc(parent, x, z);
this.chunk = null;
}
/**
* Get the number of block changes in a specified section
*
* @param i
* @return
*/
public int getCount(final int i) {
return this.count[i];
}
public int getAir(final int i) {
return this.air[i];
}
public void setCount(final int i, final short value) {
this.count[i] = value;
}
public int getTotalCount() {
int total = 0;
for (int i = 0; i < count.length; i++) {
total += Math.min(4096, this.count[i]);
}
return total;
}
public int getTotalAir() {
int total = 0;
for (int i = 0; i < air.length; i++) {
total += Math.min(4096, this.air[i]);
}
return total;
}
@Override
public int getBitMask() {
int bitMask = 0;
for (int section = 0; section < ids.length; section++) {
if (ids[section] != null) {
bitMask += 1 << section;
}
}
return bitMask;
}
/**
* Get the raw data for a section
*
* @param i
* @return
*/
@Override
public char[] getIdArray(final int i) {
return this.ids[i];
}
@Override
public char[][] getCombinedIdArrays() {
return this.ids;
}
@Override
public byte[] getBiomeArray() {
return this.biomes;
}
@Override
public int getBlockCombinedId(int x, int y, int z) {
short i = FaweCache.CACHE_I[y][z][x];
char[] array = getIdArray(i);
if (array == null) {
return 0;
}
return array[FaweCache.CACHE_J[y][z][x]];
}
@Override
public void setTile(int x, int y, int z, CompoundTag tile) {
if (tiles == null) {
tiles = new HashMap<>();
}
short pair = MathMan.tripleBlockCoord(x, y, z);
tiles.put(pair, tile);
}
@Override
public CompoundTag getTile(int x, int y, int z) {
if (tiles == null) {
return null;
}
short pair = MathMan.tripleBlockCoord(x, y, z);
return tiles.get(pair);
}
@Override
public Map<Short, CompoundTag> getTiles() {
return tiles == null ? new HashMap<Short, CompoundTag>() : tiles;
}
@Override
public Set<CompoundTag> getEntities() {
return entities == null ? Collections.emptySet() : entities;
}
@Override
public void setEntity(CompoundTag tag) {
if (entities == null) {
entities = new HashSet<>();
}
entities.add(tag);
}
@Override
public void removeEntity(UUID uuid) {
if (entityRemoves == null) {
entityRemoves = new HashSet<>();
}
entityRemoves.add(uuid);
}
@Override
public HashSet<UUID> getEntityRemoves() {
return entityRemoves == null ? new HashSet<UUID>() : entityRemoves;
}
@Override
public void setBlock(int x, int y, int z, int id) {
final int i = FaweCache.CACHE_I[y][z][x];
final int j = FaweCache.CACHE_J[y][z][x];
char[] vs = this.ids[i];
if (vs == null) {
vs = this.ids[i] = new char[4096];
this.count[i]++;
} else {
switch (vs[j]) {
case 0:
this.count[i]++;
break;
case 1:
this.air[i]--;
break;
}
}
switch (id) {
case 0:
this.air[i]++;
vs[j] = (char) 1;
return;
case 11:
case 39:
case 40:
case 51:
case 74:
case 89:
case 122:
case 124:
case 138:
case 169:
case 213:
case 130:
case 76:
case 62:
case 50:
case 10:
default:
vs[j] = (char) (id << 4);
heightMap[z << 4 | x] = (byte) y;
return;
}
}
@Override
public void setBlock(final int x, final int y, final int z, final int id, int data) {
final int i = FaweCache.CACHE_I[y][z][x];
final int j = FaweCache.CACHE_J[y][z][x];
char[] vs = this.ids[i];
if (vs == null) {
vs = this.ids[i] = new char[4096];
this.count[i]++;
} else {
switch (vs[j]) {
case 0:
this.count[i]++;
break;
case 1:
this.air[i]--;
break;
}
}
switch (id) {
case 0:
this.air[i]++;
vs[j] = (char) 1;
return;
case 39:
case 40:
case 51:
case 74:
case 89:
case 122:
case 124:
case 138:
case 169:
case 213:
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 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 172:
case 173:
case 174:
case 188:
case 189:
case 190:
case 191:
case 192:
vs[j] = (char) (id << 4);
heightMap[z << 4 | x] = (byte) y;
return;
case 130:
case 76:
case 62:
case 50:
case 10:
case 54:
case 146:
case 61:
case 65:
case 68: // removed
default:
vs[j] = (char) ((id << 4) + data);
heightMap[z << 4 | x] = (byte) y;
return;
}
}
@Deprecated
public void setBitMask(int ignore) {
// Remove
}
@Override
public void setBiome(final int x, final int z, byte biome) {
if (this.biomes == null) {
this.biomes = new byte[256];
}
if (biome == 0) biome = -1;
biomes[((z & 15) << 4) + (x & 15)] = biome;
}
@Override
public abstract CharFaweChunk<T, V> copy(boolean shallow);
}