mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
I don't think this should open up any chance to exploit Trying to use a ZL to go somewhere else is still detected etc This should really cut down on false positives and we really can't see real cheater from all the noise this creates
91 lines
2.1 KiB
C++
91 lines
2.1 KiB
C++
#include "water_map_v1.h"
|
|
|
|
WaterMapV1::WaterMapV1() {
|
|
BSP_Root = nullptr;
|
|
}
|
|
|
|
WaterMapV1::~WaterMapV1() {
|
|
if (BSP_Root) {
|
|
delete[] BSP_Root;
|
|
}
|
|
}
|
|
|
|
WaterRegionType WaterMapV1::ReturnRegionType(const glm::vec3& location) const {
|
|
return BSPReturnRegionType(1, glm::vec3(location.y, location.x, location.z));
|
|
}
|
|
|
|
bool WaterMapV1::InWater(const glm::vec3& location) const {
|
|
return ReturnRegionType(location) == RegionTypeWater;
|
|
}
|
|
|
|
bool WaterMapV1::InVWater(const glm::vec3& location) const {
|
|
return ReturnRegionType(location) == RegionTypeVWater;
|
|
}
|
|
|
|
bool WaterMapV1::InLava(const glm::vec3& location) const {
|
|
return ReturnRegionType(location) == RegionTypeLava;
|
|
}
|
|
|
|
bool WaterMapV1::InLiquid(const glm::vec3& location) const {
|
|
return InWater(location) || InLava(location);
|
|
}
|
|
|
|
bool WaterMapV1::InPvP(const glm::vec3& location) const {
|
|
return ReturnRegionType(location) == RegionTypePVP;
|
|
}
|
|
|
|
bool WaterMapV1::InZoneLine(const glm::vec3& location) const {
|
|
return ReturnRegionType(location) == RegionTypeZoneLine;
|
|
}
|
|
|
|
bool WaterMapV1::Load(FILE *fp) {
|
|
uint32 bsp_tree_size;
|
|
if (fread(&bsp_tree_size, sizeof(bsp_tree_size), 1, fp) != 1) {
|
|
return false;
|
|
}
|
|
|
|
BSP_Root = new ZBSP_Node[bsp_tree_size];
|
|
if (!BSP_Root) {
|
|
return false;
|
|
}
|
|
|
|
if (fread(BSP_Root, sizeof(ZBSP_Node), bsp_tree_size, fp) != bsp_tree_size) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
WaterRegionType WaterMapV1::BSPReturnRegionType(int32 node_number, const glm::vec3& location) const {
|
|
float distance;
|
|
|
|
const ZBSP_Node *current_node = &BSP_Root[node_number - 1];
|
|
|
|
if ((current_node->left == 0) &&
|
|
(current_node->right == 0)) {
|
|
return (WaterRegionType)current_node->special;
|
|
}
|
|
|
|
distance = (location.x * current_node->normal[0]) +
|
|
(location.y * current_node->normal[1]) +
|
|
(location.z * current_node->normal[2]) +
|
|
current_node->splitdistance;
|
|
|
|
if (distance == 0.0f) {
|
|
return(RegionTypeNormal);
|
|
}
|
|
|
|
if (distance >0.0f) {
|
|
if (current_node->left == 0) {
|
|
return(RegionTypeNormal);
|
|
}
|
|
return BSPReturnRegionType(current_node->left, location);
|
|
}
|
|
|
|
if (current_node->right == 0) {
|
|
return(RegionTypeNormal);
|
|
}
|
|
|
|
return BSPReturnRegionType(current_node->right, location);
|
|
}
|