1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 11:45:51 +00:00

Reduced technical debt for Androids

This commit is contained in:
TheBusyBiscuit 2019-08-30 21:14:46 +02:00
parent b6be4af90d
commit adb8194d84

View File

@ -10,6 +10,7 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.function.Predicate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -344,10 +345,9 @@ public abstract class ProgrammableAndroid extends SlimefunItem {
case MOVE_AND_DIG_FORWARD: case MOVE_AND_DIG_FORWARD:
movedig(b, face, b.getRelative(face)); movedig(b, face, b.getRelative(face));
break; break;
case MOVE_AND_DIG_UP: { case MOVE_AND_DIG_UP:
movedig(b, face, b.getRelative(BlockFace.UP)); movedig(b, face, b.getRelative(BlockFace.UP));
break; break;
}
case MOVE_AND_DIG_DOWN: case MOVE_AND_DIG_DOWN:
movedig(b, face, b.getRelative(BlockFace.DOWN)); movedig(b, face, b.getRelative(BlockFace.DOWN));
break; break;
@ -431,204 +431,16 @@ public abstract class ProgrammableAndroid extends SlimefunItem {
} }
break; break;
case ATTACK_MOBS_ANIMALS: case ATTACK_MOBS_ANIMALS:
entities: killEntities(b, damage, e -> true);
for (Entity n: AndroidHologram.getNearbyEntities(b, 4D + getTier())) {
switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) {
case NORTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case EAST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case SOUTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case WEST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
default:
break;
}
}
break; break;
case ATTACK_MOBS: case ATTACK_MOBS:
entities: killEntities(b, damage, e -> e instanceof Monster);
for (Entity n: AndroidHologram.getNearbyEntities(b, 4D + getTier())) {
if (n instanceof Animals) continue;
switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) {
case NORTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case EAST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case SOUTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case WEST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
default:
break;
}
}
break; break;
case ATTACK_ANIMALS: case ATTACK_ANIMALS:
entities: killEntities(b, damage, e -> e instanceof Animals);
for (Entity n: AndroidHologram.getNearbyEntities(b, 4D + getTier())) {
if (n instanceof Monster) continue;
switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) {
case NORTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case EAST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case SOUTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case WEST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
default:
break;
}
}
break; break;
case ATTACK_ANIMALS_ADULT: case ATTACK_ANIMALS_ADULT:
entities: killEntities(b, damage, e -> e instanceof Animals && e instanceof org.bukkit.entity.Ageable && ((org.bukkit.entity.Ageable) e).isAdult());
for (Entity n: AndroidHologram.getNearbyEntities(b, 4D + getTier())) {
if (n instanceof Monster) continue;
if (n instanceof org.bukkit.entity.Ageable && !((org.bukkit.entity.Ageable) n).isAdult()) continue;
switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) {
case NORTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() < b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case EAST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() > b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case SOUTH: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getZ() > b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
case WEST: {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.getLocation().getX() < b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
break entities;
}
break;
}
default:
break;
}
}
break; break;
default: default:
break; break;
@ -639,6 +451,53 @@ public abstract class ProgrammableAndroid extends SlimefunItem {
} }
} }
private void killEntities(Block b, double damage, Predicate<Entity> predicate) {
for (Entity n: AndroidHologram.getNearbyEntities(b, 4D + getTier())) {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && predicate.test(n)) {
switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) {
case NORTH:
if (n.getLocation().getZ() < b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
return;
}
break;
case EAST:
if (n.getLocation().getX() > b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
return;
}
break;
case SOUTH:
if (n.getLocation().getZ() > b.getZ()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
return;
}
break;
case WEST:
if (n.getLocation().getX() < b.getX()) {
if (n.hasMetadata("android_killer")) n.removeMetadata("android_killer", SlimefunStartup.instance);
n.setMetadata("android_killer", new FixedMetadataValue(SlimefunStartup.instance, new AndroidObject(this, b)));
((LivingEntity) n).damage(damage);
return;
}
break;
default:
break;
}
}
}
}
private void move(Block b, BlockFace face, Block block) throws Exception { private void move(Block b, BlockFace face, Block block) throws Exception {
if (block.getY() < 0 || block.getY() > block.getWorld().getMaxHeight()) if (block.getY() < 0 || block.getY() > block.getWorld().getMaxHeight())
return; return;