From 3c77e04f0089cf999d0169cf08572f90f18afcda Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 7 Sep 2021 11:36:33 +0000 Subject: [PATCH] 1 --- server/gameserver/creature.h | 1 + server/gameserver/human.cc | 64 ++++++++++++++++++++++++++++++++++++ server/gameserver/human.h | 1 + server/gameserver/player.cc | 61 +--------------------------------- server/gameserver/player.h | 1 - server/gameserver/room.cc | 9 ++++- server/gameserver/team.cc | 7 ++-- server/gameserver/team.h | 2 ++ 8 files changed, 82 insertions(+), 64 deletions(-) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index b404259..2a7c4cc 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -284,6 +284,7 @@ protected: int camouflage_aiming_addition_ = 0; long long last_follow_move_frameno_ = 0; int follow_target_last_chg_move_dir_times_ = -1; + xtimer_list* follow_target_timer_ = nullptr; private: CreatureWeakPtr weak_ptr_; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 11ed5ab..f07cd0a 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3662,3 +3662,67 @@ void Human::DropWeapon(int weapon_idx) } } } + +void Human::DoFollow(int target_id) +{ + if (target_id == 0){ + if (follow_target.Get()) { + follow_target.Detach(); + room->frame_event.AddPropChg(GetWeakPtrRef(), kPropFollowTarget, 0, 0, true); + if (follow_target_timer_) { + room->xtimer.DeleteTimer(follow_target_timer_); + } + } + } else { + if (GetTeam()) { + Human* member = GetTeam()->GetMemberByUniId(target_id); + if (member && member->CanFollow(this)) { + if (follow_target.Get()) { + follow_target.Detach(); + if (follow_target_timer_) { + room->xtimer.DeleteTimer(follow_target_timer_); + } + } + follow_target_last_chg_move_dir_times_ = -1; + follow_target.Attach(member); + room->frame_event.AddPropChg(GetWeakPtrRef(), kPropFollowTarget, 0, target_id, true); + follow_target_timer_ = room->xtimer.AddRepeatTimerAndAttach + ( + 400 / FRAME_RATE_MS, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Player* hum = (Player*)param.sender.GetUserData(); + if (!hum->follow_target.Get()) { + hum->room->xtimer.DeleteTimer(hum->room->xtimer.GetRunningTimer()); + return; + } + if (hum->room->GetGasData().gas_mode != GasInactive && + !(hum->follow_target.Get()->HasBuffEffect(kBET_Fly) || + hum->follow_target.Get()->HasBuffEffect(kBET_Jump)) + ){ + hum->follow_target.Detach(); + hum->room->xtimer.DeleteTimer(hum->room->xtimer.GetRunningTimer()); + return; + } + + if (hum->follow_target.Get()->HasBuffEffect(kBET_Jump)) { + if (hum->HasBuffEffect(kBET_Jump)) { + hum->FollowToTarget(); + } else { + hum->DoJump(); + } + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Player* hum = (Player*)param.sender.GetUserData(); + hum->follow_target_timer_ = nullptr; + }); + } + } + } + IncFollowTimes(); +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 8d9ed6a..85a5529 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -268,6 +268,7 @@ class Human : public Creature void GMAddItem(int item_id, int item_num); void ProcUseItem(int item_id); void StartRefreshViewTimer(); + void DoFollow(int target_id); protected: void _InternalUpdateMove(float speed); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e3fe57c..800c849 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1244,66 +1244,7 @@ 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); - if (follow_target_timer_) { - room->xtimer.DeleteTimer(follow_target_timer_); - } - } - } else { - if (GetTeam()) { - Human* member = GetTeam()->GetMemberByUniId(follow); - if (member && member->CanFollow(this)) { - if (follow_target.Get()) { - follow_target.Detach(); - if (follow_target_timer_) { - room->xtimer.DeleteTimer(follow_target_timer_); - } - } - follow_target_last_chg_move_dir_times_ = -1; - follow_target.Attach(member); - room->frame_event.AddPropChg(GetWeakPtrRef(), kPropFollowTarget, 0, follow, true); - follow_target_timer_ = room->xtimer.AddRepeatTimerAndAttach - ( - 400 / FRAME_RATE_MS, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Player* hum = (Player*)param.sender.GetUserData(); - if (!hum->follow_target.Get()) { - hum->room->xtimer.DeleteTimer(hum->room->xtimer.GetRunningTimer()); - return; - } - if (hum->room->GetGasData().gas_mode != GasInactive && - !(hum->follow_target.Get()->HasBuffEffect(kBET_Fly) || - hum->follow_target.Get()->HasBuffEffect(kBET_Jump)) - ){ - hum->follow_target.Detach(); - hum->room->xtimer.DeleteTimer(hum->room->xtimer.GetRunningTimer()); - return; - } - - if (hum->follow_target.Get()->HasBuffEffect(kBET_Jump)) { - if (hum->HasBuffEffect(kBET_Jump)) { - hum->FollowToTarget(); - } else { - hum->DoJump(); - } - } - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Player* hum = (Player*)param.sender.GetUserData(); - hum->follow_target_timer_ = nullptr; - }); - } - } - } - IncFollowTimes(); + DoFollow(follow); follow = -1; } diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 215d81a..64835a4 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -139,7 +139,6 @@ private: std::set receved_box_hash_; long long last_cmmove_frameno_ = 0; xtimer_list* watch_war_req_timer_ = nullptr; - xtimer_list* follow_target_timer_ = nullptr; friend class EntityFactory; }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 8282918..bc65d5c 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1360,7 +1360,9 @@ void Room::MatchTeam(Human* hum) if (pair.second != hum) { if (!hum->team_uuid.empty() && pair.second->team_uuid == hum->team_uuid) { if (!pair.second->GetTeam()) { - NewTeam()->AddMember(pair.second); + Team* new_team = NewTeam(); + new_team->SetInitTeamMemberNum(hum->init_team_member_num); + new_team->AddMember(pair.second); } if (!pair.second->GetTeam()->IsFull()) { pair.second->GetTeam()->AddMember(hum); @@ -1377,6 +1379,11 @@ void Room::MatchTeam(Human* hum) void Room::CombineTeam() { + #if 0 + if (MetaMgr::Instance()->prebattle_combine_team) { + return; + } + #endif std::map need_combine_teams; std::map need_combine_teams_copy; diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 9aa2a17..9121658 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -45,11 +45,14 @@ bool Team::HasAliveMember() void Team::AddMember(Human* member) { + if (!first_member_) { + first_member_ = member; + } member->team_id = team_id_; member->SetTeam(this); members_.insert(member); - if (member->GetFollowTimes() <= 0) { - + if (member->GetFollowTimes() <= 0 && member != first_member_ && !member->follow_target.Get()) { + member->DoFollow(first_member_->GetUniId()); } } diff --git a/server/gameserver/team.h b/server/gameserver/team.h index 7e2a45d..9230016 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -7,6 +7,7 @@ class Team public: Room* room = nullptr; + void SetInitTeamMemberNum(int init_num) { init_team_member_num_ = init_num; }; int GetTeamId() { return team_id_; } void SetTeamId(int team_id) { team_id_ = team_id; } void TraverseMembers(std::function func); @@ -26,4 +27,5 @@ class Team int team_id_ = 0; int init_team_member_num_ = 0; std::set members_; + Human* first_member_ = nullptr; };