Initial commit: Forge 1.20.1 Ellie companion mod

- EllieEntity with GeckoLib animations, sleep AI, pathfinding with crouching
- Dialog system with conditions and effects
- Relationship system with milestones
- OpenDoor and bed occupation pathfinding
- 15 animations: idle1/2/3, sleep, walkingsimple, shiftwalking/shiftidle, etc.
This commit is contained in:
2026-06-09 21:18:04 +03:00
commit f5d318f02e
48 changed files with 21932 additions and 0 deletions
@@ -0,0 +1,51 @@
package me.sashegdev.fabled_hearts.menu;
import me.sashegdev.fabled_hearts.Main;
import me.sashegdev.fabled_hearts.data.WorldData;
import me.sashegdev.fabled_hearts.registry.ModEntities;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
public class EllieSpawnItem extends Item {
public EllieSpawnItem() {
super(new Item.Properties().stacksTo(1));
}
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (!level.isClientSide) {
ServerLevel serverLevel = (ServerLevel) level;
WorldData data = WorldData.get(serverLevel);
if (data.hasEllie()) {
Entity existing = serverLevel.getEntity(data.getEllieUUID());
if (existing != null) {
player.sendSystemMessage(Component.literal("§eEllie уже здесь!"));
return InteractionResultHolder.success(stack);
} else {
data.removeEllie();
}
}
var entity = ModEntities.ELLIE.get().create(serverLevel);
if (entity != null) {
entity.setPos(player.getX(), player.getY(), player.getZ());
serverLevel.addFreshEntity(entity);
data.setEllieUUID(entity.getUUID());
player.sendSystemMessage(Component.literal("§aEllie появилась!"));
}
}
return InteractionResultHolder.success(stack);
}
}