添加复活处理
This commit is contained in:
parent
f044c2dd9c
commit
a5329d2d4d
@ -664,7 +664,7 @@ void Human::FillSMGameOver(cs::SMGameOver& msg)
|
|||||||
|
|
||||||
void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
||||||
{
|
{
|
||||||
if (!dead && !room->game_over) {
|
if (!dead && !room->game_over && !real_dead) {
|
||||||
lethal_weapon = weapon_id;
|
lethal_weapon = weapon_id;
|
||||||
Entity* hum = room->GetEntityByUniId(killer_id);
|
Entity* hum = room->GetEntityByUniId(killer_id);
|
||||||
if (hum && hum->entity_type == ET_Player) {
|
if (hum && hum->entity_type == ET_Player) {
|
||||||
@ -745,57 +745,17 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
|||||||
dead = true;
|
dead = true;
|
||||||
health = 0.0f;
|
health = 0.0f;
|
||||||
dead_frameno = room->frame_no;
|
dead_frameno = room->frame_no;
|
||||||
room->OnHumanDie(this);
|
++dead_times;
|
||||||
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
int max_revive_times = MetaMgr::Instance()->GetSysParamAsInt("max_revive_times", 1);
|
||||||
if (team_members) {
|
if (weapon_id != VW_Spectate &&
|
||||||
for (auto& hum : *team_members) {
|
dead_times <= max_revive_times &&
|
||||||
if (hum != this && hum->action_type == AT_Relive &&
|
entity_subtype == EST_Player) {
|
||||||
hum->action_target_id == entity_uniid) {
|
Revive();
|
||||||
hum->CancelAction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!HasNoDownedTeammate() && !leave_) {
|
|
||||||
if (team_members) {
|
|
||||||
for (auto& member : *team_members) {
|
|
||||||
if (member == this) {
|
|
||||||
member->SendGameOver();
|
|
||||||
} else {
|
} else {
|
||||||
if (member->dead) {
|
real_dead = true;
|
||||||
member->SendGameOver();
|
OnDie();
|
||||||
} else if (member->downed) {
|
|
||||||
a8::XParams* timer_param = room->xtimer.MutableParams(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(__FILE__, __LINE__, __func__);
|
|
||||||
member->SendGameOver();
|
|
||||||
room->xtimer.DeleteTimer(member->downed_timer);
|
|
||||||
member->downed_timer = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SendGameOver();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (room->GetAliveTeamNum() == 1) {
|
|
||||||
std::set<Human*>* alive_team = room->GetAliveTeam();
|
|
||||||
if (team_members != alive_team) {
|
|
||||||
SendGameOver();
|
|
||||||
}
|
|
||||||
if (alive_team) {
|
|
||||||
for (Human* member : *alive_team) {
|
|
||||||
member->SendGameOver();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DeadDrop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id)
|
void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id)
|
||||||
@ -2375,3 +2335,80 @@ void Human::FindLocationWithTarget(Entity* target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Human::OnDie()
|
||||||
|
{
|
||||||
|
room->OnHumanDie(this);
|
||||||
|
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||||
|
if (team_members) {
|
||||||
|
for (auto& hum : *team_members) {
|
||||||
|
if (hum != this && hum->action_type == AT_Relive &&
|
||||||
|
hum->action_target_id == entity_uniid) {
|
||||||
|
hum->CancelAction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!HasNoDownedTeammate() && !leave_) {
|
||||||
|
if (team_members) {
|
||||||
|
for (auto& member : *team_members) {
|
||||||
|
if (member == this) {
|
||||||
|
member->SendGameOver();
|
||||||
|
} else {
|
||||||
|
if (member->dead) {
|
||||||
|
member->SendGameOver();
|
||||||
|
} else if (member->downed) {
|
||||||
|
a8::XParams* timer_param = room->xtimer.MutableParams(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(__FILE__, __LINE__, __func__);
|
||||||
|
member->SendGameOver();
|
||||||
|
room->xtimer.DeleteTimer(member->downed_timer);
|
||||||
|
member->downed_timer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SendGameOver();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (room->GetAliveTeamNum() == 1) {
|
||||||
|
std::set<Human*>* alive_team = room->GetAliveTeam();
|
||||||
|
if (team_members != alive_team) {
|
||||||
|
SendGameOver();
|
||||||
|
}
|
||||||
|
if (alive_team) {
|
||||||
|
for (Human* member : *alive_team) {
|
||||||
|
member->SendGameOver();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DeadDrop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Human::Revive()
|
||||||
|
{
|
||||||
|
auto callback =
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
|
hum->dead = true;
|
||||||
|
hum->real_dead = true;
|
||||||
|
hum->OnDie();
|
||||||
|
};
|
||||||
|
int wait_revive_time = MetaMgr::Instance()->GetSysParamAsInt("revive_time", 15);
|
||||||
|
revive_timer = room->xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * wait_revive_time,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this),
|
||||||
|
callback,
|
||||||
|
&xtimer_attacher.timer_list_,
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
|
hum->revive_timer = nullptr;
|
||||||
|
});
|
||||||
|
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||||
|
}
|
||||||
|
@ -90,7 +90,7 @@ class Human : public Entity
|
|||||||
bool has_pass = 0;
|
bool has_pass = 0;
|
||||||
bool real_dead = false;
|
bool real_dead = false;
|
||||||
xtimer_list* revive_timer = nullptr;
|
xtimer_list* revive_timer = nullptr;
|
||||||
int revive_count = 0;
|
int dead_times = 0;
|
||||||
|
|
||||||
Weapon default_weapon;
|
Weapon default_weapon;
|
||||||
Weapon tank_weapon;
|
Weapon tank_weapon;
|
||||||
@ -226,6 +226,8 @@ private:
|
|||||||
void FillSMGameOver(cs::SMGameOver& msg);
|
void FillSMGameOver(cs::SMGameOver& msg);
|
||||||
void SendBattleReport();
|
void SendBattleReport();
|
||||||
void FindLocationWithTarget(Entity* target);
|
void FindLocationWithTarget(Entity* target);
|
||||||
|
void OnDie();
|
||||||
|
void Revive();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
long long last_shot_frameno_ = 0;
|
long long last_shot_frameno_ = 0;
|
||||||
|
@ -1080,3 +1080,18 @@ void Player::_CMLeave(f8::MsgHdr& hdr, const cs::CMLeave& msg)
|
|||||||
cs::SMLeave respmsg;
|
cs::SMLeave respmsg;
|
||||||
SendNotifyMsg(respmsg);
|
SendNotifyMsg(respmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::_CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg)
|
||||||
|
{
|
||||||
|
if (real_dead) {
|
||||||
|
SendGameOver();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (dead && !real_dead && revive_timer) {
|
||||||
|
dead = false;
|
||||||
|
health = GetMaxHP();
|
||||||
|
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||||
|
room->xtimer.DeleteTimer(revive_timer);
|
||||||
|
revive_timer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -88,5 +88,6 @@ class Player : public Human
|
|||||||
void _CMGameOver(f8::MsgHdr& hdr, const cs::CMGameOver& msg);
|
void _CMGameOver(f8::MsgHdr& hdr, const cs::CMGameOver& msg);
|
||||||
void _CMWatchWar(f8::MsgHdr& hdr, const cs::CMWatchWar& msg);
|
void _CMWatchWar(f8::MsgHdr& hdr, const cs::CMWatchWar& msg);
|
||||||
void _CMLeave(f8::MsgHdr& hdr, const cs::CMLeave& msg);
|
void _CMLeave(f8::MsgHdr& hdr, const cs::CMLeave& msg);
|
||||||
|
void _CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user