Skip to content

Commit

Permalink
Handle entity spawn placements via the deferred register, and make ba…
Browse files Browse the repository at this point in the history
…by mobs copy all entity properties
  • Loading branch information
pupnewfster committed May 4, 2024
1 parent c4442fc commit dea06c3
Show file tree
Hide file tree
Showing 11 changed files with 202 additions and 307 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package mekanism.additions.common;

import java.util.function.Supplier;
import mekanism.additions.client.AdditionsClient;
import mekanism.additions.common.block.BlockObsidianTNT;
import mekanism.additions.common.config.MekanismAdditionsConfig;
import mekanism.additions.common.entity.baby.EntityBabyStray;
import mekanism.additions.common.registries.AdditionsBiomeModifierSerializers;
import mekanism.additions.common.registries.AdditionsBlocks;
import mekanism.additions.common.registries.AdditionsCreativeTabs;
Expand All @@ -22,21 +20,16 @@
import net.minecraft.core.dispenser.BlockSource;
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.SpawnPlacementTypes;
import net.minecraft.world.entity.monster.Monster;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.levelgen.Heightmap;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.config.ModConfig;
import net.neoforged.fml.event.config.ModConfigEvent;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent;
import net.neoforged.neoforge.event.server.ServerStartingEvent;
import net.neoforged.neoforge.event.server.ServerStoppingEvent;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -66,7 +59,6 @@ public MekanismAdditions(ModContainer modContainer, IEventBus modEventBus) {

modEventBus.addListener(this::commonSetup);
modEventBus.addListener(this::onConfigLoad);
modEventBus.addListener(this::spawnPlacements);
AdditionsDataComponents.DATA_COMPONENTS.register(modEventBus);
AdditionsItems.ITEMS.register(modEventBus);
AdditionsBlocks.BLOCKS.register(modEventBus);
Expand Down Expand Up @@ -125,25 +117,6 @@ protected ItemStack execute(@NotNull BlockSource source, @NotNull ItemStack stac
Mekanism.logger.info("Loaded 'Mekanism: Additions' module.");
}

//TODO - 1.20.5: Do we want to move the spawn placements to being registered as part of mek entity type creation like we do for attributes
private void spawnPlacements(SpawnPlacementRegisterEvent event) {
//Setup some stuff related to entities
//Register spawn controls for the baby entities based on the vanilla spawn controls
registerSpawnControls(event, AdditionsEntityTypes.BABY_CREEPER, AdditionsEntityTypes.BABY_ENDERMAN, AdditionsEntityTypes.BABY_SKELETON,
AdditionsEntityTypes.BABY_WITHER_SKELETON);
//Slightly different restrictions for the baby stray, as strays have a slightly different spawn restriction
event.register(AdditionsEntityTypes.BABY_STRAY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityBabyStray::spawnRestrictions,
SpawnPlacementRegisterEvent.Operation.AND);
}

@SafeVarargs
private static void registerSpawnControls(SpawnPlacementRegisterEvent event, Supplier<? extends EntityType<? extends Monster>>... entityTypeROs) {
for (Supplier<? extends EntityType<? extends Monster>> entityTypeRO : entityTypeROs) {
event.register(entityTypeRO.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules,
SpawnPlacementRegisterEvent.Operation.AND);
}
}

private void serverStarting(ServerStartingEvent event) {
if (MekanismAdditionsConfig.additions.voiceServerEnabled.get()) {
if (voiceManager == null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,65 +1,29 @@
package mekanism.additions.common.entity.baby;

import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.entity.EntityDimensions;
import mekanism.additions.common.registries.AdditionsEntityTypes;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.monster.Creeper;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;

public class EntityBabyCreeper extends Creeper implements IBabyEntity {

private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabyCreeper.class, EntityDataSerializers.BOOLEAN);
private static final EntityDimensions BABY_DIMENSIONS = EntityType.CREEPER.getDimensions().scale(0.5F).withEyeHeight(0.88F);
public class EntityBabyCreeper extends Creeper {

public EntityBabyCreeper(EntityType<EntityBabyCreeper> type, Level world) {
super(type, world);
setBaby(true);
}

@Override
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
super.defineSynchedData(builder);
builder.define(IS_CHILD, true);
AdditionsEntityTypes.setupBabyModifiers(this);
}

@Override
public boolean isBaby() {
return getEntityData().get(IS_CHILD);
}

@Override
public void setBaby(boolean child) {
setChild(IS_CHILD, child);
}

@Override
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
if (IS_CHILD.equals(key)) {
refreshDimensions();
}
super.onSyncedDataUpdated(key);
return true;
}

@Override
public int getExperienceReward() {
if (isBaby()) {
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}
return super.getExperienceReward();
}

@NotNull
@Override
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,70 +1,28 @@
package mekanism.additions.common.entity.baby;

import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.entity.EntityDimensions;
import mekanism.additions.common.registries.AdditionsEntityTypes;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.monster.EnderMan;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;

public class EntityBabyEnderman extends EnderMan implements IBabyEntity {

private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabyEnderman.class, EntityDataSerializers.BOOLEAN);
private static final EntityDimensions BABY_DIMENSIONS = EntityType.ENDERMAN.getDimensions().scale(0.5F).withEyeHeight(1.3F);
public class EntityBabyEnderman extends EnderMan {

public EntityBabyEnderman(EntityType<EntityBabyEnderman> type, Level world) {
super(type, world);
setBaby(true);
}

@Override
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
super.defineSynchedData(builder);
builder.define(IS_CHILD, true);
AdditionsEntityTypes.setupBabyModifiers(this);
}

@Override
public boolean isBaby() {
return getEntityData().get(IS_CHILD);
}

@Override
public void setBaby(boolean child) {
setChild(IS_CHILD, child);
}

@Override
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
if (IS_CHILD.equals(key)) {
refreshDimensions();
}
super.onSyncedDataUpdated(key);
return true;
}

@Override
public int getExperienceReward() {
if (isBaby()) {
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}
return super.getExperienceReward();
}

//TODO - 1.20.5: Figure out what controls this now
/*@Override
public float ridingOffset(@NotNull Entity other) {
return -1.3F;
}*/

@NotNull
@Override
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}
}
Original file line number Diff line number Diff line change
@@ -1,67 +1,30 @@
package mekanism.additions.common.entity.baby;

