Files
5.24BuYu/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs
T

389 lines
13 KiB
C#
Raw Normal View History

2026-07-17 17:50:31 +08:00
using Assets.MyGame.Scripts.Net.API.GameConfig_SubClass;
2026-03-09 09:25:01 +08:00
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
2026-02-03 11:35:19 +08:00
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
2026-04-25 18:53:04 +08:00
using UnityEngine;
2026-02-03 11:35:19 +08:00
namespace Assets.MyGame.Scripts.Net.WebResponses
{
2026-05-01 06:26:50 +08:00
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());
}
}
2026-03-09 09:25:01 +08:00
[Serializable]
public enum FrameDataType
{
2026-04-22 16:22:28 +08:00
none = 0,
2026-04-24 22:51:34 +08:00
rotateTurrect=1,
fireBullet=2,
2026-07-25 23:05:24 +08:00
// createFish=3 已废弃:鱼创建改由服务端 OnFishSpawn 事件下发
2026-04-24 22:51:34 +08:00
changeAutoTarget=4,
randomDieFish=5,
2026-05-04 17:21:52 +08:00
changeTurretState=6,
2026-05-28 18:16:45 +08:00
changeTurret=7,
2026-06-19 18:18:04 +08:00
freezeFish=8,
2026-06-30 01:31:53 +08:00
changeCannonMultiple=9,
2026-07-20 22:32:52 +08:00
changeWing=10,
2026-07-25 23:05:24 +08:00
// requestSyncFish=11 已废弃:鱼同步改由服务端 OnFishSpawn(type=sync) 事件下发
2026-07-30 22:09:55 +08:00
/// <summary>爆奖结束:某玩家爆奖流程完成,广播给其他客户端显示最终 BJEndUI 并加分</summary>
baoJiangEnd=12,
2026-08-28 22:33:35 +08:00
/// <summary>切换战神:某玩家装备/卸下战神,广播给其他客户端在对应座位加载/清除战神模型</summary>
changeZhanShen=13,
2026-09-04 23:38:33 +08:00
/// <summary>表情包:某玩家发送表情(spine动画/文字),广播给其他客户端在对应座位显示</summary>
biaoQing=14,
2026-09-27 20:34:42 +08:00
/// <summary>钻头蟹/激光蟹释放:击杀者点击(或超时)发射钻头/激光,广播给房间所有客户端(含发送者回广播),各端统一时刻发射</summary>
zuanTouRelease=15,
2026-10-08 05:01:13 +08:00
/// <summary>加金币:某玩家通过刮刮卡等 HTTP 途径获得金币(服务端不加房间推送),发送端本地加好后广播,各客户端给对应座位加金币</summary>
addGold=16,
2026-03-09 09:25:01 +08:00
}
2026-05-27 19:47:06 +08:00
[Serializable]
public class FireCannonSendData
{
2026-07-17 17:50:31 +08:00
public string roomId;
2026-05-27 19:47:06 +08:00
public string userId;
public long gold;
public int count;
2026-07-17 17:50:31 +08:00
public List<string> bulletIds;
2026-05-27 19:47:06 +08:00
public SyncGameData extra;
2026-07-17 17:50:31 +08:00
public bool isBot;
2026-07-30 23:54:35 +08:00
/// <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;
2026-05-27 19:47:06 +08:00
}
2026-02-03 11:35:19 +08:00
/// <summary>
/// 同步游戏数据
/// </summary>
[Serializable]
public class SyncGameData
{
2026-04-22 16:22:28 +08:00
public int sitPos;
2026-03-09 09:25:01 +08:00
public FrameDataType frameType;
2026-03-18 17:26:14 +08:00
public long time;
2026-04-25 18:53:04 +08:00
public object frameData;
2026-02-03 11:35:19 +08:00
}
2026-03-09 09:25:01 +08:00
[Serializable]
2026-02-03 11:35:19 +08:00
public class FrameData
{
2026-04-22 16:22:28 +08:00
2026-03-09 09:25:01 +08:00
}
[Serializable]
public class FrameData_Rotate : FrameData
{
public float angle;
}
[Serializable]
2026-06-16 19:12:37 +08:00
public class FrameData_FireBullet : FrameData
2026-03-09 09:25:01 +08:00
{
public float angle;
public long gold;
public bool isSanShe;
public bool isSuoDing;
public bool auto;
public bool twoRTruuect;
public string monsterID;
2026-05-18 18:39:11 +08:00
public bool isZuanTou;
2026-05-28 18:16:45 +08:00
/// <summary>三发锁定时每个子弹对应的鱼 GUID(3个),按优先级排序</summary>
public List<string> monsterIDs;
2026-03-09 09:25:01 +08:00
}
[Serializable]
public class FrameData_CreateFish : FrameData
{
2026-03-18 17:26:14 +08:00
public string fishNumber;
2026-03-10 15:36:10 +08:00
public string guid;
2026-03-18 17:26:14 +08:00
public string moveLineId;
2026-03-09 09:25:01 +08:00
}
[Serializable]
public class FrameData_ChangeAutoTarget : FrameData
{
2026-05-27 19:47:06 +08:00
public List< string> targetGuid;
public int colliderIndex;
2026-02-03 11:35:19 +08:00
}
2026-04-22 16:22:28 +08:00
[Serializable]
public class FrameData_RandomDieFish : FrameData
{
2026-04-25 18:53:04 +08:00
public float x;
public float y;
public float z;
2026-04-22 18:15:22 +08:00
public List<string> guids=new List<string>();
2026-04-25 00:12:55 +08:00
public List<RedPacketRecord> coinNum=new List<RedPacketRecord>();
2026-04-24 22:51:34 +08:00
public int count;
2026-04-22 16:22:28 +08:00
}
2026-05-04 17:21:52 +08:00
[Serializable]
public class FrameData_TurretState : FrameData
{
public TurretState state;
}
[Serializable]
public class FrameData_ChangeTurret : FrameData
{
public int turretIndex;
}
2026-05-28 18:16:45 +08:00
[Serializable]
public class FrameData_FreezeFish : FrameData
{
2026-06-21 00:07:26 +08:00
public bool isFreeze;
2026-05-28 18:16:45 +08:00
}
2026-06-19 18:18:04 +08:00
[Serializable]
public class FrameData_ChangeCannonMultiple : FrameData
{
public int cannonMultiple;
}
2026-07-25 23:05:24 +08:00
2026-07-30 22:09:55 +08:00
/// <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>
2026-08-09 17:57:46 +08:00
public long score;
2026-07-30 22:09:55 +08:00
}
2026-10-08 05:01:13 +08:00
/// <summary>
/// 加金币帧数据(frameType=addGold)。
/// 刮刮卡等 HTTP 途径获得金币后,由获得者客户端广播,各客户端给对应座位(sync.sitPos)加金币并刷新显示。
/// </summary>
[Serializable]
public class FrameData_AddGold : FrameData
{
/// <summary>增加的金币数</summary>
public long gold;
/// <summary>来源描述(金币流水日志用,如 "GuaGuaKa")</summary>
public string source;
}
2026-09-04 23:38:33 +08:00
/// <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;
}
2026-09-27 20:34:42 +08:00
/// <summary>
/// 钻头蟹/激光蟹释放帧数据(frameType=zuanTouRelease)。
/// 击杀者点击(或超时)时由击杀者客户端发送(机器人击杀由房主代发),
/// 服务器广播给房间所有人(含发送者回广播),各客户端按 fishId 匹配本地爆奖事件统一发射。
/// </summary>
[Serializable]
public class FrameData_ZuanTouRelease : FrameData
{
/// <summary>击杀者 userId</summary>
public string userId;
/// <summary>死亡的特殊鱼 ID(各端用它匹配本地正在等待释放的爆奖事件实例)</summary>
public string fishId;
/// <summary>发射时的炮台源角度(下方座位坐标系,接收端按该座位在本端显示位置用 SeatMirror 还原)</summary>
public float angle;
}
2026-07-25 23:05:24 +08:00
// ================================================================
// 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;
2026-07-26 22:00:38 +08:00
/// <summary>鱼创建时间戳(毫秒),到期自动移除</summary>
public long createdAt;
2026-07-25 23:05:24 +08:00
/// <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;
}
2026-10-06 01:14:13 +08:00
/// <summary>
/// 玩家信息同步 OnPlayerInfo 数据(GetPlayerInfo 的新响应,发送给调用者)。
/// 旧事件 SendPlayerInfoResult 只返回 gold;本事件返回完整玩家信息。
/// </summary>
[Serializable]
public class OnPlayerInfoData
{
/// <summary>玩家ID</summary>
public string userId;
/// <summary>玩家昵称</summary>
public string userName;
/// <summary>金币</summary>
public long gold;
/// <summary>钻石</summary>
public int diamond;
/// <summary>VIP等级</summary>
public int viplvl;
/// <summary>炮倍</summary>
public int cannonMultiple;
/// <summary>炮台ID</summary>
public string cannonId;
/// <summary>翅膀ID</summary>
public string wingsId;
/// <summary>座位位置</summary>
public int position;
}
2026-09-22 03:59:20 +08:00
/// <summary>
/// 召唤卡召唤通知 SummonCardFishNotice 数据。
/// 仅用于播放召唤提示/特效/显示召唤玩家,实际鱼对象仍由 OnFishSpawn 创建。
/// </summary>
[Serializable]
public class SummonCardFishNoticeData
{
/// <summary>房间ID</summary>
public string roomId;
/// <summary>使用召唤卡的玩家ID</summary>
public string userId;
/// <summary>玩家编号</summary>
public string userNumber;
/// <summary>玩家昵称</summary>
public string userName;
/// <summary>鱼类型 2=Boss鱼(飞机场/星际迷航场次), 3=黄金鱼(其他场次)</summary>
public int fishType;
/// <summary>"Boss鱼"或"黄金鱼"</summary>
public string fishTypeName;
/// <summary>鱼配置编号</summary>
public string fishNumber;
/// <summary>鱼实例ID,与 OnFishSpawn 中的 fishId 一致</summary>
public long fishId;
}
2026-07-25 23:05:24 +08:00
/// <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;
}
2026-02-03 11:35:19 +08:00
}