diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 51eddae..b18a806 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -94,6 +94,7 @@ enum EntityType_e ET_Bullet = 20, //ET_Android = 30, + ET_Dummy = 29, ET_Unuse = 30, ET_MAX }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 74b9fcc..38f6beb 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2039,6 +2039,11 @@ void Creature::FindLocation() } } break; + case ET_Dummy: + { + + } + break; default: { } diff --git a/server/gameserver/dummyentity.cc b/server/gameserver/dummyentity.cc new file mode 100644 index 0000000..36f4a4d --- /dev/null +++ b/server/gameserver/dummyentity.cc @@ -0,0 +1,46 @@ +#include "precompile.h" + +#include "dummyentity.h" + +#include "metatable.pb.h" +#include "collider.h" +#include "mapservice.h" + +void DummyEntity::Initialize() +{ + Entity::Initialize(); + std::vector collider_list; + if (blocks) { + for (auto& obj : *blocks) { + switch (obj.shape()) { + case 1: + { + AabbCollider* collider = new AabbCollider(); + collider->owner = this; + collider->_min = a8::Vec2(obj.x() - obj.width()/10, + obj.y() - obj.height()/1.0); + collider->_max = a8::Vec2(obj.x() + obj.width()/1.0, + obj.y() + obj.height()/1.0); + AddEntityCollider(collider); + collider_list.push_back(collider); + permanent_map_service->AddCollider(collider); + } + break; + case 2: + { + CircleCollider* collider = new CircleCollider(); + collider->owner = this; + collider->pos = a8::Vec2(obj.x(), obj.y()); + collider->rad = obj.rad(); + AddEntityCollider(collider); + permanent_map_service->AddCollider(collider); + } + break; + default: + { + } + break; + } + } + } +} diff --git a/server/gameserver/dummyentity.h b/server/gameserver/dummyentity.h new file mode 100644 index 0000000..170b622 --- /dev/null +++ b/server/gameserver/dummyentity.h @@ -0,0 +1,17 @@ +#pragma once + +#include "entity.h" + +namespace metatable +{ + class MapBlockJson; +} + +class DummyEntity : public Entity +{ + public: + MapService* permanent_map_service = nullptr; + std::list* blocks = nullptr; + + virtual void Initialize() override; +}; diff --git a/server/gameserver/entityfactory.cc b/server/gameserver/entityfactory.cc index b708255..e0ccee1 100644 --- a/server/gameserver/entityfactory.cc +++ b/server/gameserver/entityfactory.cc @@ -10,6 +10,7 @@ #include "player.h" #include "car.h" #include "hero.h" +#include "dummyentity.h" void EntityFactory::Init() { @@ -96,3 +97,11 @@ Hero* EntityFactory::MakeHero(int entity_uniid) hum->entity_type_ = ET_Hero; return hum; } + +DummyEntity* EntityFactory::MakeDummy(int entity_uniid) +{ + DummyEntity* dummy = new DummyEntity(); + dummy->uniid_ = entity_uniid; + dummy->entity_type_ = ET_Dummy; + return dummy; +} diff --git a/server/gameserver/entityfactory.h b/server/gameserver/entityfactory.h index aa60d60..d9f010d 100644 --- a/server/gameserver/entityfactory.h +++ b/server/gameserver/entityfactory.h @@ -9,6 +9,7 @@ class Android; class Player; class Car; class Hero; +class DummyEntity; class EntityFactory : public a8::Singleton { private: @@ -28,6 +29,7 @@ class EntityFactory : public a8::Singleton Player* MakePlayer(int entity_uniid); Car* MakeCar(int entity_uniid); Hero* MakeHero(int entity_uniid); + DummyEntity* MakeDummy(int entity_uniid); private: }; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index bfa5927..443af9e 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -10,6 +10,7 @@ #include "metamgr.h" #include "room.h" #include "entityfactory.h" +#include "dummyentity.h" const int MAP_GRID_WIDTH = 64; @@ -35,6 +36,7 @@ void MapInstance::Init() MAP_GRID_WIDTH); CreateThings(); CreateTerrain(); + CreateBlock(); a8::UdpLog::Instance()->Info ("map_id:%d current_uniid:%d loots:%d mini_room_spawn_points:%d normal_room_spawn_points:%d " "building_num:%d obstalce_num:%d obstacle0_num:%d " @@ -261,6 +263,18 @@ void MapInstance::CreateTerrain() } } +void MapInstance::CreateBlock() +{ + std::list* blocks = MetaMgr::Instance()->GetMapBlock(map_meta_->i->map_pic()); + DummyEntity* dummy = EntityFactory::Instance()->MakeDummy(AllocUniid()); + dummy->SetPos(a8::Vec2()); + dummy->permanent_map_service = map_service_; + dummy->blocks = blocks; + dummy->Initialize(); + uniid_hash_[dummy->GetUniId()] = dummy; + grid_service_->AddPermanentEntity(dummy); +} + void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl) { int thing_id = thing_tpl.RandThing(); diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 2225e9d..d56e893 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -27,6 +27,7 @@ class MapInstance private: void CreateThings(); void CreateTerrain(); + void CreateBlock(); void CreateMapObject(MetaData::MapTplThing& thing_tpl); void CreateBuilding(int thing_id, float building_x, float building_y); Obstacle* InternalCreateObstacle(int id, float x, float y, int collider_tag, diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 88b184a..f7b4073 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -84,6 +84,7 @@ public: std::map drop_hash; std::map> maptpl_meta_hash; std::map> layer_meta_hash; + std::map> block_meta_hash; std::map> maptpl_hash; std::map dress_hash; std::vector dress_vec; @@ -488,6 +489,19 @@ private: f8::ReadJsonMetaFile(filename, itr->second); } } + { + auto itr = block_meta_hash.find(meta.map_pic()); + if (itr == block_meta_hash.end()) { + block_meta_hash[meta.map_pic()] = std::list(); + itr = block_meta_hash.find(meta.map_pic()); + } else { + itr->second.clear(); + } + std::string filename = res_path + "map" + meta.map_pic() + ".block.json"; + if (access(filename.c_str(), F_OK) != -1) { + f8::ReadJsonMetaFile(filename, itr->second); + } + } } } #endif @@ -801,6 +815,12 @@ std::list* MetaMgr::GetMapLayer(const std::string& map_ return itr != loader_->layer_meta_hash.end() ? &itr->second : nullptr; } +std::list* MetaMgr::GetMapBlock(const std::string& map_name) +{ + auto itr = loader_->block_meta_hash.find(map_name); + return itr != loader_->block_meta_hash.end() ? &itr->second : nullptr; +} + std::list& MetaMgr::GetAirDrops() { return loader_->airdrop_list; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index d4a12b2..79def08 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -34,6 +34,7 @@ class MetaMgr : public a8::Singleton std::vector* GetMapTplThing(const std::string& map_name); metatable::TerrainJson* GetTerrainJson(int map_id); std::list* GetMapLayer(const std::string& map_name); + std::list* GetMapBlock(const std::string& map_name); std::list& GetAirDrops(); MetaData::AirDrop* GetAirDrop(int airdrop_id); std::list& GetAirRaids(); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 36379e0..77afcca 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -428,3 +428,13 @@ message MapLayerJson optional int32 height = 3; repeated int32 grids = 4; } + +message MapBlockJson +{ + optional int32 shape = 1; + optional float x = 5; + optional float y = 6; + optional float height = 7; + optional float width = 8; + optional float rad = 9; +}