1
This commit is contained in:
parent
d8580561af
commit
35f117f946
@ -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);
|
||||
}
|
||||
},
|
||||
|
@ -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_;
|
||||
|
@ -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);
|
||||
|
@ -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() {};
|
||||
|
Loading…
x
Reference in New Issue
Block a user