/* * CraftZ * Copyright (C) JangoBrick <http://jangobrick.de/> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package craftZ.modules; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import craftZ.CraftZ; import craftZ.Module; import craftZ.util.EntityChecker; public class FireplaceModule extends Module { private static Vector[] fireplaceRotations = { new Vector(0, 0, 1), new Vector(1, 0, 1), new Vector(1, 0, 0), new Vector(1, 0, -1) }; public FireplaceModule(CraftZ craftZ) { super(craftZ); } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerInteract(PlayerInteractEvent event) { if (isWorld(event.getPlayer().getWorld())) { Player p = event.getPlayer(); Block block = event.getClickedBlock(); if (event.getAction() == Action.RIGHT_CLICK_BLOCK && (event.getMaterial() == Material.LOG || event.getMaterial() == Material.LOG_2) && getConfig("config").getBoolean("Config.players.campfires.enable")) { if (!block.getType().isTransparent() && block.getType().isSolid() && block.getType() != Material.CHEST && block.getRelative(BlockFace.UP).getType() == Material.AIR && event.getBlockFace() == BlockFace.UP) { reduceInHand(p); Location loc = block.getLocation(), standLoc = loc.clone().add(.5, -0.3, .5); int campfireTicks = getConfig("config").getInt("Config.players.campfires.tick-duration"), lightAfter = fireplaceRotations.length * 4; for (int i=0; i<fireplaceRotations.length; i++) { int delay = i * 4; constructFireplaceStand(standLoc, fireplaceRotations[i], delay, lightAfter - delay, campfireTicks); } constructFireplaceTorch(loc.add(0, 1, 0), lightAfter, campfireTicks); p.sendMessage(getMsg("Messages.placed-fireplace")); event.setCancelled(true); } else { p.sendMessage(getMsg("Messages.cannot-place-fireplace")); } } } } @EventHandler(priority = EventPriority.HIGHEST) public void onBlockPlace(BlockPlaceEvent event) { Block block = event.getBlock(); Material type = block.getType(); Player p = event.getPlayer(); if (isWorld(p.getWorld())) { if ((type == Material.LOG || type == Material.LOG_2) && getConfig("config").getBoolean("Config.players.campfires.enable")) event.setCancelled(true); } } @EventHandler(priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageEvent event) { Entity entity = event.getEntity(); EntityType type = event.getEntityType(); if (isWorld(entity.getWorld())) { MetadataValue isFireplace; if (type == EntityType.ARMOR_STAND && (isFireplace = EntityChecker.getMeta(entity, "isFireplace")) != null && isFireplace.asBoolean()) { event.setCancelled(true); // prevent armor stand from burning away before it's done } } } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerDropItem(PlayerDropItemEvent event) { final Player p = event.getPlayer(); final Item item = event.getItemDrop(); if (isWorld(item.getWorld())) { new BukkitRunnable() { @Override public void run() { if (item.isDead()) { cancel(); return; } List<Entity> ents = EntityChecker.getNearbyEntities(item, 2); for (Entity ent : ents) { MetadataValue meta; if (ent instanceof ArmorStand && (meta = EntityChecker.getMeta(ent, "isFireplace")) != null && meta.asBoolean()) { ItemStack result = item.getItemStack(); item.remove(); Material type = result.getType(); switch (type) { case RAW_CHICKEN: result.setType(Material.COOKED_CHICKEN); break; case RAW_BEEF: result.setType(Material.COOKED_BEEF); break; case RAW_FISH: result.setType(Material.COOKED_FISH); break; case PORK: result.setType(Material.GRILLED_PORK); break; case POTATO_ITEM: result.setType(Material.BAKED_POTATO); break; default: break; } cancel(); if (p.isOnline()) { p.getWorld().dropItem(p.getLocation(), result).setPickupDelay(0); } else { p.getWorld().dropItem(item.getLocation(), result).setPickupDelay(0); } break; } } } }.runTaskTimer(getCraftZ(), 10, 10); } } public void constructFireplaceStand(final Location loc, final Vector rotation, int delay, final int lightAfter, final int fireTicks) { Bukkit.getScheduler().runTaskLater(getCraftZ(), new Runnable() { @Override public void run() { final ArmorStand stand = (ArmorStand) loc.getWorld().spawnEntity(loc.setDirection(rotation), EntityType.ARMOR_STAND); stand.setGravity(false); stand.setBasePlate(false); stand.setMetadata("isFireplace", new FixedMetadataValue(getCraftZ(), true)); Bukkit.getScheduler().runTaskLater(getCraftZ(), new Runnable() { @Override public void run() { stand.setFireTicks(fireTicks); Bukkit.getScheduler().runTaskLater(getCraftZ(), new Runnable() { @Override public void run() { stand.remove(); } }, fireTicks); } }, lightAfter); } }, delay); } public void constructFireplaceTorch(final Location loc, int delay, final int fireTicks) { Bukkit.getScheduler().runTaskLater(getCraftZ(), new Runnable() { @Override public void run() { final Block torch = loc.getBlock(); torch.setType(Material.TORCH); torch.setMetadata("isFireplace", new FixedMetadataValue(getCraftZ(), true)); Bukkit.getScheduler().scheduleSyncDelayedTask(getCraftZ(), new Runnable() { @Override public void run() { torch.setType(Material.AIR); } }, fireTicks); } }, delay); } }