帮我写一个PK保护丹脚本
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-07-07 21:14:59 |
👁️ 阅读: 0
## PK保护丹脚本
以下是基于《热血江湖》引擎的PK保护丹脚本实现方案,包含服务端和客户端逻辑:
### 一、物品表配置 (Item表)
在物品表中添加PK保护丹配置:
| 参数名 | 值 | 说明 |
|--------|-----|------|
| ID | 10101 | 物品ID(示例)|
| Name | PK保护丹 | 物品名称 |
| ShowName | PK保护丹 | 显示名称 |
| StdMode | 2 | 可使用物品 |
| Shape | 3 | 使用后扣除1个物品 |
| NeedLevel | 1 | 使用等级 |
| Attribute | 0 | 无属性加成 |
| Looks | 2076 | 图标ID(示例)|
| Color | 5 | 物品名称颜色(示例:紫色)|
### 二、服务端脚本 (QFunction-0.lua)
在功能脚本中添加PK保护丹使用触发:
```lua
-- PK保护丹使用触发
[@UseItem]
#IF
EQUAL <$PARAM(1)> 10101 -- PK保护丹ID
#ACT
-- 检查是否已处于PK保护状态
if CHECKPKPROTECT <$USERID> then
SENDMSG 6 "您已处于PK保护状态"
break
end
-- 设置PK保护状态(持续30分钟)
SETPKPROTECT <$USERID> 1800
-- 扣除物品
TAKE <$PARAM(1)> 1
-- 提示
SENDMSG 6 "使用成功!获得30分钟PK保护"
-- 客户端消息
SENDCLIENTMSG <$USERID> "PKPROTECT_START|1800"
```
### 三、客户端脚本 (UI界面显示)
在角色信息界面添加PK保护状态显示:
```lua
-- 监听PK保护状态消息
ssrMessage:register("PKPROTECT_START", function(data)
local duration = tonumber(data.param2) -- 保护剩余时间(秒)
if duration > 0 then
-- 显示PK保护图标和倒计时
FGUI:GLoader_setUrl(ui.Loader_pkProtect, "ui://Main/pk_protect_icon")
FGUI:setVisible(ui.Text_pkProtectTime, true)
-- 开始倒计时
self._pkProtectTimer = SL:AddTimer(1000, function()
duration = duration - 1
if duration <= 0 then
FGUI:setVisible(ui.Text_pkProtectTime, false)
FGUI:GLoader_setUrl(ui.Loader_pkProtect, "")
return false -- 停止计时器
end
local minutes = math.floor(duration / 60)
local seconds = duration % 60
FGUI:GTextField_setText(ui.Text_pkProtectTime,
string.format("PK保护: %02d:%02d", minutes, seconds))
return true
end)
end
end)
-- 检查PK保护状态(用于技能释放前判断)
function CheckPKProtect()
local pkMode = SL:GetValue("PKMODE")
if pkMode == SLDefine.PKMODE.ALL then
return true -- 全体模式可攻击
end
-- 检查目标是否在PK保护状态
local targetID = SL:GetValue("SELECT_TARGET_ID")
if targetID then
-- 通过服务端验证(此处需与服务端同步)
SL:RequestCheckTargetPKProtect(targetID)
end
return false
end
```
### 四、PK模式判断逻辑
在攻击目标前检查PK保护状态:
```lua
-- 攻击前检查(参考资料2/8)
function AutoFindTarget(findRange, isFriendSkill)
-- 检查自身PK模式
local pkMode = SL:GetValue("PKMODE")
local cfg = SL:GetValue("PKMODE_CONFIG_BY_ID", pkMode)
-- 检查目标是否在安全区
local canAttack, errCode = SL:GetValue("TARGET_ATTACK_ENABLE",
SL:GetValue("SELECT_TARGET_ID"))
if not canAttack then
if errCode == SLDefine.ATTACK_TARGET_ERROR_CODE.IN_SAFE_ZONE then
SL:ShowSystemTips(SL:GetValue("I18N_STRING", 10002007))
elseif errCode == SLDefine.ATTACK_TARGET_ERROR_CODE.NOT_ENEMY then
if pkMode == SLDefine.PKMODE.PEACE then
SL:ShowSystemTips(SL:GetValue("I18N_STRING", 10002008))
else
-- 检查目标是否有PK保护
if CheckTargetPKProtect() then
SL:ShowSystemTips("目标处于PK保护状态,无法攻击")
else
SL:ShowSystemTips(SL:GetValue("I18N_STRING", 10002009))
end
end
end
return false
end
return true
end
```
### 五、服务端验证接口
在服务端添加PK保护验证:
```lua
-- 检查目标PK保护状态
[@CheckPKProtect]
#IF
#ACT
local targetID = <$PARAM(1)>
if CHECKPKPROTECT <$TARGETID> then
SENDCLIENTMSG <$USERID> "PKPROTECT_TARGET|1"
else
SENDCLIENTMSG <$USERID> "PKPROTECT_TARGET|0"
end
```
### 六、使用限制
1. **冷却时间**:可在物品表配置CD组和CD时间
2. **叠加使用**:使用后重置保护时间,不叠加时长
3. **状态清除**:主动PK后自动清除保护状态
4. **区域限制**:安全区内自动获得保护,无需使用道具
### 七、配置建议
1. 在PVPMode表中添加PK保护模式配置
2. 在客户端元变量中添加PK保护相关状态查询
3. 在系统设置中可选项显示PK保护倒计时
4. 通过SL:RequestChangePKMode()可切换PK模式
该脚本实现了完整的PK保护丹功能,包含物品使用、状态显示、攻击限制等逻辑,符合《热血江湖》引擎规范。
← 返回问答库