当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇GOM引擎拍卖行脚本开发上架竞价成交全流程代码

热度:
一、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)10001000000
//将输入值存入临时变量
VARHUMANStartPrice=<$INPUTVALUE>
//验证是否为100的整数倍
VARHUMANCheckPrice=<$HUMAN(StartPrice)%100>
#IF
CHECKVARHUMANCheckPrice==0
#ACT
//跳转选择拍卖时长
GOTO@SelectTime
#ELSE
#SAY
起拍价必须为100金币的整数倍,请重新输入!
GOTO@InputStartPrice

//选择拍卖时长并完成上架
[@SelectTime]
#SAY
请选择拍卖时长:\\
<1小时(快速拍卖)/@Time1>\\
<2小时(常规拍卖)/@Time2>\\
<4小时(高价拍卖)/@Time4>

//1小时拍卖(3600秒)
[@Time1]
#ACT
//生成唯一拍卖ID(用角色名+时间戳,避免重复)
VARGLOBALAuctionID=<$ROLE>_<$TIME>
//存储拍卖信息到INI文件(路径为D:\MirServer\GOM\Auction.ini)
SETINID:\MirServer\GOM\Auction.ini<$GLOBAL(AuctionID)>物品名屠龙
SETINID:\MirServer\GOM\Auction.ini<$GLOBAL(AuctionID)>卖家<$ROLE>
SETINID:\MirServer\GOM\Auction.ini<$GLOBAL(AuctionID)>起拍价<$HUMAN(StartPrice)>
SETINID:\MirServer\GOM\Auction.ini<$GLOBAL(AuctionID)>当前价<$HUMAN(StartPrice)>
SETINID:\MirServer\GOM\Auction.ini<$GLOBAL(AuctionID)>剩余时间3600
SETINID:\MirServer\GOM\Auction.ini<$GLOBAL(AuctionID)>状态拍卖中
//扣取玩家背包中的屠龙
TAKE屠龙1
//启动计时器,每秒减少剩余时间
TIMER1@ReduceTime<$GLOBAL(AuctionID)>1
//全服提示新物品上架
SENDMSG2【拍卖行】玩家<$ROLE>上架“屠龙”,起拍价<$HUMAN(StartPrice)>金币!
#SAY
物品上架成功!拍卖ID:<$GLOBAL(AuctionID)>
可在“我的拍卖”中查看进度。


注:饰品类上架脚本(@SellJewelry)逻辑与武器类一致,仅需修改物品检测命令为“CHECKITEM项链*1”等,可批量复制扩展。

3.模块2:竞价参与子脚本(实时更新)

实现“查看拍卖列表→选择物品→输入加价→更新价格”,核心是读取INI文件数据,验证加价规则并同步全服。

//竞价入口(查看所有拍卖物品)
[@GoBuy]
#ACT
//读取INI文件中所有拍卖ID(GOM引擎用GETINISECTION命令)
VARGLOBALAuctionList=<$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
VARHUMANBidPrice=<$INPUTVALUE>
//验证出价≥当前价的110%
VARHUMANMinBid=<$CALC(<$GETINI(D:\MirServer\GOM\Auction.ini$1当前价)>*1.1)>
//验证出价为100整数倍且金币足够
#IF
CHECKVARHUMANBidPrice>=<$HUMAN(MinBid)>
&&CHECKVARHUMANBidPrice%100==0
&&CHECKGOLD>=<$HUMAN(BidPrice)>
#ACT
//更新INI文件中的当前价和出价人
SETINID:\MirServer\GOM\Auction.ini$1当前价<$HUMAN(BidPrice)>
SETINID:\MirServer\GOM\Auction.ini$1出价人<$ROLE>
//扣除买家金币(成交前暂存,未成交可返还)
GOLD-<$HUMAN(BidPrice)>
VARHUMANTempGold_<$ROLE>+=<$HUMAN(BidPrice)>
//全服提示竞价成功
SENDMSG2【拍卖行】玩家<$ROLE>出价<$HUMAN(BidPrice)>金币,竞拍“<$GETINI(D:\MirServer\GOM\Auction.ini$1物品名)>”!
#SAY
出价成功!当前您为最高出价者。
#ELSE
#SAY
出价不符合规则(不足最低加价或金币不足),请重新输入!


