diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 06c7fdd..1a74116 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -262,6 +262,7 @@ float Car::GetRadius() float Car::GetSpeed() { float speed = hero_meta_->i->move_speed(); + speed *= 1 + GetAbility()->GetAttrRate(kHAT_Speed); return speed; } @@ -380,9 +381,7 @@ void Car::SetAttackDir(const a8::Vec2& attack_dir) void Car::DecOil(float dec_oil) { - if (driver_) { - dec_oil *= 1 + driver_->GetAbility()->GetAttrRate(kHAT_CarOil); - } + dec_oil *= 1 + GetAbility()->GetAttrRate(kHAT_CarOil); cur_oil_ -= dec_oil; cur_oil_ = std::max(0.0f, cur_oil_); if (!HasOil()) { diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 1ec7ebe..7b3d0b4 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -160,12 +160,11 @@ enum HumanAttrType_e kHAT_WeaponReloadTime = 22, kHAT_WeaponExplosionRange = 23, kHAT_WeaponExplosionTime = 24, - kHAT_GasDmg = 25, + kHAT_PoisoningReduction = 25, kHAT_RescueTime = 26, kHAT_DrugTime = 27, kHAT_DrugEfficacy = 28, kHAT_CarOil = 29, - kHAT_CarDmg = 30, kHAT_End }; diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 846a956..b2fb6c7 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -12,6 +12,9 @@ const int kInIceBuffId = 7008; const int kBeRecycleBuffId = 7009; const int kTraceBuffId = 7011; const int kInMountainTopBuffId = 7014; +const int kDownBuffId = 7015; +const int kPoisioningBuffId = 7016; +const int kRescueBuffId = 7017; enum BuffEffectType_e { @@ -58,6 +61,11 @@ enum BuffEffectType_e kBET_SelectTargetWithSelfPos = 40, //已自己坐标为中心范围内选取目标,并且批量添加buff kBET_CondAddBuff = 41, //条件添加buff kBET_AddInventory = 42, //扩充库存 + kBET_Down = 43, //倒下 + kBET_Poisoning = 44, //中毒(毒圈中) + kBET_Rescue = 45, //救援 + kBET_AddCarBuff = 46, //给载具加buff + kBET_RemoveCarBuff = 47, //移除载具身上的buff kBET_FollowMaster = 49, //跟随主人 kBET_ThroughWall = 50, //穿墙 diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 3c08bf2..cf0211c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1200,11 +1200,15 @@ void Creature::UpdatePoisoning() } bool need_notify = poisoning_time > 1000; while (poisoning_time > 1000) { + float dmg = 0; if (room->GetGasData().is_last_gas) { - DecHP(room->GetGasData().new_area_meta->i->hurt(), VP_SafeArea, TEXT("battle_server_killer_gas", "毒圈"), VW_SafeArea); + dmg = room->GetGasData().new_area_meta->i->hurt(); } else { - DecHP(room->GetGasData().old_area_meta->i->hurt(), VP_SafeArea, TEXT("battle_server_killer_gas", "毒圈"), VW_SafeArea); + dmg = room->GetGasData().old_area_meta->i->hurt(); } + dmg *= 1 + GetAbility()->GetAttrRate(kHAT_PoisoningReduction); + dmg = std::max(10.0f, dmg); + DecHP(dmg, VP_SafeArea, TEXT("battle_server_killer_gas", "毒圈"), VW_SafeArea); if (dead) { poisoning_time = 0; break; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index b719351..e007c87 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3012,7 +3012,7 @@ void Human::ProcUseItemAction() switch (action_item_id) { case IS_HEALTHKIT: { - AddHp(item_meta->i->heal()); + AddHp(item_meta->i->heal() * (1 + GetAbility()->GetAttrRate(kHAT_DrugEfficacy))); DecInventory(item_meta->i->_inventory_slot(), 1); GetTrigger()->UseItemAction(action_item_id); } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index f58c5d8..823568b 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -320,53 +320,32 @@ void Player::UpdateUseItemIdx() return; } if (use_item_idx >= 0 && use_item_idx < IS_END) { - switch (use_item_idx) { - case IS_HEALTHKIT: - { - MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(use_item_idx); - if (item_meta) { + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(use_item_idx); + if (item_meta) { + int use_time = item_meta->i->use_time(); + switch (use_item_idx) { + case IS_HEALTHKIT: + case IS_PAIN_KILLER: + case IS_SHEN_BAO: + { + use_time -= GetAbility()->GetAttrAbs(kHAT_DrugTime); + use_time = std::max(1000, use_time); StartAction( AT_UseItem, - item_meta->i->use_time(), + use_time, use_item_idx, 0 ); } - } - break; - case IS_PAIN_KILLER: - { - MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(use_item_idx); - if (item_meta) { - StartAction( - AT_UseItem, - item_meta->i->use_time(), - use_item_idx, - 0 - ); - } - } - break; - case IS_SHEN_BAO: - { - MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(use_item_idx); - if (item_meta) { - StartAction( - AT_UseItem, - item_meta->i->use_time(), - use_item_idx, - 0 - ); - } - } - break; - default: - { + break; + default: + { + } + break; } - break; + GetTrigger()->UseItemAction(use_item_idx); } - GetTrigger()->UseItemAction(use_item_idx); } use_item_idx = 0; use_item = false; @@ -800,15 +779,18 @@ void Player::HumanInteraction(Human* hum) if (hum->GetActionType() == AT_Rescue) { return; } + int downed_relive_time = MetaMgr::Instance()->GetSysParamAsInt("downed_relive_time") * 1000; + downed_relive_time -= GetAbility()->GetAttrAbs(kHAT_RescueTime); + downed_relive_time = std::max(1000, downed_relive_time); hum->StartAction( AT_Rescue, - MetaMgr::Instance()->GetSysParamAsInt("downed_relive_time") * 1000, + downed_relive_time, room->GetFrameNo(), GetUniId() ); StartAction( AT_Relive, - MetaMgr::Instance()->GetSysParamAsInt("downed_relive_time") * 1000, + downed_relive_time, room->GetFrameNo(), hum->GetUniId() );