/*
* This file is part of HoloAPI.
*
* HoloAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HoloAPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HoloAPI. If not, see <http://www.gnu.org/licenses/>.
*/
package com.dsh105.holoapi.api;
import com.dsh105.holoapi.HoloAPI;
import com.dsh105.holoapi.api.visibility.Visibility;
import com.dsh105.holoapi.api.visibility.VisibilityDefault;
import com.dsh105.holoapi.exceptions.HologramNotPreparedException;
import com.dsh105.holoapi.listeners.WorldListener;
import com.dsh105.holoapi.util.SaveIdGenerator;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.Vector;
/**
* Represents a factory for building new Holograms
*/
public abstract class HoloFactory {
private Plugin owningPlugin;
protected String worldName;
protected double locX;
protected double locY;
protected double locZ;
protected String saveId;
protected Visibility visibility = new VisibilityDefault();
protected boolean simple = false;
protected int tagId;
protected boolean withTagId;
private boolean prepared = false;
private boolean preparedId = false;
/**
* Constructs a factory for building a hologram
*
* @param owningPlugin plugin to register constructed hologram under
* @throws java.lang.IllegalArgumentException if the owning plugin is null
*/
public HoloFactory(Plugin owningPlugin) {
if (owningPlugin == null) {
throw new IllegalArgumentException("Plugin cannot be null");
}
this.owningPlugin = owningPlugin;
}
/**
* Sets the location for constructed Holograms
*
* @param location location for constructed Holograms
* @return This object
*/
public HoloFactory withLocation(Location location) {
this.withCoords(location.getX(), location.getY(), location.getZ());
this.withWorld(location.getWorld().getName());
return this;
}
/**
* Sets the location for constructed Holograms
*
* @param vectorLocation a {@link org.bukkit.util.Vector} representing the coordinates of constructed
* Holograms
* @param worldName the world name to place constructed Holograms in
* @return This object
*/
public HoloFactory withLocation(Vector vectorLocation, String worldName) {
this.withCoords(vectorLocation.getX(), vectorLocation.getY(), vectorLocation.getZ());
this.withWorld(worldName);
return this;
}
/**
* Sets the visibility of constructed Holograms
*
* @param visibility visibility of constructed Hologram
* @return This object
*/
public HoloFactory withVisibility(Visibility visibility) {
this.visibility = visibility;
return this;
}
/**
* Sets the save id of constructed Holograms
*
* @param saveId save id to be assigned to constructed Holograms
* @throws com.dsh105.holoapi.exceptions.DuplicateSaveIdException if the save ID is already registered
* @return return save id
*/
public HoloFactory withSaveId(String saveId) {
this.saveId = saveId;
this.preparedId = true;
return this;
}
/**
* Sets the simplicity of constructed Holograms
*
* @param simple simplicity of constructed Holograms
* @return This object
*/
public HoloFactory withSimplicity(boolean simple) {
this.simple = simple;
return this;
}
public abstract boolean canBuild();
public abstract Hologram prepareHologram();
/**
* Constructs a {@link com.dsh105.holoapi.api.Hologram} based on the settings stored in the factory
*
* @return The constructed Holograms
* @throws com.dsh105.holoapi.exceptions.HologramNotPreparedException if the animation is empty or the location is
* not initialised
*/
public Hologram build() {
if (!this.canBuild() || !this.prepared) {
throw new HologramNotPreparedException("Hologram is not prepared correctly!");
}
if (!this.preparedId || this.saveId == null) {
this.saveId = SaveIdGenerator.nextId() + "";
}
if (Bukkit.getWorld(this.worldName) == null) {
HoloAPI.LOG.warning("Could not find valid world (" + this.worldName + ") for Hologram of ID " + this.saveId + ". Maybe the world isn't loaded yet?");
WorldListener.store(this.saveId, this.worldName);
return null;
}
Hologram hologram = prepareHologram();
hologram.setSimplicity(this.simple);
hologram.setVisibility(this.visibility);
hologram.showNearby();
HoloAPI.getManager().track(hologram, this.owningPlugin);
return hologram;
}
protected HoloFactory withFirstTagId(int tagId) {
this.tagId = tagId;
this.withTagId = true;
return this;
}
private HoloFactory withCoords(double x, double y, double z) {
this.locX = x;
this.locY = y;
this.locZ = z;
this.prepared = true;
return this;
}
private HoloFactory withWorld(String worldName) {
this.worldName = worldName;
return this;
}
}