Skip to content

Commit dea06c3

Browse files
committed
Handle entity spawn placements via the deferred register, and make baby mobs copy all entity properties
1 parent c4442fc commit dea06c3

File tree

11 files changed

+202
-307
lines changed

11 files changed

+202
-307
lines changed

src/additions/java/mekanism/additions/common/MekanismAdditions.java

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package mekanism.additions.common;
22

3-
import java.util.function.Supplier;
43
import mekanism.additions.client.AdditionsClient;
54
import mekanism.additions.common.block.BlockObsidianTNT;
65
import mekanism.additions.common.config.MekanismAdditionsConfig;
7-
import mekanism.additions.common.entity.baby.EntityBabyStray;
86
import mekanism.additions.common.registries.AdditionsBiomeModifierSerializers;
97
import mekanism.additions.common.registries.AdditionsBlocks;
108
import mekanism.additions.common.registries.AdditionsCreativeTabs;
@@ -22,21 +20,16 @@
2220
import net.minecraft.core.dispenser.BlockSource;
2321
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
2422
import net.minecraft.resources.ResourceLocation;
25-
import net.minecraft.world.entity.EntityType;
26-
import net.minecraft.world.entity.SpawnPlacementTypes;
27-
import net.minecraft.world.entity.monster.Monster;
2823
import net.minecraft.world.item.ItemStack;
2924
import net.minecraft.world.level.block.DispenserBlock;
3025
import net.minecraft.world.level.gameevent.GameEvent;
31-
import net.minecraft.world.level.levelgen.Heightmap;
3226
import net.neoforged.bus.api.IEventBus;
3327
import net.neoforged.fml.ModContainer;
3428
import net.neoforged.fml.common.Mod;
3529
import net.neoforged.fml.config.ModConfig;
3630
import net.neoforged.fml.event.config.ModConfigEvent;
3731
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
3832
import net.neoforged.neoforge.common.NeoForge;
39-
import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent;
4033
import net.neoforged.neoforge.event.server.ServerStartingEvent;
4134
import net.neoforged.neoforge.event.server.ServerStoppingEvent;
4235
import org.jetbrains.annotations.NotNull;
@@ -66,7 +59,6 @@ public MekanismAdditions(ModContainer modContainer, IEventBus modEventBus) {
6659

6760
modEventBus.addListener(this::commonSetup);
6861
modEventBus.addListener(this::onConfigLoad);
69-
modEventBus.addListener(this::spawnPlacements);
7062
AdditionsDataComponents.DATA_COMPONENTS.register(modEventBus);
7163
AdditionsItems.ITEMS.register(modEventBus);
7264
AdditionsBlocks.BLOCKS.register(modEventBus);
@@ -125,25 +117,6 @@ protected ItemStack execute(@NotNull BlockSource source, @NotNull ItemStack stac
125117
Mekanism.logger.info("Loaded 'Mekanism: Additions' module.");
126118
}
127119

128-
//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
129-
private void spawnPlacements(SpawnPlacementRegisterEvent event) {
130-
//Setup some stuff related to entities
131-
//Register spawn controls for the baby entities based on the vanilla spawn controls
132-
registerSpawnControls(event, AdditionsEntityTypes.BABY_CREEPER, AdditionsEntityTypes.BABY_ENDERMAN, AdditionsEntityTypes.BABY_SKELETON,
133-
AdditionsEntityTypes.BABY_WITHER_SKELETON);
134-
//Slightly different restrictions for the baby stray, as strays have a slightly different spawn restriction
135-
event.register(AdditionsEntityTypes.BABY_STRAY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EntityBabyStray::spawnRestrictions,
136-
SpawnPlacementRegisterEvent.Operation.AND);
137-
}
138-
139-
@SafeVarargs
140-
private static void registerSpawnControls(SpawnPlacementRegisterEvent event, Supplier<? extends EntityType<? extends Monster>>... entityTypeROs) {
141-
for (Supplier<? extends EntityType<? extends Monster>> entityTypeRO : entityTypeROs) {
142-
event.register(entityTypeRO.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules,
143-
SpawnPlacementRegisterEvent.Operation.AND);
144-
}
145-
}
146-
147120
private void serverStarting(ServerStartingEvent event) {
148121
if (MekanismAdditionsConfig.additions.voiceServerEnabled.get()) {
149122
if (voiceManager == null) {

src/additions/java/mekanism/additions/common/entity/baby/EntityBabyCreeper.java

Lines changed: 9 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,29 @@
11
package mekanism.additions.common.entity.baby;
22

3-
import net.minecraft.network.syncher.EntityDataAccessor;
4-
import net.minecraft.network.syncher.EntityDataSerializers;
5-
import net.minecraft.network.syncher.SynchedEntityData;
6-
import net.minecraft.world.entity.EntityDimensions;
3+
import mekanism.additions.common.registries.AdditionsEntityTypes;
74
import net.minecraft.world.entity.EntityType;
8-
import net.minecraft.world.entity.Pose;
95
import net.minecraft.world.entity.monster.Creeper;
106
import net.minecraft.world.level.Level;
11-
import org.jetbrains.annotations.NotNull;
127

13-
public class EntityBabyCreeper extends Creeper implements IBabyEntity {
14-
15-
private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabyCreeper.class, EntityDataSerializers.BOOLEAN);
16-
private static final EntityDimensions BABY_DIMENSIONS = EntityType.CREEPER.getDimensions().scale(0.5F).withEyeHeight(0.88F);
8+
public class EntityBabyCreeper extends Creeper {
179

1810
public EntityBabyCreeper(EntityType<EntityBabyCreeper> type, Level world) {
1911
super(type, world);
20-
setBaby(true);
21-
}
22-
23-
@Override
24-
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
25-
super.defineSynchedData(builder);
26-
builder.define(IS_CHILD, true);
12+
AdditionsEntityTypes.setupBabyModifiers(this);
2713
}
2814

2915
@Override
3016
public boolean isBaby() {
31-
return getEntityData().get(IS_CHILD);
32-
}
33-
34-
@Override
35-
public void setBaby(boolean child) {
36-
setChild(IS_CHILD, child);
37-
}
38-
39-
@Override
40-
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
41-
if (IS_CHILD.equals(key)) {
42-
refreshDimensions();
43-
}
44-
super.onSyncedDataUpdated(key);
17+
return true;
4518
}
4619

4720
@Override
4821
public int getExperienceReward() {
49-
if (isBaby()) {
50-
int oldXp = xpReward;
51-
xpReward = (int) (xpReward * 2.5F);
52-
int reward = super.getExperienceReward();
53-
xpReward = oldXp;
54-
return reward;
55-
}
56-
return super.getExperienceReward();
57-
}
58-
59-
@NotNull
60-
@Override
61-
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
62-
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
22+
int oldXp = xpReward;
23+
xpReward = (int) (xpReward * 2.5F);
24+
int reward = super.getExperienceReward();
25+
xpReward = oldXp;
26+
return reward;
6327
}
6428

6529
/**
Lines changed: 9 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,28 @@
11
package mekanism.additions.common.entity.baby;
22

3-
import net.minecraft.network.syncher.EntityDataAccessor;
4-
import net.minecraft.network.syncher.EntityDataSerializers;
5-
import net.minecraft.network.syncher.SynchedEntityData;
6-
import net.minecraft.world.entity.EntityDimensions;
3+
import mekanism.additions.common.registries.AdditionsEntityTypes;
74
import net.minecraft.world.entity.EntityType;
8-
import net.minecraft.world.entity.Pose;
95
import net.minecraft.world.entity.monster.EnderMan;
106
import net.minecraft.world.level.Level;
11-
import org.jetbrains.annotations.NotNull;
127

13-
public class EntityBabyEnderman extends EnderMan implements IBabyEntity {
14-
15-
private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabyEnderman.class, EntityDataSerializers.BOOLEAN);
16-
private static final EntityDimensions BABY_DIMENSIONS = EntityType.ENDERMAN.getDimensions().scale(0.5F).withEyeHeight(1.3F);
8+
public class EntityBabyEnderman extends EnderMan {
179

1810
public EntityBabyEnderman(EntityType<EntityBabyEnderman> type, Level world) {
1911
super(type, world);
20-
setBaby(true);
21-
}
22-
23-
@Override
24-
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
25-
super.defineSynchedData(builder);
26-
builder.define(IS_CHILD, true);
12+
AdditionsEntityTypes.setupBabyModifiers(this);
2713
}
2814

2915
@Override
3016
public boolean isBaby() {
31-
return getEntityData().get(IS_CHILD);
32-
}
33-
34-
@Override
35-
public void setBaby(boolean child) {
36-
setChild(IS_CHILD, child);
37-
}
38-
39-
@Override
40-
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
41-
if (IS_CHILD.equals(key)) {
42-
refreshDimensions();
43-
}
44-
super.onSyncedDataUpdated(key);
17+
return true;
4518
}
4619

4720
@Override
4821
public int getExperienceReward() {
49-
if (isBaby()) {
50-
int oldXp = xpReward;
51-
xpReward = (int) (xpReward * 2.5F);
52-
int reward = super.getExperienceReward();
53-
xpReward = oldXp;
54-
return reward;
55-
}
56-
return super.getExperienceReward();
57-
}
58-
59-
//TODO - 1.20.5: Figure out what controls this now
60-
/*@Override
61-
public float ridingOffset(@NotNull Entity other) {
62-
return -1.3F;
63-
}*/
64-
65-
@NotNull
66-
@Override
67-
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
68-
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
22+
int oldXp = xpReward;
23+
xpReward = (int) (xpReward * 2.5F);
24+
int reward = super.getExperienceReward();
25+
xpReward = oldXp;
26+
return reward;
6927
}
7028
}

