楼主: lazy_bone

[综合教程] elua脚本实现在线时长兑换积分和积分商场功能

[复制链接]

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-23 21:52:15 | 显示全部楼层
本帖最后由 kissinger 于 2023-3-23 22:23 编辑

你这个脚本有不少问题,其中
local curRecordTime = nil --上次兑换时的时间
local inGameSumTime = nil --玩家在游戏中的总时间
local canUseTime = nil --可兑换时间
local canUseToken = nil --可兑换积分数
这些定义到了脚本头部的local中了,意味着在脚本中,这些参数是全局的,如果有2个人同时进行操作,就会交叉改变这些参数的值,虽然概率很小,但是确实会出问题。
我帮你先找这些问题,记得把我购买的分数奖赏给我哈


第二个问题,这里调用GetCanChangeToken(player) 少了参数player
    player:GossipMenuAddItem(1, "兑换积分:可兑换积分-"..GetCanChangeToken(), 1, 200)

评分

参与人数 1金币 +100 收起 理由
清水师兄 + 100 优秀

查看全部评分

回复

使用道具 举报

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-23 23:33:55 | 显示全部楼层
第三个问题,这部分,对于积分直接用可兑换积分进行替换,如果有多次兑换,以及积分已经用过了,这就会用很小的积分覆盖旧的积分,兑换没有累加

            CharDBExecute(string.format("update characters_jf set jf_time = '%s',jf='%s' where guid = '%s';",inGameSumTime,canUseToken,player:GetGUIDLow()))
            player:SendBroadcastMessage(string.format("成功兑换%s个积分",canUseToken))   
            player:AddItem(coinEntry,canUseToken)            
回复

使用道具 举报

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-24 00:39:01 | 显示全部楼层
本帖最后由 kissinger 于 2023-3-24 00:53 编辑

我帮你修改好了,但是我没有上机测试,不能保证没有问题

  1. print (">> loading 兑换商人.lua, 修改by牛皮德来")
  2. local baseminus = 180 --在线时长180分钟兑换1个积分
  3. local basesec = baseminus * 60  --在线时间换成秒
  4. local coinEntry = 91000 --兑换币item_template entry
  5. local JiFenNPC = 65000
  6. local npc_vendor = 65100
  7. local PlayerJF = {}
  8. CharDBQuery([[
  9. create table IF NOT EXISTS `characters_jifen` (
  10. `guid` int(10) NOT NULL,
  11. `used_time` int(10) NOT NULL DEFAULT '0',
  12. `jifen` int(10) NOT NULL DEFAULT '0',
  13. PRIMARY KEY (`guid`)
  14. )
  15. COMMENT='version 4.0'
  16. COLLATE='utf8mb4_general_ci'
  17. ENGINE=InnoDB;
  18. ]])
  19. local function VendorOnGossipHello(event, player, object)
  20.         local pGUID = player:GetGUIDLow()
  21.         PlayerJF[pGUID] = PlayerJF[pGUID] or {}
  22.         PlayerJF[pGUID][AllTM] = player:GetTotalPlayedTime()   --获取总的时间
  23.         local days,hours = math.modf(PlayerJF[pGUID][AllTM]/86400)
  24.         local hours,mins = math.modf(hours*24)
  25.         local mins = math.modf(mins*60)
  26.         PlayerJF[pGUID][TotalTM] = days.."天"..hours.."时"..mins.."分"
  27.        
  28.         PlayerJF[pGUID][NowJF] = PlayerJF[pGUID][NowJF] or 0
  29.         PlayerJF[pGUID][CanTryTM] = PlayerJF[pGUID][AllTM]
  30.         local curRecordTime = CharDBQuery("SELECT * FROM characters_jifen WHERE guid="..player:GetGUIDLow()..";")
  31.         if curRecordTime then
  32.                 PlayerJF[pGUID][CanTryTM] = PlayerJF[pGUID][AllTM] - JFQuery:GetUInt32(1)
  33.                 PlayerJF[pGUID][NowJF] = curRecordTime:GetUInt32(2)
  34.         else
  35.                 CharDBExecute("insert into characters_jifen (guid,used_time,jifen) VALUES ("..player:GetGUIDLow()..",0,0);")
  36.         end
  37.         PlayerJF[pGUID][CanGetJF] = math.modf(PlayerJF[pGUID][CanTryTM] / basesec)
  38.         player:GossipClearMenu()
  39.         player:GossipMenuAddItem(1, "我的在线时长:"..PlayerJF[pGUID][TotalTM] ,1, 10)
  40.         player:GossipMenuAddItem(1, "积分账户余额"..PlayerJF[pGUID][NowJF] ,1, 100)
  41.         player:GossipMenuAddItem(1, "自动兑换积分:可兑换积分-"..PlayerJF[pGUID][CanGetJF], 1, 200)
  42.         player:GossipMenuAddItem(1, "兑换币账户", 1, 300)
  43.         player:GossipMenuAddItem(1, "兑换币商场", 1, 400)
  44.         player:GossipSendMenu(1, object)
  45. end
  46. local function VendorOnGossipSelect(event, player, object, sender, intid, code, menu_id)
  47.         local pGUID = player:GetGUIDLow()
  48.         if(intid == 200) then
  49.                 if (PlayerJF[pGUID][CanGetJF] > 0) then
  50.                         player:SendBroadcastMessage("成功兑换"..PlayerJF[pGUID][CanGetJF].."个积分")   
  51.                         PlayerJF[pGUID][NowJF] = PlayerJF[pGUID][NowJF] + PlayerJF[pGUID][CanGetJF]
  52.                         local CheckTM = PlayerJF[pGUID][AllTM] - (PlayerJF[pGUID][AllTM] % basesec)  --可兑换积分精确时间戳,用总时间去掉不能兑换的余数时间
  53.                         PlayerJF[pGUID][CanGetJF] = 0        --必须要,防止菜单不关闭情况下,快速点数据库反应不过来多加分数
  54.                         PlayerJF[pGUID][CanTryTM] = 0  --可写可不写,如果不关闭菜单直接操作其他菜单情况下,建议写入
  55.                         CharDBExecute(string.format("update characters_jifen set used_time = '%s',jifen='%s' where guid = '%s';",CheckTM,PlayerJF[pGUID][NowJF],player:GetGUIDLow()))
  56.                 else
  57.                         player:SendBroadcastMessage("没有足够的在线时间可兑换")
  58.                 end
  59.                 player:GossipSendMenu(1, object)
  60.         elseif (intid == 300) then  --这里改为积分换游戏币部分,其实游戏币可以在多个地方使用,所以这里最好不做什么,其他LUA用上述数据库直接进行积分兑换物品
  61.                 if PlayerJF[pGUID][NowJF] > 0 then
  62.                         player:AddItem(coinEntry,PlayerJF[pGUID][NowJF])
  63.                         PlayerJF[pGUID][NowJF] = 0
  64.                         CharDBExecute(string.format("update characters_jifen set jifen='0' where guid = '%s';" ,player:GetGUIDLow()))
  65.                         player:SendBroadcastMessage("积分已兑换为购物币")  
  66.                 else
  67.                         player:SendBroadcastMessage("积分已经全兑换为购物币了,你可以打开兑换币市场看看")                   
  68.                 end
  69.                 player:GossipSendMenu(1, object)
  70.         elseif(intid == 400)then
  71.                 player:SendBroadcastMessage("打开兑换币商场")
  72.                 player:SendListInventory(object,npc_vendor) --打开npc_vendor中对应的售卖列表
  73.                 player:GossipComplete()
  74.         else        --其他菜单只刷新不干活
  75.                 player:GossipSendMenu(1, object)
  76.         end
  77. end
  78. RegisterCreatureGossipEvent(JiFenNPC, 1, VendorOnGossipHello)
  79. RegisterCreatureGossipEvent(JiFenNPC, 2, VendorOnGossipSelect)
