9
0
mirror of https://github.com/Auxilor/EcoMobs.git synced 2025-12-21 07:59:28 +00:00

Reworked custom entity system

This commit is contained in:
Auxilor
2021-03-11 17:34:16 +00:00
parent 91a2e1559c
commit 8828e80dca
15 changed files with 240 additions and 58 deletions

View File

@@ -0,0 +1,22 @@
package com.willfp.ecobosses.proxy.v1_16_R1;
import com.willfp.ecobosses.proxy.proxies.CustomEntitySpawnerProxy;
import com.willfp.ecobosses.proxy.proxies.CustomIllusionerProxy;
import com.willfp.ecobosses.proxy.util.CustomEntity;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@SuppressWarnings("unchecked")
public class CustomEntitySpawner implements CustomEntitySpawnerProxy {
@Override
public <T extends LivingEntity> @Nullable T spawnCustomEntity(final Class<? extends CustomEntity<? extends LivingEntity>> entityClass,
@NotNull final Location location) {
if (entityClass.equals(CustomIllusionerProxy.class)) {
return (T) CustomIllusioner.spawn(location);
}
return null;
}
}

View File

@@ -18,8 +18,7 @@ import net.minecraft.server.v1_16_R1.PathfinderGoalNearestAttackableTarget;
import net.minecraft.server.v1_16_R1.PathfinderGoalRandomStroll;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_16_R1.util.CraftNamespacedKey;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.entity.Illusioner;
import org.jetbrains.annotations.NotNull;
public class CustomIllusioner extends EntityIllagerIllusioner implements CustomIllusionerProxy {
@@ -31,8 +30,6 @@ public class CustomIllusioner extends EntityIllagerIllusioner implements CustomI
public CustomIllusioner(@NotNull final Location location) {
super(EntityTypes.ILLUSIONER, ((CraftWorld) location.getWorld()).getHandle());
this.getBukkitEntity().getPersistentDataContainer().set(CraftNamespacedKey.fromString("ecobosses:type"), PersistentDataType.STRING, "custom_illusioner");
this.setPosition(location.getX(), location.getY(), location.getZ());
this.goalSelector.a(0, new PathfinderGoalFloat(this));
@@ -51,10 +48,15 @@ public class CustomIllusioner extends EntityIllagerIllusioner implements CustomI
this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, false)).a(300));
}
@Override
public CustomIllusionerProxy spawn(@NotNull final Location location) {
/**
* Spawn illusioner.
*
* @param location The location.
* @return The illusioner.
*/
public static Illusioner spawn(@NotNull final Location location) {
CustomIllusioner illusioner = new CustomIllusioner(location);
((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner);
return illusioner;
return (Illusioner) illusioner.getBukkitEntity();
}
}

View File

@@ -3,6 +3,9 @@ package com.willfp.ecobosses.bosses;
import com.willfp.eco.internal.config.AbstractUndefinedConfig;
import com.willfp.eco.util.internal.PluginDependent;
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
import com.willfp.ecobosses.bosses.util.BossbarProperties;
import com.willfp.ecobosses.bosses.util.SpawnTotem;
import com.willfp.ecobosses.bosses.util.bosstype.BossType;
import lombok.AccessLevel;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
@@ -22,6 +25,36 @@ public class EcoBoss extends PluginDependent {
@Getter(AccessLevel.PRIVATE)
private final AbstractUndefinedConfig config;
/**
* The base entity spawner.
*/
@Getter
private final BossType bossType;
/**
* If the boss bar is enabled.
*/
@Getter
private final boolean bossbarEnabled;
/**
* The BossBar properties.
*/
@Getter
private final BossbarProperties bossbarProperties;
/**
* If spawn totem is enabled.
*/
@Getter
private final boolean spawnTotemEnabled;
/**
* The spawn totem.
*/
@Getter
private final SpawnTotem spawnTotem;
/**
* Create a new Boss.
*

View File

@@ -2,6 +2,7 @@ package com.willfp.ecobosses.bosses.listeners;
import com.willfp.eco.util.internal.PluginDependent;
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
import com.willfp.ecobosses.bosses.util.SpawnTotem;
import com.willfp.ecobosses.proxy.proxies.CustomEntitySpawnerProxy;
import com.willfp.ecobosses.proxy.proxies.CustomIllusionerProxy;
import com.willfp.ecobosses.util.ProxyUtils;
import org.bukkit.Material;

View File

@@ -0,0 +1,18 @@
package com.willfp.ecobosses.bosses.util;
import lombok.Data;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
@Data
public class BossbarProperties {
/**
* The BossBar color.
*/
private final BarColor color;
/**
* The BossBar style.
*/
private final BarStyle style;
}

View File

@@ -1,59 +1,22 @@
package com.willfp.ecobosses.bosses.util;
import lombok.Getter;
import lombok.Data;
import org.bukkit.Material;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
@Data
public class SpawnTotem {
/**
* The bottom block.
*/
@Getter
private final Material bottom;
/**
* The middle block.
*/
@Getter
private final Material middle;
/**
* The top block.
*/
@Getter
private final Material top;
/**
* Create a new spawn totem.
*
* @param bottom The bottom block.
* @param middle The middle block.
* @param top The top block.
*/
public SpawnTotem(@NotNull final Material bottom,
@NotNull final Material middle,
@NotNull final Material top) {
this.bottom = bottom;
this.middle = middle;
this.top = top;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof SpawnTotem)) {
return false;
}
SpawnTotem that = (SpawnTotem) o;
return getBottom() == that.getBottom() && getMiddle() == that.getMiddle() && getTop() == that.getTop();
}
@Override
public int hashCode() {
return Objects.hash(getBottom(), getMiddle(), getTop());
}
}

