查看: 5|回复: 0

传奇单机版商城积分兑换脚本怎么写?积分入库+NPC兑换+防重复领,三块代码搞定

74

主题

40

回帖

390

积分

二百VIP

积分
390
发表于 2 小时前 | 显示全部楼层 |阅读模式
二百论坛
本站支持代销互换开区传奇版本、欢迎广大GM、技术、一条龙等传奇业界好友合作、联系业务QQ:1531850810

QQ交流群①:323634742(推荐 )QQ交流群②:764544814(推荐)

本站提供的传奇版本 由于来源不同 精力有限 无法100%测试 如需使用本传奇版本请切记

下载传奇版本后 先解压 再杀毒 更新官方引擎 最后再配置登陆器 避免被非法木马插件利用


论坛里问积分商城怎么做的帖子不少,但大部分回答就一句话:用变量存积分,用GIVE发物品。

这两件事单独拎出来都会,合在一起写成一套完整系统,能跑、能防重领、能多人用,就不是一句话能说清楚的了。

我自己用过三种方案,最后留下来的是这套。把核心代码贴出来,逐段解释,你照着改应该能直接用。

---

整体思路:积分商城分三个模块

模块一:积分入库——玩家通过击杀怪物/完成任务获得积分
模块二:查询当前积分——NPC展示余额
模块三:积分兑换——玩家消费积分,NPC发放物品

三个模块共用一个变量前缀,这样多个NPC之间不会互相干扰。

---

模块一:怪物死亡时增加积分(MobScript)

在怪物对应的 MobScript 文件里(通常是 Envir/Script/Monsters/怪物名.txt)加入死亡事件:
  1. [@MonsterDead]
  2. { 击杀后给杀手增加积分 }
  3. #ACT
  4. ADDVAR @SCORE 10
  5. SENDMSG 杀手 $你获得了10积分,当前积分:@SCORE
复制代码

几个注意点:

第一,ADDVAR 是累加,不是赋值,不会覆盖已有积分。
第二,@SCORE 这个变量是角色维度的,每个玩家独立存储,不会串。
第三,如果你的服务器有多种怪,不同怪给不同积分,就在不同怪的 MobScript 里写不同数值,比如精英怪 ADDVAR @SCORE 50,BOSS ADDVAR @SCORE 200。

---

模块二:积分查询 NPC(QFunction)

在商城 NPC 的脚本里写:
  1. [@main]
  2. #SAY 欢迎来到积分商城!
  3. #SAY 你当前的积分是:@SCORE
  4. #SAY [
    ]
  5. #SAY [查看商品列表]<@shop_list>
  6. #SAY [兑换装备]<@exchange>
  7. #SAY [离开]<@exit>
  8. [@shop_list]
  9. #SAY 当前可兑换商品:
  10. #SAY 1. 传说战士甲 - 500积分
  11. #SAY 2. 传说法师袍 - 500积分
  12. #SAY 3. 传说道士衣 - 500积分
  13. #SAY 4. 元宝x100 - 100积分
  14. #SAY [
    ]
  15. #SAY [去兑换]<@exchange>
  16. #SAY [返回]<@main>
  17. [@exit]
  18. #SAY 欢迎下次光临!
复制代码

这里有个细节:@SCORE 直接在 #SAY 里输出,翎风引擎会自动把变量值替换进去,不需要额外操作。

---

模块三:兑换逻辑(带积分扣除和防重复领)

以兑换"传说战士甲"为例:
  1. [@exchange]
  2. #SAY 你想兑换什么?
  3. #SAY [传说战士甲(500积分)]<@item_warrior>
  4. #SAY [传说法师袍(500积分)]<@item_wizard>
  5. #SAY [元宝x100(100积分)]<@item_yuanbao>
  6. #SAY [返回]<@main>
  7. [@item_warrior]
  8. { 检查积分是否足够 }
  9. #IF @SCORE >= 500
  10.   #ACT
  11.   DECVAR @SCORE 500
  12.   GIVE 传说战士甲 1
  13.   SENDMSG 杀手 $兑换成功!传说战士甲已发放,剩余积分:@SCORE
  14.   GOTO @exchange_done
  15. #ELSE
  16.   #SAY 积分不足!需要500积分,当前只有@SCORE积分。
复制代码
  1. [@exchange_done]
  2. #SAY 兑换成功!继续逛逛?
  3. #SAY [继续兑换]<@exchange>
  4. #SAY [离开]<@exit>
复制代码

DECVAR 是减法,对应 ADDVAR 的加法。扣完之后用 GIVE 发物品,顺序不能反——先扣后给,避免给完物品但扣分失败的情况。

---

进阶:防止同一个物品重复兑换(限购逻辑)

如果想限制某件装备每个角色只能兑换一次:
  1. [@item_warrior]
  2. { 先检查是否已兑换过 }
  3. #IF @GOT_WARRIOR == 1
  4.   #SAY 这件装备你已经兑换过了,每人限购一次。
  5.   GOTO @exchange
  6. #ENDIF
  7. #IF @SCORE >= 500
  8.   #ACT
  9.   DECVAR @SCORE 500
  10.   SETVAR @GOT_WARRIOR 1
  11.   GIVE 传说战士甲 1
  12.   SENDMSG 杀手 $兑换成功!传说战士甲已发放
  13. #ELSE
  14.   #SAY 积分不足!
复制代码

SETVAR @GOT_WARRIOR 1 相当于在角色身上打一个标记,下次再来兑换时检测到这个变量已经是1,就拒绝重复发放。这个变量是永久存储在角色数据里的,重登也不会丢失。

---

五个常见踩坑

坑1:DECVAR 扣完变成负数
翎风引擎的变量可以是负数。如果玩家积分是 300,你写 DECVAR @SCORE 500,积分会变成 -200,而不是报错。
修复:在 DECVAR 前一定要用 #IF @SCORE >= 数值 做判断。

坑2:物品名称有空格
GIVE 命令里的物品名称如果有空格(比如"传说 战士甲"),要加引号:GIVE "传说 战士甲" 1,否则引擎只识别到空格前面的部分,发的是个不存在的物品。

坑3:变量名前缀冲突
如果你的服务器有其他脚本也用了 @SCORE 这个名字,两个系统的积分会互相干扰。命名时建议加功能前缀,比如 @SHOP_SCORE、@KILL_SCORE,区分不同系统的积分来源。

坑4:GOTO 目标不存在
#IF...#ELSE 里用了 GOTO @exchange_done,但如果没有定义 [@exchange_done] 这个标签,脚本直接中断,NPC 没反应。写完脚本先把所有 GOTO 的目标标签检查一遍。

坑5:多套积分来源叠加异常
如果任务脚本、怪物脚本、签到脚本都往 @SCORE 里 ADDVAR,初期测试没问题,后期玩家积分会超出你的预期。建议在 M2Server.log 里偶尔检查一下积分异常的角色数据。

---

这套积分商城框架已经能覆盖基础需求了:击杀积分、查询余额、兑换物品、限购标记。扩展方向可以加每日签到积分(@SIGN_DATE 配合日期变量判断)、排行榜展示(读变量排序输出)。

有问题贴代码,一起看。
二百论坛
免责声明:

1、本论坛资源均来源于网络

2、如下载使用,自行杀毒

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ| 手机版|小黑屋|二百版本库 |网站地图

免责声明:本站所有资源皆来自于互联网.请在下载使用内24小时内删除! 如果侵犯了您的权益,请至邮箱: (1531850810@qq.com), 我们会及时删除侵权内容。

Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5

关于我们 | 联系方式 | 隐私政策