Continued changes to mob spawning algorithm.
This commit is contained in:
parent
5ae95b809b
commit
0ddd99e9b9
@ -1894,8 +1894,8 @@ public class PlayerListener
|
||||
}
|
||||
}
|
||||
|
||||
private boolean allowedToSpawn(CreatureSpawnEvent e, LivingEntity l) {
|
||||
//Will return true if it's allowed to spawn. False if it needs to go away.
|
||||
private boolean isPermanentSpawn(CreatureSpawnEvent e, LivingEntity l) {
|
||||
//Will return true if it's something that is not allowed to despawn. False if we are allowed to get rid of it.
|
||||
//Basically this is the control that will determine if the mob stays or goes, before further processing is done.
|
||||
//If the mob is identified as a special mob...
|
||||
|
||||
@ -2150,62 +2150,42 @@ public class PlayerListener
|
||||
}
|
||||
|
||||
//This allows bosses to spawn.
|
||||
if (e.getEntity().getType()==EntityType.ENDER_DRAGON || e.getEntity().getType()==EntityType.WITHER) {
|
||||
if (e.getEntity().getType()==EntityType.ENDER_DRAGON || e.getEntity().getType()==EntityType.WITHER ||
|
||||
e.getEntity() instanceof Golem || e.getEntity() instanceof Animals) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (e.getSpawnReason()==SpawnReason.CUSTOM || e.getSpawnReason()==SpawnReason.NATURAL) {
|
||||
return true; //Always return custom spawns, we have no reason not to. Natural spawning also is allowed, since it'll always make sense.
|
||||
//Custom bosses
|
||||
if (l.getCustomName()!=null && (l.getCustomName().contains(ChatColor.DARK_PURPLE+"") || l.getCustomName().contains(ChatColor.DARK_AQUA+"Polymorphed Creature"))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return true; //If we got down to here, allow this particular mob to spawn.
|
||||
return false; //If we got down to here, allow this particular mob to spawn.
|
||||
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onCreatureSpawn(CreatureSpawnEvent e) {
|
||||
final CreatureSpawnEvent e2 = e;
|
||||
final Entity entity = e.getEntity();
|
||||
final Main plugin = this.plugin;
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (entity.getWorld().getName().compareTo("world")==0) {
|
||||
boolean despawn=true;
|
||||
if (entity instanceof Monster) {
|
||||
LivingEntity test = (LivingEntity)entity;
|
||||
boolean block=false;
|
||||
if (test.getCustomName()!=null && (test.getCustomName().contains(ChatColor.DARK_PURPLE+"") || test.getCustomName().contains(ChatColor.DARK_AQUA+"Polymorphed Creature"))) {
|
||||
if (isPermanentSpawn(e, e.getEntity())) {
|
||||
e.getEntity().setRemoveWhenFarAway(false);
|
||||
|
||||
//If this is a boss that spawns from a command block, make sure the command blocks are removed.
|
||||
if (e.getEntity().getCustomName()!=null && (e.getEntity().getCustomName().contains(ChatColor.DARK_PURPLE+"") || e.getEntity().getCustomName().contains(ChatColor.DARK_AQUA+"Polymorphed Creature"))) {
|
||||
for (int i=-2;i<3;i++) {
|
||||
for (int j=-2;j<3;j++) {
|
||||
for (int k=-2;k<3;k++) {
|
||||
if (Bukkit.getWorld("world").getBlockAt(test.getLocation().add(i,j,k)).getType()==Material.COMMAND) {
|
||||
block=true;
|
||||
Bukkit.getWorld("world").getBlockAt(test.getLocation().add(i,j,k)).setType(Material.COBBLESTONE);
|
||||
despawn=false;
|
||||
if (Bukkit.getWorld("world").getBlockAt(e.getEntity().getLocation().add(i,j,k)).getType()==Material.COMMAND) {
|
||||
Bukkit.getWorld("world").getBlockAt(e.getEntity().getLocation().add(i,j,k)).setType(Material.COBBLESTONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Entity> entities = Bukkit.getWorld("world").getEntities();
|
||||
for (int i=0;i<entities.size();i++) {
|
||||
if (entities.get(i) instanceof LivingEntity) {
|
||||
LivingEntity l = (LivingEntity)entities.get(i);
|
||||
if (l.getCustomName()!=null && l.getCustomName().contains(ChatColor.DARK_PURPLE+"") && l.getLocation().distance(test.getLocation())<10) {
|
||||
despawn=false; //Allow it to spawn. It's next to a boss.
|
||||
}
|
||||
}
|
||||
}
|
||||
if (block || (test.getCustomName()!=null && (test.getCustomName().contains(ChatColor.DARK_PURPLE+"") || test.getType()==EntityType.ENDER_DRAGON || test.getCustomName().contains(ChatColor.DARK_AQUA+"") || !test.getRemoveWhenFarAway()))) {
|
||||
despawn=false; //This is an epic boss and its healthbar. WE can't just despawn it.
|
||||
}
|
||||
}
|
||||
if (entity instanceof Golem || entity instanceof Wither || entity instanceof Animals) {
|
||||
despawn=false;
|
||||
if (entity instanceof Wither) {
|
||||
Wither w = (Wither)entity;
|
||||
|
||||
//Give the wither bonuses.
|
||||
if (e.getEntity() instanceof Wither) {
|
||||
Wither w = (Wither)e.getEntity();
|
||||
w.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,999999,3));
|
||||
w.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,999999,3));
|
||||
w.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING,999999,3));
|
||||
@ -2214,20 +2194,40 @@ public class PlayerListener
|
||||
w.setCustomName(ChatColor.GOLD+""+ChatColor.BOLD+"Mega Wither");
|
||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "gamerule mobGriefing true");
|
||||
}
|
||||
|
||||
} else {
|
||||
if (e.getEntity().getHealth()>65 && e.getEntity().getCustomName()==null /*Meaning it's not a special mob.*/) {
|
||||
e.getEntity().remove(); //Too much HP. Nothing should have this much.
|
||||
return;
|
||||
}
|
||||
if (entity instanceof LivingEntity) {
|
||||
LivingEntity l = (LivingEntity)entity;
|
||||
if (!l.getRemoveWhenFarAway()) {
|
||||
despawn=false;
|
||||
|
||||
boolean allow=false; //If this is set to true, it will not be marked for removal.
|
||||
|
||||
//We will now determine if it is allowed to spawn due to being next to a boss or mob spawner.
|
||||
List<Entity> entities = e.getEntity().getWorld().getEntities();
|
||||
for (int i=0;i<entities.size();i++) {
|
||||
if (entities.get(i) instanceof LivingEntity) {
|
||||
LivingEntity l = (LivingEntity)entities.get(i);
|
||||
if (l.getCustomName()!=null && l.getCustomName().contains(ChatColor.DARK_PURPLE+"") && l.getLocation().distance(e.getEntity().getLocation())<10) {
|
||||
//Allow it to spawn. It's next to a boss.
|
||||
allow=true;
|
||||
}
|
||||
}
|
||||
if (despawn) {
|
||||
if (plugin.getConfig().getBoolean("halloween-enabled") && Math.random()<=0.75 && entity instanceof Monster) {
|
||||
//Just despawn it right now.
|
||||
entity.remove();
|
||||
e2.setCancelled(true);
|
||||
}
|
||||
double distancefromcity = Math.abs(1627-entity.getLocation().getX())+Math.abs((67-entity.getLocation().getY()))+Math.abs(-267-entity.getLocation().getZ());
|
||||
|
||||
if (!allow) {
|
||||
//This is our chance to despawn it if we must.
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
final CreatureSpawnEvent e2 = e;
|
||||
final Entity entity = e.getEntity();
|
||||
final Main plugin = this.plugin;
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (entity.getWorld().getName().compareTo("world")==0) {
|
||||
int maxgroup=0; //The maximum number of mobs that may be near each other and together when spawning.
|
||||
double chancer=1.0d; //The percent chance a duplicated mob will form.
|
||||
double despawnchancer=0.0d; //The percent chance the mob will be forced to despawn. Decreasing natural spawning.
|
||||
|
Loading…
x
Reference in New Issue
Block a user