Chest and dispenser contents and now saved in memory. Just need to save them to disk now. Woot.

This commit is contained in:
taoneill 2011-02-06 17:22:28 -05:00
parent 00edf1e344
commit 0accca079a

View File

@ -1,11 +1,21 @@
package com.tommytony.war.volumes; package com.tommytony.war.volumes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.Dispenser;
import org.bukkit.block.Sign;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import bukkit.tommytony.war.War; import bukkit.tommytony.war.War;
@ -22,6 +32,8 @@ public class Volume {
private Block cornerTwo; private Block cornerTwo;
private int[][][] blockTypes = null; private int[][][] blockTypes = null;
private byte[][][] blockDatas = null; private byte[][][] blockDatas = null;
private HashMap<String, String[]> signLines = new HashMap<String, String[]>();
private HashMap<String, List<ItemStack>> invBlockContents = new HashMap<String, List<ItemStack>>();
private final War war; private final War war;
public Volume(String name, War war, World world) { public Volume(String name, War war, World world) {
@ -48,6 +60,7 @@ public class Volume {
if(hasTwoCorners()) { if(hasTwoCorners()) {
this.setBlockTypes(new int[getSizeX()][getSizeY()][getSizeZ()]); this.setBlockTypes(new int[getSizeX()][getSizeY()][getSizeZ()]);
this.setBlockDatas(new byte[getSizeX()][getSizeY()][getSizeZ()]); this.setBlockDatas(new byte[getSizeX()][getSizeY()][getSizeZ()]);
this.getSignLines().clear();
int x = getMinX(); int x = getMinX();
for(int i = 0; i < getSizeX(); i++){ for(int i = 0; i < getSizeX(); i++){
int y = getMinY(); int y = getMinY();
@ -57,6 +70,38 @@ public class Volume {
Block block = getWorld().getBlockAt(x, y, z); Block block = getWorld().getBlockAt(x, y, z);
this.getBlockTypes()[i][j][k] = block.getTypeId(); this.getBlockTypes()[i][j][k] = block.getTypeId();
this.getBlockDatas()[i][j][k] = block.getData(); this.getBlockDatas()[i][j][k] = block.getData();
BlockState state = block.getState();
if(state instanceof Sign) {
// Signs
Sign sign = (Sign)state;
this.getSignLines().put("sign-" + i + "-" + j + "," + k, sign.getLines());
} else if(state instanceof Chest) {
// Chests
Chest chest = (Chest)state;
Inventory inv = chest.getInventory();
int size = inv.getSize();
List<ItemStack> items = new ArrayList<ItemStack>();
for(int invIndex = 0; invIndex < size; invIndex++){
ItemStack item = inv.getItem(invIndex);
if(item != null && item.getType().getId() != Material.AIR.getId()) {
items.add(item);
}
}
this.getInvBlockContents().put("chest-" + i + "-" + j + "," + k, items);
} else if(state instanceof Dispenser) {
// Dispensers
Dispenser dispenser = (Dispenser)state;
Inventory inv = dispenser.getInventory();
int size = inv.getSize();
List<ItemStack> items = new ArrayList<ItemStack>();
for(int invIndex = 0; invIndex < size; invIndex++){
ItemStack item = inv.getItem(invIndex);
if(item != null && item.getType().getId() != Material.AIR.getId()) {
items.add(item);
}
}
this.getInvBlockContents().put("dispenser-" + i + "-" + j + "," + k, items);
}
z++; z++;
noOfSavedBlocks++; noOfSavedBlocks++;
} }
@ -88,11 +133,11 @@ public class Volume {
if(currentBlock.getTypeId() != oldBlockType || if(currentBlock.getTypeId() != oldBlockType ||
(currentBlock.getTypeId() == oldBlockType && currentBlock.getData() != oldBlockData ) || (currentBlock.getTypeId() == oldBlockType && currentBlock.getData() != oldBlockData ) ||
(currentBlock.getTypeId() == oldBlockType && currentBlock.getData() == oldBlockData && (currentBlock.getTypeId() == oldBlockType && currentBlock.getData() == oldBlockData &&
(oldBlockType == Material.SIGN.getId() || oldBlockType == Material.SIGN_POST.getId()) (oldBlockType == Material.SIGN.getId() || oldBlockType == Material.SIGN_POST.getId()
|| oldBlockType == Material.CHEST.getId() || oldBlockType == Material.DISPENSER.getId())
) )
) { ) {
currentBlock.setTypeId(oldBlockType);
currentBlock.setData(oldBlockData);
// if(oldBlockInfo.is(Material.SIGN) || oldBlockInfo.is(Material.SIGN_POST)) { // if(oldBlockInfo.is(Material.SIGN) || oldBlockInfo.is(Material.SIGN_POST)) {
// BlockState state = currentBlock.getState(); // BlockState state = currentBlock.getState();
// Sign currentSign = (Sign) state; // Sign currentSign = (Sign) state;
@ -102,6 +147,56 @@ public class Volume {
// currentSign.setLine(3, oldBlockInfo.getSignLines()[3]); // currentSign.setLine(3, oldBlockInfo.getSignLines()[3]);
// state.update(); // state.update();
// } // }
BlockState state = currentBlock.getState();
if(oldBlockType == Material.SIGN.getId()
|| oldBlockType == Material.SIGN_POST.getId()) {
// Signs
state.setType(Material.getMaterial(oldBlockType));
state.setData(new MaterialData(oldBlockType, oldBlockData));
state.update(true);
state = war.refetchStateForBlock(world, state.getBlock());
Sign sign = (Sign)state;
String[] lines = this.getSignLines().get("sign-" + i + "-" + j + "," + k);
sign.setLine(0, lines[0]);
sign.setLine(1, lines[1]);
sign.setLine(2, lines[2]);
sign.setLine(3, lines[3]);
sign.update(true);
} else if(oldBlockType == Material.CHEST.getId()) {
// Chests
state.setType(Material.getMaterial(oldBlockType));
state.setData(new MaterialData(oldBlockType, oldBlockData));
state.update(true);
state = war.refetchStateForBlock(world, state.getBlock());
Chest chest = (Chest)state;
List<ItemStack> contents = this.getInvBlockContents().get("chest-" + i + "-" + j + "," + k);
int ii = 0;
chest.getInventory().clear();
for(ItemStack item : contents) {
chest.getInventory().setItem(ii, item);
ii++;
}
chest.update(true);
} else if(oldBlockType == Material.DISPENSER.getId()) {
// Dispensers
state.setType(Material.getMaterial(oldBlockType));
state.setData(new MaterialData(oldBlockType, oldBlockData));
state.update(true);
state = war.refetchStateForBlock(world, state.getBlock());
Dispenser dispenser = (Dispenser)state;
List<ItemStack> contents = this.getInvBlockContents().get("dispenser-" + i + "-" + j + "," + k);
int ii = 0;
dispenser.getInventory().clear();
for(ItemStack item : contents) {
dispenser.getInventory().setItem(ii, item);
ii++;
}
dispenser.update(true);
} else {
// regular block
currentBlock.setType(Material.getMaterial(oldBlockType));
currentBlock.setData(oldBlockData);
}
noOfResetBlocks++; noOfResetBlocks++;
} }
z++; z++;
@ -355,4 +450,20 @@ public class Volume {
switchMaterials(toAirMaterials, Material.AIR); switchMaterials(toAirMaterials, Material.AIR);
} }
public void setSignLines(HashMap<String, String[]> signLines) {
this.signLines = signLines;
}
public HashMap<String, String[]> getSignLines() {
return signLines;
}
public void setInvBlockContents(HashMap<String, List<ItemStack>> invBlockContents) {
this.invBlockContents = invBlockContents;
}
public HashMap<String, List<ItemStack>> getInvBlockContents() {
return invBlockContents;
}
} }