src/additions/java/mekanism/additions/common/entity/baby/EntityBabySkeleton.java

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,30 @@
11
package mekanism.additions.common.entity.baby;
22

33
import mekanism.additions.common.registries.AdditionsEntityTypes;
4-
import net.minecraft.network.syncher.EntityDataAccessor;
5-
import net.minecraft.network.syncher.EntityDataSerializers;
6-
import net.minecraft.network.syncher.SynchedEntityData;
7-
import net.minecraft.world.entity.EntityDimensions;
84
import net.minecraft.world.entity.EntityType;
9-
import net.minecraft.world.entity.Pose;
105
import net.minecraft.world.entity.monster.Skeleton;
116
import net.minecraft.world.level.Level;
127
import net.minecraft.world.level.block.LevelEvent;
13-
import org.jetbrains.annotations.NotNull;
148

15-
public class EntityBabySkeleton extends Skeleton implements IBabyEntity {
16-
17-
private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabySkeleton.class, EntityDataSerializers.BOOLEAN);
18-
private static final EntityDimensions BABY_DIMENSIONS = EntityType.SKELETON.getDimensions().scale(0.5F).withEyeHeight(0.93F);
9+
public class EntityBabySkeleton extends Skeleton {
1910

2011
public EntityBabySkeleton(EntityType<EntityBabySkeleton> type, Level world) {
2112
super(type, world);
22-
setBaby(true);
23-
}
24-
25-
@Override
26-
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
27-
super.defineSynchedData(builder);
28-
builder.define(IS_CHILD, true);
13+
AdditionsEntityTypes.setupBabyModifiers(this);
2914
}
3015