4.模块3:成交处理与手续费结算

当拍卖时长结束,由计时器触发成交逻辑,完成“物品转移+金币拆分+提示通知”,核心是区分“有人竞价”和“无人竞价”两种场景。

//拍卖时长结束触发的成交脚本
[@AuctionEnd($1)]
#ACT
//读取该拍卖ID的所有信息
VARGLOBALItemName=<$GETINI(D:\MirServer\GOM\Auction.ini$1物品名)>
VARGLOBALSeller=<$GETINI(D:\MirServer\GOM\Auction.ini$1卖家)>
VARGLOBALBuyer=<$GETINI(D:\MirServer\GOM\Auction.ini$1出价人)>
VARGLOBALFinalPrice=<$GETINI(D:\MirServer\GOM\Auction.ini$1当前价)>
//判断是否有买家(出价人非空)
#IF
CHECKVARGLOBALBuyer!=""
#ACT
//1.给买家发放物品
SENDITEM<$GLOBAL(Buyer)><$GLOBAL(ItemName)>1
//2.给卖家结算(扣除5%手续费)
VARGLOBALSellerGet=<$CALC(<$GLOBAL(FinalPrice)>*0.95)>
ADDGOLD<$GLOBAL(Seller)><$GLOBAL(SellerGet)>
//3.系统收取手续费(5%)
VARGLOBALSystemFee=<$CALC(<$GLOBAL(FinalPrice)>*0.05)>
ADDGOLD系统<$GLOBAL(SystemFee)>
//4.给买卖双方发送提示
SENDMSG2【拍卖行】“<$GLOBAL(ItemName)>”拍卖成交!买家:<$GLOBAL(Buyer)>,成交价:<$GLOBAL(FinalPrice)>金币
SENDMSG6【拍卖行】您的物品“<$GLOBAL(ItemName)>”已成交,获得<$GLOBAL(SellerGet)>金币(扣除5%手续费)-卖家<$GLOBAL(Seller)>
SENDMSG6【拍卖行】您竞拍的“<$GLOBAL(ItemName)>”已成交,物品已发放至背包-买家<$GLOBAL(Buyer)>
//5.更新拍卖状态为“已成交”
SETINID:\MirServer\GOM\Auction.ini$1状态已成交
#ELSE
//无人竞价,物品返还卖家
SENDITEM<$GLOBAL(Seller)><$GLOBAL(ItemName)>1
SENDMSG6【拍卖行】您的物品“<$GLOBAL(ItemName)>”无人竞价,已返还至背包-卖家<$GLOBAL(Seller)>
SETINID:\MirServer\GOM\Auction.ini$1状态已返还


5.模块4:计时器与过期返还(后台运行)

用GOM计时器每秒减少拍卖剩余时间,为0时触发成交脚本,核心是确保计时器稳定运行且不占用服务器资源。

//减少剩余时间的计时器脚本(参数$1为拍卖ID)
[@ReduceTime($1)]
#ACT
//读取当前剩余时间
VARGLOBALLeftTime=<$GETINI(D:\MirServer\GOM\Auction.ini$1剩余时间)>
//剩余时间-1
VARGLOBALNewLeftTime=<$CALC(<$GLOBAL(LeftTime)>-1)>
//更新INI文件
SETINID:\MirServer\GOM\Auction.ini$1剩余时间<$GLOBAL(NewLeftTime)>
//判断是否到期
#IF
CHECKVARGLOBALNewLeftTime==0
#ACT
//关闭该计时器,触发成交脚本
CLOSETIMER1
GOTO@AuctionEnd($1)
#ELSE
//剩余10分钟时给卖家发送提示
#IF
CHECKVARGLOBALNewLeftTime==600
#ACT
SENDMSG6【拍卖行】您的物品“<$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命令“间隔秒数”参数在命令最后,需确认语法为“TIMER1@ReduceTime$11”(最后一个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)和玩家体验(清晰的提示与规则)。实际落地时可根据服务器经济体系调整手续费比例和起拍价门槛,确保拍卖行成为游戏内的核心交易场景。
[顶部]