写出完整攻沙脚本 要求首次合区晚上八点-九点开始攻沙
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-20 23:43:03 |
👁️ 阅读: 2
我是lua后端老师!
小仙,你要的完整攻沙脚本我来给你安排上!这个脚本会实现首次合区后,在晚上八点到九点之间开启攻城战的功能。我们主要用Lua脚本来控制,需要配合QF触发器和定时器。
```lua
-- 攻沙控制脚本 (castlewar.lua)
-- 首次合区攻沙控制
-- 作者:后端Lua尊者
-- 定义常量
local CASTLE_WAR_START_HOUR = 20 -- 攻沙开始小时 (20点)
local CASTLE_WAR_START_MINUTE = 0 -- 攻沙开始分钟
local CASTLE_WAR_DURATION = 60 -- 攻沙持续时间 (60分钟)
-- 全局变量记录合区状态
local is_first_merge = true -- 首次合区标志
local castle_war_started = false -- 攻沙是否已开始
-- 检查是否是首次合区并设置攻沙时间
function checkFirstMergeAndSetWar()
if is_first_merge then
-- 首次合区,设置晚上8点开始攻沙
local current_time = os.date("*t")
local target_time = os.time({
year = current_time.year,
month = current_time.month,
day = current_time.day,
hour = CASTLE_WAR_START_HOUR,
min = CASTLE_WAR_START_MINUTE,
sec = 0
})
-- 如果当前时间已经超过20点,就设置到明天20点
if os.time() >= target_time then
target_time = target_time + 24 * 60 * 60 -- 加一天
end
-- 计算距离目标时间的秒数
local delay_seconds = target_time - os.time()
-- 设置定时器,在指定时间开启攻沙
setontimerex("OPEN_CASTLE_WAR", delay_seconds * 1000) -- 转换为毫秒
release_print("首次合区攻沙已设置,将于" .. os.date("%Y-%m-%d %H:%M:%S", target_time) .. "开始")
is_first_merge = false -- 标记已处理过首次合区
end
end
-- 开启攻沙战
function openCastleWar()
-- 先把所有行会添加到攻城列表
addtocastlewarlistex("*")
-- 使用GM命令强制开启攻城战
gmexecute("0", "ForcedWallConQuestwar")
castle_war_started = true
release_print("攻城战已开启!开始时间:" .. os.date("%Y-%m-%d %H:%M:%S"))
-- 设置60分钟后关闭攻城战
setontimerex("CLOSE_CASTLE_WAR", CASTLE_WAR_DURATION * 60 * 1000)
-- 发送全服公告
sendmsgnew("0", "251", "0", "【系统公告】首次合区攻城战正式开始!沙巴克争夺战持续60分钟!")
end
-- 关闭攻沙战
function closeCastleWar()
if castle_war_started then
gmexecute("0", "ForcedWallConQuestwar")
castle_war_started = false
release_print("攻城战已结束!结束时间:" .. os.date("%Y-%m-%d %H:%M:%S"))
-- 发送全服公告
sendmsgnew("0", "251", "0", "【系统公告】首次合区攻城战已结束!")
-- 获取占领沙巴克的行会
local guild_name = castleinfo(2)
if guild_name and guild_name ~= "" then
sendmsgnew("0", "251", "0", "【系统公告】恭喜行会[" .. guild_name .. "]成功占领沙巴克!")
end
end
end
-- 获取攻沙状态信息
function getCastleWarInfo(actor)
local is_war = castleinfo(5) -- 是否在攻沙状态
local castle_guild = castleinfo(2) -- 沙城行会名称
local castle_leader = castleinfo(3) -- 沙城行会会长
local occupy_days = castleinfo(4) -- 占领天数
local identity = castleidentity(actor) -- 玩家沙巴克身份
local msg = "沙巴克信息:\n"
msg = msg .. "当前状态:" .. (is_war and "攻城战中" or "和平时期") .. "\n"
msg = msg .. "占领行会:" .. (castle_guild or "无") .. "\n"
msg = msg .. "行会会长:" .. (castle_leader or "无") .. "\n"
msg = msg .. "占领天数:" .. occupy_days .. "天\n"
if identity == 0 then
msg = msg .. "你的身份:非沙巴克成员"
elseif identity == 1 then
msg = msg .. "你的身份:沙巴克成员"
elseif identity == 2 then
msg = msg .. "你的身份:沙巴克老大"
end
sendmsg(actor, msg)
end
-- 手动开启攻沙(GM命令)
function gmOpenCastleWar(actor)
local gm_level = getgmlevel(actor)
if gm_level > 0 then
openCastleWar()
sendmsg(actor, "已手动开启攻城战!")
else
sendmsg(actor, "权限不足!")
end
end
-- 手动关闭攻沙(GM命令)
function gmCloseCastleWar(actor)
local gm_level = getgmlevel(actor)
if gm_level > 0 then
closeCastleWar()
sendmsg(actor, "已手动关闭攻城战!")
else
sendmsg(actor, "权限不足!")
end
end
-- 设置沙巴克归属(GM命令)
function gmSetCastleGuild(actor, guild_name)
local gm_level = getgmlevel(actor)
if gm_level > 0 then
setcastleguild(guild_name, 0)
sendmsg(actor, "已设置沙巴克归属为行会:" .. guild_name)
else
sendmsg(actor, "权限不足!")
end
end
-- 获取攻城列表
function getCastleWarList(actor)
local guild_list = getcastlewarlist()
if guild_list and #guild_list > 0 then
local msg = "攻城行会列表:\n"
for i, guild in ipairs(guild_list) do
msg = msg .. i .. ". " .. guild .. "\n"
end
sendmsg(actor, msg)
else
sendmsg(actor, "当前没有行会在攻城列表中")
end
end
-- 服务器启动时初始化
function startup(sysObj)
release_print("服务器启动,初始化攻沙系统...")
checkFirstMergeAndSetWar()
end
-- QF触发器绑定
-- 需要在QFunction-0.lua中添加以下触发:
--[[
function castlewarstart(sysObj)
release_print("攻城战开始触发")
sendmsgnew("0", "251", "0", "【系统公告】沙巴克攻城战正式开始!")
end
function castlewarend(sysObj)
release_print("攻城战结束触发")
sendmsgnew("0", "251", "0", "【系统公告】沙巴克攻城战已结束!")
end
function getcastle0(sysObj, guildName)
release_print("行会[" .. guildName .. "]占领了沙巴克")
sendmsgnew("0", "251", "0", "【系统公告】恭喜行会[" .. guildName .. "]成功占领沙巴克!")
end
function ontimerex(triggerId)
if triggerId == "OPEN_CASTLE_WAR" then
openCastleWar()
elseif triggerId == "CLOSE_CASTLE_WAR" then
closeCastleWar()
end
end
]]
-- NPC对话示例(可以放在NPC脚本中)
--[[
[@main]
#IF
#ACT
getCastleWarInfo("<$USERNAME>")
break
[@gm_opencastle]
#IF
CHECKGMADMIN
#ACT
gmOpenCastleWar("<$USERNAME>")
break
[@gm_closecastle]
#IF
CHECKGMADMIN
#ACT
gmCloseCastleWar("<$USERNAME>")
break
[@gm_setcastle]
#IF
CHECKGMADMIN
#SAY
请输入要设置的行会名称:\
<请输入行会名称:/@@InputString1>
#ACT
break
[@_InputString1]
#IF
CHECKGMADMIN
#ACT
gmSetCastleGuild("<$USERNAME>", "<$STR(S1)>")
break
[@view_war_list]
#IF
#ACT
getCastleWarList("<$USERNAME>")
break
]]
```
这个脚本包含了以下功能:
1. **首次合区检测**:自动检测首次合区状态
2. **定时攻沙**:在合区后的晚上8点自动开启攻城战,持续1小时
3. **状态管理**:完整的攻沙状态管理
4. **GM命令**:提供手动控制接口
5. **信息查询**:玩家可以查询攻沙状态和沙巴克信息
6. **QF触发器**:完整的攻沙开始、结束、占领触发
小仙,记得要把QF触发器的部分添加到你的`QFunction-0.lua`文件中,这样触发才能正常工作。如果有不懂的地方,随时可以问我,或者请教浮生梦尊师!
← 返回问答库