2021-04-08 20:09:59 +08:00
|
|
|
|
using ET;
|
|
|
|
|
using Cal.DataTable;
|
|
|
|
|
using System;
|
2021-05-02 01:19:35 +08:00
|
|
|
|
using System.Collections.Generic;
|
2021-04-08 20:09:59 +08:00
|
|
|
|
using System.Net;
|
|
|
|
|
|
|
|
|
|
namespace ET
|
|
|
|
|
{
|
|
|
|
|
using System;
|
|
|
|
|
using Cal.DataTable;
|
|
|
|
|
using ET;
|
|
|
|
|
using ET.EventType;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
[ActorMessageHandler]
|
|
|
|
|
public class C2M_RequestEnterMapHandler : AMActorLocationRpcHandler<Unit, C2M_RequestEnterMap, M2C_RequestEnterMap>
|
|
|
|
|
{
|
|
|
|
|
protected override async ETTask Run(Unit unit, C2M_RequestEnterMap message, M2C_RequestEnterMap response, Action reply)
|
|
|
|
|
{
|
|
|
|
|
if (unit.isAI)
|
|
|
|
|
{
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!unit.IsTeamLeader)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "您不是队长,不能切换地图!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
UnitScene unitScene = unit.GetComponent<UnitScene>();
|
2021-05-01 11:27:41 +08:00
|
|
|
|
Sys_Scene currSceneInfo = MapSceneComponent.Instance.GetMapInfo(unitScene.sceneId);
|
|
|
|
|
SceneTransConfig sceneTransConfig = SceneTransConfigCategory.Instance.Get(unitScene.sceneId);
|
2021-04-08 20:09:59 +08:00
|
|
|
|
int targetSceneId = message.MapId / 100;
|
|
|
|
|
int targetMapLayer = message.MapId % 100;
|
|
|
|
|
bool isPosWoring = true;
|
2021-05-01 11:27:41 +08:00
|
|
|
|
for (int j = 0; j < sceneTransConfig.TransPosArr.Length; j++)
|
2021-04-08 20:09:59 +08:00
|
|
|
|
{
|
2021-05-01 11:27:41 +08:00
|
|
|
|
SceneTransConfig.TransPos posInfo = sceneTransConfig.TransPosArr[j];
|
2021-04-08 20:09:59 +08:00
|
|
|
|
if (posInfo != null)
|
|
|
|
|
{
|
|
|
|
|
Vector2 val = unitScene.Position - new Vector2(posInfo.TransPos_x, posInfo.TransPos_y);
|
|
|
|
|
if (val.sqrMagnitude <= MoveHelper.AtkDis)
|
|
|
|
|
{
|
|
|
|
|
isPosWoring = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-05-01 11:27:41 +08:00
|
|
|
|
|
|
|
|
|
int targetMapId = message.MapId;
|
|
|
|
|
var targetSceneType = MapHelper.GetMapType(targetMapId / 100);
|
|
|
|
|
if (targetSceneType == UnitSceneType.SpaceTravel)
|
|
|
|
|
{
|
|
|
|
|
NPCBase npcBase = NPCBaseCategory.Instance.Get(NPCBaseId.时空旅人);
|
|
|
|
|
if (npcBase != null)
|
|
|
|
|
{
|
|
|
|
|
Vector2 val = unitScene.Position - new Vector2(npcBase.PosX, npcBase.PosY);
|
|
|
|
|
if (val.sqrMagnitude <= MoveHelper.AtkDis)
|
|
|
|
|
{
|
|
|
|
|
isPosWoring = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-04-08 20:09:59 +08:00
|
|
|
|
if (isPosWoring)
|
|
|
|
|
{
|
|
|
|
|
Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】传送时位置{unitScene.Position}错误");
|
|
|
|
|
response.Message = "系统错误";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Sys_Scene targetSceneInfo = MapSceneComponent.Instance.GetMapInfo(targetSceneId);
|
|
|
|
|
if (targetSceneInfo.Layers < targetMapLayer)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "进入层数不对!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (unit.teamState == TeamState.Fight)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "战斗状态!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
PlayerData data = unit.GetComponent<PlayerData>();
|
|
|
|
|
if ((bool)data && data.IsBattleIdle)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "挂机状态!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
bool canEnter = false;
|
2021-05-01 11:27:41 +08:00
|
|
|
|
for (int i = 0; i < sceneTransConfig.SceneIdArr.Length; i++)
|
2021-04-08 20:09:59 +08:00
|
|
|
|
{
|
2021-05-01 11:27:41 +08:00
|
|
|
|
int targetMap = sceneTransConfig.SceneIdArr[i];
|
2021-04-08 20:09:59 +08:00
|
|
|
|
if (targetSceneId == unitScene.MapId / 100 && targetMapLayer - unitScene.MapId % 100 == 1)
|
|
|
|
|
{
|
|
|
|
|
canEnter = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2021-05-01 11:27:41 +08:00
|
|
|
|
if (targetSceneId != targetMap)
|
2021-04-08 20:09:59 +08:00
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (targetSceneId == Sys_SceneId.Scene_Boss && BossComponent.Instance.bossInfoDic.ContainsKey(targetMapLayer))
|
|
|
|
|
{
|
|
|
|
|
canEnter = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else if (targetMapLayer == 1)
|
|
|
|
|
{
|
|
|
|
|
canEnter = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!canEnter)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "不能进入此地图";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Team team = TeamComponent.Instance.Get(unit.TeamLeaderId);
|
|
|
|
|
if (team == null)
|
|
|
|
|
{
|
|
|
|
|
Log.Error(" team == null");
|
|
|
|
|
}
|
|
|
|
|
ChangeMap a;
|
2021-05-01 11:27:41 +08:00
|
|
|
|
switch (targetSceneType)
|
2021-04-08 20:09:59 +08:00
|
|
|
|
{
|
|
|
|
|
case UnitSceneType.MainStory:
|
|
|
|
|
foreach (Unit item in team.GetUnits())
|
|
|
|
|
{
|
|
|
|
|
canEnter = canEnter && item.GetComponent<PlayerData>().CanEnterMianStory(targetMapId / 100);
|
|
|
|
|
}
|
|
|
|
|
if (!canEnter)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "队伍中有人未通关上一关卡,不能进入!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case UnitSceneType.Trial:
|
|
|
|
|
{
|
|
|
|
|
if (team.MemberCount > 1)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "不能进入,试炼之地只能单人挑战!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int mapId;
|
|
|
|
|
string trialRet = PlayerDataSystem.GetTrialLayer( self: unit.GetComponent<PlayerData>(), sceneId: targetMapId/100,mapId: out mapId);
|
|
|
|
|
if (trialRet != null)
|
|
|
|
|
{
|
|
|
|
|
response.Message = trialRet;
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
targetMapId = mapId;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case UnitSceneType.Boss:
|
|
|
|
|
{
|
|
|
|
|
BossComponent.BossState state = BossComponent.Instance.GetState(targetMapLayer);
|
|
|
|
|
if (state == BossComponent.BossState.Idle)
|
|
|
|
|
{
|
|
|
|
|
SendBossRefresh(unit, targetMapLayer).Coroutine();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case UnitSceneType.PersonalPvp:
|
|
|
|
|
if (team.MemberCount > 1)
|
|
|
|
|
{
|
|
|
|
|
response.Message = "此地图不能组队!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!PvpMap.inatance.CanEnterPvpMap(data, targetMapId))
|
|
|
|
|
{
|
|
|
|
|
response.Message = "积分不足,无法进入!";
|
|
|
|
|
reply();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case UnitSceneType.ManulEquip:
|
|
|
|
|
{
|
2021-05-01 11:27:41 +08:00
|
|
|
|
// if (!ManulEquipMap.instance.CanEnterMap(data, targetMapId))
|
|
|
|
|
// {
|
|
|
|
|
// response.Message = "无法进入,请先击杀当前关卡boss!";
|
|
|
|
|
// reply();
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// reply();
|
|
|
|
|
// EventSystem eventSystem = Game.EventSystem;
|
|
|
|
|
// a = new ChangeMap
|
|
|
|
|
// {
|
|
|
|
|
// unit = unit,
|
|
|
|
|
// mapId = targetMapId
|
|
|
|
|
// };
|
|
|
|
|
// await eventSystem.Publish(a);
|
|
|
|
|
// await ManulEquipMap.instance.EnterMap(data, targetMapId);
|
|
|
|
|
//
|
|
|
|
|
break;
|
2021-04-08 20:09:59 +08:00
|
|
|
|
}
|
2021-05-02 01:19:35 +08:00
|
|
|
|
case UnitSceneType.SpaceTravel:
|
|
|
|
|
{
|
2021-05-07 23:50:22 +08:00
|
|
|
|
// LinkedList<Unit> teamList = team.GetUnits();
|
|
|
|
|
// foreach (Unit u in teamList)
|
|
|
|
|
// {
|
|
|
|
|
// PlayerData _data = u.GetComponent<PlayerData>();
|
|
|
|
|
// if (_data == null)
|
|
|
|
|
// {
|
|
|
|
|
// Log.Error($"data == null where id = {u?.Id}");
|
|
|
|
|
// continue;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// _data.travelVoucher--;
|
|
|
|
|
// }
|
2021-05-02 01:19:35 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
2021-04-08 20:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
reply();
|
|
|
|
|
EventSystem eventSystem2 = Game.EventSystem;
|
|
|
|
|
a = new ChangeMap
|
|
|
|
|
{
|
|
|
|
|
unit = unit,
|
|
|
|
|
mapId = targetMapId
|
|
|
|
|
};
|
|
|
|
|
eventSystem2.Publish(a).Coroutine();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async ETVoid SendBossRefresh(Unit unit, int targetMapLayer)
|
|
|
|
|
{
|
|
|
|
|
await TimerComponent.Instance.WaitAsync(1000L);
|
|
|
|
|
MessageHelper.SendActor(unit, new M2C_BossRefresh
|
|
|
|
|
{
|
|
|
|
|
BossId = BossComponent.Instance.GetBossId(targetMapLayer)
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|