2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "net.minecraft.world.entity.ai.control.h"
# include "net.minecraft.world.entity.ai.goal.h"
# include "net.minecraft.world.entity.ai.navigation.h"
# include "net.minecraft.world.entity.npc.h"
# include "net.minecraft.world.entity.animal.h"
# include "net.minecraft.world.level.h"
# include "net.minecraft.world.phys.h"
# include "TakeFlowerGoal.h"
TakeFlowerGoal : : TakeFlowerGoal ( Villager * villager )
{
takeFlower = false ;
pickupTick = 0 ;
golem = weak_ptr < VillagerGolem > ( ) ;
this - > villager = villager ;
setRequiredControlFlags ( Control : : MoveControlFlag | Control : : LookControlFlag ) ;
}
bool TakeFlowerGoal : : canUse ( )
{
if ( villager - > getAge ( ) > = 0 ) return false ;
if ( ! villager - > level - > isDay ( ) ) return false ;
2026-03-02 17:37:16 +07:00
vector < shared_ptr < Entity > > * golems = villager - > level - > getEntitiesOfClass ( typeid ( VillagerGolem ) , villager - > bb - > grow ( 6 , 2 , 6 ) ) ;
2026-03-06 02:11:18 +07:00
if ( golems = = nullptr )
return false ;
if ( golems - > size ( ) = = 0 )
2026-03-01 12:16:08 +08:00
{
delete golems ;
return false ;
}
2026-03-06 02:11:18 +07:00
for ( auto entity : * golems )
{
if ( entity = = nullptr )
continue ;
// safe to call std::static_pointer_cast because of getEntitiesOfClass(typeid(VillagerGolem), ...) makes sure we do not have entities of any other type.
auto vg = std : : static_pointer_cast < VillagerGolem > ( entity ) ;
if ( vg & & vg - > getOfferFlowerTick ( ) > 0 )
2026-03-01 12:16:08 +08:00
{
2026-03-06 02:11:18 +07:00
golem = vg ;
delete golems ;
return true ;
2026-03-01 12:16:08 +08:00
}
}
delete golems ;
2026-03-06 02:11:18 +07:00
return false ;
2026-03-01 12:16:08 +08:00
}
bool TakeFlowerGoal : : canContinueToUse ( )
{
2026-03-08 19:08:36 -04:00
return golem . lock ( ) ! = nullptr & & golem . lock ( ) - > getOfferFlowerTick ( ) > 0 ;
2026-03-01 12:16:08 +08:00
}
void TakeFlowerGoal : : start ( )
{
2026-03-08 19:08:36 -04:00
pickupTick = villager - > getRandom ( ) - > nextInt ( static_cast < int > ( OfferFlowerGoal : : OFFER_TICKS * 0.8 ) ) ;
2026-03-01 12:16:08 +08:00
takeFlower = false ;
golem . lock ( ) - > getNavigation ( ) - > stop ( ) ;
}
void TakeFlowerGoal : : stop ( )
{
golem = weak_ptr < VillagerGolem > ( ) ;
villager - > getNavigation ( ) - > stop ( ) ;
}
void TakeFlowerGoal : : tick ( )
{
villager - > getLookControl ( ) - > setLookAt ( golem . lock ( ) , 30 , 30 ) ;
if ( golem . lock ( ) - > getOfferFlowerTick ( ) = = pickupTick )
{
2026-03-03 03:04:10 +08:00
villager - > getNavigation ( ) - > moveTo ( golem . lock ( ) , 0.5f ) ;
2026-03-01 12:16:08 +08:00
takeFlower = true ;
}
if ( takeFlower )
{
if ( villager - > distanceToSqr ( golem . lock ( ) ) < 2 * 2 )
{
golem . lock ( ) - > offerFlower ( false ) ;
villager - > getNavigation ( ) - > stop ( ) ;
}
}
}