use super::{Mob, MobEntity}; use crate::entity::ai::goal::destroy_egg::DestroyEggGoal; use crate::entity::ai::goal::look_around::RandomLookAroundGoal; use crate::entity::ai::goal::revenge::RevengeGoal; use crate::entity::ai::goal::swim::SwimGoal; use crate::entity::ai::goal::wander_around::WanderAroundGoal; use crate::entity::ai::goal::zombie_attack::ZombieAttackGoal; use crate::entity::{ Entity, NBTStorage, NbtFuture, ai::goal::{active_target::ActiveTargetGoal, look_at_entity::LookAtEntityGoal}, }; use pumpkin_data::entity::EntityType; use pumpkin_nbt::compound::NbtCompound; use std::sync::{Arc, Weak}; pub mod drowned; pub mod husk; #[allow(clippy::module_inception)] pub mod zombie; pub mod zombie_villager; pub struct ZombieEntityBase { pub mob_entity: MobEntity, } impl ZombieEntityBase { pub fn new(entity: Entity) -> Arc { let mob_entity = MobEntity::new(entity); let zombie = Self { mob_entity }; let mob_arc = Arc::new(zombie); let mob_weak: Weak = { let mob_arc: Arc = mob_arc.clone(); Arc::downgrade(&mob_arc) }; { let mut goal_selector = mob_arc .mob_entity .goals_selector .lock() .unwrap_or_else(std::sync::PoisonError::into_inner); let mut target_selector = mob_arc .mob_entity .target_selector .lock() .unwrap_or_else(std::sync::PoisonError::into_inner); goal_selector.add_goal(0, Box::new(SwimGoal::default())); goal_selector.add_goal(2, ZombieAttackGoal::new(1.0, false)); goal_selector.add_goal(4, DestroyEggGoal::new(1.0, 3)); goal_selector.add_goal(7, Box::new(WanderAroundGoal::new(1.0))); goal_selector.add_goal( 8, LookAtEntityGoal::with_default(mob_weak, &EntityType::PLAYER, 8.0), ); goal_selector.add_goal(8, Box::new(RandomLookAroundGoal::default())); target_selector.add_goal(1, Box::new(RevengeGoal::new(true))); target_selector.add_goal( 2, ActiveTargetGoal::with_default(&mob_arc.mob_entity, &EntityType::PLAYER, true), ); target_selector.add_goal( 3, ActiveTargetGoal::with_default(&mob_arc.mob_entity, &EntityType::VILLAGER, true), ); target_selector.add_goal( 3, ActiveTargetGoal::with_default(&mob_arc.mob_entity, &EntityType::IRON_GOLEM, true), ); target_selector.add_goal( 5, ActiveTargetGoal::with_default(&mob_arc.mob_entity, &EntityType::TURTLE, true), ); }; mob_arc } } impl NBTStorage for ZombieEntityBase { fn write_nbt<'a>(&'a self, nbt: &'a mut NbtCompound) -> NbtFuture<'a, ()> { self.mob_entity.living_entity.write_nbt(nbt) } fn read_nbt_non_mut<'a>(&'a self, nbt: &'a NbtCompound) -> NbtFuture<'a, ()> { self.mob_entity.living_entity.read_nbt_non_mut(nbt) } } impl Mob for ZombieEntityBase { fn get_mob_entity(&self) -> &MobEntity { &self.mob_entity } }