View File

@@ -0,0 +1,25 @@
package com.willfp.ecobosses.bosses.util.bosstype;
import com.willfp.ecobosses.proxy.util.CustomEntities;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
@UtilityClass
public class BossEntityUtils {
/**
* Get boss type.
*
* @param id The name.
* @return The boss type.
*/
public static BossType getBossType(@NotNull final String id) {
if (CustomEntities.getEntityClass(id) != null) {
return new CustomBossType(Objects.requireNonNull(CustomEntities.getEntityClass(id)));
} else {
return new VanillaBossType(Objects.requireNonNull(EntityType.valueOf(id.toUpperCase()).getEntityClass()));
}
}
}

View File

@@ -0,0 +1,15 @@
package com.willfp.ecobosses.bosses.util.bosstype;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
public abstract class BossType {
/**
* Spawn boss entity.
*
* @param location The location.
* @return The entity.
*/
public abstract LivingEntity spawnBossEntity(@NotNull Location location);
}

View File

@@ -0,0 +1,29 @@
package com.willfp.ecobosses.bosses.util.bosstype;
import com.willfp.ecobosses.proxy.proxies.CustomEntitySpawnerProxy;
import com.willfp.ecobosses.proxy.util.CustomEntity;
import com.willfp.ecobosses.util.ProxyUtils;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
class CustomBossType extends BossType {
/**
* The entity type.
*/
private final Class<? extends CustomEntity<? extends LivingEntity>> entityClass;
/**
* Create new vanilla boss type.
*
* @param entityClass The entity class.
*/
CustomBossType(@NotNull final Class<? extends CustomEntity<? extends LivingEntity>> entityClass) {
this.entityClass = entityClass;
}
@Override
public LivingEntity spawnBossEntity(@NotNull final Location location) {
return ProxyUtils.getProxy(CustomEntitySpawnerProxy.class).spawnCustomEntity(entityClass, location);
}
}

View File

@@ -0,0 +1,29 @@
package com.willfp.ecobosses.bosses.util.bosstype;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
class VanillaBossType extends BossType {
/**
* The entity type.
*/
private final Class<? extends Entity> entityClass;
/**
* Create new vanilla boss type.
*
* @param entityClass The entity class.
*/
VanillaBossType(@NotNull final Class<? extends Entity> entityClass) {
this.entityClass = entityClass;
}
@Override
public LivingEntity spawnBossEntity(@NotNull final Location location) {
return (LivingEntity) Objects.requireNonNull(location.getWorld()).spawn(location, entityClass);
}
}

View File

@@ -4,7 +4,7 @@ name: "Illusioner" # Display name
base-mob: custom_illusioner # Any existing mob - custom_illusioner is also accepted (like in the old Illusioner plugin)
spawn-egg:
mob-type: illusioner
egg-material: illusioner_spawn_egg
display-name: "Illusioner Spawn Egg"
lore: []

View File

@@ -0,0 +1,21 @@
package com.willfp.ecobosses.proxy.proxies;
import com.willfp.eco.util.proxy.AbstractProxy;
import com.willfp.ecobosses.proxy.util.CustomEntity;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface CustomEntitySpawnerProxy extends AbstractProxy {
/**
* Spawn custom entity.
*
* @param <T> The class.
* @param entityClass The custom entity proxy class.
* @param location The location.
* @return The bukkit entity, or null if invalid class.
*/
@Nullable <T extends LivingEntity> T spawnCustomEntity(Class<? extends CustomEntity<? extends LivingEntity>> entityClass,
@NotNull Location location);
}

View File

@@ -5,4 +5,5 @@ import com.willfp.ecobosses.proxy.util.CustomEntity;
import org.bukkit.entity.Illusioner;
public interface CustomIllusionerProxy extends AbstractProxy, CustomEntity<Illusioner> {
}

View File

@@ -0,0 +1,30 @@
package com.willfp.ecobosses.proxy.util;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;
import com.willfp.ecobosses.proxy.proxies.CustomIllusionerProxy;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
public class CustomEntities {
/**
* Registered custom entities.
*/
private static final BiMap<String, Class<? extends CustomEntity<? extends LivingEntity>>> REGISTRY = new ImmutableBiMap.Builder<String, Class<? extends CustomEntity<? extends LivingEntity>>>()
.put("custom_illusioner", CustomIllusionerProxy.class)
.build();
/**
* Get entity class.
*
* @param id The entity id.
* @return The class.
*/
@Nullable
public Class<? extends CustomEntity<? extends LivingEntity>> getEntityClass(@NotNull final String id) {
return REGISTRY.get(id);
}
}

View File

@@ -1,14 +1,7 @@
package com.willfp.ecobosses.proxy.util;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import org.bukkit.entity.LivingEntity;
public interface CustomEntity<T extends LivingEntity> {
public interface CustomEntity<T> {
/**
* Spawn a custom entity.
*
* @param location The location to spawn it at.
* @return The created entity.
*/
T spawn(@NotNull Location location);
}