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);
|
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 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_ = {};
|
||||||
|
@ -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) {
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user