1
This commit is contained in:
parent
77389dab68
commit
167f9f87cd
@ -12,10 +12,11 @@
|
||||
enum CreatureStatus
|
||||
{
|
||||
CS_AlreadyLordMode = 1,
|
||||
CS_Disable = 2,
|
||||
CS_Collisioning = 3,
|
||||
CS_DisableAttack = 8,
|
||||
CS_ForceTeam = 9,
|
||||
CS_Disable,
|
||||
CS_Collisioning,
|
||||
CS_DisableAttack,
|
||||
CS_ForceTeam,
|
||||
CS_PreDieSuspended,
|
||||
CS_End
|
||||
};
|
||||
|
||||
|
@ -1129,63 +1129,35 @@ void Human::FillSMGameOver(cs::SMGameOver& msg)
|
||||
|
||||
void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (IsPlayer()) {
|
||||
a8::XPrintf("BeKill %d\n", {GetUniId()});
|
||||
}
|
||||
#endif
|
||||
if (!dead && !room->IsGameOver() && !real_dead) {
|
||||
KillInfo info;
|
||||
{
|
||||
info.killer_id = killer_id;
|
||||
info.killer_name = killer_name;
|
||||
info.weapon_id = weapon_id;
|
||||
}
|
||||
|
||||
{
|
||||
++stats.dead_times;
|
||||
stats.killer_id = killer_id;
|
||||
stats.killer_name = killer_name;
|
||||
stats.weapon_id = weapon_id;
|
||||
}
|
||||
{
|
||||
Entity* killer = room->GetEntityByUniId(killer_id);
|
||||
if (killer && killer->IsCreature(room)) {
|
||||
((Creature*)killer)->GetTrigger()->Kill(this, weapon_id);
|
||||
}
|
||||
}
|
||||
if (room->IsPveRoom()){
|
||||
dead = true;
|
||||
real_dead = false;
|
||||
downed = false;
|
||||
SetHP(0.0f);
|
||||
KillMgr::Instance()->OnHumanDead(this, &info);
|
||||
room->frame_event.AddDead(GetWeakPtrRef(), 1000 * 15);
|
||||
dead_timer = room->xtimer.AddDeadLineTimerAndAttach
|
||||
(MetaMgr::Instance()->revive_time * SERVER_FRAME_RATE,
|
||||
if (!dead && !room->IsGameOver() && !real_dead && !a8::HasBitFlag(status, CS_PreDieSuspended)) {
|
||||
GetTrigger()->PreDie();
|
||||
if (over_delay_time > 0) {
|
||||
a8::SetBitFlag(status, CS_PreDieSuspended);
|
||||
room->xtimer.AddDeadLineTimerAndAttach
|
||||
(over_delay_time / FRAME_RATE_MS,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
.SetSender(this)
|
||||
.SetParam1(killer_id)
|
||||
.SetParam2(killer_name)
|
||||
.SetParam3(weapon_id),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->real_dead = true;
|
||||
hum->over_delay_time = 0;
|
||||
a8::UnSetBitFlag(hum->status, CS_PreDieSuspended);
|
||||
hum->InternalBeKill
|
||||
(
|
||||
param.param1,
|
||||
param.param2.GetString(),
|
||||
param.param3
|
||||
);
|
||||
},
|
||||
&xtimer_attacher.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->dead_timer = nullptr;
|
||||
});
|
||||
} else {
|
||||
dead = true;
|
||||
real_dead = true;
|
||||
downed = false;
|
||||
SetHP(0.0f);
|
||||
dead_frameno = room->GetFrameNo();
|
||||
GetTrigger()->Die();
|
||||
OnDie();
|
||||
KillMgr::Instance()->OnHumanDead(this, &info);
|
||||
room->frame_event.AddDead(GetWeakPtrRef(), 0);
|
||||
} else {
|
||||
InternalBeKill(killer_id, killer_name, weapon_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1894,24 +1866,7 @@ void Human::SendGameOver()
|
||||
} else {
|
||||
if (!sending_battlereport_) {
|
||||
sending_battlereport_ = true;
|
||||
if (over_delay_time > 0) {
|
||||
room->xtimer.AddDeadLineTimerAndAttach
|
||||
(over_delay_time / FRAME_RATE_MS,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->SendBattleReport();
|
||||
hum->over_delay_time = 0;
|
||||
},
|
||||
&xtimer_attacher.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
});
|
||||
} else {
|
||||
SendBattleReport();
|
||||
}
|
||||
SendBattleReport();
|
||||
}
|
||||
if (!is_game_end_) {
|
||||
GameLog::Instance()->GameEnd((Player*)this);
|
||||
@ -4384,3 +4339,66 @@ void Human::WinPveScore(int score)
|
||||
{
|
||||
stats.pve_rank_score += score;
|
||||
}
|
||||
|
||||
void Human::InternalBeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (IsPlayer()) {
|
||||
a8::XPrintf("BeKill %d\n", {GetUniId()});
|
||||
}
|
||||
#endif
|
||||
if (!dead && !room->IsGameOver() && !real_dead) {
|
||||
KillInfo info;
|
||||
{
|
||||
info.killer_id = killer_id;
|
||||
info.killer_name = killer_name;
|
||||
info.weapon_id = weapon_id;
|
||||
}
|
||||
|
||||
{
|
||||
++stats.dead_times;
|
||||
stats.killer_id = killer_id;
|
||||
stats.killer_name = killer_name;
|
||||
stats.weapon_id = weapon_id;
|
||||
}
|
||||
{
|
||||
Entity* killer = room->GetEntityByUniId(killer_id);
|
||||
if (killer && killer->IsCreature(room)) {
|
||||
((Creature*)killer)->GetTrigger()->Kill(this, weapon_id);
|
||||
}
|
||||
}
|
||||
if (room->IsPveRoom()){
|
||||
dead = true;
|
||||
real_dead = false;
|
||||
downed = false;
|
||||
SetHP(0.0f);
|
||||
KillMgr::Instance()->OnHumanDead(this, &info);
|
||||
room->frame_event.AddDead(GetWeakPtrRef(), 1000 * 15);
|
||||
dead_timer = room->xtimer.AddDeadLineTimerAndAttach
|
||||
(MetaMgr::Instance()->revive_time * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->real_dead = true;
|
||||
},
|
||||
&xtimer_attacher.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->dead_timer = nullptr;
|
||||
});
|
||||
} else {
|
||||
dead = true;
|
||||
real_dead = true;
|
||||
downed = false;
|
||||
SetHP(0.0f);
|
||||
dead_frameno = room->GetFrameNo();
|
||||
GetTrigger()->Die();
|
||||
OnDie();
|
||||
KillMgr::Instance()->OnHumanDead(this, &info);
|
||||
room->frame_event.AddDead(GetWeakPtrRef(), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -390,6 +390,7 @@ private:
|
||||
void NextReload(int prev_weapon_id, int prev_weapon_idx);
|
||||
void DoGetOnWithLoot(Loot* loot_entity);
|
||||
void DoGetOnWithCar(Car* car);
|
||||
void InternalBeKill(int killer_id, const std::string& killer_name, int weapon_id);
|
||||
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
|
||||
virtual void OnBuffRemove(Buff& buff) override;
|
||||
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos) override;
|
||||
|
@ -1010,7 +1010,7 @@ namespace MetaData
|
||||
auto field_desc = descriptor->FindFieldByName(a8::Format("phase%d_param3", {idx}));
|
||||
phase.param3_str = reflection->GetString(*(metatable::Skill*)i, field_desc);
|
||||
}
|
||||
if (phase.func_id != kSkill_FuncNone) {
|
||||
{
|
||||
phase.param1 = a8::XValue(phase.param1_str);
|
||||
phase.param2 = a8::XValue(phase.param2_str);
|
||||
phase.param3 = a8::XValue(phase.param3_str);
|
||||
@ -1035,7 +1035,10 @@ namespace MetaData
|
||||
phase.param3_ints.push_back(a8::XValue(str));
|
||||
}
|
||||
}
|
||||
phases.push_back(phase);
|
||||
if (phase.func_id != kSkill_FuncNone) {
|
||||
phases.push_back(phase);
|
||||
}
|
||||
raw_phases.push_back(phase);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -322,6 +322,7 @@ namespace MetaData
|
||||
std::set<int> buff_list;
|
||||
std::map<int, std::set<MetaData::Buff*>> trigger_type_buffs;
|
||||
std::vector<MetaData::SkillPhase> phases;
|
||||
std::vector<MetaData::SkillPhase> raw_phases;
|
||||
bool IsTurnOverSkill() const;
|
||||
int GetMagicId() const;
|
||||
private:
|
||||
|
@ -468,7 +468,7 @@ void Skill::ProcSWZB()
|
||||
{
|
||||
owner->GetTrigger()->AddListener
|
||||
(
|
||||
kDieEvent,
|
||||
kPreDieEvent,
|
||||
[this] (const std::vector<std::any>& params)
|
||||
{
|
||||
CreatureWeakPtr sender = owner->GetWeakPtrRef();
|
||||
@ -516,8 +516,8 @@ void Skill::ProcSWZB()
|
||||
SkillHelper::GetSwzbEffect(meta),
|
||||
0
|
||||
);
|
||||
if (!meta->phases.empty()) {
|
||||
owner->over_delay_time = meta->phases.at(0).param1;
|
||||
if (!meta->raw_phases.empty()) {
|
||||
owner->over_delay_time = meta->raw_phases.at(0).param1;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
{
|
||||
|
@ -232,6 +232,11 @@ void Trigger::ReceiveDmg()
|
||||
DispatchEvent(kReceiveDmgEvent, {});
|
||||
}
|
||||
|
||||
void Trigger::PreDie()
|
||||
{
|
||||
DispatchEvent(kPreDieEvent, {});
|
||||
}
|
||||
|
||||
void Trigger::Die()
|
||||
{
|
||||
{
|
||||
|
@ -25,6 +25,7 @@ enum EventId_e
|
||||
kShotEvent,
|
||||
kReceiveDmgEvent,
|
||||
kKillEvent,
|
||||
kPreDieEvent,
|
||||
kDieEvent,
|
||||
kShieldDestoryEvent,
|
||||
kFlyHookPullEvent,
|
||||
@ -62,6 +63,7 @@ public:
|
||||
void UseSkill(Skill* skill);
|
||||
void HpChg();
|
||||
void ReceiveDmg();
|
||||
void PreDie();
|
||||
void Die();
|
||||
void ActiveBuff(MetaData::Buff* buff_meta);
|
||||
void DeactiveBuff(MetaData::Buff* buff_meta);
|
||||
|
Loading…
x
Reference in New Issue
Block a user