复制代码


点评

只能算是伪代码  发表于 2023-9-1 19:52
好多变量缺少,JFQuery是什么玩意,不能直接使用  发表于 2023-9-1 19:52
真神人也  发表于 2023-6-28 15:05
回复

使用道具 举报

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-24 01:01:14 | 显示全部楼层
后期我准备用这个开启积分制度,可以用牌子,G等换积分,牌子和G换积分用动态模式,比如默认设置个100G对应20个牌子,也就是5:1,然后累加兑换总数,如果G和牌子的兑换币变大,说明大家喜欢用G兑换,那么在5倍基础上,自动乘以比例放大G的兑换要求。这样自动动态完成兑换比例。然后这个积分可以用在购买各种强化的东西了。时间,G和牌子通用兑换
回复

使用道具 举报

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-24 01:05:53 | 显示全部楼层
另外我帮你优化了在线时间计算,用玩家独立的用户数组存入内存数据,避免了多用户交叉篡改参数,加快菜单响应速度避免bug等。也方便以后加入更多功能时候可以互相兼容和快速调用
回复

使用道具 举报

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-24 01:11:03 | 显示全部楼层
还降低了对数据库的操作次数,降低系统负担。当然,内存可能稍微占用大一点。但是这个是值得的。
回复

使用道具 举报

669

时沙

0

精华

22

主题

声望: 1299   虚弱: 0

Lv.4(锻造者)

 楼主| 发表于 2023-3-24 16:21:54 | 显示全部楼层
kissinger 发表于 2023-3-24 01:11
还降低了对数据库的操作次数,降低系统负担。当然,内存可能稍微占用大一点。但是这个是值得的。 ...

牛逼啊,大佬,高手
[发帖际遇]: lazy_bone不小心把昂贵物品放入公会仓库,得到了1 声望. 幸运榜 / 衰神榜
回复

使用道具 举报

1278

时沙

3

精华

30

主题

声望: 8343   虚弱: 0

Lv.7(复仇者)

灵蛇献瑞(尚美制作)金兔迎春(尚美制作)吟游牧师炉石信仰战假死猎人今天也只能打恢复的增强萨潜行者积少成多时沙之瓶比格沃斯先生雷施无冕者伊利丹·怒风莉莉安·沃斯划水武僧搓水法爷黑色宝石猎豹

发表于 2023-3-24 19:12:24 | 显示全部楼层
lazy_bone 发表于 2023-3-24 16:21
牛逼啊,大佬,高手

新手,根据需求改变或者自己做了一些脚本,半年多经验,大家共勉之
回复

使用道具 举报

3545

时沙

0

精华

0

主题

声望: 24834   虚弱: 0

Lv.8(征服者)

灵蛇献瑞(尚美制作)祥龙贺岁(尚美制作)金兔迎春(尚美制作)脚男炉石无冕者伊利丹·怒风金鸡报晓积少成多时沙之瓶Doge祖国万岁!!信仰战假死猎人今天也只能打恢复的增强萨潜行者卖糖术神金鼠(ytfirefox制作) 犇向牛年(尚美制作)福虎贺岁(尚美制作)

发表于 2023-3-25 10:52:00 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

459

时沙

0

精华

9

主题

声望: 1769   虚弱: 0

Lv.5(无冕者)

灵蛇献瑞(尚美制作)

发表于 2023-6-14 03:26:50 | 显示全部楼层
感谢分享
[发帖际遇]: 老费经常偷加摩尔的钱,积攒41 金币. 幸运榜 / 衰神榜
回复

使用道具 举报

快速回复 返回顶部 返回列表