This commit is contained in:
aozhiwei 2022-10-11 14:14:38 +08:00
parent 53dae20b40
commit 0ceaf7efc6
6 changed files with 100 additions and 4 deletions

View File

@ -43,6 +43,7 @@ void Buff::UnInit()
*cb->next = (*cb->next)->next; *cb->next = (*cb->next)->next;
list_del_init(&cb->entry); list_del_init(&cb->entry);
} }
ClearEventHandlers();
} }
int Buff::GetLeftTime() int Buff::GetLeftTime()
@ -1022,7 +1023,65 @@ void Buff::ProcMachineGun()
owner->room->xtimer.ModifyTimer owner->room->xtimer.ModifyTimer
(remover_timer, (remover_timer,
skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS); skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS);
event_handlers_.push_back
(
owner->GetTrigger()->AddListener
(
kSkillBulletPreCreateEvent,
[this] (const std::vector<std::any>& params)
{
int delay_time = std::any_cast<int>(params.at(0));
MetaData::Skill* bullet_skill_meta = std::any_cast<MetaData::Skill*>(params.at(1));
int passed_frames = (owner->room->GetFrameNo() - add_frameno);
int raw_frames = skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS;
if (skill_meta == bullet_skill_meta &&
delay_time >= (passed_frames - raw_frames - 2) * FRAME_RATE_MS) {
int remain_time = owner->room->xtimer.GetRemainTime(remover_timer);
owner->room->xtimer.ModifyTimer
(remover_timer, delay_time / FRAME_RATE_MS + 2);
}
#ifdef DEBUG
a8::XPrintf("event1 %d %d %d\n", {passed_frames, raw_frames, delay_time});
#endif
}
)
);
event_handlers_.push_back
(
owner->GetTrigger()->AddListener
(
kFlyHookCreateEvent,
[this] (const std::vector<std::any>& params)
{
Bullet* bullet = std::any_cast<Bullet*>(params.at(0));
int passed_frames = (owner->room->GetFrameNo() - add_frameno);
int raw_frames = skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS;
owner->room->xtimer.ModifyTimer
(remover_timer,
skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS);
#ifdef DEBUG
a8::XPrintf("event2 %d %d\n", {passed_frames, raw_frames});
#endif
})
);
event_handlers_.push_back
(
owner->GetTrigger()->AddListener
(
kFlyHookDestoryEvent,
[this] (const std::vector<std::any>& params)
{
int passed_frames = (owner->room->GetFrameNo() - add_frameno);
int raw_frames = skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS;
if (passed_frames >= raw_frames) {
owner->RemoveBuffByUniId(buff_uniid);
}
#ifdef DEBUG
a8::XPrintf("event3 %d %d\n", {passed_frames, raw_frames});
#endif
}
)
);
} }
break; break;
default: default:
@ -1112,3 +1171,13 @@ void Buff::ProcRemoveHide()
} }
} }
} }
void Buff::ClearEventHandlers()
{
for (auto& handler : event_handlers_) {
if (!handler.expired()) {
owner->GetTrigger()->RemoveEventHandler(handler);
}
}
event_handlers_.clear();
}

View File

@ -26,6 +26,7 @@ struct RemoveBuffCbConext
class Human; class Human;
class Creature; class Creature;
struct EventHandlerPtr;
struct xtimer_list; struct xtimer_list;
class Buff class Buff
{ {
@ -90,9 +91,11 @@ class Buff
private: private:
void InternalTimerAddBuff(); void InternalTimerAddBuff();
void RecoverHoldWeapons(); void RecoverHoldWeapons();
void ClearEventHandlers();
private: private:
int hold_curr_weapon_idx_ = 0; int hold_curr_weapon_idx_ = 0;
std::list<Weapon> hold_weapons_; std::list<Weapon> hold_weapons_;
std::list<std::weak_ptr<EventHandlerPtr>> event_handlers_;
CreatureWeakPtr caster_; CreatureWeakPtr caster_;
}; };

View File

