From 576eb6abf77bf811507b4af5124e29faad56923c Mon Sep 17 00:00:00 2001 From: "COMPUTER\\EDY" <249929363@qq.com> Date: Fri, 3 Jul 2026 17:47:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8A=BD=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/Script/Avatar.ts | 4 +- assets/Script/module/Config/GameConfig.ts | 2 + assets/Script/module/Pay/Utils.ts | 12 ++- assets/gacha_bundle/script/GachaManager.ts | 35 +++++--- server/laf-cloud/functions/drawHead.ts | 11 ++- server/laf-cloud/functions/userLevel.ts | 96 +++++++++++----------- 6 files changed, 93 insertions(+), 67 deletions(-) diff --git a/assets/Script/Avatar.ts b/assets/Script/Avatar.ts index 5f70f51..a06bfc7 100644 --- a/assets/Script/Avatar.ts +++ b/assets/Script/Avatar.ts @@ -48,7 +48,8 @@ export default class Avatar extends cc.Component { if (data) { this.avatarData = cc.fx.GameTool.getAvatarData(data.headArr); } - this.film = data.film; + this.film = Number(data.film) || 0; + cc.fx.GameConfig.GM_INFO.film = this.film; // console.log("头像信息", this.avatarData); this.avatar = cc.fx.GameConfig.GM_INFO.useravatarIcon; this.avatarKuang = cc.fx.GameConfig.GM_INFO.useravaterkuang; @@ -314,7 +315,6 @@ export default class Avatar extends cc.Component { if (this.avatar.length > 10) { this.content.children[0].getChildByName("select").active = true; } - break; } this.changeBtnState("avatar"); diff --git a/assets/Script/module/Config/GameConfig.ts b/assets/Script/module/Config/GameConfig.ts index a33a45a..260e199 100644 --- a/assets/Script/module/Config/GameConfig.ts +++ b/assets/Script/module/Config/GameConfig.ts @@ -90,6 +90,7 @@ export class GameConfig { guide: boolean; //是否有引导 url: string; //访问域名 coin: number; //用户金币 + film: number; //头像抽卡代币 success: boolean; //用户游戏成功与否 matchId: any; //用于埋点上传的ID gameState: boolean; custom: number; //用于测试跳关卡 @@ -281,6 +282,7 @@ export class GameConfig { guide: true, //是否有引导 url: "https://api.sparkus.cn",//访问域名 coin: 0, //用户金币 + film: 0, //头像抽卡代币(以服务端返回值为准) success: false, //用户游戏成功与否 matchId: null, //用于埋点上传的ID gameState: false, diff --git a/assets/Script/module/Pay/Utils.ts b/assets/Script/module/Pay/Utils.ts index 3be7d40..ad9923f 100644 --- a/assets/Script/module/Pay/Utils.ts +++ b/assets/Script/module/Pay/Utils.ts @@ -515,6 +515,9 @@ export default class Utils { Utils.POST("userLevel", setData, res => { //console.log("获得userLevel数据:", res); if (res.code === 1) { + if (res.data && res.data.film !== undefined) { + cc.fx.GameConfig.GM_INFO.film = Number(res.data.film); + } //console.log("服务器:获得等级成功", res); if (callBack) callBack(res); } else { @@ -552,6 +555,9 @@ export default class Utils { Utils.POST("userLevel", setData, res => { //console.log("获得userLevel数据:", res); if (res.code === 1) { + if (res.data && res.data.film !== undefined) { + cc.fx.GameConfig.GM_INFO.film = Number(res.data.film); + } //console.log("服务器:上传等级成功", res); if (callBack) callBack(res); } else { @@ -1665,10 +1671,11 @@ export default class Utils { Utils.POST("drawHead", setData, res => { if (res.code === 1) { console.log("正常获取到抽卡结果", res); - if (callBack) callBack(res); } else { console.log("获取抽卡失败,失败原因", res); } + // 失败也必须回调,否则抽卡页的 Loading 和防重复点击状态无法恢复。 + if (callBack) callBack(res); }) } } @@ -1754,6 +1761,9 @@ export default class Utils { Utils.POST("getFilm", setData, res => { if (res.code === 1) { console.log("正常获取用户代币", res); + if (res.data && res.data.film !== undefined) { + cc.fx.GameConfig.GM_INFO.film = Number(res.data.film); + } if (callBack) callBack(res); } else { console.log("获取代币失败,失败原因", res); diff --git a/assets/gacha_bundle/script/GachaManager.ts b/assets/gacha_bundle/script/GachaManager.ts index 5e7ca7e..300dd51 100644 --- a/assets/gacha_bundle/script/GachaManager.ts +++ b/assets/gacha_bundle/script/GachaManager.ts @@ -19,17 +19,25 @@ export default class GachaManager extends cc.Component { avatarData: any = null; own = 0; reward = 0; + film = 0; + isDrawing = false; onLoad() { this.avatarData = []; this.own = 0; this.reward = 0; + this.film = 0; + this.isDrawing = false; // this.init(); } //初始化数据 init(data, film) { this.avatarData = []; this.own = 0; + const parsedFilm = Number(film); + this.film = isNaN(parsedFilm) ? 0 : parsedFilm; + // 界面显示和抽卡判断必须使用同一份代币数据。 + cc.fx.GameConfig.GM_INFO.film = this.film; console.log("222222初始化数据", data); if (data) { this.avatarData = data; @@ -54,17 +62,17 @@ export default class GachaManager extends cc.Component { let cost = this.getCostFilm(); botoom.getChildByName("total").getComponent(cc.Label).string = cost.toString(); console.log("抽卡所需film", cost); - if (film >= cost) { + if (this.film >= cost) { botoom.getChildByName("yes").active = true; console.log("有足够film"); - botoom.getChildByName("yes").getComponent(cc.Label).string = film.toString(); + botoom.getChildByName("yes").getComponent(cc.Label).string = this.film.toString(); } else { console.log("没有足够film"); botoom.getChildByName("no").active = true; - botoom.getChildByName("no").getComponent(cc.Label).string = film.toString(); + botoom.getChildByName("no").getComponent(cc.Label).string = this.film.toString(); } - console.log("拥有film", film); + console.log("拥有film", this.film); } } @@ -73,6 +81,7 @@ export default class GachaManager extends cc.Component { if (this.own > film.length) this.own = film.length - 1; let count = film[this.own]; + console.log("抽卡所需film", count); return count; } @@ -88,21 +97,25 @@ export default class GachaManager extends cc.Component { } playGacha() { + if (this.isDrawing) { + return; + } if (this.own >= 8) { MiniGameSdk.API.showToast("已拥有当期所有头像"); return; } else { let cost = this.getCostFilm(); - if (cc.fx.GameConfig.GM_INFO.film < cost) { - MiniGameSdk.API.showToast("代币不足,闯关获取更多代币!"); - return; - } + console.log("抽卡所需film", cost, "当前页面film", this.film); } + // 余额和拥有头像最终以服务端为准,避免本地缓存过期误拦截。 + this.isDrawing = true; this.openLoad(); Utils.getGacha‌(res => { console.log("抽卡结果", res); + this.isDrawing = false; + this.closeLoad(); if (res.code == 1) { console.log("抽卡成功"); @@ -121,7 +134,10 @@ export default class GachaManager extends cc.Component { }); } else if (res.code == 0) { - MiniGameSdk.API.showToast(res.msg); + if (res.data && res.data.film !== undefined) { + this.init(this.avatarData, res.data.film); + } + MiniGameSdk.API.showToast(res.msg || "代币不足,闯关获取更多代币!"); cc.fx.GameTool.shushu_Track("avatar_gacha", { pool_id: "spring", pull_count: (this.own + 1), @@ -142,7 +158,6 @@ export default class GachaManager extends cc.Component { result: "", }); } - this.closeLoad(); }); // let cost = this.getCostFilm(); // if (cc.fx.GameConfig.GM_INFO.film >= cost) { diff --git a/server/laf-cloud/functions/drawHead.ts b/server/laf-cloud/functions/drawHead.ts index d56483e..0a8943c 100644 --- a/server/laf-cloud/functions/drawHead.ts +++ b/server/laf-cloud/functions/drawHead.ts @@ -68,12 +68,12 @@ export default async function (ctx: FunctionContext) { // 根据数量获取对应的消耗,数量超过7时取最后一个(120) let filmCost = filmConsumeTable[Math.min(count, 7)]; - // 执行消耗 - film -= filmCost; - - if (film < 0) { - return { code: 0, data: null, msg: "代币不足" } + film = Number(film) || 0; + if (film < filmCost) { + return { code: 0, data: { film: film, cost: filmCost }, msg: "代币不足,闯关获取更多代币!" } } + // 检查通过后再扣除,余额始终以服务端数据为准。 + film -= filmCost; let num = Math.floor(Math.random() * total); let list = []; @@ -109,4 +109,3 @@ export default async function (ctx: FunctionContext) { await db.collection(dbname).where({ _id: uid }).update({ headArr: headArr, film: film }); return { code: 1, data: { headArr: headArr, reward: list[num2], film: film }, msg: "成功" }; } - diff --git a/server/laf-cloud/functions/userLevel.ts b/server/laf-cloud/functions/userLevel.ts index d935f84..efb6185 100644 --- a/server/laf-cloud/functions/userLevel.ts +++ b/server/laf-cloud/functions/userLevel.ts @@ -8,32 +8,32 @@ export default async function (ctx: FunctionContext) { const uid = ctx.body.uid; let dbname = "users"; const gameName = ctx.body.gameName; - const isWuXian=ctx.body.isWuXian; + const isWuXian = ctx.body.isWuXian; let db1 = "691093093cf0c4532ba4fd9c"; if (gameName == "iaa") { dbname = "usersAd"; - db1 ="691097ac3cf0c4532ba4fd9e"; + db1 = "691097ac3cf0c4532ba4fd9e"; } if (!action) { return { code: 0, data: null, msg: "未获取到action" }; } - + if (!uid) { return { code: 0, data: null, msg: "未获取到uid" }; } let res1 = await db.collection(dbname).where({ _id: uid }).getOne(); const token = ctx.body.token; - if (res1.data&&res1.data.token) { - let istoken=Utils.checkToken(token,res1.data.token); + if (res1.data && res1.data.token) { + let istoken = Utils.checkToken(token, res1.data.token); if (!istoken) { return { code: 0, data: null, msg: "token校验失败" };; } } - let address=res1.data?.address; + let address = res1.data?.address; const ip = ctx.headers['x-forwarded-for'] || ctx.headers['x-real-ip'] || ''; let address1 = getProvinceByIP(ip); - if(!address||address=="其他"){ - address=address1; + if (!address || address == "其他") { + address = address1; } if (["香港", "澳门", "台湾省"].includes(address)) { address = "港澳台"; @@ -44,24 +44,24 @@ export default async function (ctx: FunctionContext) { if (!levelAmount) { return { code: 0, data: null, msg: "未获取到levelAmount" }; } - let oldlevelAmount = res1.data?.levelAmount ||0; - let oldAdd=res1.data?.addLevel||0; - let levelTJ=res1.data?.levelTJ||0; - let count=levelAmount-oldlevelAmount; - if(count>10||count<-10){ - count=1; + let oldlevelAmount = res1.data?.levelAmount || 0; + let oldAdd = res1.data?.addLevel || 0; + let levelTJ = res1.data?.levelTJ || 0; + let count = levelAmount - oldlevelAmount; + if (count > 10 || count < -10) { + count = 1; return; } - let add=oldAdd+count; - let isWhite=res1.data?.isWhite; - let careerAmount = res1.data?.careerAmount||0; - if(isWuXian=="true"){ - add +=1; + let add = oldAdd + count; + let isWhite = res1.data?.isWhite; + let careerAmount = res1.data?.careerAmount || 0; + if (isWuXian == "true") { + add += 1; //console.log("无线增加值:"+(add-oldAdd)); - }else{ + } else { //console.log("非无线增加值:"+(add-oldAdd)); } - add=Math.floor(add); + add = Math.floor(add); // if (uid =="686513c8a173b1b78d21f881"){ // console.error(add); // console.log(isWhite); @@ -69,30 +69,30 @@ export default async function (ctx: FunctionContext) { // console.log(isWhite==false); // console.error(levelAmount); // } - let rankNum=-1; - if(add>=5&&isWhite==false){ - rankNum=await rank(db1, uid, add, levelAmount, res1, address,levelTJ); - levelTJ=1; - careerAmount+=1; + let rankNum = -1; + if (add >= 5 && isWhite == false) { + rankNum = await rank(db1, uid, add, levelAmount, res1, address, levelTJ); + levelTJ = 1; + careerAmount += 1; } let film = res1.data.film; if (!film && film != 0) { film = res1.data.levelAmount; } film += count; - if (uid =="6866ac24a173b1b78d21f8c2"){ - console.log("通关:"+levelAmount); + if (uid == "6866ac24a173b1b78d21f8c2") { + console.log("通关:" + levelAmount); } // console.error(add); // console.log(oldAdd); // console.log(levelAmount); // console.log(oldlevelAmount); // console.error("----------------------------------"); - let ret = await db.collection(dbname).where({ _id: uid }).update({address:address,film:film, careerAmount:careerAmount,levelTJ:levelTJ, levelAmount: levelAmount,addLevel:add,timestamp:Date.now()}); - return { code: 1, data: {IP:ip,address:address,rank:rankNum,levelAmount: levelAmount,timestamp: Date.now() }, msg: "用户数据更新成功" } + let ret = await db.collection(dbname).where({ _id: uid }).update({ address: address, film: film, careerAmount: careerAmount, levelTJ: levelTJ, levelAmount: levelAmount, addLevel: add, timestamp: Date.now() }); + return { code: 1, data: { IP: ip, address: address, rank: rankNum, levelAmount: levelAmount, film: film, timestamp: Date.now() }, msg: "用户数据更新成功" } case 'read': return { - code: 1, data: { levelAmount: res1.data?.levelAmount||0, timestamp: res1.data?.timestamp||0 }, msg: "成功" + code: 1, data: { levelAmount: res1.data?.levelAmount || 0, film: res1.data?.film ?? res1.data?.levelAmount ?? 0, timestamp: res1.data?.timestamp || 0 }, msg: "成功" } default: return { @@ -109,9 +109,9 @@ function isSameDayUTC(timestamp1, timestamp2) { date1.getUTCMonth() === date2.getUTCMonth() && date1.getUTCDate() === date2.getUTCDate(); } -async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){ +async function rank(db1, uid, add, levelAmount, res1, address, levelTJ) { let rankInfo = await db.collection("sRank").where({ _id: db1 }).getOne(); - + let total = rankInfo.data.total; if (total != null) { total = JSON.parse(total); @@ -124,9 +124,9 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){ if (total["all"][i].id == uid) { isHave = true; total["all"][i].useravatar = res1.data?.useravatar, - total["all"][i].username=res1.data?.username, - total["all"][i].useravatarIcon=res1.data?.useravatarIcon, - total["all"][i].addLevel = add; + total["all"][i].username = res1.data?.username, + total["all"][i].useravatarIcon = res1.data?.useravatarIcon, + total["all"][i].addLevel = add; total["all"][i].time = Date.now(); break; } @@ -171,9 +171,9 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){ if (total[address][i].id == uid) { isHave = true; total[address][i].useravatar = res1.data?.useravatar, - total[address][i].username = res1.data?.username, - total[address][i].useravatarIcon = res1.data?.useravatarIcon, - total[address][i].addLevel = add; + total[address][i].username = res1.data?.username, + total[address][i].useravatarIcon = res1.data?.useravatarIcon, + total[address][i].addLevel = add; total[address][i].time = Date.now(); break; } @@ -212,19 +212,19 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){ if (total[address].length >= 10) { total[address] = total[address].slice(0, 10); } - if(!total["role"]){ - total["role"]={}; + if (!total["role"]) { + total["role"] = {}; } - if(levelTJ==0){ + if (levelTJ == 0) { if (!total["role"][address]) { total["role"][address] = 1; } else { total["role"][address] += 1; //console.log(address+"真实:"+total[address].length+"----"+total["role"][address]); - let length=total[address].length; - if(length<10){ - total["role"][address]=length; + let length = total[address].length; + if (length < 10) { + total["role"][address] = length; } //console.error(address + "真实:" + total[address].length + "----" + total["role"][address]) // const res3 = await db.collection("sRank").where({ name: address }).getOne(); @@ -237,10 +237,10 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){ } //console.log(address); let ret1 = await db.collection("sRank").where({ _id: db1 }).update({ total: JSON.stringify(total) }); - let rank=-1; + let rank = -1; for (let i = 0; i < total[address].length; i++) { if (total[address][i].id == uid) { - rank=i+1; + rank = i + 1; break; } } @@ -275,4 +275,4 @@ function getProvinceByIP(ip) { console.error('IP 解析失败:', error); return '其他'; } -} \ No newline at end of file +}