diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index cc84889..0f1c4b6 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -135,6 +135,10 @@ void Bullet::OnHit(std::set& objects) room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); } obstacle->BroadcastFullState(); + if (obstacle->meta->i->damage_dia() > 0.01f && + obstacle->meta->i->damage() > 0.01f) { + obstacle->Explosion(this); + } } } break; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index e2898c9..21e8a78 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -110,11 +110,15 @@ enum VirtualWeapon_e VW_SafeArea = 9000000, VW_Spectate = 9000001, VW_SelfDetonate = 9000002, + VW_Mine = 9000003, }; enum VirtualPlayer_e { VP_SafeArea = 9000000, + VP_Spectate = 9000001, + VP_SelfDetonate = 9000002, + VP_Mine = 9000003, }; const char* const PROJ_NAME_FMT = "game%d_gameserver"; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index bc1f07c..f024e4f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -491,7 +491,7 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) SendRollMsg(msg); } } else { - switch (killer_id) { + switch (weapon_id) { case VW_SafeArea: { std::string msg = a8::Format("%s 被毒圈干掉", @@ -519,6 +519,15 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) SendRollMsg(msg); } break; + case VW_Mine: + { + std::string msg = a8::Format("%s 被地雷炸死", + { + name + }); + SendRollMsg(msg); + } + break; } } stats.killer_id = killer_id; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index d682d88..eb2af48 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -5,6 +5,7 @@ #include "room.h" #include "collider.h" #include "building.h" +#include "human.h" Obstacle::Obstacle():Entity() { @@ -121,3 +122,79 @@ ColliderComponent* Obstacle::GetBoxBound() } return nullptr; } + +void Obstacle::Explosion(Bullet* bullet) +{ + if (meta->i->damage_dia() > 0.01f && + meta->i->damage() > 0.01f) { + std::set objects; + for (auto& grid : grid_list) { + for (Human* hum: grid->human_list) { + { + if (TestCollision(hum)) { + objects.insert(hum); + } + } + for (Entity* entity : grid->entity_list) { + switch (entity->entity_type) { + case ET_Obstacle: + case ET_Building: + { + if (TestCollision(entity)) { + objects.insert(entity); + } + } + break; + default: + { + } + break; + } + } + }//end for + } + Vector2D bomb_pos = pos; + room->frame_event.AddExplosion(bullet, meta->i->thing_id(), bomb_pos); + for (auto& target : objects) { + switch (target->entity_type) { + case ET_Player: + { + Human* hum = (Human*)target; +#if 1 + if (!hum->dead) { +#else + if (!hum->dead && (hum->team_id == 0 || hum->team_id != player->team_id)) { +#endif + float dmg = meta->i->damage(); + float def = hum->def + hum->buff.def_add; + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + hum->DecHP(finaly_dmg, VP_Mine, "地雷", VW_Mine); + } + } + break; + case ET_Obstacle: + { + Obstacle* obstacle = (Obstacle*)target; + if (!obstacle->dead && obstacle->meta->i->attack_type() == 1) { + float dmg = meta->i->damage(); + float def = 0; + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + + obstacle->health = std::max(0.0f, obstacle->health - finaly_dmg); + obstacle->dead = obstacle->health <= 0.01f; + obstacle->dead_frameno = room->frame_no; + if (obstacle->dead) { + obstacle->ClearColliders(); + room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); + } + obstacle->BroadcastFullState(); + } + } + break; + default: + break; + + } + } + } +} diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 5b0e35b..befc090 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -19,6 +19,7 @@ class Human; class Building; class CircleCollider; class AabbCollider; +class Bullet; class Obstacle : public Entity { public: @@ -42,6 +43,8 @@ class Obstacle : public Entity virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; virtual ColliderComponent* GetBoxBound() override; + void Explosion(Bullet* bullet); + private: CircleCollider* self_collider_ = nullptr; AabbCollider* self_collider2_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 378e31a..6f7eea0 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -441,7 +441,7 @@ void Player::Shot() return; } - if (action_type != AT_Reload) { + if (action_type == AT_Reload) { CancelAction(); }