修复:队伍中角色全部倒地时,没有立即结束

This commit is contained in:
aozhiwei 2019-05-13 11:47:55 +08:00
parent 905201e78e
commit 0c3a1baa4c
5 changed files with 50 additions and 6 deletions

View File

@ -125,7 +125,9 @@ void Bullet::OnHit(std::set<Entity*>& objects)
float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add); float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add);
float def = 0; float def = 0;
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
#if 0
player->stats.damage_amount_out += finaly_dmg; player->stats.damage_amount_out += finaly_dmg;
#endif
obstacle->health = std::max(0.0f, obstacle->health - finaly_dmg); obstacle->health = std::max(0.0f, obstacle->health - finaly_dmg);
obstacle->dead = obstacle->health <= 0.01f; obstacle->dead = obstacle->health <= 0.01f;

View File

@ -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) { if (team_members) {
for (auto& member : *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 { } 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; downed_timer = nullptr;
BeKill(killer_id, killer_name, weapon_id); BeKill(killer_id, killer_name, weapon_id);
} else { } else {
if (HasLiveTeammate()) { if (HasNoDownedTeammate()) {
health = MetaMgr::Instance()->GetSysParamAsInt("downed_recover_hp"); health = MetaMgr::Instance()->GetSysParamAsInt("downed_recover_hp");
downed = true; downed = true;
downed_timer = room->xtimer.AddRepeatTimerAndAttach( downed_timer = room->xtimer.AddRepeatTimerAndAttach(
@ -645,7 +664,19 @@ bool Human::HasLiveTeammate()
{ {
if (team_members) { if (team_members) {
for (auto& hum : *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; return true;
} }
} }

View File

@ -136,6 +136,7 @@ class Human : public Entity
void AddOutObjects(Entity* entity); void AddOutObjects(Entity* entity);
void RemoveOutObjects(Entity* entity); void RemoveOutObjects(Entity* entity);
bool HasLiveTeammate(); bool HasLiveTeammate();
bool HasNoDownedTeammate();
void Land(); void Land();
void DoJump(); void DoJump();
void DoSkill(); void DoSkill();

View File

@ -218,6 +218,11 @@ void Room::ShuaAndroid()
grid_service.AddHuman(hum); grid_service.AddHuman(hum);
hum->FindLocation(); hum->FindLocation();
hum->RefreshView(); 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() void Room::InitAirDrop()

@ -1 +1 @@
Subproject commit 4a78121aa74d10eaa73cbfa817f4308bcf627a33 Subproject commit fc99a3615db9aabc1a77489e069a4e6af26d50d5