Files
gtav-src/script/dev_ng/singleplayer/scripts/floatinghelp/floating_help_controller.sc
T
2025-09-29 00:52:08 +02:00

215 lines
9.1 KiB
Python
Executable File

USING "help_at_location.sch"
USING "commands_hud.sch"
USING "commands_script.sch"
USING "script_maths.sch"
USING "script_player.sch"
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
#ENDIF
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widget_debug
INT i_debug_slot = -1
INT i_debug_duration = DEFAULT_HELP_TEXT_TIME
INT i_debug_arrow_dir = 0
BOOL b_debug_print_help = FALSE
BOOL b_debug_clear_help = FALSE
BOOL b_debug_use_2d_offset = FALSE
BOOL b_debug_use_screen_offset = FALSE
BOOL b_debug_turn_on_prints = FALSE
VECTOR v_debug_offset = <<0.0, 0.0, 1.0>>
BOOL b_debug_reset_help[MAX_NUMBER_OF_FLOATING_HELP]
INT i_new_time[MAX_NUMBER_OF_FLOATING_HELP]
INT i_arrow_direction[MAX_NUMBER_OF_FLOATING_HELP]
INT i_message_style[MAX_NUMBER_OF_FLOATING_HELP]
PROC CREATE_WIDGETS()
widget_debug = START_WIDGET_GROUP("Floating Help")
ADD_WIDGET_BOOL("Enable debug prints", b_debug_turn_on_prints)
ADD_WIDGET_BOOL("Print test help", b_debug_print_help)
ADD_WIDGET_BOOL("Clear help", b_debug_clear_help)
ADD_WIDGET_INT_SLIDER("Slot", i_debug_slot, -1, 2, 1)
ADD_WIDGET_INT_SLIDER("Help duration", i_debug_duration, -1, 50000, 100)
ADD_WIDGET_VECTOR_SLIDER("Offset", v_debug_offset, -2.0, 2.0, 0.01)
ADD_WIDGET_INT_SLIDER("arrow direction", i_debug_arrow_dir, 0, 4, 1)
ADD_WIDGET_BOOL("Use 2D offset from entity", b_debug_use_2d_offset)
ADD_WIDGET_BOOL("Use screen coords", b_debug_use_screen_offset)
TEXT_LABEL_31 txTlabel
INT i
REPEAT COUNT_OF(g_sFloatingHelpData) i
txTlabel = "eHELP_TEXT_FLOATING_ID - "
txTlabel += i
START_WIDGET_GROUP(txTlabel)
ADD_WIDGET_BOOL("Reset Help Message", b_debug_reset_help[i])
ADD_WIDGET_INT_SLIDER("New Duration",i_new_time[i] , -1, 50000, 1)
ADD_WIDGET_INT_SLIDER("Current timer", g_sFloatingHelpData[i].i_timer , -1, 50000, 1)
ADD_WIDGET_INT_SLIDER("arrow direction", i_arrow_direction[i], 0, 4, 1)
ADD_WIDGET_INT_SLIDER("message style", i_message_style[i], 0, 1, 1)
ADD_WIDGET_FLOAT_SLIDER("X Coord", g_sFloatingHelpData[i].v_pos.x, -10000.0, 10000.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Y Coord", g_sFloatingHelpData[i].v_pos.y, -10000.0, 10000.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Z Coord", g_sFloatingHelpData[i].v_pos.z, -10000.0, 10000.0, 0.001)
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
ENDPROC
PROC DESTROY_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widget_debug)
DELETE_WIDGET_GROUP(widget_debug)
ENDIF
ENDPROC
PROC UPDATE_WIDGETS()
IF b_debug_print_help
FLOATING_HELP_SLOT_TYPE e_slot = FLOATING_HELP_FIND_NEXT_FREE_SLOT
IF i_debug_slot > -1
e_slot = INT_TO_ENUM(FLOATING_HELP_SLOT_TYPE, i_debug_slot)
ENDIF
IF b_debug_use_screen_offset
HELP_AT_SCREEN_LOCATION("CMN_MLEAVE", v_debug_offset.x, v_debug_offset.y, INT_TO_ENUM(eARROW_DIRECTION, i_debug_arrow_dir), i_debug_duration, e_slot)
ELIF b_debug_use_2d_offset
HELP_AT_ENTITY_2D_OFFSET("CMN_MLEAVE", PLAYER_PED_ID(), v_debug_offset.x, v_debug_offset.y, INT_TO_ENUM(eARROW_DIRECTION, i_debug_arrow_dir), i_debug_duration, e_slot)
ELSE
HELP_AT_ENTITY_OFFSET("CMN_MLEAVE", PLAYER_PED_ID(), v_debug_offset, INT_TO_ENUM(eARROW_DIRECTION, i_debug_arrow_dir), i_debug_duration, e_slot)
ENDIF
b_debug_print_help = FALSE
ENDIF
IF b_debug_clear_help
IF i_debug_slot = -1
CLEAR_ALL_FLOATING_HELP()
ELSE
CLEAR_FLOATING_HELP(INT_TO_ENUM(eHELP_TEXT_FLOATING_ID, i_debug_slot))
ENDIF
b_debug_clear_help = FALSE
ENDIF
/*IF IS_THIS_FLOATING_HELP_TEXT_BEING_DISPLAYED(FLOATING_HELP_TEXT_ID_1, "CMN_MLEAVE")
PRINTLN("TEST")
ENDIF
IF IS_THIS_FLOATING_HELP_BEING_DISPLAYED("CMN_MLEAVE")
PRINTLN("TEST2")
ENDIF*/
ENDPROC
#ENDIF
/// PURPOSE:
/// Updates all floating help: repositions, manages timers and clears if necessary.
PROC UPDATE_FLOATING_HELP()
INT i = 0
REPEAT COUNT_OF(g_sFloatingHelpData) i
IF g_sFloatingHelpData[i].i_timer != 0
eHELP_TEXT_FLOATING_ID eSlotID = INT_TO_ENUM(eHELP_TEXT_FLOATING_ID, i)
IF GET_GAME_TIMER() > g_sFloatingHelpData[i].i_timer
AND g_sFloatingHelpData[i].i_timer != -1
#IF IS_DEBUG_BUILD
IF b_debug_turn_on_prints
PRINTLN("floating_help_controller: timer finished for help slot ", i)
ENDIF
#ENDIF
//Help text has displayed for the full amount: clear it.
IF private_IS_THIS_FLOATING_HELP_BEING_DISPLAYED(i)
CLEAR_FLOATING_HELP(eSlotID, FALSE)
ENDIF
private_RESET_FLOATING_HELP_ELEMENT(i)
ELSE
IF private_IS_THIS_FLOATING_HELP_BEING_DISPLAYED(i)
//If the help text is still off screen, increment the timer so it doesn't count down until the player has viewed the text.
IF g_sFloatingHelpData[i].i_timer != -1
IF NOT IS_BIT_SET(g_sFloatingHelpData[i].i_flags, FLOATING_HELP_FLAGS_HAS_BEEN_LOOKED_AT)
g_sFloatingHelpData[i].i_timer += ROUND(GET_FRAME_TIME() * 1000.0)
IF IS_FLOATING_HELP_TEXT_ON_SCREEN(eSlotID)
SET_BIT(g_sFloatingHelpData[i].i_flags, FLOATING_HELP_FLAGS_HAS_BEEN_LOOKED_AT)
ENDIF
ENDIF
ENDIF
//Set the help position: use different commands depending on data stored.
IF g_sFloatingHelpData[i].v_pos.z != FLOATING_HELP_2D_Z_VALUE
IF g_sFloatingHelpData[i].entity != NULL
IF NOT IS_ENTITY_DEAD(g_sFloatingHelpData[i].entity)
IF NOT IS_BIT_SET(g_sFloatingHelpData[i].i_flags, FLOATING_HELP_FLAGS_USE_2D_OFFSET_FROM_ENTITY)
SET_FLOATING_HELP_TEXT_WORLD_POSITION(eSlotID, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(g_sFloatingHelpData[i].entity, g_sFloatingHelpData[i].v_pos))
ELSE
SET_FLOATING_HELP_TEXT_TO_ENTITY(eSlotID, g_sFloatingHelpData[i].entity, g_sFloatingHelpData[i].v_pos.x, g_sFloatingHelpData[i].v_pos.y)
ENDIF
ENDIF
ELIF (g_sFloatingHelpData[i].v_pos.x != 0.0 OR g_sFloatingHelpData[i].v_pos.y != 0.0 OR g_sFloatingHelpData[i].v_pos.z != 0.0)
SET_FLOATING_HELP_TEXT_WORLD_POSITION(eSlotID, g_sFloatingHelpData[i].v_pos)
ENDIF
ELSE
SET_FLOATING_HELP_TEXT_SCREEN_POSITION(eSlotID, g_sFloatingHelpData[i].v_pos.x, g_sFloatingHelpData[i].v_pos.y)
ENDIF
ELSE
//If the help text isn't displayed but the data is still active then reset it after some time.
IF GET_GAME_TIMER() - g_sFloatingHelpData[i].i_start_time > 1000
private_RESET_FLOATING_HELP_ELEMENT(i)
ENDIF
ENDIF
ENDIF
ENDIF
//Re-print the help messages if the bool has been set by the widget.
#IF IS_DEBUG_BUILD
IF b_debug_reset_help[i]
IF IS_BIT_SET(g_sFloatingHelpData[i].i_flags, FLOATING_HELP_FLAGS_PRINT_WITH_STRING)
IF IS_BIT_SET(g_sFloatingHelpData[i].i_flags, FLOATING_HELP_FLAGS_PRINT_WITH_NUMBER)
//IF it is with a literal string and a number
private_PRINT_FLOATING_HELP( g_sFloatingHelpData[i].s_current_label, g_sFloatingHelpData[i].s_literal_label, g_sFloatingHelpData[i].i_help_number, i_new_time[i],
INT_TO_ENUM(HELP_MESSAGE_STYLE, i_message_style[i]), g_sFloatingHelpData[i].v_pos, g_sFloatingHelpData[i].entity, INT_TO_ENUM(eARROW_DIRECTION, i_arrow_direction[i]),
TRUE, TRUE, INT_TO_ENUM(FLOATING_HELP_SLOT_TYPE, i))
ELSE
//IF it is with a literal string and no number
private_PRINT_FLOATING_HELP( g_sFloatingHelpData[i].s_current_label, g_sFloatingHelpData[i].s_literal_label, g_sFloatingHelpData[i].i_help_number,i_new_time[i],
INT_TO_ENUM(HELP_MESSAGE_STYLE, i_message_style[i]), g_sFloatingHelpData[i].v_pos, g_sFloatingHelpData[i].entity, INT_TO_ENUM(eARROW_DIRECTION, i_arrow_direction[i]),
TRUE, FALSE, INT_TO_ENUM(FLOATING_HELP_SLOT_TYPE, i))
ENDIF
ELIF IS_BIT_SET(g_sFloatingHelpData[i].i_flags, FLOATING_HELP_FLAGS_PRINT_WITH_NUMBER)
//IF it is with a no literal string and a number
private_PRINT_FLOATING_HELP( g_sFloatingHelpData[i].s_current_label, g_sFloatingHelpData[i].s_literal_label, g_sFloatingHelpData[i].i_help_number,i_new_time[i],
INT_TO_ENUM(HELP_MESSAGE_STYLE, i_message_style[i]), g_sFloatingHelpData[i].v_pos, g_sFloatingHelpData[i].entity, INT_TO_ENUM(eARROW_DIRECTION, i_arrow_direction[i]),
FALSE, TRUE, INT_TO_ENUM(FLOATING_HELP_SLOT_TYPE, i))
ELSE
//IF it is with a no literal string and no number
private_PRINT_FLOATING_HELP( g_sFloatingHelpData[i].s_current_label, g_sFloatingHelpData[i].s_literal_label, g_sFloatingHelpData[i].i_help_number,i_new_time[i],
INT_TO_ENUM(HELP_MESSAGE_STYLE, i_message_style[i]), g_sFloatingHelpData[i].v_pos, g_sFloatingHelpData[i].entity, INT_TO_ENUM(eARROW_DIRECTION, i_arrow_direction[i]),
FALSE, FALSE, INT_TO_ENUM(FLOATING_HELP_SLOT_TYPE, i))
ENDIF
b_debug_reset_help[i] = FALSE
ENDIF
#ENDIF
ENDREPEAT
ENDPROC
SCRIPT
//This script needs to be usable by multiplayer
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
#IF IS_DEBUG_BUILD
CREATE_WIDGETS()
#ENDIF
WHILE TRUE
WAIT(0)
UPDATE_FLOATING_HELP()
#IF IS_DEBUG_BUILD
UPDATE_WIDGETS()
#ENDIF
ENDWHILE
#IF IS_DEBUG_BUILD
DESTROY_WIDGETS()
#ENDIF
ENDSCRIPT