Created
June 20, 2018 07:29
-
-
Save Exerosis/ac27e0f62f10a61eb0ff74dd7c815131 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Christmas: | |
Delay: 50 | |
Colors: | |
- White | |
- Red | |
- Green | |
Halloween: | |
Delay: 20 | |
Colors: | |
- Black | |
- Orange | |
StPatricks: | |
Delay: 80 | |
Colors: | |
- Green | |
- Yellow |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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