diff --git a/server/gameserver/buff/machine_gun.cc b/server/gameserver/buff/machine_gun.cc index e2170431..5c51589c 100644 --- a/server/gameserver/buff/machine_gun.cc +++ b/server/gameserver/buff/machine_gun.cc @@ -38,6 +38,7 @@ void MachineGunBuff::SwitchWeapons() Weapon* weapon = &caster_.Get()->weapons[weapon_idx]; hold_weapons_.push_back(*weapon); + weapon->weapon_uniid = 0; weapon->weapon_id = weapon_meta->id(); weapon->meta = weapon_meta; weapon->skill_meta = skill_meta; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index a3a2d4eb..cc6e1bb9 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -166,6 +166,9 @@ void Hero::DetachFromMaster() void Hero::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, int real_killer_id, const std::string& real_killer_name) { + if (!room->BattleStarted()) { + return; + } if (dec_hp < 0.001f) { return; } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a8f6490c..4171502d 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -453,15 +453,31 @@ float Human::GetSpeed() if (GetCurrWeapon()->weapon_idx == GUN_SLOT1 || GetCurrWeapon()->weapon_idx == GUN_SLOT2) { if (action_type != AT_Reload) { - return meta->shot_speed() * (1 + GetAbility()->GetAttrRate(kHAT_ShotSpeed)); + speed = meta->shot_speed() * (1 + GetAbility()->GetAttrRate(kHAT_ShotSpeed)); + if (HasBuffEffect(kBET_InWater)) { + speed *= mt::Param::s().water_move_coefficient; + } + return speed; } } } else if (aiming) { - return std::max(1, meta->aiming_speed()); + speed = std::max(1, meta->aiming_speed()); + if (HasBuffEffect(kBET_InWater)) { + speed *= mt::Param::s().water_move_coefficient; + } + return speed; } else if (action_type == AT_Reload) { - return std::max(1, meta->reload_speed()); + speed = std::max(1, meta->reload_speed()); + if (HasBuffEffect(kBET_InWater)) { + speed *= mt::Param::s().water_move_coefficient; + } + return speed; } else if (action_type == AT_UseItem) { - return std::max(1, meta->useitem_speed()); + speed = std::max(1, meta->useitem_speed()); + if (HasBuffEffect(kBET_InWater)) { + speed *= mt::Param::s().water_move_coefficient; + } + return speed; } speed = meta->move_speed(); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index d2a0098e..61377797 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -247,6 +247,8 @@ class Human : public Creature int pain_killer_lastingtime = 0; a8::XTimerWp pain_killer_timer; + a8::XTimerWp shen_bao_timer; + a8::XTimerWp downed_timer; std::set kill_humans; diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index 3c28a947..f36e4cbb 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -956,12 +956,12 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data) int action_param = 0; switch (action_item_id) { case IS_HEALTHKIT: - case IS_SHEN_BAO: { action_param = item_meta->heal(); } break; case IS_PAIN_KILLER: + case IS_SHEN_BAO: { action_param = item_meta->heal() * item_meta->time(); }