一、GOM拍卖行脚本核心逻辑:四大功能闭环
GOM引擎拍卖行脚本的核心是实现“玩家自主上架→实时竞价→系统判定成交→过期物品返还”的完整流程,依赖引擎专属的物品操作、变量存储与计时器命令。核心逻辑围绕三点:
1. 数据持久化:用INI文件存储拍卖信息(物品名、起拍价、当前价、卖家、剩余时间),避免服务器重启数据丢失;
2. 实时交互:通过“变量更新+聊天栏提示”实现竞价同步,确保所有玩家看到最新价格;
3. 自动判定:用计时器命令监控拍卖时长,到期自动完成“物品转移+金币结算”或“物品返还”。
开发前需确认GOM引擎版本(1108及以上支持完整计时器功能),并准备基础命令库:物品检测(CHECKITEM)、变量操作(VAR)、INI读写(SETINI/GETINI)、计时器(TIMER)。
二、开发前置:明确拍卖行核心规则
先定义基础规则避免开发逻辑混乱,以“支持武器/饰品拍卖,收取5%手续费”为例,核心规则如下:
- 可拍卖物品:非绑定的武器、饰品(排除药水、矿石等杂物);
- 上架要求:起拍价≥1000金币,拍卖时长可选1小时、2小时、4小时;
- 竞价规则:每次加价≥起拍价的10%,且必须为100金币的整数倍;
- 成交结算:买家金币扣除当前价,卖家获得当前价的95%(5%为手续费);
- 过期处理:无人竞价则物品返还卖家,系统发送提示。
三、全流程脚本开发:从NPC入口到成交结算
以“拍卖行NPC”为触发入口,分“物品上架”“竞价参与”“成交处理”“过期返还”四大模块开发,所有代码可直接导入GOM引擎脚本文件。
1. 模块1:NPC入口与功能选择界面
实现玩家与NPC对话,选择“我要卖”(上架)或“我要买”(竞价),核心是跳转对应子脚本。
// 拍卖行NPC主界面
[@AuctionNPC]
#SAY
欢迎使用GOM官方拍卖行!\ \
<我要卖东西(上架物品)/@GoSell>\ \
<我要买东西(参与竞价)/@GoBuy>\ \
<我的拍卖(查看我的物品)/@MyAuction>\ \
<退出/@Exit>
// 退出脚本
[@Exit]
#ACT
CLOSE
2. 模块2:物品上架子脚本(核心)
实现“物品检测→输入价格与时长→存储信息→扣取物品”全流程,关键是用INI文件记录拍卖数据,生成唯一拍卖ID。
// 上架物品入口
[@GoSell]
#SAY
请选择要拍卖的物品类型:\ \
<武器类(刀/剑/斧)/@SellWeapon>\ \
<饰品类(项链/戒指/手镯)/@SellJewelry>
// 武器类上架检测
[@SellWeapon]
#IF
// 检测背包是否有非绑定武器
CHECKITEM 刀 * 1 && CHECKITEMISBIND 刀 ==0
#ACT
// 提示玩家选择具体武器(以屠龙为例,可扩展其他武器)
GOTO @SelectWeapon
#ELSEIF
CHECKITEM 剑 * 1 && CHECKITEMISBIND 剑 ==0
#ACT
GOTO @SelectSword
#ELSE
#SAY
您背包中无符合要求的非绑定武器!
// 选择武器后输入起拍价
[@SelectWeapon]
#SAY
请输入物品起拍价(≥1000金币,100金币整数倍):\ \
<输入价格/@InputStartPrice>
// 输入起拍价处理(GOM输入命令)
[@InputStartPrice]
#ACT
// 调用GOM输入框,限制输入范围1000-1000000
INPUT 请输入起拍价(1000-1000000) 1000 1000000
// 将输入值存入临时变量
VAR HUMAN StartPrice = <$INPUTVALUE>
// 验证是否为100的整数倍
VAR HUMAN CheckPrice = <$HUMAN(StartPrice)%100>
#IF
CHECKVAR HUMAN CheckPrice ==0
#ACT
// 跳转选择拍卖时长
GOTO @SelectTime
#ELSE
#SAY
起拍价必须为100金币的整数倍,请重新输入!
GOTO @InputStartPrice
// 选择拍卖时长并完成上架
[@SelectTime]
#SAY
请选择拍卖时长:\ \
<1小时(快速拍卖)/@Time1>\ \
<2小时(常规拍卖)/@Time2>\ \
<4小时(高价拍卖)/@Time4>
// 1小时拍卖(3600秒)
[@Time1]
#ACT
// 生成唯一拍卖ID(用角色名+时间戳,避免重复)
VAR GLOBAL AuctionID = <$ROLE>_<$TIME>
// 存储拍卖信息到INI文件(路径为D:\MirServer\GOM\Auction.ini)
SETINI D:\MirServer\GOM\Auction.ini <$GLOBAL(AuctionID)> 物品名 屠龙
SETINI D:\MirServer\GOM\Auction.ini <$GLOBAL(AuctionID)> 卖家 <$ROLE>
SETINI D:\MirServer\GOM\Auction.ini <$GLOBAL(AuctionID)> 起拍价 <$HUMAN(StartPrice)>
SETINI D:\MirServer\GOM\Auction.ini <$GLOBAL(AuctionID)> 当前价 <$HUMAN(StartPrice)>
SETINI D:\MirServer\GOM\Auction.ini <$GLOBAL(AuctionID)> 剩余时间 3600
SETINI D:\MirServer\GOM\Auction.ini <$GLOBAL(AuctionID)> 状态 拍卖中
// 扣取玩家背包中的屠龙
TAKE 屠龙 1
// 启动计时器,每秒减少剩余时间
TIMER 1 @ReduceTime <$GLOBAL(AuctionID)> 1
// 全服提示新物品上架
SENDMSG 2 【拍卖行】玩家<$ROLE>上架“屠龙”,起拍价<$HUMAN(StartPrice)>金币!
#SAY
物品上架成功!拍卖ID:<$GLOBAL(AuctionID)>
可在“我的拍卖”中查看进度。
注:饰品类上架脚本(@SellJewelry)逻辑与武器类一致,仅需修改物品检测命令为“CHECKITEM 项链 * 1”等,可批量复制扩展。
3. 模块2:竞价参与子脚本(实时更新)
实现“查看拍卖列表→选择物品→输入加价→更新价格”,核心是读取INI文件数据,验证加价规则并同步全服。
// 竞价入口(查看所有拍卖物品)
[@GoBuy]
#ACT
// 读取INI文件中所有拍卖ID(GOM引擎用GETINISECTION命令)
VAR GLOBAL AuctionList = <$GETINISECTION(D:\MirServer\GOM\Auction.ini)>
#SAY
当前拍卖物品列表:\ \
// 循环显示所有“拍卖中”的物品(简化版,完整版需用循环命令)
物品1:<$GETINI(D:\MirServer\GOM\Auction.ini 拍卖ID1 物品名)>\ \
起拍价:<$GETINI(D:\MirServer\GOM\Auction.ini 拍卖ID1 起拍价)> 金币\ \
当前价:<$GETINI(D:\MirServer\GOM\Auction.ini 拍卖ID1 当前价)> 金币\ \
剩余时间:<$GETINI(D:\MirServer\GOM\Auction.ini 拍卖ID1 剩余时间)> 秒\ \
<参与竞价/@BidItem(拍卖ID1)>\ \
// 竞价处理(传入拍卖ID作为参数)
[@BidItem($1)]
#SAY
当前物品:<$GETINI(D:\MirServer\GOM\Auction.ini $1 物品名)>\ \
当前最高价:<$GETINI(D:\MirServer\GOM\Auction.ini $1 当前价)> 金币\ \
请输入您的出价(≥当前价+10%,100金币整数倍):\ \
<输入出价/@InputBid($1)>
// 输入出价验证
[@InputBid($1)]
#ACT
INPUT 请输入出价 <$CALC(<$GETINI(D:\MirServer\GOM\Auction.ini $1 当前价)>*1.1)> 10000000
VAR HUMAN BidPrice = <$INPUTVALUE>
// 验证出价≥当前价的110%
VAR HUMAN MinBid = <$CALC(<$GETINI(D:\MirServer\GOM\Auction.ini $1 当前价)>*1.1)>
// 验证出价为100整数倍且金币足够
#IF
CHECKVAR HUMAN BidPrice >= <$HUMAN(MinBid)>
&& CHECKVAR HUMAN BidPrice%100 ==0
&& CHECKGOLD >= <$HUMAN(BidPrice)>
#ACT
// 更新INI文件中的当前价和出价人
SETINI D:\MirServer\GOM\Auction.ini $1 当前价 <$HUMAN(BidPrice)>
SETINI D:\MirServer\GOM\Auction.ini $1 出价人 <$ROLE>
// 扣除买家金币(成交前暂存,未成交可返还)
GOLD -<$HUMAN(BidPrice)>
VAR HUMAN TempGold_<$ROLE> += <$HUMAN(BidPrice)>
// 全服提示竞价成功
SENDMSG 2 【拍卖行】玩家<$ROLE>出价<$HUMAN(BidPrice)>金币,竞拍“<$GETINI(D:\MirServer\GOM\Auction.ini $1 物品名)>”!
#SAY
出价成功!当前您为最高出价者。
#ELSE
#SAY
出价不符合规则(不足最低加价或金币不足),请重新输入!
4. 模块3:成交处理与手续费结算
当拍卖时长结束,由计时器触发成交逻辑,完成“物品转移+金币拆分+提示通知”,核心是区分“有人竞价”和“无人竞价”两种场景。
// 拍卖时长结束触发的成交脚本
[@AuctionEnd($1)]
#ACT
// 读取该拍卖ID的所有信息
VAR GLOBAL ItemName = <$GETINI(D:\MirServer\GOM\Auction.ini $1 物品名)>
VAR GLOBAL Seller = <$GETINI(D:\MirServer\GOM\Auction.ini $1 卖家)>
VAR GLOBAL Buyer = <$GETINI(D:\MirServer\GOM\Auction.ini $1 出价人)>
VAR GLOBAL FinalPrice = <$GETINI(D:\MirServer\GOM\Auction.ini $1 当前价)>
// 判断是否有买家(出价人非空)
#IF
CHECKVAR GLOBAL Buyer != ""
#ACT
// 1. 给买家发放物品
SENDITEM <$GLOBAL(Buyer)> <$GLOBAL(ItemName)> 1
// 2. 给卖家结算(扣除5%手续费)
VAR GLOBAL SellerGet = <$CALC(<$GLOBAL(FinalPrice)>*0.95)>
ADDGOLD <$GLOBAL(Seller)> <$GLOBAL(SellerGet)>
// 3. 系统收取手续费(5%)
VAR GLOBAL SystemFee = <$CALC(<$GLOBAL(FinalPrice)>*0.05)>
ADDGOLD 系统 <$GLOBAL(SystemFee)>
// 4. 给买卖双方发送提示
SENDMSG 2 【拍卖行】“<$GLOBAL(ItemName)>”拍卖成交!买家:<$GLOBAL(Buyer)>,成交价:<$GLOBAL(FinalPrice)>金币
SENDMSG 6 【拍卖行】您的物品“<$GLOBAL(ItemName)>”已成交,获得<$GLOBAL(SellerGet)>金币(扣除5%手续费) - 卖家<$GLOBAL(Seller)>
SENDMSG 6 【拍卖行】您竞拍的“<$GLOBAL(ItemName)>”已成交,物品已发放至背包 - 买家<$GLOBAL(Buyer)>
// 5. 更新拍卖状态为“已成交”
SETINI D:\MirServer\GOM\Auction.ini $1 状态 已成交
#ELSE
// 无人竞价,物品返还卖家
SENDITEM <$GLOBAL(Seller)> <$GLOBAL(ItemName)> 1
SENDMSG 6 【拍卖行】您的物品“<$GLOBAL(ItemName)>”无人竞价,已返还至背包 - 卖家<$GLOBAL(Seller)>
SETINI D:\MirServer\GOM\Auction.ini $1 状态 已返还
5. 模块4:计时器与过期返还(后台运行)
用GOM计时器每秒减少拍卖剩余时间,为0时触发成交脚本,核心是确保计时器稳定运行且不占用服务器资源。
// 减少剩余时间的计时器脚本(参数$1为拍卖ID)
[@ReduceTime($1)]
#ACT
// 读取当前剩余时间
VAR GLOBAL LeftTime = <$GETINI(D:\MirServer\GOM\Auction.ini $1 剩余时间)>
// 剩余时间-1
VAR GLOBAL NewLeftTime = <$CALC(<$GLOBAL(LeftTime)>-1)>
// 更新INI文件
SETINI D:\MirServer\GOM\Auction.ini $1 剩余时间 <$GLOBAL(NewLeftTime)>
// 判断是否到期
#IF
CHECKVAR GLOBAL NewLeftTime ==0
#ACT
// 关闭该计时器,触发成交脚本
CLOSETIMER 1
GOTO @AuctionEnd($1)
#ELSE
// 剩余10分钟时给卖家发送提示
#IF
CHECKVAR GLOBAL NewLeftTime ==600
#ACT
SENDMSG 6 【拍卖行】您的物品“<$GETINI(D:\MirServer\GOM\Auction.ini $1 物品名)>”剩余10分钟拍卖时间 - 卖家<$GETINI(D:\MirServer\GOM\Auction.ini $1 卖家)>
四、核心命令解读与GOM引擎特性
GOM拍卖行脚本依赖引擎专属命令,以下为高频命令的用法与注意事项:
命令
语法
作用
GOM特性
SETINI/GETINI
SETINI 路径 节点 键 值
读写INI文件存储拍卖数据
支持绝对路径,需确保引擎有文件读写权限
TIMER
TIMER 编号 子脚本 参数 间隔秒数
启动后台计时器,定期执行脚本
编号1-10可同时使用,间隔秒数≥1避免资源占用
SENDITEM
SENDITEM 角色名 物品名 数量
给指定角色发放物品
需角色在线,离线则物品存入临时背包
INPUT
INPUT 提示语 最小值 最大值
弹出输入框获取玩家输入价格
仅支持整数输入,需配合变量存储值
五、常见问题与解决方案(GOM专属)
- 问题1:上架物品后INI文件无数据 :检查SETINI命令的路径是否正确(GOM引擎默认路径为D:\MirServer\GOM),同时确认服务器文件夹有“写入”权限,右键文件夹→属性→安全→勾选“写入”。
- 问题2:计时器不减少剩余时间 :GOM引擎的TIMER命令“间隔秒数”参数在命令最后,需确认语法为“TIMER 1 @ReduceTime $1 1”(最后一个1为间隔1秒),顺序错误会导致计时器失效。
- 问题3:竞价后金币扣除但价格未更新 :排查INPUT命令的最小值是否设置正确,若最小值低于“当前价+10%”,会导致低价出价通过,需用VAR计算动态最小值(如MinBid = 当前价*1.1)。
- 问题4:成交后物品无法发放 :确认SENDITEM命令的角色名与游戏内一致(GOM区分大小写),若角色离线,需在脚本中添加“离线物品存储”逻辑,用INI记录离线物品,上线后自动发放。
- 问题5:服务器重启后拍卖数据丢失 :将INI文件路径改为引擎“Data”文件夹(D:\MirServer\GOM\Data),该文件夹默认随服务器备份,重启后数据不丢失。
六、功能扩展:提升拍卖行吸引力
基础功能实现后,可添加以下扩展功能贴合玩家需求:
- 1. 一口价功能:上架时增加“一口价”选项,买家可直接按一口价购买,脚本触发立即成交;
- 2. 竞价提醒:当有其他玩家出价超过自己时,给前出价人发送“您的出价已被超越”提示;
- 3. 物品筛选:在“我要买”界面按“武器等级”“饰品属性”筛选,比如只显示攻击≥50的武器;
- 4. 拍卖记录查询:添加“历史成交”子脚本,读取INI文件中“已成交”状态的记录,展示近期高价成交物品。
GOM引擎拍卖行脚本的核心是“用INI文件做数据支撑,用计时器做流程驱动”,开发时需重点关注数据一致性(避免重复拍卖ID)和玩家体验(清晰的提示与规则)。实际落地时可根据服务器经济体系调整手续费比例和起拍价门槛,确保拍卖行成为游戏内的核心交易场景。

