diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 725e3de..15e3e31 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -101,6 +101,28 @@ void FrameEvent::AddExplosion(Bullet* bullet, int item_id, Vector2D bomb_pos) } } +void FrameEvent::AddExplosionEx(Human* sender, int item_id, Vector2D bomb_pos, int effect) +{ + { + auto& tuple = a8::FastAppend(explosions_); + std::get<0>(tuple) = sender; + auto& p = std::get<1>(tuple); + + p.set_item_id(item_id); + bomb_pos.ToPB(p.mutable_pos()); + p.set_player_id(sender->entity_uniid); + p.set_effect(effect); + } + { + int explosion_idx = explosions_.size() - 1; + for (auto& cell : sender->grid_list) { + for (auto& hum : cell->human_list) { + hum->explosions_.push_back(explosion_idx); + } + } + } +} + void FrameEvent::AddSmoke(Bullet* bullet, int item_id, Vector2D pos) { { diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index a269e04..a452461 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -13,6 +13,7 @@ public: void AddBullet(Human* hum, Vector2D born_pos, float fly_distance); void AddExplosion(Bullet* bullet, int item_id, Vector2D bomb_pos); void AddSmoke(Bullet* bullet, int item_id, Vector2D pos); + void AddExplosionEx(Human* sender, int item_id, Vector2D bomb_pos, int effect); void Clear(); private: diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 412afbc..151f83a 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -536,6 +536,19 @@ void Room::FetchBuilding(Human* hum) void Room::OnHumanDie(Human* hum) { + if (hum->skill_meta && hum->skill_meta->i->condition() == ST_SelfDetonate) { + for (auto& pair : human_hash_) { + if (pair.second != hum) { + float distance = (hum->pos - pair.second->pos).Norm(); + if (distance <= hum->skill_meta->i->area()) { + pair.second->DecHP(hum->skill_meta->i->value1(), + hum->entity_uniid, + hum->name); + } + } + } + frame_event.AddExplosionEx(hum, 0, hum->pos, 1); + } --alive_count_; } diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 0a77881..87d1bb8 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -485,7 +485,7 @@ message MFExplosion optional int32 item_id = 1; //配置表id optional MFVector2D pos = 2; //位置 optional int32 player_id = 3; //玩家id - optional int32 effect = 4; //爆照效果 0:普通爆照 1:核爆炸 + optional int32 effect = 4 [default = 0]; //爆照效果 0:普通爆照 1:核爆炸 } //烟雾