CTT/Server/Hotfix/Game/Handler/User/C2M_GetStateRebackHandler.cs

176 lines
7.1 KiB
C#
Executable File

using Cal.DataTable;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace ET
{
[ActorMessageHandler]
public class C2M_GetStateRebackHandler : AMActorLocationHandler<Unit, C2M_GetStateReback>
{
protected override async ETTask Run(Unit unit, C2M_GetStateReback message)
{
try
{
return;
Log.Debug($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】已经进入游戏");
PlayerData data = unit.GetComponent<PlayerData>();
Team team = TeamComponent.Instance.Get(unit.TeamLeaderId);
//!+发送玩家基础性息
UnitCharacter unitCharacter =await CharacterHelper.GetUnitCharacter(unit);
MessageHelper.SendActor(unit, new M2C_SendUnitInfo { UnitCharacter = unitCharacter });
CharacterHelper.SyncAttribute(unit);
TeamHelper.SendTeamMember(team);
//!场景信息
UnitScene unitScene = unit.GetComponent<UnitScene>();
if (team == null)
{
Log.Error($"team==null where {unit}");
}
else
if (team.TeamState == TeamState.Fight)
{
//!地图切换
await ChangeMap(unit, unitScene, false);
//!战斗状态
CopyBattle battleBase = BattleMgrCompnent.Instance.GetBattle(unit);
battleBase.ReSendMonsterInfo(unit);
}
else
{
data.IsBattleIdle = false;
//!地图切换
await ChangeMap(unit, unitScene, true);
//!任务相关
UnitTask unitTask = unit.GetComponent<UnitTask>();
if (unitTask != null &&
unitTask.RunningTaskList.Count == 0 &&
unitTask.CompleteTaskIdList.Count == 0 &&
unitTask.FinishTaskIdList.Count == 0
)
{
//!发送新任务
M2C_OpenTaskUI ret = new M2C_OpenTaskUI();
ret.TaskList.Add(new NPCTask() { Id = (int)TaskComponent.Instance.TaskBaseNpcIdDic[0][0].Id, TaskState = TaskState.TaskWaiting });
MessageHelper.SendActor(unit, ret);
}
}
//!+重新添加
BuffLib lib = await BuffLibComponent.Instance.Query(unit.Id);
//!重新添加GoodsBuff
foreach (KeyValuePair<int, long> kp in lib.goodsEffectBuffDic)
{
GoodsBase goodsBase = DataTableHelper.Get<GoodsBase>(kp.Key);
if (goodsBase == null)
{
Log.Error($"goodsBase == null where id = {kp.Key}");
}
else
GoodsEffectComponent.Instance.ReAcquireGoodsEffect(unit, goodsBase, kp.Value);
}
BuffLibComponent.Instance.Remove(unit.Id, lib).Coroutine();
//!+发送Boss消息
SendBossInfo(unit);
Game.EventSystem.Publish(new EventType.AfterEnterGame() { unit = unit });
await ETTask.CompletedTask;
}
catch (System.Exception e)
{
Log.Error(e);
}
}
private async ETTask ChangeMap(Unit unit, UnitScene unitScene, bool initMap)
{
try
{
int mapId = unitScene.MapId;
UnitSceneType unitSceneType = MapHelper.GetMapType(mapId / 100);
if (unitSceneType == UnitSceneType.Boss)
{
int layer = unitScene.MapId % 100;
BossComponent.BossState state = BossComponent.Instance.GetState(layer);
if (state == BossComponent.BossState.Idle)
{
SendBossRefresh(unit, layer).Coroutine();
}
}
Sys_Scene targetSceneInfo = MapSceneComponent.Instance.GetMapInfo(mapId / 100);
Sys_Scene.PlayerPos position = targetSceneInfo.PlayerPosArr[0];
Team team = TeamComponent.Instance.Get(unit.TeamLeaderId);
if (team == null)
{
Log.Error(" team == null");
return;
}
unit.IsTransfer = true;
unitScene.enterTime = TimeHelper.ClientNow();
//!停止移动
unit.Stop();
await TimerComponent.Instance.WaitAsync(100);
unitScene.Position = new Vector2(position.PlayerPos_x, position.PlayerPos_y);
await unit.GetMapByUnitScene().Enter(unit,true);
//!发送切换地图
MessageHelper.SendActor(unit, new M2C_ChangeMap() { X = unitScene.Position.x, Y = unitScene.Position.y, MapId = unitScene.MapId });
await TimerComponent.Instance.WaitAsync(500);
if (initMap)
{
if (unitSceneType == UnitSceneType.MainStory || unitSceneType == UnitSceneType.Beach)
{
MainStoryMap.Instance.Init(unit, unitScene.MapId);
}
else if (unitSceneType == UnitSceneType.Trial)
{
TrialCopyMap.Instance.InitTrailCopyMap(unit, mapId);
}
else
{
await TimerComponent.Instance.WaitAsync(500);
StartupTransPoint(unit, unitScene.MapId);
}
}
void StartupTransPoint(Unit unit, int mapId)
{
MessageHelper.SendActor(unit, new M2C_StartupTransPoint() { MapId = mapId });
}
unit.IsTransfer = false;
}
catch (Exception e)
{
Log.Error(e);
}
}
private void SendBossInfo(Unit unit)
{
Log.Debug($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】发送Boss消息");
BossComponent boss = BossComponent.Instance;
List<string> arr = new List<string>();
foreach (KeyValuePair<int, BossComponent.BossState> item in boss.bossStateDic)
{
if (item.Value == BossComponent.BossState.Idle)
{
arr.Add($"[color=#00cc00]【{boss.GetBossBossName(item.Key)}】[/color]刷新了,大家赶紧去击杀吧,奖励多多!");
}
}
Chat.Instance.SendSystemCaht(unit, arr);
}
private async ETVoid SendBossRefresh(Unit unit, int targetMapLayer)
{
await TimerComponent.Instance.WaitAsync(1000);
MessageHelper.SendActor(unit, new M2C_BossRefresh { BossId = BossComponent.Instance.GetBossId(targetMapLayer) });
}
}
}