using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using BattleIce; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace ET.Server { [FriendOf(typeof (Map))] [FriendOf(typeof (BattleIceAgentComponent))] public static class MapSystem { public class MapAwakeSystem: AwakeSystem { protected override void Awake(Map self, JObject opts, WNPlayer player) { Log.Debug($"创建场景实体...create area opts:{opts.ToString()}"); self.RoomId = player.GetRoomId(); self.createTime = TimeHelper.ServerNow(); self.LogicServerId = opts.SelectToken("logicServerId") != null? Convert.ToInt32(opts.SelectToken("logicServerId")) : 0; self.MapId = Convert.ToInt32(opts.SelectToken("areaId")); self.Prop = MapConfigCategory.Instance.Get(self.MapId); self.Type = self.Prop.Type; self.Player = player; self.UnitPlayers = new Dictionary(); self.DeadUnits = new List(); self.DeadUnitPlayer = new List(); // 战斗服事件组件 self.AddComponent(); // 场景排行榜组件 self.AddComponent(); // token为空过滤一下抖音相关组件 if (self.TokenIsNull()) { return; } // 抖音直播评论任务组件 self.AddComponent(); // 抖音直播礼物任务组件 self.AddComponent(); // 抖音直播点赞任务组件 self.AddComponent(); // 抖音直播礼物置顶 self.DomainScene().GetComponent().TopGifts(self.RoomId); } } public class MapDestroySystem: DestroySystem { protected override void Destroy(Map self) { Log.Info($"销毁场景"); } } public static ZoneManagerPrx GetZoneManager(this Map self) { return self.DomainScene().GetComponent().IceZoneManager; } public static XmdsManagerPrx GetXmdsManager(this Map self) { return self.DomainScene().GetComponent().IceXmdsManager; } public static GetPlayerData GetPlayerData(this Map self, long playerId) { string result = self.GetXmdsManager().getPlayerData(playerId.ToString().Trim(), true); return string.IsNullOrEmpty(result)? null : JsonConvert.DeserializeObject(result); } /// /// 从战斗服同步角色数据 /// /// /// public static void SyncPlayerHistoryData(this Map self, WNPlayer player) { GetPlayerData result = self.GetPlayerData(player.GetId()); if (result == null) { return; } player.GetComponent().SyncNowData(self.MapId, self.InstanceId, result); player.GetComponent().SyncHistoryData(self.Prop, self.InstanceId, result); } /// /// 获取场景角色 /// /// /// /// public static WNPlayer GetPlayer(this Map self, long playerId) { return self.Player; } /// /// 分配阵营 /// /// /// public static void SetForce(this Map self, WNPlayer player) { player.Force = (int)AreaForce.FORCEA; } /// /// 移除角色,通用框架接口 切换场景/掉线会自动调用,尽量 不要手动调用 /// /// /// /// public static void RemovePlayer(this Map self, WNPlayer player, bool keepObject) { Log.Info($"removePlayer: playerId={player.GetId()}, mapId={self.MapId}, ip={player.Session.RemoteAddress}"); WNPlayer actorPlayer = self.GetPlayer(player.GetId()); if (actorPlayer != null) { // self.Players.Remove(player.GetId()); } // 重置进入场景标识 player.GetComponent().MapData.ready = false; } /// /// 玩家进入场景请求 /// /// /// public static void PlayerEnterRequest(this Map self, WNPlayer player) { bool ready = player.GetComponent().MapData.ready; if (ready) { Log.Info($"PlayerEnterRequest: playerId={player.GetId()}, ready={ready}"); return; } try { string enterData = player.ToJSON4EnterScene(self); Log.Debug($"{player.GetName()}, enterSceneData:{enterData}"); self.GetZoneManager().playerEnterRequest(player.GetId().ToString().Trim(), self.Id.ToString().Trim(), enterData); } catch (Exception e) { Log.Warning( $"playerEnterRequest: playerName={player.GetName()}, instanceId={self.Id}, mapName={self.Prop.Name}, serverID={self.BattleServerId}, e={e}"); } } /// /// 场景添加角色 /// /// /// public static void AddPlayer(this Map self, WNPlayer player) { Log.Info($"addPlayer: playerId={player.GetId()}, mapId={self.MapId}, ip={player.Session.RemoteAddress}"); player.Map = self; self.SetForce(player); self.Player = player; } /// /// 玩家进场景后推的消息 /// /// /// public static void PlayerReady(this Map self, WNPlayer player) { self.CurBattleIndex = 0; } /// /// 角色成功进入场景 /// /// /// public static void PlayerEntered(this Map self, WNPlayer player) { } /// /// 玩家登录事件 /// /// /// public static void PlayerLogin(this Map self, WNPlayer player) { } /// /// 玩家离开场景请求 /// /// /// /// public static void PlayerLeaveRequest(this Map self, WNPlayer player, bool keepObject) { try { self.GetZoneManager().playerLeaveRequest(player.GetId().ToString().Trim(), self.InstanceId.ToString().Trim(), keepObject); } catch (Exception e) { Log.Warning($"playerLeaveRequest: catch - {e}"); } Log.Debug($"playerLeaveRequest--------------------{player.GetName()} - {self.InstanceId} - {self.Prop.Name}"); } /// /// 绑定战斗服 /// /// /// /// public static void BindBattleServer(this Map self, WNPlayer player, string serverId) { self.BattleServerId = serverId; } /// /// 创建单位 /// /// /// /// /// public static async ETTask AddUnits(this Map self, List data, bool needReturn) { if (data.Count <= 0) { return 0; } int addUnitsResult = 0; if (needReturn) { addUnitsResult = self.GetXmdsManager().addUnits(self.Id.ToString().Trim(), JsonConvert.SerializeObject(data, Formatting.Indented)); Log.Info($"addUnits needReturn : mapId={self.MapId}, instanceId={self.Id.ToString().Trim()}, data={data}, add units result={addUnitsResult}"); } else { int objId = self.GetXmdsManager().addUnits(self.Id.ToString().Trim(), JsonConvert.SerializeObject(data, Formatting.Indented)); Log.Info($"addUnits: mapId={self.MapId}, instanceId={self.Id.ToString().Trim()}, objId={objId}"); } await ETTask.CompletedTask; return addUnitsResult; } public static async ETTask AddUnits(this Map self, Struct.MonsterUnit data, bool needReturn) { List listData = new List(); listData.Add(data); return await self.AddUnits(listData, needReturn); } /// /// 移除单位,战斗服创建的unit /// /// /// public static async ETTask RemovePointUnit(this Map self, int objectId) { self.GetXmdsManager().removePointUnit(self.Id.ToString().Trim(), objectId); await ETTask.CompletedTask; } /// /// 场景复活数据 /// /// /// 1:原地复活;2:出生点复活;3:复活点复活. 4:技能复活. public static string ReliveData(this Map self, ReliveType type) { JObject jsonObject = new (); jsonObject.Add("type", (int)type); jsonObject.Add("qty", 0); jsonObject.Add("itemType", "diamond"); jsonObject.Add("hp", 8); jsonObject.Add("mp", 0); return JsonConvert.SerializeObject(jsonObject, Formatting.Indented); } /// /// 是否结束 /// /// /// public static bool IsGameOver(this Map self) { return self.IsGameOver; } /// /// 增加单位玩家本地数据 /// /// /// /// /// /// /// /// public static Struct.UnitPlayerData AddUnitPlayer(this Map self, string openId, int templateId, int objId, long likes, string name, string url) { if (string.IsNullOrEmpty(openId) || templateId <= 0 || objId <= 0 || self.IsGameOver()) { return null; } Struct.UnitPlayerData unitPlayerData = null; if (self.UnitPlayers.ContainsKey(openId)) { unitPlayerData = self.UnitPlayers[openId]; unitPlayerData.TemplateId = templateId; unitPlayerData.ObjId = objId; unitPlayerData.Name = name; unitPlayerData.Url = url; unitPlayerData.Map = self; self.UnitPlayers[openId] = unitPlayerData; } else { unitPlayerData = new Struct.UnitPlayerData(); unitPlayerData.OpenId = openId; unitPlayerData.TemplateId = templateId; unitPlayerData.ObjId = objId; unitPlayerData.Name = name; unitPlayerData.Url = url; unitPlayerData.Level = 1; unitPlayerData.Likes = 0; unitPlayerData.ReliveTime = 0; unitPlayerData.x = 0; unitPlayerData.y = 0; unitPlayerData.Map = self; self.UnitPlayers.TryAdd(openId, unitPlayerData); } return unitPlayerData; } /// /// 获取单位玩家 /// /// /// /// public static Struct.UnitPlayerData GetUnitPlayerByOpenId(this Map self, string openId) { if (self.UnitPlayers.TryGetValue(openId, out Struct.UnitPlayerData unitPlayer)) { return unitPlayer; } return null; } /// /// 获取单位玩家 /// /// /// /// public static Struct.UnitPlayerData GetUnitPlayerByObjId(this Map self, int objId) { return self.UnitPlayers.Values.FirstOrDefault(unitPlayer => unitPlayer != null && unitPlayer.ObjId == objId); } /// /// 玩家增加贡献值 /// /// /// /// public static void AddContributeValue(this Map self, string openId, long addValue) { Struct.UnitPlayerData unitPlayerData = self.GetUnitPlayerByOpenId(openId); if (unitPlayerData == null) { return; } if (self.IsGameOver()) { return; } long value = unitPlayerData.ContributeValue + addValue; if (value >= long.MaxValue) { value = long.MaxValue; } unitPlayerData.ContributeValue = value; } /// /// 获取抖音直播接口调用凭证 /// /// /// public static string GetDouyinAccessToken(this Map self) { return self.DomainScene().GetComponent().AccessToken; } /// /// Token 是否为空 /// /// /// public static bool TokenIsNull(this Map self) { return self.DomainScene().GetComponent().TokenIsNull; } /// /// 获得当前战场(当前塔位置),随机位置 /// /// /// public static Vector2 GetRandomPlayerPos(this Map self) { Vector2[] TowerPos = { new Vector2() { X = 103, Y = 197 }, new Vector2() { X = 190, Y = 133 }, new Vector2() { X = 104, Y = 69 } }; int index = self.CurBattleIndex; Vector2 tower = TowerPos[index]; Random rand = new Random(); float r; double ang; if (index == 0) { r = (float)Math.Sqrt(rand.Next(2500)) + 10; ang = rand.Next(22) / 180.0f * Math.PI + Math.PI * 78f / 180f + Math.PI; } else if (index == 1) { r = (float)Math.Sqrt(rand.Next(3136)) + 10; ang = rand.Next(20) / 180.0f * Math.PI + Math.PI * 76f / 180f; } else { r = (float)Math.Sqrt(rand.Next(2500)) + 10; ang = rand.Next(22) / 180.0f * Math.PI + Math.PI * 150f / 180f; } return new Vector2(tower.X + (float)(r * Math.Cos(ang)), tower.Y - (float)(r * Math.Sin(ang))); } public static void TransferUnitsToNewTower(this Map self) { foreach(Struct.UnitPlayerData player in self.UnitPlayers.Values) { Vector2 pos = self.GetRandomPlayerPos(); self.GetXmdsManager().transferUnit(self.Id.ToString(), player.ObjId, pos.X, pos.Y); } Log.Debug($"transfer unit: {self.UnitPlayers.Count}"); } } }