From baa21030b77f3a4b7b31866cb2eb2690a27b05bd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 15 Jun 2021 16:53:14 +0800 Subject: [PATCH] car oil ok --- server/gameserver/car.cc | 14 ++++++++++++ server/gameserver/car.h | 5 +++++ server/gameserver/constant.h | 1 + server/gameserver/frameevent.cc | 29 +++++++++++++++++++++++++ server/gameserver/frameevent.h | 2 ++ server/gameserver/framemaker.cc | 9 ++++++++ server/gameserver/human.cc | 3 +++ server/gameserver/human.h | 1 + server/gameserver/player.cc | 16 ++++++++++++-- server/tools/protobuild/metatable.proto | 2 +- 10 files changed, 79 insertions(+), 3 deletions(-) diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 655ea10..51aff8b 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -43,6 +43,7 @@ void Car::Initialize() ability.hp = hero_meta_->i->health(); ability.max_hp = std::max(ability.hp, ability.max_hp); TryAddBuff(this, meta->car_deactive_buff_id); + cur_oil_ = meta->i->max_oil(); } void Car::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) @@ -72,6 +73,8 @@ void Car::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) p->set_dead(dead); p->set_health(GetHP()); p->set_max_health(GetMaxHP()); + p->set_oil(cur_oil_); + p->set_max_oil(meta->i->max_oil()); FillBuffList(hum, p->mutable_buff_list()); } @@ -403,3 +406,14 @@ void Car::SetAttackDir(const a8::Vec2& attack_dir) { Creature::SetAttackDir(attack_dir); } + +void Car::DecOil(float dec_oil) +{ + cur_oil_ -= dec_oil; + cur_oil_ = std::max(0.0f, cur_oil_); +} + +float Car::GetMaxOil() +{ + return meta->i->max_oil(); +} diff --git a/server/gameserver/car.h b/server/gameserver/car.h index 30ff654..50052d3 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -34,6 +34,10 @@ class Car : public Creature void SwitchSeat(Human* passenger, int seat); bool CanShot(Human* passenger); void SyncPos(); + float GetCurOil() { return cur_oil_; }; + float GetMaxOil(); + bool HasOil() { return cur_oil_ >= 0.00000001f; }; + void DecOil(float dec_oil); virtual float GetRadius() override; virtual float GetSpeed() override; virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; @@ -52,4 +56,5 @@ class Car : public Creature std::set passengers_; int cur_buff_id_ = 0; int cur_buff_idx_ = -1; + float cur_oil_ = 0; }; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index a5743fc..94af855 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -256,6 +256,7 @@ enum PropertyType_e kPropSkillLeftTime = 24, kPropSkillCurrTimes = 25, kPropSkillMaxTimes = 26, + kPropCarOil = 27, }; enum MapObjectType_e diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index ff32940..189ae64 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -366,6 +366,32 @@ void FrameEvent::AddCarChg(CreatureWeakPtr& sender) }); } +void FrameEvent::AddPropChg(CreatureWeakPtr& sender, int type, int subtype, float value, bool only_self) +{ + if (!sender.Get()) { + return; + } + auto& p = a8::FastAppend(chged_props_); + std::get<0>(p) = sender; + std::get<1>(p).set_obj_id(sender.Get()->GetUniId()); + std::get<1>(p).set_property_type(type); + std::get<1>(p).set_property_subtype(subtype); + std::get<1>(p).set_value(value); + int idx = chged_props_.size() - 1; + if (only_self) { + if (sender.Get()->IsHuman()) { + sender.Get()->AsHuman()->chged_props_.push_back(idx); + } + } else { + sender.Get()->TraverseAllLayerHumanList + ( + [idx] (Human* hum, bool& stop) + { + hum->chged_props_.push_back(idx); + }); + } +} + void FrameEvent::Clear() { if (!explosions_.empty()) { @@ -422,4 +448,7 @@ void FrameEvent::Clear() if (!chged_cars_.empty()) { chged_cars_.clear(); } + if (!chged_props_.empty()) { + chged_props_.clear(); + } } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 9b8747f..b80d3ce 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -37,6 +37,7 @@ public: void AddDead(CreatureWeakPtr& sender, int revive_time); void AddRevive(CreatureWeakPtr& sender); void AddCarChg(CreatureWeakPtr& sender); + void AddPropChg(CreatureWeakPtr& sender, int type, int subtype, float value, bool only_self = false); void Clear(); private: @@ -58,6 +59,7 @@ private: std::vector chged_zombieids_; std::vector chged_cars_; std::vector> dead_alive_objs_; + std::vector> chged_props_; friend class FrameMaker; }; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 02a5151..9d89460 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -308,6 +308,15 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) } } } + for (size_t idx : hum->chged_props_) { + if (idx < room->frame_event.chged_props_.size()) { + auto& p = room->frame_event.chged_props_[idx]; + auto& target = std::get<0>(p); + if (target.Get()) { + *msg->add_chged_property_list() = std::get<1>(p); + } + } + } if (room->GetRoomMode() == kZombieMode && room->BattleStarted()) { room->FillObjectPositions((Human*)hum, *msg); } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index d52466f..a17cc22 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2052,6 +2052,9 @@ void Human::ClearFrameData() if (!chged_cars_.empty()) { chged_cars_.clear(); } + if (!chged_props_.empty()) { + chged_props_.clear(); + } } void Human::GenBattleReportData(a8::MutableXObject* params) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index d457a48..62cb6e7 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -319,6 +319,7 @@ protected: std::vector chged_zombieid_; std::vector dead_alive_objs_; std::vector chged_cars_; + std::vector chged_props_; Human* follow_target_ = nullptr; bool follow_synced_active_player = false; Car* car_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 8a4dd7e..4faa9fc 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -152,8 +152,13 @@ void Player::UpdateMove() if (HasBuffEffect(kBET_Vertigo)) { return; } - if (GetCar() && GetCar()->HasBuffEffect(kBET_Vertigo)) { - return; + if (GetCar()) { + if (GetCar()->HasBuffEffect(kBET_Vertigo)) { + return; + } + if (!GetCar()->HasOil()) { + return; + } } if (HasBuffEffect(kBET_Passenger)) { return; @@ -167,6 +172,7 @@ void Player::UpdateMove() moved_frames = 0; return; } + a8::Vec2 old_pos = GetPos(); if (GetCar() && GetCar()->IsDriver(this)) { _UpdateMove(std::max(1, (int)GetCar()->GetSpeed())); } else { @@ -177,6 +183,12 @@ void Player::UpdateMove() } if (GetCar() && GetCar()->IsDriver(this)) { GetCar()->SyncPos(); + float dec_oil = old_pos.Distance(GetPos()) * GetCar()->meta->i->average_oil() / 100; + GetCar()->DecOil(dec_oil); + room->frame_event.AddPropChg(GetCar()->GetWeakPtrRef(), + kPropCarOil, + GetCar()->GetCurOil(), + GetCar()->GetMaxOil()); } #ifdef DEBUG room->CheckPartObjects(); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 38f0004..31bf741 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -126,7 +126,7 @@ message Equip optional int32 through_teammate = 54; optional int32 text_icon = 55; optional string special_damage_type = 56; - optional int32 max_oil = 57; + optional float max_oil = 57; optional float average_oil = 58; optional string inventory_slot = 31; //库存槽位