diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 6374429..9b84f86 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2762,3 +2762,32 @@ void Creature::OnBattleStart(Room* room) RemoveBuffByUniId(*itr); } } + +bool Creature::CanFollow(Creature* follower) +{ + if (follower->GetUniId() == GetUniId()) { + return false; + } + if (!follower->IsPlayer()) { + return false; + } + if (follower->team_id != team_id) { + return false; + } + #if 0 + if (follower->follow_target.Get()) { + return false; + } + #endif + if (!follower->HasBuffEffect(kBET_Jump)) { + return false; + } + + if (!IsPlayer()) { + return false; + } + if (!HasBuffEffect(kBET_Jump)) { + return false; + } + return true; +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index e33cd3d..9d8a8f3 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -238,6 +238,7 @@ class Creature : public MoveableEntity void TraverseBuff(std::function func); long long GetCollisionTimes() { return collision_times_; }; std::string DebugOutBuffList(); + bool CanFollow(Creature* follower); protected: virtual void OnBuffRemove(Buff& buff); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 0931b44..11ed5ab 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -398,7 +398,7 @@ long long Human::GetRealDeadFrameNo(Room* room) return real_dead_frameno; } -void Human::FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over) +void Human::FillMFTeamData(Human* hum, cs::MFTeamData* team_data, bool is_game_over) { { last_sync_teamdata_frameno_ = room->GetFrameNo(); @@ -447,6 +447,12 @@ void Human::FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over) room->GetFrameNo() - room->GetBattleStartFrameNo() < 4) { team_data->set_user_data(user_data); } + if (HasBuffEffect(kBET_Jump) && GetTeam()) { + bool can_follow = hum->CanFollow(this); + if (can_follow) { + team_data->set_can_follow(can_follow); + } + } } } @@ -652,7 +658,7 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) [this, &msg] (Human* member) -> bool { if (this != member) { - member->FillMFTeamData(msg.add_team_data(), true); + member->FillMFTeamData(this, msg.add_team_data(), true); cs::MFPlayerStats* p = msg.add_player_stats(); member->FillMFPlayerStats(p); } @@ -2429,7 +2435,7 @@ void Human::NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_pl [observer, msg] (Human* member) -> bool { if (member != observer) { - member->FillMFTeamData(msg->add_team_data(), false); + member->FillMFTeamData(observer, msg->add_team_data(), false); } return true; }); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 209d59c..5ad9875 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -180,7 +180,7 @@ class Human : public Creature virtual void OnExplosionHit(Explosion* explosion) override; void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list); long long GetRealDeadFrameNo(Room* room); - void FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over); + void FillMFTeamData(Human* hum, cs::MFTeamData* team_data, bool is_game_over); void CarShot(const a8::Vec2& target_dir); virtual void RecalcSelfCollider() override; void FindPathInMapService(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 0913a4f..6be89bb 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -20,6 +20,7 @@ #include "perfmonitor.h" #include "jsondatamgr.h" #include "skill.h" +#include "team.h" const int kREVIVE_BUFF_ID = 1005; @@ -1230,6 +1231,23 @@ void Player::UpdateAiming() void Player::UpdateFollow() { + if (follow == 0){ + if (follow_target.Get()) { + follow_target.Detach(); + room->frame_event.AddPropChg(GetWeakPtrRef(), kPropFollowTarget, 0, 0, true); + } + } else { + if (GetTeam()) { + Human* member = GetTeam()->GetMemberByUniId(follow); + if (member && member->CanFollow(this)) { + if (follow_target.Get()) { + follow_target.Detach(); + } + follow_target.Attach(member); + room->frame_event.AddPropChg(GetWeakPtrRef(), kPropFollowTarget, 0, follow, true); + } + } + } follow = -1; } diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index efb8041..1339963 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -108,3 +108,13 @@ void Team::CombineTeam(Team* b_team) return true; }); } + +Human* Team::GetMemberByUniId(int member_id) +{ + for (Human* member : members_) { + if (member->GetUniId() == member_id) { + return member; + } + } + return nullptr; +} diff --git a/server/gameserver/team.h b/server/gameserver/team.h index d10db98..a4d2e93 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -19,6 +19,7 @@ class Team bool IsFull(); void CombineBornPoint(); void CombineTeam(Team* b_team); + Human* GetMemberByUniId(int member_id); private: int team_id_ = 0;