#include "../../Platform/stdafx.h" #include "../../Headers/net.minecraft.world.entity.h" #include "../../Headers/net.minecraft.world.entity.ai.navigation.h" #include "../../Headers/net.minecraft.world.level.h" #include "../../Headers/net.minecraft.world.level.pathfinder.h" #include "../../Headers/net.minecraft.world.level.tile.h" #include "DoorInteractGoal.h" DoorInteractGoal::DoorInteractGoal(Mob* mob) { doorX = doorY = doorZ = 0; doorTile = NULL; passed = false; doorOpenDirX = doorOpenDirZ = 0.0f; this->mob = mob; } bool DoorInteractGoal::canUse() { if (!mob->horizontalCollision) return false; PathNavigation* pathNav = mob->getNavigation(); Path* path = pathNav->getPath(); if (path == NULL || path->isDone() || !pathNav->canOpenDoors()) return false; for (int i = 0; i < std::min(path->getIndex() + 2, path->getSize()); ++i) { Node* n = path->get(i); doorX = n->x; doorY = n->y + 1; doorZ = n->z; if (mob->distanceToSqr(doorX, mob->y, doorZ) > 1.5 * 1.5) continue; doorTile = getDoorTile(doorX, doorY, doorZ); if (doorTile == NULL) continue; return true; } doorX = Mth::floor(mob->x); doorY = Mth::floor(mob->y + 1); doorZ = Mth::floor(mob->z); doorTile = getDoorTile(doorX, doorY, doorZ); return doorTile != NULL; } bool DoorInteractGoal::canContinueToUse() { return !passed; } void DoorInteractGoal::start() { passed = false; doorOpenDirX = (float)(doorX + 0.5f - mob->x); doorOpenDirZ = (float)(doorZ + 0.5f - mob->z); } void DoorInteractGoal::tick() { float newDoorDirX = (float)(doorX + 0.5f - mob->x); float newDoorDirZ = (float)(doorZ + 0.5f - mob->z); float dot = doorOpenDirX * newDoorDirX + doorOpenDirZ * newDoorDirZ; if (dot < 0) { passed = true; } } DoorTile* DoorInteractGoal::getDoorTile(int x, int y, int z) { int tileId = mob->level->getTile(x, y, z); if (tileId != Tile::door_wood_Id) return NULL; return (DoorTile*)Tile::tiles[tileId]; }