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) {
return;
}
MetaData::Skill* old_curr_skill = skill_meta_;
int old_skill_target_id_ = skill_target_id_;
a8::Vec2 old_skill_target_pos_ = skill_target_pos_;
skill_meta_ = skill_meta;
skill_target_id_ = GetEntityUniId();
skill_target_pos_ = GetPos();
std::set<Entity*> target_list;
SelectSkillTargets(GetPos(), target_list);
TriggerBuff(target_list, kBTT_UseSkill);
SelectSkillTargets(CurrentSkill(), GetPos(), target_list);
TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
skill_meta_= old_curr_skill;
skill_target_id_ = old_skill_target_id_;
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:
{
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);
}
});
@ -338,7 +335,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{
#if 0
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);
}
#endif
@ -353,7 +350,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{
#if 0
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);
}
#endif
@ -381,7 +378,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{
#if 0
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);
}
#endif
@ -396,7 +393,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{
#if 0
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);
}
#endif
@ -411,7 +408,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>&
{
#if 0
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);
}
#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) {
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)
@ -473,7 +508,7 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos)
ResetSkill();
playing_skill = true;
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();
}
@ -482,9 +517,10 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos)
Creature* c = (Creature*)entity;
std::set<Entity*> target_list;
skill_target_pos_ = c->GetPos();
SelectSkillTargets(c->GetPos(), target_list);
TriggerBuff(target_list, kBTT_UseSkill);
if (!skill_meta_->phases.empty() && skill_meta_->phases[0].time_offset <= 0) {
SelectSkillTargets(c->CurrentSkill(), c->GetPos(), target_list);
TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
if (!CurrentSkill()->meta->phases.empty() &&
CurrentSkill()->meta->phases[0].time_offset <= 0) {
UpdateSkill();
}
} else {
@ -518,9 +554,9 @@ void Creature::ResetSkill()
void Creature::UpdateSkill()
{
if (skill_meta_) {
if (curr_skill_phase < skill_meta_->phases.size()) {
MetaData::SkillPhase* phase = &skill_meta_->phases[curr_skill_phase];
if (CurrentSkill()) {
if (curr_skill_phase < CurrentSkill()->meta->phases.size()) {
MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase];
if (phase->time_offset >= CurrentSkill()->GetLeftTime()) {
ProcSkillPhase(phase);
++curr_skill_phase;
@ -565,11 +601,11 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase)
weapon_upgrade_meta,
bullet_meta,
1,
skill_meta_->i->skill_id(),
CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0,
target_distance,
false);
#endif
attack_dir = old_attack_dir;
#endif
}
}
}
@ -588,7 +624,8 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase)
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()
@ -748,7 +785,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
.SetSender(this)
.SetParam1(caster)
.SetParam2(buff->meta->param2)
.SetParam3(((Human*)caster)->skill_meta_),
.SetParam3(((Human*)caster)->CurrentSkill()->meta),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
@ -756,7 +793,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
int buff_id = param.param2;
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
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);
}
},

View File

@ -42,19 +42,17 @@ class Creature : public MoveableEntity
float GetBuffAttrAbs(int attr_id);
float GetBuffAttrRate(int attr_id);
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);
void AddSkill(int skill_id);
void ClearSkill();
void AddPassiveSkill(MetaData::Skill* skill_meta);
void RemovePassiveSkill(MetaData::Skill* skill_meta);
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);
void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos);
void ResetSkill();
@ -69,13 +67,18 @@ private:
virtual void AddBuffPostProc(Creature* caster, Buff* buff);
virtual void OnBuffRemove(const Buff& buff);
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 DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void _UpdateMove(int speed) {};
void UpdateSkill();
void ProcSkillPhase(MetaData::SkillPhase* phase);
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:
std::array<float, kHAT_End> buff_attr_abs_ = {};
@ -86,7 +89,6 @@ private:
a8::Vec2 skill_dir;
float skill_param1 = 0;
bool playing_skill = false;
MetaData::Skill* skill_meta_ = nullptr;
size_t curr_skill_phase = 0;
int skill_target_id_ = 0;
a8::Vec2 skill_target_pos_;

View File

@ -2009,10 +2009,10 @@ void Human::_UpdateSpecMove()
metatable::Skill* mutable_skill_meta = (metatable::Skill*)CurrentSkill()->meta->i;
float old_skill_distance = CurrentSkill()->meta->i->skill_distance();
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);
TriggerBuff(target_list, kBTT_SkillHit);
TriggerBuff(CurrentSkill(), target_list, kBTT_SkillHit);
}
RemoveBuffByEffectId(kBET_JumpTo);
}
@ -2897,47 +2897,6 @@ Skin* Human::GetSkinByIdx(int idx)
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)
{
room->frame_event.AddBuff(this, buff);

View File

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