This commit is contained in:
aozhiwei 2021-03-19 15:11:10 +08:00
parent d8580561af
commit 35f117f946
4 changed files with 79 additions and 82 deletions

View File

@ -292,33 +292,30 @@ void Creature::AddPassiveSkillBuff(MetaData::Skill* skill_meta)
if (!skill_meta) { if (!skill_meta) {
return; return;
} }
MetaData::Skill* old_curr_skill = skill_meta_;
int old_skill_target_id_ = skill_target_id_; int old_skill_target_id_ = skill_target_id_;
a8::Vec2 old_skill_target_pos_ = skill_target_pos_; a8::Vec2 old_skill_target_pos_ = skill_target_pos_;
skill_meta_ = skill_meta;
skill_target_id_ = GetEntityUniId(); skill_target_id_ = GetEntityUniId();
skill_target_pos_ = GetPos(); skill_target_pos_ = GetPos();
std::set<Entity*> target_list; std::set<Entity*> target_list;
SelectSkillTargets(GetPos(), target_list); SelectSkillTargets(CurrentSkill(), GetPos(), target_list);
TriggerBuff(target_list, kBTT_UseSkill); TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
skill_meta_= old_curr_skill;
skill_target_id_ = old_skill_target_id_; skill_target_id_ = old_skill_target_id_;
skill_target_pos_ = old_skill_target_pos_; skill_target_pos_ = old_skill_target_pos_;
} }
void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list) void Creature::SelectSkillTargets(Skill* skill, const a8::Vec2& target_pos, std::set<Entity*>& target_list)
{ {
switch (CurrentSkill()->meta->i->skill_target()) { switch (skill->meta->i->skill_target()) {
case kST_All: case kST_All:
{ {
TouchAllLayerHumanList TouchAllLayerHumanList
( (
[this, &target_pos, &target_list] (Human* hum, bool& stop) [this, skill, &target_pos, &target_list] (Human* hum, bool& stop)
{ {
if (hum->GetPos().Distance(target_pos) < CurrentSkill()->meta->i->skill_distance()) { if (hum->GetPos().Distance(target_pos) < skill->meta->i->skill_distance()) {
target_list.insert(hum); target_list.insert(hum);
} }
}); });
@ -338,7 +335,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{ {
#if 0 #if 0
if ((hum == this || hum->team_id == team_id) && if ((hum == this || hum->team_id == team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->meta->i->skill_distance()) { hum->GetPos().Distance(target_pos) < skill->meta->i->skill_distance()) {
target_list.insert(hum); target_list.insert(hum);
} }
#endif #endif
@ -353,7 +350,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{ {
#if 0 #if 0
if ((hum != this && hum->team_id == team_id) && if ((hum != this && hum->team_id == team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) {
target_list.insert(hum); target_list.insert(hum);
} }
#endif #endif
@ -381,7 +378,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{ {
#if 0 #if 0
if ((hum->team_id != team_id) && if ((hum->team_id != team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) {
target_list.insert(hum); target_list.insert(hum);
} }
#endif #endif
@ -396,7 +393,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{ {
#if 0 #if 0
if ((hum->team_id != team_id) && if ((hum->team_id != team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) {
target_list.insert(hum); target_list.insert(hum);
} }
#endif #endif
@ -411,7 +408,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{ {
#if 0 #if 0
if ((hum == this || this->IsEnemy(hum)) && if ((hum == this || this->IsEnemy(hum)) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) {
target_list.insert(hum); target_list.insert(hum);
} }
#endif #endif
@ -437,16 +434,54 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
} }
} }
void Creature::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type) void Creature::TriggerBuff(Skill* skill, std::set<Entity*>& target_list, BuffTriggerType_e trigger_type)
{ {
for (Entity* entity : target_list) { for (Entity* entity : target_list) {
TriggerOneObjectBuff(entity, trigger_type); TriggerOneObjectBuff(skill, entity, trigger_type);
} }
} }
void Creature::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) void Creature::TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type)
{ {
#if 0
if (!target->IsEntityType(ET_Player)) {
return;
}
Human* hum = (Human*)target;
if (hum->dead) {
return;
}
auto itr = CurrentSkill()->meta->trigger_type_buffs.find(trigger_type);
if (itr != CurrentSkill()->meta->trigger_type_buffs.end()) {
for (MetaData::Buff* buff_meta : itr->second) {
switch (buff_meta->i->buff_target()) {
case kBuffTargetSelf: //自己
{
if (hum == this) {
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
case kBuffTargetFriendly: //友军
{
if (hum->team_id == team_id) {
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
case kBuffTargetEnemy: //敌军
{
if (hum->team_id != team_id) {
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
default:
break;
}
}
}
#endif
} }
Skill* Creature::GetSkill(int skill_id) Skill* Creature::GetSkill(int skill_id)
@ -473,7 +508,7 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos)
ResetSkill(); ResetSkill();
playing_skill = true; playing_skill = true;
CurrentSkill()->last_use_frameno = room->GetFrameNo(); CurrentSkill()->last_use_frameno = room->GetFrameNo();
if (skill_meta_->i->skill_target() == kST_Self if (CurrentSkill()->meta->i->skill_target() == kST_Self
) { ) {
skill_target_id_ = GetEntityUniId(); skill_target_id_ = GetEntityUniId();
} }
@ -482,9 +517,10 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos)
Creature* c = (Creature*)entity; Creature* c = (Creature*)entity;
std::set<Entity*> target_list; std::set<Entity*> target_list;
skill_target_pos_ = c->GetPos(); skill_target_pos_ = c->GetPos();
SelectSkillTargets(c->GetPos(), target_list); SelectSkillTargets(c->CurrentSkill(), c->GetPos(), target_list);
TriggerBuff(target_list, kBTT_UseSkill); TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
if (!skill_meta_->phases.empty() && skill_meta_->phases[0].time_offset <= 0) { if (!CurrentSkill()->meta->phases.empty() &&
CurrentSkill()->meta->phases[0].time_offset <= 0) {
UpdateSkill(); UpdateSkill();
} }
} else { } else {
@ -518,9 +554,9 @@ void Creature::ResetSkill()
void Creature::UpdateSkill() void Creature::UpdateSkill()
{ {
if (skill_meta_) { if (CurrentSkill()) {
if (curr_skill_phase < skill_meta_->phases.size()) { if (curr_skill_phase < CurrentSkill()->meta->phases.size()) {
MetaData::SkillPhase* phase = &skill_meta_->phases[curr_skill_phase]; MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase];
if (phase->time_offset >= CurrentSkill()->GetLeftTime()) { if (phase->time_offset >= CurrentSkill()->GetLeftTime()) {
ProcSkillPhase(phase); ProcSkillPhase(phase);
++curr_skill_phase; ++curr_skill_phase;
@ -565,11 +601,11 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase)
weapon_upgrade_meta, weapon_upgrade_meta,
bullet_meta, bullet_meta,
1, 1,
skill_meta_->i->skill_id(), CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0,
target_distance, target_distance,
false); false);
#endif
attack_dir = old_attack_dir; attack_dir = old_attack_dir;
#endif
} }
} }
} }
@ -588,7 +624,8 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase)
MetaData::SkillPhase* Creature::GetCurrSkillPhase() MetaData::SkillPhase* Creature::GetCurrSkillPhase()
{ {
return curr_skill_phase < skill_meta_->phases.size() ? &skill_meta_->phases[curr_skill_phase] : nullptr; return curr_skill_phase < CurrentSkill()->meta->phases.size() ?
&CurrentSkill()->meta->phases[curr_skill_phase] : nullptr;
} }
Skill* Creature::CurrentSkill() Skill* Creature::CurrentSkill()
@ -748,7 +785,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
.SetSender(this) .SetSender(this)
.SetParam1(caster) .SetParam1(caster)
.SetParam2(buff->meta->param2) .SetParam2(buff->meta->param2)
.SetParam3(((Human*)caster)->skill_meta_), .SetParam3(((Human*)caster)->CurrentSkill()->meta),
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
Human* hum = (Human*)param.sender.GetUserData(); Human* hum = (Human*)param.sender.GetUserData();
@ -756,7 +793,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
int buff_id = param.param2; int buff_id = param.param2;
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (buff_meta && skill == caster->skill_meta_ && caster) { if (buff_meta && skill == caster->CurrentSkill()->meta && caster) {
hum->AddBuff(caster, buff_meta, 1, skill); hum->AddBuff(caster, buff_meta, 1, skill);
} }
}, },

View File

@ -42,19 +42,17 @@ class Creature : public MoveableEntity
float GetBuffAttrAbs(int attr_id); float GetBuffAttrAbs(int attr_id);
float GetBuffAttrRate(int attr_id); float GetBuffAttrRate(int attr_id);
void FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* pb_buff_list); void FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* pb_buff_list);
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type); void TriggerBuff(Skill* skill, std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
Skill* GetSkill(int skill_id); Skill* GetSkill(int skill_id);
void AddSkill(int skill_id); void AddSkill(int skill_id);
void ClearSkill(); void ClearSkill();
void AddPassiveSkill(MetaData::Skill* skill_meta); void AddPassiveSkill(MetaData::Skill* skill_meta);
void RemovePassiveSkill(MetaData::Skill* skill_meta); void RemovePassiveSkill(MetaData::Skill* skill_meta);
void ClearPassiveSkill(); void ClearPassiveSkill();
bool HasPassiveSkill(MetaData::Skill* skill_meta);
void ClearPassiveSkillBuff(MetaData::Skill* skill_meta);
void AddPassiveSkillBuff(MetaData::Skill* skill_meta);
virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list); virtual void SelectSkillTargets(Skill* skill,
const a8::Vec2& target_pos,
std::set<Entity*>& target_list);
virtual bool CanUseSkill(int skill_id); virtual bool CanUseSkill(int skill_id);
void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos); void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos);
void ResetSkill(); void ResetSkill();
@ -69,13 +67,18 @@ private:
virtual void AddBuffPostProc(Creature* caster, Buff* buff); virtual void AddBuffPostProc(Creature* caster, Buff* buff);
virtual void OnBuffRemove(const Buff& buff); virtual void OnBuffRemove(const Buff& buff);
virtual void SendDebugMsg(const std::string& debug_msg); virtual void SendDebugMsg(const std::string& debug_msg);
virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type);
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos); virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos); virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void _UpdateMove(int speed) {}; virtual void _UpdateMove(int speed) {};
void UpdateSkill(); void UpdateSkill();
void ProcSkillPhase(MetaData::SkillPhase* phase); void ProcSkillPhase(MetaData::SkillPhase* phase);
void ProcBuffEffect(Creature* caster, Buff* buff); void ProcBuffEffect(Creature* caster, Buff* buff);
void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type);
bool HasPassiveSkill(MetaData::Skill* skill_meta);
void ClearPassiveSkillBuff(MetaData::Skill* skill_meta);
void AddPassiveSkillBuff(MetaData::Skill* skill_meta);
private: private:
std::array<float, kHAT_End> buff_attr_abs_ = {}; std::array<float, kHAT_End> buff_attr_abs_ = {};
@ -86,7 +89,6 @@ private:
a8::Vec2 skill_dir; a8::Vec2 skill_dir;
float skill_param1 = 0; float skill_param1 = 0;
bool playing_skill = false; bool playing_skill = false;
MetaData::Skill* skill_meta_ = nullptr;
size_t curr_skill_phase = 0; size_t curr_skill_phase = 0;
int skill_target_id_ = 0; int skill_target_id_ = 0;
a8::Vec2 skill_target_pos_; a8::Vec2 skill_target_pos_;

View File

@ -2009,10 +2009,10 @@ void Human::_UpdateSpecMove()
metatable::Skill* mutable_skill_meta = (metatable::Skill*)CurrentSkill()->meta->i; metatable::Skill* mutable_skill_meta = (metatable::Skill*)CurrentSkill()->meta->i;
float old_skill_distance = CurrentSkill()->meta->i->skill_distance(); float old_skill_distance = CurrentSkill()->meta->i->skill_distance();
mutable_skill_meta->set_skill_distance(CurrentSkill()->meta->phases[0].param1.GetDouble()); mutable_skill_meta->set_skill_distance(CurrentSkill()->meta->phases[0].param1.GetDouble());
SelectSkillTargets(GetPos(), target_list); SelectSkillTargets(CurrentSkill(), GetPos(), target_list);
mutable_skill_meta->set_skill_distance(old_skill_distance); mutable_skill_meta->set_skill_distance(old_skill_distance);
TriggerBuff(target_list, kBTT_SkillHit); TriggerBuff(CurrentSkill(), target_list, kBTT_SkillHit);
} }
RemoveBuffByEffectId(kBET_JumpTo); RemoveBuffByEffectId(kBET_JumpTo);
} }
@ -2897,47 +2897,6 @@ Skin* Human::GetSkinByIdx(int idx)
return nullptr; return nullptr;
} }
void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type)
{
if (!target->IsEntityType(ET_Player)) {
return;
}
Human* hum = (Human*)target;
if (hum->dead) {
return;
}
auto itr = CurrentSkill()->meta->trigger_type_buffs.find(trigger_type);
if (itr != CurrentSkill()->meta->trigger_type_buffs.end()) {
for (MetaData::Buff* buff_meta : itr->second) {
switch (buff_meta->i->buff_target()) {
case kBuffTargetSelf: //自己
{
if (hum == this) {
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
case kBuffTargetFriendly: //友军
{
if (hum->team_id == team_id) {
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
case kBuffTargetEnemy: //敌军
{
if (hum->team_id != team_id) {
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
default:
break;
}
}
}
}
void Human::AddBuffPostProc(Creature* caster, Buff* buff) void Human::AddBuffPostProc(Creature* caster, Buff* buff)
{ {
room->frame_event.AddBuff(this, buff); room->frame_event.AddBuff(this, buff);

View File

@ -237,7 +237,6 @@ class Human : public Creature
void RandSkin(); void RandSkin();
void SetSkin(int idx, int skin_id); void SetSkin(int idx, int skin_id);
Skin* GetSkinByIdx(int idx); Skin* GetSkinByIdx(int idx);
virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) override;
int GetLevel() {return level_;}; int GetLevel() {return level_;};
int GetExp() {return exp_;}; int GetExp() {return exp_;};
void OnAttack() {}; void OnAttack() {};