@ -46,6 +46,9 @@ void Bullet::Initialize()
sender.Get()->room->xtimer.ModifyTimer(buff->remover_timer, SERVER_FRAME_RATE * 10); sender.Get()->room->xtimer.ModifyTimer(buff->remover_timer, SERVER_FRAME_RATE * 10);
} }
} }
if (sender.Get()) {
sender.Get()->GetTrigger()->FlyHookCreate(this);
}
} }
} }
@ -653,6 +656,7 @@ void Bullet::Check(float distance)
Creature* c = (Creature*)param.sender.GetUserData(); Creature* c = (Creature*)param.sender.GetUserData();
c->DecDisableMoveTimes(); c->DecDisableMoveTimes();
c->DecDisableAttackDirTimes(); c->DecDisableAttackDirTimes();
c->GetTrigger()->FlyHookDestory();
}, },
&sender.Get()->xtimer_attacher.timer_list_ &sender.Get()->xtimer_attacher.timer_list_
); );
@ -883,6 +887,7 @@ void Bullet::ProcFlyHook(Entity* target)
{ {
Creature* c = (Creature*)param.sender.GetUserData(); Creature* c = (Creature*)param.sender.GetUserData();
c->DecDisableMoveTimes(); c->DecDisableMoveTimes();
c->GetTrigger()->FlyHookDestory();
}, },
&sender.Get()->xtimer_attacher.timer_list_ &sender.Get()->xtimer_attacher.timer_list_
); );

View File

@ -404,10 +404,10 @@ void InternalShot(Creature* c,
a8::XPrintf("bullet trace_target_uniid:%d\n", {bullet_info.trace_target_uniid}); a8::XPrintf("bullet trace_target_uniid:%d\n", {bullet_info.trace_target_uniid});
} }
#endif #endif
InternalCreateBullet(bullet_info);
if (bullet_info.skill_meta && bullet_info.skill_meta->number_meta) { if (bullet_info.skill_meta && bullet_info.skill_meta->number_meta) {
c->GetTrigger()->SkillBulletPreCreate(bullet_info.delay_time, bullet_info.skill_meta);
} }
InternalCreateBullet(bullet_info);
} }
} }
c->GetTrigger()->Shot(weapon_meta); c->GetTrigger()->Shot(weapon_meta);

View File

@ -387,7 +387,7 @@ void Trigger::RemoveBuffs(int cond, std::vector<int>& buffids)
std::weak_ptr<EventHandlerPtr> Trigger::AddListener(int event_id, CommonCbProc cb) std::weak_ptr<EventHandlerPtr> Trigger::AddListener(int event_id, CommonCbProc cb)
{ {
auto itr = listeners_hash_.find(event_id); auto itr = listeners_hash_.find(event_id);
if (itr != listeners_hash_.end()) { if (itr == listeners_hash_.end()) {
listeners_hash_[event_id] = list_head(); listeners_hash_[event_id] = list_head();
itr = listeners_hash_.find(event_id); itr = listeners_hash_.find(event_id);
INIT_LIST_HEAD(&itr->second); INIT_LIST_HEAD(&itr->second);
@ -448,3 +448,18 @@ void Trigger::YsBuffRemove(Buff* buff)
{ {
DispatchEvent(kYsRemoveEvent, {buff}); DispatchEvent(kYsRemoveEvent, {buff});
} }
void Trigger::SkillBulletPreCreate(int delay_time, MetaData::Skill* skill_meta)
{
DispatchEvent(kSkillBulletPreCreateEvent, {delay_time, skill_meta});
}
void Trigger::FlyHookCreate(Bullet* bullet)
{
DispatchEvent(kFlyHookCreateEvent, {bullet});
}
void Trigger::FlyHookDestory()
{
DispatchEvent(kFlyHookDestoryEvent, {});
}

View File

@ -4,6 +4,7 @@ namespace MetaData
{ {
struct Buff; struct Buff;
struct Equip; struct Equip;
struct Skill;
}; };
struct EventHandlerPtr struct EventHandlerPtr
@ -67,6 +68,9 @@ public:
void StartRescue(Human* target); void StartRescue(Human* target);
void EndRescue(Human* target); void EndRescue(Human* target);
void YsBuffRemove(Buff* buff); void YsBuffRemove(Buff* buff);
void SkillBulletPreCreate(int delay_time, MetaData::Skill* skill_meta);
void FlyHookCreate(Bullet* bullet);
void FlyHookDestory();
std::weak_ptr<EventHandlerPtr> AddListener(int event_id, CommonCbProc cb); std::weak_ptr<EventHandlerPtr> AddListener(int event_id, CommonCbProc cb);
void RemoveEventHandler(std::weak_ptr<EventHandlerPtr> handler_ptr); void RemoveEventHandler(std::weak_ptr<EventHandlerPtr> handler_ptr);