304 lines
9.6 KiB
C#
304 lines
9.6 KiB
C#
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<T>(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<T>(str);
|
||
|
||
// 如果是 JObject,轻量解析
|
||
if (frameData is JObject jObj)
|
||
return jObj.ToObject<T>();
|
||
|
||
// 兜底:调用 ToString 再反序列化
|
||
return JsonConvert.DeserializeObject<T>(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) 事件下发
|
||
/// <summary>爆奖结束:某玩家爆奖流程完成,广播给其他客户端显示最终 BJEndUI 并加分</summary>
|
||
baoJiangEnd=12,
|
||
/// <summary>切换战神:某玩家装备/卸下战神,广播给其他客户端在对应座位加载/清除战神模型</summary>
|
||
changeZhanShen=13,
|
||
/// <summary>表情包:某玩家发送表情(spine动画/文字),广播给其他客户端在对应座位显示</summary>
|
||
biaoQing=14,
|
||
}
|
||
[Serializable]
|
||
public class FireCannonSendData
|
||
{
|
||
public string roomId;
|
||
public string userId;
|
||
public long gold;
|
||
public int count;
|
||
public List<string> bulletIds;
|
||
public SyncGameData extra;
|
||
public bool isBot;
|
||
/// <summary>服务端权威:每发子弹扣费明细(bulletId + gold)</summary>
|
||
public List<BulletGold> bullets;
|
||
/// <summary>服务端时间戳</summary>
|
||
public long timestamp;
|
||
}
|
||
/// <summary>
|
||
/// 单发子弹扣费明细:服务端在 FireCannon 广播里返回的权威扣费金额
|
||
/// </summary>
|
||
[Serializable]
|
||
public class BulletGold
|
||
{
|
||
public string bulletId;
|
||
public long gold;
|
||
}
|
||
/// <summary>
|
||
/// 同步游戏数据
|
||
/// </summary>
|
||
[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;
|
||
/// <summary>三发锁定时每个子弹对应的鱼 GUID(3个),按优先级排序</summary>
|
||
public List<string> 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<string> guids=new List<string>();
|
||
public List<RedPacketRecord> coinNum=new List<RedPacketRecord>();
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 爆奖结束帧数据(frameType=baoJiangEnd)。
|
||
/// 服务端在玩家爆奖流程完成时广播,其他客户端据此显示最终 BJEndUI 并加分。
|
||
/// </summary>
|
||
[Serializable]
|
||
public class FrameData_BaoJiangEnd : FrameData
|
||
{
|
||
/// <summary>爆奖玩家 ID</summary>
|
||
public string userId;
|
||
/// <summary>击杀者座位 ID</summary>
|
||
public int posID;
|
||
/// <summary>死亡的鱼 ID(用于匹配 pending 的 not-self 爆奖)</summary>
|
||
public string fishId;
|
||
/// <summary>最终倍数</summary>
|
||
public int beishu;
|
||
/// <summary>最终得分(金币)</summary>
|
||
public long score;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 表情包类型:spine 动画表情 / 文字表情
|
||
/// </summary>
|
||
[Serializable]
|
||
public enum BiaoQingType
|
||
{
|
||
/// <summary>Spine 动画表情(frameData.content=动画名,spineIndex=配置下标)</summary>
|
||
spine = 1,
|
||
/// <summary>文字表情(frameData.content=文字内容)</summary>
|
||
zi = 2,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 表情包帧数据(frameType=biaoQing)。
|
||
/// 某玩家点击表情后广播,各客户端在发送者座位上显示表情。
|
||
/// </summary>
|
||
[Serializable]
|
||
public class FrameData_BiaoQing : FrameData
|
||
{
|
||
/// <summary>表情类型:spine=动画表情 zi=文字表情</summary>
|
||
public BiaoQingType biaoQingType;
|
||
/// <summary>spine 表情:GameMainPanel_FishBase.list_BiaoQingSpine 的下标(文字表情不用)</summary>
|
||
public int spineIndex;
|
||
/// <summary>spine 表情=动画名;文字表情=文字内容</summary>
|
||
public string content;
|
||
}
|
||
|
||
// ================================================================
|
||
// OnFishSpawn 事件数据结构 (服务端出鱼,破坏性替代 createFish 帧同步)
|
||
// ================================================================
|
||
|
||
/// <summary>
|
||
/// 服务端出鱼事件 OnFishSpawn 的数据载体。
|
||
/// type:
|
||
/// "init" - 首次出鱼(玩家进入房间后服务端推送初始鱼)
|
||
/// "spawn" - 定时出鱼(游戏中持续刷怪)
|
||
/// "sync" - 重连/取消挂机同步(把当前场上活鱼推送给回归玩家)
|
||
/// </summary>
|
||
[Serializable]
|
||
public class OnFishSpawnData
|
||
{
|
||
/// <summary>"init" | "spawn" | "sync"</summary>
|
||
public string type;
|
||
/// <summary>服务器当前时间戳(毫秒)</summary>
|
||
public long timestamp;
|
||
/// <summary>本批次出鱼列表</summary>
|
||
public List<OnFishSpawnFishItem> fish;
|
||
}
|
||
|
||
/// <summary>
|
||
/// OnFishSpawn 单条鱼描述。
|
||
/// 客户端据此调用 SpawnFishMainThread 生成鱼实例。
|
||
/// </summary>
|
||
[Serializable]
|
||
public class OnFishSpawnFishItem
|
||
{
|
||
/// <summary>服务端分配的全局唯一鱼 ID(作为 guid 使用)</summary>
|
||
public long fishId;
|
||
/// <summary>鱼编号(配置 fishNumber)</summary>
|
||
public string fishNumber;
|
||
/// <summary>路径编号</summary>
|
||
public int routeId;
|
||
/// <summary>鱼阵编号(非鱼阵时为空字符串)</summary>
|
||
public string fishArrayNumber;
|
||
/// <summary>鱼阵的 Boss 鱼编号</summary>
|
||
public string bossFishNumber;
|
||
/// <summary>鱼阵普通鱼数量</summary>
|
||
public int fishCount;
|
||
/// <summary>鱼阵 Boss 数量</summary>
|
||
public int bossCount;
|
||
/// <summary>鱼创建时间戳(毫秒),到期自动移除</summary>
|
||
public long createdAt;
|
||
/// <summary>鱼过期时间戳(毫秒),到期自动移除</summary>
|
||
public long expireAt;
|
||
/// <summary>鱼剩余存活秒数(客户端做倒计时用)</summary>
|
||
public int remainingSeconds;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 机器人退出房间通知数据 BotLeaveRoomNotice: { userId }
|
||
/// </summary>
|
||
[Serializable]
|
||
public class BotLeaveRoomNoticeData
|
||
{
|
||
public string userId;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 玩家挂机/取消挂机通知数据: { userId }
|
||
/// </summary>
|
||
[Serializable]
|
||
public class PlayerAfkNoticeData
|
||
{
|
||
public string userId;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 全局击杀公告 KillNotice 数据。
|
||
/// 真人击杀时只填基础字段;机器人模拟时额外填 fishName/multiplier/sceneName。
|
||
/// </summary>
|
||
[Serializable]
|
||
public class KillNoticeData
|
||
{
|
||
/// <summary>鱼编号</summary>
|
||
public string FishId;
|
||
/// <summary>玩家名</summary>
|
||
public string userName;
|
||
/// <summary>金币</summary>
|
||
public long gold;
|
||
// —— 机器人模拟时额外字段 ——
|
||
/// <summary>鱼名(机器人模拟时填充)</summary>
|
||
public string fishName;
|
||
/// <summary>倍数(机器人模拟时填充)</summary>
|
||
public int? multiplier;
|
||
/// <summary>场景名(机器人模拟时填充)</summary>
|
||
public string sceneName;
|
||
}
|
||
}
|