This commit is contained in:
aozhiwei 2021-03-18 14:40:38 +08:00
parent e2ec2e8a83
commit ad0e12835f
4 changed files with 117 additions and 103 deletions

View File

@ -210,3 +210,107 @@ void Creature::FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>*
itr.FillMFBuff(buff); itr.FillMFBuff(buff);
} }
} }
void Creature::AddPassiveSkill(MetaData::Skill* skill_meta)
{
if (!HasPassiveSkill(skill_meta)) {
xtimer_list* tmp_timer = room->xtimer.AddRepeatTimerAndAttach
(
SERVER_FRAME_RATE * skill_meta->i->skill_cd(),
a8::XParams()
.SetSender(this)
.SetParam1(skill_meta),
[] (const a8::XParams& param)
{
Creature* c = (Creature*)param.sender.GetUserData();
MetaData::Skill* skill_meta = (MetaData::Skill*)param.param1.GetUserData();
c->ClearPassiveSkillBuff(skill_meta);
c->AddPassiveSkillBuff(skill_meta);
},
&xtimer_attacher.timer_list_);
passive_skill_metas_[skill_meta] = tmp_timer;
AddPassiveSkillBuff(skill_meta);
if (skill_meta->i->skill_cd() > 10000) {
//永久被动被动技能
AddPassiveSkillBuff(skill_meta);
}
}
}
void Creature::RemovePassiveSkill(MetaData::Skill* skill_meta)
{
auto itr = passive_skill_metas_.find(skill_meta);
if (itr != passive_skill_metas_.end()) {
ClearPassiveSkillBuff(skill_meta);
room->xtimer.DeleteTimer(itr->second);
passive_skill_metas_.erase(itr);
}
}
void Creature::ClearPassiveSkill()
{
std::vector<MetaData::Skill*> del_skills;
del_skills.reserve(passive_skill_metas_.size());
for (auto& pair : passive_skill_metas_) {
del_skills.push_back(pair.first);
}
for (MetaData::Skill* skill_meta : del_skills) {
RemovePassiveSkill(skill_meta);
}
}
bool Creature::HasPassiveSkill(MetaData::Skill* skill_meta)
{
return passive_skill_metas_.find(skill_meta) != passive_skill_metas_.end();
}
void Creature::ClearPassiveSkillBuff(MetaData::Skill* skill_meta)
{
for (int buff_id : skill_meta->buff_list) {
Buff* buff = GetBuffById(buff_id);
if (buff &&
(buff->meta->i->buff_target() == kBuffTargetSelf ||
buff->meta->i->buff_target() == kBuffTargetFriendly)) {
RemoveBuffById(buff_id);
}
}
}
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);
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::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type)
{
for (Entity* entity : target_list) {
TriggerOneObjectBuff(entity, trigger_type);
}
}
void Creature::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type)
{
}

View File

@ -34,6 +34,16 @@ 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 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);
protected: protected:
bool use_skill = false; bool use_skill = false;
@ -54,6 +64,7 @@ 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);
private: private:
std::array<float, kHAT_End> buff_attr_abs_ = {}; std::array<float, kHAT_End> buff_attr_abs_ = {};

View File

@ -3063,13 +3063,6 @@ void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type)
} }
} }
void Human::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type)
{
for (Entity* entity : target_list) {
TriggerOneObjectBuff(entity, trigger_type);
}
}
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);
@ -3871,93 +3864,6 @@ void Human::ResetSkill()
playing_skill = false; playing_skill = false;
} }
void Human::AddPassiveSkill(MetaData::Skill* skill_meta)
{
if (!HasPassiveSkill(skill_meta)) {
xtimer_list* tmp_timer = room->xtimer.AddRepeatTimerAndAttach
(
SERVER_FRAME_RATE * skill_meta->i->skill_cd(),
a8::XParams()
.SetSender(this)
.SetParam1(skill_meta),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
MetaData::Skill* skill_meta = (MetaData::Skill*)param.param1.GetUserData();
hum->ClearPassiveSkillBuff(skill_meta);
hum->AddPassiveSkillBuff(skill_meta);
},
&xtimer_attacher.timer_list_);
passive_skill_metas_[skill_meta] = tmp_timer;
AddPassiveSkillBuff(skill_meta);
if (skill_meta->i->skill_cd() > 10000) {
//永久被动被动技能
AddPassiveSkillBuff(skill_meta);
}
}
}
void Human::RemovePassiveSkill(MetaData::Skill* skill_meta)
{
auto itr = passive_skill_metas_.find(skill_meta);
if (itr != passive_skill_metas_.end()) {
ClearPassiveSkillBuff(skill_meta);
room->xtimer.DeleteTimer(itr->second);
passive_skill_metas_.erase(itr);
}
}
void Human::ClearPassiveSkill()
{
std::vector<MetaData::Skill*> del_skills;
del_skills.reserve(passive_skill_metas_.size());
for (auto& pair : passive_skill_metas_) {
del_skills.push_back(pair.first);
}
for (MetaData::Skill* skill_meta : del_skills) {
RemovePassiveSkill(skill_meta);
}
}
bool Human::HasPassiveSkill(MetaData::Skill* skill_meta)
{
return passive_skill_metas_.find(skill_meta) != passive_skill_metas_.end();
}
void Human::ClearPassiveSkillBuff(MetaData::Skill* skill_meta)
{
for (int buff_id : skill_meta->buff_list) {
Buff* buff = GetBuffById(buff_id);
if (buff &&
(buff->meta->i->buff_target() == kBuffTargetSelf ||
buff->meta->i->buff_target() == kBuffTargetFriendly)) {
RemoveBuffById(buff_id);
}
}
}
void Human::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);
skill_meta_= old_curr_skill;
skill_target_id_ = old_skill_target_id_;
skill_target_pos_ = old_skill_target_pos_;
}
void Human::OnMetaChange() void Human::OnMetaChange()
{ {
if (GetRace() == kZombieRace) { if (GetRace() == kZombieRace) {

View File

@ -247,8 +247,7 @@ class Human : public Creature
int GetSkillCd(); int GetSkillCd();
int GetSkillLv(); int GetSkillLv();
float GetSkillAtkAdd(int skill_id); float GetSkillAtkAdd(int skill_id);
void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type); virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) override;
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
int GetLevel() {return level_;}; int GetLevel() {return level_;};
int GetExp() {return exp_;}; int GetExp() {return exp_;};
void OnAttack() {}; void OnAttack() {};
@ -287,7 +286,7 @@ protected:
void ProcLootCar(Loot* entity, MetaData::Equip* item_meta); void ProcLootCar(Loot* entity, MetaData::Equip* item_meta);
void ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta); void ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta);
void ProcSpoils(Loot* entity, MetaData::Equip* item_meta); void ProcSpoils(Loot* entity, MetaData::Equip* item_meta);
void SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list); virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list) override;
void ProcSkillPhase(MetaData::SkillPhase* phase); void ProcSkillPhase(MetaData::SkillPhase* phase);
void AutoChgWeapon(); void AutoChgWeapon();
void CancelRevive(); void CancelRevive();
@ -313,12 +312,6 @@ private:
std::set<GridCell*>& dec_grids); std::set<GridCell*>& dec_grids);
void RemoveFromScene(); void RemoveFromScene();
void ResetSkill(); void ResetSkill();
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);
void OnMetaChange(); void OnMetaChange();
void OnChgToTerminator(); void OnChgToTerminator();
void ProcReloadAction(); void ProcReloadAction();