Created
August 31, 2013 14:26
-
-
Save NeatMonster/657b3ac02575a034d936 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
name: Slender | |
version: 1.0 | |
author: TEprogamers | |
main: fr.teprogamers.slender.Slender | |
commands: | |
start: |
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 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