mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-26 23:26:45 +01:00
Finished schematic importing and chest contents
This commit is contained in:
parent
d89d3cc8ae
commit
8ab2a0d278
@ -99,7 +99,6 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
|
|||||||
} else {
|
} else {
|
||||||
log("&dUsing metrics will allow us to improve the plugin, please consider it :)");
|
log("&dUsing metrics will allow us to improve the plugin, please consider it :)");
|
||||||
}
|
}
|
||||||
System.out.print("REGISTERING EVENTS");
|
|
||||||
getServer().getPluginManager().registerEvents(this, this);
|
getServer().getPluginManager().registerEvents(this, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ public class Claim extends SubCommand {
|
|||||||
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
|
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SchematicHandler.manager.paste(player.getLocation(), sch, plot2, 0, 0);
|
SchematicHandler.manager.paste(sch, plot2, 0, 0);
|
||||||
}
|
}
|
||||||
PlotSquared.getPlotManager(world).claimPlot(plotworld, plot);
|
PlotSquared.getPlotManager(world).claimPlot(plotworld, plot);
|
||||||
MainUtil.update(loc);
|
MainUtil.update(loc);
|
||||||
|
@ -39,6 +39,7 @@ import com.intellectualcrafters.plot.util.SchematicHandler.DataCollection;
|
|||||||
import com.intellectualcrafters.plot.util.SchematicHandler.Dimension;
|
import com.intellectualcrafters.plot.util.SchematicHandler.Dimension;
|
||||||
import com.intellectualcrafters.plot.util.SchematicHandler.Schematic;
|
import com.intellectualcrafters.plot.util.SchematicHandler.Schematic;
|
||||||
import com.intellectualcrafters.plot.util.TaskManager;
|
import com.intellectualcrafters.plot.util.TaskManager;
|
||||||
|
import com.intellectualcrafters.plot.util.bukkit.BukkitUtil;
|
||||||
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
|
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
|
||||||
|
|
||||||
public class SchematicCmd extends SubCommand {
|
public class SchematicCmd extends SubCommand {
|
||||||
@ -118,9 +119,16 @@ public class SchematicCmd extends SubCommand {
|
|||||||
}
|
}
|
||||||
final DataCollection[] b = schematic.getBlockCollection();
|
final DataCollection[] b = schematic.getBlockCollection();
|
||||||
final int sy = BlockManager.manager.getHeighestBlock(bot);
|
final int sy = BlockManager.manager.getHeighestBlock(bot);
|
||||||
final Location l1 = bot.add(0, sy - 1, 0);
|
|
||||||
final int WIDTH = schematic.getSchematicDimension().getX();
|
final int WIDTH = schematic.getSchematicDimension().getX();
|
||||||
final int LENGTH = schematic.getSchematicDimension().getZ();
|
final int LENGTH = schematic.getSchematicDimension().getZ();
|
||||||
|
final Location l1;
|
||||||
|
if (!(schematic.getSchematicDimension().getY() == BukkitUtil.getMaxHeight(loc.getWorld()))) {
|
||||||
|
l1 = bot.add(0, sy - 1, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
l1 = bot;
|
||||||
|
}
|
||||||
|
|
||||||
final int blen = b.length - 1;
|
final int blen = b.length - 1;
|
||||||
SchematicCmd.this.task = TaskManager.runTaskRepeat(new Runnable() {
|
SchematicCmd.this.task = TaskManager.runTaskRepeat(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@ -129,6 +137,7 @@ public class SchematicCmd extends SubCommand {
|
|||||||
while (!result) {
|
while (!result) {
|
||||||
final int start = SchematicCmd.this.counter * 5000;
|
final int start = SchematicCmd.this.counter * 5000;
|
||||||
if (start > blen) {
|
if (start > blen) {
|
||||||
|
SchematicHandler.manager.pasteStates(schematic, plot, 0, 0);
|
||||||
sendMessage(plr, C.SCHEMATIC_PASTE_SUCCESS);
|
sendMessage(plr, C.SCHEMATIC_PASTE_SUCCESS);
|
||||||
MainUtil.update(plr.getLocation());
|
MainUtil.update(plr.getLocation());
|
||||||
SchematicCmd.this.running = false;
|
SchematicCmd.this.running = false;
|
||||||
|
@ -31,7 +31,7 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.generator.BlockPopulator;
|
import org.bukkit.generator.BlockPopulator;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.object.ChunkLoc;
|
import com.intellectualcrafters.plot.object.PlotLoc;
|
||||||
import com.intellectualcrafters.plot.object.PlotGenerator;
|
import com.intellectualcrafters.plot.object.PlotGenerator;
|
||||||
import com.intellectualcrafters.plot.object.PlotManager;
|
import com.intellectualcrafters.plot.object.PlotManager;
|
||||||
import com.intellectualcrafters.plot.object.PlotWorld;
|
import com.intellectualcrafters.plot.object.PlotWorld;
|
||||||
@ -266,7 +266,7 @@ public class HybridGen extends PlotGenerator {
|
|||||||
}
|
}
|
||||||
setBlock(this.result, x, this.plotheight, z, this.plotfloors);
|
setBlock(this.result, x, this.plotheight, z, this.plotfloors);
|
||||||
} else {
|
} else {
|
||||||
final ChunkLoc loc = new ChunkLoc(X + x, Z + z);
|
final PlotLoc loc = new PlotLoc((short) (X + x), (short) (Z + z));
|
||||||
final HashMap<Short, Short> blocks = ChunkManager.GENERATE_BLOCKS.get(loc);
|
final HashMap<Short, Short> blocks = ChunkManager.GENERATE_BLOCKS.get(loc);
|
||||||
if (blocks != null) {
|
if (blocks != null) {
|
||||||
for (final short y : blocks.keySet()) {
|
for (final short y : blocks.keySet()) {
|
||||||
@ -304,7 +304,7 @@ public class HybridGen extends PlotGenerator {
|
|||||||
}
|
}
|
||||||
setBlock(this.result, x, this.plotheight, z, this.plotfloors);
|
setBlock(this.result, x, this.plotheight, z, this.plotfloors);
|
||||||
if (this.plotworld.PLOT_SCHEMATIC) {
|
if (this.plotworld.PLOT_SCHEMATIC) {
|
||||||
final ChunkLoc loc = new ChunkLoc(absX, absZ);
|
final PlotLoc loc = new PlotLoc((short) absX, (short) absZ);
|
||||||
final HashMap<Short, Short> blocks = this.plotworld.G_SCH.get(loc);
|
final HashMap<Short, Short> blocks = this.plotworld.G_SCH.get(loc);
|
||||||
if (blocks != null) {
|
if (blocks != null) {
|
||||||
for (final short y : blocks.keySet()) {
|
for (final short y : blocks.keySet()) {
|
||||||
@ -329,7 +329,7 @@ public class HybridGen extends PlotGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.plotworld.ROAD_SCHEMATIC_ENABLED) {
|
if (this.plotworld.ROAD_SCHEMATIC_ENABLED) {
|
||||||
final ChunkLoc loc = new ChunkLoc(absX, absZ);
|
final PlotLoc loc = new PlotLoc((short) absX, (short) absZ);
|
||||||
final HashMap<Short, Short> blocks = this.plotworld.G_SCH.get(loc);
|
final HashMap<Short, Short> blocks = this.plotworld.G_SCH.get(loc);
|
||||||
if (blocks != null) {
|
if (blocks != null) {
|
||||||
for (final short y : blocks.keySet()) {
|
for (final short y : blocks.keySet()) {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
package com.intellectualcrafters.plot.generator;
|
package com.intellectualcrafters.plot.generator;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
@ -28,8 +29,9 @@ import org.bukkit.configuration.ConfigurationSection;
|
|||||||
import com.intellectualcrafters.plot.PlotSquared;
|
import com.intellectualcrafters.plot.PlotSquared;
|
||||||
import com.intellectualcrafters.plot.config.C;
|
import com.intellectualcrafters.plot.config.C;
|
||||||
import com.intellectualcrafters.plot.config.Configuration;
|
import com.intellectualcrafters.plot.config.Configuration;
|
||||||
import com.intellectualcrafters.plot.object.ChunkLoc;
|
import com.intellectualcrafters.plot.object.PlotLoc;
|
||||||
import com.intellectualcrafters.plot.object.PlotBlock;
|
import com.intellectualcrafters.plot.object.PlotBlock;
|
||||||
|
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
||||||
import com.intellectualcrafters.plot.util.SchematicHandler;
|
import com.intellectualcrafters.plot.util.SchematicHandler;
|
||||||
import com.intellectualcrafters.plot.util.SchematicHandler.DataCollection;
|
import com.intellectualcrafters.plot.util.SchematicHandler.DataCollection;
|
||||||
import com.intellectualcrafters.plot.util.SchematicHandler.Dimension;
|
import com.intellectualcrafters.plot.util.SchematicHandler.Dimension;
|
||||||
@ -50,8 +52,9 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
super(worldname);
|
super(worldname);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap<ChunkLoc, HashMap<Short, Short>> G_SCH;
|
public HashMap<PlotLoc, HashMap<Short, Short>> G_SCH;
|
||||||
public HashMap<ChunkLoc, HashMap<Short, Byte>> G_SCH_DATA;
|
public HashMap<PlotLoc, HashMap<Short, Byte>> G_SCH_DATA;
|
||||||
|
public HashMap<PlotLoc, HashSet<PlotItem>> G_SCH_STATE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called when a world loads. Make sure you set all your constants here. You are provided with the
|
* This method is called when a world loads. Make sure you set all your constants here. You are provided with the
|
||||||
@ -130,6 +133,23 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
HashSet<PlotItem> items = schem3.getItems();
|
||||||
|
if (items != null) {
|
||||||
|
G_SCH_STATE = new HashMap<>();
|
||||||
|
for (PlotItem item : items) {
|
||||||
|
item.x += shift + oddshift + center_shift_x;
|
||||||
|
item.z += shift + oddshift + center_shift_z;
|
||||||
|
item.y += this.PLOT_HEIGHT;
|
||||||
|
int x = item.x;
|
||||||
|
int y = item.y;
|
||||||
|
int z = item.z;
|
||||||
|
PlotLoc loc = new PlotLoc((short) x, (short) z);
|
||||||
|
if (!G_SCH_STATE.containsKey(loc)) {
|
||||||
|
G_SCH_STATE.put(loc, new HashSet<PlotItem>());
|
||||||
|
}
|
||||||
|
G_SCH_STATE.get(loc).add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((schem1 == null) || (schem2 == null) || (this.ROAD_WIDTH == 0)) {
|
if ((schem1 == null) || (schem2 == null) || (this.ROAD_WIDTH == 0)) {
|
||||||
PlotSquared.log(C.PREFIX.s() + "&3 - schematic: &7false");
|
PlotSquared.log(C.PREFIX.s() + "&3 - schematic: &7false");
|
||||||
@ -300,7 +320,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
x += this.SIZE;
|
x += this.SIZE;
|
||||||
}
|
}
|
||||||
final ChunkLoc loc = new ChunkLoc(x, z);
|
final PlotLoc loc = new PlotLoc(x, z);
|
||||||
if (!this.G_SCH.containsKey(loc)) {
|
if (!this.G_SCH.containsKey(loc)) {
|
||||||
this.G_SCH.put(loc, new HashMap<Short, Short>());
|
this.G_SCH.put(loc, new HashMap<Short, Short>());
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.intellectualcrafters.plot.generator;
|
package com.intellectualcrafters.plot.generator;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
@ -9,9 +10,11 @@ import org.bukkit.block.Biome;
|
|||||||
import org.bukkit.generator.BlockPopulator;
|
import org.bukkit.generator.BlockPopulator;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.PlotSquared;
|
import com.intellectualcrafters.plot.PlotSquared;
|
||||||
import com.intellectualcrafters.plot.object.ChunkLoc;
|
import com.intellectualcrafters.plot.object.PlotLoc;
|
||||||
import com.intellectualcrafters.plot.object.PlotWorld;
|
import com.intellectualcrafters.plot.object.PlotWorld;
|
||||||
import com.intellectualcrafters.plot.object.RegionWrapper;
|
import com.intellectualcrafters.plot.object.RegionWrapper;
|
||||||
|
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
||||||
|
import com.intellectualcrafters.plot.util.BlockManager;
|
||||||
import com.intellectualcrafters.plot.util.ChunkManager;
|
import com.intellectualcrafters.plot.util.ChunkManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -138,8 +141,23 @@ public class HybridPop extends BlockPopulator {
|
|||||||
if (this.doFloor) {
|
if (this.doFloor) {
|
||||||
setBlock(w, x, (short) this.plotheight, z, this.plotfloors);
|
setBlock(w, x, (short) this.plotheight, z, this.plotfloors);
|
||||||
}
|
}
|
||||||
|
if (this.plotworld.PLOT_SCHEMATIC) {
|
||||||
|
final PlotLoc loc = new PlotLoc((short) (this.X + x), (short) (this.Z + z));
|
||||||
|
final HashMap<Short, Byte> blocks = this.plotworld.G_SCH_DATA.get(loc);
|
||||||
|
if (blocks != null) {
|
||||||
|
for (final short y : blocks.keySet()) {
|
||||||
|
setBlock(w, x, (short) (this.plotheight + y), z, blocks.get(y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HashSet<PlotItem> states = this.plotworld.G_SCH_STATE.get(loc);
|
||||||
|
if (states != null) {
|
||||||
|
for (PlotItem items : states) {
|
||||||
|
BlockManager.manager.addItems(this.plotworld.worldname, items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
final ChunkLoc loc = new ChunkLoc(this.X + x, this.Z + z);
|
final PlotLoc loc = new PlotLoc((short) (this.X + x), (short) (this.Z + z));
|
||||||
final HashMap<Short, Byte> data = ChunkManager.GENERATE_DATA.get(loc);
|
final HashMap<Short, Byte> data = ChunkManager.GENERATE_DATA.get(loc);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
for (final short y : data.keySet()) {
|
for (final short y : data.keySet()) {
|
||||||
@ -178,6 +196,23 @@ public class HybridPop extends BlockPopulator {
|
|||||||
if (this.doFloor) {
|
if (this.doFloor) {
|
||||||
setBlock(w, x, (short) this.plotheight, z, this.plotfloors);
|
setBlock(w, x, (short) this.plotheight, z, this.plotfloors);
|
||||||
}
|
}
|
||||||
|
if (this.plotworld.PLOT_SCHEMATIC) {
|
||||||
|
final PlotLoc loc = new PlotLoc(absX, absZ);
|
||||||
|
final HashMap<Short, Byte> blocks = this.plotworld.G_SCH_DATA.get(loc);
|
||||||
|
if (blocks != null) {
|
||||||
|
for (final short y : blocks.keySet()) {
|
||||||
|
setBlock(w, x, (short) (this.plotheight + y), z, blocks.get(y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HashSet<PlotItem> states = this.plotworld.G_SCH_STATE.get(loc);
|
||||||
|
if (states != null) {
|
||||||
|
for (PlotItem items : states) {
|
||||||
|
items.x = this.X + x;
|
||||||
|
items.z = this.Z + z;
|
||||||
|
BlockManager.manager.addItems(this.plotworld.worldname, items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// wall
|
// wall
|
||||||
if (((absX >= this.pathWidthLower) && (absX <= this.pathWidthUpper) && (absZ >= this.pathWidthLower) && (absZ <= this.pathWidthUpper))) {
|
if (((absX >= this.pathWidthLower) && (absX <= this.pathWidthUpper) && (absZ >= this.pathWidthLower) && (absZ <= this.pathWidthUpper))) {
|
||||||
@ -199,7 +234,7 @@ public class HybridPop extends BlockPopulator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.plotworld.ROAD_SCHEMATIC_ENABLED) {
|
if (this.plotworld.ROAD_SCHEMATIC_ENABLED) {
|
||||||
final ChunkLoc loc = new ChunkLoc(absX, absZ);
|
final PlotLoc loc = new PlotLoc(absX, absZ);
|
||||||
final HashMap<Short, Byte> blocks = this.plotworld.G_SCH_DATA.get(loc);
|
final HashMap<Short, Byte> blocks = this.plotworld.G_SCH_DATA.get(loc);
|
||||||
if (blocks != null) {
|
if (blocks != null) {
|
||||||
for (final short y : blocks.keySet()) {
|
for (final short y : blocks.keySet()) {
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.intellectualcrafters.plot.object.schematic;
|
||||||
|
|
||||||
|
public class PlotItem {
|
||||||
|
public int x;
|
||||||
|
public int y;
|
||||||
|
public int z;
|
||||||
|
public short[] id;
|
||||||
|
public byte[] data;
|
||||||
|
public byte[] amount;
|
||||||
|
|
||||||
|
public PlotItem(short x, short y, short z, short[] id, byte[] data, byte[] amount) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
this.id = id;
|
||||||
|
this.data = data;
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,8 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
@ -16,16 +18,55 @@ import com.intellectualcrafters.jnbt.CompoundTag;
|
|||||||
import com.intellectualcrafters.jnbt.ListTag;
|
import com.intellectualcrafters.jnbt.ListTag;
|
||||||
import com.intellectualcrafters.jnbt.ShortTag;
|
import com.intellectualcrafters.jnbt.ShortTag;
|
||||||
import com.intellectualcrafters.jnbt.Tag;
|
import com.intellectualcrafters.jnbt.Tag;
|
||||||
|
import com.intellectualcrafters.plot.object.Location;
|
||||||
|
import com.intellectualcrafters.plot.util.BlockManager;
|
||||||
|
import com.intellectualcrafters.plot.util.SchematicHandler.Schematic;
|
||||||
|
|
||||||
public class StateWrapper {
|
public class StateWrapper {
|
||||||
|
|
||||||
public BlockState state;
|
public BlockState state = null;
|
||||||
|
public CompoundTag tag = null;
|
||||||
|
|
||||||
public StateWrapper(BlockState state) {
|
public StateWrapper(BlockState state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StateWrapper(CompoundTag tag) {
|
||||||
|
this.tag = tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean restoreTag(short x, short y, short z, Schematic schematic) {
|
||||||
|
if (this.tag == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
List<Tag> itemsTag = this.tag.getListTag("Items").getValue();
|
||||||
|
int length = itemsTag.size();
|
||||||
|
short[] ids = new short[length];
|
||||||
|
byte[] datas = new byte[length];
|
||||||
|
byte[] amounts = new byte[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
Tag itemTag = itemsTag.get(i);
|
||||||
|
CompoundTag itemComp = (CompoundTag) itemTag;
|
||||||
|
short id = itemComp.getShort("id");
|
||||||
|
String idStr = itemComp.getString("id");
|
||||||
|
if (!StringUtils.isNumeric(idStr) && idStr != null) {
|
||||||
|
idStr = idStr.split(":")[1];
|
||||||
|
id = (short) Material.valueOf(idStr.toUpperCase()).getId();
|
||||||
|
}
|
||||||
|
ids[i] = id;
|
||||||
|
datas[i] = (byte) itemComp.getShort("Damage");
|
||||||
|
amounts[i] = itemComp.getByte("Count");
|
||||||
|
}
|
||||||
|
if (length != 0) {
|
||||||
|
schematic.addItem(new PlotItem(x, y, z, ids, datas, amounts));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public CompoundTag getTag() {
|
public CompoundTag getTag() {
|
||||||
|
if (this.tag != null) {
|
||||||
|
return this.tag;
|
||||||
|
}
|
||||||
if (state instanceof InventoryHolder) {
|
if (state instanceof InventoryHolder) {
|
||||||
InventoryHolder inv = (InventoryHolder) state;
|
InventoryHolder inv = (InventoryHolder) state;
|
||||||
ItemStack[] contents = inv.getInventory().getContents();
|
ItemStack[] contents = inv.getInventory().getContents();
|
||||||
|
@ -1,14 +1,19 @@
|
|||||||
package com.intellectualcrafters.plot.util;
|
package com.intellectualcrafters.plot.util;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.object.Location;
|
import com.intellectualcrafters.plot.object.Location;
|
||||||
import com.intellectualcrafters.plot.object.PlotBlock;
|
import com.intellectualcrafters.plot.object.PlotBlock;
|
||||||
import com.intellectualcrafters.plot.object.PseudoRandom;
|
import com.intellectualcrafters.plot.object.PseudoRandom;
|
||||||
|
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
||||||
|
|
||||||
public abstract class BlockManager {
|
public abstract class BlockManager {
|
||||||
public static BlockManager manager;
|
public static BlockManager manager;
|
||||||
|
|
||||||
public abstract String[] getBiomeList();
|
public abstract String[] getBiomeList();
|
||||||
|
|
||||||
|
public abstract boolean addItems(String world, PlotItem items);
|
||||||
|
|
||||||
public abstract int getBiomeFromString(String biome);
|
public abstract int getBiomeFromString(String biome);
|
||||||
|
|
||||||
public abstract int getBlockIdFromString(String block);
|
public abstract int getBlockIdFromString(String block);
|
||||||
|
@ -6,20 +6,29 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
import java.util.zip.GZIPOutputStream;
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
|
||||||
import com.intellectualcrafters.jnbt.ByteArrayTag;
|
import com.intellectualcrafters.jnbt.ByteArrayTag;
|
||||||
import com.intellectualcrafters.jnbt.CompoundTag;
|
import com.intellectualcrafters.jnbt.CompoundTag;
|
||||||
|
import com.intellectualcrafters.jnbt.IntTag;
|
||||||
|
import com.intellectualcrafters.jnbt.ListTag;
|
||||||
import com.intellectualcrafters.jnbt.NBTInputStream;
|
import com.intellectualcrafters.jnbt.NBTInputStream;
|
||||||
import com.intellectualcrafters.jnbt.NBTOutputStream;
|
import com.intellectualcrafters.jnbt.NBTOutputStream;
|
||||||
import com.intellectualcrafters.jnbt.ShortTag;
|
import com.intellectualcrafters.jnbt.ShortTag;
|
||||||
import com.intellectualcrafters.jnbt.Tag;
|
import com.intellectualcrafters.jnbt.Tag;
|
||||||
import com.intellectualcrafters.plot.PlotSquared;
|
import com.intellectualcrafters.plot.PlotSquared;
|
||||||
|
import com.intellectualcrafters.plot.commands.Set;
|
||||||
import com.intellectualcrafters.plot.object.Location;
|
import com.intellectualcrafters.plot.object.Location;
|
||||||
import com.intellectualcrafters.plot.object.Plot;
|
import com.intellectualcrafters.plot.object.Plot;
|
||||||
import com.intellectualcrafters.plot.object.PlotId;
|
import com.intellectualcrafters.plot.object.PlotId;
|
||||||
|
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
||||||
|
import com.intellectualcrafters.plot.object.schematic.StateWrapper;
|
||||||
import com.intellectualcrafters.plot.util.bukkit.BukkitUtil;
|
import com.intellectualcrafters.plot.util.bukkit.BukkitUtil;
|
||||||
|
|
||||||
public abstract class SchematicHandler {
|
public abstract class SchematicHandler {
|
||||||
@ -34,7 +43,7 @@ public abstract class SchematicHandler {
|
|||||||
*
|
*
|
||||||
* @return true if succeeded
|
* @return true if succeeded
|
||||||
*/
|
*/
|
||||||
public boolean paste(final Location location, final Schematic schematic, final Plot plot, final int x_offset, final int z_offset) {
|
public boolean paste(final Schematic schematic, final Plot plot, final int x_offset, final int z_offset) {
|
||||||
if (schematic == null) {
|
if (schematic == null) {
|
||||||
PlotSquared.log("Schematic == null :|");
|
PlotSquared.log("Schematic == null :|");
|
||||||
return false;
|
return false;
|
||||||
@ -46,12 +55,16 @@ public abstract class SchematicHandler {
|
|||||||
final int HEIGHT = demensions.getY();
|
final int HEIGHT = demensions.getY();
|
||||||
final DataCollection[] blocks = schematic.getBlockCollection();
|
final DataCollection[] blocks = schematic.getBlockCollection();
|
||||||
Location l1 = MainUtil.getPlotBottomLoc(plot.world, plot.getId());
|
Location l1 = MainUtil.getPlotBottomLoc(plot.world, plot.getId());
|
||||||
final int sy = BukkitUtil.getHeighestBlock(location.getWorld(), l1.getX() + 1, l1.getZ() + 1);
|
final int sy = BukkitUtil.getHeighestBlock(plot.world, l1.getX() + 1, l1.getZ() + 1);
|
||||||
|
if (!(HEIGHT == BukkitUtil.getMaxHeight(plot.world))) {
|
||||||
l1 = l1.add(1, sy - 1, 1);
|
l1 = l1.add(1, sy - 1, 1);
|
||||||
if (HEIGHT == BukkitUtil.getMaxHeight(location.getWorld())) {
|
|
||||||
} else {
|
|
||||||
l1.getY();
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
l1 = l1.add(1, 0, 1);
|
||||||
|
}
|
||||||
|
int X = l1.getX();
|
||||||
|
int Y = l1.getY();
|
||||||
|
int Z = l1.getZ();
|
||||||
final int[] xl = new int[blocks.length];
|
final int[] xl = new int[blocks.length];
|
||||||
final int[] yl = new int[blocks.length];
|
final int[] yl = new int[blocks.length];
|
||||||
final int[] zl = new int[blocks.length];
|
final int[] zl = new int[blocks.length];
|
||||||
@ -62,21 +75,52 @@ public abstract class SchematicHandler {
|
|||||||
for (int y = 0; y < HEIGHT; y++) {
|
for (int y = 0; y < HEIGHT; y++) {
|
||||||
final int index = (y * WIDTH * LENGTH) + (z * WIDTH) + x;
|
final int index = (y * WIDTH * LENGTH) + (z * WIDTH) + x;
|
||||||
final DataCollection block = blocks[index];
|
final DataCollection block = blocks[index];
|
||||||
xl[index] = x;
|
xl[index] = x + X;
|
||||||
yl[index] = y;
|
yl[index] = y + Y;
|
||||||
zl[index] = z;
|
zl[index] = z + Z;
|
||||||
ids[index] = block.block;
|
ids[index] = block.block;
|
||||||
data[index] = block.data;
|
data[index] = block.data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BlockManager.setBlocks(plot.world, xl, yl, zl, ids, data);
|
BlockManager.setBlocks(plot.world, xl, yl, zl, ids, data);
|
||||||
|
pasteStates(schematic, plot, x_offset, z_offset);
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean pasteStates(final Schematic schematic, final Plot plot, final int x_offset, final int z_offset) {
|
||||||
|
if (schematic == null) {
|
||||||
|
PlotSquared.log("Schematic == null :|");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
HashSet<PlotItem> items = schematic.getItems();
|
||||||
|
if (items == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Location l1 = MainUtil.getPlotBottomLoc(plot.world, plot.getId());
|
||||||
|
final int sy = BukkitUtil.getHeighestBlock(plot.world, l1.getX() + 1, l1.getZ() + 1);
|
||||||
|
final Dimension demensions = schematic.getSchematicDimension();
|
||||||
|
final int HEIGHT = demensions.getY();
|
||||||
|
if (!(HEIGHT == BukkitUtil.getMaxHeight(plot.world))) {
|
||||||
|
l1 = l1.add(1, sy - 1, 1);
|
||||||
|
} else {
|
||||||
|
l1 = l1.add(1, 0, 1);
|
||||||
|
}
|
||||||
|
int X = l1.getX() + x_offset;
|
||||||
|
int Y = l1.getY();
|
||||||
|
int Z = l1.getZ() + z_offset;
|
||||||
|
for (PlotItem item : items) {
|
||||||
|
item.x += X;
|
||||||
|
item.y += Y;
|
||||||
|
item.z += Z;
|
||||||
|
BlockManager.manager.addItems(plot.world, item);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public Schematic getSchematic(final CompoundTag tag, final File file) {
|
public Schematic getSchematic(final CompoundTag tag, final File file) {
|
||||||
final Map<String, Tag> tagMap = tag.getValue();
|
final Map<String, Tag> tagMap = tag.getValue();
|
||||||
byte[] addId = new byte[0];
|
byte[] addId = new byte[0];
|
||||||
@ -106,7 +150,22 @@ public abstract class SchematicHandler {
|
|||||||
for (int x = 0; x < b.length; x++) {
|
for (int x = 0; x < b.length; x++) {
|
||||||
collection[x] = new DataCollection(blocks[x], d[x]);
|
collection[x] = new DataCollection(blocks[x], d[x]);
|
||||||
}
|
}
|
||||||
return new Schematic(collection, dimension, file);
|
Schematic schem = new Schematic(collection, dimension, file);
|
||||||
|
try {
|
||||||
|
List<Tag> blockStates = ListTag.class.cast(tagMap.get("TileEntities")).getValue();
|
||||||
|
for (Tag stateTag : blockStates) {
|
||||||
|
CompoundTag ct = ((CompoundTag) stateTag);
|
||||||
|
Map<String, Tag> state = ct.getValue();
|
||||||
|
short x = IntTag.class.cast(state.get("x")).getValue().shortValue();
|
||||||
|
short y = IntTag.class.cast(state.get("y")).getValue().shortValue();
|
||||||
|
short z = IntTag.class.cast(state.get("z")).getValue().shortValue();
|
||||||
|
new StateWrapper(ct).restoreTag(x, y, z, schem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return schem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -196,7 +255,12 @@ public abstract class SchematicHandler {
|
|||||||
length++;
|
length++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
length = i2 - length;
|
length = i2 - i1 - length + 1;
|
||||||
|
|
||||||
|
int X = l1.getX();
|
||||||
|
int Y = l1.getY();
|
||||||
|
int Z = l1.getZ();
|
||||||
|
|
||||||
final int[] xl = new int[length];
|
final int[] xl = new int[length];
|
||||||
final int[] yl = new int[length];
|
final int[] yl = new int[length];
|
||||||
final int[] zl = new int[length];
|
final int[] zl = new int[length];
|
||||||
@ -206,19 +270,19 @@ public abstract class SchematicHandler {
|
|||||||
for (int i = i1; i <= i2; i++) {
|
for (int i = i1; i <= i2; i++) {
|
||||||
final short id = blocks[i].block;
|
final short id = blocks[i].block;
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
continue;
|
continue; //
|
||||||
}
|
}
|
||||||
count++;
|
|
||||||
final int area = WIDTH * LENGTH;
|
final int area = WIDTH * LENGTH;
|
||||||
final int r = i % (area);
|
final int r = i % (area);
|
||||||
final int x = r % WIDTH;
|
final int x = r % WIDTH;
|
||||||
final int y = i / area;
|
final int y = i / area;
|
||||||
final int z = r / WIDTH;
|
final int z = r / WIDTH;
|
||||||
xl[count] = x;
|
xl[count] = x + X;
|
||||||
yl[count] = y;
|
yl[count] = y + Y;
|
||||||
zl[count] = z;
|
zl[count] = z + Z;
|
||||||
ids[count] = id;
|
ids[count] = id;
|
||||||
data[count] = blocks[i].data;
|
data[count] = blocks[i].data;
|
||||||
|
count++;
|
||||||
if (y > 256) {
|
if (y > 256) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -236,6 +300,18 @@ public abstract class SchematicHandler {
|
|||||||
private final DataCollection[] blockCollection;
|
private final DataCollection[] blockCollection;
|
||||||
private final Dimension schematicDimension;
|
private final Dimension schematicDimension;
|
||||||
private final File file;
|
private final File file;
|
||||||
|
private HashSet<PlotItem> items;
|
||||||
|
|
||||||
|
public void addItem(PlotItem item) {
|
||||||
|
if (this.items == null) {
|
||||||
|
this.items = new HashSet<>();
|
||||||
|
}
|
||||||
|
items.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashSet<PlotItem> getItems() {
|
||||||
|
return this.items;
|
||||||
|
}
|
||||||
|
|
||||||
public Schematic(final DataCollection[] blockCollection, final Dimension schematicDimension, final File file) {
|
public Schematic(final DataCollection[] blockCollection, final Dimension schematicDimension, final File file) {
|
||||||
this.blockCollection = blockCollection;
|
this.blockCollection = blockCollection;
|
||||||
|
@ -15,11 +15,15 @@ import org.bukkit.block.BlockState;
|
|||||||
import org.bukkit.block.Sign;
|
import org.bukkit.block.Sign;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.object.BukkitPlayer;
|
import com.intellectualcrafters.plot.object.BukkitPlayer;
|
||||||
import com.intellectualcrafters.plot.object.Location;
|
import com.intellectualcrafters.plot.object.Location;
|
||||||
import com.intellectualcrafters.plot.object.PlotBlock;
|
import com.intellectualcrafters.plot.object.PlotBlock;
|
||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||||
|
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
||||||
import com.intellectualcrafters.plot.util.BlockManager;
|
import com.intellectualcrafters.plot.util.BlockManager;
|
||||||
|
|
||||||
public class BukkitUtil extends BlockManager {
|
public class BukkitUtil extends BlockManager {
|
||||||
@ -257,4 +261,26 @@ public class BukkitUtil extends BlockManager {
|
|||||||
}
|
}
|
||||||
return material.getId();
|
return material.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addItems(String worldname, PlotItem items) {
|
||||||
|
World world = getWorld(worldname);
|
||||||
|
Block block = world.getBlockAt(items.x, items.y, items.z);
|
||||||
|
if (block == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
BlockState state = block.getState();
|
||||||
|
if (state != null && state instanceof InventoryHolder) {
|
||||||
|
InventoryHolder holder = ((InventoryHolder) state);
|
||||||
|
Inventory inv = holder.getInventory();
|
||||||
|
for (int i = 0; i < items.id.length; i++) {
|
||||||
|
ItemStack item = new ItemStack(items.id[i], items.amount[i], items.data[i]);
|
||||||
|
inv.addItem(item);
|
||||||
|
}
|
||||||
|
state.update(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user