1
This commit is contained in:
parent
e2ec2e8a83
commit
ad0e12835f
@ -210,3 +210,107 @@ void Creature::FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>*
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -34,6 +34,16 @@ 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 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:
|
||||
bool use_skill = false;
|
||||
@ -54,6 +64,7 @@ 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);
|
||||
|
||||
private:
|
||||
std::array<float, kHAT_End> buff_attr_abs_ = {};
|
||||
|
@ -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)
|
||||
{
|
||||
room->frame_event.AddBuff(this, buff);
|
||||
@ -3871,93 +3864,6 @@ void Human::ResetSkill()
|
||||
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()
|
||||
{
|
||||
if (GetRace() == kZombieRace) {
|
||||
|
@ -247,8 +247,7 @@ class Human : public Creature
|
||||
int GetSkillCd();
|
||||
int GetSkillLv();
|
||||
float GetSkillAtkAdd(int skill_id);
|
||||
void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type);
|
||||
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
|
||||
virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) override;
|
||||
int GetLevel() {return level_;};
|
||||
int GetExp() {return exp_;};
|
||||
void OnAttack() {};
|
||||
@ -287,7 +286,7 @@ protected:
|
||||
void ProcLootCar(Loot* entity, MetaData::Equip* item_meta);
|
||||
void ProcCamoutflage(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 AutoChgWeapon();
|
||||
void CancelRevive();
|
||||
@ -313,12 +312,6 @@ private:
|
||||
std::set<GridCell*>& dec_grids);
|
||||
void RemoveFromScene();
|
||||
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 OnChgToTerminator();
|
||||
void ProcReloadAction();
|
||||
|
Loading…
x
Reference in New Issue
Block a user