package me.gtacraft.player;
import com.google.common.collect.Lists;
import me.gtacraft.GTAGuns;
import me.gtacraft.gun.Gun;
import me.gtacraft.gun.GunData;
import me.gtacraft.gun.GunFactory;
import me.gtacraft.util.GunUtil;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Created by Connor on 4/27/14. Designed for the GTA-Guns project.
*/
public class GunHolder {
private static ConcurrentHashMap<Player, GunHolder> _holders = new ConcurrentHashMap<Player, GunHolder>();
private ItemStack itemHolding; public ItemStack getItemHolding() { return itemHolding; }
private GunData lastWeapon; public GunData getLastWeapon() { return lastWeapon; }
private GunData currentWeapon; public GunData getCurrentWeapon() { return currentWeapon; }
private List<GunData> containedGuns = new ArrayList<GunData>(); public List<GunData> getContainedGuns() { return containedGuns; }
private long ticks; public long getTicks() { return ticks; }
private final GTAGuns plugin = GTAGuns.getInstnace();
private Player holder; public Player getHolder() { return holder; }
public GunHolder(Player holder) {
this.holder = holder;
_holders.put(holder, this);
}
public static void resetAll() {
for (GunHolder gh : _holders.values()) {
gh.containedGuns.clear();
gh.currentWeapon = null;
}
}
public static GunHolder getHolder(Player player) {
return _holders.containsKey(player) ? _holders.get(player) : new GunHolder(player);
}
public static ConcurrentHashMap<Player, GunHolder> getAllHolders() {
return _holders;
}
public static final long TICK_INTERVAL = 1l;
public boolean tick() {
++ticks;
if (holder == null) {
_holders.remove(holder);
return true;
}
ItemStack inHand = holder.getItemInHand();
itemHolding = inHand;
if (inHand == null || inHand.getType().equals(Material.AIR)) {
currentWeapon = null;
return false;
}
GunData data = GunUtil.getGunData(containedGuns, inHand);
if (data == null) {
Gun gun = GunFactory.getGun(inHand);
ItemStack stack = GunUtil.getGunStack(gun);
if (gun == null || stack == null)
return false;
data = new GunData(gun, stack);
GunUtil.updateStack(data, inHand.getAmount());
containedGuns.add(data);
holder.getInventory().setItemInHand(stack);
if (lastWeapon == null || data != currentWeapon) {
lastWeapon = data;
}
} else {
if (lastWeapon == null || data != currentWeapon) {
lastWeapon = data;
}
holder.setItemInHand(GunUtil.updateStack(data, inHand.getAmount()));
currentWeapon = data;
if (data.wasReloading) {
data.wasReloading = false;
ItemStack s = data.getStack();
ItemMeta m = s.getItemMeta();
m.setDisplayName(data.getStackName());
s.setItemMeta(m);
data.setStack(s);
holder.setItemInHand(s);
}
}
return false;
}
public static void handleLeave(Player player) {
_holders.remove(player);
}
public static void cleanNull() {
List<Player> clean = Lists.newArrayList();
for (Player p : _holders.keySet()) {
if (p == null || _holders.get(p) == null)
clean.add(p);
}
for (Player p : clean) {
_holders.remove(p);
}
}
public void doKnockback(GunData held) {
double recoil = held.getDefaultAttribute("recoil", 0.0).getDoubleValue();
holder.setVelocity(holder.getEyeLocation().getDirection().multiply(-recoil));
}
}