Skip to content

Commit 6322190

Browse files
committed
feat: add baby component support to zombies and implement zombie death items & xp
1 parent 45899d7 commit 6322190

File tree

9 files changed

+55
-18
lines changed

9 files changed

+55
-18
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package org.allaymc.api.entity.interfaces;
22

3+
import org.allaymc.api.entity.component.EntityBabyComponent;
34
import org.allaymc.api.entity.component.EntityContainerHolderComponent;
45
import org.allaymc.api.entity.component.EntityHeadYawComponent;
56
import org.allaymc.api.entity.component.EntityUndeadComponent;
67

7-
public interface EntityZombie extends EntityIntelligent, EntityHeadYawComponent, EntityUndeadComponent, EntityContainerHolderComponent {
8+
public interface EntityZombie extends EntityIntelligent, EntityHeadYawComponent, EntityUndeadComponent, EntityContainerHolderComponent, EntityBabyComponent {
89
}

server/src/main/java/org/allaymc/server/entity/component/EntityLivingComponentImpl.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import org.allaymc.api.entity.interfaces.EntityPlayer;
2727
import org.allaymc.api.eventbus.EventHandler;
2828
import org.allaymc.api.eventbus.event.entity.*;
29-
import org.allaymc.api.item.enchantment.EnchantmentTypes;
3029
import org.allaymc.api.item.ItemStack;
30+
import org.allaymc.api.item.enchantment.EnchantmentTypes;
3131
import org.allaymc.api.item.interfaces.ItemAirStack;
3232
import org.allaymc.api.math.MathUtils;
3333
import org.allaymc.api.utils.identifier.Identifier;
@@ -47,7 +47,6 @@
4747
import java.util.HashMap;
4848
import java.util.List;
4949
import java.util.Map;
50-
import java.util.concurrent.ThreadLocalRandom;
5150

5251
import static java.lang.Math.max;
5352
import static java.lang.Math.min;
@@ -734,13 +733,15 @@ protected void onDie() {
734733
}
735734

736735
// Drop loot items
737-
var drops = getDrops(lootingLevel);
738-
if (!drops.isEmpty()) {
739-
var dimension = baseComponent.getDimension();
740-
var dropPos = dieEvent.getDropPosition();
741-
var motionFactory = dieEvent.getDropMotionFactory();
742-
for (var drop : drops) {
743-
dimension.dropItem(drop, dropPos, motionFactory.get(), 40);
736+
if (thisEntity.getWorld().getWorldData().<Boolean>getGameRuleValue(GameRule.DO_MOB_LOOT)) {
737+
var drops = getDrops(lootingLevel);
738+
if (!drops.isEmpty()) {
739+
var dimension = baseComponent.getDimension();
740+
var dropPos = dieEvent.getDropPosition();
741+
var motionFactory = dieEvent.getDropMotionFactory();
742+
for (var drop : drops) {
743+
dimension.dropItem(drop, dropPos, motionFactory.get(), 40);
744+
}
744745
}
745746
}
746747

server/src/main/java/org/allaymc/server/entity/component/EntityZombieLivingComponentImpl.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,27 @@
33
import org.allaymc.api.entity.Entity;
44
import org.allaymc.api.entity.ai.memory.MemoryTypes;
55
import org.allaymc.api.entity.component.EntityAIComponent;
6+
import org.allaymc.api.entity.component.EntityBabyComponent;
67
import org.allaymc.api.entity.component.EntityLivingComponent;
78
import org.allaymc.api.entity.damage.DamageContainer;
89
import org.allaymc.api.entity.interfaces.EntityProjectile;
10+
import org.allaymc.api.item.ItemStack;
11+
import org.allaymc.api.item.type.ItemTypes;
912
import org.allaymc.server.component.annotation.Dependency;
1013

14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import java.util.concurrent.ThreadLocalRandom;
17+
1118
/**
1219
* Living component implementation for zombies.
1320
*/
1421
public class EntityZombieLivingComponentImpl extends EntityLivingComponentImpl {
1522

1623
@Dependency
1724
protected EntityAIComponent aiComponent;
25+
@Dependency
26+
protected EntityBabyComponent babyComponent;
1827

1928
public EntityZombieLivingComponentImpl() {
2029
setMaxHealth(20);
@@ -42,4 +51,32 @@ protected Entity resolveAttacker(Object attacker) {
4251

4352
return attacker instanceof Entity entity ? entity : null;
4453
}
54+
55+
@Override
56+
public List<ItemStack> getDrops(int lootingLevel) {
57+
var drops = new ArrayList<ItemStack>();
58+
var rand = ThreadLocalRandom.current();
59+
int fleshCount = rand.nextInt(4 + lootingLevel);
60+
if (fleshCount > 0) {
61+
drops.add(ItemTypes.ROTTEN_FLESH.createItemStack(fleshCount));
62+
}
63+
64+
float rareChance = (1f / 120f) + ((1f / 300f) * lootingLevel);
65+
if (rand.nextFloat() < rareChance) {
66+
switch (rand.nextInt(4)) {
67+
case 0 -> drops.add(ItemTypes.IRON_INGOT.createItemStack());
68+
case 1 -> drops.add(ItemTypes.CARROT.createItemStack());
69+
case 2 -> drops.add(ItemTypes.POTATO.createItemStack());
70+
default -> {
71+
}
72+
}
73+
}
74+
75+
return drops;
76+
}
77+
78+
@Override
79+
public int getDropXpAmount() {
80+
return babyComponent.isBaby() ? 12 : 5;
81+
}
4582
}

server/src/main/java/org/allaymc/server/entity/component/animal/EntityAnimalBaseComponentImpl.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.allaymc.api.entity.interfaces.EntityPlayer;
1010
import org.allaymc.api.eventbus.EventHandler;
1111
import org.allaymc.api.item.ItemStack;
12-
import org.allaymc.api.world.gamerule.GameRule;
1312
import org.allaymc.server.component.annotation.Dependency;
1413
import org.allaymc.server.entity.component.EntityBaseComponentImpl;
1514
import org.allaymc.server.entity.component.event.CEntityGetDropXpEvent;
@@ -46,10 +45,6 @@ public boolean onInteract(EntityPlayer player, ItemStack itemStack) {
4645
return true;
4746
}
4847

49-
protected boolean canDrop() {
50-
return thisEntity.getWorld().getWorldData().<Boolean>getGameRuleValue(GameRule.DO_MOB_LOOT) && !babyComponent.isBaby();
51-
}
52-
5348
@EventHandler
5449
protected void onGetDropXp(CEntityGetDropXpEvent event) {
5550
if (babyComponent.isBaby()) return;

server/src/main/java/org/allaymc/server/entity/component/animal/EntityChickenBaseComponentImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public AABBdc getBaseAABB() {
2525

2626
@EventHandler
2727
protected void onGetDrop(CEntityGetDropEvent event) {
28-
if (!canDrop()) {
28+
if (babyComponent.isBaby()) {
2929
return;
3030
}
3131

server/src/main/java/org/allaymc/server/entity/component/animal/EntityCowBaseComponentImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public boolean onInteract(EntityPlayer player, ItemStack itemStack) {
4444

4545
@EventHandler
4646
protected void onGetDrop(CEntityGetDropEvent event) {
47-
if (!canDrop()) {
47+
if (babyComponent.isBaby()) {
4848
return;
4949
}
5050

server/src/main/java/org/allaymc/server/entity/component/animal/EntityPigBaseComponentImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public AABBdc getBaseAABB() {
2525

2626
@EventHandler
2727
protected void onGetDrop(CEntityGetDropEvent event) {
28-
if (!canDrop()) {
28+
if (babyComponent.isBaby()) {
2929
return;
3030
}
3131

server/src/main/java/org/allaymc/server/entity/impl/EntityZombieImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public class EntityZombieImpl extends EntityImpl implements EntityZombie, Entity
2222
@Delegate
2323
private EntityParallelTickComponent parallelTickComponent;
2424
@Delegate
25+
private EntityBabyComponent babyComponent;
26+
@Delegate
2527
private EntityHeadYawComponent headYawComponent;
2628

2729
public EntityZombieImpl(EntityInitInfo initInfo,

server/src/main/java/org/allaymc/server/entity/type/EntityTypeInitializer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ public static void initZombie() {
180180
.vanillaEntity(EntityId.ZOMBIE)
181181
.addComponent(EntityHumanLikeBaseComponentImpl::new, EntityHumanLikeBaseComponentImpl.class)
182182
.addComponent(EntityHumanLikeContainerHolderComponentImpl::new, EntityHumanLikeContainerHolderComponentImpl.class)
183+
.addComponent(EntityBabyComponentImpl::new, EntityBabyComponentImpl.class)
183184
.addComponent(EntityUndeadComponentImpl::new, EntityUndeadComponentImpl.class)
184185
.addComponent(EntityZombieLivingComponentImpl::new, EntityZombieLivingComponentImpl.class)
185186
.addComponent(EntityHumanPhysicsComponentImpl::new, EntityHumanPhysicsComponentImpl.class)

0 commit comments

Comments
 (0)