geforkt von Mirrors/FastAsyncWorldEdit
Add back statically-set reserved IDs for air blocks only, make it clear they're "reserved" (#1502)
* Add back statically-set reserved IDs for air blocks only, make it clear they're "reserved" Also: - Ensure that reserved is never returned in GET block operations - "empty" thus doesn't exist in the GET update methods; remove the needless checks - Allow GET/SET chunks to determine their own default values for non-present blocks/sections * Add comments
Dieser Commit ist enthalten in:
Ursprung
bca3a1b04d
Commit
177d731957
@ -425,7 +425,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements
|
|||||||
LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!",
|
LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!",
|
||||||
blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1
|
blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1
|
||||||
);
|
);
|
||||||
return 0;
|
return BlockTypesCache.ReservedIDs.AIR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import com.sk89q.worldedit.internal.Constants;
|
|||||||
import com.sk89q.worldedit.internal.util.LogManagerCompat;
|
import com.sk89q.worldedit.internal.util.LogManagerCompat;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
import io.papermc.paper.event.block.BeaconDeactivatedEvent;
|
import io.papermc.paper.event.block.BeaconDeactivatedEvent;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
@ -844,16 +845,16 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
// Section is null, return empty array
|
// Section is null, return empty array
|
||||||
if (section == null) {
|
if (section == null) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
if (data != null && data.length != 4096) {
|
if (data != null && data.length != 4096) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
}
|
}
|
||||||
if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) {
|
if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
}
|
}
|
||||||
DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section);
|
DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section);
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
@ -878,8 +879,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
char paletteVal = data[i];
|
char paletteVal = data[i];
|
||||||
char ordinal = adapter.ibdIDToOrdinal(paletteVal);
|
char ordinal = adapter.ibdIDToOrdinal(paletteVal);
|
||||||
// Don't read "empty".
|
data[i] = ordinal;
|
||||||
data[i] = ordinal == 0 ? 1 : ordinal;
|
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -898,18 +898,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
val = ordinal(palette.valueFor(i), adapter);
|
val = ordinal(palette.valueFor(i), adapter);
|
||||||
paletteToOrdinal[i] = val;
|
paletteToOrdinal[i] = val;
|
||||||
}
|
}
|
||||||
// Don't read "empty".
|
|
||||||
if (val == 0) {
|
|
||||||
val = 1;
|
|
||||||
}
|
|
||||||
data[i] = val;
|
data[i] = val;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char ordinal = ordinal(palette.valueFor(0), adapter);
|
char ordinal = ordinal(palette.valueFor(0), adapter);
|
||||||
// Don't read "empty".
|
|
||||||
if (ordinal == 0) {
|
|
||||||
ordinal = 1;
|
|
||||||
}
|
|
||||||
Arrays.fill(data, ordinal);
|
Arrays.fill(data, ordinal);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -929,7 +921,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
|
|
||||||
private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) {
|
private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) {
|
||||||
if (ibd == null) {
|
if (ibd == null) {
|
||||||
return 1;
|
return BlockTypesCache.ReservedIDs.AIR;
|
||||||
} else {
|
} else {
|
||||||
return adapter.adaptToChar(ibd);
|
return adapter.adaptToChar(ibd);
|
||||||
}
|
}
|
||||||
|
@ -420,7 +420,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements
|
|||||||
LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!",
|
LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!",
|
||||||
blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1
|
blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1
|
||||||
);
|
);
|
||||||
return 0;
|
return BlockTypesCache.ReservedIDs.AIR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import com.sk89q.worldedit.internal.Constants;
|
|||||||
import com.sk89q.worldedit.internal.util.LogManagerCompat;
|
import com.sk89q.worldedit.internal.util.LogManagerCompat;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
import io.papermc.paper.event.block.BeaconDeactivatedEvent;
|
import io.papermc.paper.event.block.BeaconDeactivatedEvent;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
@ -874,16 +875,16 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
// Section is null, return empty array
|
// Section is null, return empty array
|
||||||
if (section == null) {
|
if (section == null) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
if (data != null && data.length != 4096) {
|
if (data != null && data.length != 4096) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
}
|
}
|
||||||
if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) {
|
if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
}
|
}
|
||||||
DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section);
|
DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section);
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
@ -915,8 +916,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
char paletteVal = data[i];
|
char paletteVal = data[i];
|
||||||
char ordinal = adapter.ibdIDToOrdinal(paletteVal);
|
char ordinal = adapter.ibdIDToOrdinal(paletteVal);
|
||||||
// Don't read "empty".
|
data[i] = ordinal;
|
||||||
data[i] = ordinal == 0 ? 1 : ordinal;
|
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -935,18 +935,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
val = ordinal(palette.valueFor(i), adapter);
|
val = ordinal(palette.valueFor(i), adapter);
|
||||||
paletteToOrdinal[i] = val;
|
paletteToOrdinal[i] = val;
|
||||||
}
|
}
|
||||||
// Don't read "empty".
|
|
||||||
if (val == 0) {
|
|
||||||
val = 1;
|
|
||||||
}
|
|
||||||
data[i] = val;
|
data[i] = val;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char ordinal = ordinal(palette.valueFor(0), adapter);
|
char ordinal = ordinal(palette.valueFor(0), adapter);
|
||||||
// Don't read "empty".
|
|
||||||
if (ordinal == 0) {
|
|
||||||
ordinal = 1;
|
|
||||||
}
|
|
||||||
Arrays.fill(data, ordinal);
|
Arrays.fill(data, ordinal);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -966,7 +958,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
|
|
||||||
private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) {
|
private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) {
|
||||||
if (ibd == null) {
|
if (ibd == null) {
|
||||||
return 1;
|
return BlockTypesCache.ReservedIDs.AIR;
|
||||||
} else {
|
} else {
|
||||||
return adapter.adaptToChar(ibd);
|
return adapter.adaptToChar(ibd);
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,8 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl {
|
|||||||
int num_palette = 0;
|
int num_palette = 0;
|
||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
char ordinal = set[i];
|
char ordinal = set[i];
|
||||||
if (ordinal == 0) {
|
if (ordinal == BlockTypesCache.ReservedIDs.__RESERVED__) {
|
||||||
ordinal = 1;
|
ordinal = BlockTypesCache.ReservedIDs.AIR;
|
||||||
}
|
}
|
||||||
int palette = blockToPalette[ordinal];
|
int palette = blockToPalette[ordinal];
|
||||||
if (palette == Integer.MAX_VALUE) {
|
if (palette == Integer.MAX_VALUE) {
|
||||||
@ -48,11 +48,11 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl {
|
|||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
char ordinal = set[i];
|
char ordinal = set[i];
|
||||||
switch (ordinal) {
|
switch (ordinal) {
|
||||||
case 0:
|
case BlockTypesCache.ReservedIDs.__RESERVED__:
|
||||||
ordinal = 1;
|
ordinal = BlockTypesCache.ReservedIDs.AIR;
|
||||||
case 1:
|
case BlockTypesCache.ReservedIDs.AIR:
|
||||||
case 2:
|
case BlockTypesCache.ReservedIDs.CAVE_AIR:
|
||||||
case 3:
|
case BlockTypesCache.ReservedIDs.VOID_AIR:
|
||||||
air++;
|
air++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -94,13 +94,13 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl {
|
|||||||
char[] getArr = null;
|
char[] getArr = null;
|
||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
char ordinal = set[i];
|
char ordinal = set[i];
|
||||||
if (ordinal == 0) {
|
if (ordinal == BlockTypesCache.ReservedIDs.__RESERVED__) {
|
||||||
if (getArr == null) {
|
if (getArr == null) {
|
||||||
getArr = get.apply(layer);
|
getArr = get.apply(layer);
|
||||||
}
|
}
|
||||||
ordinal = getArr[i];
|
ordinal = getArr[i];
|
||||||
if (ordinal == 0) {
|
if (ordinal == BlockTypesCache.ReservedIDs.__RESERVED__) {
|
||||||
ordinal = 1;
|
ordinal = BlockTypesCache.ReservedIDs.AIR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int palette = blockToPalette[ordinal];
|
int palette = blockToPalette[ordinal];
|
||||||
@ -119,24 +119,24 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl {
|
|||||||
}
|
}
|
||||||
System.arraycopy(adapter.getOrdinalToIbdID(), 0, blockToPalette, 0, adapter.getOrdinalToIbdID().length);
|
System.arraycopy(adapter.getOrdinalToIbdID(), 0, blockToPalette, 0, adapter.getOrdinalToIbdID().length);
|
||||||
}
|
}
|
||||||
char lastOrdinal = 0;
|
char lastOrdinal = BlockTypesCache.ReservedIDs.__RESERVED__;
|
||||||
boolean lastticking = false;
|
boolean lastticking = false;
|
||||||
boolean tick_placed = Settings.settings().EXPERIMENTAL.ALLOW_TICK_PLACED;
|
boolean tick_placed = Settings.settings().EXPERIMENTAL.ALLOW_TICK_PLACED;
|
||||||
boolean tick_existing = Settings.settings().EXPERIMENTAL.ALLOW_TICK_EXISTING;
|
boolean tick_existing = Settings.settings().EXPERIMENTAL.ALLOW_TICK_EXISTING;
|
||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
char ordinal = set[i];
|
char ordinal = set[i];
|
||||||
switch (ordinal) {
|
switch (ordinal) {
|
||||||
case 0: {
|
case BlockTypesCache.ReservedIDs.__RESERVED__ -> {
|
||||||
if (getArr == null) {
|
if (getArr == null) {
|
||||||
getArr = get.apply(layer);
|
getArr = get.apply(layer);
|
||||||
}
|
}
|
||||||
ordinal = getArr[i];
|
ordinal = getArr[i];
|
||||||
switch (ordinal) {
|
switch (ordinal) {
|
||||||
case 0:
|
case BlockTypesCache.ReservedIDs.__RESERVED__:
|
||||||
ordinal = 1;
|
ordinal = BlockTypesCache.ReservedIDs.AIR;
|
||||||
case 1:
|
case BlockTypesCache.ReservedIDs.AIR:
|
||||||
case 2:
|
case BlockTypesCache.ReservedIDs.CAVE_AIR:
|
||||||
case 3:
|
case BlockTypesCache.ReservedIDs.VOID_AIR:
|
||||||
air++;
|
air++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -151,23 +151,19 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl {
|
|||||||
}
|
}
|
||||||
if (ticking) {
|
if (ticking) {
|
||||||
BlockState state = BlockState.getFromOrdinal(ordinal);
|
BlockState state = BlockState.getFromOrdinal(ordinal);
|
||||||
ticking_blocks
|
ticking_blocks.put(BlockVector3.at(i & 15, (i >> 8) & 15, (i >> 4) & 15),
|
||||||
.put(
|
WorldEditPlugin
|
||||||
BlockVector3.at(i & 15, (i >> 8) & 15, (i >> 4) & 15),
|
.getInstance()
|
||||||
WorldEditPlugin.getInstance().getBukkitImplAdapter()
|
.getBukkitImplAdapter()
|
||||||
.getInternalBlockStateId(state).orElse(0)
|
.getInternalBlockStateId(state)
|
||||||
);
|
.orElse(0)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set[i] = ordinal;
|
set[i] = ordinal;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case 1:
|
case BlockTypesCache.ReservedIDs.AIR, BlockTypesCache.ReservedIDs.CAVE_AIR, BlockTypesCache.ReservedIDs.VOID_AIR -> air++;
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
air++;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (!fastmode && tick_placed) {
|
if (!fastmode && tick_placed) {
|
||||||
boolean ticking;
|
boolean ticking;
|
||||||
|
@ -30,6 +30,7 @@ import com.sk89q.worldedit.world.World;
|
|||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -185,8 +186,8 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor {
|
|||||||
for (int x = 0; x < 16; x++, index++) {
|
for (int x = 0; x < 16; x++, index++) {
|
||||||
int xx = bx + x;
|
int xx = bx + x;
|
||||||
int from = blocksGet[index];
|
int from = blocksGet[index];
|
||||||
if (from == 0) {
|
if (from == BlockTypesCache.ReservedIDs.__RESERVED__) {
|
||||||
from = 1;
|
from = BlockTypesCache.ReservedIDs.AIR;
|
||||||
}
|
}
|
||||||
final int combinedFrom = from;
|
final int combinedFrom = from;
|
||||||
final int combinedTo = blocksSet[index];
|
final int combinedTo = blocksSet[index];
|
||||||
|
@ -9,6 +9,7 @@ import com.sk89q.worldedit.extension.platform.Capability;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
import com.sk89q.worldedit.world.registry.BlockRegistry;
|
import com.sk89q.worldedit.world.registry.BlockRegistry;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@ -115,11 +116,11 @@ public interface IBlocks extends Trimable {
|
|||||||
for (int i = 0; i < ids.length; i++) {
|
for (int i = 0; i < ids.length; i++) {
|
||||||
char ordinal = ids[i];
|
char ordinal = ids[i];
|
||||||
switch (ordinal) {
|
switch (ordinal) {
|
||||||
case 0:
|
case BlockTypesCache.ReservedIDs.__RESERVED__:
|
||||||
case 2:
|
case BlockTypesCache.ReservedIDs.CAVE_AIR:
|
||||||
case 3:
|
case BlockTypesCache.ReservedIDs.VOID_AIR:
|
||||||
ids[i] = 1;
|
ids[i] = BlockTypesCache.ReservedIDs.AIR;
|
||||||
case 1:
|
case BlockTypesCache.ReservedIDs.AIR:
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
nonEmpty++;
|
nonEmpty++;
|
||||||
@ -139,10 +140,10 @@ public interface IBlocks extends Trimable {
|
|||||||
for (int i = 0; i < palette.paletteToBlockLength; i++) {
|
for (int i = 0; i < palette.paletteToBlockLength; i++) {
|
||||||
int ordinal = palette.paletteToBlock[i];
|
int ordinal = palette.paletteToBlock[i];
|
||||||
switch (ordinal) {
|
switch (ordinal) {
|
||||||
case 0:
|
case BlockTypesCache.ReservedIDs.__RESERVED__:
|
||||||
case 2:
|
case BlockTypesCache.ReservedIDs.AIR:
|
||||||
case 3:
|
case BlockTypesCache.ReservedIDs.CAVE_AIR:
|
||||||
case 1:
|
case BlockTypesCache.ReservedIDs.VOID_AIR:
|
||||||
sectionWriter.write(0);
|
sectionWriter.write(0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -9,6 +9,7 @@ import com.sk89q.worldedit.math.BlockVector3;
|
|||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -59,7 +60,7 @@ public class BitSetBlocks implements IChunkSet {
|
|||||||
for (int y = 0, index = 0; y < 16; y++) {
|
for (int y = 0, index = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
for (int x = 0; x < 16; x++, index++) {
|
for (int x = 0; x < 16; x++, index++) {
|
||||||
if (data[index] != 0) {
|
if (data[index] != BlockTypesCache.ReservedIDs.__RESERVED__) {
|
||||||
row.set(null, x, by + y, z, minSectionPosition, maxSectionPosition);
|
row.set(null, x, by + y, z, minSectionPosition, maxSectionPosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -134,7 +134,7 @@ public abstract class CharBlocks implements IBlocks {
|
|||||||
return new char[4096];
|
return new char[4096];
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
data[i] = 0;
|
data[i] = defaultOrdinal();
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -188,11 +188,16 @@ public abstract class CharBlocks implements IBlocks {
|
|||||||
int layer = y >> 4;
|
int layer = y >> 4;
|
||||||
final int index = (y & 15) << 8 | z << 4 | x;
|
final int index = (y & 15) << 8 | z << 4 | x;
|
||||||
if (layer > maxSectionPosition || layer < minSectionPosition) {
|
if (layer > maxSectionPosition || layer < minSectionPosition) {
|
||||||
return 0;
|
return defaultOrdinal();
|
||||||
}
|
}
|
||||||
return get(layer, index);
|
return get(layer, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default char value to be used when "updating"/resetting data arrays
|
||||||
|
*/
|
||||||
|
protected abstract char defaultOrdinal();
|
||||||
|
|
||||||
// Not synchronized as it refers to a synchronized method and includes nothing that requires synchronization
|
// Not synchronized as it refers to a synchronized method and includes nothing that requires synchronization
|
||||||
public void set(int x, int y, int z, char value) {
|
public void set(int x, int y, int z, char value) {
|
||||||
final int layer = y >> 4;
|
final int layer = y >> 4;
|
||||||
|
@ -37,10 +37,15 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet {
|
|||||||
if (data == null) {
|
if (data == null) {
|
||||||
data = new char[4096];
|
data = new char[4096];
|
||||||
}
|
}
|
||||||
Arrays.fill(data, (char) 1);
|
Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected char defaultOrdinal() {
|
||||||
|
return BlockTypesCache.ReservedIDs.AIR;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized boolean trim(boolean aggressive, int layer) {
|
public synchronized boolean trim(boolean aggressive, int layer) {
|
||||||
layer -= minSectionPosition;
|
layer -= minSectionPosition;
|
||||||
|
@ -11,6 +11,7 @@ import com.sk89q.worldedit.WorldEditException;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -326,6 +327,11 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet {
|
|||||||
return super.load(layer);
|
return super.load(layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected char defaultOrdinal() {
|
||||||
|
return BlockTypesCache.ReservedIDs.__RESERVED__;
|
||||||
|
}
|
||||||
|
|
||||||
// Checks and updates the various section arrays against the new layer index
|
// Checks and updates the various section arrays against the new layer index
|
||||||
private void updateSectionIndexRange(int layer) {
|
private void updateSectionIndexRange(int layer) {
|
||||||
if (layer >= minSectionPosition && layer <= maxSectionPosition) {
|
if (layer >= minSectionPosition && layer <= maxSectionPosition) {
|
||||||
|
@ -13,6 +13,7 @@ import com.sk89q.worldedit.world.registry.BlockMaterial;
|
|||||||
import com.sk89q.worldedit.world.registry.BlockRegistry;
|
import com.sk89q.worldedit.world.registry.BlockRegistry;
|
||||||
import com.sk89q.worldedit.world.registry.Registries;
|
import com.sk89q.worldedit.world.registry.Registries;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -220,55 +221,30 @@ public class BlockTypesCache {
|
|||||||
BIT_MASK = ((1 << BIT_OFFSET) - 1);
|
BIT_MASK = ((1 << BIT_OFFSET) - 1);
|
||||||
values = new BlockType[size];
|
values = new BlockType[size];
|
||||||
|
|
||||||
/*Field[] idFields = BlockID.class.getDeclaredFields();
|
// Register reserved IDs. Ensure air/reserved are 0/1/2/3
|
||||||
for (Field field : idFields) {
|
|
||||||
size = Math.max(field.getInt(null) + 1, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register the statically declared ones first
|
|
||||||
for (Field field : idFields) {
|
|
||||||
if (field.getType() == int.class) {
|
|
||||||
int internalId = field.getInt(null);
|
|
||||||
String id = "minecraft:" + field.getName().toLowerCase(Locale.ROOT);
|
|
||||||
String defaultState = blockMap.remove(id);
|
|
||||||
if (defaultState == null) {
|
|
||||||
if (internalId != 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
defaultState = id;
|
|
||||||
}
|
|
||||||
if (values[internalId] != null) {
|
|
||||||
throw new IllegalStateException("Invalid duplicate id for " + field.getName());
|
|
||||||
}
|
|
||||||
BlockType type = register(defaultState, internalId, stateList, tickList);
|
|
||||||
// Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty
|
|
||||||
values[internalId] = type;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Register "Reserved". Ensure air/reserved and 0/1/2/3
|
|
||||||
{
|
{
|
||||||
int internalId = 0;
|
for (Field field : ReservedIDs.class.getDeclaredFields()) {
|
||||||
for (String id : new String[]{"minecraft:__reserved__", "minecraft:air", "minecraft:cave_air",
|
if (field.getType() == int.class) {
|
||||||
"minecraft:void_air"}) {
|
int internalId = field.getInt(null);
|
||||||
String defaultState = blockMap.remove(id);
|
String id = "minecraft:" + field.getName().toLowerCase(Locale.ROOT);
|
||||||
if (defaultState == null) {
|
String defaultState = blockMap.remove(id);
|
||||||
defaultState = id;
|
if (defaultState == null) {
|
||||||
|
defaultState = id;
|
||||||
|
}
|
||||||
|
if (values[internalId] != null) {
|
||||||
|
throw new IllegalStateException(String.format(
|
||||||
|
"Invalid duplicate id for %s! Something has gone very wrong. Are " +
|
||||||
|
"any plugins shading FAWE?!", id));
|
||||||
|
}
|
||||||
|
BlockType type = register(defaultState, internalId, stateList, tickList);
|
||||||
|
// Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty
|
||||||
|
values[internalId] = type;
|
||||||
}
|
}
|
||||||
if (values[internalId] != null) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Invalid duplicate id for __reserved__! Something has gone very wrong. Are " +
|
|
||||||
"any plugins shading FAWE?!");
|
|
||||||
}
|
|
||||||
BlockType type = register(defaultState, internalId, stateList, tickList);
|
|
||||||
// Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty
|
|
||||||
values[internalId] = type;
|
|
||||||
internalId++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Register real blocks
|
{ // Register real blocks
|
||||||
int internalId = 1;
|
int internalId = 0;
|
||||||
for (Map.Entry<String, String> entry : blockMap.entrySet()) {
|
for (Map.Entry<String, String> entry : blockMap.entrySet()) {
|
||||||
String defaultState = entry.getValue();
|
String defaultState = entry.getValue();
|
||||||
// Skip already registered ids
|
// Skip already registered ids
|
||||||
@ -328,4 +304,15 @@ public class BlockTypesCache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Statically-set reserved IDs. Should be used as minimally as possible, and for IDs that will see frequent use
|
||||||
|
*/
|
||||||
|
public static class ReservedIDs {
|
||||||
|
public static final int __RESERVED__ = 0;
|
||||||
|
public static final int AIR = 1;
|
||||||
|
public static final int CAVE_AIR = 2;
|
||||||
|
public static final int VOID_AIR = 3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* The following classes are FAWE additions:
|
||||||
|
*
|
||||||
|
* @see com.sk89q.worldedit.world.block.BlockTypesCache
|
||||||
|
*/
|
||||||
|
package com.sk89q.worldedit.world.block;
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren