diff --git a/server/gameserver/debugcmd.cc b/server/gameserver/debugcmd.cc index f56f59cb..ef6a2c51 100644 --- a/server/gameserver/debugcmd.cc +++ b/server/gameserver/debugcmd.cc @@ -6,7 +6,7 @@ #include "player.h" #include "app.h" -static bool EnableDebug() +bool DebugCmd::Enable() { return App::Instance()->instance_id == 6; } @@ -17,7 +17,7 @@ void DebugCmd::CreateSphere(Creature* c, int uniid) { - if (c->IsPlayer() && EnableDebug()) { + if (c->IsPlayer() && Enable()) { cs::SMDebugCmd msg; msg.set_cmd("create_sphere"); msg.add_params(pos.x); @@ -40,7 +40,7 @@ void DebugCmd::CreateCube(Creature* c, const glm::quat& rotation, int uniid) { - if (c->IsPlayer() && EnableDebug()) { + if (c->IsPlayer() && Enable()) { cs::SMDebugCmd msg; msg.set_cmd("create_cube"); msg.add_params(pos.x); @@ -64,7 +64,7 @@ void DebugCmd::CreateCube(Creature* c, void DebugCmd::DestoryGameObject(Creature* c, int uniid) { - if (c->IsPlayer() && EnableDebug()) { + if (c->IsPlayer() && Enable()) { cs::SMDebugCmd msg; msg.set_cmd("destory_gameobject"); diff --git a/server/gameserver/debugcmd.h b/server/gameserver/debugcmd.h index 4101c236..07a33ab1 100644 --- a/server/gameserver/debugcmd.h +++ b/server/gameserver/debugcmd.h @@ -10,6 +10,8 @@ class DebugCmd { public: + static bool Enable(); + static void CreateSphere(Creature* c, const glm::vec3& pos, const glm::vec3& scale, diff --git a/server/gameserver/mapcollider.cc b/server/gameserver/mapcollider.cc index 4a7b5f39..d18bb9b9 100644 --- a/server/gameserver/mapcollider.cc +++ b/server/gameserver/mapcollider.cc @@ -16,10 +16,10 @@ namespace mc static void Quat_Read(glm::quat& v, std::shared_ptr xobj) { - v.x = xobj->At("x")->AsXValue().GetDouble() * MAP_SCALE; - v.y = xobj->At("y")->AsXValue().GetDouble() * MAP_SCALE; - v.z = xobj->At("z")->AsXValue().GetDouble() * MAP_SCALE; - v.w = xobj->At("w")->AsXValue().GetDouble() * MAP_SCALE; + v.x = xobj->At("x")->AsXValue().GetDouble(); + v.y = xobj->At("y")->AsXValue().GetDouble(); + v.z = xobj->At("z")->AsXValue().GetDouble(); + v.w = xobj->At("w")->AsXValue().GetDouble(); } static void Bounds_Read(Bounds& v, std::shared_ptr xobj) diff --git a/server/gameserver/mapcollider.h b/server/gameserver/mapcollider.h index 1457f0e0..b57a48bc 100644 --- a/server/gameserver/mapcollider.h +++ b/server/gameserver/mapcollider.h @@ -20,7 +20,6 @@ namespace mc kCA_Roof = 2,//屋顶 kCA_FloororRoof = 3,//屋顶+上层地板 kCA_Stairs = 4,//楼梯 - kCA_NoJump = 4,//不可跳伞 kCA_Window = 9,//窗,主要为了射击穿透 kCA_Other = 10,//其他,装饰品 }; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 6f230cd4..0f54feb8 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -26,8 +26,6 @@ #include "navmesh.pb.h" -const int MAP_HEIGHT_GRID_SIZE = 64; - static const int NAV_ERROR_NEARESTPOLY = -2; static const int NAV_ERROR = -1; @@ -170,6 +168,7 @@ void MapInstance::Init() navmesh_query_ = new dtNavMeshQuery(); navmesh_query_->init(navmesh_, 1024); MarkMapAreaPolys(); + LoadHouse(); } void MapInstance::UnInit() @@ -722,3 +721,80 @@ void MapInstance::CheckTerrain(Creature* c, int same_poly_flags, const std::vect } } } + +void MapInstance::TraverseHouseList(std::function 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 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); + } + } + } +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index e5b26ded..e44a098d 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -5,6 +5,17 @@ const int MAX_POLYS = 256; +namespace mc +{ + class ColliderNode; +}; + +struct HouseInfo +{ + mc::ColliderNode* node = nullptr; + std::vector verts; +}; + class Entity; class Obstacle; class MapService; @@ -44,9 +55,12 @@ class MapInstance : public std::enable_shared_from_this void UnScale(glm::vec3& v); glm::vec3 UnScaleEx(const glm::vec3& v); void CheckTerrain(Creature* c, int same_poly_flags, const std::vector& spec_polys); + void TraverseHouseList(std::function func); + bool PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt); private: void CreateThings(); + void LoadHouse(); int AllocUniid(); void MarkMapAreaPolys(); @@ -63,6 +77,8 @@ class MapInstance : public std::enable_shared_from_this std::vector poly_ext_datas_; + std::list houses_; + std::string map_tpl_name_; const mt::Map* map_meta_ = nullptr; MapService* map_service_ = nullptr; diff --git a/server/gameserver/mt/Map.cc b/server/gameserver/mt/Map.cc index bd36ddfe..5bb24729 100644 --- a/server/gameserver/mt/Map.cc +++ b/server/gameserver/mt/Map.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include "mt/Map.h" +#include "mt/MapCollider.h" #include "mt/SafeArea.h" IMPL_TABLE(mt::Map) @@ -117,6 +118,7 @@ namespace mt if (!IsPveMap() && player() < 10) { A8_ABORT(); } + collider_info = MapCollider::GetByName(map_collider()); } void Map::Init2() diff --git a/server/gameserver/mt/Map.h b/server/gameserver/mt/Map.h index 1d648a91..fa0e02d9 100644 --- a/server/gameserver/mt/Map.h +++ b/server/gameserver/mt/Map.h @@ -5,6 +5,7 @@ namespace mt { + class MapCollider; DECLARE_ID_TABLE(Map, mtb::Map, "map@map.json", @@ -22,6 +23,7 @@ namespace mt glm::vec3 first_safearea_center_; std::map car_num_limit_; std::vector safearea_list; + MapCollider* collider_info = nullptr; std::string RandTemplate() const; int GetCarLimit(int car_id) const; diff --git a/server/gameserver/mt/MapCollider.cc b/server/gameserver/mt/MapCollider.cc index a3fb62c7..317918c8 100644 --- a/server/gameserver/mt/MapCollider.cc +++ b/server/gameserver/mt/MapCollider.cc @@ -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; + } + } diff --git a/server/gameserver/mt/MapCollider.h b/server/gameserver/mt/MapCollider.h index d39d31dc..01d56a63 100644 --- a/server/gameserver/mt/MapCollider.h +++ b/server/gameserver/mt/MapCollider.h @@ -21,6 +21,7 @@ namespace mt public: void Load(const std::string& filename); + mc::ColliderNode* GetNode(const std::string& name); private: std::map nodes_; diff --git a/server/gameserver/mtb/Map.h b/server/gameserver/mtb/Map.h index 1b007f44..8e659e02 100644 --- a/server/gameserver/mtb/Map.h +++ b/server/gameserver/mtb/Map.h @@ -28,6 +28,7 @@ namespace mtb const std::string airraids() const { return airraids_; }; const std::string car_num_limit() const { return car_num_limit_; }; 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_template_list() const { return __flags__.test(1);}; @@ -47,6 +48,7 @@ namespace mtb bool has_airraids() const { return __flags__.test(15);}; bool has_car_num_limit() const { return __flags__.test(16);}; bool has_scale() const { return __flags__.test(17);}; + bool has_map_collider() const { return __flags__.test(18);}; protected: @@ -68,9 +70,10 @@ namespace mtb std::string airraids_; std::string car_num_limit_; float scale_ = 0.0f; + std::string map_collider_; public: - std::bitset<18> __flags__; + std::bitset<19> __flags__; }; }; diff --git a/server/gameserver/mtb/mtb.all.cc b/server/gameserver/mtb/mtb.all.cc index 5400b5ec..ac4b1558 100644 --- a/server/gameserver/mtb/mtb.all.cc +++ b/server/gameserver/mtb/mtb.all.cc @@ -64,7 +64,7 @@ namespace mtb { a8::reflect::Class* meta_class = nullptr; 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(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_)); @@ -83,6 +83,7 @@ namespace mtb 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(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; } diff --git a/server/tools/protobuild/mt.proto b/server/tools/protobuild/mt.proto index 23a711ff..39eabd95 100755 --- a/server/tools/protobuild/mt.proto +++ b/server/tools/protobuild/mt.proto @@ -33,6 +33,7 @@ message Map optional string airraids = 16; optional string car_num_limit = 17; optional float scale = 18; + optional string map_collider = 19; } message MapArea