Files
5.24BuYu/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs
T
2026-09-04 23:38:33 +08:00

304 lines
9.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}