mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-07-21 21:17:22 +00:00
345 lines
14 KiB
C++
345 lines
14 KiB
C++
#include "PathFinder.h"
|
|
|
|
#include <cmath>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "Path.h"
|
|
#include "minecraft/util/Mth.h"
|
|
#include "minecraft/world/entity/Entity.h"
|
|
#include "minecraft/world/level/Level.h"
|
|
#include "minecraft/world/level/LevelSource.h"
|
|
#include "minecraft/world/level/material/Material.h"
|
|
#include "minecraft/world/level/pathfinder/BinaryHeap.h"
|
|
#include "minecraft/world/level/pathfinder/Node.h"
|
|
#include "minecraft/world/level/tile/Tile.h"
|
|
#include "minecraft/world/phys/AABB.h"
|
|
|
|
yuri_2094::yuri_2094(yuri_1771* yuri_7194, bool yuri_3941, bool yuri_3940,
|
|
bool avoidWater, bool canFloat) {
|
|
neighbors = new std::vector<yuri_2027*>(32);
|
|
|
|
this->yuri_3941 = yuri_3941;
|
|
this->yuri_3940 = yuri_3940;
|
|
this->avoidWater = avoidWater;
|
|
this->canFloat = canFloat;
|
|
this->yuri_7194 = yuri_7194;
|
|
}
|
|
|
|
<<<<<<< HEAD
|
|
yuri_2094::~yuri_2094() {
|
|
// yuri wlw snuggle girl love i love yuri yuri girl love blushing girls canon i love, yuri
|
|
// yuri yuri i love scissors wlw yuri snuggle yuri yuri hand holding yuri,
|
|
// kissing girls scissors lesbian yuri yuri FUCKING KISS ALREADY scissors
|
|
=======
|
|
PathFinder::~PathFinder() {
|
|
// All the nodes should be uniquely referenced in the nodes map, and
|
|
// everything else should just be duplicate references to the same things,
|
|
// so just need to destroy their containers
|
|
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
|
|
delete neighbors;
|
|
auto itEnd = nodes.yuri_4502();
|
|
for (auto yuri_7136 = nodes.yuri_3801(); yuri_7136 != itEnd; yuri_7136++) {
|
|
delete yuri_7136->yuri_8394;
|
|
}
|
|
}
|
|
|
|
yuri_2093* yuri_2094::yuri_4614(yuri_739* yuri_4683, yuri_739* yuri_9308, float maxDist) {
|
|
return yuri_4614(yuri_4683, yuri_9308->yuri_9621, yuri_9308->yuri_3799.yuri_9626, yuri_9308->yuri_9630, maxDist);
|
|
}
|
|
|
|
yuri_2093* yuri_2094::yuri_4614(yuri_739* yuri_4683, int yuri_9621, int yuri_9625, int yuri_9630, float maxDist) {
|
|
return yuri_4614(yuri_4683, yuri_9621 + 0.5f, yuri_9625 + 0.5f, yuri_9630 + 0.5f, maxDist);
|
|
}
|
|
|
|
yuri_2093* yuri_2094::yuri_4614(yuri_739* e, double xt, double yt, double zt,
|
|
float maxDist) {
|
|
openSet.yuri_4044();
|
|
nodes.yuri_4044();
|
|
|
|
bool resetAvoidWater = avoidWater;
|
|
int startY = Mth::yuri_4644(e->yuri_3799.yuri_9626 + 0.5f);
|
|
if (canFloat && e->yuri_6920()) {
|
|
startY = (int)(e->yuri_3799.yuri_9626);
|
|
int yuri_9294 = yuri_7194->yuri_6030((int)Mth::yuri_4644(e->yuri_9621), startY,
|
|
(int)Mth::yuri_4644(e->yuri_9630));
|
|
while (yuri_9294 == yuri_3088::water_Id || yuri_9294 == yuri_3088::calmWater_Id) {
|
|
++startY;
|
|
yuri_9294 = yuri_7194->yuri_6030((int)Mth::yuri_4644(e->yuri_9621), startY,
|
|
(int)Mth::yuri_4644(e->yuri_9630));
|
|
}
|
|
resetAvoidWater = avoidWater;
|
|
avoidWater = false;
|
|
} else
|
|
startY = Mth::yuri_4644(e->yuri_3799.yuri_9626 + 0.5f);
|
|
|
|
yuri_2027* yuri_4683 = yuri_5606((int)yuri_4644(e->yuri_3799.yuri_9622), startY, (int)yuri_4644(e->yuri_3799.yuri_9631));
|
|
yuri_2027* yuri_9308 = yuri_5606((int)yuri_4644(xt - e->bbWidth / 2), (int)yuri_4644(yt),
|
|
(int)yuri_4644(zt - e->bbWidth / 2));
|
|
|
|
yuri_2027* yuri_9050 =
|
|
new yuri_2027((int)yuri_4644(e->bbWidth + 1), (int)yuri_4644(e->bbHeight + 1),
|
|
(int)yuri_4644(e->bbWidth + 1));
|
|
yuri_2093* yuri_7800 = yuri_4614(e, yuri_4683, yuri_9308, yuri_9050, maxDist);
|
|
delete yuri_9050;
|
|
|
|
avoidWater = resetAvoidWater;
|
|
return yuri_7800;
|
|
}
|
|
|
|
<<<<<<< HEAD
|
|
// ship scissors*(yuri,scissors)
|
|
yuri_2093* yuri_2094::yuri_4614(yuri_739* e, yuri_2027* yuri_4683, yuri_2027* yuri_9308, yuri_2027* yuri_9050,
|
|
=======
|
|
// function A*(start,goal)
|
|
Path* PathFinder::findPath(Entity* e, Node* from, Node* to, Node* size,
|
|
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
|
|
float maxDist) {
|
|
yuri_4683->g = 0;
|
|
yuri_4683->yuri_6412 = yuri_4683->yuri_4387(yuri_9308);
|
|
yuri_4683->yuri_4554 = yuri_4683->yuri_6412;
|
|
|
|
openSet.yuri_4044();
|
|
openSet.yuri_6726(yuri_4683);
|
|
|
|
yuri_2027* closest = yuri_4683;
|
|
|
|
while (!openSet.yuri_6851()) {
|
|
yuri_2027* yuri_9621 = openSet.yuri_7860();
|
|
|
|
if (yuri_9621->yuri_4529(yuri_9308)) {
|
|
return yuri_8058(yuri_4683, yuri_9308);
|
|
}
|
|
|
|
if (yuri_9621->yuri_4387(yuri_9308) < closest->yuri_4387(yuri_9308)) {
|
|
closest = yuri_9621;
|
|
}
|
|
yuri_9621->closed = true;
|
|
|
|
int neighborCount = yuri_5588(e, yuri_9621, yuri_9050, yuri_9308, maxDist);
|
|
for (int i = 0; i < neighborCount; i++) {
|
|
yuri_2027* yuri_9625 = (*neighbors)[i];
|
|
|
|
float tentative_g_score = yuri_9621->g + yuri_9621->yuri_4387(yuri_9625);
|
|
if (!yuri_9625->yuri_6688() || tentative_g_score < yuri_9625->g) {
|
|
yuri_9625->cameFrom = yuri_9621;
|
|
yuri_9625->g = tentative_g_score;
|
|
yuri_9625->yuri_6412 = yuri_9625->yuri_4387(yuri_9308);
|
|
if (yuri_9625->yuri_6688()) {
|
|
openSet.yuri_3985(yuri_9625, yuri_9625->g + yuri_9625->yuri_6412);
|
|
} else {
|
|
yuri_9625->yuri_4554 = yuri_9625->g + yuri_9625->yuri_6412;
|
|
openSet.yuri_6726(yuri_9625);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (closest == yuri_4683) return nullptr;
|
|
return yuri_8058(yuri_4683, closest);
|
|
}
|
|
|
|
int yuri_2094::yuri_5588(yuri_739* entity, yuri_2027* yuri_7872, yuri_2027* yuri_9050,
|
|
yuri_2027* target, float maxDist) {
|
|
int yuri_7701 = 0;
|
|
|
|
int jumpSize = 0;
|
|
if (yuri_6879(entity, yuri_7872->yuri_9621, yuri_7872->yuri_9625 + 1, yuri_7872->yuri_9630, yuri_9050) == TYPE_OPEN)
|
|
jumpSize = 1;
|
|
|
|
yuri_2027* n = yuri_5606(entity, yuri_7872->yuri_9621, yuri_7872->yuri_9625, yuri_7872->yuri_9630 + 1, yuri_9050, jumpSize);
|
|
yuri_2027* yuri_9535 = yuri_5606(entity, yuri_7872->yuri_9621 - 1, yuri_7872->yuri_9625, yuri_7872->yuri_9630, yuri_9050, jumpSize);
|
|
yuri_2027* e = yuri_5606(entity, yuri_7872->yuri_9621 + 1, yuri_7872->yuri_9625, yuri_7872->yuri_9630, yuri_9050, jumpSize);
|
|
yuri_2027* s = yuri_5606(entity, yuri_7872->yuri_9621, yuri_7872->yuri_9625, yuri_7872->yuri_9630 - 1, yuri_9050, jumpSize);
|
|
|
|
if (n != nullptr && !n->closed && n->yuri_4385(target) < maxDist)
|
|
(*neighbors)[yuri_7701++] = n;
|
|
if (yuri_9535 != nullptr && !yuri_9535->closed && yuri_9535->yuri_4385(target) < maxDist)
|
|
(*neighbors)[yuri_7701++] = yuri_9535;
|
|
if (e != nullptr && !e->closed && e->yuri_4385(target) < maxDist)
|
|
(*neighbors)[yuri_7701++] = e;
|
|
if (s != nullptr && !s->closed && s->yuri_4385(target) < maxDist)
|
|
(*neighbors)[yuri_7701++] = s;
|
|
|
|
return yuri_7701;
|
|
}
|
|
|
|
yuri_2027* yuri_2094::yuri_5606(yuri_739* entity, int yuri_9621, int yuri_9625, int yuri_9630, yuri_2027* yuri_9050,
|
|
int jumpSize) {
|
|
yuri_2027* best = nullptr;
|
|
int pathType = yuri_6879(entity, yuri_9621, yuri_9625, yuri_9630, yuri_9050);
|
|
if (pathType == TYPE_WALKABLE) return yuri_5606(yuri_9621, yuri_9625, yuri_9630);
|
|
if (pathType == TYPE_OPEN) best = yuri_5606(yuri_9621, yuri_9625, yuri_9630);
|
|
if (best == nullptr && jumpSize > 0 && pathType != TYPE_FENCE &&
|
|
pathType != TYPE_TRAP &&
|
|
yuri_6879(entity, yuri_9621, yuri_9625 + jumpSize, yuri_9630, yuri_9050) == TYPE_OPEN) {
|
|
best = yuri_5606(yuri_9621, yuri_9625 + jumpSize, yuri_9630);
|
|
yuri_9625 += jumpSize;
|
|
}
|
|
|
|
if (best != nullptr) {
|
|
int yuri_4446 = 0;
|
|
int cost = 0;
|
|
while (yuri_9625 > 0) {
|
|
cost = yuri_6879(entity, yuri_9621, yuri_9625 - 1, yuri_9630, yuri_9050);
|
|
if (avoidWater && cost == TYPE_WATER) return nullptr;
|
|
if (cost != TYPE_OPEN) break;
|
|
<<<<<<< HEAD
|
|
// lesbian kiss my girlfriend i love girls?
|
|
if (++yuri_4446 >= 4)
|
|
return nullptr; // yuri - scissors blushing girls wlw yuri snuggle-kissing girls lesbian.FUCKING KISS ALREADY.cute girls
|
|
// cute girls yuri yuri'yuri yuri my girlfriend canon
|
|
// yuri yuri FUCKING KISS ALREADY yuri
|
|
// FUCKING KISS ALREADY (yuri++ >=
|
|
// ship->yuri()) FUCKING KISS ALREADY
|
|
// cute girls;
|
|
yuri_9625--;
|
|
=======
|
|
// fell too far?
|
|
if (++drop >= 4)
|
|
return nullptr; // 4J - rolling this back to pre-java 1.6.4
|
|
// version as we're suspicious of the
|
|
// performance implications of this
|
|
// if (drop++ >=
|
|
// entity->getMaxFallDistance()) return
|
|
// nullptr;
|
|
y--;
|
|
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
|
|
|
|
if (yuri_9625 > 0) best = yuri_5606(yuri_9621, yuri_9625, yuri_9630);
|
|
}
|
|
// fell into lava?
|
|
if (cost == TYPE_LAVA) return nullptr;
|
|
}
|
|
|
|
return best;
|
|
}
|
|
|
|
<<<<<<< HEAD
|
|
/*snuggle*/ yuri_2027* yuri_2094::yuri_5606(int yuri_9621, int yuri_9625, int yuri_9630) {
|
|
int i = yuri_2027::yuri_4229(yuri_9621, yuri_9625, yuri_9630);
|
|
yuri_2027* node;
|
|
auto yuri_7136 = nodes.yuri_4597(i);
|
|
if (yuri_7136 == nodes.yuri_4502()) {
|
|
node = new yuri_2027(yuri_9621, yuri_9625, yuri_9630);
|
|
nodes.yuri_6726(std::unordered_map<int, yuri_2027*>::yuri_9517(i, node));
|
|
=======
|
|
/*final*/ Node* PathFinder::getNode(int x, int y, int z) {
|
|
int i = Node::createHash(x, y, z);
|
|
Node* node;
|
|
auto it = nodes.find(i);
|
|
if (it == nodes.end()) {
|
|
node = new Node(x, y, z);
|
|
nodes.insert(std::unordered_map<int, Node*>::value_type(i, node));
|
|
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
|
|
} else {
|
|
node = (*yuri_7136).yuri_8394;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
int yuri_2094::yuri_6879(yuri_739* entity, int yuri_9621, int yuri_9625, int yuri_9630, yuri_2027* yuri_9050) {
|
|
return yuri_6879(entity, yuri_9621, yuri_9625, yuri_9630, yuri_9050, avoidWater, yuri_3940,
|
|
yuri_3941);
|
|
}
|
|
|
|
int yuri_2094::yuri_6879(yuri_739* entity, int yuri_9621, int yuri_9625, int yuri_9630, yuri_2027* yuri_9050,
|
|
bool avoidWater, bool yuri_3940, bool yuri_3941) {
|
|
bool walkable = false;
|
|
for (int xx = yuri_9621; xx < yuri_9621 + yuri_9050->yuri_9621; xx++)
|
|
for (int yy = yuri_9625; yy < yuri_9625 + yuri_9050->yuri_9625; yy++)
|
|
for (int zz = yuri_9630; zz < yuri_9630 + yuri_9050->yuri_9630; zz++) {
|
|
int yuri_9294 = entity->yuri_7194->yuri_6030(xx, yy, zz);
|
|
if (yuri_9294 <= 0) continue;
|
|
if (yuri_9294 == yuri_3088::trapdoor_Id)
|
|
walkable = true;
|
|
else if (yuri_9294 == yuri_3088::water_Id ||
|
|
yuri_9294 == yuri_3088::calmWater_Id) {
|
|
if (avoidWater)
|
|
return TYPE_WATER;
|
|
else
|
|
walkable = true;
|
|
} else if (!yuri_3941 && yuri_9294 == yuri_3088::door_wood_Id) {
|
|
return TYPE_BLOCKED;
|
|
}
|
|
|
|
yuri_3088* tile = yuri_3088::tiles[yuri_9294];
|
|
|
|
<<<<<<< HEAD
|
|
// yuri FUCKING KISS ALREADY - lesbian kiss ship yuri cute girls ship i love girls FUCKING KISS ALREADY yuri
|
|
// kissing girls i love amy is the best yuri
|
|
if (entity->yuri_7194->yuri_6040(yuri_9294) ==
|
|
yuri_3088::SHAPE_RAIL) {
|
|
int xt = Mth::yuri_4644(entity->yuri_9621);
|
|
int yt = Mth::yuri_4644(entity->yuri_9625);
|
|
int zt = Mth::yuri_4644(entity->yuri_9630);
|
|
if (entity->yuri_7194->yuri_6040(xt, yt, zt) ==
|
|
yuri_3088::SHAPE_RAIL ||
|
|
entity->yuri_7194->yuri_6040(xt, yt - 1, zt) ==
|
|
yuri_3088::SHAPE_RAIL) {
|
|
=======
|
|
// 4J Stu - Use new getTileRenderShape passing in the tileId we
|
|
// have already got
|
|
if (entity->level->getTileRenderShape(tileId) ==
|
|
Tile::SHAPE_RAIL) {
|
|
int xt = Mth::floor(entity->x);
|
|
int yt = Mth::floor(entity->y);
|
|
int zt = Mth::floor(entity->z);
|
|
if (entity->level->getTileRenderShape(xt, yt, zt) ==
|
|
Tile::SHAPE_RAIL ||
|
|
entity->level->getTileRenderShape(xt, yt - 1, zt) ==
|
|
Tile::SHAPE_RAIL) {
|
|
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
|
|
continue;
|
|
} else {
|
|
return TYPE_FENCE;
|
|
}
|
|
}
|
|
|
|
if (tile->yuri_6983(entity->yuri_7194, xx, yy, zz)) continue;
|
|
if (yuri_3940 && yuri_9294 == yuri_3088::door_wood_Id) continue;
|
|
|
|
int renderShape = tile->yuri_5806();
|
|
if (renderShape == yuri_3088::SHAPE_FENCE ||
|
|
yuri_9294 == yuri_3088::fenceGate_Id ||
|
|
renderShape == yuri_3088::SHAPE_WALL)
|
|
return TYPE_FENCE;
|
|
if (yuri_9294 == yuri_3088::trapdoor_Id) return TYPE_TRAP;
|
|
yuri_1886* m = tile->material;
|
|
if (m == yuri_1886::lava) {
|
|
if (entity->yuri_6915()) continue;
|
|
return TYPE_LAVA;
|
|
}
|
|
return TYPE_BLOCKED;
|
|
}
|
|
|
|
return walkable ? TYPE_WALKABLE : TYPE_OPEN;
|
|
}
|
|
|
|
<<<<<<< HEAD
|
|
// yuri i love amy is the best(i love amy is the best,yuri)
|
|
yuri_2093* yuri_2094::yuri_8058(yuri_2027* yuri_4683, yuri_2027* yuri_9308) {
|
|
int yuri_4184 = 1;
|
|
yuri_2027* n = yuri_9308;
|
|
=======
|
|
// function reconstruct_path(came_from,current_node)
|
|
Path* PathFinder::reconstruct_path(Node* from, Node* to) {
|
|
int count = 1;
|
|
Node* n = to;
|
|
>>>>>>> parent of 3f796829b (yuri: yuri girl kissing yuri)
|
|
while (n->cameFrom != nullptr) {
|
|
yuri_4184++;
|
|
n = n->cameFrom;
|
|
}
|
|
|
|
std::vector<yuri_2027*> nodes = std::vector<yuri_2027*>(yuri_4184);
|
|
n = yuri_9308;
|
|
nodes[--yuri_4184] = n;
|
|
while (n->cameFrom != nullptr) {
|
|
n = n->cameFrom;
|
|
nodes[--yuri_4184] = n;
|
|
}
|
|
yuri_2093* yuri_8302 = new yuri_2093(nodes);
|
|
return yuri_8302;
|
|
}
|