This commit is contained in:
aozhiwei 2023-02-08 11:50:53 +08:00
parent eea6cbdeec
commit 68b35769ac
13 changed files with 122 additions and 13 deletions

View File

@ -6,7 +6,7 @@
#include "player.h" #include "player.h"
#include "app.h" #include "app.h"
static bool EnableDebug() bool DebugCmd::Enable()
{ {
return App::Instance()->instance_id == 6; return App::Instance()->instance_id == 6;
} }
@ -17,7 +17,7 @@ void DebugCmd::CreateSphere(Creature* c,
int uniid) int uniid)
{ {
if (c->IsPlayer() && EnableDebug()) { if (c->IsPlayer() && Enable()) {
cs::SMDebugCmd msg; cs::SMDebugCmd msg;
msg.set_cmd("create_sphere"); msg.set_cmd("create_sphere");
msg.add_params(pos.x); msg.add_params(pos.x);
@ -40,7 +40,7 @@ void DebugCmd::CreateCube(Creature* c,
const glm::quat& rotation, const glm::quat& rotation,
int uniid) int uniid)
{ {
if (c->IsPlayer() && EnableDebug()) { if (c->IsPlayer() && Enable()) {
cs::SMDebugCmd msg; cs::SMDebugCmd msg;
msg.set_cmd("create_cube"); msg.set_cmd("create_cube");
msg.add_params(pos.x); msg.add_params(pos.x);
@ -64,7 +64,7 @@ void DebugCmd::CreateCube(Creature* c,
void DebugCmd::DestoryGameObject(Creature* c, int uniid) void DebugCmd::DestoryGameObject(Creature* c, int uniid)
{ {
if (c->IsPlayer() && EnableDebug()) { if (c->IsPlayer() && Enable()) {
cs::SMDebugCmd msg; cs::SMDebugCmd msg;
msg.set_cmd("destory_gameobject"); msg.set_cmd("destory_gameobject");

View File

@ -10,6 +10,8 @@ class DebugCmd
{ {
public: public:
static bool Enable();
static void CreateSphere(Creature* c, static void CreateSphere(Creature* c,
const glm::vec3& pos, const glm::vec3& pos,
const glm::vec3& scale, const glm::vec3& scale,

View File

@ -16,10 +16,10 @@ namespace mc
static void Quat_Read(glm::quat& v, std::shared_ptr<a8::XObject> xobj) static void Quat_Read(glm::quat& v, std::shared_ptr<a8::XObject> xobj)
{ {
v.x = xobj->At("x")->AsXValue().GetDouble() * MAP_SCALE; v.x = xobj->At("x")->AsXValue().GetDouble();
v.y = xobj->At("y")->AsXValue().GetDouble() * MAP_SCALE; v.y = xobj->At("y")->AsXValue().GetDouble();
v.z = xobj->At("z")->AsXValue().GetDouble() * MAP_SCALE; v.z = xobj->At("z")->AsXValue().GetDouble();
v.w = xobj->At("w")->AsXValue().GetDouble() * MAP_SCALE; v.w = xobj->At("w")->AsXValue().GetDouble();
} }
static void Bounds_Read(Bounds& v, std::shared_ptr<a8::XObject> xobj) static void Bounds_Read(Bounds& v, std::shared_ptr<a8::XObject> xobj)

View File

@ -20,7 +20,6 @@ namespace mc
kCA_Roof = 2,//屋顶 kCA_Roof = 2,//屋顶
kCA_FloororRoof = 3,//屋顶+上层地板 kCA_FloororRoof = 3,//屋顶+上层地板
kCA_Stairs = 4,//楼梯 kCA_Stairs = 4,//楼梯
kCA_NoJump = 4,//不可跳伞
kCA_Window = 9,//窗,主要为了射击穿透 kCA_Window = 9,//窗,主要为了射击穿透
kCA_Other = 10,//其他,装饰品 kCA_Other = 10,//其他,装饰品
}; };

View File

@ -26,8 +26,6 @@
#include "navmesh.pb.h" #include "navmesh.pb.h"
const int MAP_HEIGHT_GRID_SIZE = 64;
static const int NAV_ERROR_NEARESTPOLY = -2; static const int NAV_ERROR_NEARESTPOLY = -2;
static const int NAV_ERROR = -1; static const int NAV_ERROR = -1;
@ -170,6 +168,7 @@ void MapInstance::Init()
navmesh_query_ = new dtNavMeshQuery(); navmesh_query_ = new dtNavMeshQuery();
navmesh_query_->init(navmesh_, 1024); navmesh_query_->init(navmesh_, 1024);
MarkMapAreaPolys(); MarkMapAreaPolys();
LoadHouse();
} }
void MapInstance::UnInit() void MapInstance::UnInit()
@ -722,3 +721,80 @@ void MapInstance::CheckTerrain(Creature* c, int same_poly_flags, const std::vect
} }
} }
} }
void MapInstance::TraverseHouseList(std::function<void (HouseInfo*)> func)
{
}
bool MapInstance::PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt)
{
return false;
}
void MapInstance::LoadHouse()
{
if (GetMapMeta()->collider_info) {
mc::ColliderNode* building_root = GetMapMeta()->collider_info->GetNode("building");
if (building_root) {
for (auto& pair : building_root->childs) {
auto node = pair.second;
std::vector<glm::vec3> points;
{
glm::vec3 center = node->bounds.center;
glm::vec3 size = node->bounds.size;
points.push_back
(glm::vec3
(
center.x - size.x / 2,
center.y - size.y / 2,
center.z - size.z / 2
)
);
points.push_back
(glm::vec3
(
center.x + size.x / 2,
center.y - size.y / 2,
center.z - size.z / 2
)
);
points.push_back
(glm::vec3
(
center.x + size.x / 2,
center.y - size.y / 2,
center.z + size.z / 2
)
);
points.push_back
(glm::vec3
(
center.x - size.x / 2,
center.y - size.y / 2,
center.z + size.z / 2
)
);
}
{
std::string data = "old: " + node->name + " ";
for (auto& point : points) {
data += a8::Format("%f,%f,%f ", {point.x, point.y, point.z});
}
for (auto& point : points) {
point = node->transform.local_rotation * point;
}
data += "\nnew:";
for (auto& point : points) {
data += a8::Format("%f,%f,%f ", {point.x, point.y, point.z});
}
a8::XPrintf("%s\n", {data});
}
HouseInfo p;
p.node = node;
houses_.push_back(p);
}
}
}
}

View File

@ -5,6 +5,17 @@
const int MAX_POLYS = 256; const int MAX_POLYS = 256;
namespace mc
{
class ColliderNode;
};
struct HouseInfo
{
mc::ColliderNode* node = nullptr;
std::vector<float> verts;
};
class Entity; class Entity;
class Obstacle; class Obstacle;
class MapService; class MapService;
@ -44,9 +55,12 @@ class MapInstance : public std::enable_shared_from_this<MapInstance>
void UnScale(glm::vec3& v); void UnScale(glm::vec3& v);
glm::vec3 UnScaleEx(const glm::vec3& v); glm::vec3 UnScaleEx(const glm::vec3& v);
void CheckTerrain(Creature* c, int same_poly_flags, const std::vector<dtPolyRef>& spec_polys); void CheckTerrain(Creature* c, int same_poly_flags, const std::vector<dtPolyRef>& spec_polys);
void TraverseHouseList(std::function<void (HouseInfo*)> func);
bool PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt);
private: private:
void CreateThings(); void CreateThings();
void LoadHouse();
int AllocUniid(); int AllocUniid();
void MarkMapAreaPolys(); void MarkMapAreaPolys();
@ -63,6 +77,8 @@ class MapInstance : public std::enable_shared_from_this<MapInstance>
std::vector<int> poly_ext_datas_; std::vector<int> poly_ext_datas_;
std::list<HouseInfo> houses_;
std::string map_tpl_name_; std::string map_tpl_name_;
const mt::Map* map_meta_ = nullptr; const mt::Map* map_meta_ = nullptr;
MapService* map_service_ = nullptr; MapService* map_service_ = nullptr;

View File

@ -1,6 +1,7 @@
#include "precompile.h" #include "precompile.h"
#include "mt/Map.h" #include "mt/Map.h"
#include "mt/MapCollider.h"
#include "mt/SafeArea.h" #include "mt/SafeArea.h"
IMPL_TABLE(mt::Map) IMPL_TABLE(mt::Map)
@ -117,6 +118,7 @@ namespace mt
if (!IsPveMap() && player() < 10) { if (!IsPveMap() && player() < 10) {
A8_ABORT(); A8_ABORT();
} }
collider_info = MapCollider::GetByName(map_collider());
} }
void Map::Init2() void Map::Init2()

View File

@ -5,6 +5,7 @@
namespace mt namespace mt
{ {
class MapCollider;
DECLARE_ID_TABLE(Map, mtb::Map, DECLARE_ID_TABLE(Map, mtb::Map,
"map@map.json", "map@map.json",
@ -22,6 +23,7 @@ namespace mt
glm::vec3 first_safearea_center_; glm::vec3 first_safearea_center_;
std::map<int, int> car_num_limit_; std::map<int, int> car_num_limit_;
std::vector<int> safearea_list; std::vector<int> safearea_list;
MapCollider* collider_info = nullptr;
std::string RandTemplate() const; std::string RandTemplate() const;
int GetCarLimit(int car_id) const; int GetCarLimit(int car_id) const;

View File

@ -51,4 +51,10 @@ namespace mt
} }
} }
mc::ColliderNode* MapCollider::GetNode(const std::string& name)
{
auto itr = nodes_.find(name);
return itr != nodes_.end() ? itr->second : nullptr;
}
} }

View File

@ -21,6 +21,7 @@ namespace mt
public: public:
void Load(const std::string& filename); void Load(const std::string& filename);
mc::ColliderNode* GetNode(const std::string& name);
private: private:
std::map<std::string, mc::ColliderNode*> nodes_; std::map<std::string, mc::ColliderNode*> nodes_;

View File

@ -28,6 +28,7 @@ namespace mtb
const std::string airraids() const { return airraids_; }; const std::string airraids() const { return airraids_; };
const std::string car_num_limit() const { return car_num_limit_; }; const std::string car_num_limit() const { return car_num_limit_; };
float scale() const { return scale_; }; float scale() const { return scale_; };
const std::string map_collider() const { return map_collider_; };
bool has_map_id() const { return __flags__.test(0);}; bool has_map_id() const { return __flags__.test(0);};
bool has_template_list() const { return __flags__.test(1);}; bool has_template_list() const { return __flags__.test(1);};
@ -47,6 +48,7 @@ namespace mtb
bool has_airraids() const { return __flags__.test(15);}; bool has_airraids() const { return __flags__.test(15);};
bool has_car_num_limit() const { return __flags__.test(16);}; bool has_car_num_limit() const { return __flags__.test(16);};
bool has_scale() const { return __flags__.test(17);}; bool has_scale() const { return __flags__.test(17);};
bool has_map_collider() const { return __flags__.test(18);};
protected: protected:
@ -68,9 +70,10 @@ namespace mtb
std::string airraids_; std::string airraids_;
std::string car_num_limit_; std::string car_num_limit_;
float scale_ = 0.0f; float scale_ = 0.0f;
std::string map_collider_;
public: public:
std::bitset<18> __flags__; std::bitset<19> __flags__;
}; };
}; };

