Пример #1
0
        /// <summary>
        /// 请求进入场景
        /// </summary>
        public virtual async Task <RoleEnterZoneResponse> RequestEnterZoneAsync(RoleEnterZoneRequest req)
        {
            var rd = service.roleModule.GetRoleData();

            req.roleUUID           = service.roleID;
            req.roleSessionName    = service.sessionName;
            req.roleSessionNode    = service.sessionNode;
            req.roleLogicName      = service.SelfAddress.ServiceName;
            req.roleLogicNode      = service.SelfAddress.ServiceNode;
            req.roleDisplayName    = rd.name;
            req.roleUnitTemplateID = rd.unit_template_id;
            req.roleData           = ToRoleBattleData(req);//< ---战斗相关数据
            req.LastZoneSaveData   = rd.last_zone_saved;
            req.lastPublicMapID    = rd.last_public_mapID;
            req.lastPublicMapUUID  = rd.last_public_area_uuid;
            req.lastPublicPos      = rd.last_public_map_pos;
            req.expectAreaNode     = service.SelfAddress.ServiceNode;
            var result = await this.areaManager.CallAsync <RoleEnterZoneResponse>(req);

            if (RoleEnterZoneResponse.CheckSuccess(result))
            {
                currentArea = await service.Provider.GetAsync(new RemoteAddress(result.areaName, result.areaNode));

                this.service.roleModule.SaveEnterZoneInfo(result);
                CurZoneChange(req, result);
            }
            else
            {
                service.log.Error("Enter Zone Error : " + result);
            }
            return(result);
        }
Пример #2
0
 public AreaZonePlayer(AreaService svc, AreaZoneNode node, RoleEnterZoneRequest enter)
 {
     Alloc.RecordConstructor(this.GetType());
     this.log                = LoggerFactory.GetLogger(GetType().Name);
     this.service            = svc;
     this.node               = node;
     this.enter              = enter;
     this.client_event_route = TypeCodec.GetAttributeRoute(typeof(ClientBattleEvent));
 }
Пример #3
0
        //--------------------------------------------------------------------------------------------------------------------------------
        #region 构造对象
        //--------------------------------------------------------------------------------------------------------------------------------
        protected virtual AddUnit ToAddUnit(RoleEnterZoneRequest enter)
        {
            var unitInfo = RPGServerBattleManager.DataRoot.Templates.GetUnit(enter.roleUnitTemplateID);

            if (unitInfo == null)
            {
                unitInfo = service.GetDefaultUnitTemplate();
            }
            DeepCore.Vector.Vector3 pos = null;
            if (enter.roleScenePos != null)
            {
                if (enter.roleScenePos.HasFlag)
                {
                    var sceneObj = node.FindSceneObjData(enter.roleScenePos.flagName);
                    if (sceneObj != null)
                    {
                        pos = new DeepCore.Vector.Vector3(sceneObj.X, sceneObj.Y, sceneObj.Z);
                    }
                }
                else if (enter.roleScenePos.HasPos)
                {
                    if (enter.roleScenePos.x == enter.roleScenePos.y && enter.roleScenePos.x == -1)
                    {
                        var map = node.SceneData.GetStartRegions();
                        var ret = map.Get(2);
                        if (ret != null)
                        {
                            pos = new DeepCore.Vector.Vector3(ret.X, ret.Y, ret.Z);
                        }
                        else
                        {
                            pos = new DeepCore.Vector.Vector3(enter.roleScenePos.x, enter.roleScenePos.y, enter.roleScenePos.z);
                        }
                    }
                    else
                    {
                        pos = new DeepCore.Vector.Vector3(enter.roleScenePos.x, enter.roleScenePos.y, enter.roleScenePos.z);
                    }
                }
            }
            var add = new AddUnit()
            {
                info        = unitInfo,
                player_uuid = enter.roleUUID,
                pos         = pos,
                arg         = enter,
                //中立单位0,怪物1,玩家2.
                force               = enter.roleForce > 0 ? (byte)enter.roleForce : (byte)2,
                editor_name         = enter.roleDisplayName,
                last_zone_save_data = enter.LastZoneSaveData,
            };

            return(add);
        }
