using Assets.MyGame.Scripts.Net.API.GameConfig_SubClass; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace Assets.MyGame.Scripts.Net.WebResponses { public static class FrameDataParser { public static T Parse(object frameData) where T : class, new() { if (frameData == null) return null; // 如果已经是目标类型,直接返回 if (frameData is T typed) return typed; // 如果是字符串,直接反序列化 if (frameData is string str) return JsonConvert.DeserializeObject(str); // 如果是 JObject,轻量解析 if (frameData is JObject jObj) return jObj.ToObject(); // 兜底:调用 ToString 再反序列化 return JsonConvert.DeserializeObject(frameData.ToString()); } } [Serializable] public enum FrameDataType { none = 0, rotateTurrect=1, fireBullet=2, // createFish=3 已废弃:鱼创建改由服务端 OnFishSpawn 事件下发 changeAutoTarget=4, randomDieFish=5, changeTurretState=6, changeTurret=7, freezeFish=8, changeCannonMultiple=9, changeWing=10, // requestSyncFish=11 已废弃:鱼同步改由服务端 OnFishSpawn(type=sync) 事件下发 /// 爆奖结束:某玩家爆奖流程完成,广播给其他客户端显示最终 BJEndUI 并加分 baoJiangEnd=12, } [Serializable] public class FireCannonSendData { public string roomId; public string userId; public long gold; public int count; public List bulletIds; public SyncGameData extra; public bool isBot; /// 服务端权威:每发子弹扣费明细(bulletId + gold) public List bullets; /// 服务端时间戳 public long timestamp; } /// /// 单发子弹扣费明细:服务端在 FireCannon 广播里返回的权威扣费金额 /// [Serializable] public class BulletGold { public string bulletId; public long gold; } /// /// 同步游戏数据 /// [Serializable] public class SyncGameData { public int sitPos; public FrameDataType frameType; public long time; public object frameData; } [Serializable] public class FrameData { } [Serializable] public class FrameData_Rotate : FrameData { public float angle; } [Serializable] public class FrameData_FireBullet : FrameData { public float angle; public long gold; public bool isSanShe; public bool isSuoDing; public bool auto; public bool twoRTruuect; public string monsterID; public bool isZuanTou; /// 三发锁定时每个子弹对应的鱼 GUID(3个),按优先级排序 public List monsterIDs; } [Serializable] public class FrameData_CreateFish : FrameData { public string fishNumber; public string guid; public string moveLineId; } [Serializable] public class FrameData_ChangeAutoTarget : FrameData { public List< string> targetGuid; public int colliderIndex; } [Serializable] public class FrameData_RandomDieFish : FrameData { public float x; public float y; public float z; public List guids=new List(); public List coinNum=new List(); public int count; } [Serializable] public class FrameData_TurretState : FrameData { public TurretState state; } [Serializable] public class FrameData_ChangeTurret : FrameData { public int turretIndex; } [Serializable] public class FrameData_FreezeFish : FrameData { public bool isFreeze; } [Serializable] public class FrameData_ChangeCannonMultiple : FrameData { public int cannonMultiple; } /// /// 爆奖结束帧数据(frameType=baoJiangEnd)。 /// 服务端在玩家爆奖流程完成时广播,其他客户端据此显示最终 BJEndUI 并加分。 /// [Serializable] public class FrameData_BaoJiangEnd : FrameData { /// 爆奖玩家 ID public string userId; /// 击杀者座位 ID public int posID; /// 死亡的鱼 ID(用于匹配 pending 的 not-self 爆奖) public string fishId; /// 最终倍数 public int beishu; /// 最终得分(金币) public long score; } // ================================================================ // OnFishSpawn 事件数据结构 (服务端出鱼,破坏性替代 createFish 帧同步) // ================================================================ /// /// 服务端出鱼事件 OnFishSpawn 的数据载体。 /// type: /// "init" - 首次出鱼(玩家进入房间后服务端推送初始鱼) /// "spawn" - 定时出鱼(游戏中持续刷怪) /// "sync" - 重连/取消挂机同步(把当前场上活鱼推送给回归玩家) /// [Serializable] public class OnFishSpawnData { /// "init" | "spawn" | "sync" public string type; /// 服务器当前时间戳(毫秒) public long timestamp; /// 本批次出鱼列表 public List fish; } /// /// OnFishSpawn 单条鱼描述。 /// 客户端据此调用 SpawnFishMainThread 生成鱼实例。 /// [Serializable] public class OnFishSpawnFishItem { /// 服务端分配的全局唯一鱼 ID(作为 guid 使用) public long fishId; /// 鱼编号(配置 fishNumber) public string fishNumber; /// 路径编号 public int routeId; /// 鱼阵编号(非鱼阵时为空字符串) public string fishArrayNumber; /// 鱼阵的 Boss 鱼编号 public string bossFishNumber; /// 鱼阵普通鱼数量 public int fishCount; /// 鱼阵 Boss 数量 public int bossCount; /// 鱼创建时间戳(毫秒),到期自动移除 public long createdAt; /// 鱼过期时间戳(毫秒),到期自动移除 public long expireAt; /// 鱼剩余存活秒数(客户端做倒计时用) public int remainingSeconds; } /// /// 机器人退出房间通知数据 BotLeaveRoomNotice: { userId } /// [Serializable] public class BotLeaveRoomNoticeData { public string userId; } /// /// 玩家挂机/取消挂机通知数据: { userId } /// [Serializable] public class PlayerAfkNoticeData { public string userId; } /// /// 全局击杀公告 KillNotice 数据。 /// 真人击杀时只填基础字段;机器人模拟时额外填 fishName/multiplier/sceneName。 /// [Serializable] public class KillNoticeData { /// 鱼编号 public string FishId; /// 玩家名 public string userName; /// 金币 public long gold; // —— 机器人模拟时额外字段 —— /// 鱼名(机器人模拟时填充) public string fishName; /// 倍数(机器人模拟时填充) public int? multiplier; /// 场景名(机器人模拟时填充) public string sceneName; } }