View File

@ -64,7 +64,7 @@ namespace mtb
{ {
a8::reflect::Class* meta_class = nullptr; a8::reflect::Class* meta_class = nullptr;
if (!meta_class) { if (!meta_class) {
meta_class = new a8::reflect::Class("Map", 18, 0); meta_class = new a8::reflect::Class("Map", 19, 0);
meta_class->SetSimpleField(0, "map_id", a8::reflect::ET_INT32, my_offsetof2(Map, map_id_)); meta_class->SetSimpleField(0, "map_id", a8::reflect::ET_INT32, my_offsetof2(Map, map_id_));
meta_class->SetSimpleField(1, "template_list", a8::reflect::ET_STRING, my_offsetof2(Map, template_list_)); meta_class->SetSimpleField(1, "template_list", a8::reflect::ET_STRING, my_offsetof2(Map, template_list_));
meta_class->SetSimpleField(2, "map_name", a8::reflect::ET_STRING, my_offsetof2(Map, map_name_)); meta_class->SetSimpleField(2, "map_name", a8::reflect::ET_STRING, my_offsetof2(Map, map_name_));
@ -83,6 +83,7 @@ namespace mtb
meta_class->SetSimpleField(15, "airraids", a8::reflect::ET_STRING, my_offsetof2(Map, airraids_)); meta_class->SetSimpleField(15, "airraids", a8::reflect::ET_STRING, my_offsetof2(Map, airraids_));
meta_class->SetSimpleField(16, "car_num_limit", a8::reflect::ET_STRING, my_offsetof2(Map, car_num_limit_)); meta_class->SetSimpleField(16, "car_num_limit", a8::reflect::ET_STRING, my_offsetof2(Map, car_num_limit_));
meta_class->SetSimpleField(17, "scale", a8::reflect::ET_FLOAT, my_offsetof2(Map, scale_)); meta_class->SetSimpleField(17, "scale", a8::reflect::ET_FLOAT, my_offsetof2(Map, scale_));
meta_class->SetSimpleField(18, "map_collider", a8::reflect::ET_STRING, my_offsetof2(Map, map_collider_));
} }
return meta_class; return meta_class;
} }

View File

@ -33,6 +33,7 @@ message Map
optional string airraids = 16; optional string airraids = 16;
optional string car_num_limit = 17; optional string car_num_limit = 17;
optional float scale = 18; optional float scale = 18;
optional string map_collider = 19;
} }
message MapArea message MapArea