Пример #4
0
        public async Task <RoleEnterZoneResponse> area_manager_rpc_PlayerEnter(RoleEnterZoneRequest enter)
        {
            try
            {
                var node = this.FindZoneNode(enter);
                if (node == null)
                {
                    //TODO 分配一个默认场景
                    node = this.GetDefaultZoneNode();
                }
                //场景不存在//
                if (node == null)
                {
                    return(new RoleEnterZoneResponse()
                    {
                        s2c_code = RoleEnterZoneResponse.CODE_ZONE_NOT_EXIST,
                        s2c_msg = $"PlayerEnter: ZoneNotExistException: roleID={enter.roleUUID} zone={enter.expectZoneUUID}"
                    });
                }
                if (this.players.TryGetOrCreate(enter.roleUUID, out var player, (uuid) => this.CreateZonePlayer(node, enter)))
                {
                    if (player.ZoneNode == node)
                    {
                        var replace = await node.DoPlayerEnterReplace(player, enter);

                        if (replace.IsSuccess)
                        {
                            return(replace);
                        }
                        this.players.TryGetOrCreate(enter.roleUUID, out player, (uuid) => this.CreateZonePlayer(node, enter));
                        return(await node.DoPlayerEnterAsync(player, enter));
                    }
                    else
                    {
                        return(new RoleEnterZoneResponse()
                        {
                            s2c_code = RoleEnterZoneResponse.CODE_ZONE_NOT_EXIST,
                            s2c_msg = $"PlayerEnter: ZoneNotExistException: roleID={enter.roleUUID} zone={enter.expectZoneUUID}"
                        });
                    }
                }
                else
                {
                    return(await node.DoPlayerEnterAsync(player, enter));
                }
            }
Пример #5
0
 //-----------------------------------------------------------------------------------------------------------------------------
 #region __CreateObject__
 //--------------------------------------------------------------------------------------------------------------------------------
 protected virtual AreaZonePlayer CreateZonePlayer(AreaZoneNode node, RoleEnterZoneRequest enter)
 {
     return(new AreaZonePlayer(this, node, enter));
 }
Пример #6
0
 public abstract MapTemplateData GetDefaultMapData(RoleEnterZoneRequest enter);
Пример #7
0
        //--------------------------------------------------------------------------------------

        public virtual ISerializable GetCreateZoneExpandData(RoleEnterZoneRequest req)
        {
            return(null);
        }
Пример #8
0
 public virtual ISerializable ToRoleBattleData(RoleEnterZoneRequest req)
 {
     return(null);
 }
Пример #9
0
 protected virtual void CurZoneChange(RoleEnterZoneRequest req, RoleEnterZoneResponse result)
 {
     //变更过场景,场景线缓存失效.
     mZoneInfoDirtyFlag = true;
     OnEnterZone?.Invoke(req, result);
 }
Пример #10
0
        public virtual Task <RoleEnterZoneResponse> DoPlayerEnterReplace(AreaZonePlayer player, RoleEnterZoneRequest enter)
        {
            return(node.QueuePlayerTaskAsync <RoleEnterZoneResponse>(player.RoleUUID, (instancePlayer) =>
            {
                if (instancePlayer == null)
                {
                    return new RoleEnterZoneResponse()
                    {
                        s2c_code = RoleEnterZoneResponse.CODE_ERROR
                    };
                }
                return (new RoleEnterZoneResponse()
                {
                    mapTemplateID = this.MapTemplateID,
                    zoneUUID = this.ZoneUUID,
                    zoneTemplateID = this.ZoneTemplateID,
                    roleBattleData = enter.roleData,
                    roleDisplayName = enter.roleDisplayName,
                    roleUnitTemplateID = enter.roleUnitTemplateID,
                    roleScenePos = new ZonePosition()
                    {
                        x = instancePlayer.X,
                        y = instancePlayer.Y,
                        z = instancePlayer.Z
                    },
                    areaName = service.SelfAddress.ServiceName,
                    areaNode = service.SelfAddress.ServiceNode,
                    guildUUID = enter.guildUUID,
                    s2c_code = RoleEnterZoneResponse.CODE_OK_REPLACE
                });
            }));


            // var client = this.node.GetPlayerClient(player.RoleUUID);

            /*
             * float px = 0, py = 0, pz = 0;
             * if (client != null)
             * {
             *  px = client.Actor.X;
             *  py = client.Actor.Y;
             *  pz = client.Actor.Z;
             * }
             *
             * return (new RoleEnterZoneResponse()
             * {
             *  mapTemplateID = this.MapTemplateID,
             *  zoneUUID = this.ZoneUUID,
             *  zoneTemplateID = this.ZoneTemplateID,
             *  roleBattleData = enter.roleData,
             *  roleDisplayName = enter.roleDisplayName,
             *  roleUnitTemplateID = enter.roleUnitTemplateID,
             *  roleScenePos = new ZonePosition() { x = px, y = py, z = pz},
             *  areaName = service.SelfAddress.ServiceName,
             *  areaNode = service.SelfAddress.ServiceNode,
             *  guildUUID = enter.guildUUID,
             *  s2c_code = RoleEnterZoneResponse.CODE_OK_REPLACE;
             * });
             */
        }
Пример #11
0
 public virtual async Task <RoleEnterZoneResponse> DoPlayerEnterAsync(AreaZonePlayer player, RoleEnterZoneRequest enter)
 {
     if (await player.OnEnterAsync() == false)
     {
         log.Error("Can Not Find Session Or Logic : " + enter.roleSessionName + " : " + enter.roleUUID);
     }
     try
     {
         player.SessionReconnect();
         var tcs = new System.Threading.Tasks.TaskCompletionSource <RoleEnterZoneResponse>();
         this.node.PlayerEnter(player, ToAddUnit(enter), client =>
         {
             if (HasAddPlayer == false)
             {
                 HasAddPlayer = true;
             }
             client.Actor.SetAttribute(nameof(AreaZonePlayer.RoleSessionName), player.RoleSessionName);
             tcs.TrySetResult(new RoleEnterZoneResponse()
             {
                 s2c_code           = RoleEnterZoneResponse.CODE_OK,
                 mapTemplateID      = this.MapTemplateID,
                 zoneUUID           = this.ZoneUUID,
                 zoneTemplateID     = this.ZoneTemplateID,
                 roleBattleData     = enter.roleData,
                 roleDisplayName    = enter.roleDisplayName,
                 roleUnitTemplateID = enter.roleUnitTemplateID,
                 roleScenePos       = new ZonePosition()
                 {
                     x = client.Actor.X,
                     y = client.Actor.Y,
                     z = client.Actor.Z
                 },
                 areaName  = service.SelfAddress.ServiceName,
                 areaNode  = service.SelfAddress.ServiceNode,
                 guildUUID = enter.guildUUID,
             });
         }, err =>
         {
             tcs.TrySetResult(new RoleEnterZoneResponse()
             {
                 s2c_code = RoleEnterZoneResponse.CODE_ERROR,
                 s2c_msg  = err.Message,
             });
         });
         return(await tcs.Task);
     }
     catch (Exception err)
     {
         log.Error(err);
         return(new RoleEnterZoneResponse()
         {
             s2c_code = RoleEnterZoneResponse.CODE_ERROR,
             s2c_msg = err.Message,
         });
     }
 }