diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index ecedf4b..2dd5d73 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -88,3 +88,8 @@ void Buff::ProcReleaseFireBomb(const a8::XParams& param) } } } + +void Buff::ProcLastRecover(const a8::XParams& param) +{ + +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index f8a0581..43debb0 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -33,4 +33,5 @@ class Buff static void ProcLastBurn(const a8::XParams& param); static void ProcReleaseDcgr(const a8::XParams& param); static void ProcReleaseFireBomb(const a8::XParams& param); + static void ProcLastRecover(const a8::XParams& param); }; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index b4764bb..065c637 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -161,7 +161,7 @@ enum BuffEffectType_e kBET_OnceChgAttr = 11, //一次性buff kBET_LastRecover = 12, //持续回血 kBET_Shield = 13, //护盾 - kBET_ImmediatelyRevive = 14, //离开复活 + kBET_ImmediatelyRevive = 14, //立刻复活 kBET_End }; diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 71e03d1..f86f1cb 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -141,13 +141,13 @@ void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos) } } -void FrameEvent::AddDead(Human* hum) +void FrameEvent::AddDead(Human* hum, int revive_time) { { dead_objs_.push_back( std::make_tuple( hum->entity_uniid, - MetaMgr::Instance()->revive_time * 1000 + revive_time ) ); } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index ee88929..1383fde 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -19,7 +19,7 @@ public: float fly_distance, int hit_time, int target_id = 0, int skill_id = 0); void AddExplosion(int item_id, a8::Vec2 bomb_pos, int effect); void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos); - void AddDead(Human* hum); + void AddDead(Human* hum, int revive_time); void AddRevive(Human* hum); void AddBuff(Human* hum, Buff* buff); void RemoveBuff(Human* hum, int buff_id); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 0acbe43..288e26b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -459,6 +459,24 @@ void Human::ResetAction() void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) { if (!dead && !room->game_over) { + if (immediately_revive_times_ > 0) { + --immediately_revive_times_; + status = 0; + ClearBuffList(); + room->frame_event.AddDead(this, 0); + room->xtimer.AddDeadLineTimerAndAttach(1, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->ImmediatelyRevive(); + }, + &xtimer_attacher.timer_list_ + ); + return; + } + lethal_weapon = weapon_id; { Entity* entity = room->GetEntityByUniId(killer_id); @@ -486,7 +504,8 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) ); status = 0; ClearBuffList(); - room->frame_event.AddDead(this); + room->frame_event.AddDead(this, + MetaMgr::Instance()->revive_time * 1000); room->OnHumanDie(this); { OnLeaveGrass(); @@ -1165,6 +1184,10 @@ void Human::TriggerBuff(std::set& target_list, BuffTriggerType_e trigge void Human::AddBuff(MetaData::Buff* buff_meta) { + if (buff_meta->i->buff_effect() == kBET_ImmediatelyRevive) { + ++immediately_revive_times_; + return; + } if (GetBuffById(buff_meta->i->buff_id())) { return; } @@ -1242,6 +1265,16 @@ void Human::ClearBuffList() if (buff_effect_[itr->meta->i->buff_effect()] == &(*itr)) { buff_effect_[itr->meta->i->buff_effect()] = nullptr; } + switch (itr->meta->i->buff_effect()) { + case kBET_Shield: + { + energy_shield = 0.0f; + max_energy_shield = 0.0f; + } + break; + default: + break; + } room->frame_event.RemoveBuff(this, itr->meta->i->buff_id()); } buff_list_.clear(); @@ -1339,12 +1372,20 @@ void Human::ProcBuffEffect(Buff* buff) break; case kBET_LastRecover: { - + room->xtimer.AddRepeatTimerAndAttach( + kSERVER_FRAME_RATE, + a8::XParams() + .SetSender(this) + .SetParam1(buff), + Buff::ProcLastRecover, + &buff->xtimer_attacher.timer_list_ + ); } break; case kBET_Shield: { - + energy_shield = buff->meta->param1; + max_energy_shield = buff->meta->param1; } break; default: @@ -1806,6 +1847,28 @@ void Human::Revive() playing_skill = false; } +void Human::ImmediatelyRevive() +{ + dead = false; + ability.hp = GetMaxHP(); + status = 0; + ClearBuffList(); + { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(1003); + if (buff_meta) { + AddBuff(buff_meta); + } + } + room->frame_event.AddRevive(this); + + CheckSpecObject(); + use_skill = false; + curr_skill_phase = 0; + skill_dir = a8::Vec2(); + skill_param1 = 0.0f; + playing_skill = false; +} + void Human::SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list) { switch (skill_meta_->i->skill_target()) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index aa32ee1..1d7b554 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -212,6 +212,7 @@ private: void ClearFrameData(); void DeadDrop(); void Revive(); + void ImmediatelyRevive(); void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); Buff* GetBuffById(int buff_id); void ProcSkillPhase(MetaData::SkillPhase* phase); @@ -267,6 +268,7 @@ private: Tank tank_; long long send_gameover_trycount_ = 0; bool sending_gameover_ = false; + int immediately_revive_times_ = 0; xtimer_list* grass_hide_timer_list_ = nullptr; xtimer_list* leave_grass_timer_list_ = nullptr; diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index c17f8b4..3de0648 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -68,7 +68,12 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) hum->SetMeta(hum_meta); room->AddPlayer(hum); hum->ProcPrepareItems(msg.prepare_items()); - + for (int buff_id : msg.buff_list()) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta) { + hum->AddBuff(buff_meta); + } + } { cs::SMJoinedNotify notifymsg; notifymsg.set_error_code(0); diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index ef015b0..5ae2d5f 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -622,6 +622,7 @@ message CMJoin optional string from_appid = 21; //from_appid optional MFDriver driver = 22; //驾驶员 optional MFSkin tankskin = 23; //坦克皮肤 + repeated int32 buff_list = 24; //周边系统带进来的战斗数据(护盾,立刻复活等) repeated MFRoomMember room_member = 100; //房间成员(不包括自己) }