From 9681c0148d7db4872c03fe118e809238d2c95674 Mon Sep 17 00:00:00 2001 From: Mubelotix Date: Fri, 10 Nov 2023 18:08:22 +0100 Subject: [PATCH] Start implementing TryAsEntityRef --- minecraft-entities-derive/src/lib.rs | 25 ++ minecraft-entities/src/animals/mod.rs | 22 ++ minecraft-entities/src/arrow.rs | 22 ++ minecraft-entities/src/boat.rs | 18 ++ minecraft-entities/src/display.rs | 22 ++ minecraft-entities/src/entity.rs | 272 ++++++++++++++++++ minecraft-entities/src/fire_entities.rs | 8 +- minecraft-entities/src/item.rs | 18 ++ minecraft-entities/src/lib.rs | 8 +- minecraft-entities/src/living_entity.rs | 24 ++ minecraft-entities/src/mobs/flying.rs | 20 ++ minecraft-entities/src/mobs/golems.rs | 20 ++ minecraft-entities/src/mobs/mod.rs | 98 +++++++ .../src/thrown_item_projectile.rs | 26 ++ 14 files changed, 593 insertions(+), 10 deletions(-) diff --git a/minecraft-entities-derive/src/lib.rs b/minecraft-entities-derive/src/lib.rs index 6022b034..0f9a99c7 100644 --- a/minecraft-entities-derive/src/lib.rs +++ b/minecraft-entities-derive/src/lib.rs @@ -202,6 +202,31 @@ pub fn MinecraftEntity(attr: TokenStream, item: TokenStream) -> TokenStream { } let code: TokenStream = code.into_iter().collect(); codes.push(code); + } else { + // Implement TryAsEntityRef for this struct + let code: TokenStream = r#" + impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&This> { + match self { + AnyEntity::This(ref val) => Some(val), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut This> { + match self { + AnyEntity::This(ref mut val) => Some(val), + _ => None, + } + } + } + "#.parse().unwrap(); + let mut code = code.clone().into_iter().collect::>(); + for element in &mut code { + replace_idents(element, &to_replace); + } + let code: TokenStream = code.into_iter().collect(); + codes.push(code); } // Generate ext trait diff --git a/minecraft-entities/src/animals/mod.rs b/minecraft-entities/src/animals/mod.rs index 2ae75b5d..4af770a2 100644 --- a/minecraft-entities/src/animals/mod.rs +++ b/minecraft-entities/src/animals/mod.rs @@ -53,6 +53,28 @@ pub struct Animal { pub ageable_mob: AgeableMob, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Animal> { + match self { + AnyEntity::Animal(animal) => return Some(&animal), + _ => (), + } + if let Some(tameable_animal) = self.try_as_entity_ref::() { + return tameable_animal.animal.try_as_entity_ref(); + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut Animal> { + match self { + AnyEntity::Animal(animal) => return Some(animal), + _ => (), + } + if let Some(tameable_animal) = self.try_as_entity_mut::() { + return tameable_animal.animal.try_as_entity_mut(); + } + } +} + #[derive(Default)] #[MinecraftEntity( inheritable, parents { Animal, AgeableMob, PathfinderMob, Mob, LivingEntity, Entity }, diff --git a/minecraft-entities/src/arrow.rs b/minecraft-entities/src/arrow.rs index 18d67460..efe507c3 100644 --- a/minecraft-entities/src/arrow.rs +++ b/minecraft-entities/src/arrow.rs @@ -21,6 +21,28 @@ impl Default for AbstractArrow { } } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&AbstractArrow> { + match self { + AnyEntity::AbstractArrow(abstract_arrow) => Some(abstract_arrow), + AnyEntity::Arrow(arrow) => Some(&arrow.abstract_arrow), + AnyEntity::SpectralArrow(spectral_arrow) => Some(&spectral_arrow.abstract_arrow), + AnyEntity::ThrownTrident(thrown_trident) => Some(&thrown_trident.abstract_arrow), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut AbstractArrow> { + match self { + AnyEntity::AbstractArrow(abstract_arrow) => Some(abstract_arrow), + AnyEntity::Arrow(arrow) => Some(&mut arrow.abstract_arrow), + AnyEntity::SpectralArrow(spectral_arrow) => Some(&mut spectral_arrow.abstract_arrow), + AnyEntity::ThrownTrident(thrown_trident) => Some(&mut thrown_trident.abstract_arrow), + _ => None, + } + } +} + #[MinecraftEntity( parents { AbstractArrow, Entity }, )] diff --git a/minecraft-entities/src/boat.rs b/minecraft-entities/src/boat.rs index ce92a5f4..b9a2a28e 100644 --- a/minecraft-entities/src/boat.rs +++ b/minecraft-entities/src/boat.rs @@ -30,6 +30,24 @@ impl Default for Boat { } } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Entity> { + match self { + AnyEntity::Boat(boat) => Some(&boat.entity), + AnyEntity::ChestBoat(chest_boat) => Some(&chest_boat.boat.entity), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut Boat> { + match self { + AnyEntity::Boat(boat) => Some(boat), + AnyEntity::ChestBoat(chest_boat) => Some(&mut chest_boat.boat), + _ => None, + } + } +} + #[derive(Default)] #[MinecraftEntity( parents { Boat, Entity }, diff --git a/minecraft-entities/src/display.rs b/minecraft-entities/src/display.rs index f1450ada..679c7eeb 100644 --- a/minecraft-entities/src/display.rs +++ b/minecraft-entities/src/display.rs @@ -52,6 +52,28 @@ impl Default for Display { } } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Entity> { + match self { + AnyEntity::Display(display) => Some(&display.entity), + AnyEntity::BlockDisplay(block_display) => Some(&block_display.display.entity), + AnyEntity::ItemDisplay(item_display) => Some(&item_display.display.entity), + AnyEntity::TextDisplay(text_display) => Some(&text_display.display.entity), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut Display> { + match self { + AnyEntity::Display(display) => Some(display), + AnyEntity::BlockDisplay(block_display) => Some(&mut block_display.display), + AnyEntity::ItemDisplay(item_display) => Some(&mut item_display.display), + AnyEntity::TextDisplay(text_display) => Some(&mut text_display.display), + _ => None, + } + } +} + #[MinecraftEntity( parents { Display, Entity }, )] diff --git a/minecraft-entities/src/entity.rs b/minecraft-entities/src/entity.rs index 8c1ee3bc..f8684788 100644 --- a/minecraft-entities/src/entity.rs +++ b/minecraft-entities/src/entity.rs @@ -42,3 +42,275 @@ impl Default for Entity { } } } + +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Entity> { + Some(match self { + AnyEntity::Entity(entity) => entity, + AnyEntity::Display(display) => display.get_entity(), + AnyEntity::BlockDisplay(block_display) => block_display.get_entity(), + AnyEntity::ItemDisplay(item_display) => item_display.get_entity(), + AnyEntity::TextDisplay(text_display) => text_display.get_entity(), + AnyEntity::ThrownItemProjectile(throw_item_projectile) => throw_item_projectile.get_entity(), + AnyEntity::ThrownEgg(throw_egg) => throw_egg.get_entity(), + AnyEntity::ThrownEnderPearl(throw_ender_pearl) => throw_ender_pearl.get_entity(), + AnyEntity::ThrownExperienceBottle(throw_experience_bottle) => throw_experience_bottle.get_entity(), + AnyEntity::ThrownPotion(throw_potion) => throw_potion.get_entity(), + AnyEntity::Snowball(snowball) => snowball.get_entity(), + AnyEntity::AbstractArrow(abstract_arrow) => abstract_arrow.get_entity(), + AnyEntity::Arrow(arrow) => arrow.get_entity(), + AnyEntity::SpectralArrow(spectral_arrow) => spectral_arrow.get_entity(), + AnyEntity::ThrownTrident(throw_trident) => throw_trident.get_entity(), + AnyEntity::Boat(boat) => boat.get_entity(), + AnyEntity::ChestBoat(chest_boat) => chest_boat.get_entity(), + AnyEntity::LivingEntity(living_entity) => living_entity.get_entity(), + AnyEntity::Player(player) => player.get_entity(), + AnyEntity::Mob(mob) => mob.get_entity(), + AnyEntity::AmbientCreature(ambient_creature) => ambient_creature.get_entity(), + AnyEntity::Bat(bat) => bat.get_entity(), + AnyEntity::PathfinderMob(pathfinder_mob) => pathfinder_mob.get_entity(), + AnyEntity::WaterAnimal(water_animal) => water_animal.get_entity(), + AnyEntity::Squid(squid) => squid.get_entity(), + AnyEntity::AgeableMob(ageable_mob) => ageable_mob.get_entity(), + AnyEntity::Animal(animal) => animal.get_entity(), + AnyEntity::Sniffer(sniffer) => sniffer.get_entity(), + AnyEntity::AbstractHorse(abstract_horse) => abstract_horse.get_entity(), + AnyEntity::ZombieHorse(zombie_horse) => zombie_horse.get_entity(), + AnyEntity::Horse(horse) => horse.get_entity(), + AnyEntity::SkeletonHorse(skeleton_horse) => skeleton_horse.get_entity(), + AnyEntity::Camel(camel) => camel.get_entity(), + AnyEntity::ChestedHorse(chested_horse) => chested_horse.get_entity(), + AnyEntity::Donkey(donkey) => donkey.get_entity(), + AnyEntity::Llama(llama) => llama.get_entity(), + AnyEntity::TraderLlama(trader_llama) => trader_llama.get_entity(), + AnyEntity::Mule(mule) => mule.get_entity(), + AnyEntity::Axolotl(axolotl) => axolotl.get_entity(), + AnyEntity::Bee(bee) => bee.get_entity(), + AnyEntity::Fox(fox) => fox.get_entity(), + AnyEntity::Frog(frog) => frog.get_entity(), + AnyEntity::Ocelot(ocelot) => ocelot.get_entity(), + AnyEntity::Panda(panda) => panda.get_entity(), + AnyEntity::Pig(pig) => pig.get_entity(), + AnyEntity::Rabbit(rabbit) => rabbit.get_entity(), + AnyEntity::Turtle(turtle) => turtle.get_entity(), + AnyEntity::PolarBear(polar_bear) => polar_bear.get_entity(), + AnyEntity::Chicken(chicken) => chicken.get_entity(), + AnyEntity::Cow(cow) => cow.get_entity(), + AnyEntity::Hoglin(hoglin) => hoglin.get_entity(), + AnyEntity::Mooshroom(mooshroom) => mooshroom.get_entity(), + AnyEntity::Sheep(sheep) => sheep.get_entity(), + AnyEntity::Strider(strider) => strider.get_entity(), + AnyEntity::TameableAnimal(tameable_animal) => tameable_animal.get_entity(), + AnyEntity::Cat(cat) => cat.get_entity(), + AnyEntity::Wolf(wolf) => wolf.get_entity(), + AnyEntity::Parrot(parrot) => parrot.get_entity(), + AnyEntity::AbstractVillager(abstract_villager) => abstract_villager.get_entity(), + AnyEntity::Villager(villager) => villager.get_entity(), + AnyEntity::WanderingTrader(wandering_trader) => wandering_trader.get_entity(), + AnyEntity::AbstractGolem(abstract_golem) => abstract_golem.get_entity(), + AnyEntity::IronGolem(iron_golem) => iron_golem.get_entity(), + AnyEntity::SnowGolem(snow_golem) => snow_golem.get_entity(), + AnyEntity::Shulker(shulker) => shulker.get_entity(), + AnyEntity::Monster(monster) => monster.get_entity(), + AnyEntity::BasePiglin(base_piglin) => base_piglin.get_entity(), + AnyEntity::Piglin(piglin) => piglin.get_entity(), + AnyEntity::PiglinBrute(piglin_brute) => piglin_brute.get_entity(), + AnyEntity::Blaze(blaze) => blaze.get_entity(), + AnyEntity::Creeper(creeper) => creeper.get_entity(), + AnyEntity::Endermite(endermite) => endermite.get_entity(), + AnyEntity::Giant(giant) => giant.get_entity(), + AnyEntity::Goat(goat) => goat.get_entity(), + AnyEntity::Guardian(guardian) => guardian.get_entity(), + AnyEntity::ElderGuardian(elder_guardian) => elder_guardian.get_entity(), + AnyEntity::Silverfish(silverfish) => silverfish.get_entity(), + AnyEntity::Raider(raider) => raider.get_entity(), + AnyEntity::AbstractIllager(abstract_illager) => abstract_illager.get_entity(), + AnyEntity::Vindicator(vindicator) => vindicator.get_entity(), + AnyEntity::Pillager(pillager) => pillager.get_entity(), + AnyEntity::SpellcasterIllager(spellcaster_illager) => spellcaster_illager.get_entity(), + AnyEntity::Evoker(evoker) => evoker.get_entity(), + AnyEntity::Illusioner(illusioner) => illusioner.get_entity(), + AnyEntity::Ravager(ravager) => ravager.get_entity(), + AnyEntity::Witch(witch) => witch.get_entity(), + AnyEntity::EvokerFangs(evoker_fangs) => evoker_fangs.get_entity(), + AnyEntity::Vex(vex) => vex.get_entity(), + AnyEntity::Skeleton(skeleton) => skeleton.get_entity(), + AnyEntity::AbstractSkeleton(abstract_skeleton) => abstract_skeleton.get_entity(), + AnyEntity::WitherSkeleton(wither_skeleton) => wither_skeleton.get_entity(), + AnyEntity::Stray(stray) => stray.get_entity(), + AnyEntity::Spider(spider) => spider.get_entity(), + AnyEntity::Warden(warden) => warden.get_entity(), + AnyEntity::Wither(wither) => wither.get_entity(), + AnyEntity::Zoglin(zoglin) => zoglin.get_entity(), + AnyEntity::Zombie(zombie) => zombie.get_entity(), + AnyEntity::ZombieVillager(zombie_villager) => zombie_villager.get_entity(), + AnyEntity::Husk(husk) => husk.get_entity(), + AnyEntity::Drowned(drowned) => drowned.get_entity(), + AnyEntity::ZombifiedPiglin(zombified_piglin) => zombified_piglin.get_entity(), + AnyEntity::Enderman(enderman) => enderman.get_entity(), + AnyEntity::EnderDragon(ender_dragon) => ender_dragon.get_entity(), + AnyEntity::Flying(flying) => flying.get_entity(), + AnyEntity::Ghast(ghast) => ghast.get_entity(), + AnyEntity::Phantom(phantom) => phantom.get_entity(), + AnyEntity::Slime(slime) => slime.get_entity(), + AnyEntity::LlamaSpit(llama_spit) => llama_spit.get_entity(), + AnyEntity::EyeOfEnder(eye_of_ender) => eye_of_ender.get_entity(), + AnyEntity::FallingBlock(falling_block) => falling_block.get_entity(), + AnyEntity::AreaEffectCloud(area_effect_cloud) => area_effect_cloud.get_entity(), + AnyEntity::FishingHook(fishing_hook) => fishing_hook.get_entity(), + AnyEntity::EndCrystal(end_crystal) => end_crystal.get_entity(), + AnyEntity::DragonFireball(dragon_fireball) => dragon_fireball.get_entity(), + AnyEntity::SmallFireball(small_fireball) => small_fireball.get_entity(), + AnyEntity::Fireball(fireball) => fireball.get_entity(), + AnyEntity::WitherSkull(wither_skull) => wither_skull.get_entity(), + AnyEntity::FireworkRocket(firework_rocket) => firework_rocket.get_entity(), + AnyEntity::ItemFrame(item_frame) => item_frame.get_entity(), + AnyEntity::GlowingItemFrame(glowing_item_frame) => glowing_item_frame.get_entity(), + AnyEntity::Painting(painting) => painting.get_entity(), + AnyEntity::ItemEntity(item_entity) => item_entity.get_entity(), + AnyEntity::ArmorStand(armor_stand) => armor_stand.get_entity(), + AnyEntity::Dolphin(dolphin) => dolphin.get_entity(), + AnyEntity::AbstractFish(abstract_fish) => abstract_fish.get_entity(), + AnyEntity::Cod(cod) => cod.get_entity(), + AnyEntity::PufferFish(pufferfish) => pufferfish.get_entity(), + AnyEntity::Salmon(salmon) => salmon.get_entity(), + AnyEntity::TropicalFish(tropical_fish) => tropical_fish.get_entity(), + AnyEntity::Tadpole(tadpole) => tadpole.get_entity(), + }) + } + + fn try_as_entity_mut(&mut self) -> Option<&mut Entity> { + Some(match self { + AnyEntity::Entity(entity) => entity, + AnyEntity::Display(display) => display.get_entity_mut(), + AnyEntity::BlockDisplay(block_display) => block_display.get_entity_mut(), + AnyEntity::ItemDisplay(item_display) => item_display.get_entity_mut(), + AnyEntity::TextDisplay(text_display) => text_display.get_entity_mut(), + AnyEntity::ThrownItemProjectile(throw_item_projectile) => throw_item_projectile.get_entity_mut(), + AnyEntity::ThrownEgg(throw_egg) => throw_egg.get_entity_mut(), + AnyEntity::ThrownEnderPearl(throw_ender_pearl) => throw_ender_pearl.get_entity_mut(), + AnyEntity::ThrownExperienceBottle(throw_experience_bottle) => throw_experience_bottle.get_entity_mut(), + AnyEntity::ThrownPotion(throw_potion) => throw_potion.get_entity_mut(), + AnyEntity::Snowball(snowball) => snowball.get_entity_mut(), + AnyEntity::AbstractArrow(abstract_arrow) => abstract_arrow.get_entity_mut(), + AnyEntity::Arrow(arrow) => arrow.get_entity_mut(), + AnyEntity::SpectralArrow(spectral_arrow) => spectral_arrow.get_entity_mut(), + AnyEntity::ThrownTrident(throw_trident) => throw_trident.get_entity_mut(), + AnyEntity::Boat(boat) => boat.get_entity_mut(), + AnyEntity::ChestBoat(chest_boat) => chest_boat.get_entity_mut(), + AnyEntity::LivingEntity(living_entity) => living_entity.get_entity_mut(), + AnyEntity::Player(player) => player.get_entity_mut(), + AnyEntity::Mob(mob) => mob.get_entity_mut(), + AnyEntity::AmbientCreature(ambient_creature) => ambient_creature.get_entity_mut(), + AnyEntity::Bat(bat) => bat.get_entity_mut(), + AnyEntity::PathfinderMob(pathfinder_mob) => pathfinder_mob.get_entity_mut(), + AnyEntity::WaterAnimal(water_animal) => water_animal.get_entity_mut(), + AnyEntity::Squid(squid) => squid.get_entity_mut(), + AnyEntity::AgeableMob(ageable_mob) => ageable_mob.get_entity_mut(), + AnyEntity::Animal(animal) => animal.get_entity_mut(), + AnyEntity::Sniffer(sniffer) => sniffer.get_entity_mut(), + AnyEntity::AbstractHorse(abstract_horse) => abstract_horse.get_entity_mut(), + AnyEntity::ZombieHorse(zombie_horse) => zombie_horse.get_entity_mut(), + AnyEntity::Horse(horse) => horse.get_entity_mut(), + AnyEntity::SkeletonHorse(skeleton_horse) => skeleton_horse.get_entity_mut(), + AnyEntity::Camel(camel) => camel.get_entity_mut(), + AnyEntity::ChestedHorse(chested_horse) => chested_horse.get_entity_mut(), + AnyEntity::Donkey(donkey) => donkey.get_entity_mut(), + AnyEntity::Llama(llama) => llama.get_entity_mut(), + AnyEntity::TraderLlama(trader_llama) => trader_llama.get_entity_mut(), + AnyEntity::Mule(mule) => mule.get_entity_mut(), + AnyEntity::Axolotl(axolotl) => axolotl.get_entity_mut(), + AnyEntity::Bee(bee) => bee.get_entity_mut(), + AnyEntity::Fox(fox) => fox.get_entity_mut(), + AnyEntity::Frog(frog) => frog.get_entity_mut(), + AnyEntity::Ocelot(ocelot) => ocelot.get_entity_mut(), + AnyEntity::Panda(panda) => panda.get_entity_mut(), + AnyEntity::Pig(pig) => pig.get_entity_mut(), + AnyEntity::Rabbit(rabbit) => rabbit.get_entity_mut(), + AnyEntity::Turtle(turtle) => turtle.get_entity_mut(), + AnyEntity::PolarBear(polar_bear) => polar_bear.get_entity_mut(), + AnyEntity::Chicken(chicken) => chicken.get_entity_mut(), + AnyEntity::Cow(cow) => cow.get_entity_mut(), + AnyEntity::Hoglin(hoglin) => hoglin.get_entity_mut(), + AnyEntity::Mooshroom(mooshroom) => mooshroom.get_entity_mut(), + AnyEntity::Sheep(sheep) => sheep.get_entity_mut(), + AnyEntity::Strider(strider) => strider.get_entity_mut(), + AnyEntity::TameableAnimal(tameable_animal) => tameable_animal.get_entity_mut(), + AnyEntity::Cat(cat) => cat.get_entity_mut(), + AnyEntity::Wolf(wolf) => wolf.get_entity_mut(), + AnyEntity::Parrot(parrot) => parrot.get_entity_mut(), + AnyEntity::AbstractVillager(abstract_villager) => abstract_villager.get_entity_mut(), + AnyEntity::Villager(villager) => villager.get_entity_mut(), + AnyEntity::WanderingTrader(wandering_trader) => wandering_trader.get_entity_mut(), + AnyEntity::AbstractGolem(abstract_golem) => abstract_golem.get_entity_mut(), + AnyEntity::IronGolem(iron_golem) => iron_golem.get_entity_mut(), + AnyEntity::SnowGolem(snow_golem) => snow_golem.get_entity_mut(), + AnyEntity::Shulker(shulker) => shulker.get_entity_mut(), + AnyEntity::Monster(monster) => monster.get_entity_mut(), + AnyEntity::BasePiglin(base_piglin) => base_piglin.get_entity_mut(), + AnyEntity::Piglin(piglin) => piglin.get_entity_mut(), + AnyEntity::PiglinBrute(piglin_brute) => piglin_brute.get_entity_mut(), + AnyEntity::Blaze(blaze) => blaze.get_entity_mut(), + AnyEntity::Creeper(creeper) => creeper.get_entity_mut(), + AnyEntity::Endermite(endermite) => endermite.get_entity_mut(), + AnyEntity::Giant(giant) => giant.get_entity_mut(), + AnyEntity::Goat(goat) => goat.get_entity_mut(), + AnyEntity::Guardian(guardian) => guardian.get_entity_mut(), + AnyEntity::ElderGuardian(elder_guardian) => elder_guardian.get_entity_mut(), + AnyEntity::Silverfish(silverfish) => silverfish.get_entity_mut(), + AnyEntity::Raider(raider) => raider.get_entity_mut(), + AnyEntity::AbstractIllager(abstract_illager) => abstract_illager.get_entity_mut(), + AnyEntity::Vindicator(vindicator) => vindicator.get_entity_mut(), + AnyEntity::Pillager(pillager) => pillager.get_entity_mut(), + AnyEntity::SpellcasterIllager(spellcaster_illager) => spellcaster_illager.get_entity_mut(), + AnyEntity::Evoker(evoker) => evoker.get_entity_mut(), + AnyEntity::Illusioner(illusioner) => illusioner.get_entity_mut(), + AnyEntity::Ravager(ravager) => ravager.get_entity_mut(), + AnyEntity::Witch(witch) => witch.get_entity_mut(), + AnyEntity::EvokerFangs(evoker_fangs) => evoker_fangs.get_entity_mut(), + AnyEntity::Vex(vex) => vex.get_entity_mut(), + AnyEntity::Skeleton(skeleton) => skeleton.get_entity_mut(), + AnyEntity::AbstractSkeleton(abstract_skeleton) => abstract_skeleton.get_entity_mut(), + AnyEntity::WitherSkeleton(wither_skeleton) => wither_skeleton.get_entity_mut(), + AnyEntity::Stray(stray) => stray.get_entity_mut(), + AnyEntity::Spider(spider) => spider.get_entity_mut(), + AnyEntity::Warden(warden) => warden.get_entity_mut(), + AnyEntity::Wither(wither) => wither.get_entity_mut(), + AnyEntity::Zoglin(zoglin) => zoglin.get_entity_mut(), + AnyEntity::Zombie(zombie) => zombie.get_entity_mut(), + AnyEntity::ZombieVillager(zombie_villager) => zombie_villager.get_entity_mut(), + AnyEntity::Husk(husk) => husk.get_entity_mut(), + AnyEntity::Drowned(drowned) => drowned.get_entity_mut(), + AnyEntity::ZombifiedPiglin(zombified_piglin) => zombified_piglin.get_entity_mut(), + AnyEntity::Enderman(enderman) => enderman.get_entity_mut(), + AnyEntity::EnderDragon(ender_dragon) => ender_dragon.get_entity_mut(), + AnyEntity::Flying(flying) => flying.get_entity_mut(), + AnyEntity::Ghast(ghast) => ghast.get_entity_mut(), + AnyEntity::Phantom(phantom) => phantom.get_entity_mut(), + AnyEntity::Slime(slime) => slime.get_entity_mut(), + AnyEntity::LlamaSpit(llama_spit) => llama_spit.get_entity_mut(), + AnyEntity::EyeOfEnder(eye_of_ender) => eye_of_ender.get_entity_mut(), + AnyEntity::FallingBlock(falling_block) => falling_block.get_entity_mut(), + AnyEntity::AreaEffectCloud(area_effect_cloud) => area_effect_cloud.get_entity_mut(), + AnyEntity::FishingHook(fishing_hook) => fishing_hook.get_entity_mut(), + AnyEntity::EndCrystal(end_crystal) => end_crystal.get_entity_mut(), + AnyEntity::DragonFireball(dragon_fireball) => dragon_fireball.get_entity_mut(), + AnyEntity::SmallFireball(small_fireball) => small_fireball.get_entity_mut(), + AnyEntity::Fireball(fireball) => fireball.get_entity_mut(), + AnyEntity::WitherSkull(wither_skull) => wither_skull.get_entity_mut(), + AnyEntity::FireworkRocket(firework_rocket) => firework_rocket.get_entity_mut(), + AnyEntity::ItemFrame(item_frame) => item_frame.get_entity_mut(), + AnyEntity::GlowingItemFrame(glowing_item_frame) => glowing_item_frame.get_entity_mut(), + AnyEntity::Painting(painting) => painting.get_entity_mut(), + AnyEntity::ItemEntity(item_entity) => item_entity.get_entity_mut(), + AnyEntity::ArmorStand(armor_stand) => armor_stand.get_entity_mut(), + AnyEntity::Dolphin(dolphin) => dolphin.get_entity_mut(), + AnyEntity::AbstractFish(abstract_fish) => abstract_fish.get_entity_mut(), + AnyEntity::Cod(cod) => cod.get_entity_mut(), + AnyEntity::PufferFish(pufferfish) => pufferfish.get_entity_mut(), + AnyEntity::Salmon(salmon) => salmon.get_entity_mut(), + AnyEntity::TropicalFish(tropical_fish) => tropical_fish.get_entity_mut(), + AnyEntity::Tadpole(tadpole) => tadpole.get_entity_mut(), + }) + } +} diff --git a/minecraft-entities/src/fire_entities.rs b/minecraft-entities/src/fire_entities.rs index eef22f51..ac330586 100644 --- a/minecraft-entities/src/fire_entities.rs +++ b/minecraft-entities/src/fire_entities.rs @@ -2,7 +2,7 @@ use super::*; #[derive(Default)] #[MinecraftEntity( - inheritable, parents { Entity }, + parents { Entity }, )] pub struct DragonFireball { pub entity: Entity, @@ -10,7 +10,7 @@ pub struct DragonFireball { #[derive(Default)] #[MinecraftEntity( - inheritable, parents { Entity }, + parents { Entity }, )] pub struct SmallFireball { pub entity: Entity, @@ -19,7 +19,7 @@ pub struct SmallFireball { #[derive(Default)] #[MinecraftEntity( - inheritable, parents { Entity }, + parents { Entity }, )] pub struct Fireball { pub entity: Entity, @@ -28,7 +28,7 @@ pub struct Fireball { #[derive(Default)] #[MinecraftEntity( - inheritable, parents { Entity }, + parents { Entity }, )] pub struct FireworkRocket { pub entity: Entity, diff --git a/minecraft-entities/src/item.rs b/minecraft-entities/src/item.rs index 86ce6fcd..b90df0d9 100644 --- a/minecraft-entities/src/item.rs +++ b/minecraft-entities/src/item.rs @@ -10,6 +10,24 @@ pub struct ItemFrame { pub rotation: u8, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Entity> { + match self { + AnyEntity::ItemFrame(item_frame) => Some(&item_frame.entity), + AnyEntity::GlowingItemFrame(glowing_item_frame) => Some(&glowing_item_frame.item_frame.entity), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut ItemFrame> { + match self { + AnyEntity::ItemFrame(item_frame) => Some(item_frame), + AnyEntity::GlowingItemFrame(glowing_item_frame) => Some(&mut glowing_item_frame.item_frame), + _ => None, + } + } +} + #[derive(Default)] #[MinecraftEntity( parents { ItemFrame, Entity }, diff --git a/minecraft-entities/src/lib.rs b/minecraft-entities/src/lib.rs index e70ce69d..7d557c4b 100644 --- a/minecraft-entities/src/lib.rs +++ b/minecraft-entities/src/lib.rs @@ -54,12 +54,8 @@ type CallBack1 = fn(O, I) -> Pin>>; type CallBack2 = fn(O, I, J) -> Pin>>; trait TryAsEntityRef { - fn try_as_entity_ref(&self) -> Option<&T> { - None - } - fn try_as_entity_mut(&mut self) -> Option<&mut T> { - None - } + fn try_as_entity_ref(&self) -> Option<&T>; + fn try_as_entity_mut(&mut self) -> Option<&mut T>; } trait WorldTest { diff --git a/minecraft-entities/src/living_entity.rs b/minecraft-entities/src/living_entity.rs index 2a9c68f9..fac081ea 100644 --- a/minecraft-entities/src/living_entity.rs +++ b/minecraft-entities/src/living_entity.rs @@ -33,6 +33,30 @@ impl Default for LivingEntity { } } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&LivingEntity> { + match self { + AnyEntity::LivingEntity(living_entity) => return Some(living_entity), + AnyEntity::Player(player) => return Some(&player.living_entity), + _ => (), + } + if let Some(mob) = self.try_as_entity_ref::() { + return mob.living_entity.try_as_entity_ref(); + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut LivingEntity> { + match self { + AnyEntity::LivingEntity(living_entity) => return Some(living_entity), + AnyEntity::Player(player) => return Some(&mut player.living_entity), + _ => (), + } + if let Some(mob) = self.try_as_entity_mut::() { + return mob.living_entity.try_as_entity_mut(); + } + } +} + #[MinecraftEntity( parents { LivingEntity, Entity }, )] diff --git a/minecraft-entities/src/mobs/flying.rs b/minecraft-entities/src/mobs/flying.rs index 7983cf1b..c3598f84 100644 --- a/minecraft-entities/src/mobs/flying.rs +++ b/minecraft-entities/src/mobs/flying.rs @@ -8,6 +8,26 @@ pub struct Flying { pub mob: Mob, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Flying> { + match self { + AnyEntity::Flying(flying) => Some(&flying), + AnyEntity::Bat(bat) => Some(&bat.flying), + AnyEntity::Ghast(ghast) => Some(&ghast.flying), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut Flying> { + match self { + AnyEntity::Flying(flying) => Some(flying), + AnyEntity::Bat(bat) => Some(&mut bat.flying), + AnyEntity::Ghast(ghast) => Some(&mut ghast.flying), + _ => None, + } + } +} + #[derive(Default)] #[MinecraftEntity( parents { Flying, Mob, LivingEntity, Entity }, diff --git a/minecraft-entities/src/mobs/golems.rs b/minecraft-entities/src/mobs/golems.rs index 229c561b..472ba744 100644 --- a/minecraft-entities/src/mobs/golems.rs +++ b/minecraft-entities/src/mobs/golems.rs @@ -8,6 +8,26 @@ pub struct AbstractGolem { pub pathfinder_mob: PathfinderMob, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&AbstractGolem> { + match self { + AnyEntity::AbstractGolem(abstract_golem) => Some(&abstract_golem), + AnyEntity::IronGolem(iron_golem) => Some(&iron_golem.abstract_golem), + AnyEntity::SnowGolem(snow_golem) => Some(&snow_golem.abstract_golem), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut AbstractGolem> { + match self { + AnyEntity::AbstractGolem(abstract_golem) => Some(abstract_golem), + AnyEntity::IronGolem(iron_golem) => Some(&mut iron_golem.abstract_golem), + AnyEntity::SnowGolem(snow_golem) => Some(&mut snow_golem.abstract_golem), + _ => None, + } + } +} + #[derive(Default)] #[MinecraftEntity( parents { AbstractGolem, PathfinderMob, Mob, LivingEntity, Entity }, diff --git a/minecraft-entities/src/mobs/mod.rs b/minecraft-entities/src/mobs/mod.rs index 96e425de..fb76cd8c 100644 --- a/minecraft-entities/src/mobs/mod.rs +++ b/minecraft-entities/src/mobs/mod.rs @@ -24,6 +24,36 @@ pub struct Mob { pub is_aggressive: bool, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&Mob> { + match self { + AnyEntity::Mob(mob) => return Some(&mob), + _ => (), + } + if let Some(ambient_creature) = self.try_as_entity_ref::() { + return ambient_creature.mob.try_as_entity_ref(); + } + if let Some(pathfinder_mob) = self.try_as_entity_ref::() { + return pathfinder_mob.mob.try_as_entity_ref(); + } + None + } + + fn try_as_entity_mut(&mut self) -> Option<&mut Mob> { + match self { + AnyEntity::Mob(mob) => return Some(mob), + _ => (), + } + if let Some(ambient_creature) = self.try_as_entity_mut::() { + return ambient_creature.mob.try_as_entity_mut(); + } + if let Some(pathfinder_mob) = self.try_as_entity_mut::() { + return pathfinder_mob.mob.try_as_entity_mut(); + } + None + } +} + #[derive(Default)] #[MinecraftEntity( inheritable, parents { Mob, LivingEntity, Entity }, @@ -32,6 +62,26 @@ pub struct AmbientCreature { pub mob: Mob, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&AmbientCreature> { + match self { + AnyEntity::AmbientCreature(ambient_creature) => return Some(&ambient_creature), + AnyEntity::Bat(bat) => return Some(&bat.ambient_creature), + _ => (), + } + None + } + + fn try_as_entity_mut(&mut self) -> Option<&mut AmbientCreature> { + match self { + AnyEntity::AmbientCreature(ambient_creature) => return Some(ambient_creature), + AnyEntity::Bat(bat) => return Some(&mut bat.ambient_creature), + _ => (), + } + None + } +} + #[derive(Default)] #[MinecraftEntity( inheritable, parents { Mob, LivingEntity, Entity }, @@ -40,6 +90,30 @@ pub struct PathfinderMob { pub mob: Mob, } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&PathfinderMob> { + match self { + AnyEntity::PathfinderMob(pathfinder_mob) => return Some(&pathfinder_mob), + _ => (), + } + if let Some(ageable_mob) = self.try_as_entity_ref::() { + return ageable_mob.pathfinder_mob.try_as_entity_ref(); + } + None + } + + fn try_as_entity_mut(&mut self) -> Option<&mut PathfinderMob> { + match self { + AnyEntity::PathfinderMob(pathfinder_mob) => return Some(pathfinder_mob), + _ => (), + } + if let Some(ageable_mob) = self.try_as_entity_mut::() { + return ageable_mob.pathfinder_mob.try_as_entity_mut(); + } + None + } +} + #[derive(Default)] #[MinecraftEntity( inheritable, parents { PathfinderMob, Mob, LivingEntity, Entity }, @@ -48,3 +122,27 @@ pub struct AgeableMob { pub pathfinder_mob: PathfinderMob, pub is_baby: bool, } + +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&AgeableMob> { + match self { + AnyEntity::AgeableMob(ageable_mob) => return Some(&ageable_mob), + _ => (), + } + if let Some(villager) = self.try_as_entity_ref::() { + return villager.try_as_entity_ref(); + } + None + } + + fn try_as_entity_mut(&mut self) -> Option<&mut AgeableMob> { + match self { + AnyEntity::AgeableMob(ageable_mob) => return Some(&mut ageable_mob), + _ => (), + } + if let Some(villager) = self.try_as_entity_mut::() { + return villager.try_as_entity_mut(); + } + None + } +} diff --git a/minecraft-entities/src/thrown_item_projectile.rs b/minecraft-entities/src/thrown_item_projectile.rs index 7ab40c85..af8c0423 100644 --- a/minecraft-entities/src/thrown_item_projectile.rs +++ b/minecraft-entities/src/thrown_item_projectile.rs @@ -17,6 +17,32 @@ impl Default for ThrownItemProjectile { } } +impl TryAsEntityRef for AnyEntity { + fn try_as_entity_ref(&self) -> Option<&ThrownItemProjectile> { + match self { + AnyEntity::ThrownItemProjectile(throwable) => Some(throwable), + AnyEntity::ThrownEgg(egg) => Some(&egg.thrown_item_projectile), + AnyEntity::ThrownEnderPearl(ender_pearl) => Some(&ender_pearl.thrown_item_projectile), + AnyEntity::ThrownExperienceBottle(experience_bottle) => Some(&experience_bottle.thrown_item_projectile), + AnyEntity::ThrownPotion(potion) => Some(&potion.thrown_item_projectile), + AnyEntity::Snowball(snowball) => Some(&snowball.thrown_item_projectile), + _ => None, + } + } + + fn try_as_entity_mut(&mut self) -> Option<&mut ThrownItemProjectile> { + match self { + AnyEntity::ThrownItemProjectile(throwable) => Some(throwable), + AnyEntity::ThrownEgg(egg) => Some(&mut egg.thrown_item_projectile), + AnyEntity::ThrownEnderPearl(ender_pearl) => Some(&mut ender_pearl.thrown_item_projectile), + AnyEntity::ThrownExperienceBottle(experience_bottle) => Some(&mut experience_bottle.thrown_item_projectile), + AnyEntity::ThrownPotion(potion) => Some(&mut potion.thrown_item_projectile), + AnyEntity::Snowball(snowball) => Some(&mut snowball.thrown_item_projectile), + _ => None, + } + } +} + #[MinecraftEntity( parents { ThrownItemProjectile, Entity }, )]