1
This commit is contained in:
parent
53dae20b40
commit
0ceaf7efc6
@ -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();
|
||||||
|
}
|
||||||
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
@ -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_
|
||||||
);
|
);
|
||||||
|
@ -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);
|
||||||
|
@ -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, {});
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user