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