use of dev.rosewood.rosestacker.stack.StackedSpawner in project RoseStacker by Rosewood-Development.
the class DataUtils method readStackedSpawners.
public static List<StackedSpawner> readStackedSpawners(Chunk chunk) {
PersistentDataContainer pdc = chunk.getPersistentDataContainer();
List<StackedSpawner> stackedSpawners = new ArrayList<>();
byte[] data = pdc.get(CHUNK_SPAWNERS_KEY, PersistentDataType.BYTE_ARRAY);
if (data == null)
return stackedSpawners;
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
ObjectInputStream dataInput = new ObjectInputStream(inputStream)) {
int dataVersion = dataInput.readInt();
if (dataVersion == 1) {
int length = dataInput.readInt();
for (int i = 0; i < length; i++) {
int stackSize = dataInput.readInt();
int x = dataInput.readInt();
int y = dataInput.readInt();
int z = dataInput.readInt();
boolean placedByPlayer = dataInput.readBoolean();
Block block = chunk.getBlock(x, y, z);
if (block.getType() == Material.SPAWNER)
stackedSpawners.add(new StackedSpawner(stackSize, block, placedByPlayer));
}
}
} catch (Exception e) {
e.printStackTrace();
pdc.remove(CHUNK_SPAWNERS_KEY);
}
return stackedSpawners;
}
use of dev.rosewood.rosestacker.stack.StackedSpawner in project RoseStacker by Rosewood-Development.
the class NMSHandlerImpl method injectStackedSpawnerTile.
@Override
public StackedSpawnerTile injectStackedSpawnerTile(Object stackedSpawnerObj) {
StackedSpawner stackedSpawner = (StackedSpawner) stackedSpawnerObj;
Block block = stackedSpawner.getBlock();
ServerLevel level = ((CraftWorld) block.getWorld()).getHandle();
BlockEntity blockEntity = level.getBlockEntity(new BlockPos(block.getX(), block.getY(), block.getZ()));
if (blockEntity instanceof SpawnerBlockEntity) {
SpawnerBlockEntity spawnerBlockEntity = (SpawnerBlockEntity) blockEntity;
if (!(spawnerBlockEntity.getSpawner() instanceof StackedSpawnerTileImpl)) {
StackedSpawnerTile stackedSpawnerTile = new StackedSpawnerTileImpl(spawnerBlockEntity.getSpawner(), spawnerBlockEntity, stackedSpawner);
unsafe.putObject(spawnerBlockEntity, field_SpawnerBlockEntity_spawner_offset, stackedSpawnerTile);
return stackedSpawnerTile;
} else {
StackedSpawnerTileImpl spawnerTile = (StackedSpawnerTileImpl) spawnerBlockEntity.getSpawner();
spawnerTile.updateStackedSpawner(stackedSpawner);
return spawnerTile;
}
}
return null;
}
use of dev.rosewood.rosestacker.stack.StackedSpawner in project RoseStacker by Rosewood-Development.
the class NMSHandlerImpl method injectStackedSpawnerTile.
@Override
public StackedSpawnerTile injectStackedSpawnerTile(Object stackedSpawnerObj) {
StackedSpawner stackedSpawner = (StackedSpawner) stackedSpawnerObj;
Block block = stackedSpawner.getBlock();
ServerLevel level = ((CraftWorld) block.getWorld()).getHandle();
BlockEntity blockEntity = level.getBlockEntity(new BlockPos(block.getX(), block.getY(), block.getZ()));
if (blockEntity instanceof SpawnerBlockEntity) {
SpawnerBlockEntity spawnerBlockEntity = (SpawnerBlockEntity) blockEntity;
if (!(spawnerBlockEntity.getSpawner() instanceof StackedSpawnerTileImpl)) {
StackedSpawnerTile stackedSpawnerTile = new StackedSpawnerTileImpl(spawnerBlockEntity.getSpawner(), spawnerBlockEntity, stackedSpawner);
unsafe.putObject(spawnerBlockEntity, field_SpawnerBlockEntity_spawner_offset, stackedSpawnerTile);
return stackedSpawnerTile;
} else {
StackedSpawnerTileImpl spawnerTile = (StackedSpawnerTileImpl) spawnerBlockEntity.getSpawner();
spawnerTile.updateStackedSpawner(stackedSpawner);
return spawnerTile;
}
}
return null;
}
use of dev.rosewood.rosestacker.stack.StackedSpawner in project RoseStacker by Rosewood-Development.
the class NMSHandlerImpl method injectStackedSpawnerTile.
@Override
public StackedSpawnerTile injectStackedSpawnerTile(Object stackedSpawnerObj) {
StackedSpawner stackedSpawner = (StackedSpawner) stackedSpawnerObj;
Block block = stackedSpawner.getBlock();
WorldServer level = ((CraftWorld) block.getWorld()).getHandle();
TileEntity blockEntity = level.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
if (blockEntity instanceof TileEntityMobSpawner) {
TileEntityMobSpawner spawnerBlockEntity = (TileEntityMobSpawner) blockEntity;
if (!(spawnerBlockEntity.getSpawner() instanceof StackedSpawnerTileImpl)) {
StackedSpawnerTile stackedSpawnerTile = new StackedSpawnerTileImpl(spawnerBlockEntity.getSpawner(), spawnerBlockEntity, stackedSpawner);
unsafe.putObject(spawnerBlockEntity, field_SpawnerBlockEntity_spawner_offset, stackedSpawnerTile);
return stackedSpawnerTile;
} else {
StackedSpawnerTileImpl spawnerTile = (StackedSpawnerTileImpl) spawnerBlockEntity.getSpawner();
spawnerTile.updateStackedSpawner(stackedSpawner);
return spawnerTile;
}
}
return null;
}
use of dev.rosewood.rosestacker.stack.StackedSpawner in project RoseStacker by Rosewood-Development.
the class UltimateStackerPluginConverter method convert.
@Override
public void convert() {
// If EpicSpawners is installed, spawner stacking functionality is handled by that plugin instead
if (Bukkit.getPluginManager().isPluginEnabled("EpicSpawners"))
return;
DataManager dataManager = this.rosePlugin.getManager(DataManager.class);
// Force save loaded data
this.ultimateStacker.getDataManager().bulkUpdateSpawners(this.ultimateStacker.getSpawnerStackManager().getStacks());
// Go through the database to be able to load all spawner information
DatabaseConnector connector = this.ultimateStacker.getDatabaseConnector();
connector.connect(connection -> {
// Load entities
try (Statement statement = connection.createStatement()) {
String query = "SELECT he.uuid AS uuid, COUNT(se.host) + 1 AS stackAmount FROM ultimatestacker_host_entities he " + "JOIN ultimatestacker_stacked_entities se ON he.id = se.host " + "GROUP BY se.host";
ResultSet result = statement.executeQuery(query);
Set<ConversionData> entityConversionData = new HashSet<>();
while (result.next()) {
UUID uuid = UUID.fromString(result.getString("uuid"));
int amount = result.getInt("stackAmount");
entityConversionData.add(new ConversionData(uuid, amount));
}
Map<StackType, Set<ConversionData>> conversionData = new HashMap<>();
conversionData.put(StackType.ENTITY, entityConversionData);
dataManager.setConversionData(conversionData);
}
// Load blocks
Set<StackedBlock> stackedBlocks = new HashSet<>();
try (Statement statement = connection.createStatement()) {
ResultSet result = statement.executeQuery("SELECT amount, world, x, y, z FROM ultimatestacker_blocks");
while (result.next()) {
World world = Bukkit.getWorld(result.getString("world"));
if (world == null)
continue;
int amount = result.getInt("amount");
if (amount == 1)
continue;
Block block = world.getBlockAt(result.getInt("x"), result.getInt("y"), result.getInt("z"));
stackedBlocks.add(new StackedBlock(amount, block));
}
}
// Load spawners
Set<StackedSpawner> stackedSpawners = new HashSet<>();
try (Statement statement = connection.createStatement()) {
ResultSet result = statement.executeQuery("SELECT amount, world, x, y, z FROM ultimatestacker_spawners");
while (result.next()) {
World world = Bukkit.getWorld(result.getString("world"));
if (world == null)
continue;
int x = result.getInt("x");
int y = result.getInt("y");
int z = result.getInt("z");
Location location = new Location(world, x, y, z);
int amount = result.getInt("amount");
stackedSpawners.add(new StackedSpawner(amount, location));
}
}
if (!stackedBlocks.isEmpty() || !stackedSpawners.isEmpty()) {
StackManager stackManager = this.rosePlugin.getManager(StackManager.class);
Bukkit.getScheduler().runTask(this.rosePlugin, () -> {
for (StackedBlock stackedBlock : stackedBlocks) stackManager.createBlockStack(stackedBlock.getLocation().getBlock(), stackedBlock.getStackSize());
for (StackedSpawner stackedSpawner : stackedSpawners) stackManager.createSpawnerStack(stackedSpawner.getLocation().getBlock(), stackedSpawner.getStackSize(), false);
});
}
});
}
Aggregations