package me.gtacraft.economy; import me.gtacraft.economy.database.SQLConnectionThread; import me.gtacraft.economy.database.SQLVars; import me.gtacraft.economy.util.Range; import me.gtacraft.economy.util.Util; import org.bukkit.*; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.DecimalFormat; import java.util.*; /** * Created by Connor on 7/6/14. Designed for the GTA-Economy project. */ public class EconomyListener implements Listener { private static EconomyListener instance; public static EconomyListener get() { return instance; } public EconomyListener() { instance = this; Bukkit.getPluginManager().registerEvents(this, GTAEconomy.get()); } @EventHandler public void onAsyncPreLogin(AsyncPlayerPreLoginEvent event) { UUID uuid = event.getUniqueId(); try { PreparedStatement statement = SQLConnectionThread.getConnection().prepareStatement(SQLVars.SELECT_PLAYER .replace("%uuid%", uuid.toString())); statement.execute(); ResultSet rs = statement.getResultSet(); if (rs.next()) { double balance = rs.getDouble("balance"); GTAEconomy.log.debug("Finding balance for "+uuid.toString()+". Found $"+balance, getClass()); GTAEconomy.player_balances.put(uuid, balance); } else { GTAEconomy.sql_query.add(SQLVars.INSERT_PLAYER .replace("%uuid%", uuid.toString())); GTAEconomy.player_balances.put(uuid, 0.0); } } catch (SQLException err) { err.printStackTrace(); event.setKickMessage(Util.f("&c&lERROR&f: Could not load your balance!")); event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); } } private static Map<EntityType, Range> entityDeathMap = new HashMap<>(); private static Map<Skeleton.SkeletonType, Range> tangentSkeletonMap = new HashMap<>(); static { entityDeathMap.put(EntityType.PLAYER, new Range(1, 5)); entityDeathMap.put(EntityType.ZOMBIE, new Range(5, 10)); entityDeathMap.put(EntityType.ENDERMAN, new Range(50, 100)); entityDeathMap.put(EntityType.PIG_ZOMBIE, new Range(15, 30)); entityDeathMap.put(EntityType.IRON_GOLEM, new Range(30, 50)); entityDeathMap.put(EntityType.BLAZE, new Range(25, 30)); tangentSkeletonMap.put(Skeleton.SkeletonType.NORMAL, new Range(15, 25)); tangentSkeletonMap.put(Skeleton.SkeletonType.WITHER, new Range(20, 25)); } public static volatile HashMap<Entity, EntityDamageEvent.DamageCause> lastDamageCause = new HashMap<>(); public static volatile HashMap<Entity, Entity> lastEntityDamageByEntity = new HashMap<>(); @EventHandler public void onEntityDamage(EntityDamageEvent event) { if (!(event.getEntity() instanceof LivingEntity)) return; if (lastDamageCause.containsKey(event.getEntity())) lastDamageCause.remove(event.getEntity()); lastDamageCause.put(event.getEntity(), event.getCause()); } @EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { if (!(event.getEntity() instanceof LivingEntity)) return; if (lastEntityDamageByEntity.containsKey(event.getEntity())) lastEntityDamageByEntity.remove(event.getEntity()); lastEntityDamageByEntity.put(event.getEntity(), event.getDamager()); } @EventHandler public void onEntityDeath(EntityDeathEvent event) { if (!(doDrop(event))) return; if (event.getEntity().getType().equals(EntityType.SKELETON)) { Skeleton.SkeletonType st = ((Skeleton)event.getEntity()).getSkeletonType(); int drop = tangentSkeletonMap.get(st).random(); dropItem(event.getEntity().getLocation(), drop); } else if (entityDeathMap.containsKey(event.getEntity().getType())) { if (event.getEntity().getType().equals(EntityType.PLAYER)) { //discover Player p = (Player)event.getEntity(); if (p.hasMetadata("NPC")) { dropItem(p.getLocation(), entityDeathMap.get(p.getType()).random()); } else { double has = EconomyAPI.getUserBalance(p.getUniqueId()); double drop = .1; if (p.hasPermission("gtaeconomy.droplesscash")) drop = .05; dropItem(p.getLocation(), has*drop); EconomyAPI.setUserBalance(p.getUniqueId(), has-(has*drop)); } return; } int drop = entityDeathMap.get(event.getEntity().getType()).random(); dropItem(event.getEntity().getLocation(), drop); } } private boolean doDrop(EntityDeathEvent e) { LivingEntity le = e.getEntity(); if (lastEntityDamageByEntity.containsKey(le)) { Entity damager = lastEntityDamageByEntity.remove(le); if (lastDamageCause.containsKey(le)) lastDamageCause.remove(le); if (damager instanceof Projectile) { if (((Projectile) damager).getShooter() instanceof Player) return true; } return ((damager instanceof Player) || (le instanceof Player)); } EntityDamageEvent.DamageCause cause = (lastDamageCause.containsKey(le) ? lastDamageCause.remove(le) : null); if (cause == null) return false; return (cause.equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK) || cause.equals(EntityDamageEvent.DamageCause.PROJECTILE) || cause.equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)); } private void dropItem(Location at, double cashValue) { if (cashValue > 50000 || cashValue < 0) return; ItemStack cash = new ItemStack(Material.EMERALD); ItemMeta meta = cash.getItemMeta(); cashValue = cashValue*100; cashValue = Math.round(cashValue); cashValue = cashValue/100; meta.setDisplayName(cashValue+""); cash.setItemMeta(meta); Item end = at.getWorld().dropItem(at, cash); end.setPickupDelay(0); } @EventHandler public void onPlayerPickupItem(PlayerPickupItemEvent event) { if (event.getItem().getItemStack().getType().equals(Material.EMERALD)) { event.setCancelled(true); double value = 1; ItemStack stack = event.getItem().getItemStack(); if (stack.getItemMeta() != null && stack.getItemMeta().getDisplayName() != null) { value = Double.parseDouble(ChatColor.stripColor(stack.getItemMeta().getDisplayName()).replace("$", "")); } event.getItem().remove(); value = value*stack.getAmount(); if (value > 50000 || value < 0) return; UUID pickup = event.getPlayer().getUniqueId(); double has = EconomyAPI.getUserBalance(pickup); has+=value; EconomyAPI.setUserBalance(pickup, has); event.getPlayer().sendMessage(ChatColor.GREEN+""+ ChatColor.BOLD+"+ $"+value); event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.ORB_PICKUP, 1, (float)(Math.random()*2)); } } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { if (event.getPlayer().getItemInHand() != null && event.getPlayer().getItemInHand().getType().equals(Material.EMERALD)) { ItemStack click = event.getPlayer().getItemInHand(); if (click.getItemMeta() == null) return; if (click.getItemMeta().getDisplayName() != null) { String name = click.getItemMeta().getDisplayName(); name = name.replace("$", ""); name = ChatColor.stripColor(name); try { Double value = Double.parseDouble(name)*click.getAmount(); if (value > 50000 || value < 0) return; double has = EconomyAPI.getUserBalance(event.getPlayer().getUniqueId()); EconomyAPI.setUserBalance(event.getPlayer().getUniqueId(), has+value); event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&a&l(!) &7You deposited &a&l$"+value+" &7into your bank account!")); event.getPlayer().getInventory().remove(click); event.getPlayer().updateInventory(); } catch (Exception ex) { return; } } } } }