3116
@Override
3217
public boolean isBaby() {
33-
return getEntityData().get(IS_CHILD);
34-
}
35-
36-
@Override
37-
public void setBaby(boolean child) {
38-
setChild(IS_CHILD, child);
39-
}
40-
41-
@Override
42-
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
43-
if (IS_CHILD.equals(key)) {
44-
refreshDimensions();
45-
}
46-
super.onSyncedDataUpdated(key);
18+
return true;
4719
}
4820

4921
@Override
5022
public int getExperienceReward() {
51-
if (isBaby()) {
52-
int oldXp = xpReward;
53-
xpReward = (int) (xpReward * 2.5F);
54-
int reward = super.getExperienceReward();
55-
xpReward = oldXp;
56-
return reward;
57-
}
58-
return super.getExperienceReward();
59-
}
60-
61-
@NotNull
62-
@Override
63-
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
64-
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
23+
int oldXp = xpReward;
24+
xpReward = (int) (xpReward * 2.5F);
25+
int reward = super.getExperienceReward();
26+
xpReward = oldXp;
27+
return reward;
6528
}
6629

6730
@Override
Lines changed: 9 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
11
package mekanism.additions.common.entity.baby;
22

3+
import mekanism.additions.common.registries.AdditionsEntityTypes;
34
import net.minecraft.core.BlockPos;
45
import net.minecraft.core.Direction;
5-
import net.minecraft.network.syncher.EntityDataAccessor;
6-
import net.minecraft.network.syncher.EntityDataSerializers;
7-
import net.minecraft.network.syncher.SynchedEntityData;
86
import net.minecraft.util.RandomSource;
9-
import net.minecraft.world.entity.EntityDimensions;
107
import net.minecraft.world.entity.EntityType;
118
import net.minecraft.world.entity.MobSpawnType;
12-
import net.minecraft.world.entity.Pose;
139
import net.minecraft.world.entity.monster.Stray;
1410
import net.minecraft.world.level.Level;
1511
import net.minecraft.world.level.ServerLevelAccessor;
1612
import net.minecraft.world.level.block.Blocks;
17-
import org.jetbrains.annotations.NotNull;
1813

