using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ET.Server
{
///
/// 地图工具类
///
public static class MapHelper
{
///
/// 实际切换地图
///
///
///
///
///
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().Get(areaData.instanceId);
if (targetMap == null)
{
Log.Debug($"目标场景为空");
return null;
}
// 非强制切图,检测一下pk模式,是否允许切图
if (!forceChange)
{
int resCode = player.GetXmdsManager().refreshPlayerPKMode(player.GetId().ToString(), true, (int)PkModel.Peace);
if (resCode != 0)
{
// 战斗状态下无法传送
Log.Warning($"refreshPlayerPKMode resCode={resCode}, playerId={player.GetId()}, 当前场景={player.GetComponent().MapData.mapId}, 传送场景={areaData.areaId}");
return null;
}
}
player.GetComponent().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;
}
///
/// 进入map
///
///
///
public static Map PlayerEnterAreaServer(WNPlayer player, long instanceId)
{
Map map = player.DomainScene().GetComponent().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;
}
///
/// 角色bind的时候分配场景
///
///
///
public static Map BindPlayerDispatch(WNPlayer player)
{
Map map = null;
if (player.Map != null)
{
map = player.DomainScene().GetComponent().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;
}
///
/// 创建战斗服场景需求数据
///
///
///
///
///
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;
}
///
/// 创建本地场景
///
///
///
///
///
///
///
///
public static Map CreatLocalMap(WNPlayer player, MapConfig prop, JObject data, long instanceId, int mapId, string bsServerId)
{
Scene scene = player.DomainScene();
Map map = scene.GetComponent().AddChildWithId