package net.aufdemrand.denizen.objects;
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.nms.abstracts.BiomeNMS;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizencore.objects.*;
import net.aufdemrand.denizencore.tags.Attribute;
import net.aufdemrand.denizencore.tags.TagContext;
import net.aufdemrand.denizencore.utilities.CoreUtilities;
import org.bukkit.block.Biome;
import org.bukkit.entity.EntityType;
import java.util.HashMap;
import java.util.List;
public class dBiome implements dObject, Adjustable {
//////////////////
// OBJECT FETCHER
////////////////
public static dBiome valueOf(String string) {
return valueOf(string, null);
}
/**
* Gets a Biome Object from a string form.
*
* @param string the string
*/
@Fetchable("b")
public static dBiome valueOf(String string, TagContext context) {
if (string.startsWith("b@")) {
string = string.substring(2);
}
for (Biome biome : Biome.values()) {
if (biome.name().equalsIgnoreCase(string)) {
return new dBiome(biome);
}
}
return null;
}
/**
* Determines whether a string is a valid biome.
*
* @param arg the string
* @return true if matched, otherwise false
*/
public static boolean matches(String arg) {
if (arg.startsWith("b@")) {
arg = arg.substring(2);
}
for (Biome b : Biome.values()) {
if (b.name().equalsIgnoreCase(arg)) {
return true;
}
}
return false;
}
///////////////
// Constructors
/////////////
public dBiome(Biome biome) {
this.biome = NMSHandler.getInstance().getBiomeNMS(biome);
}
/////////////////////
// INSTANCE FIELDS/METHODS
/////////////////
private BiomeNMS biome;
public BiomeNMS getBiome() {
return biome;
}
String prefix = "biome";
@Override
public String getPrefix() {
return prefix;
}
@Override
public String debug() {
return (prefix + "='<A>" + identify() + "<G>' ");
}
@Override
public boolean isUnique() {
return false;
}
@Override
public String getObjectType() {
return "Biome";
}
@Override
public String identify() {
return "b@" + CoreUtilities.toLowerCase(biome.getName());
}
@Override
public String identifySimple() {
return identify();
}
@Override
public dObject setPrefix(String prefix) {
if (prefix != null) {
this.prefix = prefix;
}
return this;
}
public static void registerTags() {
// <--[tag]
// @attribute <b@biome.downfall_type>
// @returns Element
// @description
// Returns this biome's downfall type for when a world has weather.
// This can be RAIN, SNOW, or NONE.
// -->
registerTag("downfall_type", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element(CoreUtilities.toLowerCase(((dBiome) object).biome.getDownfallType().name()))
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <b@biome.humidity>
// @returns Element(Decimal)
// @description
// Returns the humidity of this biome.
// -->
registerTag("humidity", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element(((dBiome) object).biome.getHumidity())
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <b@biome.temperature>
// @returns Element(Decimal)
// @description
// Returns the temperature of this biome.
// -->
registerTag("temperature", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element(((dBiome) object).biome.getTemperature())
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <b@biome.spawnable_entities>
// @returns dList(dEntity)
// @description
// Returns all entities that spawn naturally in this biome.
// -->
registerTag("spawnable_entities", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
attribute = attribute.fulfill(1);
BiomeNMS biome = ((dBiome) object).biome;
List<EntityType> entityTypes;
boolean hasAttribute = true;
// <--[tag]
// @attribute <b@biome.spawnable_entities.ambient>
// @returns dList(dEntity)
// @description
// Returns the entities that spawn naturally in ambient locations.
// Default examples: BAT
// -->
if (attribute.startsWith("ambient")) {
entityTypes = biome.getAmbientEntities();
}
// <--[tag]
// @attribute <b@biome.spawnable_entities.creatures>
// @returns dList(dEntity)
// @description
// Returns the entities that spawn naturally in creature locations.
// Default examples: PIG, COW, CHICKEN...
// -->
else if (attribute.startsWith("creatures")) {
entityTypes = biome.getCreatureEntities();
}
// <--[tag]
// @attribute <b@biome.spawnable_entities.monsters>
// @returns dList(dEntity)
// @description
// Returns the entities that spawn naturally in monster locations.
// Default examples: CREEPER, ZOMBIE, SKELETON...
// -->
else if (attribute.startsWith("monsters")) {
entityTypes = biome.getMonsterEntities();
}
// <--[tag]
// @attribute <b@biome.spawnable_entities.water>
// @returns dList(dEntity)
// @description
// Returns the entities that spawn naturally in underwater locations.
// Default examples: SQUID
// -->
else if (attribute.startsWith("water")) {
entityTypes = biome.getWaterEntities();
}
else {
entityTypes = biome.getAllEntities();
hasAttribute = false;
}
dList list = new dList();
for (EntityType entityType : entityTypes) {
list.add(entityType.name());
}
return list.getAttribute(hasAttribute ? attribute.fulfill(1) : attribute);
}
});
}
public static HashMap<String, TagRunnable> registeredTags = new HashMap<String, TagRunnable>();
public static void registerTag(String name, TagRunnable runnable) {
if (runnable.name == null) {
runnable.name = name;
}
registeredTags.put(name, runnable);
}
@Override
public String getAttribute(Attribute attribute) {
if (attribute == null) {
return null;
}
// TODO: Scrap getAttribute, make this functionality a core system
String attrLow = CoreUtilities.toLowerCase(attribute.getAttributeWithoutContext(1));
TagRunnable tr = registeredTags.get(attrLow);
if (tr != null) {
if (!tr.name.equals(attrLow)) {
net.aufdemrand.denizencore.utilities.debugging.dB.echoError(attribute.getScriptEntry() != null ? attribute.getScriptEntry().getResidingQueue() : null,
"Using deprecated form of tag '" + tr.name + "': '" + attrLow + "'.");
}
return tr.run(attribute, this);
}
return new Element(identify()).getAttribute(attribute);
}
@Override
public void applyProperty(Mechanism mechanism) {
dB.echoError("Cannot apply properties to a biome!");
}
@Override
public void adjust(Mechanism mechanism) {
Element value = mechanism.getValue();
// <--[mechanism]
// @object dBiome
// @name humidity
// @input Element(Decimal)
// @description
// Sets the humidity for this biome server-wide.
// If this is greater than 0.85, fire has less chance
// to spread in this biome.
// @tags
// <b@biome.humidity>
// -->
if (mechanism.matches("humidity") && mechanism.requireFloat()) {
biome.setHumidity(value.asFloat());
}
// <--[mechanism]
// @object dBiome
// @name temperature
// @input Element(Decimal)
// @description
// Sets the temperature for this biome server-wide.
// If this is less than 1.5, snow will form on the ground
// when weather occurs in the world and a layer of ice
// will form over water.
// @tags
// <b@biome.temperature>
// -->
if (mechanism.matches("temperature") && mechanism.requireFloat()) {
biome.setTemperature(value.asFloat());
}
}
}