Skip to content

Instantly share code, notes, and snippets.

@NeatMonster
Created February 29, 2012 22:59
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/1945192 to your computer and use it in GitHub Desktop.
Save NeatMonster/1945192 to your computer and use it in GitHub Desktop.
XPBank
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