Skip to content

Instantly share code, notes, and snippets.

@Exerosis
Created June 20, 2018 07:29
Show Gist options
  • Save Exerosis/ac27e0f62f10a61eb0ff74dd7c815131 to your computer and use it in GitHub Desktop.
Save Exerosis/ac27e0f62f10a61eb0ff74dd7c815131 to your computer and use it in GitHub Desktop.
Christmas:
Delay: 50
Colors:
- White
- Red
- Green
Halloween:
Delay: 20
Colors:
- Black
- Orange
StPatricks:
Delay: 80
Colors:
- Green
- Yellow
package me.exerosis.example.lights;
import com.google.common.collect.Iterators;
import org.apache.commons.lang.WordUtils;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Dye;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static org.bukkit.Material.AIR;
import static org.bukkit.Material.WOOL;
public class LightBlockType implements Listener, Runnable {
private final List<Block> blocks = new ArrayList<>();
private final String name;
private final Iterator<DyeColor> colors;
private final ItemStack item = new ItemStack(WOOL);
public LightBlockType(Plugin plugin, String name, long delay, DyeColor... colors) {
this.name = name;
this.colors = Iterators.cycle(colors);
//--Setup Item--
final ItemMeta meta = item.getItemMeta();
meta.setDisplayName("Light Block");
final List<String> lore = new ArrayList<>();
lore.add("Name: " + name);
lore.add("Delay: " + delay);
lore.add("Colors: ");
for (DyeColor color : colors)
lore.add(" - " + WordUtils.capitalizeFully(color.name().replace('_', ' ').toLowerCase()));
meta.setLore(lore);
//--Start Tasks--
Bukkit.getPluginManager().registerEvents(this, plugin);
Bukkit.getScheduler().runTaskTimer(plugin, this, delay, delay);
}
public String getName() {
return name;
}
public ItemStack getItem() {
return item;
}
public List<Block> getBlocks() {
return blocks;
}
@Override
public void run() {
final DyeColor currentColor = colors.next();
for (Block block : blocks) {
final BlockState state = block.getState();
((Dye) state.getData()).setColor(currentColor);
state.update();
}
}
@EventHandler
void onPlace(BlockPlaceEvent event) {
if (item.isSimilar(event.getItemInHand()))
blocks.add(event.getBlock());
}
//TODO IDK if these are all required(there might even be others) but some testing would fix that.
@EventHandler
void onDestroy(BlockBreakEvent event) {
blocks.remove(event.getBlock());
}
@EventHandler
void onExplode(BlockExplodeEvent event) {
blocks.remove(event.getBlock());
}
@EventHandler
void onBurn(BlockBurnEvent event) {
blocks.remove(event.getBlock());
}
@EventHandler
void onExtend(BlockPistonExtendEvent event) {
for (Block block : event.getBlocks())
if (blocks.remove(block))
blocks.add(block.getRelative(event.getDirection()));
}
@EventHandler
void onRetract(BlockPistonRetractEvent event) {
for (Block block : event.getBlocks())
if (blocks.remove(block))
blocks.add(block.getRelative(event.getDirection()));
}
@EventHandler
void onChange(EntityChangeBlockEvent event) {
if (event.getTo() == AIR)
blocks.remove(event.getBlock());
}
}
package me.exerosis.example.lights;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Main extends JavaPlugin implements Listener, InventoryHolder {
private static final String CMD_MENU = "lightblocks";
private static final String KEY_DELAY = "Delay";
private static final String KEY_COLORS = "Colors";
private static final String KEY_BLOCKS = "Blocks";
private final List<LightBlockType> lightTypes = new ArrayList<>();
private final Inventory menu = Bukkit.createInventory(this, 45, "Light Block Types");
@Override
public void onEnable() {
saveDefaultConfig();
Bukkit.getPluginManager().registerEvents(this, this);
getCommand(CMD_MENU).setExecutor(this);
final Map<String, Object> values = getConfig().getValues(true);
for (Map.Entry<String, Object> entry : values.entrySet()) {
final String name = entry.getKey();
final Map<String, Object> type = (Map<String, Object>) entry.getValue();
final long delay = (long) type.getOrDefault(KEY_DELAY, 0L);
final List<String> colorNames = (List<String>) type.getOrDefault(KEY_COLORS, new ArrayList<>(0));
final DyeColor[] colors = new DyeColor[colorNames.size()];
for (int i = 0; i < colors.length; i++)
colors[i] = DyeColor.valueOf(colorNames.get(i).toUpperCase().replace(' ', '_'));
final LightBlockType lightType = new LightBlockType(this, name, delay, colors);
final List<Location> locations = (List<Location>) type.getOrDefault(KEY_BLOCKS, new ArrayList<>(0));
for (Location location : locations)
lightType.getBlocks().add(location.getBlock());
lightTypes.add(lightType);
}
}
@EventHandler
void onClick(InventoryClickEvent event) {
if (event.getClickedInventory().getHolder() != this)
return;
event.getView().getBottomInventory().addItem(event.getCurrentItem());
event.setCancelled(true);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (sender instanceof Player && sender.isOp())
((Player) sender).openInventory(menu);
return true;
}
@Override
public void onDisable() {
for (LightBlockType lightType : lightTypes) {
final List<Location> locations = new ArrayList<>();
for (Block block : lightType.getBlocks())
locations.add(block.getLocation());
getConfig().set(lightType.getName() + "." + KEY_BLOCKS, locations);
}
saveConfig();
}
@Override
public Inventory getInventory() {
return menu;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment