帮我写一个PK保护丹物品脚本,功能是使用后无法攻击其他角色,也无法被其他角色攻击,效果持续8小时
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-06-05 12:59:44 |
👁️ 阅读: 6
要创建一个具有PK保护功能的物品脚本,需要结合物品配置、条件判断和状态管理。以下是一个完整的实现方案,包含物品定义、使用效果和持续时间的控制。
### 一、物品表 (Item.xls) 配置
首先,在物品表中配置“PK保护丹”的基础属性:
| 参数名 | 值 | 说明 |
| :--- | :--- | :--- |
| **ID** | (例如 100001) | 物品唯一ID |
| **Name** | PK保护丹 | 物品名称 |
| **StdMode** | 2 | 分类:可使用物品 |
| **Shape** | 3 | 使用后扣除1个物品 |
| **CD** | 1000 | 使用冷却时间(毫秒) |
| **ConditionId** | (例如 1001) | 关联条件表ID,用于检查使用条件(如非战斗状态) |
| **Desc** | 使用后进入和平保护状态,8小时内无法攻击他人也无法被攻击。 | 物品描述 |
| **GetWayInfo** | 可通过活动或商城获得 | 获取途径说明 |
### 二、条件表 (Condition) 配置
配置一个使用条件,例如“非战斗状态”才能使用:
| ID | Condition | ConditionShow |
| :--- | :--- | :--- |
| 1001 | <$FIGHTSTATE> == 0 | 非战斗状态下可使用 |
### 三、服务器脚本逻辑
在 `QFunction-0.lua` 功能脚本中,处理物品使用效果、状态赋予和持续时间管理。
```lua
-- 物品使用触发
function ItemUse(actor, itemIdx, itemId)
-- 判断使用的物品是否为PK保护丹(假设物品ID为100001)
if itemId == 100001 then
-- 检查是否已处于保护状态,避免重复使用
local hasBuff = checkbuff(actor, 999) -- 假设自定义BUFF ID为999
if hasBuff then
sendmsg(actor, 6, "您已处于保护状态中")
return
end
-- 给玩家添加一个自定义BUFF,用于标记和保护效果
-- BUFF ID 999, 持续时间 8 小时(28800000 毫秒)
addbuff(actor, actor, 999, 28800000)
-- 设置一个自定义的保存型变量,记录保护状态的结束时间(用于断线重连等)
-- 使用游戏时间戳(秒)加上8小时(28800秒)
local endTime = gettime() + 28800
setint(actor, "PK_PROTECT_END", endTime)
-- 强制切换玩家的攻击模式为“和平模式”
changemode(actor, 1) -- 假设模式1为和平模式
-- 发送提示信息
sendmsg(actor, 6, "您已使用PK保护丹,进入8小时和平保护状态。")
-- 扣除物品(因为Item表Shape=3,默认扣1个,也可脚本控制)
-- takeitem(actor, itemId, 1)
return
end
end
-- 自定义BUFF(ID 999)的触发效果
-- 此BUFF需要先在Buff表中配置,类型为“无效果仅作为标记”,并在Buff触发脚本中实现攻击拦截
function Buff999_OnAdd(actor, caster, buffId, buffLv, buffTime)
-- BUFF添加时的逻辑,例如更新客户端状态显示
sendmsg(actor, 6, "和平保护状态生效。")
end
function Buff999_OnRemove(actor, buffId)
-- BUFF移除时的逻辑
sendmsg(actor, 6, "和平保护状态已结束。")
-- 清除自定义变量
setint(actor, "PK_PROTECT_END", 0)
end
-- 在攻击判断触发器中拦截攻击行为
function AttackCheck(attacker, defender, skillId)
-- 检查攻击者是否处于保护状态
if checkbuff(attacker, 999) then
sendmsg(attacker, 6, "保护状态下无法攻击他人。")
return 0 -- 返回0阻止攻击
end
-- 检查被攻击者是否处于保护状态
if checkbuff(defender, 999) then
sendmsg(attacker, 6, "对方处于保护状态,无法被攻击。")
return 0 -- 返回0阻止攻击
end
return 1 -- 允许攻击
end
-- 玩家登录时检查保护状态是否过期(通过自定义变量)
function Login(actor)
local endTime = getint(actor, "PK_PROTECT_END")
local now = gettime()
if endTime > now then
-- 保护状态未过期,重新添加BUFF
local remainTime = endTime - now
addbuff(actor, actor, 999, remainTime * 1000) -- 转为毫秒
changemode(actor, 1)
sendmsg(actor, 6, string.format("您的和平保护状态剩余%.1f小时。", remainTime/3600))
else
-- 保护状态已过期,清理变量
setint(actor, "PK_PROTECT_END", 0)
end
end
```
### 四、Buff表 (Buff.xls) 配置
需要配置一个作为状态标记的BUFF(ID 999),其关键属性如下:
| 参数名 | 值 | 说明 |
| :--- | :--- | :--- |
| **ID** | 999 | BUFF唯一ID |
| **Name** | 和平守护 | BUFF名称 |
| **EffectType** | 0 | 效果类型(例如0为无效果) |
| **ClientShow** | 1 | 客户端显示 |
| **Icon** | (图标ID) | 状态栏图标 |
| **Tip** | 处于和平保护状态,无法进行PK。 | 提示信息 |
| **Script** | Buff999 | 关联的脚本函数前缀 |
### 五、攻击模式表 (PVPMode) 配置
确保“和平模式”(例如ID 1)的配置中,其“敌对关系比较”(`AttactCompID`)和“友善关系比较”(`CompareCompMode`)确保玩家对玩家不可攻击。
### 使用流程总结
1. **物品使用**:玩家使用“PK保护丹”物品。
2. **条件检查**:脚本检查玩家是否处于非战斗状态(通过条件表)。
3. **状态赋予**:为玩家添加一个持续8小时的标记性BUFF,并设置自定义变量记录结束时间。
4. **模式切换**:强制将玩家攻击模式切换为“和平模式”。
5. **攻击拦截**:在攻击判定环节(`AttackCheck`),检查攻击双方是否带有保护BUFF,若有则阻止攻击行为。
6. **状态恢复**:BUFF到期后自动移除,玩家恢复正常PK规则。玩家下线再上线时,通过自定义变量恢复剩余的保护时间。
此方案通过物品触发、BUFF标记、攻击判定拦截和自定义变量持久化,完整实现了持续8小时的PK保护功能。
← 返回问答库