Skip to content

Instantly share code, notes, and snippets.

@NeatMonster
Created August 31, 2013 14:26
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 NeatMonster/657b3ac02575a034d936 to your computer and use it in GitHub Desktop.
Save NeatMonster/657b3ac02575a034d936 to your computer and use it in GitHub Desktop.
name: Slender
version: 1.0
author: TEprogamers
main: fr.teprogamers.slender.Slender
commands:
start:
package fr.teprogamers.slender;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
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.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
public class Slender extends JavaPlugin implements Listener {
private enum Status {
DEAD, HUMAN, SLENDER;
}
private static int[][] PAGES = new int[][] { { 548, 40, 101 }, { 592, 34, 156 }, { 608, 35, 96 }, { 89, 34, 69 },
{ 736, 34, 107 }, { 466, 35, 139 }, { 616, 33, 15 }, { 48, 34, 191 } };
private static ItemStack colorize(final Material type, final Status status) {
final ItemStack itemStack = new ItemStack(type);
if (itemStack.getItemMeta() instanceof LeatherArmorMeta) {
final LeatherArmorMeta itemMeta = (LeatherArmorMeta) itemStack.getItemMeta();
itemMeta.setColor(status == Status.SLENDER ? Color.BLACK : Color.WHITE);
itemStack.setItemMeta(itemMeta);
}
return itemStack;
}
private int pages = 0;
private final Random random = new Random();
private final Map<String, Status> statuses = new HashMap<String, Status>();
@EventHandler
public void onBlockBreak(final BlockBreakEvent event) {
if (!event.getPlayer().isOp())
event.setCancelled(true);
}
@Override
public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) {
if (command.getName().equalsIgnoreCase("start"))
if (sender.isOp()) {
if (args.length == 0)
setup();
else
sender.sendMessage(ChatColor.YELLOW + "Usage : /start - démarre la partie");
} else
sender.sendMessage(ChatColor.RED + "Vous n'avez pas la permission d'exécuter cette commande !");
return false;
}
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onEntityDamage(final EntityDamageEvent event) {
if (event instanceof EntityDamageByEntityEvent)
onEntityDamageByEntity((EntityDamageByEntityEvent) event);
else if (event.getEntity() instanceof Player
&& statuses.get(((Player) event.getEntity()).getName()) == Status.SLENDER)
event.setCancelled(true);
}
public void onEntityDamageByEntity(final EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) {
final Player damaged = (Player) event.getEntity();
final Status damagedStatus = statuses.get(damaged.getName());
final Player damager = (Player) event.getDamager();
final Status damagerStatus = statuses.get(damager.getName());
if (damagedStatus == Status.HUMAN && damagerStatus == Status.HUMAN) {
event.setCancelled(true);
damager.sendMessage(ChatColor.RED + "Vous ne pouvez pas frapper un autre humain !");
} else if (damagedStatus == Status.DEAD || damagedStatus == Status.SLENDER || damagerStatus == Status.DEAD)
event.setCancelled(true);
}
}
@EventHandler
public void onFoodLevelChange(final FoodLevelChangeEvent event) {
event.setCancelled(true);
}
@EventHandler
public void onPlayerDeath(final PlayerDeathEvent event) {
final Player player = event.getEntity();
final Status status = statuses.get(player.getName());
if (status == Status.HUMAN) {
int humans = -1;
for (final Status otherStatus : statuses.values())
if (otherStatus == Status.HUMAN)
humans++;
event.getDrops().clear();
if (humans > 0)
event.setDeathMessage(ChatColor.LIGHT_PURPLE + player.getName() + " est mort, il reste encore " + humans
+ " humain(s).");
else {
event.setDeathMessage(ChatColor.LIGHT_PURPLE + player.getName()
+ " est mort, il ne reste plus d'autres humains.");
Bukkit.broadcastMessage(ChatColor.LIGHT_PURPLE + "La partie est terminée, le slenderman a gagné.");
Bukkit.getScheduler().runTask(this, new Runnable() {
@Override
public void run() {
setup();
}
});
}
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerInteract(final PlayerInteractEvent event) {
final Player player = event.getPlayer();
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
final Block block = event.getClickedBlock();
final Location location = block.getLocation();
if (Arrays.asList(PAGES)
.contains(new int[] { location.getBlockX(), location.getBlockY(), location.getBlockZ() })
&& block.getType() == Material.COAL_BLOCK) {
block.setType(Material.AIR);
pages++;
if (pages < 8)
Bukkit.broadcastMessage(ChatColor.LIGHT_PURPLE + player.getName()
+ " a trouvé une page, il en reste encore " + (8 - pages) + ".");
else {
Bukkit.broadcastMessage(ChatColor.LIGHT_PURPLE + player.getName()
+ " a trouvé une page, toutes les pages ont été trouvées.");
Bukkit.broadcastMessage(ChatColor.LIGHT_PURPLE + "La partie est terminée, les humains ont gagnés.");
Bukkit.getScheduler().runTask(this, new Runnable() {
@Override
public void run() {
setup();
}
});
}
}
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(final PlayerJoinEvent event) {
final Player player = event.getPlayer();
final Status status = statuses.get(player.getName());
if (status != Status.HUMAN && status != Status.SLENDER) {
statuses.put(player.getName(), Status.DEAD);
player.teleport(new Location(Bukkit.getWorlds().get(0), 291, 22, -21));
}
}
@EventHandler
public void onPlayerRespawn(final PlayerRespawnEvent event) {
final Player player = event.getPlayer();
final Status status = statuses.get(player.getName());
if (status != Status.SLENDER) {
if (status == Status.HUMAN)
player.sendMessage(ChatColor.YELLOW + "Vous êtes maintenant dans les catacombes.");
statuses.put(player.getName(), Status.DEAD);
event.setRespawnLocation(new Location(Bukkit.getWorlds().get(0), 291, 22, -21));
}
}
private void setup() {
final World world = Bukkit.getWorlds().get(0);
for (final int[] page : PAGES)
world.getBlockAt(page[0], page[1], page[2]).setType(Material.COAL_BLOCK);
pages = 0;
statuses.clear();
for (final Player player : Bukkit.getOnlinePlayers()) {
for (final PotionEffect effect : player.getActivePotionEffects())
player.removePotionEffect(effect.getType());
player.getEquipment().clear();
player.getInventory().clear();
player.setFoodLevel(20);
player.setGameMode(GameMode.ADVENTURE);
player.teleport(new Location(world, 290, 22, -16));
}
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new BukkitRunnable() {
private int secondes = 10;
@Override
public void run() {
if (secondes == 0) {
cancel();
final Player slender = Bukkit.getOnlinePlayers()[random.nextInt(Bukkit.getOnlinePlayers().length)];
statuses.put(slender.getName(), Status.SLENDER);
Bukkit.broadcastMessage(ChatColor.LIGHT_PURPLE + "Le slenderman est " + slender.getName()
+ ", bonne chance aux humains.");
slender.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, Integer.MAX_VALUE, 4));
slender.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 10));
slender.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 4));
slender.sendMessage(ChatColor.YELLOW + "Vous êtes le slenderman, tuer doit être votre unique passion.");
slender.getEquipment().setArmorContents(
new ItemStack[] { colorize(Material.LEATHER_HELMET, Status.SLENDER),
colorize(Material.LEATHER_CHESTPLATE, Status.SLENDER),
colorize(Material.LEATHER_LEGGINGS, Status.SLENDER),
colorize(Material.LEATHER_BOOTS, Status.SLENDER) });
slender.teleport(new Location(world, 721, 34, 233));
for (final Player human : Bukkit.getOnlinePlayers())
if (human != slender) {
statuses.put(human.getName(), Status.HUMAN);
human.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Integer.MAX_VALUE, 0));
human.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0));
human.sendMessage(ChatColor.YELLOW + "Vous êtes un humain, à vous de retrouver les pages.");
human.getEquipment().setArmorContents(
new ItemStack[] { colorize(Material.LEATHER_HELMET, Status.HUMAN),
colorize(Material.LEATHER_CHESTPLATE, Status.HUMAN),
colorize(Material.LEATHER_LEGGINGS, Status.HUMAN),
colorize(Material.LEATHER_BOOTS, Status.HUMAN) });
human.teleport(new Location(world, 469, 34, -10));
}
} else {
Bukkit.broadcastMessage(ChatColor.LIGHT_PURPLE + "La partie commence dans " + secondes + " seconde(s).");
secondes--;
}
}
}, 0L, 20L);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment