This commit is contained in:
aozhiwei 2021-04-08 13:44:52 +08:00
parent 8412b11f85
commit c8cb48afe2
10 changed files with 76 additions and 16 deletions

View File

@ -478,7 +478,7 @@ bool Creature::CanUseSkill(int skill_id)
if (!skill) { if (!skill) {
return false; return false;
} }
return skill->GetLeftTime() <= 0; return skill->GetCurrTimes() > 0;
} }
void Creature::DoSkill(int skill_id, void Creature::DoSkill(int skill_id,
@ -1452,3 +1452,10 @@ void Creature::RecoverSkillCasterState(SkillCasterState* caster_state)
skill_distance_ = caster_state->caster_skill_distance; skill_distance_ = caster_state->caster_skill_distance;
skill_param1 = caster_state->caster_skill_param1; skill_param1 = caster_state->caster_skill_param1;
} }
CreatureWeakPtr Creature::AllocWeakPtr()
{
CreatureWeakPtr ptr;
ptr.Attach(this);
return ptr;
}

View File

@ -134,6 +134,7 @@ class Creature : public MoveableEntity
bool CollisonDetection(); bool CollisonDetection();
void FillSkillCasterState(SkillCasterState* caster_state); void FillSkillCasterState(SkillCasterState* caster_state);
void RecoverSkillCasterState(SkillCasterState* caster_state); void RecoverSkillCasterState(SkillCasterState* caster_state);
CreatureWeakPtr AllocWeakPtr();
private: private:

View File

@ -250,16 +250,22 @@ void FrameEvent::RemoveBuff(Human* sender, int buff_id)
} }
} }
void FrameEvent::AddSkillCdChg(Human* sender, int skill_id, int left_time) void FrameEvent::AddSkillCdChg(CreatureWeakPtr sender, int skill_id, int left_time)
{ {
if (sender.Get() && sender.Get()->IsHuman()) {
chged_skillcds_.push_back(std::make_tuple(sender, skill_id, left_time)); chged_skillcds_.push_back(std::make_tuple(sender, skill_id, left_time));
int idx = chged_skillcds_.size() - 1; int idx = chged_skillcds_.size() - 1;
sender->TouchAllLayerHumanList ((Human*)sender.Get())->chged_skillcds_.push_back(idx);
( }
[idx] (Human* hum, bool& stop) }
void FrameEvent::AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int curr_times)
{ {
hum->chged_skillcds_.push_back(idx); if (sender.Get() && sender.Get()->IsHuman()) {
}); chged_skill_curr_times_.push_back(std::make_tuple(sender, skill_id, curr_times));
int idx = chged_skill_curr_times_.size() - 1;
((Human*)sender.Get())->chged_skill_curr_times_.push_back(idx);
}
} }
void FrameEvent::AddItemChg(Human* hum, int item_id, int item_num) void FrameEvent::AddItemChg(Human* hum, int item_id, int item_num)
@ -375,6 +381,9 @@ void FrameEvent::Clear()
if (!chged_skillcds_.empty()) { if (!chged_skillcds_.empty()) {
chged_skillcds_.clear(); chged_skillcds_.clear();
} }
if (!chged_skill_curr_times_.empty()) {
chged_skill_curr_times_.clear();
}
if (!chged_items_.empty()) { if (!chged_items_.empty()) {
chged_items_.clear(); chged_items_.clear();
} }

View File

@ -29,7 +29,8 @@ public:
void AddWeaponAmmoChg(Human* hum); void AddWeaponAmmoChg(Human* hum);
void AddBuff(Human* hum, Buff* buff); void AddBuff(Human* hum, Buff* buff);
void RemoveBuff(Human* hum, int buff_id); void RemoveBuff(Human* hum, int buff_id);
void AddSkillCdChg(Human* hum, int skill_id, int left_time); void AddSkillCdChg(CreatureWeakPtr sender, int skill_id, int left_time);
void AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int curr_times);
void AddItemChg(Human* hum, int item_id, int item_num); void AddItemChg(Human* hum, int item_id, int item_num);
void AddZombieIdChg(Human* hum); void AddZombieIdChg(Human* hum);
void AddDead(Human* sender, int revive_time); void AddDead(Human* sender, int revive_time);
@ -50,7 +51,8 @@ private:
std::vector<Human*> chged_bullet_nums_; std::vector<Human*> chged_bullet_nums_;
std::vector<std::tuple<Human*, int, int>> chged_weapon_ammo_; std::vector<std::tuple<Human*, int, int>> chged_weapon_ammo_;
std::vector<Human*> chged_hps_; std::vector<Human*> chged_hps_;
std::vector<std::tuple<Human*, int, int>> chged_skillcds_; std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skillcds_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skill_curr_times_;
std::vector<Human*> chged_zombieids_; std::vector<Human*> chged_zombieids_;
std::vector<Human*> chged_cars_; std::vector<Human*> chged_cars_;
std::vector<std::tuple<int, int, int>> dead_alive_objs_; std::vector<std::tuple<int, int, int>> dead_alive_objs_;

View File

@ -165,18 +165,33 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
for (size_t idx : hum->chged_skillcds_) { for (size_t idx : hum->chged_skillcds_) {
if (idx < room->frame_event.chged_skillcds_.size()) { if (idx < room->frame_event.chged_skillcds_.size()) {
auto tuple = room->frame_event.chged_skillcds_[idx]; auto tuple = room->frame_event.chged_skillcds_[idx];
Human* target = std::get<0>(tuple); CreatureWeakPtr target = std::get<0>(tuple);
int skill_id = std::get<1>(tuple); int skill_id = std::get<1>(tuple);
int left_time = std::get<2>(tuple); int left_time = std::get<2>(tuple);
{ if (target.Get()) {
auto p = msg->add_chged_property_list(); auto p = msg->add_chged_property_list();
p->set_obj_id(target->GetEntityUniId()); p->set_obj_id(target.Get()->GetEntityUniId());
p->set_property_type(kPropSkillLeftTime); p->set_property_type(kPropSkillLeftTime);
p->set_property_subtype(skill_id); p->set_property_subtype(skill_id);
p->set_value(left_time); p->set_value(left_time);
} }
} }
} }
for (size_t idx : hum->chged_skill_curr_times_) {
if (idx < room->frame_event.chged_skill_curr_times_.size()) {
auto tuple = room->frame_event.chged_skill_curr_times_[idx];
CreatureWeakPtr& target = std::get<0>(tuple);
int skill_id = std::get<1>(tuple);
int curr_times = std::get<2>(tuple);
if (target.Get()) {
auto p = msg->add_chged_property_list();
p->set_obj_id(target.Get()->GetEntityUniId());
p->set_property_type(kPropSkillCurrTimes);
p->set_property_subtype(skill_id);
p->set_value(curr_times);
}
}
}
for (size_t idx : hum->chged_hps_) { for (size_t idx : hum->chged_hps_) {
if (idx < room->frame_event.chged_hps_.size()) { if (idx < room->frame_event.chged_hps_.size()) {
Human* target = room->frame_event.chged_hps_[idx]; Human* target = room->frame_event.chged_hps_[idx];

View File

@ -1998,6 +1998,9 @@ void Human::ClearFrameData()
if (!chged_skillcds_.empty()) { if (!chged_skillcds_.empty()) {
chged_skillcds_.clear(); chged_skillcds_.clear();
} }
if (!chged_skill_curr_times_.empty()) {
chged_skill_curr_times_.clear();
}
if (!chged_items_.empty()) { if (!chged_items_.empty()) {
chged_items_.clear(); chged_items_.clear();
} }
@ -3359,7 +3362,9 @@ void Human::DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Ve
++stats.skill_times; ++stats.skill_times;
Skill* skill = GetSkill(skill_id); Skill* skill = GetSkill(skill_id);
if (skill) { if (skill) {
room->frame_event.AddSkillCdChg(this, skill_id, skill->GetLeftTime()); skill->DecTimes();
room->frame_event.AddSkillCdChg(AllocWeakPtr(), skill_id, skill->GetLeftTime());
room->frame_event.AddSkillCurrTimesChg(AllocWeakPtr(), skill_id, skill->GetCurrTimes());
} }
OnAttack(); OnAttack();
} }

View File

@ -316,6 +316,7 @@ protected:
std::vector<int> chged_bullet_nums_; std::vector<int> chged_bullet_nums_;
std::vector<int> chged_hps_; std::vector<int> chged_hps_;
std::vector<int> chged_skillcds_; std::vector<int> chged_skillcds_;
std::vector<int> chged_skill_curr_times_;
std::vector<int> chged_items_; std::vector<int> chged_items_;
std::vector<int> chged_weapon_ammo_; std::vector<int> chged_weapon_ammo_;
std::vector<int> chged_level_; std::vector<int> chged_level_;

View File

@ -448,6 +448,7 @@ namespace MetaData
void Skill::Init() void Skill::Init()
{ {
{ {
std::vector<std::string> strings; std::vector<std::string> strings;
a8::Split(i->buff_list(), strings, '|'); a8::Split(i->buff_list(), strings, '|');

View File

@ -28,6 +28,8 @@ void Skill::FillMFSkill(cs::MFSkill* skill_pb)
skill_pb->set_skill_id(meta->i->skill_id()); skill_pb->set_skill_id(meta->i->skill_id());
skill_pb->set_left_time(GetLeftTime()); skill_pb->set_left_time(GetLeftTime());
skill_pb->set_cd_time(GetCd()); skill_pb->set_cd_time(GetCd());
skill_pb->set_curr_times(GetCurrTimes());
skill_pb->set_max_times(meta->i->max_times());
} }
void Skill::ClearPassiveSkillBuff() void Skill::ClearPassiveSkillBuff()
@ -57,3 +59,16 @@ void Skill::AddPassiveSkillBuff()
owner->skill_target_id_ = old_skill_target_id_; owner->skill_target_id_ = old_skill_target_id_;
owner->skill_target_pos_ = old_skill_target_pos_; owner->skill_target_pos_ = old_skill_target_pos_;
} }
void Skill::DecTimes()
{
--curr_times_;
if (curr_times_ < 0) {
curr_times_ = 0;
}
}
int Skill::GetCurrTimes()
{
return curr_times_;
}

View File

@ -22,9 +22,13 @@ class Skill
int GetCd(); int GetCd();
int GetLeftTime(); int GetLeftTime();
int GetPassedTime(); int GetPassedTime();
int GetCurrTimes();
void DecTimes();
void FillMFSkill(cs::MFSkill* skill_pb); void FillMFSkill(cs::MFSkill* skill_pb);
void ClearPassiveSkillBuff(); void ClearPassiveSkillBuff();
void AddPassiveSkillBuff(); void AddPassiveSkillBuff();
private:
int curr_times_ = 0;
}; };