From 3fdfc92394a7962cf703072095a2c88aba6e285c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 27 Mar 2019 11:58:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=88=BF=E9=97=B4=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/building.cc | 71 +++++++++++++++++++++++++ server/gameserver/building.h | 27 ++++++++++ server/gameserver/metadata.h | 6 +++ server/gameserver/metamgr.cc | 18 +++++++ server/gameserver/metamgr.h | 1 + server/gameserver/obstacle.cc | 47 +++++++++++----- server/gameserver/room.cc | 31 +++++++++++ server/gameserver/room.h | 3 +- server/gameserver/roommgr.cc | 1 + server/tools/protobuild/cs_proto.proto | 3 -- server/tools/protobuild/metatable.proto | 2 + 11 files changed, 192 insertions(+), 18 deletions(-) diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index e69de29..e100fdb 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -0,0 +1,71 @@ +#include "precompile.h" + +#include "building.h" +#include "metamgr.h" +#include "movement.h" +#include "room.h" +#include "collider.h" +#include "obstacle.h" +#include "human.h" + +Building::Building():Entity() +{ + entity_type = ET_Building; +} + +Building::~Building() +{ +} + +void Building::Initialize() +{ + RecalcSelfCollider(); +} + +void Building::RecalcSelfCollider() +{ + for (auto& obj : meta->i->staticobj()) { + AabbCollider* collider = new AabbCollider(); + collider->owner = this; + collider->_min = Vector2D(obj.x() - obj.width()/2.0 - meta->i->tilewidth()/2.0, + obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0); + collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0, + obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0); + colliders.push_back(collider); + } + for (auto& obj : meta->i->lootobj()) { + MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(obj.id()); + if (thing) { + Obstacle* entity = new Obstacle(); + entity->room = room; + entity->meta = thing; + entity->entity_uniid = room->AllocUniid(); + entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0, + pos.y + obj.y() - meta->i->tileheight() / 2.0); + entity->Initialize(); + room->uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : room->human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } + } +} + +void Building::FillMFObjectPart(cs::MFObjectPart* part_data) +{ + part_data->set_object_type(ET_Building); + cs::MFBuildingPart* p = part_data->mutable_union_obj_3(); + p->set_obj_uniid(entity_uniid); + pos.ToPB(p->mutable_pos()); +} + +void Building::FillMFObjectFull(cs::MFObjectFull* full_data) +{ + full_data->set_object_type(ET_Building); + cs::MFBuildingFull* p = full_data->mutable_union_obj_3(); + p->set_obj_uniid(entity_uniid); + pos.ToPB(p->mutable_pos()); + + p->set_building_id(meta->i->_building_id()); +} diff --git a/server/gameserver/building.h b/server/gameserver/building.h index e69de29..2fd5356 100644 --- a/server/gameserver/building.h +++ b/server/gameserver/building.h @@ -0,0 +1,27 @@ +#pragma once + +#include "entity.h" + +namespace MetaData +{ + struct Player; + struct Equip; + struct Building; +} + +class Human; +class CircleCollider; +class AabbCollider; +class Building : public Entity +{ + public: + MetaData::Building* meta = nullptr; + + Building(); + virtual ~Building() override; + virtual void Initialize() override; + void RecalcSelfCollider(); + virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; + virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; + +}; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 63a74e0..a5bf389 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -40,4 +40,10 @@ namespace MetaData const metatable::Player* i = nullptr; }; + + struct Building + { + const metatable::BuildingJson* i = nullptr; + }; + } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 201a510..15f6c1b 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -25,6 +25,7 @@ public: std::list mapthing_meta_list; std::list mapthing_list; std::list building_meta_list; + std::list building_list; std::map parameter_hash; std::map gamemap_hash; @@ -33,6 +34,7 @@ public: std::map equip_hash; std::map player_hash; std::map mapthing_hash; + std::map building_hash; void Load() { @@ -102,6 +104,16 @@ private: mapthing_hash[item.i->thing_id()] = &item; } + { + int building_id = 0; + for (auto& meta : building_meta_list) { + MetaData::Building& item = a8::FastAppend(building_list); + item.i = &meta; + meta.set__building_id(building_id++); + building_hash[item.i->_building_id()] = &item; + } + } + } }; @@ -156,3 +168,9 @@ MetaData::Equip* MetaMgr::GetEquip(int id) auto itr = loader_->equip_hash.find(id); return itr != loader_->equip_hash.end() ? itr->second : nullptr; } + +MetaData::Building* MetaMgr::GetBuilding(int building_id) +{ + auto itr = loader_->building_hash.find(building_id); + return itr != loader_->building_hash.end() ? itr->second : nullptr; +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 83a76ca..d76abe2 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -21,6 +21,7 @@ class MetaMgr : public a8::Singleton MetaData::MapThing* GetMapThing(int mapthing_id); MetaData::Player* GetPlayer(int id); MetaData::Equip* GetEquip(int id); + MetaData::Building* GetBuilding(int building_id); private: MetaDataLoader* loader_ = nullptr; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 5274557..6261bbb 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -22,22 +22,41 @@ void Obstacle::Initialize() void Obstacle::RecalcSelfCollider() { - if (meta->i->thing_id() == 61001) { - if (!self_collider2_) { - self_collider2_ = new AabbCollider(); - self_collider2_->owner = this; - colliders.push_back(self_collider2_); + switch (meta->i->thing_id()) { + case 61001: + { + if (!self_collider2_) { + self_collider2_ = new AabbCollider(); + self_collider2_->owner = this; + colliders.push_back(self_collider2_); + } + self_collider2_->_min = Vector2D(-16.0f, -16.0f); + self_collider2_->_max = Vector2D(16.0f, 16.0f); } - self_collider2_->_min = Vector2D(-16.0f, -16.0f); - self_collider2_->_max = Vector2D(16.0f, 16.0f); - } else if (meta->i->thing_id() == 61007) { - if (!self_collider_) { - self_collider_ = new CircleCollider(); - self_collider_->owner = this; - colliders.push_back(self_collider_); + break; + case 61017: + { + //玻璃32 * 12 + if (!self_collider2_) { + self_collider2_ = new AabbCollider(); + self_collider2_->owner = this; + colliders.push_back(self_collider2_); + } + self_collider2_->_min = Vector2D(-16.0f, -16.0f); + self_collider2_->_max = Vector2D(6.0f, 6.0f); } - self_collider_->pos = Vector2D(); - self_collider_->rad = 32 / 2.0; + break; + case 61007: + { + if (!self_collider_) { + self_collider_ = new CircleCollider(); + self_collider_->owner = this; + colliders.push_back(self_collider_); + } + self_collider_->pos = Vector2D(); + self_collider_->rad = 32 / 2.0; + } + break; } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 0138c0d..d8ce266 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -10,6 +10,7 @@ #include "bullet.h" #include "collider.h" #include "obstacle.h" +#include "building.h" const int ROOM_MAX_PLAYER_NUM = 50; const int ANDROID_NUM = 0; @@ -190,6 +191,29 @@ void Room::ShuaObstacle(Human* hum) #endif } +void Room::ShuaBuilding(Human* hum) +{ + MetaData::Building* a_building = MetaMgr::Instance()->GetBuilding(0); + if (!a_building) { + return; + } + #if 1 + { + Building* entity = new Building(); + entity->room = this; + entity->meta = a_building; + entity->entity_uniid = AllocUniid(); + entity->pos = hum->pos - Vector2D::UP * hum->meta->i->radius() + 500; + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } + #endif +} + bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos) { Vector2D dir = hum->pos; @@ -264,6 +288,13 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vectorentity_type == ET_Building) { + if (sender->entity_type == ET_Bullet || sender->entity_type == ET_Player) { + if (pair.second != sender && sender->TestCollision(pair.second)) { + objects.push_back(pair.second); + } + } + } } } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index d405802..770cb7b 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -46,6 +46,7 @@ public: unsigned short AllocUniid(); void ShuaAndroid(); void ShuaObstacle(Human* hum); + void ShuaBuilding(Human* hum); bool RandomPos(Human* hum, float distance, Vector2D& out_pos); Human* FindEnemy(Human* hum); void CollisionDetection(Entity* sender, int detection_flags, std::vector& objects); @@ -60,7 +61,7 @@ private: void ClearDeletedObjects(); void ProcAddedObjects(); -private: +public: unsigned short current_uniid = 0; RoomState_e state_ = RS_Inactive; int elapsed_time_ = 0; diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 78a636a..0b67671 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -53,6 +53,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) hum->Initialize(); room->AddPlayer(hum); room->ShuaObstacle(hum); + room->ShuaBuilding(hum); { cs::SMJoinedNotify notifymsg; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 9a44bc7..2941427 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -179,8 +179,6 @@ message MFBuildingPart { optional int32 obj_uniid = 1; //唯一id optional MFVector2D pos = 2; //位置 - optional int32 building_id = 3; //建筑物id - optional int32 ori = 4; // } //建筑物-全量 @@ -189,7 +187,6 @@ message MFBuildingFull optional int32 obj_uniid = 1; //唯一id optional MFVector2D pos = 2; //位置 optional int32 building_id = 3; //建筑物id - optional int32 ori = 4; // optional bool ceiling_dead = 6; } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 4b74419..0074628 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -119,4 +119,6 @@ message BuildingJson repeated DropObjJson dropObj = 5; repeated StaticObjJson staticObj = 6; repeated LootObjJson lootObj = 7; + + optional int32 _building_id = 20; }