diff --git a/Assets/Framework/Event/ConstEventString.cs b/Assets/Framework/Event/ConstEventString.cs
index 372c55bda..c67648365 100644
--- a/Assets/Framework/Event/ConstEventString.cs
+++ b/Assets/Framework/Event/ConstEventString.cs
@@ -21,6 +21,8 @@ public class ConstEventString
public const string BaoJiangEnd = "BaoJiangEnd";
/// 钻头蟹/激光蟹释放帧同步(zuanTouRelease):击杀者点击(或超时)发射,所有客户端(含击杀者回广播)统一时刻发射钻头/激光
public const string SyncGameData_ZuanTouRelease = "SyncGameData_ZuanTouRelease";
+ /// 加金币帧同步(addGold):刮刮卡等 HTTP 途径获得金币后广播,各客户端给对应座位加金币并刷新显示
+ public const string SyncGameData_AddGold = "SyncGameData_AddGold";
// ================================================================
// 服务端 → 客户端事件 (新协议)
diff --git a/Assets/MyGame/Scripts/Items/Bullits/BullitMove.cs b/Assets/MyGame/Scripts/Items/Bullits/BullitMove.cs
index 59651fd38..709a592df 100644
--- a/Assets/MyGame/Scripts/Items/Bullits/BullitMove.cs
+++ b/Assets/MyGame/Scripts/Items/Bullits/BullitMove.cs
@@ -20,6 +20,9 @@ public class BullitMove : MonoBehaviour
MonsterContral target;
public Transform targetTra;
public string bulletID;
+ /// 该发子弹的实际扣费炮倍(双倍炮=2倍炮倍)。击中结算时作为 KillFish 的 paoBei 上报,
+ /// 后端按它算奖励 → 双倍炮奖励随之×2。0=未记录(回退发射者座位炮倍)
+ public long fireGold = 0;
// 转向参数
public float maxTurnSpeed = 15f; // 最大转向速度(度/秒)
@@ -319,8 +322,12 @@ public class BullitMove : MonoBehaviour
if (userid == GameManager.Instance.user.id)
{
// 真人玩家击杀
+ // ⭐ paoBei 用该发实际扣费炮倍(双倍炮=2倍),后端按它结算 → 奖励×2;
+ // 未记录时回退当前座位炮倍(兼容旧逻辑)
+ long paoBei = fireGold > 0 ? fireGold
+ : CreateFishManager.Instance.currGameType.currSitData.consumeGoldNum;
var v2 = GameManager.Instance.gameData.currRoomData;
- WebSocketSendList.KillFish(v2.roomId, userid, monster.monsterData.fishTypeConfig.fishNumber, monster.guid, (int)CreateFishManager.Instance.currGameType.currSitData.consumeGoldNum, bulletID, "63215f0afa3f5b25");
+ WebSocketSendList.KillFish(v2.roomId, userid, monster.monsterData.fishTypeConfig.fishNumber, monster.guid, (int)paoBei, bulletID, "63215f0afa3f5b25");
}
else if (!string.IsNullOrEmpty(userid) && userid.StartsWith("bot_"))
{
diff --git a/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs b/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs
index d4c85d632..646d6762d 100644
--- a/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs
+++ b/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs
@@ -61,6 +61,8 @@ namespace Assets.MyGame.Scripts.Net.WebResponses
biaoQing=14,
/// 钻头蟹/激光蟹释放:击杀者点击(或超时)发射钻头/激光,广播给房间所有客户端(含发送者回广播),各端统一时刻发射
zuanTouRelease=15,
+ /// 加金币:某玩家通过刮刮卡等 HTTP 途径获得金币(服务端不加房间推送),发送端本地加好后广播,各客户端给对应座位加金币
+ addGold=16,
}
[Serializable]
public class FireCannonSendData
@@ -185,6 +187,19 @@ namespace Assets.MyGame.Scripts.Net.WebResponses
public long score;
}
+ ///
+ /// 加金币帧数据(frameType=addGold)。
+ /// 刮刮卡等 HTTP 途径获得金币后,由获得者客户端广播,各客户端给对应座位(sync.sitPos)加金币并刷新显示。
+ ///
+ [Serializable]
+ public class FrameData_AddGold : FrameData
+ {
+ /// 增加的金币数
+ public long gold;
+ /// 来源描述(金币流水日志用,如 "GuaGuaKa")
+ public string source;
+ }
+
///
/// 表情包类型:spine 动画表情 / 文字表情
///
diff --git a/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs b/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs
index 42888929b..8c37b3148 100644
--- a/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs
+++ b/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs
@@ -408,6 +408,10 @@ namespace Assets.MyGame.Scripts.Net
case FrameDataType.zuanTouRelease:
EventCenter.Instance.EventTrigger(ConstEventString.SyncGameData_ZuanTouRelease, syncGameData);
break;
+ // ⭐ 加金币:刮刮卡等 HTTP 途径获得金币后广播,各客户端给对应座位加金币并刷新显示
+ case FrameDataType.addGold:
+ EventCenter.Instance.EventTrigger(ConstEventString.SyncGameData_AddGold, syncGameData);
+ break;
default:
break;
}
diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/1507.prefab b/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/1507.prefab
index d742f65f6..776145fd1 100644
--- a/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/1507.prefab
+++ b/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/1507.prefab
@@ -1689,7 +1689,7 @@ CircleCollider2D:
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
- m_IsTrigger: 0
+ m_IsTrigger: 1
m_UsedByEffector: 0
m_UsedByComposite: 0
m_Offset: {x: -0.046641767, y: 0.013882924}
diff --git a/Assets/MyGame/aa/UI/DefaultPanel/GuaGuaLe/GuaGuaLeGPU.cs b/Assets/MyGame/aa/UI/DefaultPanel/GuaGuaLe/GuaGuaLeGPU.cs
index 7050fc3ef..1f6ef41c0 100644
--- a/Assets/MyGame/aa/UI/DefaultPanel/GuaGuaLe/GuaGuaLeGPU.cs
+++ b/Assets/MyGame/aa/UI/DefaultPanel/GuaGuaLe/GuaGuaLeGPU.cs
@@ -1,4 +1,5 @@
using Assets.MyGame.Scripts.Net;
+using Assets.MyGame.Scripts.Net.APIResponses;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
@@ -49,6 +50,8 @@ public class GuaGuaLeGPU : SubUIBase, IPointerDownHandler, IDragHandler
private string currentAward;
private bool isRevealed;
private bool isScratching;
+ /// 本次抽奖结果(领取时按 prizeType 判断是否给游戏内座位加金币)
+ private ScratchCardResult drawResult;
private Vector2 lastUV;
private bool hasLastUV;
@@ -62,6 +65,12 @@ public class GuaGuaLeGPU : SubUIBase, IPointerDownHandler, IDragHandler
///
public static bool SuspendWsRefresh;
+ ///
+ /// 领取时刮出金币触发(参数 = 金币数):游戏内 GameMainPanel_FishBase 订阅后
+ /// 给本地座位加金币并帧同步给房间其他玩家;主界面(无游戏面板)不订阅不触发。
+ ///
+ public static event System.Action OnScratchGoldAwarded;
+
public override void Awake()
{
base.Awake();
@@ -73,6 +82,10 @@ public class GuaGuaLeGPU : SubUIBase, IPointerDownHandler, IDragHandler
private void OnGetClick()
{
SuspendWsRefresh = false;
+ // ⭐ 刮出金币:通知游戏内给本地座位加金币并帧同步给房间其他玩家(主界面没订阅不触发)
+ if (drawResult != null && drawResult.prizeType == 1 && drawResult.count > 0)
+ OnScratchGoldAwarded?.Invoke(drawResult.count);
+ drawResult = null;
string userId = GameManager.Instance?.user?.id;
if (!string.IsNullOrEmpty(userId))
APIRequestList.GetUser(userId, a => GameManager.Instance.UpdataUserData(a));
@@ -145,6 +158,7 @@ public class GuaGuaLeGPU : SubUIBase, IPointerDownHandler, IDragHandler
{
if (result == null || giftPrefab == null) return;
+ drawResult = result; // 保存抽奖结果:领取时按 prizeType 判断是否给游戏内座位加金币
currentAward = result.prizeName ?? "谢谢参与";
// 清除旧的奖励物品
diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
index ec6e997d0..a39f63d65 100644
--- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
+++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
@@ -207,9 +207,10 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
public float lockPathMax = 0.9f;
- // ⭐ 双倍开火:toggle_Shuang 开启后计时 shuangDuration 秒自动关闭(DaoJiShi 驱动),
- // child0 的 Image(Filled 360°) 做环形倒计时显示(GetShuangFillImage 懒获取)
- float shuangDuration = 15f;
+ // ⭐ 双倍开火:玩家手动开关的持久模式(同三射/锁定),不自动关闭、不消耗道具。
+ // child0 的 Image(Filled 360°) 做环形转圈展示(GetShuangFillImage 懒获取):
+ // 开启后环耗尽一圈从头继续转(循环动画),关闭时停转清环。
+ float shuangDuration = 15f; // 环转一圈的时长(纯视觉,不控制功能开关)
public float currShuangTime = 0f;
private Image _shuangFillImage;
public Toggle toggle_BaoZou;
@@ -729,6 +730,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
EventCenter.Instance.AddEventListener(ConstEventString.SyncGameData_ChangeZhanShen, SyncGameData_ChangeZhanShen);
// ⭐ 表情包帧同步(biaoQing):其他玩家发送表情,对应座位显示
EventCenter.Instance.AddEventListener(ConstEventString.SyncGameData_BiaoQing, SyncGameData_BiaoQing);
+ // ⭐ 加金币帧同步(addGold):其他玩家刮刮卡等 HTTP 途径获得金币,对应座位加金币刷新显示
+ EventCenter.Instance.AddEventListener(ConstEventString.SyncGameData_AddGold, SyncGameData_AddGold);
+ // ⭐ 刮刮卡领取金币:本地座位加金币并帧同步给房间其他玩家(先减防重复订阅)
+ GuaGuaLeGPU.OnScratchGoldAwarded -= OnScratchGoldAwarded;
+ GuaGuaLeGPU.OnScratchGoldAwarded += OnScratchGoldAwarded;
// SyncGameData_FreezeFish 已废弃:冰冻改由服务端 FishFrozen 事件统一触发
EventCenter.Instance.AddEventListener(ConstEventString.FishFrozen, OnFishFrozen);
// ⭐ 召唤卡召唤通知:某玩家使用召唤卡,服务端已创建召唤鱼(仅播提示,实际鱼由 OnFishSpawn 创建)
@@ -964,6 +970,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
EventCenter.Instance.RemoveEventListener(ConstEventString.SyncGameData_ChangeWing, SyncGameData_ChangeWing);
EventCenter.Instance.RemoveEventListener(ConstEventString.SyncGameData_ChangeZhanShen, SyncGameData_ChangeZhanShen);
EventCenter.Instance.RemoveEventListener(ConstEventString.SyncGameData_BiaoQing, SyncGameData_BiaoQing);
+ // ⭐ 加金币帧同步 + 刮刮卡领取金币订阅随面板销毁解除
+ EventCenter.Instance.RemoveEventListener(ConstEventString.SyncGameData_AddGold, SyncGameData_AddGold);
+ GuaGuaLeGPU.OnScratchGoldAwarded -= OnScratchGoldAwarded;
// SyncGameData_FreezeFish 已废弃:冰冻改由服务端 FishFrozen 事件统一触发
EventCenter.Instance.RemoveEventListener(ConstEventString.FishFrozen, OnFishFrozen);
EventCenter.Instance.RemoveEventListener(ConstEventString.SummonCardFishNotice, OnSummonCardFishNotice);
@@ -1094,7 +1103,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
GameManager.Instance.user.id,
"40003", 0);
});
- // ⭐ 双倍开火开关:开启(重新)计时 15 秒 + 满环开始倒计时,关闭停表清环。
+ // ⭐ 双倍开火开关:持久模式(玩家手动开关,不自动关闭)。
+ // 开启=满环开始循环转圈(DaoJiShi 驱动,转完一圈从头继续),关闭=停转清环。
// isDouble 不需要同步开关状态:每次开火随 SyncFire 的 twoRTruect 传给服务端,
// 三处开火入口(TryFire/HandleAutoFire/OnFlyTurretUpwardFire)都实时读 isOn
if (toggle_Shuang != null)
@@ -1793,6 +1803,57 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
ShowBiaoQing(dispPos, data.biaoQingType, data.spineIndex, data.content);
}
+ ///
+ /// 刮刮卡领取金币回调(GuaGuaLeGPU.OnScratchGoldAwarded):
+ /// 服务端已把金币加到大厅数据(游戏内房间不推),给本地座位显示层加金币,
+ /// 并帧同步(addGold)广播给房间其他玩家。
+ ///
+ public void OnScratchGoldAwarded(long gold)
+ {
+ if (currSitData == null || gold <= 0) return;
+ AddGoldToSeat(currSitData, gold, "GuaGuaKa");
+
+ // ⭐ 帧同步给房间其他玩家(自己回广播在 SyncGameData_AddGold 里跳过,防止双重加)
+ SyncGameData sgd = new SyncGameData
+ {
+ sitPos = SeatMirror.ToServer(currSitData.posID),
+ frameType = FrameDataType.addGold,
+ time = BeijingTimeManager.Instance.CurrentTimestampMs,
+ frameData = new FrameData_AddGold { gold = gold, source = "GuaGuaKa" }
+ };
+ WebSocketSendList.SyncGameData(sgd);
+ }
+
+ ///
+ /// 收到其他玩家的加金币帧(addGold):给对应座位显示层加金币并刷新金币文本。
+ /// 座位镜像:服务端座位先转显示座位再找场景座位;本地座位跳过(发送时已加)。
+ ///
+ public void SyncGameData_AddGold(SyncGameData sync)
+ {
+ var data = FrameDataParser.Parse(sync.frameData);
+ if (data == null || data.gold <= 0) return;
+
+ // ⭐ 座位镜像:服务端座位转显示座位
+ int dispPos = SeatMirror.ToDisplay(sync.sitPos);
+ if (currSitData == null || dispPos == currSitData.posID) return; // 本地座位已在 OnScratchGoldAwarded 加过
+
+ var sit = list_Sits.Find(s => s != null && s.posID == dispPos);
+ if (sit == null) return;
+ AddGoldToSeat(sit, data.gold, string.IsNullOrEmpty(data.source) ? "addGold" : data.source);
+ }
+
+ /// 给座位显示层加金币并刷新金币文本 + 记录金币流水(服务端已加钱,这里纯表现层,与杀鱼 onScoreAdd 同惯例)
+ private void AddGoldToSeat(SitPosData sit, long gold, string source)
+ {
+ long oldGold = sit.goldNum;
+ sit.goldNum += gold;
+ if (sit.tMP_GoldNum != null)
+ sit.tMP_GoldNum.text = sit.goldNum.ToString();
+ // ⭐ 记录金币流水:已加钱(刮刮卡等途径,本地已执行)
+ GameManager.LogGoldFlowAppliedGain(source,
+ $"加金币=+{gold} 座位={sit.posID} 修正前金币={oldGold} 剩余金币={sit.goldNum} 房间={GameManager.Instance.gameData?.currRoomData?.roomId}");
+ }
+
#endregion
#region 大喇叭/召唤卡(Left道具快捷按钮)
@@ -2735,7 +2796,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
// ⭐ 本地金币校验:没钱不切换 Attack 状态,也不广播,避免无效请求
- if (!HasEnoughGoldToFire(toggle_Three.isOn))
+ if (!HasEnoughGoldToFire(toggle_Three.isOn, toggle_Shuang != null && toggle_Shuang.isOn))
return;
// 按下即进入 Attack:短按→射击,松开后回 Idle
currSitData.ChangeState(TurretState.Attack);
@@ -3066,23 +3127,21 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
}
- // ⭐ 双倍开火倒计时:child0 的环形填充图(Image Filled 360°)随时间耗尽,
- // 15 秒后自动关闭。SetIsOnWithoutNotify 不触发 onValueChanged(避免重置计时逻辑);
- // 关闭后三处开火入口读 isOn=false,后续 SyncFire 的 twoRTruect 自动恢复单倍
+ // ⭐ 双倍开火转圈环:纯展示效果,不是倒计时。
+ // 双倍是玩家手动开关的持久模式(同三射/锁定),倒计时结束不许关闭功能——
+ // 环耗尽一圈后从头继续转(循环动画),只有玩家手动关 toggle 才停转清环
+ // (关闭走 onValueChanged:currShuangTime=0、fill=0)。
+ // 功能开关由玩家手动控制;三处开火入口实时读 isOn,SyncFire 的 gold 随之×2/×1。
if (toggle_Shuang != null && toggle_Shuang.isOn && shuangDuration > 0)
{
var fill = GetShuangFillImage();
- if (fill != null)
- fill.fillAmount = Mathf.Clamp01(currShuangTime / shuangDuration);
currShuangTime -= Time.deltaTime;
+ if (currShuangTime <= 0f)
+ currShuangTime = shuangDuration; // 转完一圈从头继续转
- if (currShuangTime <= 0)
- {
- toggle_Shuang.SetIsOnWithoutNotify(false);
- currShuangTime = 0f;
- if (fill != null) fill.fillAmount = 0f;
- }
+ if (fill != null)
+ fill.fillAmount = Mathf.Clamp01(currShuangTime / shuangDuration);
}
}
@@ -3113,7 +3172,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 本地金币校验:没钱直接返回,不发送开炮请求
// clickTime 保持满,金币恢复后立即开火
- if (!HasEnoughGoldToFire(toggle_Three.isOn))
+ if (!HasEnoughGoldToFire(toggle_Three.isOn, toggle_Shuang != null && toggle_Shuang.isOn))
return;
// ⭐ 子弹上限校验(先于扣费和状态切换)
@@ -3152,7 +3211,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
{
if (currSitData == null || _isLeavingCountdown) return;
if (currSitData.isDrillActive) return;
- if (!HasEnoughGoldToFire(false)) return;
+ if (!HasEnoughGoldToFire(false, toggle_Shuang != null && toggle_Shuang.isOn)) return;
if (IsBulletLimitReached(currSitData.user)) return;
// 0° = 正上方;起飞炮台不支持三连
@@ -3326,7 +3385,10 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
return; // 没钱,后续不发
MonsterContral target = targets.Count > 0 ? targets[Mathf.Min(i, targets.Count - 1)] : null;
- StartCoroutine(LaserHitRoutine(sit, target, bullitIDs[i]));
+ // ⭐ 该发实际扣费炮倍(服务端权威优先,回退本地计算:双倍×2),
+ // 结算 KillFish 的 paoBei 用 → 双倍激光奖励×2
+ long useConsume = gold > 0 ? gold : sit.consumeGoldNum * (isDouble ? 2 : 1);
+ StartCoroutine(LaserHitRoutine(sit, target, bullitIDs[i], useConsume));
}
if (sit.posID == currSitData.posID)
@@ -3348,7 +3410,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
/// 激光命中协程:延迟 laserHitDelay 后结算(不开实体子弹)。
/// 结算逻辑与 BullitMove.AttackFish 一致:本人发 KillFish、bot 由房主发 BotKillFish、本地播 OnHurt。
///
- private System.Collections.IEnumerator LaserHitRoutine(SitPosData sit, MonsterContral target, string bulletId)
+ private System.Collections.IEnumerator LaserHitRoutine(SitPosData sit, MonsterContral target, string bulletId, long fireGold = 0)
{
if (laserHitDelay > 0f)
yield return new WaitForSeconds(laserHitDelay);
@@ -3362,10 +3424,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
if (sit.user == GameManager.Instance.user.id)
{
// 真人玩家击杀:直接发后端
+ // ⭐ paoBei 用该发实际扣费炮倍(双倍=2倍),后端按它结算 → 奖励×2
var v2 = GameManager.Instance.gameData.currRoomData;
WebSocketSendList.KillFish(v2.roomId, sit.user,
target.monsterData.fishTypeConfig.fishNumber, target.guid,
- (int)sit.consumeGoldNum, bulletId, "63215f0afa3f5b25");
+ (int)(fireGold > 0 ? fireGold : sit.consumeGoldNum), bulletId, "63215f0afa3f5b25");
}
else if (!string.IsNullOrEmpty(sit.user) && sit.user.StartsWith("bot_"))
{
@@ -3454,7 +3517,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 本地金币校验:没钱直接返回,不切换攻击状态、不发送开炮请求
// autoFireTimer 保持满,金币恢复后立即开火
- if (!HasEnoughGoldToFire(toggle_Three.isOn))
+ if (!HasEnoughGoldToFire(toggle_Three.isOn, toggle_Shuang != null && toggle_Shuang.isOn))
return;
// ⭐ 子弹上限校验(先于状态切换和扣费)
@@ -4426,11 +4489,13 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
/// 弹出后设 false,仅在金币恢复到够最小炮倍时才重置 true,
/// 期间无论弹窗是否关闭、RequestLeaveRoom 是否异步等待,都不会再弹。
///
- private bool HasEnoughGoldToFire(bool isSanShe)
+ private bool HasEnoughGoldToFire(bool isSanShe, bool isDouble = false)
{
if (currSitData == null) return false;
int count = isSanShe ? 3 : 1;
- long need = currSitData.consumeGoldNum * count;
+ // ⭐ 双倍开火每发按 2 倍炮倍扣费(与 SyncFire 的 unitGold 对齐),
+ // 否则金币只够单倍时仍发双倍请求,后端扣费失败/扣成负数
+ long need = currSitData.consumeGoldNum * count * (isDouble ? 2 : 1);
if (currSitData.goldNum >= need)
{
// 金币够当前炮倍:可正常开火,重置弹窗标志
@@ -4516,6 +4581,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
bullet.userid = sit.user;
bullet.playerID = sit.user;
bullet.bulletID = id;
+ // ⭐ 记录该发实际扣费炮倍(服务端权威金额优先,回退本地计算:双倍×2),
+ // 击中时 BullitMove.AttackFish 用它作 KillFish 的 paoBei → 双倍炮奖励×2
+ bullet.fireGold = fireConsumeGold > 0 ? fireConsumeGold : sit.consumeGoldNum * (isDouble ? 2 : 1);
if (isLock)
{
@@ -4590,6 +4658,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
var roomdata = GameManager.Instance.gameData.currRoomData;
var user = GameManager.Instance.user;
+ // ⭐ 双倍开火:一发子弹按 2 倍炮倍扣费。FireCannon 后端总扣费 = gold(单价) × count(发数),
+ // 双倍体现在单价×2(子弹仍是一颗),与本地 ConsumeGold(isDouble?2:1) 对齐,
+ // 否则后端只扣单倍,本地显示被后端权威数据覆盖 → 消耗没有×2
+ long unitGold = currSitData.consumeGoldNum * (isDouble ? 2 : 1);
+
// 三射 = 3 发,否则 = 1 发
int count = isSanShe ? 3 : 1;
@@ -4597,13 +4670,13 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
long timespan = BeijingTimeManager.Instance.CurrentTimestampMs; // 毫秒
long timestamp = timespan / 1000; // 秒级
string sign = WebSocketSendList.MakeFireCannonSign(
- roomdata.roomId, user.id, currSitData.consumeGoldNum, count, timestamp, "63215f0afa3f5b25");
+ roomdata.roomId, user.id, unitGold, count, timestamp, "63215f0afa3f5b25");
// FireCannon:roomId, userId, gold, count, timestamp, sign, extra
WebSocketSendList.FireCannon(
roomdata.roomId,
user.id,
- currSitData.consumeGoldNum,
+ unitGold,
count,
timestamp,
sign,
diff --git a/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanel_XJMH.cs b/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanel_XJMH.cs
index 4ed9d0171..43a14371e 100644
--- a/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanel_XJMH.cs
+++ b/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanel_XJMH.cs
@@ -1485,18 +1485,18 @@ public class GameMainPanel_XJMH : GameMainPanel_FishBase
},
imgs = new[] { "27|83|0.8|Assets/Bundles/PW/PW_Sprite/Common/zd_jn_ss.png" },
},
- new HelpItem2Cfg
- {
- w = 270, h = 398, name = "起飞技能", nameX = -20, nameY = 185,
- des = new[]
- {
- "16|80|点击炮台右侧“起飞”",
- "-7|37|按钮, 玩家可以自",
- "-11|7|由切换飞机和炮台",
- "-15|-23|这两种形态自由",
- "-20|-53|切形, 趣味无穷",
- },
- },
+ //new HelpItem2Cfg
+ //{
+ // w = 270, h = 398, name = "起飞技能", nameX = -20, nameY = 185,
+ // des = new[]
+ // {
+ // "16|80|点击炮台右侧“起飞”",
+ // "-7|37|按钮, 玩家可以自",
+ // "-11|7|由切换飞机和炮台",
+ // "-15|-23|这两种形态自由",
+ // "-20|-53|切形, 趣味无穷",
+ // },
+ //},
};
/// 玩法说明(原版 PW_Config.PlayMethod,12 条)
@@ -1623,90 +1623,90 @@ public class GameMainPanel_XJMH : GameMainPanel_FishBase
},
imgs = new[] { "-21|90|0.4|Assets/Bundles/PW/PW_Sprite/Handbook/tj_ts_zp.png" },
},
- new HelpItem2Cfg
- {
- w = 310, h = 398, name = "免费模式玩法", nameX = -30, nameY = 185,
- fishNumber = 12025, // 图鉴:弹药箱
- des = new[]
- {
- "0|80|击毁“ ”, 可获得",
- "-10.2|55|8~12秒免费模式时间; ",
- "-7.8|1.9|击毁“ ”, 可获得",
- "-18.3825|-24.4|3组免费子弹, 共24~36",
- "-49.3|-50.9|秒免费模式时间; ",
- "-63.7|-78.2|免费模式期间: ",
- "-13.2|-104.56|1.发射速度比普通模式高1倍",
- "-47.7|-129|2.无法调整炮台倍数",
- },
- imgs = new[]
- {
- "-13|92|0.4|Assets/Bundles/PW/PW_Sprite/Handbook/tj_ts_jzx.png",
- "-22.2|13.3|0.4|Assets/Bundles/PW/PW_Sprite/Handbook/tj_flboss.png",
- },
- },
- new HelpItem2Cfg
- {
- w = 300, h = 398, name = "分裂属性: ", nameX = -30, nameY = 185,
- des = new[]
- {
- "6.7|89.29|分裂: 击中目标后, 有概率",
- "4.720001|61.7|分裂出多发子弹, 攻击附近",
- "-80.7|32.2|敌机",
- "-5.8|-2.92|1级分裂: 8%概率触发分裂",
- "-10.8|-32.13|2级分裂(大对子): 20%",
- "-62.8|-57.64|概率触发分裂",
- "-15.19|-83.6|3级分裂(大三元): 50%",
- "-68.1|-108.7|概率触发分裂",
- },
- imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_1.png" },
- },
- new HelpItem2Cfg
- {
- w = 300, h = 398, name = "连电属性: ", nameX = -30, nameY = 185,
- des = new[]
- {
- "6.7|89.29|连电: 击中目标后, 有概率",
- "4.720001|61.7|触发连电效果, 攻击屏幕内",
- "-80.7|32.2|敌机",
- "-5.8|-2.92|1级连电: 8%概率触发连电",
- "-10.8|-32.13|2级连电(大对子): 20%",
- "-62.8|-57.64|概率触发连电",
- "-15.19|-83.6|3级连电(大三元): 50%",
- "-68.1|-108.7|概率触发连电",
- },
- imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_2.png" },
- },
- new HelpItem2Cfg
- {
- w = 300, h = 398, name = "暴击属性: ", nameX = -30, nameY = 185,
- des = new[]
- {
- "6.699997|89.29|暴击: 击毁目标, 有概率",
- "-18.6|61.7|触发多倍奖励暴击",
- "3.8|31.2|1级暴击: 20%概率触发2倍",
- "-69.16|7.1|奖励暴击",
- "-4.4|-21.84|2级暴击(大对子): 40%",
- "-17.1|-46.6|概率触发2~3倍奖励暴击",
- "-11.2|-78.6|3级暴击(大三元): 80%",
- "-23.7|-105.1|概率触发3~5倍奖励暴击",
- },
- imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_3.png" },
- },
- new HelpItem2Cfg
- {
- w = 300, h = 398, name = "加速属性: ", nameX = -30, nameY = 185,
- des = new[]
- {
- "6.699997|89.29|加速: 提升免费模式期间",
- "-22.89|61.7|发射子弹的速度",
- "-7.4|27.11|1级加速: 攻速提升20%",
- "-2.94|-3.8|2级加速(大对子): 攻速",
- "-72.68|-30.1|提升80%",
- "-6.68|-56.7|3级加速(大三元): 攻速",
- "-70.52|-80.08|提升300%",
- },
- imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_4.png" },
- },
+ //new HelpItem2Cfg
+ //{
+ // w = 310, h = 398, name = "免费模式玩法", nameX = -30, nameY = 185,
+ // fishNumber = 12025, // 图鉴:弹药箱
+ // des = new[]
+ // {
+ // "0|80|击毁“ ”, 可获得",
+ // "-10.2|55|8~12秒免费模式时间; ",
+ // "-7.8|1.9|击毁“ ”, 可获得",
+ // "-18.3825|-24.4|3组免费子弹, 共24~36",
+ // "-49.3|-50.9|秒免费模式时间; ",
+ // "-63.7|-78.2|免费模式期间: ",
+ // "-13.2|-104.56|1.发射速度比普通模式高1倍",
+ // "-47.7|-129|2.无法调整炮台倍数",
+ // },
+ // imgs = new[]
+ // {
+ // "-13|92|0.4|Assets/Bundles/PW/PW_Sprite/Handbook/tj_ts_jzx.png",
+ // "-22.2|13.3|0.4|Assets/Bundles/PW/PW_Sprite/Handbook/tj_flboss.png",
+ // },
+ //},
+ //new HelpItem2Cfg
+ //{
+ // w = 300, h = 398, name = "分裂属性: ", nameX = -30, nameY = 185,
+ // des = new[]
+ // {
+ // "6.7|89.29|分裂: 击中目标后, 有概率",
+ // "4.720001|61.7|分裂出多发子弹, 攻击附近",
+ // "-80.7|32.2|敌机",
+ // "-5.8|-2.92|1级分裂: 8%概率触发分裂",
+ // "-10.8|-32.13|2级分裂(大对子): 20%",
+ // "-62.8|-57.64|概率触发分裂",
+ // "-15.19|-83.6|3级分裂(大三元): 50%",
+ // "-68.1|-108.7|概率触发分裂",
+ // },
+ // imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_1.png" },
+ //},
+ //new HelpItem2Cfg
+ //{
+ // w = 300, h = 398, name = "连电属性: ", nameX = -30, nameY = 185,
+ // des = new[]
+ // {
+ // "6.7|89.29|连电: 击中目标后, 有概率",
+ // "4.720001|61.7|触发连电效果, 攻击屏幕内",
+ // "-80.7|32.2|敌机",
+ // "-5.8|-2.92|1级连电: 8%概率触发连电",
+ // "-10.8|-32.13|2级连电(大对子): 20%",
+ // "-62.8|-57.64|概率触发连电",
+ // "-15.19|-83.6|3级连电(大三元): 50%",
+ // "-68.1|-108.7|概率触发连电",
+ // },
+ // imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_2.png" },
+ //},
+ //new HelpItem2Cfg
+ //{
+ // w = 300, h = 398, name = "暴击属性: ", nameX = -30, nameY = 185,
+ // des = new[]
+ // {
+ // "6.699997|89.29|暴击: 击毁目标, 有概率",
+ // "-18.6|61.7|触发多倍奖励暴击",
+ // "3.8|31.2|1级暴击: 20%概率触发2倍",
+ // "-69.16|7.1|奖励暴击",
+ // "-4.4|-21.84|2级暴击(大对子): 40%",
+ // "-17.1|-46.6|概率触发2~3倍奖励暴击",
+ // "-11.2|-78.6|3级暴击(大三元): 80%",
+ // "-23.7|-105.1|概率触发3~5倍奖励暴击",
+ // },
+ // imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_3.png" },
+ //},
+ //new HelpItem2Cfg
+ //{
+ // w = 300, h = 398, name = "加速属性: ", nameX = -30, nameY = 185,
+ // des = new[]
+ // {
+ // "6.699997|89.29|加速: 提升免费模式期间",
+ // "-22.89|61.7|发射子弹的速度",
+ // "-7.4|27.11|1级加速: 攻速提升20%",
+ // "-2.94|-3.8|2级加速(大对子): 攻速",
+ // "-72.68|-30.1|提升80%",
+ // "-6.68|-56.7|3级加速(大三元): 攻速",
+ // "-70.52|-80.08|提升300%",
+ // },
+ // imgs = new[] { "93.53|187.5|0.6|Assets/Bundles/PW/PW_Sprite/FreeModel/PW_FreeItem_4.png" },
+ //},
};
// ==================== 免费模式框(原版 PW_Battery_FreeFrame_L/R) ====================