From cce493f45457e57d3384c2f9864f3ec5528ffe6d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 27 Mar 2019 14:56:15 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 40 +++++++++++++++++++++++++ server/gameserver/bullet.h | 4 +++ server/gameserver/entity.cc | 29 ++++++++++-------- server/gameserver/entity.h | 1 + server/gameserver/metadata.cc | 10 +++++++ server/gameserver/metadata.h | 12 +++++++- server/gameserver/metamgr.cc | 16 ++++++++++ server/gameserver/metamgr.h | 1 + server/gameserver/obstacle.cc | 3 ++ server/gameserver/obstacle.h | 2 ++ server/gameserver/room.cc | 5 ++++ server/gameserver/room.h | 1 + server/tools/protobuild/cs_proto.proto | 10 ++++--- server/tools/protobuild/metatable.proto | 10 +++++++ 14 files changed, 127 insertions(+), 17 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 7dfb3d2..b548efc 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -5,6 +5,8 @@ #include "movement.h" #include "room.h" #include "collider.h" +#include "obstacle.h" +#include "player.h" Bullet::Bullet():Entity() { @@ -38,6 +40,9 @@ void Bullet::Update(int delta_time) float distance = (pos - born_pos).Norm(); if (!objects.empty() || distance > gun_meta->i->range()) { deleted = true; + if (!objects.empty()) { + OnHit(objects); + } room->AddDeletedObject(entity_uniid); } } @@ -52,3 +57,38 @@ void Bullet::RecalcSelfCollider() self_collider_->pos = Vector2D(); self_collider_->rad = gun_meta->i->bullet_rad(); } + +void Bullet::OnHit(std::vector& objects) +{ + for (auto& target : objects) { + switch (target->entity_type) { + case ET_Player: + { + + } + break; + case ET_Obstacle: + { + Obstacle* obstacle = (Obstacle*)target; + if (!obstacle->dead && obstacle->meta->i->attackable()) { + obstacle->health = std::min(0.0f, obstacle->health - 10); + obstacle->dead = std::min(obstacle->health, 0.001f) <= 0.01f; + if (obstacle->dead) { + obstacle->ClearColliders(); + room->ProcDrop(pos, obstacle->meta->i->drop()); + } + room->TouchPlayerList(a8::XParams() + .SetSender(obstacle), + [] (Player* hum, a8::XParams& param) + { + Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); + hum->new_objects.insert(obstacle); + }); + } + } + break; + default: + break; + } + } +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index a5ba43e..ef53934 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -26,6 +26,10 @@ class Bullet : public Entity virtual void Update(int delta_time) override; void RecalcSelfCollider(); + private: + + void OnHit(std::vector& objects); + private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index be68f57..ee81e80 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -4,6 +4,23 @@ #include "collider.h" Entity::~Entity() +{ + ClearColliders(); +} + +bool Entity::TestCollision(Entity* b) +{ + for (auto& a_collider : colliders) { + for (auto& b_collider : b->colliders) { + if (a_collider->Intersect(b_collider)) { + return true; + } + } + } + return false; +} + +void Entity::ClearColliders() { for (auto& itr : colliders) { ColliderComponent* collider = itr; @@ -27,15 +44,3 @@ Entity::~Entity() } colliders.clear(); } - -bool Entity::TestCollision(Entity* b) -{ - for (auto& a_collider : colliders) { - for (auto& b_collider : b->colliders) { - if (a_collider->Intersect(b_collider)) { - return true; - } - } - } - return false; -} diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 4bde90f..b36c0b9 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -53,4 +53,5 @@ class Entity virtual void FillMFObjectFull(cs::MFObjectFull* full_data) {}; virtual float GetSpeed() { return 1.0f;}; bool TestCollision(Entity* b); + void ClearColliders(); }; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 6bd592f..80f5f1c 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -5,4 +5,14 @@ namespace MetaData { + void Drop::Init() + { + + } + + void Drop::RandItem(std::vector>& drop_items) + { + + } + } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index a5bf389..3146908 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -40,10 +40,20 @@ namespace MetaData const metatable::Player* i = nullptr; }; - struct Building { const metatable::BuildingJson* i = nullptr; }; + struct Drop + { + const metatable::Drop* i = nullptr; + + void Init(); + void RandItem(std::vector>& drop_items); + + private: + std::vector> items; + }; + } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 15f6c1b..32b8d7a 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -26,6 +26,8 @@ public: std::list mapthing_list; std::list building_meta_list; std::list building_list; + std::list drop_meta_list; + std::list drop_list; std::map parameter_hash; std::map gamemap_hash; @@ -35,6 +37,7 @@ public: std::map player_hash; std::map mapthing_hash; std::map building_hash; + std::map drop_hash; void Load() { @@ -53,6 +56,7 @@ public: f8::ReadCsvMetaFile(res_path + "player@player.csv", player_meta_list); f8::ReadCsvMetaFile(res_path + "player@player.csv", player_meta_list); f8::ReadCsvMetaFile(res_path + "mapThing@mapThing.csv", mapthing_meta_list); + f8::ReadCsvMetaFile(res_path + "drop@drop.csv", drop_meta_list); f8::ReadJsonMetaFile(res_path + "maps.json", building_meta_list); BindToMetaData(); } @@ -104,6 +108,12 @@ private: mapthing_hash[item.i->thing_id()] = &item; } + for (auto& meta : drop_meta_list) { + MetaData::Drop& item = a8::FastAppend(drop_list); + item.i = &meta; + drop_hash[item.i->drop_id()] = &item; + } + { int building_id = 0; for (auto& meta : building_meta_list) { @@ -174,3 +184,9 @@ MetaData::Building* MetaMgr::GetBuilding(int building_id) auto itr = loader_->building_hash.find(building_id); return itr != loader_->building_hash.end() ? itr->second : nullptr; } + +MetaData::Drop* MetaMgr::GetDrop(int drop_id) +{ + auto itr = loader_->drop_hash.find(drop_id); + return itr != loader_->drop_hash.end() ? itr->second : nullptr; +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index d76abe2..8e07dcc 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -22,6 +22,7 @@ class MetaMgr : public a8::Singleton MetaData::Player* GetPlayer(int id); MetaData::Equip* GetEquip(int id); MetaData::Building* GetBuilding(int building_id); + MetaData::Drop* GetDrop(int drop_id); private: MetaDataLoader* loader_ = nullptr; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 6261bbb..058e15a 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -17,6 +17,7 @@ Obstacle::~Obstacle() void Obstacle::Initialize() { + health = meta->i->hp(); RecalcSelfCollider(); } @@ -78,4 +79,6 @@ void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_scale(1.0f); p->set_obstacle_id(meta->i->thing_id()); + p->set_health(health); + p->set_dead(dead); } diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 9371687..e1e4d98 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -16,6 +16,8 @@ class Obstacle : public Entity { public: MetaData::MapThing* meta = nullptr; + float health = 0.0f; + bool dead = false; Obstacle(); virtual ~Obstacle() override; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index d8ce266..6092615 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -328,6 +328,11 @@ void Room::ResetFrameData() frame_data.shots.Clear(); } +void Room::ProcDrop(Vector2D center, int drop_id) +{ + +} + void Room::ClearDeletedObjects() { for (auto& obj_uniid : frame_data.deleted_objects) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 770cb7b..9608867 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -56,6 +56,7 @@ public: void TouchPlayerList(a8::XParams param, std::function func); void BeAddedObject(Entity* entity); + void ProcDrop(Vector2D center, int drop_id); private: void ClearDeletedObjects(); diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 2941427..a43a0f5 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -167,11 +167,12 @@ message MFObstacleFull optional int32 obstacle_id = 6; //阻挡物id optional float health = 7; //血量 optional bool dead = 8; //是否已死亡 + optional bool dead_at_thisframe = 9; //是否当前帧死亡(播放死亡特效) - optional bool is_door = 9; //是否门 - optional int32 door_relative_ori = 10; // - optional bool door_can_use = 11; // - optional int32 door_seq = 12; + optional bool is_door = 20; //是否门 + optional int32 door_relative_ori = 21; // + optional bool door_can_use = 22; // + optional int32 door_seq = 23; } //建筑物-部分 @@ -237,6 +238,7 @@ message MFDeadBodyFull { optional int32 obj_uniid = 1; //唯一id optional MFVector2D pos = 2; //位置 + optional int32 player_id = 3; //玩家id optional int32 inkjet = 6; } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 0074628..3d87ddd 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -23,6 +23,7 @@ message MapThing optional float damage = 6; //伤害 optional float damage_dia = 7; //伤害半径 optional int32 drop = 8; //掉落 + optional int32 attackable = 9; //是否可攻击 } message SafeArea @@ -78,6 +79,15 @@ message Skill optional int32 skill_id = 1; //技能id } +message Drop +{ + optional int32 drop_id = 1; + optional string item_id = 2; + optional string num = 3; + optional string weight = 4; + optional int32 type = 5; +} + message DoorObjJson { optional float height = 1;