diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index 94111219..18dd58fc 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -108,6 +108,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&ggmsghandler, &Player::_CMCancelRevive); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMRequestBulletDmg); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMStowShield); + RegisterNetMsgHandler(&ggmsghandler, &Player::_CMTeamMarkTargetPos); } void HandlerMgr::ProcGMMsg(unsigned long saddr, int sockhandle, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 10a222e0..d29ffc5e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4840,3 +4840,22 @@ void Human::FillMFSettlement(cs::SMGameOver* msg, cs::MFSettlement* s) } } } + +void Human::NotifyTeamMarkTargetPos() +{ + if (GetTeam()) { + cs::SMTeamMarkTargetPosList notify_msg; + for (auto& pair : GetTeam()->target_pos) { + auto p = notify_msg.add_pos_list(); + p->set_obj_uniid(pair.first); + TypeConvert::ToPb(pair.second, p->mutable_pos()); + } + GetTeam()->TraverseMembers + ( + [¬ify_msg] (Human* hum) + { + hum->SendNotifyMsg(notify_msg); + return true; + }); + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 60b6a5db..ccbe2231 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -363,6 +363,7 @@ class Human : public Creature void DecOxygen(int val); void WinPveScore(int score); int GetTeamMode(); + void NotifyTeamMarkTargetPos(); protected: void _InternalUpdateMove(float speed); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index da3dcce6..b2bc2728 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1320,6 +1320,20 @@ void Player::_CMStowShield(f8::MsgHdr& hdr, const cs::CMStowShield& msg) RemoveBuffByEffectId(kBET_HoldShield); } +void Player::_CMTeamMarkTargetPos(f8::MsgHdr& hdr, const cs::CMTeamMarkTargetPos& msg) +{ + if (GetTeam()) { + if (msg.has_pos()) { + a8::Vec2 pos; + pos.x = msg.pos().x(); + pos.y = msg.pos().y(); + GetTeam()->target_pos[GetUniId()] = pos; + } else { + GetTeam()->target_pos.erase(GetUniId()); + } + } +} + void Player::PushJoinRoomMsg() { if (!a8::HasBitFlag(status, CS_ForceTeam)) { diff --git a/server/gameserver/player.h b/server/gameserver/player.h index fbe99576..ca74a453 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -11,6 +11,7 @@ namespace cs class CMVoice; class CMStowShield; class CMImmediateMsg; + class CMTeamMarkTargetPos; class MFActivePlayerData; class MFGasData; class MFPair; @@ -124,6 +125,7 @@ class Player : public Human void _CMCancelRevive(f8::MsgHdr& hdr, const cs::CMCancelRevive& msg); void _CMRequestBulletDmg(f8::MsgHdr& hdr, const cs::CMRequestBulletDmg& msg); void _CMStowShield(f8::MsgHdr& hdr, const cs::CMStowShield& msg); + void _CMTeamMarkTargetPos(f8::MsgHdr& hdr, const cs::CMTeamMarkTargetPos& msg); virtual void SetAttackDir(const a8::Vec2& attack_dir) override; void AsyncRequestWatchWar(bool send_rsp_msg); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 87242e2b..99a0364e 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1576,6 +1576,7 @@ void Room::MatchTeam(Human* hum) void Room::CombineTeam() { + return; if (MetaMgr::Instance()->prebattle_combine_team) { return; } diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 6e7beed9..734bab78 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -57,6 +57,9 @@ void Team::AddMember(Human* member) if (member->GetFollowTimes() <= 0 && member != first_member_ && !member->follow_target.Get()) { member->DoFollow(first_member_->GetUniId()); } + if (!target_pos.empty()) { + member->NotifyTeamMarkTargetPos(); + } } bool Team::IsFull() diff --git a/server/gameserver/team.h b/server/gameserver/team.h index a670722d..235762ea 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -7,6 +7,7 @@ class Team public: Room* room = nullptr; int team_rank = 0; + std::map target_pos; void SetInitTeamMemberNum(int init_num) { init_team_member_num_ = init_num; }; void SetAutoFill(bool auto_fill) { auto_fill_ = auto_fill; }; diff --git a/server/tools/protobuild/cs_msgid.proto b/server/tools/protobuild/cs_msgid.proto index 25789751..519b715c 100644 --- a/server/tools/protobuild/cs_msgid.proto +++ b/server/tools/protobuild/cs_msgid.proto @@ -25,6 +25,7 @@ enum CMMessageId_e _CMRequestBulletDmg = 230; _CMStowShield = 231; _CMImmediateMsg = 232; + _CMTeamMarkTargetPos = 233; } enum SMMessageId_e @@ -55,4 +56,5 @@ enum SMMessageId_e _SMGetItemNotify = 1018; _SMMatchMemberMsgNotify = 1019; _SMPvePassWave = 1020; + _SMTeamMarkTargetPosList = 1021; } diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 7d0eddc0..233193fb 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -240,6 +240,13 @@ message MFCharacterImage optional MFWeapon weapon = 3; //武器 } +//组队标记目标位置 +message MFTeamMarkPos +{ + optional int32 obj_uniid = 1; //唯一id + optional MFVec2 pos = 2; //位置 +} + //玩家信息-全量 message MFPlayerFull { @@ -1090,6 +1097,12 @@ message CMImmediateMsg optional int32 stop_shot = 2; //停止射击 } +//组队标记目标位置 +message CMTeamMarkTargetPos +{ + optional MFVec2 pos = 1; //目标位置,如果不传表示取消 +} + //执行GM指令 message CMExecCommand { @@ -1412,3 +1425,9 @@ message SMPvePassWave optional int32 pve_max_wave = 18; //pve总波次 optional int32 wait_time = 2; //下一波开始时间(单位秒) } + +//组队标记目标位置列表 +message SMTeamMarkTargetPosList +{ + repeated MFTeamMarkPos pos_list = 1; //位置列表 +} \ No newline at end of file