bool Monster::canWalkTo(Position pos, Direction dir) { if(getNoMove()) return false; switch(dir) { case NORTH: pos.y += -1; break; case WEST: pos.x += -1; break; case EAST: pos.x += 1; break; case SOUTH: pos.y += 1; break; default: break; } if(!isInSpawnRange(pos) || !getWalkCache(pos)) return false; Tile* tile = g_game.getTile(pos); if(!tile || g_game.isSwimmingPool(NULL, getTile(), false) != g_game.isSwimmingPool(NULL, tile, false)) // prevent monsters entering/exiting to swimming pool return false; return !tile->getTopVisibleCreature(this) && tile->__queryAdd( 0, this, 1, FLAG_PATHFINDING) == RET_NOERROR; }
void Creature::validateMapCache() { const Position& myPos = getPosition(); for(int32_t y = -((mapWalkHeight - 1) / 2); y <= ((mapWalkHeight - 1) / 2); ++y){ for(int32_t x = -((mapWalkWidth - 1) / 2); x <= ((mapWalkWidth - 1) / 2); ++x){ getWalkCache(Position(myPos.x + x, myPos.y + y, myPos.z)); } } }
bool Monster::canWalkTo(Position pos, Direction direction) const { pos = getNextPosition(direction, pos); if (isInSpawnRange(pos)) { if (getWalkCache(pos) == 0) { return false; } Tile* tile = g_game.map.getTile(pos); if (tile && tile->getTopVisibleCreature(this) == nullptr && tile->queryAdd(0, *this, 1, FLAG_PATHFINDING) == RETURNVALUE_NOERROR) { return true; } } return false; }
bool Monster::canWalkTo(Position pos, Direction dir) { if(getNoMove()) return false; switch(dir) { case NORTH: pos.y += -1; break; case WEST: pos.x += -1; break; case EAST: pos.x += 1; break; case SOUTH: pos.y += 1; break; default: break; } if(!isInSpawnRange(pos) || !getWalkCache(pos)) return false; Tile* tile = g_game.getTile(pos); if(!tile || g_game.isSwimmingPool(NULL, getTile(), false) != g_game.isSwimmingPool(NULL, tile, false)) // prevent monsters entering/exiting to swimming pool return false; /* // Check here // If we don't follow, or attack, and we can't handle the damage, then we can't move on this field MagicField* field = NULL; if(!followCreature && !attackedCreature && (field = tile->getFieldItem()) && !isImmune(field->getCombatType())) return false; */ return !tile->getTopVisibleCreature(this) && tile->__queryAdd( 0, this, 1, FLAG_PATHFINDING) == RET_NOERROR; }
bool Monster::canWalkTo(Position pos, Direction dir) { switch(dir) { case NORTH: pos.y += -1; break; case WEST: pos.x += -1; break; case EAST: pos.x += 1; break; case SOUTH: pos.y += 1; break; default: break; } if(isInSpawnRange(pos)) { if(getWalkCache(pos) == 0) return false; Tile* tile = g_game.getTile(pos.x, pos.y, pos.z); if(tile && tile->getTopVisibleCreature(this) == NULL && tile->__queryAdd(0, this, 1, FLAG_PATHFINDING) == RET_NOERROR) return true; } return false; }
bool Actor::canWalkTo(Position pos, Direction dir) { switch(dir.value()){ case enums::NORTH: pos.y += -1; break; case enums::WEST: pos.x += -1; break; case enums::EAST: pos.x += 1; break; case enums::SOUTH: pos.y += 1; break; default: break; } if(isInSpawnRange(pos)){ if(getWalkCache(pos) == 0){ return false; } Tile* tile = g_game.getParentTile(pos.x, pos.y, pos.z); if(tile && tile->getTopVisibleCreature(this) == NULL && tile->__queryAdd(0, this, 1, FLAG_PATHFINDING) == RET_NOERROR){ return true; } } return false; }