0
0
mirror of https://gitlab.com/YuukiPS/GC-Resources.git synced 2025-04-28 09:05:26 +00:00
GC-Resources/Resources/Scripts/Common/V3_0/DeathZoneObservation.lua
KingRainbow44 8dd3a721e5
Revert "The Great De-Local'ifying of defs and base_info"
This reverts commit 0989747b
2023-08-30 21:15:50 -04:00

578 lines
22 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[======================================
|| filename: DeathZoneObservation
|| owner: shuyi.chang
|| description: 死域观测站
|| LogName: ## [DeathZoneObservation]
|| Protection:
=======================================]]
--[[
local defs_miscs =
{
-- 死域观测站透镜的config id
lensConfigId = 103001,
-- 这个透镜对应的隐藏父任务的回退参数
resetParam = "rewindSmoke"
-- 兰纳罗的config id
lnlConfigId = 103004,
-- 兰纳罗隐藏任务的回退参数
hiddenlnlParam = "hiddenlnl",
-- 一个smoke拥有一项
smokeTable =
{
-- 每项格式如下,通常应该只有两项,即一个透镜对应两个黑烟
--[smoke_id] = {smoke = smoke_config_id, maxRegion = region_id, group = group_id, observeQuest = quest_id, finishQuest = quest_id, questParam = "任务前进变量"}
[103002] = {smoke = 103002, group = 133304105, observeQuest = 7305103, finishQuest = 7305104, questParam = "smokeObserved1"},
[103003] = {smoke = 103003, group = 133304106, observeQuest = 7305105, finishQuest = 7305106, questParam = "smokeObserved2"},
}
}
--]]
local extraTriggers =
{
{ config_id = 50000001, name = "GROUP_LOAD", event = EventType.EVENT_GROUP_LOAD, source = "", condition = "", action = "action_EVENT_GROUP_LOAD", trigger_count = 0 },
{ config_id = 50000002, name = "DEATH_ZONE_OBSERVE", event = EventType.EVENT_DEATH_ZONE_OBSERVE, source = "", condition = "", action = "action_EVENT_DEATH_ZONE_OBSERVE", trigger_count = 0 },
{ config_id = 50000004, name = "SMOKE_QUEST_FINISH", event = EventType.EVENT_QUEST_FINISH, source = "", condition = "", action = "action_SMOKE_QUEST_FINISH", trigger_count = 0 },
{ config_id = 50000005, name = "ENTER_REGION", event = EventType.EVENT_ENTER_REGION, source = "", condition = "", action = "action_EVENT_ENTER_REGION", trigger_count = 0 },
-- { config_id = 50000006, name = "LEAVE_REGION", event = EventType.EVENT_LEAVE_REGION, source = "", condition = "", action = "action_EVENT_LEAVE_REGION", trigger_count = 0 },
-- { config_id = 50000007, name = "GROUP_WILL_UNLOAD", event = EventType.EVENT_GROUP_WILL_UNLOAD, source = "", condition = "", action = "action_EVENT_GROUP_WILL_UNLOAD", trigger_count = 0 },
{ config_id = 50000008, name = "GADGET_STATE_CHANGE", event = EventType.EVENT_GADGET_STATE_CHANGE, source = "", condition = "", action = "action_EVENT_GADGET_STATE_CHANGE", trigger_count = 0 },
}
local extraVariables =
{
-- 已完成几个黑烟玩法group
{ config_id = 50000101, name = "smokeFinishedNum", value = 0, no_refresh = true },
-- 已观测到几个兰纳罗
{ config_id = 50000102, name = "aranaraObservedNum", value = 0, no_refresh = true },
-- 目前有几个黑烟处于状态1已被观测到
{ config_id = 50000103, name = "smokeObservedNum", value = 0, no_refresh = true },
}
local smokeGadgetId = 70310219
local lnlGadgetId = 70310440
local smokeCount
local lnlDisappearRmd = 33040007
--================================================================
-- Local Functions
--================================================================
function LF_Initialize_Group(triggers, suites, variables, gadgets, regions)
-- insert triggers
for i = 1, #extraTriggers do
table.insert(triggers, extraTriggers[i])
end
-- add triggers to suite
for i = 1, #extraTriggers do
-- 都放到初始suite 1中
table.insert(suites[1].triggers,extraTriggers[i].name)
end
-- insert variables
for i = 1, #extraVariables do
table.insert(variables, extraVariables[i])
end
local temp = 0
for k, v in pairs(defs_miscs.smokeTable) do
temp = temp + 1
-- 每个smoke给一个group var记录状态0未观测1已观测2已完成
local smoke = { config_id = 40000000 + temp, name = "smoke_"..tostring(v.smoke), value = 0, no_refresh = true }
table.insert(variables, smoke)
gadgets[k].mark_flag = 1
end
smokeCount = LF_GetTableLength(defs_miscs.smokeTable)
-- set lens mark_flag
gadgets[defs_miscs.lensConfigId].mark_flag = 1
end
function LF_GetTableLength(t)
local count = 0
for _ in pairs(t) do count = count + 1 end
return count
end
function LF_SetGlobalValueByGroupVar(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetGlobalValue is called")
-- SGV不存档所以每次load的时候要手动设回正常值断线重连同理
local curSmokeCount = ScriptLib.GetGroupVariableValue(context, "smokeObservedNum")
ScriptLib.SetEntityServerGlobalValueByConfigId(context, defs_miscs.lensConfigId, "SGV_Cur_Smoke_Count", curSmokeCount)
local smokeLeftCount = smokeCount - ScriptLib.GetGroupVariableValue(context, "smokeFinishedNum")
ScriptLib.SetEntityServerGlobalValueByConfigId(context, defs_miscs.lensConfigId, "SGV_Smoke_Count", smokeLeftCount)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] smokeFinishedNum = "..ScriptLib.GetGroupVariableValue(context, "smokeFinishedNum")
..", smokeCount = "..smokeCount)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] SGV_Smoke_Count is set to "..smokeLeftCount..", SGV_Cur_Smoke_Count is set to "..curSmokeCount)
-- SGV记录观测到了多少兰那罗,设计上应该只有一个
ScriptLib.SetEntityServerGlobalValueByConfigId(context, defs_miscs.lensConfigId, "SGV_Cur_Aranara_Count", 0)
end
-- 设置指定黑烟的状态,并更新目前观测到的黑烟数量
-- function LF_SetSmokeStatus(context, smokeId, status)
-- ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetSmokeByStatus is called, smokeId = "..smokeId..", status is set to "..status)
-- local variableName = "smoke_"..smokeId
-- -- 更改前的黑烟状态
-- local statusBefore = ScriptLib.GetGroupVariableValue(context, variableName)
-- ScriptLib.SetGroupVariableValue(context, variableName, status)
-- local variableValue = ScriptLib.GetGroupVariableValue(context, variableName)
-- local gadgetState = 0
-- if status == 0 then
-- -- 还没被观测到在0
-- gadgetState = 0
-- elseif status == 2 then
-- -- 未观测死域已清除在202
-- gadgetState = 202
-- elseif status == 1 then
-- -- 已被观测到,不清楚玩家在相对黑烟的什么位置
-- gadgetState = 201
-- -- 黑烟对应的观察任务流转
-- -- todo如果任务没收到消息这里要加保底
-- LF_LoadSmokeGroup(context, smokeId)
-- -- todo远近视距黑烟特效切换放在ability里判断
-- end
-- -- 如果状态改变需要更新sgv和相关group var
-- if status ~= statusBefore then
-- LF_UpdateObservedSmokeCount(context)
-- LF_SetGlobalValueByGroupVar(context)
-- end
-- -- 更新此smoke的gadget state
-- ScriptLib.SetGadgetStateByConfigId(context, smokeId, gadgetState)
-- ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] smoke id = ".. smokeId..", gadget state is set to "..gadgetState..
-- ", group variable "..variableName.." is set to "..variableValue)
-- end
function LF_SetSmokeGroupVar(context, smokeId, var)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetSmokeGroupVar is called")
local variableName = "smoke_"..smokeId
-- 更改前的黑烟状态
local statusBefore = ScriptLib.GetGroupVariableValue(context, variableName)
-- 设置group var的唯一时刻
ScriptLib.SetGroupVariableValue(context, variableName, var)
local variableValue = ScriptLib.GetGroupVariableValue(context, variableName)
-- 如果设置了group var肯定需要紧接着修改黑烟gadget state
LF_SetSmokeStatus_New(context, smokeId, variableValue)
-- 如果状态改变需要更新sgv和相关group var
if var ~= statusBefore then
LF_UpdateObservedSmokeCount(context)
LF_SetGlobalValueByGroupVar(context)
end
end
function LF_UpdateObservedSmokeCount(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_UpdateObservedSmokeCount is called")
-- 更新目前观测到了的黑烟数量
local temp1 = 0
local temp2 = 0
for k, v in pairs(defs_miscs.smokeTable)do
if 1 == ScriptLib.GetGroupVariableValue(context, "smoke_"..k) then
temp1 = temp1 + 1
elseif 2 == ScriptLib.GetGroupVariableValue(context, "smoke_"..k) then
temp2 = temp2 + 1
end
end
ScriptLib.SetGroupVariableValue(context, "smokeObservedNum", temp1)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] group variable smokeObservedNum is set to "..temp1)
ScriptLib.SetGroupVariableValue(context, "smokeFinishedNum", temp2)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] group variable smokeFinishedNum is set to "..temp2)
end
function LF_LoadSmokeGroup(context, smokeId)
-- 通过任务参数流转任务让任务动态加载死域group
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_LoadSmokeGroup is called")
local questParam = defs_miscs.smokeTable[smokeId].questParam
ScriptLib.AddQuestProgress(context, questParam)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] gadget id = "..smokeId.." adds progress to quest param = "..questParam)
end
function LF_SetCurGroupSmokes(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_ResetGroup is called")
-- 查询自己是否是当前组
local curGroupId = ScriptLib.GetGroupVariableValueByGroup(context, "curGroupId", 133304143)
if curGroupId == base_info.group_id then
-- 自己就是当前组同组的黑烟需要根据group var设置一下
LF_SetSmokeByGroupVar(context)
else
-- 不是当前组,黑烟都卸载
LF_KillAllSmokesInGroup(context)
end
-- 不管是不是当前组都要按黑烟的group var设置sgv和兰纳罗
LF_SetGlobalValueByGroupVar(context)
LF_ResetLNLByGroupVar(context)
end
function LF_ResetLNLByGroupVar(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_ResetLNLByGroupVar is called")
-- 根据group变量设置兰纳罗
local aranaraObservedNum = ScriptLib.GetGroupVariableValue(context, "aranaraObservedNum")
local lnlStatus = 0
if aranaraObservedNum == 1 then
-- lnl只有一个
lnlStatus = 2
else
lnlStatus = 0
end
LF_SetLNLStatus(context, defs_miscs.lnlConfigId, lnlStatus)
end
-- function LF_SetAllSmokesByGroupVar(context)
-- -- 黑烟和对应的动态group
-- for k, v in pairs(defs_miscs.smokeTable) do
-- --检查每个黑烟
-- -- group var存档通过group var重置smoke gadget state和任务任务重置动态group
-- local smokeId = v.smoke
-- local status = ScriptLib.GetGroupVariableValue(context, "smoke_"..smokeId)
-- LF_SetSmokeStatus(context, smokeId, status)
-- end
-- end
function LF_KillAllSmokesInGroup(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_KillAllSmokesInGroup is called")
-- kill all smokes
for k, v in pairs(defs_miscs.smokeTable) do
ScriptLib.KillEntityByConfigId(context, { config_id = k })
end
-- -- 把这个透镜group里status = 1的smoke重置回0任务一起回滚
-- for k, v in pairs(defs_miscs.smokeTable) do
-- local smokeId = k
-- local status = ScriptLib.GetGroupVariableValue(context, "smoke_"..smokeId)
-- -- 如果smokeStatus = 1已被观测到则重置回0
-- if status == 1 then
-- LF_SetSmokeStatus(context, smokeId, 0)
-- end
-- -- 如果smokeStatus = 2已被清除或者0没观测则不重置group var
-- -- 任务尝试回滚,已清除的黑烟任务已经成功,不会参与回滚
-- ScriptLib.AddQuestProgress(context, defs_miscs.resetParam)
-- end
end
function LF_SetLNLStatus(context, lnlId, status)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetLNLStatus is called")
local gadgetState = 0
if status == 0 then
-- 未观测
gadgetState = 0
elseif status == 1 then
-- 观测中
gadgetState = 201
elseif status == 2 then
-- 已观测
gadgetState = 202
-- set sgv
ScriptLib.SetGroupVariableValue(context, "aranaraObservedNum", 1)
ScriptLib.SetEntityServerGlobalValueByConfigId(context, defs_miscs.lensConfigId, "SGV_Cur_Aranara_Count", 1)
-- 通知任务流转
ScriptLib.AddQuestProgress(context, defs_miscs.hiddenlnlParam)
end
-- set gadget state
ScriptLib.SetGadgetStateByConfigId(context, lnlId, gadgetState)
end
function LF_ResetObservedSmoke_FromOther(context, prev_context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_ResetObservedSmoke_FromOther is called")
LF_KillAllSmokesInGroup(context)
return 0
end
function LF_SetSmokeByGroupVar(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetCurGroupActive is called")
-- 接近了一个透镜,需要创建同组黑烟并设置到对应状态
for k, v in pairs(defs_miscs.smokeTable) do
local groupVar = ScriptLib.GetGroupVariableValue(context, "smoke_"..k)
if groupVar == 0 then
LF_SetSmokeStatus_New(context, k, 0)
elseif groupVar == 1 then
LF_SetSmokeStatus_New(context, k, 1)
elseif groupVar == 2 then
LF_SetSmokeStatus_New(context, k, 2)
end
end
end
function LF_SetCurSmokeActive(context, smokeId)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetCurSmokeActive is called")
local groupVar = ScriptLib.GetGroupVariableValue(context, "smoke_"..smokeId)
if groupVar == 1 then
LF_SetSmokeStatus_New(context, smokeId, 1)
end
end
-- 设置指定黑烟的表现(或者是创建/销毁)不更改group var
function LF_SetSmokeStatus_New(context, smokeId, status)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetSmokeByStatus is called, smokeId = "..smokeId..", status is set to "..status)
-- 黑烟只有三种表现gadget state 0, gadget state 201, 不存在gadget(202)
local gadgetState = 0
if status == 0 then
-- 仅透镜可观测
-- 保底创建gadget state在0
ScriptLib.CreateGadget(context, { config_id = smokeId })
gadgetState = 0
elseif status == 1 then
-- 大世界可观测
-- 保底创建gadget state在201
ScriptLib.CreateGadget(context, { config_id = smokeId })
gadgetState = 201
-- 黑烟对应的观察任务流转
LF_LoadSmokeGroup(context, smokeId)
elseif status == 2 then
-- 不用特意创建如果黑烟在的话gadget state在202物件自行销毁
ScriptLib.SetGadgetStateByConfigId(context, smokeId, 202)
gadgetState = 202
end
-- 更新此smoke的gadget state
ScriptLib.SetGadgetStateByConfigId(context, smokeId, gadgetState)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] smoke id = ".. smokeId..", gadget state is set to "..gadgetState)
end
function LF_SetCurLensActive(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] LF_SetCurLensGroup is called")
-- 查看自己是不是当前lens
local before = ScriptLib.GetGroupVariableValueByGroup(context, "curGroupId", 133304143)
if before ~= base_info.group_id then
-- 不是的话把自己设置成当前lens
ScriptLib.SetGroupVariableValueByGroup(context, "curGroupId", base_info.group_id, 133304143)
-- 有人设置过这个group var再通知其他透镜group没设置过说明还没人接近过任何一个透镜
if before ~= 0 then
ScriptLib.ExecuteGroupLua(context, before, "LF_ResetObservedSmoke_FromOther", {})
end
end
local after = ScriptLib.GetGroupVariableValueByGroup(context, "curGroupId", 133304143)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] group 133304143 var curGroupId = "..after)
end
--================================================================
-- Triggers
--================================================================
function action_EVENT_GROUP_LOAD(context, evt)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] group is loaded")
LF_SetCurGroupSmokes(context)
return 0
end
-- function action_EVENT_GROUP_WILL_UNLOAD(context, evt)
-- ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] group will unload")
-- -- 不设置group var只回滚任务
-- ScriptLib.AddQuestProgress(context, defs_miscs.resetParam)
-- return 0
-- end
function action_EVENT_ENTER_REGION(context, evt)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] player enters region "..evt.param1)
for k, v in pairs(defs_miscs.smokeTable) do
if evt.param1 == v.maxRegion then
-- 玩家进入黑烟区域, 要把这个黑烟加载出来
LF_SetCurSmokeActive(context, v.smoke)
-- 查看自己是不是当前组,不是的话设置为当前组,并通知上一个当前组删除自己同组的所有黑烟
LF_SetCurLensActive(context)
end
end
if defs.lensRegion == nil then
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] WARNING, doesn't have lensRegion in defs")
return 0
end
if evt.param1 == defs.lensRegion then
LF_ResetLNLByGroupVar(context)
end
return 0
end
-- function action_EVENT_LEAVE_REGION(context, evt)
-- ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] player leaves region "..evt.param1)
-- -- 如果玩家离开了某个黑烟的最大区域
-- for k, v in pairs(defs_miscs.smokeTable) do
-- if evt.param1 == v.maxRegion then
-- -- 如果当前状态是已观测,需要重置回未观测
-- if 1 == ScriptLib.GetGroupVariableValue(context, "smoke_"..k) then
-- LF_SetSmokeStatus(context, k, 0)
-- ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] smoke = "..k.." is set from 1 to 0")
-- end
-- end
-- end
-- return 0
-- end
-- 在透镜中观测到了一个黑烟
function action_EVENT_DEATH_ZONE_OBSERVE(context, evt)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] lens config id = "..evt.param1..
", observed gadget config id = ".. evt.param2..", group id = "..evt.param3)
if evt.param2 == defs_miscs.lnlConfigId then
-- 如果是兰纳罗
LF_SetLNLStatus(context, defs_miscs.lnlConfigId, 2)
elseif gadgets[evt.param2].gadget_id == smokeGadgetId then
-- 如果是黑烟
-- 尽量不用for loop
-- 被观测到的黑烟config id
local smokeId = evt.param2
-- 黑烟状态改变
LF_SetSmokeGroupVar(context, smokeId, 1)
end
return 0
end
-- 完成一个未爆发死域玩法group
-- 一定要主机交互一下任务才能成功,所以任务一定能成功通知到玩家
function action_SMOKE_QUEST_FINISH(context, evt)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] quest id = "..evt.param1..", status = "..evt.param2)
-- 只检测是不是成功
if evt.param2 ~= 1 then
return 0
end
-- 某个黑烟对应的玩法group的任务已经完成
for k, v in pairs(defs_miscs.smokeTable) do
if v.finishQuest == evt.param1 then
-- 黑烟可以永久消失了
LF_SetSmokeGroupVar(context, k, 2)
end
end
return 0
end
function action_EVENT_GADGET_STATE_CHANGE(context, evt)
-- 只在状态有所改变的时候判断
if evt.param3 == evt.param1 then
return 0
end
ScriptLib.PrintContextLog(context, "## [DreamlandChallenge] gadget "..evt.param2.." changes from state "..evt.param3.."to state "..evt.param1)
-- 检测草神透镜的grassState是否从激化态回到正常态
if defs_miscs.lensConfigId == evt.param2 and 0 == evt.param1 and 200 == evt.param3 then
-- 兰纳罗还没被发现播一个reminder说兰纳罗无了
-- 这个时机无论如何都可以播,透镜开着自然就不显示了
if ScriptLib.GetGroupVariableValue(context, "aranaraObservedNum") == 0 then
ScriptLib.ShowReminder(context, lnlDisappearRmd)
end
end
return 0
end
--================================================================
-- ServerLuaCall
--================================================================
function SLC_Player_Approach_Self(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] SLC_Player_Approach_Self is triggered")
-- 查看自己是不是当前组,不是的话设置为当前组,并通知上一个当前组删除自己同组的所有黑烟
LF_SetCurLensActive(context)
-- 根据自己是否是当前透镜这里一定是设置同组黑烟、兰纳罗状态并同步一次sgv
LF_SetCurGroupSmokes(context)
return 0
end
function SLC_Lens_Closed_Excited(context)
ScriptLib.PrintContextLog(context, "## [DeathZoneObservation] SLC_Lens_Closed_Excited is triggered")
-- 进这个slc说明本次打开界面的时候透镜一定在激化态现在关上了可能需要rmd
-- 只有兰纳罗还没被发现+透镜已经不在激化态了才出现这个reminder 33040007
if ScriptLib.GetGroupVariableValue(context, "aranaraObservedNum") == 0
and ScriptLib.GetGadgetStateByConfigId(context, 0, defs_miscs.lensConfigId) ~= 200 then
ScriptLib.ShowReminder(context, lnlDisappearRmd)
end
return 0
end
--================================================================
-- Initialize
--================================================================
LF_Initialize_Group(triggers, suites, variables, gadgets, regions)