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:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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: []
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -5,4 +5,5 @@ import com.willfp.ecobosses.proxy.util.CustomEntity;
|
||||
import org.bukkit.entity.Illusioner;
|
||||
|
||||
public interface CustomIllusionerProxy extends AbstractProxy, CustomEntity<Illusioner> {
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user