传奇IP检测脚本:单IP限领待遇的实现思路与代码

来源: 作者: 点击:
想限制同一IP玩家重复领取游戏福利(如新手礼、登录奖励)?核心是通过脚本获取玩家IP并做校验。以下是基于传奇私人服务器主流M2引擎的实现方法,附具体脚本代码和逻辑说明。

一、核心逻辑拆解

要实现“单IP限领一次”,需完成3步:
1. 获取玩家当前IP:通过引擎函数提取登录IP(需区分“IP:端口”格式,只取纯IP)。
2. 校验IP是否已领取:读取存储的“已领IP列表”,判断当前IP是否存在。
3. 发放待遇并记录IP:若未领取过,发放奖励并将IP写入记录文件(防止重复)。

二、具体脚本实现(M2引擎适用)

以下以“新手村福利NPC”为例,编写限制单IP领取的脚本(可直接复制到私人服务器NPC配置中修改使用)。

步骤1:创建IP记录文件

在私人服务器服务器MirServer\Mir200\Envir目录下新建文本文件IPRecord.txt,用于存储已领取过待遇的IP(手动创建或脚本自动生成均可)。

步骤2:编写NPC对话脚本

打开传奇私人服务器NPC编辑器(如NpcMaker),找到福利NPC的对话选项,替换为以下代码:
[@Main]
#IF
#ACT
OPENMERCHANTBIG -- 打开NPC大窗口(可选)
#SAY
欢迎来到玛法大陆!我是福利使者~\ \
每个IP仅能领取一次新手礼包,请继续冒险吧!\ \
<领取新手礼包/@GetReward> <离开/@exit>

[@GetReward]
#IF
CHECKGOLD 0 -- 可选:检查是否有其他条件(如等级、金币)
#ACT
; 获取玩家IP(去除端口部分)
GetIP(@IP)
SplitStr(@IP, ":", 1, @PureIP) ; 分割IP和端口,只保留纯IP(如192.168.1.1)

; 检查IP是否已在记录文件中
LoadList IPRecord.txt @IPList ; 加载IP记录到列表@IPList
FindStr @IPList @PureIP @Found ; 查找当前IP是否存在

#IF
EQUAL @Found 1 ; 若存在(已领取过)
#SAY
抱歉,该IP已领取过新手礼包啦!\ \
<返回/@Main>

#ELSEACT ; 若不存在(首次领取)
; 发放奖励(示例:10万金币+随机传送卷)
GIVE 金币 100000
GIVE 随机传送卷 1
SendMsg 世界 "玩家[ %s ] 领取了新手礼包!" <玩家名称>
; 记录当前IP到文件
AddLine IPRecord.txt @PureIP ; 将纯IP写入记录文件
#SAY
恭喜!已为你发放新手礼包~\ \
<返回/@Main>


关键代码说明

• GetIP(@IP):引擎函数,获取玩家当前连接的IP(格式为“IP:端口”,如“192.168.1.1:7000”)。

• SplitStr(@IP, ":", 1, @PureIP):分割字符串,提取冒号前的纯IP地址(避免同一IP不同端口被误判)。

• LoadList/IPRecord.txt @IPList:加载IP记录文件到内存列表@IPList,用于快速查找。

• FindStr @IPList @PureIP @Found:在列表中查找当前IP,结果存入@Found(1=存在,0=不存在)。

• AddLine IPRecord.txt @PureIP:将新IP追加到记录文件,确保下次登录时能检测到。

三、注意事项

1. IP变动问题:玩家用路由器或代理时,IP可能动态变化,此脚本主要防“同一物理设备/宽带”重复领取,无法完全杜绝多设备切换IP的情况。
2. 文件锁冲突:若多人同时领取,可能出现文件写入冲突。轻量私人服务器影响不大;高并发场景建议改用数据库(如SQLite)存储IP。
3. 自定义调整:可根据需求修改奖励内容(GIVE指令)、检测条件(如增加等级限制CHECKLEVEL 1)或提示语。

这套脚本能满足大部分私人服务器的单IP限领需求,核心是通过IP记录文件做校验。实际部署时建议先测试,避免因路径或函数版本差异导致报错。