/* * Copyright 2011 Tyler Blair. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and contributors and should not be interpreted as representing official policies, * either expressed or implied, of anybody else. */ package com.griefcraft.io; import com.griefcraft.lwc.LWC; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import java.util.HashMap; import java.util.Map; public class RestorableBlock implements Restorable { /** * The block id */ private int id; /** * The world's name */ private String world; /** * The x coordinate */ private int x; /** * The y coordinate */ private int y; /** * The z coordinate */ private int z; /** * The block data */ private int data; /** * The items in this block's inventory if it has one */ private final Map<Integer, ItemStack> items = new HashMap<Integer, ItemStack>(); public int getType() { return 1; // TODO ENUM, HOPEFULLY I'LL REMEMBER IF I PUT THIS TODO EVERYWHERE } public void restore() { LWC lwc = LWC.getInstance(); lwc.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(lwc.getPlugin(), new Runnable() { public void run() { Server server = Bukkit.getServer(); // Get the world World bworld = server.getWorld(world); // Not found :-( if (world == null) { return; } // Get the block we want Block block = bworld.getBlockAt(x, y, z); // Begin screwing with shit :p block.setTypeId(id); block.setData((byte) data); if (items.size() > 0) { if (!(block.getState() instanceof InventoryHolder)) { System.out.println(String.format("The block at [%d, %d, %d] has backed up items but no longer supports them. Why? %s", x, y, z, block.toString())); } // Get the block's inventory Inventory inventory = ((InventoryHolder) block.getState()).getInventory(); // Set all of the items to it for (Map.Entry<Integer, ItemStack> entry : items.entrySet()) { int slot = entry.getKey(); ItemStack stack = entry.getValue(); if (stack == null) { continue; } // Add it to the inventory inventory.setItem(slot, stack); } } } }); } /** * Wrap a block in a restorableblock object * * @param block * @return */ public static RestorableBlock wrapBlock(Block block) { if (block == null) { return null; } RestorableBlock rblock = new RestorableBlock(); rblock.id = block.getTypeId(); rblock.world = block.getWorld().getName(); rblock.x = block.getX(); rblock.y = block.getY(); rblock.z = block.getZ(); rblock.data = block.getData(); BlockState state = block.getState(); // Does it have an inventory? ^^ if (state instanceof InventoryHolder) { Inventory inventory = ((InventoryHolder) state).getInventory(); ItemStack[] stacks = inventory.getContents(); for (int slot = 0; slot < stacks.length; slot++) { ItemStack stack = stacks[slot]; if (stack == null) { continue; // don't waste space! } rblock.setSlot(slot, stack); } } return rblock; } /** * Set a slot in the inventory * * @param slot * @param stack */ public void setSlot(int slot, ItemStack stack) { items.put(slot, stack); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getWorld() { return world; } public void setWorld(String world) { this.world = world; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getZ() { return z; } public void setZ(int z) { this.z = z; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Map<Integer, ItemStack> getItems() { return items; } }