package regalowl.hyperconomy;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class ServerShop implements Shop, DataLoadListener, Comparable<Shop>{
private String name;
private String economy;
private HyperPlayer owner;
private String world;
private String message1;
private String message2;
private int p1x;
private int p1y;
private int p1z;
private int p2x;
private int p2y;
private int p2z;
private ArrayList<String> inShop = new ArrayList<String>();
private boolean useshopexitmessage;
private HyperConomy hc;
private EconomyManager em;
private LanguageFile L;
private FileConfiguration shopFile;
private boolean globalShop;
private ArrayList<HyperObject> availableObjects = new ArrayList<HyperObject>();
ServerShop(String name, String econ, HyperPlayer owner) {
hc = HyperConomy.hc;
this.name = name;
this.economy = econ;
this.owner = owner;
if (owner == null) {
this.owner = hc.getEconomyManager().getGlobalShopAccount();
}
em = hc.getEconomyManager();
L = hc.getLanguageFile();
globalShop = false;
shopFile = hc.gYH().gFC("shops");
shopFile.set(name + ".owner", this.owner.getName());
shopFile.set(name + ".economy", econ);
useshopexitmessage = hc.gYH().gFC("config").getBoolean("config.use-shop-exit-message");
hc.getHyperEventHandler().registerDataLoadListener(this);
if (getHyperEconomy().dataLoaded()) {
loadAvailable();
}
}
public int compareTo(Shop s) {
return name.compareTo(s.getName());
}
public void setPoint1(String world, int x, int y, int z) {
this.world = world;
p1x = x;
p1y = y;
p1z = z;
shopFile.set(name + ".world", world);
shopFile.set(name + ".p1.x", x);
shopFile.set(name + ".p1.y", y);
shopFile.set(name + ".p1.z", z);
}
public void setPoint2(String world, int x, int y, int z) {
this.world = world;
p2x = x;
p2y = y;
p2z = z;
shopFile.set(name + ".world", world);
shopFile.set(name + ".p2.x", x);
shopFile.set(name + ".p2.y", y);
shopFile.set(name + ".p2.z", z);
}
public void setGlobal() {
globalShop = true;
setMessage1("");
setMessage1("");
}
public void setPoint1(Location l) {
setPoint1(l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ());
}
public void setPoint2(Location l) {
setPoint2(l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ());
}
public void setMessage1(String message) {
message1 = message;
shopFile.set(name + ".shopmessage1", message1);
}
public void setMessage2(String message) {
message2 = message;
shopFile.set(name + ".shopmessage2", message2);
}
public void setDefaultMessages() {
setMessage1("&aWelcome to %n");
setMessage2("&9Type &b/hc &9for help.");
}
public void setWorld(String world) {
this.world = world;
shopFile.set(name + ".world", world);
}
public void setName(String name) {
shopFile.set(this.name, null);
this.name = name;
shopFile.set(this.name, this.name);
shopFile.set(name + ".world", world);
shopFile.set(name + ".p1.x", p1x);
shopFile.set(name + ".p1.y", p1y);
shopFile.set(name + ".p1.z", p1z);
shopFile.set(name + ".p2.x", p2x);
shopFile.set(name + ".p2.y", p2y);
shopFile.set(name + ".p2.z", p2z);
shopFile.set(name + ".shopmessage1", message1);
shopFile.set(name + ".shopmessage2", message2);
shopFile.set(name + ".economy", economy);
}
public void setEconomy(String economy) {
this.economy = economy;
shopFile.set(name + ".economy", economy);
}
public boolean inShop(int x, int y, int z, String world) {
if (globalShop) {
return true;
}
if (world.equalsIgnoreCase(this.world)) {
int rangex = Math.abs(p1x - p2x);
if (Math.abs(x - p1x) <= rangex && Math.abs(x - p2x) <= rangex) {
int rangez = Math.abs(p1z - p2z);
if (Math.abs(z - p1z) <= rangez && Math.abs(z - p2z) <= rangez) {
int rangey = Math.abs(p1y - p2y);
if (Math.abs(y - p1y) <= rangey && Math.abs(y - p2y) <= rangey) {
return true;
}
}
}
}
return false;
}
public boolean inShop(Player player) {
Location l = player.getLocation();
return inShop(l.getBlockX(), l.getBlockY(), l.getBlockZ(), l.getWorld().getName());
}
public void sendEntryMessage(Player player) {
if (globalShop) {
return;
}
if (message1 == null || message2 == null) {
message1 = "&aWelcome to %n";
message2 = "&9Type &b/hc &9for help.";
}
player.sendMessage(L.get("SHOP_LINE_BREAK"));
player.sendMessage(message1.replace("%n", name).replace("_", " ").replace("&","\u00A7"));
player.sendMessage(message2.replace("%n", name).replace("_", " ").replace("&","\u00A7"));
player.sendMessage(L.get("SHOP_LINE_BREAK"));
}
public String getEconomy() {
return economy;
}
public HyperEconomy getHyperEconomy() {
return em.getEconomy(economy);
}
public String getName() {
return name;
}
public String getDisplayName() {
return name.replace("_", " ");
}
@Override
public void onDataLoad() {
loadAvailable();
}
public void loadAvailable() {
HyperEconomy he = getHyperEconomy();
availableObjects.clear();
for (HyperObject ho:he.getHyperObjects()) {
availableObjects.add(ho);
}
ArrayList<String> unavailable = hc.gCF().explode(shopFile.getString(name + ".unavailable"),",");
for (String objectName : unavailable) {
HyperObject ho = he.getHyperObject(objectName);
availableObjects.remove(ho);
}
}
public void saveAvailable() {
HyperEconomy he = getHyperEconomy();
ArrayList<String> unavailable = new ArrayList<String>();
ArrayList<HyperObject> allObjects = he.getHyperObjects();
for (HyperObject ho:allObjects) {
if (!availableObjects.contains(ho)) {
unavailable.add(ho.getName());
}
}
if (unavailable.isEmpty()) {
shopFile.set(name + ".unavailable", null);
} else {
shopFile.set(name + ".unavailable", hc.gCF().implode(unavailable,","));
}
}
public boolean isStocked(HyperObject ho) {
if (ho != null && ho.getStock() > 0) {
return true;
}
return false;
}
public boolean isBanned(HyperObject ho) {
if (availableObjects.contains(ho)) {
return false;
}
return true;
}
public boolean isBanned(String name) {
return isBanned(getHyperEconomy().getHyperObject(name));
}
public boolean isTradeable(HyperObject ho) {
if (!isBanned(ho)) {
return true;
}
return false;
}
public boolean isStocked(String item) {
return isStocked(getHyperEconomy().getHyperObject(item));
}
public boolean isAvailable(HyperObject ho) {
if (isTradeable(ho) && isStocked(ho)) {
return true;
}
return false;
}
public ArrayList<HyperObject> getTradeableObjects() {
return availableObjects;
}
public void unBanAllObjects() {
availableObjects.clear();
for (HyperObject ho:getHyperEconomy().getHyperObjects()) {
availableObjects.add(ho);
}
saveAvailable();
}
public void banAllObjects() {
availableObjects.clear();
saveAvailable();
}
public void unBanObjects(ArrayList<HyperObject> objects) {
for (HyperObject ho:objects) {
if (!availableObjects.contains(ho)) {
availableObjects.add(ho);
}
}
saveAvailable();
}
public void banObjects(ArrayList<HyperObject> objects) {
for (HyperObject ho:objects) {
if (availableObjects.contains(ho)) {
availableObjects.remove(ho);
}
}
saveAvailable();
}
public int getP1x() {
return p1x;
}
public int getP1y() {
return p1y;
}
public int getP1z() {
return p1z;
}
public int getP2x() {
return p2x;
}
public int getP2y() {
return p2y;
}
public int getP2z() {
return p2z;
}
public Location getLocation1() {
return new Location(Bukkit.getWorld(world), p1x, p1y, p1z);
}
public Location getLocation2() {
return new Location(Bukkit.getWorld(world), p2x, p2y, p2z);
}
public HyperPlayer getOwner() {
return owner;
}
public void updatePlayerStatus() {
for (Player p : Bukkit.getOnlinePlayers()) {
if (inShop.contains(p.getName())) {
if (!inShop(p)) {
inShop.remove(p.getName());
if (useshopexitmessage) {
p.sendMessage(L.get("SHOP_EXIT_MESSAGE"));
}
}
} else {
if (inShop(p)) {
inShop.add(p.getName());
sendEntryMessage(p);
hc.getEconomyManager().getHyperPlayer(p.getName()).setEconomy(economy);
}
}
}
}
public int getVolume() {
return Math.abs(p1x - p2x) * Math.abs(p1y - p2y) * Math.abs(p1z - p2z);
}
public void deleteShop() {
shopFile.set(name, null);
em.removeShop(name);
}
public void setOwner(HyperPlayer owner) {
this.owner = owner;
shopFile.set(name + ".owner", owner.getName());
}
}