Created
February 29, 2012 22:59
-
-
Save NeatMonster/1945192 to your computer and use it in GitHub Desktop.
XPBank
This file contains hidden or 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.yamakaky.xpbank; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import org.bukkit.Bukkit; | |
import org.bukkit.ChatColor; | |
import org.bukkit.Location; | |
import org.bukkit.Material; | |
import org.bukkit.block.BlockFace; | |
import org.bukkit.block.Sign; | |
import org.bukkit.entity.Player; | |
import org.bukkit.event.EventHandler; | |
import org.bukkit.event.Listener; | |
import org.bukkit.event.block.Action; | |
import org.bukkit.event.block.BlockBreakEvent; | |
import org.bukkit.event.block.SignChangeEvent; | |
import org.bukkit.event.entity.EntityExplodeEvent; | |
import org.bukkit.event.player.PlayerInteractEvent; | |
import org.bukkit.material.Attachable; | |
import org.bukkit.plugin.java.JavaPlugin; | |
public class XPBank extends JavaPlugin implements Listener { | |
private final Map<String, Integer> accounts = new HashMap<String, Integer>(); | |
private final List<Location> signs = new ArrayList<Location>(); | |
private int getTotal() { | |
int total = 0; | |
for (final int value : accounts.values()) | |
total += value; | |
return total; | |
} | |
@EventHandler(ignoreCancelled = true) | |
public void onBlockBreak(final BlockBreakEvent event) { | |
if (!event.getPlayer().hasPermission("xpbank.create") | |
&& ((event.getBlock().getRelative(BlockFace.UP).getType() == Material.SIGN_POST | |
&& signs.contains(event.getBlock().getRelative(BlockFace.UP).getLocation())) | |
|| (event.getBlock().getRelative(BlockFace.SOUTH).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.SOUTH).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.SOUTH).getState().getData()).getAttachedFace() == BlockFace.NORTH) | |
|| (event.getBlock().getRelative(BlockFace.NORTH).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.NORTH).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.NORTH).getState().getData()).getAttachedFace() == BlockFace.SOUTH) | |
|| (event.getBlock().getRelative(BlockFace.EAST).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.EAST).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.EAST).getState().getData()).getAttachedFace() == BlockFace.WEST) | |
|| (event.getBlock().getRelative(BlockFace.WEST).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.WEST).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.WEST).getState().getData()).getAttachedFace() == BlockFace.EAST) | |
|| signs.contains(event.getBlock().getLocation()))) { | |
event.setCancelled(true); | |
return; | |
} | |
if (signs.contains(event.getBlock().getLocation())) | |
signs.remove(event.getBlock().getLocation()); | |
else if (event.getBlock().getRelative(BlockFace.UP).getType() == Material.SIGN_POST | |
&& signs.contains(event.getBlock().getRelative(BlockFace.UP).getLocation())) | |
signs.remove(event.getBlock().getRelative(BlockFace.UP).getLocation()); | |
else if (event.getBlock().getRelative(BlockFace.SOUTH).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.SOUTH).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.SOUTH).getState().getData()).getAttachedFace() == BlockFace.NORTH) | |
signs.remove(event.getBlock().getRelative(BlockFace.SOUTH).getLocation()); | |
else if (event.getBlock().getRelative(BlockFace.NORTH).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.NORTH).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.NORTH).getState().getData()).getAttachedFace() == BlockFace.SOUTH) | |
signs.remove(event.getBlock().getRelative(BlockFace.NORTH).getLocation()); | |
else if (event.getBlock().getRelative(BlockFace.EAST).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.EAST).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.EAST).getState().getData()).getAttachedFace() == BlockFace.WEST) | |
signs.remove(event.getBlock().getRelative(BlockFace.EAST).getLocation()); | |
else if (event.getBlock().getRelative(BlockFace.WEST).getType() == Material.WALL_SIGN | |
&& signs.contains(event.getBlock().getRelative(BlockFace.WEST).getLocation()) | |
&& ((Attachable) event.getBlock().getRelative(BlockFace.WEST).getState().getData()).getAttachedFace() == BlockFace.EAST) | |
signs.remove(event.getBlock().getRelative(BlockFace.WEST).getLocation()); | |
save(false); | |
} | |
@Override | |
public void onEnable() { | |
super.onEnable(); | |
Bukkit.getPluginManager().registerEvents(this, this); | |
for (final String account : getConfig().getStringList("Accounts")) | |
accounts.put(account.split("_")[0], Integer.valueOf(account.split("_")[1])); | |
for (final String location : getConfig().getStringList("Locations")) | |
signs.add(new Location(Bukkit.getWorld(location.split("_")[0]), Integer.valueOf(location.split("_")[1]), | |
Integer.valueOf(location.split("_")[2]), Integer.valueOf(location.split("_")[3]))); | |
refresh(); | |
} | |
@EventHandler | |
public void onEntityExplodeEvent(final EntityExplodeEvent event) { | |
for (final Location location : signs) { | |
if (event.blockList().contains(location.getBlock())) | |
event.blockList().remove(location.getBlock()); | |
if (location.getBlock().getType() == Material.SIGN_POST | |
&& event.blockList().contains(location.getBlock().getRelative(BlockFace.DOWN))) | |
event.blockList().remove(location.getBlock().getRelative(BlockFace.DOWN)); | |
if (location.getBlock().getType() == Material.WALL_SIGN | |
&& event.blockList().contains(location.getBlock().getRelative(((Attachable) location.getBlock().getState().getData()).getAttachedFace()))) | |
event.blockList().remove(location.getBlock().getRelative(((Attachable) location.getBlock().getState().getData()).getAttachedFace())); | |
} | |
} | |
@EventHandler(ignoreCancelled = true) | |
public void onPlayerInteract(final PlayerInteractEvent event) { | |
final Player player = event.getPlayer(); | |
if (!signs.contains(event.getClickedBlock().getLocation()) || !player.hasPermission("xpbank.use")) | |
return; | |
if (event.getAction() == Action.LEFT_CLICK_BLOCK) { | |
if (player.getTotalExperience() > 0) { | |
int experience = (int) ((7 + (player.getLevel() * 7 >> 1)) * player.getExp()); | |
for (int i = 0; i < player.getLevel(); i++) | |
experience += 7 + (i * 7 >> 1); | |
if (accounts.containsKey(player.getName())) | |
accounts.put(player.getName(), accounts.get(player.getName()) + experience); | |
else | |
accounts.put(player.getName(), experience); | |
player.setExp(0); | |
player.setLevel(0); | |
player.setTotalExperience(0); | |
player.sendMessage(ChatColor.GREEN + "" + experience + " XPs mis en banque !"); | |
refresh(); | |
save(true); | |
} else | |
player.sendMessage(ChatColor.RED + "Vous n'avez aucun XP à mettre en banque !"); | |
} else if (event.getAction() == Action.RIGHT_CLICK_BLOCK) | |
if (accounts.containsKey(player.getName())) { | |
int experience = accounts.get(player.getName()); | |
while (experience > 0) { | |
int var = 7 + (player.getLevel() * 7 >> 1) - (int) ((7 + (player.getLevel() * 7 >> 1)) * player.getExp()); | |
if (var > experience) | |
var = experience; | |
player.giveExp(var); | |
experience -= var; | |
} | |
player.sendMessage(ChatColor.GREEN + "" + accounts.get(player.getName()) + " XPs retirés de la banque !"); | |
accounts.remove(player.getName()); | |
refresh(); | |
save(true); | |
} else | |
player.sendMessage(ChatColor.RED + "Vous n'avez aucun XP à retirer de la banque !"); | |
} | |
@EventHandler(ignoreCancelled = true) | |
public void onSignChange(final SignChangeEvent event) { | |
if (!event.getLine(0).equalsIgnoreCase("[BanqueXP]") || !event.getPlayer().hasPermission("xpbank.create")) | |
return; | |
event.setLine(0, ChatColor.BLUE + "[BanqueXP]"); | |
event.setLine(2, ChatColor.YELLOW + "" + accounts.size() + " comptes"); | |
event.setLine(3, ChatColor.YELLOW + "" + getTotal() + " XPs"); | |
signs.add(event.getBlock().getLocation()); | |
save(false); | |
} | |
private void refresh() { | |
for (final Location location : signs) { | |
final Sign sign = (Sign) location.getBlock().getState(); | |
sign.setLine(0, ChatColor.BLUE + "[BanqueXP]"); | |
sign.setLine(2, ChatColor.YELLOW + "" + accounts.size() + " comptes"); | |
sign.setLine(3, ChatColor.YELLOW + "" + getTotal() + " XPs"); | |
sign.update(true); | |
} | |
} | |
private void save(final boolean accountsOrSigns) { | |
if (accountsOrSigns) { | |
final List<String> accountsList = new ArrayList<String>(); | |
for (final String playerName : accounts.keySet()) | |
accountsList.add(playerName + "_" + accounts.get(playerName)); | |
getConfig().set("Accounts", accountsList); | |
} else { | |
final List<String> locationsList = new ArrayList<String>(); | |
for (final Location location : signs) | |
locationsList.add(location.getWorld().getName() + "_" + location.getBlockX() | |
+ "_" + location.getBlockY() + "_" + location.getBlockZ()); | |
getConfig().set("Locations", locationsList); | |
} | |
saveConfig(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment