first commit
This commit is contained in:
73
Minecraft.World/DoorInteractGoal.cpp
Normal file
73
Minecraft.World/DoorInteractGoal.cpp
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "stdafx.h"
|
||||
#include "net.minecraft.world.entity.h"
|
||||
#include "net.minecraft.world.entity.ai.navigation.h"
|
||||
#include "net.minecraft.world.level.h"
|
||||
#include "net.minecraft.world.level.pathfinder.h"
|
||||
#include "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 < 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];
|
||||
}
|
||||
Reference in New Issue
Block a user