311 lines
11 KiB
Lua
311 lines
11 KiB
Lua
|
||
|
||
function warp_cubric_gate()
|
||
local isPartyRequired = tonumber(get_env("game.cubric_required_party")) or 1
|
||
local cubricNeededLevel = tonumber(get_env("game.cubric_required_level")) or 150
|
||
local playerLevel = gv("level")
|
||
|
||
if isPartyRequired == 0 then
|
||
if playerLevel >= cubricNeededLevel then
|
||
cprint( "@9830" ) -- <#6DD66D>Only players from your party will be able to join you inside the dungeon.<(version:7.4)>
|
||
dlg_special( 'confirm_window', 'warp_to_instance_dungeon(30000)', '@9825\v#@dungeon_name@#\v@80030000' )
|
||
else
|
||
cprint( "@9831" ) -- Only parties with Lv 150 and above characters can enter
|
||
return
|
||
end
|
||
else
|
||
if gv("party_id") == 0 or playerLevel < cubricNeededLevel then
|
||
cprint( "@9831" ) -- Only parties with Lv 150 and above characters can enter
|
||
return
|
||
else
|
||
cprint( "@9830" ) -- <#6DD66D>Only players from your party will be able to join you inside the dungeon.<(version:7.4)>
|
||
dlg_special( 'confirm_window', 'warp_to_instance_dungeon(30000)', '@9825\v#@dungeon_name@#\v@80030000' )
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
function on_create_cubric_instance( layer )
|
||
-- Cubric instance dungeon ID: 30000
|
||
set_instance_dungeon_flag( 30000, layer, 'QuestInProgressCount', 0 ) -- Track number of players currently doing quest 3607
|
||
set_instance_dungeon_flag( 30000, layer, 'AdditionalBossRespawned', 0 ) -- Track additional boss respawns to prevent overlapping spawns
|
||
set_instance_dungeon_flag( 30000, layer, 'ExitPropRespawned', 0 ) -- Track final exit prop respawn to prevent duplicates
|
||
set_instance_dungeon_flag( 30000, layer, 'MissionRevealed', 0 ) -- Track if the mission (kill both Arxha) has been revealed to players: 0: not activated, 1: active, 2: mission completed
|
||
|
||
end
|
||
|
||
|
||
-- If the joining player has the tracked quest, update internal dungeon variables
|
||
function on_join_cubric( layer )
|
||
-- If the newly joined player is currently doing quest 3607, reflect that in the dungeon state
|
||
-- If a player accepted the quest earlier but left before completing, they are counted
|
||
-- If the quest is already completed, they are not counted as in-progress
|
||
-- Return values for get_quest_progress:
|
||
-- -1: nothing / 0: accepted / 1: in-progress / 2: can complete / 100: failed / 255: already completed
|
||
if get_quest_progress( 3607 ) == 1 then
|
||
-- Cubric instance dungeon ID: 30000
|
||
set_instance_dungeon_flag( 30000, layer, 'QuestInProgressCount', get_instance_dungeon_flag( 30000, layer, 'QuestInProgressCount' ) + 1 )
|
||
|
||
end
|
||
|
||
-- If the mission UI is already active, display it for the joining player
|
||
if get_instance_dungeon_flag( 30000, layer, 'MissionRevealed' ) == 1 then
|
||
|
||
-- Mission title
|
||
send_mission_title( '@1234' )
|
||
|
||
-- 0: Haksa on the west
|
||
send_mission_objective( 0, 1, '@1235' )
|
||
-- 1: Haksa on the east
|
||
send_mission_objective( 1, 1, '@1236' )
|
||
-- 2: Boss room
|
||
send_mission_objective( 2, 1, '@1237' )
|
||
|
||
-- Mission reward info
|
||
send_mission_reward( '@1238' )
|
||
|
||
-- Update mission progress display for the player
|
||
update_cubric_mission( false, layer )
|
||
|
||
end
|
||
|
||
end
|
||
|
||
|
||
function on_leave_cubric( layer )
|
||
-- If the user who just left was on quest 3607, update the dungeon state variable
|
||
-- Users who accepted the quest but leave without completing it are counted
|
||
-- Users who have completed the quest are not counted as in-progress
|
||
-- (e.g., accepted quest, killed mobs, eligible for reward but left without claiming)
|
||
-- Return values: -1: nothing / 0: accepted / 1: in-progress / 2: can complete / 100: failed / 255: already completed
|
||
if get_quest_progress( 3607 ) == 1 then
|
||
-- Cubric instance dungeon ID: 30000
|
||
set_instance_dungeon_flag( 30000, layer, 'QuestInProgressCount', get_instance_dungeon_flag( 30000, layer, 'QuestInProgressCount' ) - 1 )
|
||
|
||
end
|
||
|
||
-- If the mission UI was active, close it
|
||
if get_instance_dungeon_flag( 30000, layer, 'MissionRevealed' ) == 1 then
|
||
|
||
send_mission_title( '' )
|
||
|
||
end
|
||
|
||
end
|
||
|
||
|
||
function cubric_check_respawn_group_clear( respawn_group, x, y, layer )
|
||
|
||
-- If a sub-boss group monster dies (respawn_group 1 or 2)
|
||
if respawn_group == 1 or respawn_group == 2 then
|
||
|
||
-- Open the prop that returns players to the branch room when a sub-boss dies
|
||
add_field_prop( 60156, 0, x, y, layer, 0 )
|
||
|
||
-- Update mission UI if necessary
|
||
update_cubric_mission( true, layer )
|
||
|
||
-- If a boss group monster dies (respawn_group 3)
|
||
elseif respawn_group == 3 then
|
||
|
||
-- Boss respawns only once, so no need to check if all are dead
|
||
-- If the Cubric dungeon quest is in progress, do not create an exit prop
|
||
-- If no players are currently on the quest, open a portal so players can leave
|
||
-- The quest used to determine progress is [ID:3607 <(version:7.4)> [Cubric] Demon Cube]
|
||
-- (Set up using QuestResource.script_start_text, script_end_text, script_drop_text)
|
||
if get_instance_dungeon_flag( 30000, layer, 'QuestInProgressCount' ) == 0 then
|
||
add_field_prop( 60102, 0, 99954, 31539, layer, 0 )
|
||
set_instance_dungeon_flag( 30000, layer, 'ExitPropRespawned', 1 )
|
||
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
function warp_to_cubric_branch_room( side )
|
||
|
||
local layer = gv( 'layer' )
|
||
|
||
-- Warp to the central room depending on the chosen side
|
||
if side == 1 then
|
||
warp( 98858, 30827, layer )
|
||
elseif side == 2 then
|
||
warp( 99180, 30825, layer )
|
||
end
|
||
|
||
-- If the mission UI is not yet active, activate it
|
||
if get_instance_dungeon_flag( 30000, layer, 'MissionRevealed' ) == 0 then
|
||
|
||
set_instance_dungeon_flag( 30000, layer, 'MissionRevealed', 1 )
|
||
|
||
-- Set the mission title
|
||
broadcast_mission_title( 1, '@1234', 30000, layer )
|
||
|
||
-- 0: Haksa on the west
|
||
broadcast_mission_objective( 1, 0, 1, '@1235', 30000, layer )
|
||
-- 1: Haksa on the east
|
||
broadcast_mission_objective( 1, 1, 1, '@1236', 30000, layer )
|
||
-- 2: Enter the boss room
|
||
broadcast_mission_objective( 1, 2, 1, '@1237', 30000, layer )
|
||
|
||
-- Show mission reward info
|
||
broadcast_mission_reward( 1, '@1238', 30000, layer )
|
||
|
||
-- Update mission progress
|
||
update_cubric_mission( true, layer )
|
||
|
||
end
|
||
|
||
end
|
||
|
||
|
||
-- Teleport to the boss room after killing both Haska
|
||
function warp_to_cubric_boss_room()
|
||
local layer = gv( 'layer' )
|
||
|
||
-- Warp into the boss room
|
||
warp( 99711, 31535, layer )
|
||
|
||
if get_instance_dungeon_flag( 30000, layer, 'MissionRevealed' ) == 1 then
|
||
|
||
-- Mission Completed
|
||
broadcast_mission_objective_progress( 1, 2, 1, 30000, layer )
|
||
|
||
-- Distribute mission rewards
|
||
do_each_player_in_instance_dungeon( 30000, layer, 'cubric_reward_distributer()' )
|
||
|
||
-- Change flag so mission UI is no longer active
|
||
set_instance_dungeon_flag( 30000, layer, 'MissionRevealed', 2 )
|
||
|
||
-- Deactivate mission UI
|
||
broadcast_mission_title( 1, '', 30000, layer )
|
||
|
||
end
|
||
end
|
||
|
||
|
||
function cubric_reward_distributer()
|
||
-- Quest reward: Level 150, around 1%
|
||
insert_gold( 300000 )
|
||
add_exp_jp( 5131363, 884717 )
|
||
cprint( '@1239' )
|
||
end
|
||
|
||
function update_cubric_mission( broadcast, layer )
|
||
|
||
-- If a mission isn’t in progress, there’s nothing in particular to notify
|
||
if get_instance_dungeon_flag( 30000, layer, 'MissionRevealed' ) ~= 1 then
|
||
return
|
||
end
|
||
|
||
if broadcast == true then
|
||
broadcast_mission_objective_progress( 1, 0, 1 - get_alive_instance_respawn_group_monster_count( 30000, layer, 1 ), 30000, layer )
|
||
broadcast_mission_objective_progress( 1, 1, 1 - get_alive_instance_respawn_group_monster_count( 30000, layer, 2 ), 30000, layer )
|
||
broadcast_mission_objective_progress( 1, 2, 0, 30000, layer )
|
||
|
||
else
|
||
send_mission_objective_progress( 0, 1 - get_alive_instance_respawn_group_monster_count( 30000, layer, 1 ) )
|
||
send_mission_objective_progress( 1, 1 - get_alive_instance_respawn_group_monster_count( 30000, layer, 2 ) )
|
||
send_mission_objective_progress( 2, 0 )
|
||
|
||
end
|
||
|
||
end
|
||
|
||
|
||
|
||
--------------------------------------------------------------------------------
|
||
----------------------------- Cubric dungeon props -----------------------------
|
||
--------------------------------------------------------------------------------
|
||
|
||
function cubric_dungeon_prop_activate( prop_id )
|
||
local cubricNeededLevel = tonumber(get_env("game.cubric_required_level")) or 150
|
||
local layer = gv("layer")
|
||
|
||
if prop_id == 60110 then -- Stone Door 8
|
||
warp_to_cubric_branch_room( 1 )
|
||
|
||
elseif prop_id == 60111 then -- Stone Door 8 (Butkadah's Door)
|
||
if get_alive_instance_respawn_group_monster_count( 30000, layer, 1 ) == 0 and get_alive_instance_respawn_group_monster_count( 30000, layer, 2 ) == 0 then
|
||
-- You touch the once-sealed door to Butkadah's chamber and a loud creak echoes through the room. Are you sure you want to enter?
|
||
dlg_special( 'confirm_window', 'warp_to_cubric_boss_room()', '@9828' )
|
||
|
||
else
|
||
dlg_general( '@9827' ) -- The door is sealed by the barriers Haksa and Askah have created.
|
||
return
|
||
end
|
||
|
||
elseif prop_id == 60144 then -- Stone Door 9-1
|
||
if get_quest_progress(3606) == 1 then -- <(version:7.4)>Escape Plan #2
|
||
set_quest_status( 3606, 1, 1 )
|
||
cprint( "@90605055" ) -- <#6DD66D>The ground shakes under your feet.
|
||
|
||
else
|
||
-- Entrance 9-1
|
||
warp(99018 , 30995, layer )
|
||
end
|
||
|
||
elseif prop_id == 60145 then -- Stone Door 10-1
|
||
warp_to_cubric_branch_room( 2 )
|
||
|
||
elseif prop_id == 60155 then -- Askah Portal
|
||
-- You sense that this portal will take you to the entrance to Butkadah's chamber. Do you want to step through the portal?
|
||
dlg_special( 'confirm_window', 'warp_to_cubric_branch_room( 1 )', '@9829' )
|
||
|
||
elseif prop_id == 60156 then -- Haksa Portal
|
||
-- You sense that this portal will take you to the entrance to Butkadah's chamber. Do you want to step through the portal?
|
||
dlg_special( 'confirm_window', 'warp_to_cubric_branch_room( 2 )', '@9829' )
|
||
|
||
else
|
||
|
||
local propsMap = {}
|
||
propsMap[60103] = { 97636, 29721 } -- Stone Door 1
|
||
propsMap[60104] = { 98246, 30030 } -- Stone Door 2
|
||
propsMap[60105] = { 98259, 30744 } -- Stone Door 3
|
||
propsMap[60106] = { 98246, 31311 } -- Stone Door 4
|
||
propsMap[60107] = { 98672, 31728 } -- Stone Door 5
|
||
propsMap[60108] = { 97806, 31540 } -- Stone Door 6 (Haksa's Door)
|
||
propsMap[60109] = { 97640, 30964 } -- Stone Door 7
|
||
|
||
propsMap[60112] = { 99866, 30628 } -- Stone Door 10
|
||
propsMap[60113] = { 99969, 30079 } -- Stone Door 11
|
||
propsMap[60114] = { 100455, 29927 } -- Stone Door 12
|
||
propsMap[60115] = { 100566, 30354 } -- Stone Door 13
|
||
propsMap[60116] = { 100945, 30479 } -- Stone Door 14
|
||
propsMap[60117] = { 101069, 30053 } -- Stone Door 15
|
||
propsMap[60118] = { 100682, 29926 } -- Stone Door 16
|
||
propsMap[60119] = { 101517, 30243 } -- Stone Door 17
|
||
propsMap[60120] = { 101511, 31012 } -- Stone Door 18 (Askah's Door)
|
||
|
||
propsMap[60136] = { 97307, 29997 } -- Stone Door 1-1
|
||
propsMap[60137] = { 97880, 29729 } -- Stone Door 2-1
|
||
propsMap[60138] = { 98248, 30374 } -- Stone Door 3-1
|
||
propsMap[60139] = { 98259, 30978 } -- Stone Door 4-1
|
||
propsMap[60140] = { 98388, 31423 } -- Stone Door 5-1
|
||
propsMap[60141] = { 98147, 31425 } -- Stone Door 6-1
|
||
propsMap[60142] = { 97623, 31352 } -- Stone Door 7-1
|
||
propsMap[60143] = { 98386, 30851 } -- Stone Door 8-1
|
||
|
||
propsMap[60146] = { 99967, 30507 } -- Stone Door 11-1
|
||
propsMap[60147] = { 100144, 29929 } -- Stone Door 12-1
|
||
propsMap[60148] = { 100567, 30053 } -- Stone Door 13-1
|
||
propsMap[60149] = { 100687, 30476 } -- Stone Door 14-1
|
||
propsMap[60150] = { 101069, 30363 } -- Stone Door 15-1
|
||
propsMap[60151] = { 100950, 29928 } -- Stone Door 16-1
|
||
propsMap[60152] = { 101195, 30477 } -- Stone Door 17-1
|
||
propsMap[60153] = { 101067, 30597 } -- Stone Door 18-1
|
||
|
||
|
||
local coordinates = propsMap[prop_id]
|
||
if coordinates then
|
||
warp(coordinates[1], coordinates[2], layer )
|
||
|
||
else
|
||
private_notice("[Error] Prop not found! Prop ID: " .. prop_id .. "! Contact developers please!")
|
||
end
|
||
end
|
||
|
||
end
|
||
|
||
|