123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- using System;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- namespace ET.Server
- {
- /// <summary>
- /// 地图工具类
- /// </summary>
- public static class MapHelper
- {
- /// <summary>
- /// 实际切换地图
- /// </summary>
- /// <param name="player"></param>
- /// <param name="areaData"></param>
- /// <param name="forceChange"></param>
- /// <returns></returns>
- public static Map ChangeArea(WNPlayer player, AreaData areaData, bool forceChange)
- {
- Map map = player.Map;
- if (map != null)
- {
- if (map.Id == areaData.instanceId)
- {
- Log.Info($"changeArea1已在场景:{map.Prop.Name}, playerId={player.GetId()}, playerName={player.GetName()}");
- return map;
- }
- map.SyncPlayerHistoryData(player);
- }
- Map targetMap = player.DomainScene().GetComponent<GameMapComponent>().Get(areaData.instanceId);
- if (targetMap == null)
- {
- Log.Debug($"目标场景为空");
- return null;
- }
- // 非强制切图,检测一下pk模式,是否允许切图
- if (!forceChange)
- {
- int resCode = player.GetXmdsManager().refreshPlayerPKMode(player.GetId().ToString().Trim(), true, (int)PkModel.Peace);
- if (resCode != 0)
- {
- // 战斗状态下无法传送
- Log.Warning($"refreshPlayerPKMode resCode={resCode}, playerId={player.GetId()}, 当前场景={player.GetComponent<PlayerTempDataComponent>().MapData.mapId}, 传送场景={areaData.areaId}");
- return null;
- }
- }
- player.GetComponent<PlayerTempDataComponent>().SyncBornData(areaData.targetX, areaData.targetY, areaData.areaId);
- player.BornType = (int) BORN_TYPE.BORN;
- player.EnterState = (int) ENTER_STATE.changeArea;
- // 进入新的地图
- map = PlayerEnterAreaServer(player, areaData.instanceId);
- return map;
- }
- /// <summary>
- /// 进入map
- /// </summary>
- /// <param name="player"></param>
- /// <param name="instanceId"></param>
- public static Map PlayerEnterAreaServer(WNPlayer player, long instanceId)
- {
- Map map = player.DomainScene().GetComponent<GameMapComponent>().Get(instanceId);
- if (map != null)
- {
- Map oldMap = player.Map;
- if (oldMap != null)
- {
- oldMap.RemovePlayer(player, false);
- }
- // 初始化角色出生坐标数据
- player.InitBornData();
- map.AddPlayer(player);
- }
- else
- {
- Log.Warning($"playerEnterAreaServer场景不存在: playerId={player.GetId()}, instanceId={instanceId}");
- }
- return map;
- }
- /// <summary>
- /// 角色bind的时候分配场景
- /// </summary>
- /// <param name="player"></param>
- /// <returns></returns>
- public static Map BindPlayerDispatch(WNPlayer player)
- {
- Map map = null;
- if (player.Map != null)
- {
- map = player.DomainScene().GetComponent<GameMapComponent>().Get(player.Map.Id);
- }
- // 老场景
- if (map != null)
- {
- return map;
- }
- // 创建一个场景
- JObject jsonObject = new JObject();
- jsonObject.Add("id", player.GetId());
- jsonObject.Add("logicServerId", player.GetLogicServerId());
- jsonObject.Add("areaId", 10099);
- map = CreateMap(player, jsonObject, false);
- if (map != null)
- {
- map = ChangeArea(player, new AreaData(10099, map.Id), true);
- }
- return map;
- }
- /// <summary>
- /// 创建战斗服场景需求数据
- /// </summary>
- /// <param name="player"></param>
- /// <param name="jObject"></param>
- /// <param name="forceCreate"></param>
- /// <returns></returns>
- public static Map CreateMap(WNPlayer player, JObject jObject, bool forceCreate)
- {
- Log.Debug($"CreateMap areaData:{JsonConvert.SerializeObject(jObject, Formatting.Indented)}");
- int mapId = Convert.ToInt32(jObject.SelectToken("areaId"));
- MapConfig prop = MapConfigCategory.Instance.Get(mapId);
- if (prop == null)
- {
- return null;
- }
- long instanceId = IdGenerater.Instance.GenerateInstanceId();
- bool usespaceDiv = prop.Type == (int) MapType.NORMAL;
- JObject jsonObject = new ();
- jsonObject.Add("monsterHard", prop.MonsterHard);
- jsonObject.Add("calPKValue", prop.ignorePkRule == 0);
- jsonObject.Add("allowAutoGuard", prop.AutoFight);
- jsonObject.Add("usespaceDiv", usespaceDiv);
- jsonObject.Add("sceneType", prop.Type);
- jsonObject.Add("areaType", prop.AreaType);
- jsonObject.Add("canRiding", prop.RideMount == 1);
- jsonObject.Add("killInterval", prop.killInterval);
- jsonObject.Add("killFullNum", prop.killFullNum);
- jsonObject.Add("killFullCollSec", prop.killFullCollSec);
- jsonObject.Add("averageLevel", 0);
- string enterData = JsonConvert.SerializeObject(jsonObject, Formatting.Indented);
- Log.Info($"createArea instanceId:{instanceId}, templateId:{prop.TemplateID}, bs:{player.GetZoneManager()}");
- int resCode = player.GetZoneManager().createZoneRequest(player.GetId().ToString(), "bs-" + ConstGame.GameServerId,
- prop.TemplateID, instanceId.ToString(), forceCreate, enterData);
- if (resCode == 0)
- {
- jsonObject.Add("instanceId", instanceId);
- jsonObject.Add("areaId", mapId);
- return CreatLocalMap(player, prop, jsonObject, instanceId, mapId, "bs-" + ConstGame.GameServerId);
- }
- Log.Warning($"createZoneRequest resCode={resCode}, mapID={prop.Id}, playerId={player.GetId()}");
- return null;
- }
- /// <summary>
- /// 创建本地场景
- /// </summary>
- /// <param name="player"></param>
- /// <param name="prop"></param>
- /// <param name="data"></param>
- /// <param name="instanceId"></param>
- /// <param name="mapId"></param>
- /// <param name="bsServerId"></param>
- /// <returns></returns>
- public static Map CreatLocalMap(WNPlayer player, MapConfig prop, JObject data, long instanceId, int mapId, string bsServerId)
- {
- Scene scene = player.DomainScene();
- Map map = scene.GetComponent<GameMapComponent>().AddChildWithId<Map, JObject, WNPlayer>(instanceId, data, player);
- if (map != null)
- {
- Log.Info($"创建Area场景:{map.MapId}, instanceId:{instanceId}, srvId:" + map.LogicServerId);
- map.BindBattleServer(player, bsServerId);
- scene.GetComponent<GameMapComponent>().Add(map);
- }
- else
- {
- Log.Error($"CreatLocalMap:{mapId} fail! there is no area type of this,type:{prop.Type}");
- }
- return map;
- }
- }
- }
|