19-
public class EntityBabyStray extends Stray implements IBabyEntity {
20-
21-
private static final EntityDataAccessor<Boolean> IS_CHILD = SynchedEntityData.defineId(EntityBabyStray.class, EntityDataSerializers.BOOLEAN);
22-
private static final EntityDimensions BABY_DIMENSIONS = EntityType.STRAY.getDimensions().scale(0.5F).withEyeHeight(0.93F);
14+
public class EntityBabyStray extends Stray {
2315

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

4032
public EntityBabyStray(EntityType<EntityBabyStray> type, Level world) {
4133
super(type, world);
42-
setBaby(true);
43-
}
44-
45-
@Override
46-
protected void defineSynchedData(@NotNull SynchedEntityData.Builder builder) {
47-
super.defineSynchedData(builder);
48-
builder.define(IS_CHILD, true);
34+
AdditionsEntityTypes.setupBabyModifiers(this);
4935
}
5036

5137
@Override
5238
public boolean isBaby() {
53-
return getEntityData().get(IS_CHILD);
54-
}
55-
56-
@Override
57-
public void setBaby(boolean child) {
58-
setChild(IS_CHILD, child);
59-
}
60-
61-
@Override
62-
public void onSyncedDataUpdated(@NotNull EntityDataAccessor<?> key) {
63-
if (IS_CHILD.equals(key)) {
64-
refreshDimensions();
65-
}
66-
super.onSyncedDataUpdated(key);
39+
return true;
6740
}
6841

6942
@Override
7043
public int getExperienceReward() {
71-
if (isBaby()) {
72-
int oldXp = xpReward;
73-
xpReward = (int) (xpReward * 2.5F);
74-
int reward = super.getExperienceReward();
75-
xpReward = oldXp;
76-
return reward;
77-
}
78-
return super.getExperienceReward();
79-
}
80-
81-
@NotNull
82-
@Override
83-
public EntityDimensions getDefaultDimensions(@NotNull Pose pose) {
84-
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
44+
int oldXp = xpReward;
45+
xpReward = (int) (xpReward * 2.5F);
46+
int reward = super.getExperienceReward();
47+
xpReward = oldXp;
48+
return reward;
8549
}
8650
}

0 commit comments

Comments
 (0)