Skip to content

Instantly share code, notes, and snippets.

@Jikoo
Last active August 29, 2015 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jikoo/45d8f844b2cfe229246f to your computer and use it in GitHub Desktop.
Save Jikoo/45d8f844b2cfe229246f to your computer and use it in GitHub Desktop.
Edwardia's little custom plugin
package com.github.jikoo.edwardia;
import java.util.HashMap;
import java.util.HashSet;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerBedLeaveEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.plugin.java.JavaPlugin;
/**
* Edwardia's custom plugin. Currently includes an adaptation of Sblock's SleepVote and a recipe for
* clay blocks from gravel.
*
* @author Jikoo
*/
public class Edwardia extends JavaPlugin implements Listener {
private HashMap<String, HashSet<String>> votes;
public void onEnable() {
votes = new HashMap<String, HashSet<String>>();
getServer().getPluginManager().registerEvents(this, this);
ShapelessRecipe sr = new ShapelessRecipe(new ItemStack(Material.CLAY, 4));
sr.addIngredient(8, Material.GRAVEL);
sr.addIngredient(Material.WATER_BUCKET);
Bukkit.addRecipe(sr);
}
public void onDisable() {
votes.clear();
votes = null;
}
@EventHandler(ignoreCancelled = true)
public void onPlayerBedEnter(PlayerBedEnterEvent event) {
addVote(event.getPlayer().getWorld(), event.getPlayer());
}
@EventHandler(ignoreCancelled = true)
public void onPlayerBedLeave(PlayerBedLeaveEvent event) {
removeVote(event.getPlayer().getWorld().getName(), event.getPlayer().getName());
}
@EventHandler(ignoreCancelled = true)
public void onPlayerQuit(PlayerQuitEvent event) {
removeVote(event.getPlayer().getWorld().getName(), event.getPlayer().getName());
}
@EventHandler(ignoreCancelled = true)
public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
removeVote(event.getPlayer().getWorld().getName(), event.getPlayer().getName());
}
public void addVote(World world, Player p) {
if (!votes.containsKey(world.getName())) {
votes.put(world.getName(), new HashSet<String>());
resetVote(world);
}
if (votes.get(world.getName()).add(p.getName())) {
updateVotes(world, p.getName());
}
}
public void removeVote(String world, String player) {
if (!votes.containsKey(world)) {
return;
}
if (player != null) {
votes.get(world).remove(player);
}
}
public void updateVoteOnLeave(World world, String player) {
removeVote(world.getName(), player);
updateVotes(world, null);
}
public void updateVotes(World world, String player) {
if (!votes.containsKey(world.getName())) {
// No vote running in this world, nothing to update.
return;
}
StringBuilder sb = new StringBuilder();
int worldsize = world.getPlayers().size();
if (player != null) {
sb.append(ChatColor.GREEN).append(player).append(ChatColor.YELLOW).append(" has gone to bed. ");
} else {
// Size still reports as it would if player leaving was in the world. Rather than waste resources on a task, subtract 1.
worldsize--;
}
int percent = worldsize < 1 ? 100 : (int) 100 * votes.get(world.getName()).size() / worldsize;
sb.append(ChatColor.YELLOW).append(percent).append("% of players have slept.");
if (percent >= 50) {
sb.append('\n').append("Time to get up, a new day awaits!");
world.setTime(0);
world.setStorm(false);
world.setWeatherDuration(world.getWeatherDuration() > 12000 ? world.getWeatherDuration() : 12000);
Bukkit.getConsoleSender().sendMessage("[SleepVote] " + world.getName() + " set to morning!");
votes.remove(world.getName());
} else if (player == null) {
// No spam on log out
return;
}
String msg = sb.toString();
for (Player p : world.getPlayers()) {
p.sendMessage(msg);
}
}
public void resetVote(final World world) {
Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
@Override
public void run() {
votes.remove(world.getName());
}
}, 24001 - world.getTime());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment