From f4a57bffe796812d52d84c092d993b36bef04cbf Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 26 Sep 2022 13:06:18 +0800 Subject: [PATCH] 1 --- server/gameserver/constant.h | 7 +++++++ server/gameserver/creature.cc | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 8847d1b4..040ea611 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -237,6 +237,7 @@ enum EquipType_e { EQUIP_TYPE_WEAPON = 1, EQUIP_TYPE_BULLET = 2, + EQUIP_TYPE_THROW = 3, EQUIP_TYPE_PROTECTION = 4, EQUIP_TYPE_BAG = 7, EQUIP_TYPE_OLDSKIN = 8, @@ -255,6 +256,12 @@ enum GunSubEquipType_e GUN_SUB_EQUIP_TYPE_End }; +enum ThrowSubEquipType_e +{ + THROW_EQUIP_TYPE_ADD_BUFF = 3, + THROW_SUB_EQUIP_TYPE_End +}; + enum EntitySubType_e { EST_None = 0, diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 7754f902..1f2280bf 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1205,6 +1205,36 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) if (std::abs(skill_dir_.x) > FLT_EPSILON || std::abs(skill_dir_.y) > FLT_EPSILON) { float target_distance = 5; + if (weapon_meta->i->equip_type() == EQUIP_TYPE_THROW && + weapon_meta->i->equip_subtype() == THROW_EQUIP_TYPE_ADD_BUFF) { + target_distance = skill_distance_; + room->xtimer.AddDeadLineTimerAndAttach + ( + (target_distance / weapon_meta->i->bullet_speed()) * 1000.0f / FRAME_RATE_MS, + a8::XParams() + .SetSender(this) + .SetParam1(context_pos.x) + .SetParam2(context_pos.y) + .SetParam3(weapon_meta), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + MetaData::Equip* equip_meta = (MetaData::Equip*)param.param3.GetUserData(); + + a8::Vec2 context_pos; + context_pos.x = param.param1.GetDouble(); + context_pos.x = param.param2.GetDouble(); + a8::Vec2 old_context_pos = c->context_pos; + c->TryAddBuff(c, equip_meta->int_param1); + c->context_pos = context_pos; + c->context_pos = old_context_pos; + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + + }); + } if (bullet_meta && target_distance > 0.00001f) { a8::Vec2 old_attack_dir = GetAttackDir(); a8::Vec2 attack_dir = skill_dir_;