import mekanism.additions.common.registries.AdditionsEntityTypes;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.monster.Skeleton;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.LevelEvent;
import org.jetbrains.annotations.NotNull;

public class EntityBabySkeleton extends Skeleton implements IBabyEntity {

private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabySkeleton.class, EntityDataSerializers.BOOLEAN);
private static final EntityDimensions BABY_DIMENSIONS = EntityType.SKELETON.getDimensions().scale(0.5F).withEyeHeight(0.93F);
public class EntityBabySkeleton extends Skeleton {

public EntityBabySkeleton(EntityType<EntityBabySkeleton> type, Level world) {
super(type, world);
setBaby(true);
}

@Override
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
super.defineSynchedData(builder);
builder.define(IS_CHILD, true);
AdditionsEntityTypes.setupBabyModifiers(this);
}

@Override
public boolean isBaby() {
return getEntityData().get(IS_CHILD);
}

@Override
public void setBaby(boolean child) {
setChild(IS_CHILD, child);
}

@Override
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
if (IS_CHILD.equals(key)) {
refreshDimensions();
}
super.onSyncedDataUpdated(key);
return true;
}

@Override
public int getExperienceReward() {
if (isBaby()) {
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}
return super.getExperienceReward();
}

@NotNull
@Override
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
package mekanism.additions.common.entity.baby;

import mekanism.additions.common.registries.AdditionsEntityTypes;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.monster.Stray;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.block.Blocks;
import org.jetbrains.annotations.NotNull;

public class EntityBabyStray extends Stray implements IBabyEntity {

private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabyStray.class, EntityDataSerializers.BOOLEAN);
private static final EntityDimensions BABY_DIMENSIONS = EntityType.STRAY.getDimensions().scale(0.5F).withEyeHeight(0.93F);
public class EntityBabyStray extends Stray {

//Copy of stray spawn restrictions
public static boolean spawnRestrictions(EntityType<EntityBabyStray> type, ServerLevelAccessor world, MobSpawnType reason, BlockPos pos, RandomSource random) {
Expand All @@ -39,48 +31,20 @@ public static boolean spawnRestrictions(EntityType<EntityBabyStray> type, Server

public EntityBabyStray(EntityType<EntityBabyStray> type, Level world) {
super(type, world);
setBaby(true);
}

@Override
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
super.defineSynchedData(builder);
builder.define(IS_CHILD, true);
AdditionsEntityTypes.setupBabyModifiers(this);
}

@Override
public boolean isBaby() {
return getEntityData().get(IS_CHILD);
}

@Override
public void setBaby(boolean child) {
setChild(IS_CHILD, child);
}

@Override
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
if (IS_CHILD.equals(key)) {
refreshDimensions();
}
super.onSyncedDataUpdated(key);
return true;
}

@Override
public int getExperienceReward() {
if (isBaby()) {
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}
return super.getExperienceReward();
}

@NotNull
@Override
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
int oldXp = xpReward;
xpReward = (int) (xpReward * 2.5F);
int reward = super.getExperienceReward();
xpReward = oldXp;
return reward;
}
}
Loading

0 comments on commit dea06c3

Please sign in to comment.