150 lines
6.0 KiB
C++
150 lines
6.0 KiB
C++
#include "precompile.h"
|
|
|
|
#include "buff/machine_gun.h"
|
|
|
|
void MachineGunBuff::Activate()
|
|
{
|
|
hold_curr_weapon_idx_ = caster_.Get()->GetCurrWeapon()->weapon_idx;
|
|
{
|
|
std::vector<std::string> strings;
|
|
a8::Split(meta->buff_param1(), strings, ':');
|
|
for (size_t i = 0; i < strings.size(); ++i) {
|
|
int weapon_id = a8::XValue(strings[i]);
|
|
const mt::Equip* weapon_meta = mt::Equip::GetById(weapon_id);
|
|
if (weapon_meta && i < caster_.Get()->weapons.size()) {
|
|
int weapon_idx = weapon_meta->GetWeaponIdx();
|
|
if (weapon_idx >= 0 && weapon_idx < caster_.Get()->weapons.size()) {
|
|
Weapon* weapon = &caster_.Get()->weapons[weapon_idx];
|
|
hold_weapons_.push_back(*weapon);
|
|
|
|
weapon->weapon_id = weapon_meta->id();
|
|
weapon->meta = weapon_meta;
|
|
weapon->skill_meta = skill_meta;
|
|
weapon->Recalc();
|
|
weapon->ammo = weapon->GetClipVolume(owner);
|
|
if (i == 0) {
|
|
caster_.Get()->SetCurrWeapon(weapon);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
caster_.Get()->MarkSyncActivePlayer(__FILE__, __LINE__, __func__);
|
|
caster_.Get()->UpdateCharImage(__FILE__, __LINE__, __func__);
|
|
}
|
|
if (skill_meta && skill_meta->_number_meta) {
|
|
switch (skill_meta->GetMagicId()) {
|
|
case MAGIC_HLYZ:
|
|
{
|
|
owner->room->xtimer.ModifyTime
|
|
(remover_timer,
|
|
skill_meta->_number_meta->_float_time * 1000/ FRAME_RATE_MS);
|
|
}
|
|
break;
|
|
case MAGIC_HJHX:
|
|
{
|
|
owner->room->xtimer.ModifyTime
|
|
(remover_timer,
|
|
skill_meta->_number_meta->_float_time * 1000 / FRAME_RATE_MS);
|
|
owner->GetTrigger()->DispatchEvent(kStartSwitchWeaponBuffEvent, {this});
|
|
}
|
|
break;
|
|
case MAGIC_FG:
|
|
{
|
|
bool shot_ok = false;
|
|
a8::Vec2 target_dir;
|
|
float fly_distance = 0;
|
|
int trace_target_uniid = 0;
|
|
owner->Shot(owner->context_dir, shot_ok, fly_distance, trace_target_uniid);
|
|
|
|
owner->room->xtimer.ModifyTime
|
|
(remover_timer,
|
|
skill_meta->_number_meta->_float_time * 1000 / FRAME_RATE_MS);
|
|
event_handlers_.push_back
|
|
(
|
|
owner->GetTrigger()->AddListener
|
|
(
|
|
kSkillBulletPreCreateEvent,
|
|
[this] (const a8::Args& args)
|
|
{
|
|
int delay_time = args.Get<int>(0);
|
|
const mt::Skill* bullet_skill_meta = args.Get<const mt::Skill*>(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.ModifyTime
|
|
(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 a8::Args& args)
|
|
{
|
|
Bullet* bullet = args.Get<Bullet*>(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.ModifyTime
|
|
(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 a8::Args& args)
|
|
{
|
|
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
|
|
}
|
|
)
|
|
);
|
|
#ifdef DEBUG
|
|
{
|
|
std::string dbg_msg = a8::Format
|
|
(
|
|
"skill_id:%d 飞钩 距离:%f 钩子持续时间:%f",
|
|
{
|
|
skill_meta->skill_id(),
|
|
skill_meta->_number_meta->_float_range,
|
|
skill_meta->_number_meta->_float_time,
|
|
});
|
|
owner->SendDebugMsg(dbg_msg);
|
|
a8::XPrintf("%s\n", {dbg_msg});
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void MachineGunBuff::Deactivate()
|
|
{
|
|
owner->GetTrigger()->DispatchEvent(kEndSwitchWeaponBuffEvent, {this});
|
|
RecoverHoldWeapons();
|
|
}
|