mirror of
https://gitlab.com/YuukiPS/GC-Resources.git
synced 2025-04-28 09:05:26 +00:00
372 lines
13 KiB
Lua
372 lines
13 KiB
Lua
--[[
|
||
local defs = {
|
||
box_gadget_id = 1,
|
||
point_array_id = 1,
|
||
option_id = 1,
|
||
reminder_level_boarder = 1,
|
||
reminder_array_boarder = 1,
|
||
reminder_box_conflict = 1,
|
||
}
|
||
|
||
--地形信息:0-墙面,1-地面,2-空气墙
|
||
local level_map = {
|
||
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0},
|
||
{0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0},
|
||
{1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1},
|
||
{0,0,0,0,0,0,0,0,2,1,0,1,1,1,1,1,1},
|
||
{0,0,0,0,0,0,0,0,2,1,0,1,1,1,1,1,1}
|
||
}
|
||
|
||
--点阵id信息
|
||
local point_map = {
|
||
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0},
|
||
{ 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 9,10,11,12, 0, 0},
|
||
{13,14,15,16,17,18,19,20,21,22, 0,23, 0,24,25,26,27},
|
||
{ 0, 0, 0, 0, 0, 0, 0, 0, 2,28, 0,29,30,31,32,33,34},
|
||
{ 0, 0, 0, 0, 0, 0, 0, 0, 2,35, 0,36,37,38,39,40,41}
|
||
}
|
||
|
||
--箱子起始信息
|
||
local box_config = {
|
||
[1] = {config_id = 1001, pos = {x=8,z=3}},
|
||
[2] = {config_id = 1002, pos = {x=11,z=1}},
|
||
[3] = {config_id = 1003, pos = {x=12,z=2}},
|
||
[4] = {config_id = 1004, pos = {x=13,z=2}}
|
||
}
|
||
--]]
|
||
--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
local Tri = {
|
||
{ name = "Group_Load", config_id = 8000001, event = EventType.EVENT_GROUP_LOAD, source = "", condition = "", action = "action_group_load", trigger_count = 0 },
|
||
{ name = "Gadget_Create", config_id = 8000002, event = EventType.EVENT_GADGET_CREATE, source = "", condition = "", action = "action_gadget_create", trigger_count = 0 },
|
||
{ name = "Select_Option", config_id = 8000003, event = EventType.EVENT_SELECT_OPTION, source = "", condition = "", action = "action_select_option", trigger_count = 0 },
|
||
{ name = "Platform_Reach_Point", config_id = 8000004, event = EventType.EVENT_PLATFORM_REACH_POINT, source = "", condition = "", action = "action_platform_reach_point", trigger_count = 0 },
|
||
{ name = "Group_Refresh", config_id = 8000005, event = EventType.EVENT_GROUP_REFRESH, source = "", condition = "", action = "action_group_refresh", trigger_count = 0 },
|
||
--{ name = "Avatar_Near_Platform", config_id = 8000006, event = EventType.EVENT_AVATAR_NEAR_PLATFORM, source = "", condition = "", action = "action_avatar_near_platform", trigger_count = 0 }
|
||
{ name = "Time_Axis_Pass", config_id = 8000006, event = EventType.EVENT_TIME_AXIS_PASS, source = "", condition = "", action = "action_time_axis_pass", trigger_count = 0 }
|
||
}
|
||
|
||
function Initialize()
|
||
for i,v in ipairs(Tri) do
|
||
table.insert(triggers, v)
|
||
--table.insert(suites[init_config.suite].triggers, v.name)
|
||
--根据2.4需求,只要注册进suite 3即可
|
||
table.insert(suites[3].triggers, v.name)
|
||
end
|
||
end
|
||
|
||
--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
function LF_Notify(context, r_id)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Notify | reminder_id="..r_id)
|
||
ScriptLib.ShowReminder(context, r_id)
|
||
end
|
||
|
||
--初始化所有box的位置
|
||
function LF_Init_Level(context)
|
||
ScriptLib.SetGroupTempValue(context, "next_point_x", 0, {})
|
||
ScriptLib.SetGroupTempValue(context, "next_point_z", 0, {})
|
||
for i,v in ipairs(box_config) do
|
||
ScriptLib.RemoveEntityByConfigId(context, 0, EntityType.GADGET, v.config_id)
|
||
local _ret,R_pos,R_rot = ScriptLib.GetPlatformArrayInfoByPointId(context, defs.point_array_id, point_map[v.pos.z][v.pos.x])
|
||
local _pos = {x=R_pos.x,y=R_pos.y,z=R_pos.z}
|
||
local _rot = {x=0,y=0,z=0}
|
||
ScriptLib.CreateGadgetByConfigIdByPos(context, v.config_id, _pos, _rot)
|
||
ScriptLib.SetPlatformPointArray(context, v.config_id, defs.point_array_id, {point_map[v.pos.z][v.pos.x]}, {})
|
||
ScriptLib.SetGroupTempValue(context, "box_pos_x_"..i, v.pos.x, {})
|
||
ScriptLib.SetGroupTempValue(context, "box_pos_z_"..i, v.pos.z, {})
|
||
end
|
||
end
|
||
|
||
function LF_Get_Entity_Pos(context, uid, cid)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Get_Entity_Pos")
|
||
local _eid = 0
|
||
--转译entityId
|
||
if uid ~= 0 then
|
||
_eid = ScriptLib.GetAvatarEntityIdByUid(context, uid)
|
||
elseif cid ~= 0 then
|
||
_eid = ScriptLib.GetEntityIdByConfigId(context, cid)
|
||
end
|
||
--返回安全值,印象中直接返回_array时table里不干净
|
||
local _array = ScriptLib.GetPosByEntityId(context, _eid)
|
||
local _res = {}
|
||
if _array.x == 0 and _array.y == 0 and _array.z == 0 then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : Get Pos Fail !!! | uid="..uid.." | cid="..cid)
|
||
_res.error = 1
|
||
return _res
|
||
end
|
||
_res.x = _array.x
|
||
_res.y = _array.y
|
||
_res.z = _array.z
|
||
return _res
|
||
end
|
||
|
||
function LF_Get_Push_Direction(context, avatar, target)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Get_Push_Direction")
|
||
local _direction = {x=0,y=0,z=0}
|
||
_direction.x = target.x - avatar.x
|
||
_direction.y = target.y - avatar.y
|
||
_direction.z = target.z - avatar.z
|
||
local _direct = ""
|
||
local _angle = 0
|
||
--世界坐标系正X为up,正Z为left
|
||
if _direction.x == 0 then
|
||
if _direction.z >= 0 then
|
||
_direct = "left"
|
||
else _direct = "right"
|
||
end
|
||
else
|
||
_angle = math.deg(math.atan(_direction.z/_direction.x))
|
||
if math.abs(_angle) <= 45 then
|
||
if _direction.x > 0 then
|
||
_direct = "up"
|
||
else _direct = "down"
|
||
end
|
||
else
|
||
if _direction.z > 0 then
|
||
_direct = "left"
|
||
else _direct = "right"
|
||
end
|
||
end
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Get_Entity_Pos | _direct = ".._direct)
|
||
return _direct
|
||
end
|
||
|
||
function LF_Try_Push_Box(context, config_id, direction)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Try_Push_Box | config_id = "..config_id.." | direction = "..direction)
|
||
local _box = ScriptLib.GetPlatformPointArray(context, config_id)
|
||
local _box_point = _box[2]
|
||
local _is_found = false
|
||
--以i,j获取当前的坐标
|
||
for _j,_list in ipairs(point_map) do
|
||
if _is_found == true then
|
||
break
|
||
end
|
||
for _i,point in ipairs(_list) do
|
||
if point == _box_point then
|
||
--检测地图连通性
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Try_Push_Box | Point_Map_Pos | x=".._i.." | z=".._j)
|
||
local _connection = LF_Check_Target_Position(context, _i, _j, direction)
|
||
if #_connection == 2 then
|
||
--执行箱子移动
|
||
LF_Execute_Box_Move(context, config_id, {_i,_j}, _connection)
|
||
end
|
||
_is_found = true
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function LF_Check_Target_Position(context, x, z, forward)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Check_Target_Position | x="..x.."|z="..z.."|forward="..forward)
|
||
local res = {}
|
||
local _x = x
|
||
local _z = z
|
||
if forward == "up" then
|
||
_z = _z - 1
|
||
elseif forward == "down" then
|
||
_z = _z + 1
|
||
elseif forward == "right" then
|
||
_x = _x + 1
|
||
elseif forward == "left" then
|
||
_x = _x - 1
|
||
else
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : Invalid Box Direction !!! | forward="..forward)
|
||
return res
|
||
end
|
||
--判地图边界
|
||
if _x < 1 or _x > #level_map[z] or _z < 1 or _z > #level_map then
|
||
LF_Notify(context, defs.reminder_level_boarder)
|
||
return res
|
||
end
|
||
--判路点边界
|
||
if point_map[_z][_x] == 0 then
|
||
LF_Notify(context, defs.reminder_array_boarder)
|
||
return res
|
||
end
|
||
--判有无箱子
|
||
for _box,_pos in ipairs(box_config) do
|
||
if ScriptLib.GetGroupTempValue(context, "box_pos_x_".._box, {}) == _x and ScriptLib.GetGroupTempValue(context, "box_pos_z_".._box, {}) == _z then
|
||
LF_Notify(context, defs.reminder_box_conflict)
|
||
return res
|
||
end
|
||
end
|
||
res[1] = _x
|
||
res[2] = _z
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Check_Target_Position |_x=".._x.."|_z=".._z)
|
||
return res
|
||
end
|
||
|
||
function LF_Execute_Box_Move(context, config_id, source, vector)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Execute_Box_Move | config_id="..config_id)
|
||
--下option锁推箱子操作
|
||
LF_Lock_Operation(context, true)
|
||
ScriptLib.SetGroupGadgetStateByConfigId(context, 0, config_id, 201)
|
||
ScriptLib.SetGroupTempValue(context, "next_point_x", vector[1], {})
|
||
ScriptLib.SetGroupTempValue(context, "next_point_z", vector[2], {})
|
||
ScriptLib.SetPlatformPointArray(context, config_id, defs.point_array_id, {point_map[source[2]][source[1]] ,point_map[vector[2]][vector[1]]}, {})
|
||
--增加一个时间轴保底
|
||
ScriptLib.InitTimeAxis(context, tostring(config_id), {10}, true)
|
||
end
|
||
|
||
function LF_Lock_Operation(context, is_locked)
|
||
if is_locked == true then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Lock_Operation | is_locked = true")
|
||
for i,v in ipairs(box_config) do
|
||
ScriptLib.DelWorktopOptionByGroupId(context, 0, v.config_id, defs.option_id)
|
||
end
|
||
elseif is_locked == false then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Lock_Operation | is_locked = false")
|
||
for id,box in ipairs(box_config) do
|
||
ScriptLib.SetWorktopOptionsByGroupId(context, 0, box.config_id, {defs.option_id})
|
||
--停止时间轴
|
||
ScriptLib.EndTimeAxis(context, tostring(box.config_id))
|
||
--清空目标点cache
|
||
ScriptLib.SetGroupTempValue(context, "next_point_x", 0, {})
|
||
ScriptLib.SetGroupTempValue(context, "next_point_z", 0, {})
|
||
end
|
||
end
|
||
end
|
||
|
||
function LF_Level_Finish(context)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : LF_Level_Finish")
|
||
if init_config.end_suite ~= 0 then
|
||
ScriptLib.GoToGroupSuite(context, 0, init_config.end_suite)
|
||
end
|
||
end
|
||
|
||
--=====================================
|
||
function action_group_load(context, evt)
|
||
local cur_suite = ScriptLib.GetGroupSuite(context, 0)
|
||
if cur_suite ~= init_config.end_suite then
|
||
LF_Init_Level(context)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function action_group_refresh(context, evt)
|
||
local cur_suite = ScriptLib.GetGroupSuite(context, 0)
|
||
if cur_suite ~= init_config.end_suite then
|
||
LF_Init_Level(context)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function action_gadget_create(context, evt)
|
||
if gadgets[evt.param1].gadget_id == defs.box_gadget_id then
|
||
ScriptLib.SetWorktopOptionsByGroupId(context, 0, evt.param1, {defs.option_id})
|
||
return 0
|
||
end
|
||
return -1
|
||
end
|
||
|
||
function action_select_option(context, evt)
|
||
if evt.param2 ~= defs.option_id then
|
||
return -1
|
||
end
|
||
--获取玩家位置与箱子位置
|
||
local _avatar_pos = LF_Get_Entity_Pos(context, context.uid, 0)
|
||
local _box_pos = LF_Get_Entity_Pos(context, 0, evt.param1)
|
||
if _avatar_pos.error == 1 or _box_pos.error == 1 then
|
||
ScriptLib.PrintContextLog(context, "BoxPusher : Invalid entity pos !!!!")
|
||
return -1
|
||
end
|
||
--计算推动方向
|
||
local _dir = LF_Get_Push_Direction(context, _avatar_pos, _box_pos)
|
||
LF_Try_Push_Box(context, evt.param1, _dir)
|
||
return 0
|
||
end
|
||
|
||
function action_platform_reach_point(context, evt)
|
||
--记录下个理论点位
|
||
local _x = ScriptLib.GetGroupTempValue(context, "next_point_x", {})
|
||
local _z = ScriptLib.GetGroupTempValue(context, "next_point_z", {})
|
||
if _x == 0 or _z == 0 then
|
||
return -1
|
||
end
|
||
if point_map[_z][_x] == evt.param3 then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : reach point ".._x.."|".._z)
|
||
for idx,box in ipairs(box_config) do
|
||
if box.config_id == evt.param1 then
|
||
ScriptLib.SetGroupTempValue(context, "box_pos_x_"..idx, _x, {})
|
||
ScriptLib.SetGroupTempValue(context, "box_pos_z_"..idx, _z, {})
|
||
ScriptLib.SetGroupGadgetStateByConfigId(context, 0, evt.param1, 0)
|
||
LF_Lock_Operation(context, false)
|
||
return 0
|
||
end
|
||
end
|
||
end
|
||
--[[
|
||
--以i,j获取当前的坐标
|
||
for _j,_list in ipairs(point_map) do
|
||
for _i,point in ipairs(_list) do
|
||
if point == evt.param3 then
|
||
for m,n in ipairs(box_config) do
|
||
if n.config_id == evt.param1 then
|
||
--更新对应箱子信息,恢复交互与表现
|
||
ScriptLib.SetGroupTempValue(context, "box_pos_x_"..m, _i, {})
|
||
ScriptLib.SetGroupTempValue(context, "box_pos_z_"..m, _j, {})
|
||
ScriptLib.SetGroupGadgetStateByConfigId(context, 0, evt.param1, 0)
|
||
--#############
|
||
--正统推箱子此处要重新判断是否所有箱子抵达目标点队列
|
||
--LF_Check_Result()
|
||
--#############
|
||
LF_Lock_Operation(context, false)
|
||
return 0
|
||
end
|
||
end
|
||
--非box移动的异常情况
|
||
return -1
|
||
end
|
||
end
|
||
end]]
|
||
--非法路点的异常情况
|
||
return -1
|
||
end
|
||
|
||
--[[
|
||
function action_avatar_near_platform(context, evt)
|
||
for i,v in ipairs(box_config) do
|
||
if v.config_id == evt.param1 then
|
||
if ScriptLib.GetGadgetStateByConfigId(context, 0, evt.param1) == 201 then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : Reconect Error Reset")
|
||
LF_Lock_Operation(context, false)
|
||
return 0
|
||
end
|
||
end
|
||
end
|
||
return -1
|
||
end
|
||
]]
|
||
|
||
function action_time_axis_pass(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : TimeAxisPass -> "..evt.source_name)
|
||
if ScriptLib.GetGadgetStateByConfigId(context, 0, tonumber(evt.source_name)) ~= 201 then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : T.A.P fail by state")
|
||
return -1
|
||
end
|
||
local _x = 0
|
||
local _z = 0
|
||
for m,n in ipairs(box_config) do
|
||
if tostring(n.config_id) == evt.source_name then
|
||
_x = ScriptLib.GetGroupTempValue(context, "box_pos_x_"..m, {})
|
||
_z = ScriptLib.GetGroupTempValue(context, "box_pos_z_"..m, {})
|
||
break
|
||
end
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : Get Box Protected")
|
||
local _ret,R_pos,R_rot = ScriptLib.GetPlatformArrayInfoByPointId(context, defs.point_array_id, point_map[_z][_x])
|
||
local _eid = ScriptLib.GetEntityIdByConfigId(context, tonumber(evt.source_name))
|
||
local _pos = ScriptLib.GetPosByEntityId(context, _eid)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : Get Box Real Pos | ".._pos.x.." | ".._pos.z)
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : Get Box Theory Pos | "..R_pos.x.." | "..R_pos.z)
|
||
if math.ceil(_pos.x) ~= math.ceil(R_pos.x) or math.ceil(_pos.z) ~= math.ceil(R_pos.z) then
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : T.A.P fail by pos")
|
||
return -1
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## BoxPusher : T.A.P success")
|
||
LF_Lock_Operation(context, false)
|
||
return 0
|
||
end
|
||
|
||
Initialize() |