| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- package mapPlayer
- import (
- "f1-game/internal/code"
- "f1-game/internal/enum"
- nameLocal "f1-game/internal/name/local"
- "f1-game/internal/pb"
- "f1-game/internal/types"
- mapCall "f1-game/nodes/map/internal/call"
- "f1-game/nodes/map/internal/db"
- "f1-game/nodes/map/player/team"
- ctime "github.com/cherry-game/cherry/extend/time"
- cproto "github.com/cherry-game/cherry/net/proto"
- )
- func (p *actorPlayer) initAssemble() {
- p.Local().Register(nameLocal.MapPlayer_Assemble, p.assemble)
- p.Local().Register(nameLocal.MapPlayer_AssembleJoin, p.assembleJoin)
- }
- // 发起集结
- func (p *actorPlayer) assemble(session *cproto.Session, req *pb.MapAssembleRequest) {
- p.Debug("[assemble] req = %+v", req)
- playerTable := db.GetMapPlayerTable(p.playerID)
- if playerTable.LeagueID == 0 {
- p.ResponseCode(session, code.LeagueNotJoin)
- return
- }
- dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID)
- if !ok {
- p.ResponseCode(session, code.MapTeamNotFound)
- return
- }
- // 发起集结需要 standby
- if !dbTeam.IsStandby() {
- p.ResponseCode(session, code.TeamIsBusy)
- return
- }
- // 检查 team 状态
- if errCode := dbTeam.IsBusy(); code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 寻路检查目标是否可达
- path, errCode := mapCall.PathFind.Find(playerTable.Point.X, playerTable.Point.Y, req.Point.X, req.Point.Y, p.playerID, playerTable.LeagueID, enum.MarchType_Assemble)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 检查资源是否足够
- errCode = team.Service().CheckMarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- arg := pb.AssembleRequest{
- PlayerID: p.playerID,
- LeagueID: playerTable.LeagueID,
- MarchObjectID: dbTeam.MarchObjectID,
- TargetObjectID: req.ObjectID,
- TargetObjectType: req.ObjectType,
- AssembleTime: int64(req.AssembleTime) * ctime.MillisecondsPerMinute,
- Path: path,
- IsAutoRetreat: req.IsAutoRetreat,
- MarchSync: team.Service().GetTeamMarchSyncProto(playerTable, dbTeam),
- }
- rsp, errCode := mapCall.Logic.Assemble(&arg)
- if code.IsFail(errCode) {
- p.Debug("assemble fail: LeagueID = %d, errCode = %d", playerTable.LeagueID, errCode)
- p.ResponseCode(session, errCode)
- return
- }
- // 扣除资源
- team.Service().MarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
- if dbTeam.MarchObjectID == 0 {
- dbTeam.MarchObjectID = rsp.Key
- playerTable.Save2Queue()
- }
- // 更新队伍状态
- team.Service().UpdateTeamStateByMarchState(playerTable, dbTeam, enum.MarchState(rsp.Value))
- p.ResponseCode(session, code.OK)
- }
- func (p *actorPlayer) assembleJoin(session *cproto.Session, req *pb.MapAssembleJoinRequest) {
- p.Debug("[assembleJoin] req = %+v", req)
- playerTable := db.GetMapPlayerTable(p.playerID)
- if playerTable.LeagueID == 0 {
- p.ResponseCode(session, code.LeagueNotJoin)
- return
- }
- dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID)
- if !ok {
- p.ResponseCode(session, code.MapTeamNotFound)
- return
- }
- if errCode := dbTeam.IsBusy(); code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- var (
- startPoint types.Point
- endPoint types.Point
- )
- // 如果是待命状态,行军点就是玩家当前位置
- if dbTeam.IsNeedSync() {
- startPoint = playerTable.Point
- // 只打目标集结点就够了
- errCode := mapCall.Logic.GetObject1Point(req.AssembleID, enum.ObjectType_Legion, &endPoint)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- } else {
- // 非待命状态,要找行军对象坐标和集结点坐标
- var (
- marchObject = enum.NewObject(dbTeam.MarchObjectID, enum.ObjectType_March)
- assembleObject = enum.NewObject(req.AssembleID, enum.ObjectType_Legion)
- errCode = mapCall.Logic.GetObject2Point(marchObject, assembleObject, &startPoint, &endPoint)
- )
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- }
- path, errCode := mapCall.PathFind.Find(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y, p.playerID, playerTable.LeagueID, enum.MarchType_Assemble)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 检查资源是否足够
- errCode = team.Service().CheckMarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 调用地图行军
- arg := &pb.MarchRequest{
- TeamID: dbTeam.TeamID,
- ObjectID: dbTeam.MarchObjectID,
- MarchType: int32(enum.MarchType_Assemble),
- Point: endPoint.ToProto(),
- Path: path,
- TargetObjectID: req.AssembleID,
- IsAutoRetreat: req.IsAutoRetreat,
- }
- if dbTeam.IsNeedSync() {
- arg.MarchSync = team.Service().GetTeamMarchSyncProto(playerTable, dbTeam)
- }
- rsp, errCode := mapCall.Logic.AssembleJoin(arg)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- // 扣除资源
- team.Service().MarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path))
- if dbTeam.MarchObjectID == 0 {
- dbTeam.MarchObjectID = rsp.Key
- playerTable.Save2Queue()
- }
- // 更新队伍状态
- team.Service().UpdateTeamStateByMarchState(playerTable, dbTeam, enum.MarchState(rsp.Value))
- p.ResponseCode(session, code.OK)
- }
|