/// <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); }
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)); }
//-------------------------------------------------------------------------------------------------------------------------------- #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); }
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)); } }
//----------------------------------------------------------------------------------------------------------------------------- #region __CreateObject__ //-------------------------------------------------------------------------------------------------------------------------------- protected virtual AreaZonePlayer CreateZonePlayer(AreaZoneNode node, RoleEnterZoneRequest enter) { return(new AreaZonePlayer(this, node, enter)); }
public abstract MapTemplateData GetDefaultMapData(RoleEnterZoneRequest enter);
//-------------------------------------------------------------------------------------- public virtual ISerializable GetCreateZoneExpandData(RoleEnterZoneRequest req) { return(null); }
public virtual ISerializable ToRoleBattleData(RoleEnterZoneRequest req) { return(null); }
protected virtual void CurZoneChange(RoleEnterZoneRequest req, RoleEnterZoneResponse result) { //变更过场景,场景线缓存失效. mZoneInfoDirtyFlag = true; OnEnterZone?.Invoke(req, result); }
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; * }); */ }
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, }); } }