using System; using System.Collections.Generic; using System.Net; using System.Threading.Tasks; using Cal.DataTable; namespace ET { [ActorMessageHandler] public class C2M_ClickMapUnitHandler: AMActorLocationRpcHandler { protected override async ETTask Run(Unit unit, C2M_ClickMapUnit request, M2C_ClickMapUnit response, Action reply) { if (!unit.IsTeamLeader) { response.Message = "你不是队长!"; reply(); return; }if (unit.teamState == TeamState.Fight) { response.Message = "战斗中..."; reply(); return; } MapMonsterComponent monsterComponent = unit.GetComponent(); var type = (MapMonsterType) request.type; if (!monsterComponent.TryGet(type, out var monster) || monster.Id != request.Id) { response.Message = "系统错误,怪消失了"; reply(); return; } string strRet = null; switch (type) { case MapMonsterType.MainStory: break; case MapMonsterType.Trial: break; case MapMonsterType.ManulEquip: strRet = await StartManulEquipBattle(unit, monster); break; case MapMonsterType.MapCoin: break; case MapMonsterType.SpaceTravel: strRet = await StartSpaceTravelBattle(unit, monster); break; case MapMonsterType.StarSoulCopy: strRet = await StartStarSoulCopyBattle(unit, monster); break; default: throw new ArgumentOutOfRangeException(); } if (strRet != null) { response.Message = strRet; reply(); return; } monsterComponent.Remove(type); reply(); await ETTask.CompletedTask; } private async ETTask StartManulEquipBattle(Unit unit, Unit monster) { Team team = TeamComponent.Instance.Get(unit.TeamLeaderId); if (team != null) { if (!AppConfig.inst.isTest) if (team.MemberCount < 3) { return "至少3人才能挑战!"; } } if (team.TeamState == TeamState.Fight) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】多次进行手工副本战斗"); return"系统错误"; } UnitScene unitScene = unit.GetComponent(); UnitSceneType unitSceneType = MapHelper.GetMapType(unitScene.MapId / 100); if (unitSceneType != UnitSceneType.ManulEquip) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】场景{unitScene.MapId / 100}错误"); return"系统错误"; } long configId = monster.GetComponent().configId; ManulEquipMonsterConfig config = ManulEquipMonsterConfigCategory.Instance.Get(configId); if ((unitScene.Position -monster.Position).sqrMagnitude > MoveHelper.AtkDis) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】位置{unitScene.Position}错误"); return "系统错误"; } // ManulEquipMap.instance.DestoryUnit(unit); CopyBattle battle = BattleMgrCompnent.Instance.CreateBattle(team); MonsterFactoryHelper.ManulEquipGenerate(battle, config); battle.Init(battle.team, battle.targetTeam, CopyConfigId.ManulEquipBattle, config.Id); return null; } private async ETTask StartSpaceTravelBattle(Unit unit, Unit monster) { Team team = TeamComponent.Instance.Get(unit.TeamLeaderId); if (team.TeamState == TeamState.Fight) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】多次进行时空旅行战斗"); return "系统错误"; } UnitScene unitScene = unit.GetComponent(); if (unitScene.layer != 6) { LinkedList teamList = team.GetUnits(); foreach (Unit u in teamList) { PlayerData data = u.GetComponent(); if (data == null) { Log.Error($"data == null where id = {u?.Id}"); continue; } if (data.travelVoucher <= 0) { return "您的或者队友的次数不够"; } } } UnitSceneType unitSceneType = MapHelper.GetMapType(unitScene.sceneId); if (unitSceneType != UnitSceneType.SpaceTravel) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】场景{unitScene.MapId / 100}错误"); return "系统错误"; } long configId = monster.GetComponent().configId; SpaceTravelConfig spaceTravelConfig = SpaceTravelConfigCategory.Instance.Get(configId); if ((unitScene.Position - monster.Position).sqrMagnitude > MoveHelper.AtkDis) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】位置{unitScene.Position}错误"); return "系统错误"; } CopyBattle battle = BattleMgrCompnent.Instance.CreateBattle(team); MonsterFactoryHelper.SpaceTravelGenerate(battle, spaceTravelConfig); battle.Init(team, battle.targetTeam, CopyConfigId.SpaceTravelBattle, spaceTravelConfig.Id); return null; } private async ETTask StartStarSoulCopyBattle(Unit unit, Unit monster) { Team team = TeamComponent.Instance.Get(unit.TeamLeaderId); if (team.TeamState == TeamState.Fight) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】多次进行星魂副本战斗"); return "系统错误"; } UnitScene unitScene = unit.GetComponent(); UnitSceneType unitSceneType = MapHelper.GetMapType(unitScene.sceneId); if (unitSceneType != UnitSceneType.StarSoulCopy) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】场景{unitScene.MapId / 100}错误"); return "系统错误"; } long configId = monster.GetComponent().configId; StarSoulCopyConfig soulCopyConfig = StarSoulCopyConfigCategory.Instance.Get(configId); if ((unitScene.Position - monster.Position).sqrMagnitude > MoveHelper.AtkDis) { Log.Error($"*【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】位置{unitScene.Position}错误"); return "系统错误"; } CopyBattle battle = BattleMgrCompnent.Instance.CreateBattle(team); MonsterFactoryHelper.StarSoulGenerate(battle, soulCopyConfig); battle.Init(team, battle.targetTeam, CopyConfigId.StarSoulBattle, soulCopyConfig.Id); return null; } } }