This commit is contained in:
aozhiwei 2021-09-07 11:36:33 +00:00
parent 7894f91e25
commit 3c77e04f00
8 changed files with 82 additions and 64 deletions

View File

@ -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_;

View File

@ -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();
}

View File

@ -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);

View File

@ -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;
}

View File

@ -139,7 +139,6 @@ private:
std::set<int> 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;
};

View File

@ -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<int, size_t> need_combine_teams;
std::map<int, size_t> need_combine_teams_copy;

View File

@ -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());
}
}

View File

@ -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<bool (Human*)> func);
@ -26,4 +27,5 @@ class Team
int team_id_ = 0;
int init_team_member_num_ = 0;
std::set<Human*> members_;
Human* first_member_ = nullptr;
};