This commit is contained in:
aozhiwei 2022-11-17 14:55:09 +08:00
parent 0ba7dcf07b
commit 76c7ace206
2 changed files with 87 additions and 31 deletions

View File

@ -23,6 +23,7 @@
#include "skill.h"
#include "team.h"
#include "httpproxy.h"
#include "roommgr.h"
const int kREVIVE_BUFF_ID = 1005;
@ -1181,46 +1182,53 @@ void Player::_CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg)
.SetParam2(msg.target_uniid()),
[] (a8::XParams& param, a8::XObject& data)
{
Room* room = RoomMgr::Instance()->GetRoomByUuid(param.sender);
if (!room) {
return;
}
Player* hum = room->GetPlayerByAccountId(param.param1.GetString());
if (!hum) {
return;
}
if (room->IsGameOver()) {
return;
}
a8::UnSetBitFlag(hum->status, CS_Reviving);
if (data.GetType() == a8::XOT_OBJECT &&
data.Get("errcode").GetInt() == 0) {
int revive_coin = data.Get("revive_coin");
room->xtimer.AddDeadLineTimerAndAttach
(
NEXT_FRAME_TIMER,
a8::XParams()
.SetSender(hum)
.SetParam1(param.param2.GetInt())
.SetParam2(revive_coin),
[] (const a8::XParams& param)
{
Player* hum = (Player*)param.sender.GetUserData();
hum->InternalRevive(param.param1, param.param2);
},
&hum->xtimer_attacher.timer_list_);
}
},
[] (a8::XParams& param, const std::string& response)
{
Room* room = RoomMgr::Instance()->GetRoomByUuid(param.sender);
if (!room) {
return;
}
Player* hum = room->GetPlayerByAccountId(param.param1.GetString());
if (!hum) {
return;
}
a8::UnSetBitFlag(hum->status, CS_Reviving);
},
url.c_str(),
*url_params
);
}
}
{
hum->dead = false;
hum->real_dead = false;
hum->downed = false;
SetHP(GetMaxHP());
SyncAroundPlayers(__FILE__, __LINE__, __func__);
room->frame_event.AddRevive(GetWeakPtrRef());
if (dead_timer) {
room->xtimer.DeleteTimer(dead_timer);
}
#ifdef DEBUG
a8::XPrintf("CMRevive self:%d %d pos:%d,%d\n",
{
GetUniId(),
hum->GetUniId(),
hum->GetPos().x,
hum->GetPos().y
});
#endif
{
int buff_uniid = TryAddBuff(this, kInvincibleBuffId);
if (buff_uniid) {
Buff* buff = GetBuffByUniId(buff_uniid);
if (buff) {
room->xtimer.ModifyTimer(buff->remover_timer, 6 * SERVER_FRAME_RATE);
}
}
}
}
}
void Player::_CMCancelRevive(f8::MsgHdr& hdr, const cs::CMCancelRevive& msg)
@ -1475,3 +1483,50 @@ void Player::AsyncRequestWatchWar(bool send_rsp_msg)
hum->watch_war_req_timer_ = nullptr;
});
}
void Player::InternalRevive(int target_uniid, int revive_coin)
{
if (room->IsGameOver()) {
return;
}
if (dead) {
return;
}
GetBattleContext()->SetReviveCoin(revive_coin);
room->frame_event.AddPropChg
(GetWeakPtrRef(),
kPropReviveCion,
0,
GetBattleContext()->GetReviveCoin(),
true);
Human* hum = room->GetHumanByUniId(target_uniid);
if (hum) {
hum->dead = false;
hum->real_dead = false;
hum->downed = false;
SetHP(GetMaxHP());
SyncAroundPlayers(__FILE__, __LINE__, __func__);
room->frame_event.AddRevive(GetWeakPtrRef());
if (dead_timer) {
room->xtimer.DeleteTimer(dead_timer);
}
a8::UdpLog::Instance()->Debug
("InternalRevive sender:%s target:%s pos:%f,%f",
{
account_id,
hum->account_id,
hum->GetPos().x,
hum->GetPos().y
});
{
int buff_uniid = TryAddBuff(this, kInvincibleBuffId);
if (buff_uniid) {
Buff* buff = GetBuffByUniId(buff_uniid);
if (buff) {
room->xtimer.ModifyTimer(buff->remover_timer, 6 * SERVER_FRAME_RATE);
}
}
}
}
}

View File

@ -131,6 +131,7 @@ private:
void InternalUpdate(int delta_time);
std::vector<std::tuple<int, int, int>>* GetBox(int box_id);
void CheckShotHoldState(Weapon* weapon);
void InternalRevive(int target_uniid, int revive_coin);
private:
long long last_cmmove_frameno_ = 0;