diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 135993e4..567cdb95 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -17,6 +17,7 @@ enum CreatureStatus CS_DisableAttack, CS_ForceTeam, CS_PreDieSuspended, + CS_DeadNoDrop, CS_End }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 53ea6911..445ea32b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2295,6 +2295,9 @@ void Human::DeadDrop() #endif }; + if (a8::HasBitFlag(status, CS_DeadNoDrop)) { + return; + } if (GetRace() == kHumanRace && !HasBuffEffect(kBET_Terminator) && !(HasBuffEffect(kBET_Become) && GetBuffByEffectId(kBET_Become)->FreezeOperate())) { diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 48cb2bbe..9c7e8725 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -846,33 +846,38 @@ void Skill::ProcFH() kDieEvent, [this, relive_times] (const std::vector& params) mutable { + int killer_id = std::any_cast(params.at(0)); if (relive_times <= 0) { ++relive_times; - owner->real_dead = false; - owner->room->xtimer.AddDeadLineTimerAndAttach - ( - meta->number_meta->float_time * 1000 / FRAME_RATE_MS, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Skill* skill = (Skill*)param.sender.GetUserData(); - Creature* owner = skill->owner; - owner->dead = false; - owner->real_dead = false; - owner->downed = false; - owner->SetHP(owner->GetMaxHP() * skill->meta->number_meta->float_ratio2); - owner->SyncAroundPlayers(__FILE__, __LINE__, __func__); - owner->room->frame_event.AddRevive(owner->GetWeakPtrRef()); - owner->TryAddBuff(owner, - skill->meta->number_meta->pb->buff_id(), - skill->meta); - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - } - ); + if (killer_id != owner->GetUniId()) { + owner->real_dead = false; + a8::SetBitFlag(owner->status, CS_DeadNoDrop); + owner->room->xtimer.AddDeadLineTimerAndAttach + ( + meta->number_meta->float_time * 1000 / FRAME_RATE_MS, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Skill* skill = (Skill*)param.sender.GetUserData(); + Creature* owner = skill->owner; + owner->dead = false; + owner->real_dead = false; + owner->downed = false; + a8::UnSetBitFlag(owner->status, CS_DeadNoDrop); + owner->SetHP(owner->GetMaxHP() * skill->meta->number_meta->float_ratio2); + owner->SyncAroundPlayers(__FILE__, __LINE__, __func__); + owner->room->frame_event.AddRevive(owner->GetWeakPtrRef()); + owner->TryAddBuff(owner, + skill->meta->number_meta->pb->buff_id(), + skill->meta); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + } + ); + } } } );