diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 31e5e0a..3d80af3 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -125,7 +125,9 @@ void Bullet::OnHit(std::set& objects) float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add); float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + #if 0 player->stats.damage_amount_out += finaly_dmg; + #endif obstacle->health = std::max(0.0f, obstacle->health - finaly_dmg); obstacle->dead = obstacle->health <= 0.01f; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 04c5c93..6d37788 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -546,13 +546,32 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) } } } - if (!HasLiveTeammate() && !leave_) { + if (!HasNoDownedTeammate() && !leave_) { if (team_members) { for (auto& member : *team_members) { - member->SendGameOver(); + if (member == this) { + member->SendGameOver(); + } else { + if (member->dead) { + member->SendGameOver(); + } else if (member->downed) { + a8::XParams& timer_param = room->xtimer.GetTimerXParams(member->downed_timer); + member->stats.killer_id = timer_param.param1; + member->stats.killer_name = timer_param.param2.GetString(); + member->stats.weapon_id = timer_param.param2; + member->dead = true; + member->health = 0.0f; + member->dead_frameno = room->frame_no; + member->room->OnHumanDie(this); + member->SyncAroundPlayers(); + member->SendGameOver(); + room->xtimer.DeleteTimer(member->downed_timer); + member->downed_timer = nullptr; + } + } } } else { - SendGameOver(); + SendGameOver(); } } } @@ -594,7 +613,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i downed_timer = nullptr; BeKill(killer_id, killer_name, weapon_id); } else { - if (HasLiveTeammate()) { + if (HasNoDownedTeammate()) { health = MetaMgr::Instance()->GetSysParamAsInt("downed_recover_hp"); downed = true; downed_timer = room->xtimer.AddRepeatTimerAndAttach( @@ -645,7 +664,19 @@ bool Human::HasLiveTeammate() { if (team_members) { for (auto& hum : *team_members) { - if (!hum->dead) { + if (hum != this && !hum->dead) { + return true; + } + } + } + return false; +} + +bool Human::HasNoDownedTeammate() +{ + if (team_members) { + for (auto& hum : *team_members) { + if (hum != this && (!hum->dead || !hum->downed)) { return true; } } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 3133d08..3a86507 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -136,6 +136,7 @@ class Human : public Entity void AddOutObjects(Entity* entity); void RemoveOutObjects(Entity* entity); bool HasLiveTeammate(); + bool HasNoDownedTeammate(); void Land(); void DoJump(); void DoSkill(); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index bf8c41f..acc3c9c 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -218,6 +218,11 @@ void Room::ShuaAndroid() grid_service.AddHuman(hum); hum->FindLocation(); hum->RefreshView(); + { + hum->team_id = NewTeam(); + hum->team_members = &team_hash_[hum->team_id]; + hum->team_members->insert(hum); + } } } @@ -958,6 +963,11 @@ void Room::MatchTeam(Human* hum) } } } + if (hum->team_id == 0) { + hum->team_id = NewTeam(); + hum->team_members = &team_hash_[hum->team_id]; + hum->team_members->insert(hum); + } } void Room::InitAirDrop() diff --git a/third_party/a8engine b/third_party/a8engine index 4a78121..fc99a36 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit 4a78121aa74d10eaa73cbfa817f4308bcf627a33 +Subproject commit fc99a3615db9aabc1a77489e069a4e6af26d50d5