OpenNAW/src/main/java/moe/oko/opennaw/model/City.java

139 lines
4.4 KiB
Java

package moe.oko.opennaw.model;
import moe.oko.opennaw.OpenNAW;
import net.kyori.adventure.text.Component;
import org.bukkit.*;
public class City {
private String name;
private String resource;
private CityState state;
private Nation owner;
//Null until its needed.
private Nation attacker;
private Location point;
private short health;
public City(String name, String resource, Location location) {
this.name = name;
this.resource = resource;
//Default is unclaimed.
this.owner = Nation.UNCLAIMED;
this.state = CityState.NORMAL;
this.point = location;
this.health = 300;
}
//DB Const
public City(String name, String resource, Location location, Nation owner) {
this.name = name;
this.resource = resource;
this.point = location;
this.owner = owner;
this.health = 300;
this.state = CityState.NORMAL;
}
public String getName() {
return name;
}
public String getResource() {
return resource;
}
public Nation getOwner() {
return owner;
}
public void setOwner(Nation nation) {
this.owner = nation;
}
public Location getPoint() {
return point;
}
public short getHealth() {
return health;
}
public void damage(short damage) {
this.health -= damage;
}
public boolean underSiege() {
return state.equals(CityState.SIEGE);
}
public boolean startSiege(Nation nation) {
if(state.equals(CityState.RECOVERY)) return false;
state = CityState.SIEGE;
Bukkit.broadcast(Component.text(ChatColor.RED + nation.getName() + ChatColor.GOLD + " has begun a siege against the city of " + ChatColor.AQUA + getName()));
for(var player : Bukkit.getOnlinePlayers()) {
player.playSound(player.getLocation(), Sound.ITEM_TRIDENT_THUNDER, 1F, 1F);
}
attacker = nation;
return true;
}
public void damage() {
//Ran each time a city is damaged by a capture event
//Makes an explosion of ash around a block
point.getWorld().spawnParticle(Particle.EXPLOSION_LARGE, point, 1, .01, .01, .01);
point.getWorld().playSound(point, Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F);
health = (short) (health - OpenNAW.getInstance().getConfigHelper().cityDamageOnStrike());
switch (health) {
case 250:
case 200:
case 150:
case 100:
case 50:
for(var player : Bukkit.getOnlinePlayers()) {
if(player.getLocation().distance(point) < 100) {
player.sendMessage(ChatColor.BOLD + "" + ChatColor.RED + "THE CITY HAS FALLEN TO " + health + " HEALTH...");
}
}
return;
case 10:
for(var player : Bukkit.getOnlinePlayers()) {
if(player.getLocation().distance(point) < 100) {
player.sendMessage(ChatColor.BOLD + "" + ChatColor.RED + "THE CITY IS ABOUT TO BE CAPTURED!");
}
}
}
if(health == 0 || health < 0) {
capture();
}
}
public void defend() {
//successful defense logic.
Bukkit.broadcast(Component.text(ChatColor.RED + attacker.getName() + ChatColor.GOLD + "'s siege against the city of "
+ ChatColor.AQUA + getName() + ChatColor.GOLD + " has " + ChatColor.RED + "failed"));
if(health < 250) {
health = (short) (health + 50);
}
OpenNAW.getInstance().getActionLogger().cancelDefenseActions(this);
attacker = null;
this.state = CityState.RECOVERY; //Start recovery, prohibit sieges until restart.
}
public void capture() {
setOwner(attacker);
attacker = null; //reset to null so there isn't any bugs
//This is our "capture" logic. So now we do shenanigans.
if(OpenNAW.getInstance().isDynmapEnabled()) {
//Dyn is enabled, we need to do setters.
OpenNAW.getInstance().getDynmapHandler().updateCityInfoMarker(this);
}
Bukkit.broadcast(Component.text(ChatColor.AQUA + getName() + ChatColor.GOLD + " has been successfully captured by " + ChatColor.RED + this.owner.getName()));
}
public boolean isUnclaimed() {
return owner == Nation.UNCLAIMED;
}
}