CTT/Server/Hotfix/Game/Handler/Map/C2M_RequestEnterMapHandler.cs

241 lines
9.0 KiB
C#
Raw Normal View History

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:
{
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--;
}
}
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)
});
}
}
}