传奇中的拍卖系统不能只靠一段简单NPC脚本完成,完整实现需要NPC交互、物品与货币检测、数据记录、购买结算、手续费扣除和过期清理。不同引擎对自定义变量、数据库读写、全局变量支持差异较大,脚本命令需要根据实际引擎替换。下面脚本为通用结构演示,重点展示拍卖系统的逻辑流程。
一、拍卖系统基本结构
拍卖系统通常由三部分组成:
NPC交互脚本:负责上架、下架、购买、查看列表。
数据存储:记录物品名称、数量、价格、卖家、状态、手续费。
结算逻辑:处理金币或元宝扣除、物品转移、手续费计算、消息提示。
如果引擎支持自定义数据库或全局变量,拍卖数据可以写入数据表或全局变量文件。如果引擎只支持普通变量,则需要用文本文件或固定变量组保存拍卖信息。
二、拍卖NPC主菜单
拍卖NPC脚本通常放在Market_Def目录下,例如AuctionNPC.txt。主菜单用于显示功能入口。
[@main]
IF
ACT
SAY
拍卖行服务\
\
<我要上架/@sellitem>\
<查看拍卖/@viewlist>\
<我的拍卖/@myauction>\
<退出/@exit>
三、物品上架流程
上架时需要检测玩家背包是否有物品,并输入价格。部分引擎支持输入框,部分引擎需要固定价格或分页选择。
[@sellitem]
IF
CHECKITEM 屠龙 1
ACT
SAY
请输入出售价格。\
当前物品:屠龙\
\
<输入价格/@inputprice>\
<返回/@main>
ELSESAY
背包中没有可上架的物品。
如果引擎支持输入价格,可以在输入后进入确认环节。
[@inputprice]
IF
ACT
MOV N10 <INPUTSTR>
SAY
确认上架?\
物品:屠龙\
价格:< STR(N10) >金币\
手续费:10%\
\
<确认/@confirmSell>\
<取消/@main>
四、确认上架并写入数据
确认上架后,需要扣除物品,记录拍卖数据,并提示上架成功。
[@confirmSell]
IF
CHECKITEM 屠龙 1
ACT
TAKE 屠龙 1
MOV S10 屠龙
MOV N11 <STR(N10)>
MOV S11 <USERNAME>
MOV N12 0
SENDMSG 7 你的屠龙已上架,价格<STR(N11)>金币。
GOTO @main
ELSESAY
物品不存在,上架失败。
这里S10保存物品名称,N11保存价格,S11保存卖家名称,N12保存购买状态。实际项目中应使用拍卖编号,例如A1-A99记录物品,B1-B99记录价格,C1-C99记录卖家,D1-D99记录状态。
五、查看拍卖列表
查看拍卖列表时,需要遍历已上架物品,并显示价格、卖家和状态。
[@viewlist]
IF
ACT
SAY
当前拍卖列表:\
\
编号1:<STR(S10)> 价格<STR(N11)> 卖家<STR(S11)> 状态<STR(N12)>\
<购买编号1/@buy1>\
\
编号2:<STR(S20)> 价格<STR(N21)> 卖家<STR(S21)> 状态<STR(N22)>\
<购买编号2/@buy2>\
\
<返回/@main>
实际版本中不应把所有拍卖信息写在一个对话里,建议使用分页显示,例如每页显示5条,避免对话框过长。
六、购买与结算
购买时需要检测买家金币是否足够,扣除货币,转移物品,并给卖家结算。
[@buy1]
IF
EQUAL N12 0
LARGE GOLD <STR(N11)>
ACT
TAKE GOLD <STR(N11)>
GIVE <STR(S10)> 1
MOV N12 1
SENDMSG 7 你已成功购买<STR(S10)>。
SENDMSG 20 玩家<USERNAME>购买了<STR(S11)>上架的<STR(S10)>。
BREAK
ELSESAY
该物品已售出或价格不足。
如果拍卖系统需要收取手续费,可以在结算时计算。
七、手续费计算示例
假设手续费为10%,卖家获得90%。
[@settleSell1]
IF
EQUAL N12 1
ACT
MOV N30 <STR(N11)>
DIV N30 10
MOV N31 <STR(N30)>
DEC N11 <STR(N31)>
SENDMSG 20 卖家<STR(S11)>获得<STR(N11)>金币,手续费<STR(N30)>金币。
MOV N12 2
BREAK
这里N30用于计算10%手续费,N31保存手续费金额,卖家最终获得扣除手续费后的金币。不同引擎对DIV、DEC支持方式不同,需要按实际命令调整。
八、我的拍卖管理
玩家可以查看自己上架的物品,并选择下架或取消。
[@myauction]
IF
ACT
SAY
我的拍卖:\
\
<STR(S10)> 价格<STR(N11)> 状态<STR(N12)>\
<下架/@cancel1>\
\
<返回/@main>
[@cancel1]
IF
EQUAL S11 <USERNAME>
EQUAL N12 0
ACT
GIVE <STR(S10)> 1
MOV S10
MOV N11 0
MOV S11
MOV N12 0
SENDMSG 7 已下架并取回<STR(S10)>。
BREAK
ELSESAY
无法下架该物品。
下架时需要判断物品是否已被购买。如果已购买,不能直接返还物品,否则会造成重复发放。
九、数据清理与过期处理
拍卖系统需要定期清理已售出、已下架或过期的记录。可以在QManage或每日触发脚本中执行清理。
[@ClearAuction]
IF
EQUAL N12 2
ACT
MOV S10
MOV N11 0
MOV S11
MOV N12 0
BREAK
如果引擎支持定时器,可以每秒或每分钟检测一次拍卖状态。也可以使用每日任务标签,在固定时间清理过期拍卖。
十、脚本存放与生效
NPC脚本通常存放在Mir200EnvirMarket_Def目录下。修改后需要在M2控制台重载NPC或重启服务端。文件编码建议使用ANSI,避免中文乱码。
Merchant.txt中需要添加NPC配置,格式通常为:
脚本路径 地图编号 X坐标 Y坐标 NPC名称 外观 其他参数
脚本路径必须与实际文件名一致。如果路径错误,NPC无法触发对话。
十一、引擎适配注意
不同传奇引擎对拍卖系统的支持程度不同。部分引擎提供内置拍卖行插件,可以直接配置物品类型、手续费、展示界面和结算方式。这种情况下不需要完全手写脚本,只需在插件中开启拍卖功能并设置参数。
如果引擎没有内置拍卖系统,手写脚本时必须确认以下能力:
是否支持全局变量或自定义数据库;
是否支持字符串变量保存物品名称;
是否支持数字变量保存价格和状态;
是否支持跨玩家结算;
是否支持定时器或每日触发;
是否支持输入框或分页显示。
如果引擎不支持字符串变量,拍卖物品名称可以改用物品IDX或编号保存,再通过数据库查询还原名称。如果引擎不支持全局变量,可以使用文本文件记录拍卖数据,由脚本读取和写入。
十二、完整流程参考
玩家上架物品时,先检测背包物品,再扣除物品并记录价格、卖家和状态。其他玩家查看拍卖列表后,选择购买。系统检测买家货币是否足够,扣除货币并发放物品。随后计算手续费,向卖家结算金币。已售出或过期的拍卖记录由定时脚本清理。下架功能只允许卖家在物品未售出时取回物品。
拍卖系统的关键在于数据一致性。物品扣除、货币扣除、物品发放、卖家结算和手续费计算必须按顺序执行,避免玩家刷物品或刷金币。正式使用前,需要在测试环境中验证购买、下架、重复点击、货币不足、背包已满、服务器重启等情况,确认数据不会异常。
传奇拍卖系统NPC脚本完整演示上架下架购买手续费与数据管理
来源:
作者:
点击:

