use of org.spongepowered.api.block.tileentity.TileEntityType in project SpongeCommon by SpongePowered.
the class LegacySchematicTranslator method translate.
@Override
public Schematic translate(DataView view) throws InvalidDataException {
// We default to sponge as the assumption should be that if this tag
// (which is not in the sponge schematic specification) is not present
// then it is more likely that its a sponge schematic than a legacy
// schematic
String materials = view.getString(DataQueries.Schematic.LEGACY_MATERIALS).orElse("Sponge");
if ("Sponge".equalsIgnoreCase(materials)) {
// not a legacy schematic use the new loader instead.
return DataTranslators.SCHEMATIC.translate(view);
} else if (!"Alpha".equalsIgnoreCase(materials)) {
throw new InvalidDataException(String.format("Schematic specifies unknown materials %s", materials));
}
int width = view.getShort(DataQueries.Schematic.WIDTH).get();
int height = view.getShort(DataQueries.Schematic.HEIGHT).get();
int length = view.getShort(DataQueries.Schematic.LENGTH).get();
if (width > MAX_SIZE || height > MAX_SIZE || length > MAX_SIZE) {
throw new InvalidDataException(String.format("Schematic is larger than maximum allowable size (found: (%d, %d, %d) max: (%d, %<d, %<d)", width, height, length, MAX_SIZE));
}
int offsetX = view.getInt(DataQueries.Schematic.LEGACY_OFFSET_X).orElse(0);
int offsetY = view.getInt(DataQueries.Schematic.LEGACY_OFFSET_Y).orElse(0);
int offsetZ = view.getInt(DataQueries.Schematic.LEGACY_OFFSET_Z).orElse(0);
BlockPalette palette = GlobalPalette.instance;
ArrayMutableBlockBuffer buffer = new ArrayMutableBlockBuffer(new Vector3i(-offsetX, -offsetY, -offsetZ), new Vector3i(width, height, length));
byte[] block_ids = (byte[]) view.get(DataQueries.Schematic.LEGACY_BLOCKS).get();
byte[] block_data = (byte[]) view.get(DataQueries.Schematic.LEGACY_BLOCK_DATA).get();
byte[] add_block = (byte[]) view.get(DataQueries.Schematic.LEGACY_ADD_BLOCKS).orElse(null);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
for (int z = 0; z < length; z++) {
int index = (y * length + z) * width + x;
final int default_state_id = block_ids[index];
final int blockData = block_data[index] & 0xF;
int palette_id = default_state_id << 4 | blockData;
if (add_block != null) {
palette_id |= add_block[index] << 12;
}
Optional<BlockState> blockState = palette.get(palette_id);
if (!blockState.isPresent()) {
// At the very least get the default state id
blockState = Optional.of((BlockState) Block.REGISTRY.getObjectById(default_state_id));
}
BlockState block = blockState.orElseGet(BlockTypes.COBBLESTONE::getDefaultState);
buffer.setBlock(x - offsetX, y - offsetY, z - offsetZ, block);
}
}
}
Map<Vector3i, TileEntityArchetype> tiles = Maps.newHashMap();
List<DataView> tiledata = view.getViewList(DataQueries.Schematic.LEGACY_TILEDATA).orElse(null);
if (tiledata != null) {
for (DataView tile : tiledata) {
int x = tile.getInt(DataQueries.X_POS).get();
int y = tile.getInt(DataQueries.Y_POS).get();
int z = tile.getInt(DataQueries.Z_POS).get();
final String tileType = tile.getString(TILE_ID).get();
final ResourceLocation name = new ResourceLocation(tileType);
TileEntityType type = TileEntityTypeRegistryModule.getInstance().getForClass(TileEntity.REGISTRY.getObject(name));
final BlockState state = buffer.getBlock(x - offsetX, y - offsetY, z - offsetZ);
// fixers.
if (type != null && SpongeImplHooks.hasBlockTileEntity(((Block) state.getType()), BlockUtil.toNative(state))) {
TileEntityArchetype archetype = new SpongeTileEntityArchetypeBuilder().state(state).tileData(tile).tile(type).build();
tiles.put(new Vector3i(x - offsetX, y - offsetY, z - offsetZ), archetype);
}
}
}
SpongeSchematic schematic = new SpongeSchematic(buffer, tiles);
return schematic;
}
use of org.spongepowered.api.block.tileentity.TileEntityType in project SpongeCommon by SpongePowered.
the class SchematicTranslator method translate.
@Override
public Schematic translate(DataView view) throws InvalidDataException {
int version = view.getInt(DataQueries.Schematic.VERSION).get();
// TODO version conversions
if (version != VERSION) {
throw new InvalidDataException(String.format("Unknown schematic version %d (current version is %d)", version, VERSION));
}
DataView metadata = view.getView(DataQueries.Schematic.METADATA).orElse(null);
if (metadata != null) {
Optional<DataView> dot_data = metadata.getView(DataQuery.of("."));
if (dot_data.isPresent()) {
DataView data = dot_data.get();
for (DataQuery key : data.getKeys(false)) {
if (!metadata.contains(key)) {
metadata.set(key, data.get(key).get());
}
}
}
}
// TODO error handling for these optionals
int width = view.getShort(DataQueries.Schematic.WIDTH).get();
int height = view.getShort(DataQueries.Schematic.HEIGHT).get();
int length = view.getShort(DataQueries.Schematic.LENGTH).get();
if (width > MAX_SIZE || height > MAX_SIZE || length > MAX_SIZE) {
throw new InvalidDataException(String.format("Schematic is larger than maximum allowable size (found: (%d, %d, %d) max: (%d, %<d, %<d)", width, height, length, MAX_SIZE));
}
int[] offset = (int[]) view.get(DataQueries.Schematic.OFFSET).orElse(null);
if (offset == null) {
offset = new int[3];
}
if (offset.length != 3) {
throw new InvalidDataException("Schematic offset was not of length 3");
}
BlockPalette palette;
Optional<DataView> paletteData = view.getView(DataQueries.Schematic.PALETTE);
int palette_max = view.getInt(DataQueries.Schematic.PALETTE_MAX).orElse(0xFFFF);
if (paletteData.isPresent()) {
// If we had a default palette_max we don't want to allocate all
// that space for nothing so we use a sensible default instead
palette = new BimapPalette(palette_max != 0xFFFF ? palette_max : 64);
DataView paletteMap = paletteData.get();
Set<DataQuery> paletteKeys = paletteMap.getKeys(false);
for (DataQuery key : paletteKeys) {
BlockState state = Sponge.getRegistry().getType(BlockState.class, key.getParts().get(0)).get();
((BimapPalette) palette).assign(state, paletteMap.getInt(key).get());
}
} else {
palette = GlobalPalette.instance;
}
MutableBlockVolume buffer = new ArrayMutableBlockBuffer(palette, new Vector3i(-offset[0], -offset[1], -offset[2]), new Vector3i(width, height, length));
byte[] blockdata = (byte[]) view.get(DataQueries.Schematic.BLOCK_DATA).get();
int index = 0;
int i = 0;
int value = 0;
int varint_length = 0;
while (i < blockdata.length) {
value = 0;
varint_length = 0;
while (true) {
value |= (blockdata[i] & 127) << (varint_length++ * 7);
if (varint_length > 5) {
throw new RuntimeException("VarInt too big (probably corrupted data)");
}
if ((blockdata[i] & 128) != 128) {
i++;
break;
}
i++;
}
// index = (y * length + z) * width + x
int y = index / (width * length);
int z = (index % (width * length)) / width;
int x = (index % (width * length)) % width;
BlockState state = palette.get(value).get();
buffer.setBlock(x - offset[0], y - offset[1], z - offset[2], state);
index++;
}
Map<Vector3i, TileEntityArchetype> tiles = Maps.newHashMap();
List<DataView> tiledata = view.getViewList(DataQueries.Schematic.TILEENTITY_DATA).orElse(null);
if (tiledata != null) {
for (DataView tile : tiledata) {
int[] pos = (int[]) tile.get(DataQueries.Schematic.TILEENTITY_POS).get();
if (offset.length != 3) {
throw new InvalidDataException("Schematic tileentity pos was not of length 3");
}
TileEntityType type = TileEntityTypeRegistryModule.getInstance().getForClass(TileEntity.REGISTRY.getObject(new ResourceLocation(tile.getString(DataQuery.of("id")).get())));
TileEntityArchetype archetype = new SpongeTileEntityArchetypeBuilder().state(buffer.getBlock(pos[0] - offset[0], pos[1] - offset[1], pos[2] - offset[2])).tileData(tile).tile(type).build();
tiles.put(new Vector3i(pos[0] - offset[0], pos[1] - offset[1], pos[2] - offset[2]), archetype);
}
}
Schematic schematic = new SpongeSchematic(buffer, tiles, metadata);
return schematic;
}
use of org.spongepowered.api.block.tileentity.TileEntityType in project SpongeCommon by SpongePowered.
the class SpongeTimings method getTileEntityTiming.
/**
* Get a named timer for the specified tile entity type to track type specific timings.
* @param entity
* @return
*/
public static Timing getTileEntityTiming(TileEntity entity) {
TileEntityType type = entity.getType();
String entityType = type != null ? type.getId() : entity.getClass().getName();
return SpongeTimingsFactory.ofSafe("Minecraft", "## tickTileEntity - " + entityType);
}
use of org.spongepowered.api.block.tileentity.TileEntityType in project SpongeCommon by SpongePowered.
the class SpongeBlockSnapshot method createArchetype.
@Override
public Optional<TileEntityArchetype> createArchetype() {
final BlockType type = this.blockState.getType();
if (!(type instanceof ITileEntityProvider)) {
return Optional.empty();
}
if (this.compound == null) {
// We can't retrieve the TileEntityType
return Optional.empty();
}
final String tileId = this.compound.getString(NbtDataUtil.BLOCK_ENTITY_ID);
final Class<? extends TileEntity> tileClass = TileEntity.REGISTRY.getObject(new ResourceLocation(tileId));
if (tileClass == null) {
return Optional.empty();
}
final TileEntityType tileType = TileEntityTypeRegistryModule.getInstance().getForClass(tileClass);
final TileEntityArchetype archetype = TileEntityArchetype.builder().tile(tileType).state(this.blockState).tileData(NbtTranslator.getInstance().translate(this.compound)).build();
return Optional.of(archetype);
}
use of org.spongepowered.api.block.tileentity.TileEntityType in project SpongeCommon by SpongePowered.
the class TileEntityActivation method initializeTileEntityActivationState.
/**
* These tileentities are excluded from Activation range checks.
*
* @param tileEntity The tileentity to check
* @return boolean If it should always tick.
*/
public static boolean initializeTileEntityActivationState(TileEntity tileEntity) {
if (tileEntity.getWorld() == null || tileEntity.getWorld().isRemote || !(tileEntity instanceof ITickable)) {
return true;
}
TileEntityActivationCategory config = ((IMixinWorldServer) tileEntity.getWorld()).getActiveConfig().getConfig().getTileEntityActivationRange();
TileEntityType type = ((org.spongepowered.api.block.tileentity.TileEntity) tileEntity).getType();
IModData_Activation spongeTileEntity = (IModData_Activation) tileEntity;
SpongeTileEntityType spongeType = (SpongeTileEntityType) type;
if (spongeType == null || spongeType.getModId() == null) {
return true;
}
TileEntityActivationModCategory tileEntityMod = config.getModList().get(spongeType.getModId().toLowerCase());
int defaultActivationRange = config.getDefaultBlockRange();
int defaultTickRate = config.getDefaultTickRate();
if (tileEntityMod == null) {
// use default activation range
spongeTileEntity.setActivationRange(defaultActivationRange);
if (defaultActivationRange <= 0) {
return true;
}
return false;
} else if (!tileEntityMod.isEnabled()) {
spongeTileEntity.setActivationRange(defaultActivationRange);
spongeTileEntity.setSpongeTickRate(defaultTickRate);
return true;
}
Integer defaultModActivationRange = tileEntityMod.getDefaultBlockRange();
Integer tileEntityActivationRange = tileEntityMod.getTileEntityRangeList().get(type.getName().toLowerCase());
if (defaultModActivationRange != null && tileEntityActivationRange == null) {
spongeTileEntity.setActivationRange(defaultModActivationRange);
if (defaultModActivationRange <= 0) {
return true;
}
} else if (tileEntityActivationRange != null) {
spongeTileEntity.setActivationRange(tileEntityActivationRange);
if (tileEntityActivationRange <= 0) {
return true;
}
}
Integer defaultModTickRate = tileEntityMod.getDefaultTickRate();
Integer tileEntityTickRate = tileEntityMod.getTileEntityTickRateList().get(type.getName().toLowerCase());
if (defaultModTickRate != null && tileEntityTickRate == null) {
spongeTileEntity.setSpongeTickRate(defaultModTickRate);
if (defaultModTickRate <= 0) {
return true;
}
return false;
} else if (tileEntityTickRate != null) {
spongeTileEntity.setSpongeTickRate(tileEntityTickRate);
if (tileEntityTickRate <= 0) {
return true;
}
}
return false;
}
Aggregations