#include "../../Platform/stdafx.h" #include "../../Headers/net.minecraft.world.entity.h" #include "../../Headers/net.minecraft.world.entity.ai.control.h" #include "../../Headers/net.minecraft.world.entity.animal.h" #include "../../Headers/net.minecraft.world.entity.ai.navigation.h" #include "../../Headers/net.minecraft.world.entity.player.h" #include "../../Headers/net.minecraft.world.level.h" #include "../Navigation/RandomPos.h" #include "RunAroundLikeCrazyGoal.h" RunAroundLikeCrazyGoal::RunAroundLikeCrazyGoal(EntityHorse* mob, double speedModifier) { horse = mob; this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag); } bool RunAroundLikeCrazyGoal::canUse() { if (horse->isTamed() || horse->rider.lock() == NULL) return false; Vec3* pos = RandomPos::getPos( std::dynamic_pointer_cast(horse->shared_from_this()), 5, 4); if (pos == NULL) return false; posX = pos->x; posY = pos->y; posZ = pos->z; return true; } void RunAroundLikeCrazyGoal::start() { horse->getNavigation()->moveTo(posX, posY, posZ, speedModifier); } bool RunAroundLikeCrazyGoal::canContinueToUse() { return !horse->getNavigation()->isDone() && horse->rider.lock() != NULL; } void RunAroundLikeCrazyGoal::tick() { if (horse->getRandom()->nextInt(50) == 0) { if (horse->rider.lock()->instanceof(eTYPE_PLAYER)) { int temper = horse->getTemper(); int maxTemper = horse->getMaxTemper(); if (maxTemper > 0 && horse->getRandom()->nextInt(maxTemper) < temper) { horse->tameWithName( std::dynamic_pointer_cast(horse->rider.lock())); horse->level->broadcastEntityEvent( horse->shared_from_this(), EntityEvent::TAMING_SUCCEEDED); return; } horse->modifyTemper(5); } horse->rider.lock()->ride(nullptr); horse->rider = std::weak_ptr(); horse->makeMad(); horse->level->broadcastEntityEvent(horse->shared_from_this(), EntityEvent::TAMING_FAILED); } }