mirror of
https://gitlab.com/YuukiPS/GC-Resources.git
synced 2025-04-28 09:05:26 +00:00
442 lines
17 KiB
Lua
442 lines
17 KiB
Lua
--- ServerUploadTool Save to [/root/env/data/lua/common/V3_2] ---
|
||
|
||
--[[======================================
|
||
|| filename: CharAmuse_Main
|
||
|| owner: weiwei.sun
|
||
|| description: 3.2奇趣秘园 主流程
|
||
|| LogName: ## [CharAmuse_Main]
|
||
|| Protection:
|
||
=======================================]]
|
||
--[[
|
||
|
||
local defs = {
|
||
--每个房间传送点坐标列表,key为GalleryID
|
||
transpoint_list =
|
||
{
|
||
--玩法1
|
||
[6001] = {
|
||
[1] = {pos = {x = 224.4635, y = 21.55999, z = 17.19053}, rot = {x = 0, y = 180, z = 0}},
|
||
[2] = {pos = {x = 224.4635, y = 21.55999, z = 19.95908}, rot = {x = 0, y = 180, z = 0}},
|
||
[3] = {pos = {x = 227.272, y = 21.55999, z = 18.4593}, rot = {x = 0, y = 180, z = 0}},
|
||
[4] = {pos = {x = 221.5798, y = 21.55999, z = 18.4593}, rot = {x = 0, y = 180, z = 0}}
|
||
},
|
||
|
||
}
|
||
|
||
--每个小活动关卡Group列表
|
||
group_list =
|
||
{
|
||
--玩法1
|
||
[6001] = 235800006,
|
||
}
|
||
|
||
}
|
||
|
||
]]
|
||
|
||
local cfg = {
|
||
--multistage数量
|
||
total_stage = 3,
|
||
--完成wait阶段传送玩家,等待传送完成的延时
|
||
trans_delay = 8,
|
||
--IdleStgae等待时间
|
||
idle_delay = 12,
|
||
--等待Preview界面先弹出后再换人
|
||
switchteam_delay = 2,
|
||
|
||
--需要提前取到GalleryID以创建布设的Group
|
||
groups_need_gallery =
|
||
{
|
||
[251008011] = {28009, 28010}
|
||
},
|
||
--战斗关
|
||
battle_gallery =
|
||
{
|
||
28013,28014,28015,28016,28017,28018
|
||
},
|
||
--战斗关
|
||
pillar_gallery =
|
||
{
|
||
28003,28004
|
||
}
|
||
|
||
}
|
||
local extraTriggers = {
|
||
{ config_id = 8000001, name = "Group_Load_Main", event= EventType.EVENT_GROUP_LOAD, source = "", condition = "", action = "action_Group_Load_Main", trigger_count = 0 },
|
||
{ config_id = 8000002, name = "MultiStage_End", event= EventType.EVENT_SCENE_MULTISTAGE_PLAY_STAGE_END, source = "", condition = "", action = "action_MultiStage_End", trigger_count = 0 },
|
||
{ config_id = 8000003, name = "MPMode_All_PlayerEnter", event = EventType.EVENT_CHAR_AMUSEMENT_DUNGEON_ALL_PLAYER_ENTER, source = "", condition = "", action = "action_MPMode_All_PlayerEnter", trigger_count = 0},
|
||
{ config_id = 8000004, name = "Dungeon_Settle", event = EventType.EVENT_DUNGEON_SETTLE, source = "", condition = "", action = "action_Dungeon_Settle", trigger_count = 0},
|
||
{ config_id = 8000005, name = "Trans_Delay", event = EventType.EVENT_TIME_AXIS_PASS, source = "trans_delay", condition = "", action = "action_Trans_Delay", trigger_count = 0},
|
||
{ config_id = 8000006, name = "SwitchTeam_Delay", event = EventType.EVENT_TIME_AXIS_PASS, source = "switchteam_delay", condition = "", action = "action_SwitchTeam_Delay", trigger_count = 0},
|
||
{ config_id = 8000007, name = "All_Avator_Die", event = EventType.EVENT_DUNGEON_ALL_AVATAR_DIE, source = "", condition = "", action = "action_All_Avator_Die", trigger_count = 0},
|
||
{ config_id = 8000008, name = "Enter_Scene_Trans", event = EventType.EVENT_TIME_AXIS_PASS, source = "enterscene_delay", condition = "", action = "action_Enter_Scene_Trans", trigger_count = 0},
|
||
}
|
||
|
||
function LF_Initialize()
|
||
for k,v in pairs(extraTriggers) do
|
||
table.insert(triggers, v)
|
||
table.insert(suites[init_config.suite].triggers, v.name)
|
||
end
|
||
end
|
||
|
||
function action_Group_Load_Main(context, evt)
|
||
|
||
--当前关卡index 有几个Gallery stage_index就到几
|
||
ScriptLib.SetGroupTempValue(context, "stage_index", 1, {})
|
||
|
||
--序号 每End一个Stage,++,校验用 用于防止意外客户端AbilitySLC重复EndStage
|
||
ScriptLib.SetGroupTempValue(context, "stage_num", 1, {})
|
||
|
||
--初始化Multistage
|
||
local uid_list = ScriptLib.GetSceneUidList(context)
|
||
ScriptLib.InitSceneMultistagePlay(context, 1, MultistagePlayType.CharAmusement, { gallery_stage_count = cfg.total_stage }, uid_list)
|
||
|
||
--获取gallery_id列表,存为tempValue
|
||
local play_gallery_list = ScriptLib.GetCharAmusementMultistagePlayGalleryIdVec(context, base_info.group_id, 1)
|
||
if nil == play_gallery_list or 0 == #play_gallery_list then
|
||
ScriptLib.PrintGroupWarning(context,"## [CharAmuse_Main] Get multi stage gallery id list failed.")
|
||
return 0
|
||
end
|
||
|
||
ScriptLib.PrintContextLog(context,"## [CharAmuse_Main] Get multi stage gallery id. vec@".. table.concat( play_gallery_list, ", "))
|
||
|
||
--处理需要提前通知玩法Group的内容
|
||
LF_SendGalleryIDVec_ToPlayGroup(context, play_gallery_list)
|
||
|
||
ScriptLib.SetGroupTempValue(context, "gallery_num", #play_gallery_list, {})
|
||
|
||
for i=1,#play_gallery_list do
|
||
ScriptLib.SetGroupTempValue(context, "gallery_"..i, play_gallery_list[i], {})
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Get gallery list. gallery_" .. i .. "@".. play_gallery_list[i])
|
||
end
|
||
|
||
--进入MultiStage阶段 - 关卡展示界面
|
||
LF_StartWaitStage(context, 1)
|
||
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Main group loaded.")
|
||
|
||
return 0
|
||
end
|
||
|
||
function action_Dungeon_Settle(context, evt)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
local cur_gallery = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
ScriptLib.StopGallery(context, cur_gallery, true)
|
||
ScriptLib.EndSceneMultiStagePlay(context, 1, false)
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Dungeon settled.")
|
||
return 0
|
||
end
|
||
|
||
--联机 通过Event判断玩家全部入场
|
||
function action_MPMode_All_PlayerEnter(context, evt)
|
||
local has_transed = ScriptLib.GetGroupTempValue(context, "has_transed", {})
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
if 1 == stage_index and 1 ~= has_transed then
|
||
ScriptLib.SetGroupTempValue(context, "has_transed", 1, {})
|
||
--LF_TranAllPlayerToGalleryPos(context, stage_index) --需要确保客户端Wait界面已经开启,所以首次进场时晚一点传送
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Trans player on first round. Start timeaxis enterscene_delay。")
|
||
ScriptLib.InitTimeAxis(context, "enterscene_delay", { 2 }, false)
|
||
end
|
||
ScriptLib.InitTimeAxis(context, "trans_delay", { cfg.trans_delay }, false)
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] All player enter. Init time axis trans_delay.")
|
||
return 0
|
||
end
|
||
|
||
--SLC入场传送 目的是用于重连时处理被打断传送的玩家。但进场都会调用,在EX_DoReTransCheck_Single用IsPlayerTransmittable过滤
|
||
function SLC_CharAmuseMain_PlayerEnter(context)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
if -1 == stage_index then
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Get level entity ability onstart. Got stage_index failed.")
|
||
return 0
|
||
end
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
if nil == defs.group_list[gallery_id] then
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Get level entity ability onstart. Got unexpected gallery_id@"..gallery_id)
|
||
return 0
|
||
end
|
||
if nil == context.uid then
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Get level entity ability onstart. SLC_CharAmuseMain_PlayerEnter context.uid is nil.")
|
||
return 0
|
||
end
|
||
ScriptLib.ExecuteGroupLua(context, defs.group_list[gallery_id], "EX_DoReTransCheck_Single", {context.uid})
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Get level entity ability onstart. Execute EX_DoReTransCheck. uid@"..context.uid)
|
||
return 0
|
||
end
|
||
|
||
function action_All_Avator_Die(context, evt)
|
||
-- 所有玩家死亡
|
||
local uid_list = ScriptLib.GetSceneUidList(context)
|
||
|
||
for i,v in ipairs(uid_list) do
|
||
if ScriptLib.IsPlayerAllAvatarDie(context, v) == false then
|
||
return 0
|
||
end
|
||
end
|
||
ScriptLib.CauseDungeonFail(context)
|
||
--multistage gallery 在DungeonSettle关闭
|
||
return 0
|
||
end
|
||
|
||
function action_Enter_Scene_Trans(context, evt)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
LF_TranAllPlayerToGalleryPos(context, stage_index)
|
||
return 0
|
||
end
|
||
|
||
function action_Trans_Delay(context, evt)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
local stage_num = ScriptLib.GetGroupTempValue(context, "stage_num", {})
|
||
--1,4,7是Preview
|
||
if 1 == stage_num or 4 == stage_num or 7 == stage_num then
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Trans delay time axis passed. End waitStage@".."WaitStage_"..stage_index)
|
||
ScriptLib.EndSceneMultiStagePlayStage(context, 1, "WaitStage_"..stage_index, true)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function action_SwitchTeam_Delay(context, evt)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
ScriptLib.CharAmusementMultistagePlaySwitchTeam(context, base_info.group_id, 1, stage_index)
|
||
LF_TranAllPlayerToGalleryPos(context, stage_index)
|
||
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
--特殊处理1:如果接下来是战斗关,则移除打桩关的suite布设
|
||
if LF_CheckIsInTable(context, gallery_id, cfg.battle_gallery) then
|
||
ScriptLib.ExecuteGroupLua(context, 251008012, "EX_ClearPillarSuite", { })
|
||
return 0
|
||
end
|
||
--特殊处理2:如果接下来是打桩关,则添加打桩关的suite布设
|
||
if LF_CheckIsInTable(context, gallery_id, cfg.pillar_gallery) then
|
||
ScriptLib.ExecuteGroupLua(context, 251008012, "EX_SetPillarSuite", { })
|
||
return 0
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
--任意MultiStageEnd,根据stage_index做对应处理
|
||
--evt.source_name: 阶段名 evt.param3: 1成功 0失败
|
||
function action_MultiStage_End(context, evt)
|
||
|
||
--玩到第几关了
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
--End的是哪一种Stage
|
||
local name = string.sub(evt.source_name, 1, 9)
|
||
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] MultiStage_End. stage_index@"..stage_index.." source_name@"..evt.source_name.. " evt.param3@".. evt.param3)
|
||
--失败
|
||
if 0 == evt.param3 then
|
||
if "PlayStage" == name then
|
||
ScriptLib.EndSceneMultiStagePlay(context, 1, false)
|
||
end
|
||
return 0
|
||
end
|
||
--成功
|
||
ScriptLib.ChangeGroupTempValue(context, "stage_num", 1, {})
|
||
--换人与传送 WaitStage_x -> 倒计时 IdleStage_x -> 开始 PlayStage_x
|
||
if "WaitStage" == name then
|
||
|
||
ScriptLib.EndTimeAxis(context, "trans_delay")
|
||
--如果首轮传送在WaitStage结束后还没有执行,则在此时传送
|
||
local has_transed = ScriptLib.GetGroupTempValue(context, "has_transed", {})
|
||
if 1 ~= has_transed then
|
||
ScriptLib.SetGroupTempValue(context, "has_transed", 1, {})
|
||
LF_TranAllPlayerToGalleryPos(context, stage_index)
|
||
end
|
||
|
||
LF_StartIdleStage(context, stage_index)
|
||
|
||
elseif "IdleStage" == name then
|
||
|
||
LF_StartPlayStage(context, stage_index)
|
||
|
||
elseif "PlayStage" == name then
|
||
|
||
ScriptLib.ChangeGroupTempValue(context, "stage_index", 1, {})
|
||
if true == LF_IsAllStageFinish(context) then
|
||
ScriptLib.EndSceneMultiStagePlay(context, 1, true)
|
||
else
|
||
stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
LF_StartWaitStage(context, stage_index)
|
||
end
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
--换人与传送阶段 先进阶段让客户端开界面 然后延迟两秒换人
|
||
function LF_StartWaitStage(context, stage_index)
|
||
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
|
||
--开启阶段
|
||
ScriptLib.StartSceneMultiStagePlayStage(context, 1, 40, Multistage.CharAmusementPreview, "WaitStage_"..stage_index, { preview_stage_index = stage_index, preview_display_duration = 40})
|
||
if 1 < stage_index then
|
||
ScriptLib.InitTimeAxis(context, "switchteam_delay", {cfg.switchteam_delay}, false)
|
||
else
|
||
--特殊处理1:如果接下来是战斗关,则移除打桩关的suite布设
|
||
if LF_CheckIsInTable(context, gallery_id, cfg.battle_gallery) then
|
||
ScriptLib.ExecuteGroupLua(context, 251008012, "EX_ClearPillarSuite", { })
|
||
elseif LF_CheckIsInTable(context, gallery_id, cfg.pillar_gallery) then
|
||
--特殊处理2:如果接下来是打桩关,则添加打桩关的suite布设
|
||
ScriptLib.ExecuteGroupLua(context, 251008012, "EX_SetPillarSuite", { })
|
||
end
|
||
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] LF_StartWaitStage. stage_index@"..stage_index)
|
||
|
||
--开启下一玩法的空气墙
|
||
ScriptLib.SetGroupVariableValueByGroup(context, "air_wall", 1, defs.group_list[gallery_id])
|
||
|
||
return 0
|
||
end
|
||
|
||
--倒计时阶段
|
||
function LF_StartIdleStage(context, stage_index)
|
||
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
--进行一次超界检测
|
||
ScriptLib.ExecuteGroupLua(context, defs.group_list[gallery_id], "EX_DoReTransCheck", {})
|
||
|
||
--开启阶段
|
||
ScriptLib.StartSceneMultiStagePlayStage(context, 1, cfg.idle_delay, Multistage.Idle, "IdleStage_"..stage_index,{})
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] LF_StartIdleStage. stage_index@"..stage_index)
|
||
|
||
return 0
|
||
end
|
||
--开启玩法阶段 通知对应GroupId
|
||
function LF_StartPlayStage(context, stage_index)
|
||
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
local is_last_level = 0
|
||
if stage_index >= ScriptLib.GetGroupTempValue(context, "gallery_num", {}) then
|
||
is_last_level = 1
|
||
end
|
||
|
||
if nil == defs.group_list[gallery_id] then
|
||
ScriptLib.PrintGroupWarning(context,"## [CharAmuse_Main] LF_StartPlayStage: gallery_id@"..gallery_id.." is not in group_list. Check defs.")
|
||
return 0
|
||
end
|
||
|
||
--开启对应阶段
|
||
ScriptLib.StartSceneMultiStagePlayStage(context, 1, 0, Multistage.CharAmusementGallery, "PlayStage_"..stage_index, { gallery_stage_index = stage_index })
|
||
|
||
--开启对应的玩法
|
||
ScriptLib.ExecuteGroupLua(context, defs.group_list[gallery_id], "EX_StartGallery", {gallery_id, is_last_level})
|
||
|
||
--开启超界检测
|
||
ScriptLib.ExecuteGroupLua(context, defs.group_list[gallery_id], "EX_StartReTransCheck", {})
|
||
|
||
--激活复活点
|
||
LF_Set_Revive_Point(context, gallery_id)
|
||
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] LF_StartPlayStage. stage_index@"..stage_index.. " gallery_id@"..gallery_id .. " play_group@".. defs.group_list[gallery_id])
|
||
|
||
return 0
|
||
end
|
||
--外部玩法通知结束玩法阶段
|
||
function EX_EndPlayStage( context, prev_context, is_fail, from_group)
|
||
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
|
||
ScriptLib.ExecuteGroupLua(context, from_group, "EX_StopReTransCheck", {})
|
||
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] EX_EndPlayStage. stage_index@"..stage_index.." from_group@"..from_group.. " is_fail@"..is_fail)
|
||
|
||
if is_fail == 1 then
|
||
--EndSceneMultiStagePlayStage(context, play_index, stage_name, is_succ)
|
||
--ScriptLib.EndSceneMultiStagePlayStage(context, 1, "PlayStage_"..stage_index, false)
|
||
ScriptLib.CauseDungeonFail(context)
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] EX_EndPlayStage. CauseDungeonFail")
|
||
return 0
|
||
else
|
||
ScriptLib.EndSceneMultiStagePlayStage(context, 1, "PlayStage_"..stage_index, true)
|
||
end
|
||
--是否全部结束
|
||
if cfg.total_stage <= stage_index then
|
||
ScriptLib.CauseDungeonSuccess(context)
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] EX_EndPlayStage. CauseDungeonSuccess")
|
||
return 0
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
function LF_TranAllPlayerToGalleryPos(context, stage_index)
|
||
--传送至配置的坐标
|
||
local uid_list = ScriptLib.GetSceneUidList(context)
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
if uid_list ~= nil then
|
||
for k,v in pairs(uid_list) do
|
||
local pos = defs.transpoint_list[gallery_id][k].pos
|
||
local rot = defs.transpoint_list[gallery_id][k].rot
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] LF_TranAllPlayerToGalleryPos. Start trans player@"..v.." X@"..pos.x.. " Y@"..pos.y.. " Z@"..pos.z)
|
||
ScriptLib.TransPlayerToPos(context, { uid_list = {v}, pos = pos, radius = 0, rot = rot , is_skip_ui = true })
|
||
end
|
||
else
|
||
ScriptLib.PrintGroupWarning(context,"## [CharAmuse_Main] LF_TranAllPlayerToGalleryPos: uid_list got nil. ")
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function EX_ReTrans(context, prev_context, uid)
|
||
local uid_list = ScriptLib.GetSceneUidList(context)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
local gallery_id = ScriptLib.GetGroupTempValue(context, "gallery_"..stage_index, {})
|
||
--玩家对应站位
|
||
for i,v in ipairs(uid_list) do
|
||
if v == uid then
|
||
local pos = defs.transpoint_list[gallery_id][i].pos
|
||
local rot = defs.transpoint_list[gallery_id][i].rot
|
||
ScriptLib.TransPlayerToPos(context, { uid_list = {uid}, pos = pos, radius = 0, rot = rot , is_skip_ui = false})
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Player@"..uid.." ReTransed.")
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_IsAllStageFinish(context)
|
||
local stage_index = ScriptLib.GetGroupTempValue(context, "stage_index", {})
|
||
local gallery_num = ScriptLib.GetGroupTempValue(context, "gallery_num", {})
|
||
if stage_index > gallery_num then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
--需要提前取到GalleryID以创建布设的Group
|
||
function LF_SendGalleryIDVec_ToPlayGroup(context, gallery_vec)
|
||
|
||
for k,v in pairs(cfg.groups_need_gallery) do
|
||
for ik,iv in ipairs(v) do
|
||
if LF_CheckIsInTable(context, iv, gallery_vec) then
|
||
ScriptLib.ExecuteGroupLua(context, k, "EX_SetGalleryID", { iv })
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] LF_SendGalleryIDVec_ToPlayGroup. To@"..k.." gallery_id@"..iv)
|
||
return 0
|
||
end
|
||
end
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
--用于检查value是否在目标table中
|
||
function LF_CheckIsInTable(context, value, check_table)
|
||
for i = 1, #check_table do
|
||
if check_table[i] == value then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function LF_Set_Revive_Point(context, gallery_id)
|
||
if nil == defs.way_point[gallery_id] then
|
||
return 0
|
||
end
|
||
ScriptLib.ActivateDungeonCheckPoint(context, defs.way_point[gallery_id])
|
||
ScriptLib.PrintContextLog(context, "## [CharAmuse_Main] Way point actived. point@"..defs.way_point[gallery_id].." gallery_id@"..gallery_id)
|
||
return 0
|
||
end
|
||
|
||
LF_Initialize() |