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/V2_0/TemariChallenge.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

672 lines
29 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.

--2.0奥博伦派对玩法
--local defs = {
-- group_id = 111101122 ,
-- tamari_gadget_id = defs.temari_gadget_id,
-- host_option_id = 184,
-- guset_option_id = 185,
-- host_chest_id = 122001,
--}
local tempDefs = {
pre_quest = 7217605,
host_option = 2351,
guest_option = 2350,
find_ball_challenge_offline = 244,
hide_ball_challenge = 236,
find_ball_challenge = 235,
father_hide_ball_challenge = 242,
father_find_ball_challenge = 243,
challenge_time = 30
}
local chests = {}
local temari_gadgets = {}
local Tri1 = {
[1] = { name = "group_load", config_id = 8000001, event = EventType.EVENT_GROUP_LOAD, source = "", condition = "", action = "action_group_load", trigger_count = 0},
[2] = { name = "quest_finish", config_id = 8000002, event = EventType.EVENT_QUEST_FINISH, source = "",condition = "",action = "action_quest_finish",trigger_count= 0},
}
local Tri2 = {
[1] = { name = "quest_start", config_id = 8000003, event = EventType.EVENT_QUEST_START, source = "",condition = "",action = "action_quest_start",trigger_count= 0},
[2] = { name = "challenge_success", config_id = 8000004, event = EventType.EVENT_CHALLENGE_SUCCESS, source = "",condition = "",action = "action_challenge_success",trigger_count= 0},
[3] = { name = "challenge_fail", config_id = 8000005, event = EventType.EVENT_CHALLENGE_FAIL, source = "",condition = "",action = "action_challenge_fail",trigger_count= 0},
[4] = { name = "select_option", config_id = 8000006, event = EventType.EVENT_SELECT_OPTION, source = "", condition = "", action = "action_select_option", trigger_count = 0, forbid_guest = false },
[5] = { name = "group_refresh", config_id = 8000007, event = EventType.EVENT_GROUP_REFRESH, source = "", condition = "", action = "action_group_refresh", trigger_count = 0},
[6] = { name = "gadget_create", config_id = 8000008, event = EventType.EVENT_GADGET_CREATE, source = "", condition = "", action = "action_gadget_create", trigger_count = 0},
}
function Initialize()
for k,v in pairs(Tri1) do
table.insert(triggers, v)
table.insert(suites[1].triggers, v.name)
end
for k,v in pairs(Tri2) do
table.insert(triggers, v)
table.insert(suites[2].triggers, v.name)
end
table.insert(chests,defs.chest_1)
table.insert(chests,defs.chest_2)
table.insert(chests,defs.chest_3)
--table.insert(chests,defs.chest_online)
table.insert(temari_gadgets,defs.temari_1)
table.insert(temari_gadgets,defs.temari_2)
table.insert(temari_gadgets,defs.temari_3)
table.insert(temari_gadgets,defs.temari_online)
table.insert(variables,{ config_id=50000001,name = "has_hidden", value = 0,no_refresh = true})
--记录uid的低四位
table.insert(variables,{ config_id=50000002,name = "challenger_uid1", value = 0})
--记录uid的高位challenger_uid2*10000+challenger_uid就是最后正确的uid
table.insert(variables,{ config_id=50000003,name = "challenger_uid2", value = 0})
--记录放球的小数位
table.insert(variables,{ config_id=50000004,name = "pos_x1", value = 0})
table.insert(variables,{ config_id=50000005,name = "pos_z1", value = 0})
end
--------------------------------------------------------------------
--group load时无事发生
function action_group_load(context,evt)
ScriptLib.PrintContextLog(context,"TMR: Group Load!")
LF_Initiate_Play(context)
return 0
end
--group refresh时重置group状态回到第一关
function action_group_refresh(context,evt)
ScriptLib.PrintContextLog(context,"TMR: Group Refresh!")
LF_Reset_Group(context)
return 0
end
--任务开始时,加载下一关(单机挑战)
function action_quest_start(context,evt)
ScriptLib.PrintContextLog(context,"TMR: Player has triggered some quest!!")
--校验一下任务id确保是奥博伦任务触发的任务开始
if string.sub(evt.param1,1,5) == tostring(defs.FatherQuest) then
ScriptLib.PrintContextLog(context,"TMR: Triggered quest is :"..evt.param1)
LF_Set_Challenge_State(context,1)
LF_Load_Next_Level(context)
LF_Start_Challenge(context,0)
end
return 0
end
--操作台创建时,直接挂选项
function action_gadget_create(context,evt)
if (evt.param1 == defs.temari_gadget_id) then
LF_Set_Gadget_Option(context)
end
return 0
end
function action_quest_finish(context,evt)
ScriptLib.PrintContextLog(context,"TMR: pre quest has been finished, load the second suite!!")
if (evt.param1 == tempDefs.pre_quest) then
LF_Initiate_Play(context)
end
return 0
end
--选择了选项,根据当前主客机,触发不同的挑战(联机挑战)
function action_select_option(context,evt)
--试图开启主机藏球挑战
if evt.param2 == tempDefs.host_option then
--藏球挑战
if LF_Is_Host(context) then
if LF_Get_Challenge_State(context) == 10 or LF_Get_Challenge_State(context) == 12 then
--仅在联机玩法初始化以及主机已完成藏球的情况下,可以开启藏球挑战
ScriptLib.PrintContextLog(context,"TMR: !!!!!!!!!!!!Hide ball challenge starts!!!!!!!")
LF_Load_Online_Level(context,1)
LF_Set_Challenge_State(context,11)
LF_Start_Challenge(context,1)
ScriptLib.DelWorktopOptionByGroupId(context,defs.group_id,defs.temari_gadget_id,tempDefs.host_option)
elseif LF_Get_Challenge_State(context) == 11 then
--主机在藏球挑战中再次交互,试图开启藏球挑战(理论上不存在这种情况)
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!! Cannot start duplicated challenges!!!")
elseif LF_Get_Challenge_State(context) == 13 then
--客机正在找球,不允许主机开启藏球挑战
ScriptLib.SendServerMessageByLuaKey(context, "GUEST_CHALLENGING", {context.uid})
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!! Guest is challenging!!!")
end
else
--客机不能开启主机的藏球挑战
ScriptLib.SendServerMessageByLuaKey(context, "HOST_ONLY_CHALLENGE", {context.uid})
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!!! Guest cannot hide ball!")
end
end
if evt.param2 == tempDefs.guest_option then
--找球挑战(允许主机也开启挑战,因此这里不做主客机的区分)
if LF_Get_Challenge_State(context)==12 then
--主机已完成藏球,可以开始挑战
ScriptLib.PrintContextLog(context,"TMR: !!!!!!!!!!!Find ball challenge starts!!!!!!!!!!!!")
LF_Load_Online_Level(context,2)
local ret = LF_Start_Challenge(context,2)
if (ret == -1) then
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!!! Same gallery is activating!")
LF_Online_Hide_Level(context)
return 0
end
LF_Set_Challenge_State(context,13)
ScriptLib.DelWorktopOptionByGroupId(context,defs.group_id,defs.temari_gadget_id,tempDefs.guest_option)
elseif LF_Get_Challenge_State(context)== 10 then
--主机没有藏球,不能挑战
ScriptLib.SendServerMessageByLuaKey(context, "LEVEL_NOT_SETTLED", {context.uid})
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!!! Host hasn't hide the ball!")
elseif LF_Get_Challenge_State(context)== 11 then
--主机正在藏球,不能挑战
ScriptLib.SendServerMessageByLuaKey(context, "LEVEL_SETTLING", {context.uid})
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!!! Host is hiding the ball!")
elseif LF_Get_Challenge_State(context)== 13 then
--挑战中试图再开启一个找球挑战,理论上不存在这种情况
ScriptLib.PrintContextLog(context,"TMR: CHALLENGE FAILS!!!! Cannot start duplicated challenges!!!")
end
end
return 0
end
--分别处理单机玩法和联机玩法挑战失败的情况
function action_challenge_fail(context,evt)
if LF_Get_Play_Phase(context) == 1 then
if evt.param1 == tempDefs.find_ball_challenge_offline then
ScriptLib.PrintContextLog(context,"TMR: Offline Challenge fails!")
LF_Stop_Temari_Gallery(context)
LF_Update_Quest_State(context,false)
end
else
--联机挑战阶段挑战失败
if evt.param1 == tempDefs.father_hide_ball_challenge then
--藏球失败
ScriptLib.PrintContextLog(context,"TMR: Host Challenge fails!")
--创建一个藏球宝箱 5.27需求,不需要联机奖励宝箱了
--ScriptLib.CreateGadget(context,{config_id=chests[#chests]})
--修改挑战状态。如果玩家至少藏过一次球则即使失败也将状态置为12即藏过球否则置为10认为没有藏球
if (LF_Has_Hidden_Ball(context)) then
LF_Set_Challenge_State(context,12)
else
LF_Set_Challenge_State(context,10)
end
LF_Set_Gadget_Option(context)
--移除掉联机用的关卡布设
LF_Online_Hide_Level(context)
--LF_Teleport_Player(context)
end
if evt.param1 == tempDefs.father_find_ball_challenge then
--客机找球挑战失败
ScriptLib.PrintContextLog(context,"TMR: Guest Challenge fails!")
LF_Set_Challenge_State(context,12)
--移除掉联机用的关卡布设
LF_Online_Hide_Level(context)
LF_Set_Gadget_Option(context)
LF_Stop_Temari_Gallery(context)
end
end
return 0
end
--分别处理单机玩法和联机玩法挑战成功的情况
function action_challenge_success(context,evt)
ScriptLib.PrintContextLog(context,"TMR: Some challenge has been finished!!!")
if LF_Get_Play_Phase(context) == 1 then
if evt.param1 == tempDefs.find_ball_challenge_offline then
ScriptLib.PrintContextLog(context,"TMR: Offline Challenge success!")
LF_Stop_Temari_Gallery(context)
LF_Update_Quest_State(context,true)
--创建一个单机找球挑战宝箱,仅单机挑战的最后一关给一个宝箱
if (LF_Get_OfflineChallenge_Level(context)-2 == 3) then
ScriptLib.CreateGadget(context,{config_id=chests[LF_Get_OfflineChallenge_Level(context)-2]})
end
end
else
--联机挑战阶段挑战成功
if evt.param1 == tempDefs.father_hide_ball_challenge then
--藏球挑战成功
ScriptLib.PrintContextLog(context,"TMR: Host Challenge finishes!")
--创建一个藏球宝箱 5.27需求,不需要联机奖励宝箱了
--ScriptLib.CreateGadget(context,{config_id=chests[#chests]})
--修改挑战状态
LF_Set_Challenge_State(context,12)
LF_Set_Gadget_Option(context)
LF_Teleport_Player(context)
end
if evt.param1 == tempDefs.father_find_ball_challenge then
--找球挑战成功挑战状态回到12
ScriptLib.PrintContextLog(context,"TMR: Guest Challenge success!")
LF_Set_Challenge_State(context,12)
--移除掉联机用的关卡布设
LF_Online_Hide_Level(context)
LF_Set_Gadget_Option(context)
LF_Stop_Temari_Gallery(context)
end
end
return 0
end
--------------------------------------------------------------------
--辅助方法-----------------------------------------------------------
--------------------------------------------------------------------
--关卡相关方法---------------------------------------------------
--初始化整个玩法的方法仅当groupload时调用
function LF_Initiate_Play(context)
local uidList = ScriptLib.GetSceneUidList(context)
--上线的时候如果同时group load可能找不到uidlist做一个保护
if (uidList == nil or #uidList == 0) then
return 0
end
local avatar_entity = ScriptLib.GetAvatarEntityIdByUid(context, uidList[1])
local quest_state = ScriptLib.GetQuestState(context, avatar_entity, tempDefs.pre_quest)
ScriptLib.PrintContextLog(context,"TMR: Prequest state is: "..quest_state)
if ScriptLib.GetQuestState(context, avatar_entity, tempDefs.pre_quest) == QuestState.FINISHED then
ScriptLib.PrintContextLog(context,"TMR: pre quest has been finished, group load!!")
local ret = ScriptLib.GoToGroupSuite(context,defs.group_id,2)
--将当前suite切换到2确保下一次从suite3开始加载
LF_Set_OfflineChallenge_Level(context,2)
ScriptLib.PrintContextLog(context,"TMR: The result of loading suite 2 : "..ret)
end
end
--加载单机挑战的下一个关卡
function LF_Load_Next_Level(context)
local curLevel = LF_Get_OfflineChallenge_Level(context)
curLevel = curLevel + 1
ScriptLib.PrintContextLog(context,"TMR: Ready to load SUITE: "..curLevel)
LF_Set_OfflineChallenge_Level(context,curLevel)
ScriptLib.AddExtraGroupSuite(context,defs.group_id,curLevel)
end
--初始化联机玩法
function LF_Initiate_Online_Challenge(context)
--把交互用的奥博伦球创建出来
ScriptLib.CreateGadget(context,{config_id = defs.temari_gadget_id})
--给奥博伦交互球设置选项
LF_Set_Gadget_Option(context)
end
--加载联机挑战的关卡
--phase = 1主机藏球挑战phase = 2客机找球挑战
function LF_Load_Online_Level(context,phase)
if ( phase == 1 ) then
--加载最后一组suite和LD约定最后一组suite为联机关卡
ScriptLib.AddExtraGroupSuite(context,0,#suites)
--去掉场景内现在藏着的球
ScriptLib.KillEntityByConfigId(context,{config_id = defs.temari_online})
else
--加载最后一组suite和LD约定最后一组suite为联机关卡
ScriptLib.AddExtraGroupSuite(context,0,#suites)
--把存储的球的位置加载出来
local pos = LF_Load_Online_Temari_Pos(context)
ScriptLib.CreateGadgetByConfigIdByPos(context, defs.temari_online, {x=pos.x,y=pos.y,z=pos.z}, {x=0,y=0,z=0})
end
end
--重置整个group的方法将group还原至最初的状态
function LF_Reset_Group(context)
if LF_Get_Play_Phase(context) == 1 then
LF_Set_OfflineChallenge_Level(context,2)
LF_Set_Challenge_State(context,0)
else
--移除掉联机用的关卡布设
ScriptLib.RemoveExtraGroupSuite(context,0,#suites)
ScriptLib.KillEntityByConfigId(context,{config_id = defs.temari_online})
LF_Set_Challenge_State(context,10)
LF_Set_Gadget_Option(context)
end
end
--gallery/challenge/quest相关方法--------------------------------------------------
--启动挑战的方法,对于联机挑战,需要把启动的子挑战挂在父挑战上一起启动。
--target:0单机找球1联机藏球2联机找球
function LF_Start_Challenge(context,target)
if LF_Get_Play_Phase(context) == 1 then
--要求开启挑战,因为是单机的,直接开就可以了
ScriptLib.ActiveChallenge(context,tempDefs.find_ball_challenge_offline,tempDefs.find_ball_challenge_offline,tempDefs.challenge_time, 0, tempDefs.find_ball_challenge_offline, 1)
LF_Start_Temari_Gallery(context)
else
if (target == 2) then
local ret = LF_Start_Temari_Gallery(context)
--如果gallery没有开出来说明同scene下已经有一个同名gallery了整个玩法都不允许开启
if (ret == -1) then
return -1
end
--开启挑战的时候存一下开启挑战者的uid
LF_Save_Challenger(context)
end
--联机状态下,要把子挑战挂给父挑战后再开启
local challenge = 0
local father_challenge = 0
if (target == 1) then
challenge = tempDefs.hide_ball_challenge
father_challenge = tempDefs.father_hide_ball_challenge
elseif target == 2 then
challenge = tempDefs.find_ball_challenge_offline
father_challenge = tempDefs.father_find_ball_challenge
end
local child_challenge_param_table = {tempDefs.challenge_time,0,challenge,1}
ScriptLib.CreateFatherChallenge(context, father_challenge, father_challenge, tempDefs.challenge_time, {success=2, fail=1})
ScriptLib.AttachChildChallenge(context, father_challenge, challenge, challenge, child_challenge_param_table, {context.uid},{success=1, fail=1})
ScriptLib.StartFatherChallenge(context,father_challenge)
end
return 0
end
--终止挑战的方法challenge目标的挑战ID
--target: 0:单机挑战1联机藏球2联机找球
--resulttrue=1false=0
function LF_Stop_Challenge(context,target,result)
if LF_Get_Play_Phase(context) == 1 then
--单机的直接关掉即可
ScriptLib.PrintContextLog(context,"TMR: Stop offline challenge here!!!")
ScriptLib.StopChallenge(context,tempDefs.find_ball_challenge_offline,result)
else
if (target == 1) then
--结束联机藏球挑战
ScriptLib.PrintContextLog(context,"TMR: Stop hide ball challenge with result: "..result)
ScriptLib.StopChallenge(context,tempDefs.father_hide_ball_challenge,result)
elseif (target == 2) then
--结束联机找球挑战
ScriptLib.PrintContextLog(context,"TMR: Stop find ball challenge with result: "..result)
ScriptLib.StopChallenge(context,tempDefs.father_find_ball_challenge,result)
end
end
end
--启动藏球的方向指示gallery
function LF_Start_Temari_Gallery(context)
local ret = ScriptLib.SetPlayerStartGallery(context, 9001, {context.uid})
--如果gallery没有开出来说明同scene下已经有一个同名gallery了整个玩法都不允许开启
if (ret == -1) then
return -1
end
local temari_pos = LF_Get_Temari_Pos(context)
ScriptLib.SetHandballGalleryBallPosAndRot(context, 9001, {x=temari_pos.x,y=temari_pos.y,z=temari_pos.z}, {x=0,y=0,z=0})
end
--关闭藏球的方向指示gallery
function LF_Stop_Temari_Gallery(context)
ScriptLib.StopGallery(context, 9001, true)
end
--根据参数更新单机挑战的任务状态传入true为成功、false为失败
function LF_Update_Quest_State(context, questState)
local curLevel = LF_Get_OfflineChallenge_Level(context)
local quest_level = curLevel-2
local quest_suffix = "01"
if (questState) then
quest_suffix = "01"
else
quest_suffix = "02"
end
local quest_param = defs.group_id.."0"..quest_level..quest_suffix
local ret = ScriptLib.AddQuestProgress(context,quest_param)
ScriptLib.PrintContextLog(context,"TMR: quest param is "..quest_param)
ScriptLib.PrintContextLog(context,"TMR: The result of Adding quest progress is "..ret)
--不论挑战是否胜利,都要移除掉当前加载的关卡
ScriptLib.PrintContextLog(context,"TMR: The removed suite is "..curLevel)
ScriptLib.RemoveExtraGroupSuite(context,defs.group_id,curLevel)
--如果胜利且是单机挑战的最后一个suite胜利后直接进入联机玩法状态
if (questState) then
if (curLevel+1>=#suites) then
ScriptLib.PrintContextLog(context,"TMR:!!!!!!!!!!!!!!!!!Offline challenge has finished!!!!!!!!!!!!!!!!")
LF_Set_Challenge_State(context,10)
LF_Initiate_Online_Challenge(context)
end
end
--如果挑战失败,要将当前的关卡向前回滚一关,这样下次开启任务才能再次开启当前关卡
if (not questState) then
LF_Set_OfflineChallenge_Level(context,curLevel-1)
end
end
--通用类方法-----------------------------------------------------------
--将玩家传送回奥博伦球控制台附近
function LF_Teleport_Player(context)
local temari_worktop_id = ScriptLib.GetEntityIdByConfigId(context,defs.temari_gadget_id)
local temari_pos = ScriptLib.GetPosByEntityId(context, temari_worktop_id)
local uidlist = ScriptLib.GetSceneUidList(context)
ScriptLib.PrintContextLog(context,"TMR: Current host player is :"..uidlist[1])
ScriptLib.PrintContextLog(context,"TMR: The context uid is: "..context.uid)
if (LF_Is_Host(context)) then
ScriptLib.TransPlayerToPos(context, {uid_list = {uidlist[1]}, pos = {x=temari_pos.x,y=temari_pos.y,z=temari_pos.z}, radius = 1, rot = {x=0, y=0, z=1},is_skip_ui=false} )
else
ScriptLib.TransPlayerToPos(context, {uid_list = {context.uid}, pos = {x=temari_pos.x,y=temari_pos.y,z=temari_pos.z}, radius = 1, rot = {x=0, y=0, z=1},is_skip_ui=false} )
end
end
--给奥博伦球gadget设置选项
function LF_Set_Gadget_Option(context)
ScriptLib.SetWorktopOptionsByGroupId(context,defs.group_id,defs.temari_gadget_id,{tempDefs.guest_option,tempDefs.host_option})
end
--联机玩法中,隐藏关卡配置的方法,调用后隐藏掉当前的关卡配置以及放着的球
function LF_Online_Hide_Level(context)
--干掉藏起来的球
ScriptLib.RemoveEntityByConfigId(context, 0, EntityType.GADGET, defs.temari_online)
--干掉放置用关卡
ScriptLib.RemoveExtraGroupSuite(context,0,#suites)
end
--通用的放球方法,把球放下来并记录其位置
function LF_Hide_Ball(context)
local uid_list = ScriptLib.GetSceneUidList(context)
local avatar_id = ScriptLib.GetAvatarEntityIdByUid(context, uid_list[1])
local pos = ScriptLib.GetPosByEntityId(context, avatar_id)
ScriptLib.CreateGadgetByConfigIdByPos(context, defs.temari_online, {x=pos.x+1,y=pos.y+1.5,z=pos.z}, {x=0,y=0,z=0})
--存一下球的位置,马上要销毁掉
LF_Save_Online_Temari_Pos(context)
LF_Online_Hide_Level(context)
end
--挑战开启时,将挑战者记录下来
function LF_Save_Challenger(context)
ScriptLib.PrintContextLog(context,"TMR: Save challenger uid: "..context.uid)
--拆一下uid存下来防止位数超了
local uid1 = context.uid % 10000 --低位
local uid2 = math.floor(context.uid / 10000) --高位
ScriptLib.SetGroupVariableValue(context,"challenger_uid1",uid1)
ScriptLib.SetGroupVariableValue(context,"challenger_uid2",uid2)
ScriptLib.PrintContextLog(context,"TMR: Saving uid2"..uid2)
ScriptLib.PrintContextLog(context,"TMR: Saving uid1"..uid1)
end
function LF_Is_Same_Challenger(context)
local uid1 = ScriptLib.GetGroupVariableValue(context,"challenger_uid1")
local uid2 = ScriptLib.GetGroupVariableValue(context,"challenger_uid2")
local uid = uid2 * 10000 + uid1
ScriptLib.PrintContextLog(context,"TMR: Player touching ball is: "..context.uid.." and the player set ball is "..uid)
return context.uid == uid
end
-----CRUD类方法-----------------------------------------------------------
--改变当前玩法状态
--0group初始化状态完全没有开始
--1单机挑战进行中用level参数确定当前正在进行的单机关卡数
--10已完成单机挑战联机挑战未开启
--11主机进行藏球挑战
--12主机已完成藏球
--13客机进行找球挑战
function LF_Set_Challenge_State(context,target_state)
ScriptLib.PrintContextLog(context,"TMR: Changing play state to: "..target_state)
ScriptLib.SetGroupVariableValue(context,"ChallengeState",target_state)
end
--获取当前玩法状态
--0group初始化状态完全没有开始
--1单机挑战进行中用level参数确定当前正在进行的单机关卡数
--10已完成单机挑战联机挑战未开启
--11主机进行藏球挑战
--12主机已完成藏球
--13客机进行找球挑战
function LF_Get_Challenge_State(context)
return ScriptLib.GetGroupVariableValue(context,"ChallengeState")
end
--设置单机挑战的当前关卡
function LF_Set_OfflineChallenge_Level(context,targetLevel)
ScriptLib.SetGroupVariableValue(context,"ChallengeLevel",targetLevel)
end
--读取单机挑战的当前关卡
function LF_Get_OfflineChallenge_Level(context)
return ScriptLib.GetGroupVariableValue(context,"ChallengeLevel")
end
--返回当前关卡的手鞠球位置
function LF_Get_Temari_Pos(context)
if (LF_Get_Play_Phase(context) == 1) then
--一阶段获取手鞠球的位置
local curLevel = LF_Get_OfflineChallenge_Level(context)
local temari_entity_id = ScriptLib.GetEntityIdByConfigId(context,temari_gadgets[curLevel-2])
local temari_pos = ScriptLib.GetPosByEntityId(context, temari_entity_id)
ScriptLib.PrintContextLog(context,"TMR: Temari pos: "..temari_pos.x..","..temari_pos.y..","..temari_pos.z)
return temari_pos
else
--二阶段获取手鞠球的位置
local temari_entity_id = ScriptLib.GetEntityIdByConfigId(context,defs.temari_online)
local temari_pos = ScriptLib.GetPosByEntityId(context, temari_entity_id)
ScriptLib.PrintContextLog(context,"TMR: Temari pos: "..temari_pos.x..","..temari_pos.y..","..temari_pos.z)
return temari_pos
end
end
--存储联机玩法中当前球的位置
function LF_Save_Online_Temari_Pos(context)
local pos = LF_Get_Temari_Pos(context)
ScriptLib.PrintContextLog(context,"TMR: Save Temari pos: "..pos.x..","..pos.y..","..pos.z)
local ret = ScriptLib.SetGroupVariableValue(context,"pos_x",math.floor(pos.x))
ScriptLib.SetGroupVariableValue(context,"pos_y",math.ceil(pos.y))
ScriptLib.SetGroupVariableValue(context,"pos_z",math.floor(pos.z))
ScriptLib.SetGroupVariableValue(context,"pos_x1",math.floor((pos.x-math.floor(pos.x))*10))
ScriptLib.SetGroupVariableValue(context,"pos_z1",math.floor((pos.z-math.floor(pos.z))*10))
ScriptLib.PrintContextLog(context,"TMR: set pos ret = "..ret)
end
--读取联机玩法中当前球的位置
function LF_Load_Online_Temari_Pos(context)
local pos_x = ScriptLib.GetGroupVariableValue(context,"pos_x")
local pos_y = ScriptLib.GetGroupVariableValue(context,"pos_y")
local pos_z = ScriptLib.GetGroupVariableValue(context,"pos_z")
local pos_x1 = ScriptLib.GetGroupVariableValue(context,"pos_x1")/10
local pos_z1 = ScriptLib.GetGroupVariableValue(context,"pos_z1")/10
ScriptLib.PrintContextLog(context,"TMR: Load Temari pos: "..pos_x+pos_x1..","..pos_y..","..pos_z+pos_z1)
local pos = {x=pos_x+pos_x1,y=pos_y,z=pos_z+pos_z1}
return pos
end
--返回玩家是否至少藏了一次球
function LF_Has_Hidden_Ball(context)
if ScriptLib.GetGroupVariableValue(context,"has_hidden")==1 then
return true
else
return false
end
end
--返回当前整体玩法进度
--phase1单机挑战阶段
--phase2联机挑战阶段phase 2下刷新group不会再回到phase 1
function LF_Get_Play_Phase(context)
if (LF_Get_Challenge_State(context)<10) then
return 1
else
return 2
end
end
--返回当前(触发事件)的玩家是否是主机
function LF_Is_Host(context)
local uid_List = ScriptLib.GetSceneUidList(context)
local host_id = uid_List[1]
ScriptLib.PrintContextLog(context,"TMR: Current user id is "..context.uid)
ScriptLib.PrintContextLog(context,"TMR: Host user id is "..host_id)
return (host_id==context.uid) or (context.uid == 0)
end
--------------------------------------------------------------------
--server lua call---------------------------------------------------
--找球胜利通过球自身的ability调用调用时需要判定当前玩家主客机如果是主机则无事发生
function SLC_Find_Ball(context)
if LF_Get_Play_Phase(context) == 1 then
ScriptLib.PrintContextLog(context,"TMR: Player has found the ball!")
local curLevel = LF_Get_OfflineChallenge_Level(context)
ScriptLib.KillEntityByConfigId(context,{config_id = temari_gadgets[curLevel-2]})
LF_Stop_Challenge(context,0,1)
else
--联机情况下,判断挑战开启者和碰到球的是否是一个人,如果不是则无事发生
if (LF_Is_Same_Challenger(context)) then
ScriptLib.PrintContextLog(context,"TMR: Guest has found the ball!")
ScriptLib.KillEntityByConfigId(context,{config_id = defs.temari_online})
--成就相关,如果当前完成的玩家并不是主机,则发送一次成就完成的消息
if (not LF_Is_Host(context)) then
ScriptLib.MarkPlayerAction(context, 6018 , 3 , 1)
end
LF_Stop_Challenge(context,2,1)
end
end
return 0
end
--放球的server lua call被主机的E技能键调用
function SLC_Hide_Ball(context)
local avatar_id = ScriptLib.GetAvatarEntityIdByUid(context, context.uid)
local pos = ScriptLib.GetPosByEntityId(context, avatar_id)
ScriptLib.CreateGadgetByConfigIdByPos(context, defs.temari_online, {x=pos.x,y=pos.y+1,z=pos.z}, {x=0,y=0,z=0})
----存一下球的位置,马上要销毁掉
LF_Save_Online_Temari_Pos(context)
LF_Stop_Challenge(context,1,1)
LF_Online_Hide_Level(context)
--藏球后将藏球的标志置为1说明玩家至少藏了一次球
ScriptLib.SetGroupVariableValue(context,"has_hidden",1)
return 0
end
--------------------------------------------------------------------
Initialize()