diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 8250c4de..49ee2ccc 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -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); + } + } + } + } +} diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 97287ccd..db572343 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -131,6 +131,7 @@ private: void InternalUpdate(int delta_time); std::vector>* GetBox(int box_id); void CheckShotHoldState(Weapon* weapon); + void InternalRevive(int target_uniid, int revive_coin); private: long long last_cmmove_frameno_ = 0;