203
This commit is contained in:
@@ -489,6 +489,9 @@ public class ModBlocks {
|
|||||||
public static final RegistrySupplier<Block> INCUBATED_BRACHIOSAURUS_EGG = registerBlock("incubated_brachiosaurus_egg",
|
public static final RegistrySupplier<Block> INCUBATED_BRACHIOSAURUS_EGG = registerBlock("incubated_brachiosaurus_egg",
|
||||||
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.BRACHIOSAURUS));
|
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.BRACHIOSAURUS));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Block> INCUBATED_CHICKENOSAURUS_EGG = registerBlock("incubated_chickenosaurus_egg",
|
||||||
|
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.CHICKENOSAURUS));
|
||||||
|
|
||||||
public static final RegistrySupplier<Block> INCUBATED_BARYONYX_EGG = registerBlock("incubated_baryonyx_egg",
|
public static final RegistrySupplier<Block> INCUBATED_BARYONYX_EGG = registerBlock("incubated_baryonyx_egg",
|
||||||
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.BARYONYX));
|
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.BARYONYX));
|
||||||
|
|
||||||
@@ -501,6 +504,9 @@ public class ModBlocks {
|
|||||||
public static final RegistrySupplier<Block> INCUBATED_DEINONYCHUS_EGG = registerBlock("incubated_deinonychus_egg",
|
public static final RegistrySupplier<Block> INCUBATED_DEINONYCHUS_EGG = registerBlock("incubated_deinonychus_egg",
|
||||||
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.DEINONYCHUS));
|
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.DEINONYCHUS));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Block> INCUBATED_FDUCK_EGG = registerBlock("incubated_fduck_egg",
|
||||||
|
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.FDUCK));
|
||||||
|
|
||||||
public static final RegistrySupplier<Block> INCUBATED_EDMONTOSAURUS_EGG = registerBlock("incubated_edmontosaurus_egg",
|
public static final RegistrySupplier<Block> INCUBATED_EDMONTOSAURUS_EGG = registerBlock("incubated_edmontosaurus_egg",
|
||||||
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.EDMONTOSAURUS));
|
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.EDMONTOSAURUS));
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,16 @@ public final class JRConfig {
|
|||||||
*/
|
*/
|
||||||
public boolean naturallySpawning = false;
|
public boolean naturallySpawning = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controls whether dinosaurs lose hunger over time.
|
||||||
|
*/
|
||||||
|
public boolean hungerConsumption = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controls whether dinosaurs lose thirst/water over time.
|
||||||
|
*/
|
||||||
|
public boolean waterConsumption = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Energy pipe transfer rate in FE per second.
|
* Energy pipe transfer rate in FE per second.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ public final class JRConfigManager {
|
|||||||
|
|
||||||
loaded.requirePower = readBoolean(text, "requirePower", loaded.requirePower);
|
loaded.requirePower = readBoolean(text, "requirePower", loaded.requirePower);
|
||||||
loaded.naturallySpawning = readBoolean(text, "naturallySpawning", loaded.naturallySpawning);
|
loaded.naturallySpawning = readBoolean(text, "naturallySpawning", loaded.naturallySpawning);
|
||||||
|
loaded.hungerConsumption = readBoolean(text, "hungerConsumption", loaded.hungerConsumption);
|
||||||
|
loaded.waterConsumption = readBoolean(text, "waterConsumption", loaded.waterConsumption);
|
||||||
loaded.fePerSecond = readPositiveInt(text, "fePerSecond", loaded.fePerSecond);
|
loaded.fePerSecond = readPositiveInt(text, "fePerSecond", loaded.fePerSecond);
|
||||||
loaded.itemsPerSecond = readPositiveInt(text, "itemsPerSecond", loaded.itemsPerSecond);
|
loaded.itemsPerSecond = readPositiveInt(text, "itemsPerSecond", loaded.itemsPerSecond);
|
||||||
loaded.milliBucketsPerSecond = readPositiveInt(text, "milliBucketsPerSecond", loaded.milliBucketsPerSecond);
|
loaded.milliBucketsPerSecond = readPositiveInt(text, "milliBucketsPerSecond", loaded.milliBucketsPerSecond);
|
||||||
@@ -51,6 +53,8 @@ public final class JRConfigManager {
|
|||||||
String text = "{\n" +
|
String text = "{\n" +
|
||||||
" \"requirePower\": " + config.requirePower + ",\n" +
|
" \"requirePower\": " + config.requirePower + ",\n" +
|
||||||
" \"naturallySpawning\": " + config.naturallySpawning + ",\n" +
|
" \"naturallySpawning\": " + config.naturallySpawning + ",\n" +
|
||||||
|
" \"hungerConsumption\": " + config.hungerConsumption + ",\n" +
|
||||||
|
" \"waterConsumption\": " + config.waterConsumption + ",\n" +
|
||||||
" \"fePerSecond\": " + config.fePerSecond + ",\n" +
|
" \"fePerSecond\": " + config.fePerSecond + ",\n" +
|
||||||
" \"itemsPerSecond\": " + config.itemsPerSecond + ",\n" +
|
" \"itemsPerSecond\": " + config.itemsPerSecond + ",\n" +
|
||||||
" \"milliBucketsPerSecond\": " + config.milliBucketsPerSecond + "\n" +
|
" \"milliBucketsPerSecond\": " + config.milliBucketsPerSecond + "\n" +
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ public class ModRecipeProvider {
|
|||||||
ModItems.GIGANOTOSAURUS_DNA.get());
|
ModItems.GIGANOTOSAURUS_DNA.get());
|
||||||
helper.dnaHybridizing(ModItems.DISTORTUS_REX_DNA.get(), 1,
|
helper.dnaHybridizing(ModItems.DISTORTUS_REX_DNA.get(), 1,
|
||||||
ModItems.TYRANNOSAURUS_REX_DNA.get(),
|
ModItems.TYRANNOSAURUS_REX_DNA.get(),
|
||||||
ModItems.BRACHIOSAURUS_DNA.get(),
|
ModItems.TITANOSAURUS_DNA.get(),
|
||||||
ModItems.VELOCIRAPTOR_DNA.get());
|
ModItems.VELOCIRAPTOR_DNA.get());
|
||||||
helper.dnaHybridizing(ModItems.INDORAPTOR_DNA.get(), 1,
|
helper.dnaHybridizing(ModItems.INDORAPTOR_DNA.get(), 1,
|
||||||
ModItems.INDOMINUS_REX_DNA.get(),
|
ModItems.INDOMINUS_REX_DNA.get(),
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package net.cmr.jurassicrevived.entity.ai;
|
package net.cmr.jurassicrevived.entity.ai;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.config.JRConfig;
|
||||||
|
import net.cmr.jurassicrevived.config.JRConfigManager;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.tags.FluidTags;
|
import net.minecraft.tags.FluidTags;
|
||||||
import net.minecraft.world.InteractionHand;
|
import net.minecraft.world.InteractionHand;
|
||||||
@@ -22,6 +24,9 @@ import java.util.List;
|
|||||||
|
|
||||||
public class DinoAIController {
|
public class DinoAIController {
|
||||||
|
|
||||||
|
private static final float VITAL_DECAY_MULTIPLIER = 0.05f;
|
||||||
|
private static final double TERRITORIAL_ROAM_SPEED_MULTIPLIER = 2.0D;
|
||||||
|
|
||||||
private final DinoEntityBase dino;
|
private final DinoEntityBase dino;
|
||||||
private State currentState = State.IDLE;
|
private State currentState = State.IDLE;
|
||||||
|
|
||||||
@@ -131,8 +136,10 @@ public class DinoAIController {
|
|||||||
|
|
||||||
// 2. Vitals Update
|
// 2. Vitals Update
|
||||||
if (dino.dinoData != null) {
|
if (dino.dinoData != null) {
|
||||||
float hungerDecay = config.hungerDecay();
|
JRConfig jrConfig = JRConfigManager.get();
|
||||||
float thirstDecay = config.thirstDecay();
|
|
||||||
|
float hungerDecay = jrConfig.hungerConsumption ? config.hungerDecay() * VITAL_DECAY_MULTIPLIER : 0.0f;
|
||||||
|
float thirstDecay = jrConfig.waterConsumption ? config.thirstDecay() * VITAL_DECAY_MULTIPLIER : 0.0f;
|
||||||
|
|
||||||
if (currentState == State.SLEEPING) {
|
if (currentState == State.SLEEPING) {
|
||||||
hungerDecay *= 0.5f;
|
hungerDecay *= 0.5f;
|
||||||
@@ -142,9 +149,14 @@ public class DinoAIController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hungerDecay > 0.0f) {
|
||||||
dino.dinoData.modifyHunger(-hungerDecay);
|
dino.dinoData.modifyHunger(-hungerDecay);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thirstDecay > 0.0f) {
|
||||||
float currentThirst = dino.dinoData.getThirst();
|
float currentThirst = dino.dinoData.getThirst();
|
||||||
dino.dinoData.setThirst(Math.max(0, currentThirst - thirstDecay));
|
dino.dinoData.setThirst(Math.max(0, currentThirst - thirstDecay));
|
||||||
|
}
|
||||||
|
|
||||||
float hunger = dino.dinoData.getHunger();
|
float hunger = dino.dinoData.getHunger();
|
||||||
float thirst = dino.dinoData.getThirst();
|
float thirst = dino.dinoData.getThirst();
|
||||||
@@ -155,7 +167,6 @@ public class DinoAIController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (stateTimer % 20 == 0) {
|
if (stateTimer % 20 == 0) {
|
||||||
dino.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 40, 1));
|
|
||||||
if (hunger <= 0) {
|
if (hunger <= 0) {
|
||||||
dino.hurt(dino.damageSources().starve(), 1.0f);
|
dino.hurt(dino.damageSources().starve(), 1.0f);
|
||||||
dino.dinoData.addCondition(IDinoData.Condition.STARVING);
|
dino.dinoData.addCondition(IDinoData.Condition.STARVING);
|
||||||
@@ -230,13 +241,19 @@ public class DinoAIController {
|
|||||||
|
|
||||||
// 5. Hunt check
|
// 5. Hunt check
|
||||||
if ((currentState == State.IDLE || currentState == State.ROAMING || currentState == State.TERRITORIAL_ROAMING) && dino.isCarnivore()) {
|
if ((currentState == State.IDLE || currentState == State.ROAMING || currentState == State.TERRITORIAL_ROAMING) && dino.isCarnivore()) {
|
||||||
boolean hungry = dino.dinoData != null && dino.dinoData.getHunger() < 70;
|
boolean hungerConsumptionEnabled = JRConfigManager.get().hungerConsumption;
|
||||||
boolean territorial = dino.dinoData != null && dino.dinoData.getAggression() == IDinoData.Aggression.TERRITORIAL;
|
boolean territorial = dino.dinoData != null && dino.dinoData.getAggression() == IDinoData.Aggression.TERRITORIAL;
|
||||||
|
boolean shouldHunt;
|
||||||
|
|
||||||
if (hungry || (territorial && dino.dinoData.getHunger() < 90)) {
|
if (hungerConsumptionEnabled) {
|
||||||
if (stateTimer % 10 == 0) {
|
boolean hungry = dino.dinoData != null && dino.dinoData.getHunger() < 70;
|
||||||
findTarget();
|
shouldHunt = hungry || (territorial && dino.dinoData != null && dino.dinoData.getHunger() < 90);
|
||||||
|
} else {
|
||||||
|
shouldHunt = stateTimer % 100 == 0 && dino.getRandom().nextFloat() < (territorial ? 0.35f : 0.15f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shouldHunt && stateTimer % 10 == 0) {
|
||||||
|
findTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -628,7 +645,12 @@ public class DinoAIController {
|
|||||||
|
|
||||||
boolean resumed = false;
|
boolean resumed = false;
|
||||||
if (roamTarget != null) {
|
if (roamTarget != null) {
|
||||||
resumed = dino.getNavigation().moveTo(roamTarget.x, roamTarget.y, roamTarget.z, dino.getAIConfig().walkSpeed());
|
resumed = dino.getNavigation().moveTo(
|
||||||
|
roamTarget.x,
|
||||||
|
roamTarget.y,
|
||||||
|
roamTarget.z,
|
||||||
|
getTerritorialRoamSpeed()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!resumed) {
|
if (!resumed) {
|
||||||
@@ -640,6 +662,10 @@ public class DinoAIController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private double getTerritorialRoamSpeed() {
|
||||||
|
return dino.getAIConfig().walkSpeed() * TERRITORIAL_ROAM_SPEED_MULTIPLIER;
|
||||||
|
}
|
||||||
|
|
||||||
private void findAndSetTerritorialTarget() {
|
private void findAndSetTerritorialTarget() {
|
||||||
this.roamTarget = null;
|
this.roamTarget = null;
|
||||||
Vec3 target = null;
|
Vec3 target = null;
|
||||||
@@ -655,7 +681,7 @@ public class DinoAIController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (candidate != null && dino.distanceToSqr(candidate) > 25.0) {
|
if (candidate != null && dino.distanceToSqr(candidate) > 25.0) {
|
||||||
if (dino.getNavigation().moveTo(candidate.x, candidate.y, candidate.z, dino.getAIConfig().walkSpeed())) {
|
if (dino.getNavigation().moveTo(candidate.x, candidate.y, candidate.z, getTerritorialRoamSpeed())) {
|
||||||
this.roamTarget = candidate;
|
this.roamTarget = candidate;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -664,7 +690,7 @@ public class DinoAIController {
|
|||||||
|
|
||||||
Vec3 fallback = DefaultRandomPos.getPos(dino, 10, 5);
|
Vec3 fallback = DefaultRandomPos.getPos(dino, 10, 5);
|
||||||
if (fallback != null) {
|
if (fallback != null) {
|
||||||
if (dino.getNavigation().moveTo(fallback.x, fallback.y, fallback.z, dino.getAIConfig().walkSpeed())) {
|
if (dino.getNavigation().moveTo(fallback.x, fallback.y, fallback.z, getTerritorialRoamSpeed())) {
|
||||||
this.roamTarget = fallback;
|
this.roamTarget = fallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,291 @@
|
|||||||
|
package net.cmr.jurassicrevived.entity.ai;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.ListTag;
|
||||||
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class DinoData implements IDinoData {
|
||||||
|
|
||||||
|
private final float maxHunger;
|
||||||
|
private final float maxThirst;
|
||||||
|
|
||||||
|
private float hunger;
|
||||||
|
private float thirst;
|
||||||
|
|
||||||
|
private Mood mood;
|
||||||
|
private Aggression aggression;
|
||||||
|
private float territoriality;
|
||||||
|
|
||||||
|
private DietaryClassification diet;
|
||||||
|
private Type type;
|
||||||
|
private Group group;
|
||||||
|
private BirthType birthType;
|
||||||
|
private ActivityPattern activityPattern;
|
||||||
|
|
||||||
|
private final Set<Condition> conditions = EnumSet.noneOf(Condition.class);
|
||||||
|
private final List<UUID> whitelistedPlayers = new ArrayList<>();
|
||||||
|
|
||||||
|
public DinoData(
|
||||||
|
float maxHunger,
|
||||||
|
float maxThirst,
|
||||||
|
Mood mood,
|
||||||
|
Aggression aggression,
|
||||||
|
float territoriality,
|
||||||
|
DietaryClassification diet,
|
||||||
|
Type type,
|
||||||
|
Group group,
|
||||||
|
BirthType birthType,
|
||||||
|
ActivityPattern activityPattern
|
||||||
|
) {
|
||||||
|
this.maxHunger = maxHunger;
|
||||||
|
this.maxThirst = maxThirst;
|
||||||
|
this.hunger = maxHunger;
|
||||||
|
this.thirst = maxThirst;
|
||||||
|
this.mood = mood;
|
||||||
|
this.aggression = aggression;
|
||||||
|
this.territoriality = territoriality;
|
||||||
|
this.diet = diet;
|
||||||
|
this.type = type;
|
||||||
|
this.group = group;
|
||||||
|
this.birthType = birthType;
|
||||||
|
this.activityPattern = activityPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getHunger() {
|
||||||
|
return hunger;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setHunger(float value) {
|
||||||
|
this.hunger = clamp(value, 0.0f, maxHunger);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifyHunger(float change) {
|
||||||
|
setHunger(this.hunger + change);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getThirst() {
|
||||||
|
return thirst;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setThirst(float value) {
|
||||||
|
this.thirst = clamp(value, 0.0f, maxThirst);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mood getMood() {
|
||||||
|
return mood;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMood(Mood mood) {
|
||||||
|
this.mood = mood;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Aggression getAggression() {
|
||||||
|
return aggression;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAggression(Aggression aggression) {
|
||||||
|
this.aggression = aggression;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getTerritoriality() {
|
||||||
|
return territoriality;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTerritoriality(float value) {
|
||||||
|
this.territoriality = clamp(value, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DietaryClassification getDiet() {
|
||||||
|
return diet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDiet(DietaryClassification diet) {
|
||||||
|
this.diet = diet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setType(Type type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Group getGroup() {
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setGroup(Group group) {
|
||||||
|
this.group = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BirthType getBirthType() {
|
||||||
|
return birthType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBirthType(BirthType birthType) {
|
||||||
|
this.birthType = birthType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActivityPattern getActivityPattern() {
|
||||||
|
return activityPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActivityPattern(ActivityPattern pattern) {
|
||||||
|
this.activityPattern = pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Condition> getConditions() {
|
||||||
|
return conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCondition(Condition condition) {
|
||||||
|
this.conditions.add(condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeCondition(Condition condition) {
|
||||||
|
this.conditions.remove(condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasCondition(Condition condition) {
|
||||||
|
return this.conditions.contains(condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addWhitelistedPlayer(UUID playerUUID) {
|
||||||
|
if (!this.whitelistedPlayers.contains(playerUUID)) {
|
||||||
|
this.whitelistedPlayers.add(playerUUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWhitelisted(UUID playerUUID) {
|
||||||
|
return this.whitelistedPlayers.contains(playerUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<UUID> getWhitelistedPlayers() {
|
||||||
|
return this.whitelistedPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveNBT(CompoundTag tag) {
|
||||||
|
CompoundTag dinoTag = new CompoundTag();
|
||||||
|
|
||||||
|
dinoTag.putFloat("Hunger", this.hunger);
|
||||||
|
dinoTag.putFloat("Thirst", this.thirst);
|
||||||
|
dinoTag.putString("Mood", this.mood.name());
|
||||||
|
dinoTag.putString("Aggression", this.aggression.name());
|
||||||
|
dinoTag.putFloat("Territoriality", this.territoriality);
|
||||||
|
dinoTag.putString("Diet", this.diet.name());
|
||||||
|
dinoTag.putString("Type", this.type.name());
|
||||||
|
dinoTag.putString("Group", this.group.name());
|
||||||
|
dinoTag.putString("BirthType", this.birthType.name());
|
||||||
|
dinoTag.putString("ActivityPattern", this.activityPattern.name());
|
||||||
|
|
||||||
|
int[] conditionIds = this.conditions.stream()
|
||||||
|
.mapToInt(Enum::ordinal)
|
||||||
|
.toArray();
|
||||||
|
dinoTag.putIntArray("Conditions", conditionIds);
|
||||||
|
|
||||||
|
ListTag whitelistTag = new ListTag();
|
||||||
|
for (UUID uuid : this.whitelistedPlayers) {
|
||||||
|
CompoundTag uuidTag = new CompoundTag();
|
||||||
|
uuidTag.putUUID("UUID", uuid);
|
||||||
|
whitelistTag.add(uuidTag);
|
||||||
|
}
|
||||||
|
dinoTag.put("WhitelistedPlayers", whitelistTag);
|
||||||
|
|
||||||
|
tag.put("DinoData", dinoTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadNBT(CompoundTag tag) {
|
||||||
|
if (!tag.contains("DinoData")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompoundTag dinoTag = tag.getCompound("DinoData");
|
||||||
|
|
||||||
|
this.hunger = clamp(dinoTag.getFloat("Hunger"), 0.0f, maxHunger);
|
||||||
|
this.thirst = clamp(dinoTag.getFloat("Thirst"), 0.0f, maxThirst);
|
||||||
|
this.mood = readEnum(dinoTag, "Mood", Mood.class, this.mood);
|
||||||
|
this.aggression = readEnum(dinoTag, "Aggression", Aggression.class, this.aggression);
|
||||||
|
this.territoriality = clamp(dinoTag.getFloat("Territoriality"), 0.0f, 1.0f);
|
||||||
|
this.diet = readEnum(dinoTag, "Diet", DietaryClassification.class, this.diet);
|
||||||
|
this.type = readEnum(dinoTag, "Type", Type.class, this.type);
|
||||||
|
this.group = readEnum(dinoTag, "Group", Group.class, this.group);
|
||||||
|
this.birthType = readEnum(dinoTag, "BirthType", BirthType.class, this.birthType);
|
||||||
|
this.activityPattern = readEnum(dinoTag, "ActivityPattern", ActivityPattern.class, this.activityPattern);
|
||||||
|
|
||||||
|
this.conditions.clear();
|
||||||
|
int[] conditionIds = dinoTag.getIntArray("Conditions");
|
||||||
|
Condition[] conditionValues = Condition.values();
|
||||||
|
for (int conditionId : conditionIds) {
|
||||||
|
if (conditionId >= 0 && conditionId < conditionValues.length) {
|
||||||
|
this.conditions.add(conditionValues[conditionId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.whitelistedPlayers.clear();
|
||||||
|
ListTag whitelistTag = dinoTag.getList("WhitelistedPlayers", 10);
|
||||||
|
for (int i = 0; i < whitelistTag.size(); i++) {
|
||||||
|
CompoundTag uuidTag = whitelistTag.getCompound(i);
|
||||||
|
if (uuidTag.hasUUID("UUID")) {
|
||||||
|
this.whitelistedPlayers.add(uuidTag.getUUID("UUID"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tickSync(SynchedEntityData entityData) {
|
||||||
|
// No-op for now. Add EntityDataAccessors later if you want client-side GUI/model access.
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float clamp(float value, float min, float max) {
|
||||||
|
return Math.max(min, Math.min(max, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <E extends Enum<E>> E readEnum(CompoundTag tag, String key, Class<E> enumClass, E fallback) {
|
||||||
|
if (!tag.contains(key)) {
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return Enum.valueOf(enumClass, tag.getString(key));
|
||||||
|
} catch (IllegalArgumentException ignored) {
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class AlbertosaurusRenderer extends GeoEntityRenderer<AlbertosaurusEntity> {
|
public class AlbertosaurusRenderer extends GeoEntityRenderer<AlbertosaurusEntity> {
|
||||||
private final float animalScale = 1.5F;
|
private final float animalScale = 1.7F;
|
||||||
public AlbertosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public AlbertosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new AlbertosaurusModel());
|
super(renderManager, new AlbertosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class AllosaurusRenderer extends GeoEntityRenderer<AllosaurusEntity> {
|
public class AllosaurusRenderer extends GeoEntityRenderer<AllosaurusEntity> {
|
||||||
private final float animalScale = 1.65F;
|
private final float animalScale = 1.9F;
|
||||||
public AllosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public AllosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new AllosaurusModel());
|
super(renderManager, new AllosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class AlvarezsaurusRenderer extends GeoEntityRenderer<AlvarezsaurusEntity> {
|
public class AlvarezsaurusRenderer extends GeoEntityRenderer<AlvarezsaurusEntity> {
|
||||||
private final float animalScale = 0.5F;
|
private final float animalScale = 0.8F;
|
||||||
public AlvarezsaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public AlvarezsaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new AlvarezsaurusModel());
|
super(renderManager, new AlvarezsaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ApatosaurusRenderer extends GeoEntityRenderer<ApatosaurusEntity> {
|
public class ApatosaurusRenderer extends GeoEntityRenderer<ApatosaurusEntity> {
|
||||||
private final float animalScale = 1.75F;
|
private final float animalScale = 1.9F;
|
||||||
public ApatosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public ApatosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ApatosaurusModel());
|
super(renderManager, new ApatosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ArambourgianiaRenderer extends GeoEntityRenderer<ArambourgianiaEntity> {
|
public class ArambourgianiaRenderer extends GeoEntityRenderer<ArambourgianiaEntity> {
|
||||||
private final float animalScale = 1.75F;
|
private final float animalScale = 1.9F;
|
||||||
public ArambourgianiaRenderer(EntityRendererProvider.Context renderManager) {
|
public ArambourgianiaRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ArambourgianiaModel());
|
super(renderManager, new ArambourgianiaModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class BaryonyxRenderer extends GeoEntityRenderer<BaryonyxEntity> {
|
public class BaryonyxRenderer extends GeoEntityRenderer<BaryonyxEntity> {
|
||||||
private final float animalScale = 1.5F;
|
private final float animalScale = 1.3F;
|
||||||
public BaryonyxRenderer(EntityRendererProvider.Context renderManager) {
|
public BaryonyxRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new BaryonyxModel());
|
super(renderManager, new BaryonyxModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class BrachiosaurusRenderer extends GeoEntityRenderer<BrachiosaurusEntity> {
|
public class BrachiosaurusRenderer extends GeoEntityRenderer<BrachiosaurusEntity> {
|
||||||
private final float animalScale = 1.6F;
|
private final float animalScale = 2.0F;
|
||||||
public BrachiosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public BrachiosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new BrachiosaurusModel());
|
super(renderManager, new BrachiosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class CarcharodontosaurusRenderer extends GeoEntityRenderer<CarcharodontosaurusEntity> {
|
public class CarcharodontosaurusRenderer extends GeoEntityRenderer<CarcharodontosaurusEntity> {
|
||||||
private final float animalScale = 2.25F;
|
private final float animalScale = 2.0F;
|
||||||
public CarcharodontosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public CarcharodontosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new CarcharodontosaurusModel());
|
super(renderManager, new CarcharodontosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class CearadactylusRenderer extends GeoEntityRenderer<CearadactylusEntity> {
|
public class CearadactylusRenderer extends GeoEntityRenderer<CearadactylusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.9F;
|
||||||
public CearadactylusRenderer(EntityRendererProvider.Context renderManager) {
|
public CearadactylusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new CearadactylusModel());
|
super(renderManager, new CearadactylusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class CeratosaurusRenderer extends GeoEntityRenderer<CeratosaurusEntity> {
|
public class CeratosaurusRenderer extends GeoEntityRenderer<CeratosaurusEntity> {
|
||||||
private final float animalScale = 1.75F;
|
private final float animalScale = 2.1F;
|
||||||
public CeratosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public CeratosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new CeratosaurusModel());
|
super(renderManager, new CeratosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ChasmosaurusRenderer extends GeoEntityRenderer<ChasmosaurusEntity> {
|
public class ChasmosaurusRenderer extends GeoEntityRenderer<ChasmosaurusEntity> {
|
||||||
private final float animalScale = 1.25F;
|
private final float animalScale = 1.3F;
|
||||||
public ChasmosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public ChasmosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ChasmosaurusModel());
|
super(renderManager, new ChasmosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ChickenosaurusRenderer extends GeoEntityRenderer<ChickenosaurusEntity> {
|
public class ChickenosaurusRenderer extends GeoEntityRenderer<ChickenosaurusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.9F;
|
||||||
public ChickenosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public ChickenosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ChickenosaurusModel());
|
super(renderManager, new ChickenosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class CoelophysisRenderer extends GeoEntityRenderer<CoelophysisEntity> {
|
public class CoelophysisRenderer extends GeoEntityRenderer<CoelophysisEntity> {
|
||||||
private final float animalScale = 0.9F;
|
private final float animalScale = 0.7F;
|
||||||
public CoelophysisRenderer(EntityRendererProvider.Context renderManager) {
|
public CoelophysisRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new CoelophysisModel());
|
super(renderManager, new CoelophysisModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class CompsognathusRenderer extends GeoEntityRenderer<CompsognathusEntity> {
|
public class CompsognathusRenderer extends GeoEntityRenderer<CompsognathusEntity> {
|
||||||
private final float animalScale = 0.35F;
|
private final float animalScale = 0.2F;
|
||||||
public CompsognathusRenderer(EntityRendererProvider.Context renderManager) {
|
public CompsognathusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new CompsognathusModel());
|
super(renderManager, new CompsognathusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ConcavenatorRenderer extends GeoEntityRenderer<ConcavenatorEntity> {
|
public class ConcavenatorRenderer extends GeoEntityRenderer<ConcavenatorEntity> {
|
||||||
private final float animalScale = 1.2F;
|
private final float animalScale = 0.9F;
|
||||||
public ConcavenatorRenderer(EntityRendererProvider.Context renderManager) {
|
public ConcavenatorRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ConcavenatorModel());
|
super(renderManager, new ConcavenatorModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class CorythosaurusRenderer extends GeoEntityRenderer<CorythosaurusEntity> {
|
public class CorythosaurusRenderer extends GeoEntityRenderer<CorythosaurusEntity> {
|
||||||
private final float animalScale = 1.25F;
|
private final float animalScale = 1.7F;
|
||||||
public CorythosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public CorythosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new CorythosaurusModel());
|
super(renderManager, new CorythosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class DeinonychusRenderer extends GeoEntityRenderer<DeinonychusEntity> {
|
public class DeinonychusRenderer extends GeoEntityRenderer<DeinonychusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.9F;
|
||||||
public DeinonychusRenderer(EntityRendererProvider.Context renderManager) {
|
public DeinonychusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new DeinonychusModel());
|
super(renderManager, new DeinonychusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class DilophosaurusRenderer extends GeoEntityRenderer<DilophosaurusEntity> {
|
public class DilophosaurusRenderer extends GeoEntityRenderer<DilophosaurusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.2F;
|
||||||
public DilophosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public DilophosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new DilophosaurusModel());
|
super(renderManager, new DilophosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class DimorphodonRenderer extends GeoEntityRenderer<DimorphodonEntity> {
|
public class DimorphodonRenderer extends GeoEntityRenderer<DimorphodonEntity> {
|
||||||
private final float animalScale = 0.4F;
|
private final float animalScale = 0.7F;
|
||||||
public DimorphodonRenderer(EntityRendererProvider.Context renderManager) {
|
public DimorphodonRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new DimorphodonModel());
|
super(renderManager, new DimorphodonModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class DiplodocusRenderer extends GeoEntityRenderer<DiplodocusEntity> {
|
public class DiplodocusRenderer extends GeoEntityRenderer<DiplodocusEntity> {
|
||||||
private final float animalScale = 2.5F;
|
private final float animalScale = 2.8F;
|
||||||
public DiplodocusRenderer(EntityRendererProvider.Context renderManager) {
|
public DiplodocusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new DiplodocusModel());
|
super(renderManager, new DiplodocusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class DistortusRexRenderer extends GeoEntityRenderer<DistortusRexEntity> {
|
public class DistortusRexRenderer extends GeoEntityRenderer<DistortusRexEntity> {
|
||||||
private final float animalScale = 2.75F;
|
private final float animalScale = 3.4F;
|
||||||
public DistortusRexRenderer(EntityRendererProvider.Context renderManager) {
|
public DistortusRexRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new DistortusRexModel());
|
super(renderManager, new DistortusRexModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class DryosaurusRenderer extends GeoEntityRenderer<DryosaurusEntity> {
|
public class DryosaurusRenderer extends GeoEntityRenderer<DryosaurusEntity> {
|
||||||
private final float animalScale = 0.35F;
|
private final float animalScale = 0.45F;
|
||||||
public DryosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public DryosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new DryosaurusModel());
|
super(renderManager, new DryosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class EdmontosaurusRenderer extends GeoEntityRenderer<EdmontosaurusEntity> {
|
public class EdmontosaurusRenderer extends GeoEntityRenderer<EdmontosaurusEntity> {
|
||||||
private final float animalScale = 1.5F;
|
private final float animalScale = 2.0F;
|
||||||
public EdmontosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public EdmontosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new EdmontosaurusModel());
|
super(renderManager, new EdmontosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class FDuckRenderer extends GeoEntityRenderer<FDuckEntity> {
|
public class FDuckRenderer extends GeoEntityRenderer<FDuckEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.4F;
|
||||||
public FDuckRenderer(EntityRendererProvider.Context renderManager) {
|
public FDuckRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new FDuckModel());
|
super(renderManager, new FDuckModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class GallimimusRenderer extends GeoEntityRenderer<GallimimusEntity> {
|
public class GallimimusRenderer extends GeoEntityRenderer<GallimimusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.8F;
|
||||||
public GallimimusRenderer(EntityRendererProvider.Context renderManager) {
|
public GallimimusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new GallimimusModel());
|
super(renderManager, new GallimimusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class GeosternbergiaRenderer extends GeoEntityRenderer<GeosternbergiaEntity> {
|
public class GeosternbergiaRenderer extends GeoEntityRenderer<GeosternbergiaEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.4F;
|
||||||
public GeosternbergiaRenderer(EntityRendererProvider.Context renderManager) {
|
public GeosternbergiaRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new GeosternbergiaModel());
|
super(renderManager, new GeosternbergiaModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class GiganotosaurusRenderer extends GeoEntityRenderer<GiganotosaurusEntity> {
|
public class GiganotosaurusRenderer extends GeoEntityRenderer<GiganotosaurusEntity> {
|
||||||
private final float animalScale = 2.1F;
|
private final float animalScale = 2.2F;
|
||||||
public GiganotosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public GiganotosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new GiganotosaurusModel());
|
super(renderManager, new GiganotosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class GuanlongRenderer extends GeoEntityRenderer<GuanlongEntity> {
|
public class GuanlongRenderer extends GeoEntityRenderer<GuanlongEntity> {
|
||||||
private final float animalScale = 0.75F;
|
private final float animalScale = 0.6F;
|
||||||
public GuanlongRenderer(EntityRendererProvider.Context renderManager) {
|
public GuanlongRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new GuanlongModel());
|
super(renderManager, new GuanlongModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class GuidracoRenderer extends GeoEntityRenderer<GuidracoEntity> {
|
public class GuidracoRenderer extends GeoEntityRenderer<GuidracoEntity> {
|
||||||
private final float animalScale = 0.55F;
|
private final float animalScale = 0.8F;
|
||||||
public GuidracoRenderer(EntityRendererProvider.Context renderManager) {
|
public GuidracoRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new GuidracoModel());
|
super(renderManager, new GuidracoModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class HadrosaurusRenderer extends GeoEntityRenderer<HadrosaurusEntity> {
|
public class HadrosaurusRenderer extends GeoEntityRenderer<HadrosaurusEntity> {
|
||||||
private final float animalScale = 1.4F;
|
private final float animalScale = 1.5F;
|
||||||
public HadrosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public HadrosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new HadrosaurusModel());
|
super(renderManager, new HadrosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class HerrerasaurusRenderer extends GeoEntityRenderer<HerrerasaurusEntity> {
|
public class HerrerasaurusRenderer extends GeoEntityRenderer<HerrerasaurusEntity> {
|
||||||
private final float animalScale = 1.095F;
|
private final float animalScale = 1.3F;
|
||||||
public HerrerasaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public HerrerasaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new HerrerasaurusModel());
|
super(renderManager, new HerrerasaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class HypsilophodonRenderer extends GeoEntityRenderer<HypsilophodonEntity> {
|
public class HypsilophodonRenderer extends GeoEntityRenderer<HypsilophodonEntity> {
|
||||||
private final float animalScale = 0.6F;
|
private final float animalScale = 0.5F;
|
||||||
public HypsilophodonRenderer(EntityRendererProvider.Context renderManager) {
|
public HypsilophodonRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new HypsilophodonModel());
|
super(renderManager, new HypsilophodonModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class IndominusRexRenderer extends GeoEntityRenderer<IndominusRexEntity> {
|
public class IndominusRexRenderer extends GeoEntityRenderer<IndominusRexEntity> {
|
||||||
private final float animalScale = 2.77F;
|
private final float animalScale = 3.0F;
|
||||||
public IndominusRexRenderer(EntityRendererProvider.Context renderManager) {
|
public IndominusRexRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new IndominusRexModel());
|
super(renderManager, new IndominusRexModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class IndoraptorRenderer extends GeoEntityRenderer<IndoraptorEntity> {
|
public class IndoraptorRenderer extends GeoEntityRenderer<IndoraptorEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.8F;
|
||||||
public IndoraptorRenderer(EntityRendererProvider.Context renderManager) {
|
public IndoraptorRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new IndoraptorModel());
|
super(renderManager, new IndoraptorModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class InostranceviaRenderer extends GeoEntityRenderer<InostranceviaEntity> {
|
public class InostranceviaRenderer extends GeoEntityRenderer<InostranceviaEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.1F;
|
||||||
public InostranceviaRenderer(EntityRendererProvider.Context renderManager) {
|
public InostranceviaRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new InostranceviaModel());
|
super(renderManager, new InostranceviaModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class LambeosaurusRenderer extends GeoEntityRenderer<LambeosaurusEntity> {
|
public class LambeosaurusRenderer extends GeoEntityRenderer<LambeosaurusEntity> {
|
||||||
private final float animalScale = 1.65F;
|
private final float animalScale = 1.8F;
|
||||||
public LambeosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public LambeosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new LambeosaurusModel());
|
super(renderManager, new LambeosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class LudodactylusRenderer extends GeoEntityRenderer<LudodactylusEntity> {
|
public class LudodactylusRenderer extends GeoEntityRenderer<LudodactylusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.9F;
|
||||||
public LudodactylusRenderer(EntityRendererProvider.Context renderManager) {
|
public LudodactylusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new LudodactylusModel());
|
super(renderManager, new LudodactylusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class MajungasaurusRenderer extends GeoEntityRenderer<MajungasaurusEntity> {
|
public class MajungasaurusRenderer extends GeoEntityRenderer<MajungasaurusEntity> {
|
||||||
private final float animalScale = 1.57F;
|
private final float animalScale = 1.4F;
|
||||||
public MajungasaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public MajungasaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new MajungasaurusModel());
|
super(renderManager, new MajungasaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class MamenchisaurusRenderer extends GeoEntityRenderer<MamenchisaurusEntity> {
|
public class MamenchisaurusRenderer extends GeoEntityRenderer<MamenchisaurusEntity> {
|
||||||
private final float animalScale = 1.85F;
|
private final float animalScale = 1.7F;
|
||||||
public MamenchisaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public MamenchisaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new MamenchisaurusModel());
|
super(renderManager, new MamenchisaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class MetriacanthosaurusRenderer extends GeoEntityRenderer<MetriacanthosaurusEntity> {
|
public class MetriacanthosaurusRenderer extends GeoEntityRenderer<MetriacanthosaurusEntity> {
|
||||||
private final float animalScale = 1.75F;
|
private final float animalScale = 1.5F;
|
||||||
public MetriacanthosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public MetriacanthosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new MetriacanthosaurusModel());
|
super(renderManager, new MetriacanthosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class MoganopterusRenderer extends GeoEntityRenderer<MoganopterusEntity> {
|
public class MoganopterusRenderer extends GeoEntityRenderer<MoganopterusEntity> {
|
||||||
private final float animalScale = 0.75F;
|
private final float animalScale = 0.8F;
|
||||||
public MoganopterusRenderer(EntityRendererProvider.Context renderManager) {
|
public MoganopterusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new MoganopterusModel());
|
super(renderManager, new MoganopterusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class NyctosaurusRenderer extends GeoEntityRenderer<NyctosaurusEntity> {
|
public class NyctosaurusRenderer extends GeoEntityRenderer<NyctosaurusEntity> {
|
||||||
private final float animalScale = 0.45F;
|
private final float animalScale = 0.3F;
|
||||||
public NyctosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public NyctosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new NyctosaurusModel());
|
super(renderManager, new NyctosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class OrnitholestesRenderer extends GeoEntityRenderer<OrnitholestesEntity> {
|
public class OrnitholestesRenderer extends GeoEntityRenderer<OrnitholestesEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.6F;
|
||||||
public OrnitholestesRenderer(EntityRendererProvider.Context renderManager) {
|
public OrnitholestesRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new OrnitholestesModel());
|
super(renderManager, new OrnitholestesModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class OrnithomimusRenderer extends GeoEntityRenderer<OrnithomimusEntity> {
|
public class OrnithomimusRenderer extends GeoEntityRenderer<OrnithomimusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.8F;
|
||||||
public OrnithomimusRenderer(EntityRendererProvider.Context renderManager) {
|
public OrnithomimusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new OrnithomimusModel());
|
super(renderManager, new OrnithomimusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class OuranosaurusRenderer extends GeoEntityRenderer<OuranosaurusEntity> {
|
public class OuranosaurusRenderer extends GeoEntityRenderer<OuranosaurusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.2F;
|
||||||
public OuranosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public OuranosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new OuranosaurusModel());
|
super(renderManager, new OuranosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class PachycephalosaurusRenderer extends GeoEntityRenderer<PachycephalosaurusEntity> {
|
public class PachycephalosaurusRenderer extends GeoEntityRenderer<PachycephalosaurusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.8F;
|
||||||
public PachycephalosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public PachycephalosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new PachycephalosaurusModel());
|
super(renderManager, new PachycephalosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ParasaurolophusRenderer extends GeoEntityRenderer<ParasaurolophusEntity> {
|
public class ParasaurolophusRenderer extends GeoEntityRenderer<ParasaurolophusEntity> {
|
||||||
private final float animalScale = 1.5F;
|
private final float animalScale = 1.7F;
|
||||||
public ParasaurolophusRenderer(EntityRendererProvider.Context renderManager) {
|
public ParasaurolophusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ParasaurolophusModel());
|
super(renderManager, new ParasaurolophusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ProceratosaurusRenderer extends GeoEntityRenderer<ProceratosaurusEntity> {
|
public class ProceratosaurusRenderer extends GeoEntityRenderer<ProceratosaurusEntity> {
|
||||||
private final float animalScale = 0.65F;
|
private final float animalScale = 0.6F;
|
||||||
public ProceratosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public ProceratosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ProceratosaurusModel());
|
super(renderManager, new ProceratosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ProcompsognathusRenderer extends GeoEntityRenderer<ProcompsognathusEntity> {
|
public class ProcompsognathusRenderer extends GeoEntityRenderer<ProcompsognathusEntity> {
|
||||||
private final float animalScale = 0.44F;
|
private final float animalScale = 0.2F;
|
||||||
public ProcompsognathusRenderer(EntityRendererProvider.Context renderManager) {
|
public ProcompsognathusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ProcompsognathusModel());
|
super(renderManager, new ProcompsognathusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ProtoceratopsRenderer extends GeoEntityRenderer<ProtoceratopsEntity> {
|
public class ProtoceratopsRenderer extends GeoEntityRenderer<ProtoceratopsEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.2F;
|
||||||
public ProtoceratopsRenderer(EntityRendererProvider.Context renderManager) {
|
public ProtoceratopsRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ProtoceratopsModel());
|
super(renderManager, new ProtoceratopsModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class PteranodonRenderer extends GeoEntityRenderer<PteranodonEntity> {
|
public class PteranodonRenderer extends GeoEntityRenderer<PteranodonEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.5F;
|
||||||
public PteranodonRenderer(EntityRendererProvider.Context renderManager) {
|
public PteranodonRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new PteranodonModel());
|
super(renderManager, new PteranodonModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class PterodaustroRenderer extends GeoEntityRenderer<PterodaustroEntity> {
|
public class PterodaustroRenderer extends GeoEntityRenderer<PterodaustroEntity> {
|
||||||
private final float animalScale = 0.65F;
|
private final float animalScale = 0.7F;
|
||||||
public PterodaustroRenderer(EntityRendererProvider.Context renderManager) {
|
public PterodaustroRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new PterodaustroModel());
|
super(renderManager, new PterodaustroModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class RajasaurusRenderer extends GeoEntityRenderer<RajasaurusEntity> {
|
public class RajasaurusRenderer extends GeoEntityRenderer<RajasaurusEntity> {
|
||||||
private final float animalScale = 1.45F;
|
private final float animalScale = 1.5F;
|
||||||
public RajasaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public RajasaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new RajasaurusModel());
|
super(renderManager, new RajasaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class RugopsRenderer extends GeoEntityRenderer<RugopsEntity> {
|
public class RugopsRenderer extends GeoEntityRenderer<RugopsEntity> {
|
||||||
private final float animalScale = 1.2F;
|
private final float animalScale = 0.9F;
|
||||||
public RugopsRenderer(EntityRendererProvider.Context renderManager) {
|
public RugopsRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new RugopsModel());
|
super(renderManager, new RugopsModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class SegisaurusRenderer extends GeoEntityRenderer<SegisaurusEntity> {
|
public class SegisaurusRenderer extends GeoEntityRenderer<SegisaurusEntity> {
|
||||||
private final float animalScale = 0.55F;
|
private final float animalScale = 0.62F;
|
||||||
public SegisaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public SegisaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new SegisaurusModel());
|
super(renderManager, new SegisaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ShantungosaurusRenderer extends GeoEntityRenderer<ShantungosaurusEntity> {
|
public class ShantungosaurusRenderer extends GeoEntityRenderer<ShantungosaurusEntity> {
|
||||||
private final float animalScale = 1.67F;
|
private final float animalScale = 1.8F;
|
||||||
public ShantungosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public ShantungosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ShantungosaurusModel());
|
super(renderManager, new ShantungosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class SpinosaurusRenderer extends GeoEntityRenderer<SpinosaurusEntity> {
|
public class SpinosaurusRenderer extends GeoEntityRenderer<SpinosaurusEntity> {
|
||||||
private final float animalScale = 2.77F;
|
private final float animalScale = 2.2F;
|
||||||
public SpinosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public SpinosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new SpinosaurusModel());
|
super(renderManager, new SpinosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class StegosaurusRenderer extends GeoEntityRenderer<StegosaurusEntity> {
|
public class StegosaurusRenderer extends GeoEntityRenderer<StegosaurusEntity> {
|
||||||
private final float animalScale = 1.62F;
|
private final float animalScale = 1.4F;
|
||||||
public StegosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public StegosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new StegosaurusModel());
|
super(renderManager, new StegosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class StyracosaurusRenderer extends GeoEntityRenderer<StyracosaurusEntity> {
|
public class StyracosaurusRenderer extends GeoEntityRenderer<StyracosaurusEntity> {
|
||||||
private final float animalScale = 1.28F;
|
private final float animalScale = 0.7F;
|
||||||
public StyracosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public StyracosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new StyracosaurusModel());
|
super(renderManager, new StyracosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class TapejaraRenderer extends GeoEntityRenderer<TapejaraEntity> {
|
public class TapejaraRenderer extends GeoEntityRenderer<TapejaraEntity> {
|
||||||
private final float animalScale = 0.45F;
|
private final float animalScale = 0.6F;
|
||||||
public TapejaraRenderer(EntityRendererProvider.Context renderManager) {
|
public TapejaraRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new TapejaraModel());
|
super(renderManager, new TapejaraModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class TherizinosaurusRenderer extends GeoEntityRenderer<TherizinosaurusEntity> {
|
public class TherizinosaurusRenderer extends GeoEntityRenderer<TherizinosaurusEntity> {
|
||||||
private final float animalScale = 2.5F;
|
private final float animalScale = 1.9F;
|
||||||
public TherizinosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public TherizinosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new TherizinosaurusModel());
|
super(renderManager, new TherizinosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class TitanosaurusRenderer extends GeoEntityRenderer<TitanosaurusEntity> {
|
public class TitanosaurusRenderer extends GeoEntityRenderer<TitanosaurusEntity> {
|
||||||
private final float animalScale = 2.1F;
|
private final float animalScale = 2.3F;
|
||||||
public TitanosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
public TitanosaurusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new TitanosaurusModel());
|
super(renderManager, new TitanosaurusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class TroodonRenderer extends GeoEntityRenderer<TroodonEntity> {
|
public class TroodonRenderer extends GeoEntityRenderer<TroodonEntity> {
|
||||||
private final float animalScale = 0.5F;
|
private final float animalScale = 0.3F;
|
||||||
public TroodonRenderer(EntityRendererProvider.Context renderManager) {
|
public TroodonRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new TroodonModel());
|
super(renderManager, new TroodonModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class TropeognathusRenderer extends GeoEntityRenderer<TropeognathusEntity> {
|
public class TropeognathusRenderer extends GeoEntityRenderer<TropeognathusEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 1.4F;
|
||||||
public TropeognathusRenderer(EntityRendererProvider.Context renderManager) {
|
public TropeognathusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new TropeognathusModel());
|
super(renderManager, new TropeognathusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class TupuxuaraRenderer extends GeoEntityRenderer<TupuxuaraEntity> {
|
public class TupuxuaraRenderer extends GeoEntityRenderer<TupuxuaraEntity> {
|
||||||
private final float animalScale = 0.8F;
|
private final float animalScale = 1.0F;
|
||||||
public TupuxuaraRenderer(EntityRendererProvider.Context renderManager) {
|
public TupuxuaraRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new TupuxuaraModel());
|
super(renderManager, new TupuxuaraModel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class UtahraptorRenderer extends GeoEntityRenderer<UtahraptorEntity> {
|
public class UtahraptorRenderer extends GeoEntityRenderer<UtahraptorEntity> {
|
||||||
private final float animalScale = 1.0F;
|
private final float animalScale = 0.9F;
|
||||||
public UtahraptorRenderer(EntityRendererProvider.Context renderManager) {
|
public UtahraptorRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new UtahraptorModel());
|
super(renderManager, new UtahraptorModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
|||||||
|
|
||||||
|
|
||||||
public class ZhenyuanopterusRenderer extends GeoEntityRenderer<ZhenyuanopterusEntity> {
|
public class ZhenyuanopterusRenderer extends GeoEntityRenderer<ZhenyuanopterusEntity> {
|
||||||
private final float animalScale = 0.7F;
|
private final float animalScale = 1.1F;
|
||||||
public ZhenyuanopterusRenderer(EntityRendererProvider.Context renderManager) {
|
public ZhenyuanopterusRenderer(EntityRendererProvider.Context renderManager) {
|
||||||
super(renderManager, new ZhenyuanopterusModel());
|
super(renderManager, new ZhenyuanopterusModel());
|
||||||
}
|
}
|
||||||
|
|||||||
+48
-46
@@ -1,8 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.client.AlbertosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.AlbertosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.sound.ModSounds;
|
import net.cmr.jurassicrevived.sound.ModSounds;
|
||||||
import net.minecraft.Util;
|
import net.minecraft.Util;
|
||||||
@@ -12,25 +14,19 @@ import net.minecraft.network.syncher.EntityDataSerializers;
|
|||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.sounds.SoundEvent;
|
import net.minecraft.sounds.SoundEvent;
|
||||||
import net.minecraft.sounds.SoundEvents;
|
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.Difficulty;
|
|
||||||
import net.minecraft.world.DifficultyInstance;
|
import net.minecraft.world.DifficultyInstance;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
import net.minecraft.world.entity.*;
|
import net.minecraft.world.entity.*;
|
||||||
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
||||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||||
import net.minecraft.world.entity.ai.attributes.DefaultAttributes;
|
import net.minecraft.world.entity.ai.attributes.DefaultAttributes;
|
||||||
import net.minecraft.world.entity.ai.goal.*;
|
|
||||||
import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;
|
|
||||||
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
|
|
||||||
import net.minecraft.world.entity.animal.Animal;
|
import net.minecraft.world.entity.animal.Animal;
|
||||||
import net.minecraft.world.entity.monster.Monster;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -47,7 +43,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class AlbertosaurusEntity extends Animal implements GeoEntity {
|
public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -62,38 +58,44 @@ public class AlbertosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public AlbertosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public AlbertosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return AlbertosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1.2, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
}
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new FollowMobGoal(this, 1.2, (float) 20, (float) 10));
|
}
|
||||||
this.targetSelector.addGoal(10, new NearestAttackableTargetGoal<>(this, Monster.class, true));
|
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public Block getEggBlock() {
|
||||||
this.targetSelector.addGoal(12, new NearestAttackableTargetGoal(this, TriceratopsEntity.class, false, false));
|
return ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get();
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
}
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
@Override
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, SpinosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, IndominusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(20, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.goalSelector.addGoal(21, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -107,11 +109,6 @@ public class AlbertosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 16D);
|
.add(Attributes.ATTACK_DAMAGE, 16D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
||||||
@@ -137,17 +134,17 @@ public class AlbertosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(AlbertosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.albertosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.albertosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(AlbertosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.albertosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.albertosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.albertosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.albertosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.albertosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.albertosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.albertosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.albertosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,4 +313,9 @@ public class AlbertosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.ALBERTOSAURUS_DEATH.get();
|
return ModSounds.ALBERTOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.ALBERTOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.*;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
|
||||||
import net.cmr.jurassicrevived.entity.client.AllosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.AllosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.AllosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.AllosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.sound.ModSounds;
|
import net.cmr.jurassicrevived.sound.ModSounds;
|
||||||
@@ -29,6 +29,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +46,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class AllosaurusEntity extends Animal implements GeoEntity {
|
public class AllosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,38 +61,43 @@ public class AllosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public AllosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public AllosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return AllosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.targetSelector.addGoal(9, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(10, new NearestAttackableTargetGoal(this, TriceratopsEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(12, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, TyrannosaurusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, IndominusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.goalSelector.addGoal(19, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_ALLOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -105,11 +111,6 @@ public class AllosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 18D);
|
.add(Attributes.ATTACK_DAMAGE, 18D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
||||||
@@ -135,17 +136,17 @@ public class AllosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(AllosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.allosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.allosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(AllosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.allosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.allosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.allosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.allosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.allosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.allosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.allosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.allosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,4 +314,9 @@ public class AllosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.ALLOSAURUS_DEATH.get();
|
return ModSounds.ALLOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.ALBERTOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+48
-35
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.AlvarezsaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.AlvarezsaurusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +50,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class AlvarezsaurusEntity extends Animal implements GeoEntity {
|
public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,37 +65,44 @@ public class AlvarezsaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public AlvarezsaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public AlvarezsaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return AlvarezsaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, ParasaurolophusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(10, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(11, new BreedGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowParentGoal(this, 1.25));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
return ModBlocks.INCUBATED_ALVAREZSAURUS_EGG.get();
|
||||||
this.goalSelector.addGoal(14, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
}
|
||||||
this.goalSelector.addGoal(15, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -104,10 +116,6 @@ public class AlvarezsaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 2D);
|
.add(Attributes.ATTACK_DAMAGE, 2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -133,17 +141,17 @@ public class AlvarezsaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(AlvarezsaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.alvarezsaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.alvarezsaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(AlvarezsaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.alvarezsaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.alvarezsaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.alvarezsaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.alvarezsaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.alvarezsaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.alvarezsaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.alvarezsaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.alvarezsaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,4 +318,9 @@ public class AlvarezsaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.ALVAREZSAURUS_DEATH.get();
|
return ModSounds.ALVAREZSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.ALVAREZSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+47
-29
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.AnkylosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.AnkylosaurusVariant;
|
||||||
@@ -28,6 +32,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -44,7 +49,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class AnkylosaurusEntity extends Animal implements GeoEntity {
|
public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -59,32 +64,44 @@ public class AnkylosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public AnkylosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public AnkylosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THYREOPHORAN,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
public boolean isCarnivore() {
|
||||||
@Override
|
return false;
|
||||||
public boolean canUse() {
|
|
||||||
return AnkylosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(6, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(7, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(11, new FollowMobGoal(this, 0.8, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(12, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(13, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(14, new AvoidEntityGoal<>(this, IndominusRexEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(15, new EatBlockGoal(this));
|
|
||||||
this.goalSelector.addGoal(16, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_ANKYLOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -98,10 +115,6 @@ public class AnkylosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 18D);
|
.add(Attributes.ATTACK_DAMAGE, 18D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -127,17 +140,17 @@ public class AnkylosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(AnkylosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.ankylosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.ankylosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(AnkylosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.ankylosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.ankylosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.ankylosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.ankylosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.ankylosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.ankylosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.ankylosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.ankylosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,4 +317,9 @@ public class AnkylosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.ANKYLOSAURUS_DEATH.get();
|
return ModSounds.ANKYLOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.ANKYLOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.ApatosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.ApatosaurusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
@@ -46,7 +51,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class ApatosaurusEntity extends Animal implements GeoEntity {
|
public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -61,31 +66,44 @@ public class ApatosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public ApatosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public ApatosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.SAUROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return false;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return ApatosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(8, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(9, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(9, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(10, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(11, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(12, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(13, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_APATOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -99,10 +117,6 @@ public class ApatosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 15D);
|
.add(Attributes.ATTACK_DAMAGE, 15D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -129,17 +143,17 @@ public class ApatosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(ApatosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.apatosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.apatosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(ApatosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.apatosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.apatosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.apatosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.apatosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.apatosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.apatosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.apatosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.apatosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,4 +326,9 @@ public class ApatosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.APATOSAURUS_DEATH.get();
|
return ModSounds.APATOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.APATOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+41
-85
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.ArambourgianiaVariant;
|
import net.cmr.jurassicrevived.entity.client.ArambourgianiaVariant;
|
||||||
@@ -35,6 +39,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
@@ -54,7 +59,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class ArambourgianiaEntity extends Animal implements GeoEntity, FlyingAnimal {
|
public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal {
|
||||||
private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -70,94 +75,44 @@ public class ArambourgianiaEntity extends Animal implements GeoEntity, FlyingAni
|
|||||||
public ArambourgianiaEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public ArambourgianiaEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
this.moveControl = new FlyingMoveControl(this, 20, true);
|
this.moveControl = new FlyingMoveControl(this, 20, true);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.AVIAN,
|
||||||
|
IDinoData.Group.PTEROSAUR,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return ArambourgianiaEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
|
|
||||||
// Goal 7: Wander on ground (Walk) - Only when on ground
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0) {
|
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return ArambourgianiaEntity.this.onGround() && super.canUse();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Goal 8: Wander in air (Fly) - Handles takeoff, flying, and landing
|
|
||||||
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0, 20) {
|
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
boolean isFlying = !ArambourgianiaEntity.this.onGround();
|
|
||||||
// If flying, keep flying. If on ground, small chance (1/400 ticks) to take off.
|
|
||||||
return (isFlying || ArambourgianiaEntity.this.getRandom().nextInt(400) == 0) && super.canUse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Vec3 getPosition() {
|
public boolean isMarine() {
|
||||||
Vec3 pos = ArambourgianiaEntity.this.position();
|
return false;
|
||||||
RandomSource random = ArambourgianiaEntity.this.getRandom();
|
|
||||||
|
|
||||||
double x = pos.x + (random.nextFloat() * 2 - 1) * 32;
|
|
||||||
double z = pos.z + (random.nextFloat() * 2 - 1) * 32;
|
|
||||||
|
|
||||||
// Get ground height at the random destination (returns Y of first air block)
|
|
||||||
int groundY = ArambourgianiaEntity.this.level().getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, (int)x, (int)z);
|
|
||||||
double y;
|
|
||||||
|
|
||||||
if (ArambourgianiaEntity.this.onGround()) {
|
|
||||||
// Takeoff: Target well above ground to ensure liftoff
|
|
||||||
y = pos.y + 15 + random.nextInt(10);
|
|
||||||
} else {
|
|
||||||
// Flying: 5% chance to land, otherwise stay airborne but capped height
|
|
||||||
if (random.nextFloat() < 0.05f) {
|
|
||||||
y = groundY; // Land
|
|
||||||
} else if (pos.y > groundY + 20) {
|
|
||||||
// Too high: Force descent
|
|
||||||
y = pos.y - 5 - random.nextInt(10);
|
|
||||||
} else {
|
|
||||||
// Just wander up or down a bit
|
|
||||||
y = pos.y + (random.nextFloat() * 2 - 1) * 10;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't target below the ground (blocks)
|
@Override
|
||||||
if (y < groundY) y = groundY;
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
return new Vec3(x, y, z);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
@Override
|
||||||
this.goalSelector.addGoal(10, new FollowMobGoal(this, 0.8, (float) 20, (float) 10));
|
public Block getEggBlock() {
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
return ModBlocks.INCUBATED_ARAMBOURGIANIA_EGG.get();
|
||||||
target -> {
|
|
||||||
// 1. Don't eat your own species
|
|
||||||
if (target.getType() == this.getType()) return false;
|
|
||||||
|
|
||||||
// 2. Don't eat Flying Animals
|
|
||||||
if (target instanceof FlyingAnimal) return false;
|
|
||||||
|
|
||||||
// 3. SIZE CHECK: specific height and width limits
|
|
||||||
// Example: Height < 1.0 blocks AND Width < 1.0 blocks
|
|
||||||
boolean isSmallEnough = target.getBbHeight() <= 1.0F && target.getBbWidth() <= 1.0F;
|
|
||||||
|
|
||||||
return isSmallEnough;
|
|
||||||
}
|
}
|
||||||
)); this.targetSelector.addGoal(12, new NearestAttackableTargetGoal<>(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new HurtByTargetGoal(this));
|
@Override
|
||||||
this.goalSelector.addGoal(14, new RandomLookAroundGoal(this));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.goalSelector.addGoal(15, new FloatGoal(this));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -195,10 +150,6 @@ public class ArambourgianiaEntity extends Animal implements GeoEntity, FlyingAni
|
|||||||
protected void checkFallDamage(double pY, boolean pOnGround, BlockState pState, BlockPos pPos) {
|
protected void checkFallDamage(double pY, boolean pOnGround, BlockState pState, BlockPos pPos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -225,7 +176,7 @@ public class ArambourgianiaEntity extends Animal implements GeoEntity, FlyingAni
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (!ArambourgianiaEntity.this.onGround()) {
|
if (!ArambourgianiaEntity.this.onGround()) {
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.arambourgiania.fly", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.arambourgiania.fly", Animation.LoopType.LOOP));
|
||||||
}
|
}
|
||||||
@@ -236,10 +187,10 @@ public class ArambourgianiaEntity extends Animal implements GeoEntity, FlyingAni
|
|||||||
return state.setAndContinue(RawAnimation.begin().then("anim.arambourgiania.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.arambourgiania.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.arambourgiania.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.arambourgiania.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.arambourgiania.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.arambourgiania.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,4 +358,9 @@ public class ArambourgianiaEntity extends Animal implements GeoEntity, FlyingAni
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.ARAMBOURGIANIA_DEATH.get();
|
return ModSounds.ARAMBOURGIANIA_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.ARAMBOURGIANIA_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.BaryonyxVariant;
|
import net.cmr.jurassicrevived.entity.client.BaryonyxVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +50,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class BaryonyxEntity extends Animal implements GeoEntity {
|
public class BaryonyxEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,38 +65,44 @@ public class BaryonyxEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public BaryonyxEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public BaryonyxEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.PISCIVORE,
|
||||||
|
IDinoData.Type.AMPHIBIOUS,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return BaryonyxEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.targetSelector.addGoal(9, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(10, new NearestAttackableTargetGoal(this, TriceratopsEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(12, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, TyrannosaurusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, IndominusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.goalSelector.addGoal(19, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_BARYONYX_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -105,10 +116,6 @@ public class BaryonyxEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 15D);
|
.add(Attributes.ATTACK_DAMAGE, 15D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -135,17 +142,17 @@ public class BaryonyxEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(BaryonyxEntity.this.isSprinting() ? RawAnimation.begin().then("anim.baryonyx.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.baryonyx.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(BaryonyxEntity.this.isSprinting() ? RawAnimation.begin().then("anim.baryonyx.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.baryonyx.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.baryonyx.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.baryonyx.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.baryonyx.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.baryonyx.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.baryonyx.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.baryonyx.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,4 +320,9 @@ public class BaryonyxEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.BARYONYX_DEATH.get();
|
return ModSounds.BARYONYX_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.BARYONYX_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+47
-28
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.BrachiosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.BrachiosaurusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
@@ -46,7 +51,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class BrachiosaurusEntity extends Animal implements GeoEntity {
|
public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -61,31 +66,44 @@ public class BrachiosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public BrachiosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public BrachiosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.SAUROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return false;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return BrachiosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(8, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(9, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(9, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(10, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(11, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(12, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(13, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_BRACHIOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -99,10 +117,6 @@ public class BrachiosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 20D);
|
.add(Attributes.ATTACK_DAMAGE, 20D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -129,17 +143,17 @@ public class BrachiosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(BrachiosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.brachiosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.brachiosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(BrachiosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.brachiosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.brachiosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.brachiosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.brachiosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.brachiosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.brachiosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.brachiosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.brachiosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,4 +326,9 @@ public class BrachiosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.BRACHIOSAURUS_DEATH.get();
|
return ModSounds.BRACHIOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.BRACHIOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+46
-36
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.CarcharodontosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CarcharodontosaurusVariant;
|
||||||
@@ -31,6 +35,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
@@ -48,7 +53,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CarcharodontosaurusEntity extends Animal implements GeoEntity {
|
public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -63,40 +68,44 @@ public class CarcharodontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CarcharodontosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CarcharodontosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CarcharodontosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(9, new FollowMobGoal(this, 1.2, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(10, new NearestAttackableTargetGoal<>(this, Monster.class, true));
|
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(12, new NearestAttackableTargetGoal(this, TriceratopsEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, SpinosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, IndominusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(20, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.goalSelector.addGoal(21, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_CARCHARODONTOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -110,10 +119,6 @@ public class CarcharodontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 20D);
|
.add(Attributes.ATTACK_DAMAGE, 20D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -140,17 +145,17 @@ public class CarcharodontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CarcharodontosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.carcharodontosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.carcharodontosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CarcharodontosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.carcharodontosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.carcharodontosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.carcharodontosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.carcharodontosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.carcharodontosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.carcharodontosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.carcharodontosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.carcharodontosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,4 +327,9 @@ public class CarcharodontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CARCHARODONTOSAURUS_DEATH.get();
|
return ModSounds.CARCHARODONTOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CARCHARODONTOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.*;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
|
||||||
import net.cmr.jurassicrevived.entity.client.CarnotaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CarnotaurusVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.CarnotaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CarnotaurusVariant;
|
||||||
import net.cmr.jurassicrevived.sound.ModSounds;
|
import net.cmr.jurassicrevived.sound.ModSounds;
|
||||||
@@ -30,6 +30,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -46,7 +47,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CarnotaurusEntity extends Animal implements GeoEntity {
|
public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -61,40 +62,44 @@ public class CarnotaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CarnotaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CarnotaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CarnotaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(9, new FollowMobGoal(this, 1.2, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(10, new NearestAttackableTargetGoal<>(this, Monster.class, true));
|
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(12, new NearestAttackableTargetGoal(this, TriceratopsEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, SpinosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, IndominusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(20, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.goalSelector.addGoal(21, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_CARNOTAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoEntityBase.DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoEntityBase.DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -108,11 +113,6 @@ public class CarnotaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 16D);
|
.add(Attributes.ATTACK_DAMAGE, 16D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
||||||
@@ -138,17 +138,17 @@ public class CarnotaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CarnotaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.carnotaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.carnotaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CarnotaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.carnotaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.carnotaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.carnotaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.carnotaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.carnotaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.carnotaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.carnotaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.carnotaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,4 +315,9 @@ public class CarnotaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CARNOTAURUS_DEATH.get();
|
return ModSounds.CARNOTAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CARNOTAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+41
-85
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.CearadactylusVariant;
|
import net.cmr.jurassicrevived.entity.client.CearadactylusVariant;
|
||||||
@@ -35,6 +39,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
@@ -54,7 +59,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CearadactylusEntity extends Animal implements GeoEntity, FlyingAnimal {
|
public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal {
|
||||||
private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -70,94 +75,44 @@ public class CearadactylusEntity extends Animal implements GeoEntity, FlyingAnim
|
|||||||
public CearadactylusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CearadactylusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
this.moveControl = new FlyingMoveControl(this, 20, true);
|
this.moveControl = new FlyingMoveControl(this, 20, true);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.PISCIVORE,
|
||||||
|
IDinoData.Type.AVIAN,
|
||||||
|
IDinoData.Group.PTEROSAUR,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CearadactylusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
|
|
||||||
// Goal 7: Wander on ground (Walk) - Only when on ground
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0) {
|
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CearadactylusEntity.this.onGround() && super.canUse();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Goal 8: Wander in air (Fly) - Handles takeoff, flying, and landing
|
|
||||||
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0, 20) {
|
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
boolean isFlying = !CearadactylusEntity.this.onGround();
|
|
||||||
// If flying, keep flying. If on ground, small chance (1/400 ticks) to take off.
|
|
||||||
return (isFlying || CearadactylusEntity.this.getRandom().nextInt(400) == 0) && super.canUse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Vec3 getPosition() {
|
public boolean isMarine() {
|
||||||
Vec3 pos = CearadactylusEntity.this.position();
|
return false;
|
||||||
RandomSource random = CearadactylusEntity.this.getRandom();
|
|
||||||
|
|
||||||
double x = pos.x + (random.nextFloat() * 2 - 1) * 32;
|
|
||||||
double z = pos.z + (random.nextFloat() * 2 - 1) * 32;
|
|
||||||
|
|
||||||
// Get ground height at the random destination (returns Y of first air block)
|
|
||||||
int groundY = CearadactylusEntity.this.level().getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, (int)x, (int)z);
|
|
||||||
double y;
|
|
||||||
|
|
||||||
if (CearadactylusEntity.this.onGround()) {
|
|
||||||
// Takeoff: Target well above ground to ensure liftoff
|
|
||||||
y = pos.y + 15 + random.nextInt(10);
|
|
||||||
} else {
|
|
||||||
// Flying: 5% chance to land, otherwise stay airborne but capped height
|
|
||||||
if (random.nextFloat() < 0.05f) {
|
|
||||||
y = groundY; // Land
|
|
||||||
} else if (pos.y > groundY + 20) {
|
|
||||||
// Too high: Force descent
|
|
||||||
y = pos.y - 5 - random.nextInt(10);
|
|
||||||
} else {
|
|
||||||
// Just wander up or down a bit
|
|
||||||
y = pos.y + (random.nextFloat() * 2 - 1) * 10;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't target below the ground (blocks)
|
@Override
|
||||||
if (y < groundY) y = groundY;
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
return new Vec3(x, y, z);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
@Override
|
||||||
this.goalSelector.addGoal(10, new FollowMobGoal(this, 0.8, (float) 20, (float) 10));
|
public Block getEggBlock() {
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
return ModBlocks.INCUBATED_CEARADACTYLUS_EGG.get();
|
||||||
target -> {
|
|
||||||
// 1. Don't eat your own species
|
|
||||||
if (target.getType() == this.getType()) return false;
|
|
||||||
|
|
||||||
// 2. Don't eat Flying Animals
|
|
||||||
if (target instanceof FlyingAnimal) return false;
|
|
||||||
|
|
||||||
// 3. SIZE CHECK: specific height and width limits
|
|
||||||
// Example: Height < 1.0 blocks AND Width < 1.0 blocks
|
|
||||||
boolean isSmallEnough = target.getBbHeight() <= 1.0F && target.getBbWidth() <= 1.0F;
|
|
||||||
|
|
||||||
return isSmallEnough;
|
|
||||||
}
|
}
|
||||||
)); this.targetSelector.addGoal(12, new NearestAttackableTargetGoal<>(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new HurtByTargetGoal(this));
|
@Override
|
||||||
this.goalSelector.addGoal(14, new RandomLookAroundGoal(this));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.goalSelector.addGoal(15, new FloatGoal(this));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -195,10 +150,6 @@ public class CearadactylusEntity extends Animal implements GeoEntity, FlyingAnim
|
|||||||
protected void checkFallDamage(double pY, boolean pOnGround, BlockState pState, BlockPos pPos) {
|
protected void checkFallDamage(double pY, boolean pOnGround, BlockState pState, BlockPos pPos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -225,7 +176,7 @@ public class CearadactylusEntity extends Animal implements GeoEntity, FlyingAnim
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (!CearadactylusEntity.this.onGround()) {
|
if (!CearadactylusEntity.this.onGround()) {
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.cearadactylus.fly", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.cearadactylus.fly", Animation.LoopType.LOOP));
|
||||||
}
|
}
|
||||||
@@ -236,10 +187,10 @@ public class CearadactylusEntity extends Animal implements GeoEntity, FlyingAnim
|
|||||||
return state.setAndContinue(RawAnimation.begin().then("anim.cearadactylus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.cearadactylus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.cearadactylus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.cearadactylus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.cearadactylus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.cearadactylus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,4 +358,9 @@ public class CearadactylusEntity extends Animal implements GeoEntity, FlyingAnim
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CEARADACTYLUS_DEATH.get();
|
return ModSounds.CEARADACTYLUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CEARADACTYLUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+46
-38
@@ -1,8 +1,8 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.*;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
|
||||||
import net.cmr.jurassicrevived.entity.client.CeratosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CeratosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.CeratosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CeratosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.sound.ModSounds;
|
import net.cmr.jurassicrevived.sound.ModSounds;
|
||||||
@@ -29,6 +29,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +46,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CeratosaurusEntity extends Animal implements GeoEntity {
|
public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,37 +61,44 @@ public class CeratosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CeratosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CeratosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CeratosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new SprintingMeleeAttackGoal(this, 1.1, false));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new BreedGoal(this, 1.0));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new FollowParentGoal(this, 1.25));
|
}
|
||||||
this.goalSelector.addGoal(10, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(11, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
public Block getEggBlock() {
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
return ModBlocks.INCUBATED_CERATOSAURUS_EGG.get();
|
||||||
target -> target.getType() != this.getType()));
|
}
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
@Override
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -104,11 +112,6 @@ public class CeratosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 16D );
|
.add(Attributes.ATTACK_DAMAGE, 16D );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
||||||
@@ -134,17 +137,17 @@ public class CeratosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CeratosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.ceratosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.ceratosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CeratosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.ceratosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.ceratosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.ceratosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.ceratosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.ceratosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.ceratosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.ceratosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.ceratosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,4 +315,9 @@ public class CeratosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CERATOSAURUS_DEATH.get();
|
return ModSounds.CERATOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CERATOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+47
-29
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.ChasmosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.ChasmosaurusVariant;
|
||||||
@@ -28,6 +32,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -44,7 +49,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class ChasmosaurusEntity extends Animal implements GeoEntity {
|
public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -59,32 +64,44 @@ public class ChasmosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public ChasmosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public ChasmosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.CERAPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
public boolean isCarnivore() {
|
||||||
@Override
|
return false;
|
||||||
public boolean canUse() {
|
|
||||||
return ChasmosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(6, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(7, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(11, new FollowMobGoal(this, 0.8, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(12, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(13, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(14, new AvoidEntityGoal<>(this, IndominusRexEntity.class, (float) 20, 0.8, 0.8));
|
|
||||||
this.goalSelector.addGoal(15, new EatBlockGoal(this));
|
|
||||||
this.goalSelector.addGoal(16, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_CHASMOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -98,10 +115,6 @@ public class ChasmosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 14D);
|
.add(Attributes.ATTACK_DAMAGE, 14D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -127,17 +140,17 @@ public class ChasmosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(ChasmosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.chasmosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.chasmosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(ChasmosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.chasmosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.chasmosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.chasmosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.chasmosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.chasmosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.chasmosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.chasmosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.chasmosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,4 +317,9 @@ public class ChasmosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CHASMOSAURUS_DEATH.get();
|
return ModSounds.CHASMOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CHASMOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+48
-35
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.ChickenosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.ChickenosaurusVariant;
|
||||||
@@ -30,6 +34,7 @@ import net.minecraft.world.item.Item;
|
|||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -46,7 +51,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class ChickenosaurusEntity extends Animal implements GeoEntity {
|
public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -61,37 +66,44 @@ public class ChickenosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public ChickenosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public ChickenosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.NEUTRAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.OMNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.DIURNAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return false;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return ChickenosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, ParasaurolophusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(10, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(11, new BreedGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowParentGoal(this, 1.25));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
return ModBlocks.INCUBATED_CHICKENOSAURUS_EGG.get();
|
||||||
this.goalSelector.addGoal(14, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
}
|
||||||
this.goalSelector.addGoal(15, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -105,10 +117,6 @@ public class ChickenosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 8D);
|
.add(Attributes.ATTACK_DAMAGE, 8D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is((Item) ModItems.MAC_N_CHEESE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -134,17 +142,17 @@ public class ChickenosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(ChickenosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.chickenosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.chickenosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(ChickenosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.chickenosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.chickenosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.chickenosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.chickenosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.chickenosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.chickenosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.chickenosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.chickenosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,4 +319,9 @@ public class ChickenosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CHICKENOSAURUS_DEATH.get();
|
return ModSounds.CHICKENOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CHICKENOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.CoelophysisVariant;
|
import net.cmr.jurassicrevived.entity.client.CoelophysisVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +50,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CoelophysisEntity extends Animal implements GeoEntity {
|
public class CoelophysisEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,37 +65,44 @@ public class CoelophysisEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CoelophysisEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CoelophysisEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CoelophysisEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, ParasaurolophusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(10, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(11, new BreedGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowParentGoal(this, 1.25));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
return ModBlocks.INCUBATED_COELOPHYSIS_EGG.get();
|
||||||
this.goalSelector.addGoal(14, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
}
|
||||||
this.goalSelector.addGoal(15, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -104,10 +116,6 @@ public class CoelophysisEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 4D);
|
.add(Attributes.ATTACK_DAMAGE, 4D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -133,17 +141,17 @@ public class CoelophysisEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CoelophysisEntity.this.isSprinting() ? RawAnimation.begin().then("anim.coelophysis.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.coelophysis.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CoelophysisEntity.this.isSprinting() ? RawAnimation.begin().then("anim.coelophysis.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.coelophysis.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.coelophysis.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.coelophysis.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.coelophysis.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.coelophysis.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.coelophysis.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.coelophysis.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,4 +318,9 @@ public class CoelophysisEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.COELOPHYSIS_DEATH.get();
|
return ModSounds.COELOPHYSIS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.COELOPHYSIS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.CoelurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CoelurusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +50,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CoelurusEntity extends Animal implements GeoEntity {
|
public class CoelurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,37 +65,44 @@ public class CoelurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CoelurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CoelurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CoelurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, ParasaurolophusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(10, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(11, new BreedGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowParentGoal(this, 1.25));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
return ModBlocks.INCUBATED_COELURUS_EGG.get();
|
||||||
this.goalSelector.addGoal(14, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
}
|
||||||
this.goalSelector.addGoal(15, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -104,10 +116,6 @@ public class CoelurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 4D);
|
.add(Attributes.ATTACK_DAMAGE, 4D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -133,17 +141,17 @@ public class CoelurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CoelurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.coelurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.coelurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CoelurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.coelurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.coelurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.coelurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.coelurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.coelurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.coelurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.coelurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.coelurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,4 +318,9 @@ public class CoelurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.COELURUS_DEATH.get();
|
return ModSounds.COELURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.COELURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+48
-23
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.CompsognathusVariant;
|
import net.cmr.jurassicrevived.entity.client.CompsognathusVariant;
|
||||||
@@ -28,6 +32,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -44,7 +49,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CompsognathusEntity extends Animal implements GeoEntity {
|
public class CompsognathusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -59,25 +64,44 @@ public class CompsognathusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CompsognathusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CompsognathusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.SCAVENGER,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return CompsognathusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new SprintingMeleeAttackGoal(this, 1.1, false));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new BreedGoal(this, 1.0));
|
}
|
||||||
this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new RandomLookAroundGoal(this));
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_COMPSOGNATHUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -91,10 +115,6 @@ public class CompsognathusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_KNOCKBACK, 0D);
|
.add(Attributes.ATTACK_KNOCKBACK, 0D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -120,17 +140,17 @@ public class CompsognathusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CompsognathusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.compsognathus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.compsognathus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CompsognathusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.compsognathus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.compsognathus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.compsognathus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.compsognathus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.compsognathus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.compsognathus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.compsognathus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.compsognathus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,4 +317,9 @@ public class CompsognathusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.COMPSOGNATHUS_DEATH.get();
|
return ModSounds.COMPSOGNATHUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.COMPSOGNATHUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+46
-39
@@ -1,8 +1,8 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.*;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
|
||||||
import net.cmr.jurassicrevived.entity.client.ConcavenatorVariant;
|
import net.cmr.jurassicrevived.entity.client.ConcavenatorVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.ConcavenatorVariant;
|
import net.cmr.jurassicrevived.entity.client.ConcavenatorVariant;
|
||||||
import net.cmr.jurassicrevived.sound.ModSounds;
|
import net.cmr.jurassicrevived.sound.ModSounds;
|
||||||
@@ -29,6 +29,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +46,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class ConcavenatorEntity extends Animal implements GeoEntity {
|
public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,38 +61,44 @@ public class ConcavenatorEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public ConcavenatorEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public ConcavenatorEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return ConcavenatorEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, IndominusRexEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new SprintingMeleeAttackGoal(this, 1.1, false));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new BreedGoal(this, 1.0));
|
}
|
||||||
this.goalSelector.addGoal(10, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
return ModBlocks.INCUBATED_CONCAVENATOR_EGG.get();
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
}
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
@Override
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(20, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(21, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -105,11 +112,6 @@ public class ConcavenatorEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_KNOCKBACK, 0D);
|
.add(Attributes.ATTACK_KNOCKBACK, 0D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
|
||||||
@@ -135,17 +137,17 @@ public class ConcavenatorEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(ConcavenatorEntity.this.isSprinting() ? RawAnimation.begin().then("anim.concavenator.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.concavenator.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(ConcavenatorEntity.this.isSprinting() ? RawAnimation.begin().then("anim.concavenator.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.concavenator.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.concavenator.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.concavenator.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.concavenator.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.concavenator.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.concavenator.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.concavenator.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,4 +314,9 @@ public class ConcavenatorEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CONCAVENATOR_DEATH.get();
|
return ModSounds.CONCAVENATOR_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CONCAVENATOR_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+48
-22
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.CorythosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CorythosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.CorythosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.CorythosaurusVariant;
|
||||||
@@ -26,6 +30,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -42,7 +47,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class CorythosaurusEntity extends Animal implements GeoEntity {
|
public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -57,24 +62,44 @@ public class CorythosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public CorythosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public CorythosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.ORNITHOPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15));
|
return false;
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
}
|
||||||
this.goalSelector.addGoal(3, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(7, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(10, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(11, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(12, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(13, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_CORYTHOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -88,10 +113,6 @@ public class CorythosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 12D);
|
.add(Attributes.ATTACK_DAMAGE, 12D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -117,17 +138,17 @@ public class CorythosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(CorythosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.corythosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.corythosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(CorythosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.corythosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.corythosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.corythosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.corythosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.corythosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.corythosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.corythosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.corythosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,4 +315,9 @@ public class CorythosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.CORYTHOSAURUS_DEATH.get();
|
return ModSounds.CORYTHOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.CORYTHOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.DeinonychusVariant;
|
import net.cmr.jurassicrevived.entity.client.DeinonychusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +50,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class DeinonychusEntity extends Animal implements GeoEntity {
|
public class DeinonychusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,38 +65,44 @@ public class DeinonychusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public DeinonychusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public DeinonychusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return DeinonychusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, IndominusRexEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new SprintingMeleeAttackGoal(this, 1.1, false));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new BreedGoal(this, 1.0));
|
}
|
||||||
this.goalSelector.addGoal(10, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
return ModBlocks.INCUBATED_DEINONYCHUS_EGG.get();
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
}
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
@Override
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(20, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(21, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -105,10 +116,6 @@ public class DeinonychusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_KNOCKBACK, 0D);
|
.add(Attributes.ATTACK_KNOCKBACK, 0D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -134,17 +141,17 @@ public class DeinonychusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(DeinonychusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.deinonychus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.deinonychus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(DeinonychusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.deinonychus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.deinonychus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.deinonychus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.deinonychus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.deinonychus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.deinonychus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.deinonychus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.deinonychus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,4 +318,9 @@ public class DeinonychusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.DEINONYCHUS_DEATH.get();
|
return ModSounds.DEINONYCHUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.DEINONYCHUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+48
-35
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.DilophosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.DilophosaurusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -45,7 +50,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class DilophosaurusEntity extends Animal implements GeoEntity {
|
public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -60,37 +65,44 @@ public class DilophosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public DilophosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public DilophosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return DilophosaurusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, ParasaurolophusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(10, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(11, new BreedGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowParentGoal(this, 1.25));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
return ModBlocks.INCUBATED_DILOPHOSAURUS_EGG.get();
|
||||||
this.goalSelector.addGoal(14, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
}
|
||||||
this.goalSelector.addGoal(15, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -104,10 +116,6 @@ public class DilophosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 5D);
|
.add(Attributes.ATTACK_DAMAGE, 5D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -134,17 +142,17 @@ public class DilophosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(DilophosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.dilophosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.dilophosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(DilophosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.dilophosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.dilophosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.dilophosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.dilophosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.dilophosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.dilophosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.dilophosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.dilophosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,4 +319,9 @@ public class DilophosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.DILOPHOSAURUS_DEATH.get();
|
return ModSounds.DILOPHOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.DILOPHOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.DimorphodonVariant;
|
import net.cmr.jurassicrevived.entity.client.DimorphodonVariant;
|
||||||
@@ -35,6 +39,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
@@ -54,7 +59,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class DimorphodonEntity extends Animal implements GeoEntity, FlyingAnimal {
|
public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal {
|
||||||
private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -70,94 +75,44 @@ public class DimorphodonEntity extends Animal implements GeoEntity, FlyingAnimal
|
|||||||
public DimorphodonEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public DimorphodonEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
this.moveControl = new FlyingMoveControl(this, 20, true);
|
this.moveControl = new FlyingMoveControl(this, 20, true);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.AVIAN,
|
||||||
|
IDinoData.Group.PTEROSAUR,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return DimorphodonEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
|
|
||||||
// Goal 7: Wander on ground (Walk) - Only when on ground
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0) {
|
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return DimorphodonEntity.this.onGround() && super.canUse();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Goal 8: Wander in air (Fly) - Handles takeoff, flying, and landing
|
|
||||||
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0, 20) {
|
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
boolean isFlying = !DimorphodonEntity.this.onGround();
|
|
||||||
// If flying, keep flying. If on ground, small chance (1/400 ticks) to take off.
|
|
||||||
return (isFlying || DimorphodonEntity.this.getRandom().nextInt(400) == 0) && super.canUse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Vec3 getPosition() {
|
public boolean isMarine() {
|
||||||
Vec3 pos = DimorphodonEntity.this.position();
|
return false;
|
||||||
RandomSource random = DimorphodonEntity.this.getRandom();
|
|
||||||
|
|
||||||
double x = pos.x + (random.nextFloat() * 2 - 1) * 32;
|
|
||||||
double z = pos.z + (random.nextFloat() * 2 - 1) * 32;
|
|
||||||
|
|
||||||
// Get ground height at the random destination (returns Y of first air block)
|
|
||||||
int groundY = DimorphodonEntity.this.level().getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, (int)x, (int)z);
|
|
||||||
double y;
|
|
||||||
|
|
||||||
if (DimorphodonEntity.this.onGround()) {
|
|
||||||
// Takeoff: Target well above ground to ensure liftoff
|
|
||||||
y = pos.y + 15 + random.nextInt(10);
|
|
||||||
} else {
|
|
||||||
// Flying: 5% chance to land, otherwise stay airborne but capped height
|
|
||||||
if (random.nextFloat() < 0.05f) {
|
|
||||||
y = groundY; // Land
|
|
||||||
} else if (pos.y > groundY + 20) {
|
|
||||||
// Too high: Force descent
|
|
||||||
y = pos.y - 5 - random.nextInt(10);
|
|
||||||
} else {
|
|
||||||
// Just wander up or down a bit
|
|
||||||
y = pos.y + (random.nextFloat() * 2 - 1) * 10;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't target below the ground (blocks)
|
@Override
|
||||||
if (y < groundY) y = groundY;
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
return new Vec3(x, y, z);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
@Override
|
||||||
this.goalSelector.addGoal(10, new FollowMobGoal(this, 0.8, (float) 20, (float) 10));
|
public Block getEggBlock() {
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
return ModBlocks.INCUBATED_DIMORPHODON_EGG.get();
|
||||||
target -> {
|
|
||||||
// 1. Don't eat your own species
|
|
||||||
if (target.getType() == this.getType()) return false;
|
|
||||||
|
|
||||||
// 2. Don't eat Flying Animals
|
|
||||||
if (target instanceof FlyingAnimal) return false;
|
|
||||||
|
|
||||||
// 3. SIZE CHECK: specific height and width limits
|
|
||||||
// Example: Height < 1.0 blocks AND Width < 1.0 blocks
|
|
||||||
boolean isSmallEnough = target.getBbHeight() <= 1.0F && target.getBbWidth() <= 1.0F;
|
|
||||||
|
|
||||||
return isSmallEnough;
|
|
||||||
}
|
}
|
||||||
)); this.targetSelector.addGoal(12, new NearestAttackableTargetGoal<>(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new HurtByTargetGoal(this));
|
@Override
|
||||||
this.goalSelector.addGoal(14, new RandomLookAroundGoal(this));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.goalSelector.addGoal(15, new FloatGoal(this));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -195,10 +150,6 @@ public class DimorphodonEntity extends Animal implements GeoEntity, FlyingAnimal
|
|||||||
protected void checkFallDamage(double pY, boolean pOnGround, BlockState pState, BlockPos pPos) {
|
protected void checkFallDamage(double pY, boolean pOnGround, BlockState pState, BlockPos pPos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -225,7 +176,7 @@ public class DimorphodonEntity extends Animal implements GeoEntity, FlyingAnimal
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (!DimorphodonEntity.this.onGround()) {
|
if (!DimorphodonEntity.this.onGround()) {
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.dimorphodon.fly", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.dimorphodon.fly", Animation.LoopType.LOOP));
|
||||||
}
|
}
|
||||||
@@ -236,10 +187,10 @@ public class DimorphodonEntity extends Animal implements GeoEntity, FlyingAnimal
|
|||||||
return state.setAndContinue(RawAnimation.begin().then("anim.dimorphodon.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.dimorphodon.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.dimorphodon.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.dimorphodon.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.dimorphodon.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.dimorphodon.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,4 +358,9 @@ public class DimorphodonEntity extends Animal implements GeoEntity, FlyingAnimal
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.DIMORPHODON_DEATH.get();
|
return ModSounds.DIMORPHODON_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.DIMORPHODON_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.DiplodocusVariant;
|
import net.cmr.jurassicrevived.entity.client.DiplodocusVariant;
|
||||||
@@ -29,6 +33,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
@@ -46,7 +51,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class DiplodocusEntity extends Animal implements GeoEntity {
|
public class DiplodocusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -61,31 +66,44 @@ public class DiplodocusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public DiplodocusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public DiplodocusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.SAUROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return false;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return DiplodocusEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(8, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(9, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(9, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(10, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(11, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(12, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(13, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_DIPLODOCUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -99,10 +117,6 @@ public class DiplodocusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 15D);
|
.add(Attributes.ATTACK_DAMAGE, 15D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -129,17 +143,17 @@ public class DiplodocusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(DiplodocusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.diplodocus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.diplodocus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(DiplodocusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.diplodocus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.diplodocus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.diplodocus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.diplodocus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.diplodocus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.diplodocus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.diplodocus.call", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.diplodocus.call", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,4 +325,9 @@ public class DiplodocusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.DIPLODOCUS_DEATH.get();
|
return ModSounds.DIPLODOCUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.DIPLODOCUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+46
-36
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.DistortusRexVariant;
|
import net.cmr.jurassicrevived.entity.client.DistortusRexVariant;
|
||||||
@@ -31,6 +35,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
@@ -48,7 +53,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class DistortusRexEntity extends Animal implements GeoEntity {
|
public class DistortusRexEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -63,40 +68,44 @@ public class DistortusRexEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public DistortusRexEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public DistortusRexEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.CARNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return true;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return DistortusRexEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(4, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(5, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(9, new FollowMobGoal(this, 1.2, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(10, new NearestAttackableTargetGoal<>(this, Monster.class, true));
|
|
||||||
this.targetSelector.addGoal(11, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
|
||||||
target -> target.getType() != this.getType()));
|
|
||||||
this.targetSelector.addGoal(12, new NearestAttackableTargetGoal(this, TriceratopsEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(13, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(14, new NearestAttackableTargetGoal(this, DilophosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(15, new NearestAttackableTargetGoal(this, CeratosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal(this, ParasaurolophusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, VelociraptorEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, SpinosaurusEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, IndominusRexEntity.class, false, false));
|
|
||||||
this.targetSelector.addGoal(20, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.goalSelector.addGoal(21, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_DISTORTUS_REX_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -110,10 +119,6 @@ public class DistortusRexEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 35D);
|
.add(Attributes.ATTACK_DAMAGE, 35D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.BEEF);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -140,17 +145,17 @@ public class DistortusRexEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(DistortusRexEntity.this.isSprinting() ? RawAnimation.begin().then("anim.distortus_rex.walk", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.distortus_rex.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(DistortusRexEntity.this.isSprinting() ? RawAnimation.begin().then("anim.distortus_rex.walk", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.distortus_rex.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.distortus_rex.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.distortus_rex.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.distortus_rex.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.distortus_rex.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.distortus_rex.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.distortus_rex.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,4 +327,9 @@ public class DistortusRexEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.DISTORTUS_REX_DEATH.get();
|
return ModSounds.DISTORTUS_REX_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.DISTORTUS_REX_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.DryosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.DryosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.DryosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.DryosaurusVariant;
|
||||||
@@ -26,6 +30,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -42,7 +47,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class DryosaurusEntity extends Animal implements GeoEntity {
|
public class DryosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -57,26 +62,44 @@ public class DryosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public DryosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public DryosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.ORNITHOPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15));
|
return false;
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
}
|
||||||
this.goalSelector.addGoal(3, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(7, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(10, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(11, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(12, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(13, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(14, new AvoidEntityGoal<>(this, IndominusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(15, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_DRYOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -90,10 +113,6 @@ public class DryosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 0D);
|
.add(Attributes.ATTACK_DAMAGE, 0D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -119,17 +138,17 @@ public class DryosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(DryosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.dryosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.dryosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(DryosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.dryosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.dryosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.dryosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.dryosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.dryosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.dryosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.dryosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.dryosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,4 +315,9 @@ public class DryosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.DRYOSAURUS_DEATH.get();
|
return ModSounds.DRYOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.DRYOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+48
-22
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.EdmontosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.EdmontosaurusVariant;
|
||||||
import net.cmr.jurassicrevived.entity.client.EdmontosaurusVariant;
|
import net.cmr.jurassicrevived.entity.client.EdmontosaurusVariant;
|
||||||
@@ -26,6 +30,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -42,7 +47,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class EdmontosaurusEntity extends Animal implements GeoEntity {
|
public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -57,24 +62,44 @@ public class EdmontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public EdmontosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public EdmontosaurusEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.TERRITORIAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.HERBIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.ORNITHOPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.CATHEMERAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15));
|
return false;
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
}
|
||||||
this.goalSelector.addGoal(3, new BreedGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25));
|
|
||||||
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
|
||||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
||||||
this.goalSelector.addGoal(7, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, DilophosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(10, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(11, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(12, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
|
||||||
this.goalSelector.addGoal(13, new RandomLookAroundGoal(this));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMarine() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmphibious() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getEggBlock() {
|
||||||
|
return ModBlocks.INCUBATED_EDMONTOSAURUS_EGG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DinoAIConfig getAIConfig() {
|
||||||
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -88,10 +113,6 @@ public class EdmontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 12D);
|
.add(Attributes.ATTACK_DAMAGE, 12D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is(Items.KELP);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -117,17 +138,17 @@ public class EdmontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(EdmontosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.edmontosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.edmontosaurus.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(EdmontosaurusEntity.this.isSprinting() ? RawAnimation.begin().then("anim.edmontosaurus.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.edmontosaurus.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.edmontosaurus.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.edmontosaurus.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.edmontosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.edmontosaurus.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.edmontosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.edmontosaurus.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,4 +315,9 @@ public class EdmontosaurusEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.EDMONTOSAURUS_DEATH.get();
|
return ModSounds.EDMONTOSAURUS_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.EDMONTOSAURUS_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
package net.cmr.jurassicrevived.entity.custom;
|
package net.cmr.jurassicrevived.entity.custom;
|
||||||
|
|
||||||
|
import net.cmr.jurassicrevived.block.ModBlocks;
|
||||||
import net.cmr.jurassicrevived.entity.ModEntities;
|
import net.cmr.jurassicrevived.entity.ModEntities;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoData;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
|
||||||
|
import net.cmr.jurassicrevived.entity.ai.IDinoData;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal;
|
||||||
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal;
|
||||||
import net.cmr.jurassicrevived.entity.client.FDuckVariant;
|
import net.cmr.jurassicrevived.entity.client.FDuckVariant;
|
||||||
@@ -30,6 +34,7 @@ import net.minecraft.world.item.Item;
|
|||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
/*? if <=1.20.1 {*/
|
/*? if <=1.20.1 {*/
|
||||||
@@ -46,7 +51,7 @@ import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceC
|
|||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
*//*?}*/
|
*//*?}*/
|
||||||
|
|
||||||
public class FDuckEntity extends Animal implements GeoEntity {
|
public class FDuckEntity extends DinoEntityBase implements GeoEntity {
|
||||||
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
|
||||||
|
|
||||||
private static final EntityDataAccessor<Integer> VARIANT =
|
private static final EntityDataAccessor<Integer> VARIANT =
|
||||||
@@ -61,37 +66,44 @@ public class FDuckEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
public FDuckEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
public FDuckEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
|
||||||
super(pEntityType, pLevel);
|
super(pEntityType, pLevel);
|
||||||
|
|
||||||
|
this.dinoData = new DinoData(
|
||||||
|
getAIConfig().maxHunger(),
|
||||||
|
getAIConfig().maxThirst(),
|
||||||
|
IDinoData.Mood.NEUTRAL,
|
||||||
|
IDinoData.Aggression.NEUTRAL,
|
||||||
|
0.75f,
|
||||||
|
IDinoData.DietaryClassification.OMNIVORE,
|
||||||
|
IDinoData.Type.TERRESTRIAL,
|
||||||
|
IDinoData.Group.THEROPOD,
|
||||||
|
IDinoData.BirthType.EGG_LAYING,
|
||||||
|
IDinoData.ActivityPattern.DIURNAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
public boolean isCarnivore() {
|
||||||
this.goalSelector.addGoal(1, new SprintingPanicGoal(this, 1.15) {
|
return false;
|
||||||
@Override
|
|
||||||
public boolean canUse() {
|
|
||||||
return FDuckEntity.this.isBaby() && super.canUse();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
|
@Override
|
||||||
this.goalSelector.addGoal(2, new FloatGoal(this));
|
public boolean isMarine() {
|
||||||
this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, SpinosaurusEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, TyrannosaurusRexEntity.class, (float) 20, 1.2, 1.2));
|
}
|
||||||
this.goalSelector.addGoal(5, new AvoidEntityGoal<>(this, VelociraptorEntity.class, (float) 20, 1, 1));
|
|
||||||
this.goalSelector.addGoal(6, new AvoidEntityGoal<>(this, ParasaurolophusEntity.class, (float) 20, 1, 1));
|
@Override
|
||||||
this.goalSelector.addGoal(7, new AvoidEntityGoal<>(this, CeratosaurusEntity.class, (float) 20, 1, 1));
|
public boolean isAmphibious() {
|
||||||
this.goalSelector.addGoal(8, new AvoidEntityGoal<>(this, TriceratopsEntity.class, (float) 20, 1, 1));
|
return false;
|
||||||
this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, BrachiosaurusEntity.class, (float) 20, 1, 1));
|
}
|
||||||
this.goalSelector.addGoal(10, new SprintingMeleeAttackGoal(this, 1.1, false));
|
|
||||||
this.goalSelector.addGoal(11, new BreedGoal(this, 1.0));
|
@Override
|
||||||
this.goalSelector.addGoal(12, new FollowParentGoal(this, 1.25));
|
public Block getEggBlock() {
|
||||||
this.goalSelector.addGoal(13, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
return ModBlocks.INCUBATED_FDUCK_EGG.get();
|
||||||
this.goalSelector.addGoal(14, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
}
|
||||||
this.goalSelector.addGoal(15, new FollowMobGoal(this, 1, (float) 20, (float) 10));
|
|
||||||
this.targetSelector.addGoal(16, new NearestAttackableTargetGoal<>(this, Animal.class, 10, false, false,
|
@Override
|
||||||
target -> target.getType() != this.getType()));
|
public DinoAIConfig getAIConfig() {
|
||||||
this.targetSelector.addGoal(17, new NearestAttackableTargetGoal(this, GallimimusEntity.class, false, false));
|
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
|
||||||
this.targetSelector.addGoal(18, new NearestAttackableTargetGoal(this, Player.class, false, false));
|
|
||||||
this.targetSelector.addGoal(19, new NearestAttackableTargetGoal(this, CompsognathusEntity.class, false, false));
|
|
||||||
this.goalSelector.addGoal(20, new RandomLookAroundGoal(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -105,10 +117,6 @@ public class FDuckEntity extends Animal implements GeoEntity {
|
|||||||
.add(Attributes.ATTACK_DAMAGE, 8D);
|
.add(Attributes.ATTACK_DAMAGE, 8D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFood(ItemStack pStack) {
|
|
||||||
return pStack.is((Item) ModItems.MAC_N_CHEESE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -134,17 +142,17 @@ public class FDuckEntity extends Animal implements GeoEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||||
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", state -> {
|
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
|
||||||
if (state.isMoving())
|
if (state.isMoving())
|
||||||
return state.setAndContinue(FDuckEntity.this.isSprinting() ? RawAnimation.begin().then("anim.fduck.walk", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.fduck.walk", Animation.LoopType.LOOP));
|
return state.setAndContinue(FDuckEntity.this.isSprinting() ? RawAnimation.begin().then("anim.fduck.walk", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.fduck.walk", Animation.LoopType.LOOP));
|
||||||
|
|
||||||
return state.setAndContinue(RawAnimation.begin().then("anim.fduck.idle", Animation.LoopType.LOOP));
|
return state.setAndContinue(RawAnimation.begin().then("anim.fduck.idle", Animation.LoopType.LOOP));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "attackController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("attack", RawAnimation.begin().then("anim.fduck.attack", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("attack", RawAnimation.begin().then("anim.fduck.attack", Animation.LoopType.PLAY_ONCE)));
|
||||||
|
|
||||||
controllers.add(new AnimationController<>(this, "mouthController", state -> PlayState.STOP)
|
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
|
||||||
.triggerableAnim("mouth", RawAnimation.begin().then("anim.fduck.mouth", Animation.LoopType.PLAY_ONCE)));
|
.triggerableAnim("mouth", RawAnimation.begin().then("anim.fduck.mouth", Animation.LoopType.PLAY_ONCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,4 +319,9 @@ public class FDuckEntity extends Animal implements GeoEntity {
|
|||||||
protected @Nullable SoundEvent getDeathSound() {
|
protected @Nullable SoundEvent getDeathSound() {
|
||||||
return ModSounds.FDUCK_DEATH.get();
|
return ModSounds.FDUCK_DEATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @Nullable SoundEvent getAmbientSound() {
|
||||||
|
return ModSounds.FDUCK_CALL.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user