game2006/server/gameserver/buff/machine_gun.cc
aozhiwei eaa8683959 1
2022-12-29 09:06:38 +08:00

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();
}