Skip to content

Instantly share code, notes, and snippets.

@thelink2012
Last active December 23, 2016 00:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thelink2012/5be92d2949f85f0644ffd1a16e210cfb to your computer and use it in GitHub Desktop.
Save thelink2012/5be92d2949f85f0644ffd1a16e210cfb to your computer and use it in GitHub Desktop.
//
// Quick Vehicle Spawner v2.0
//
// Originally one of my first scripts (http://www.gtagarage.com/mods/show.php?id=19593), this is
// a improved version with performance issues fixed.
//
// This script reaches its best potential together CPad.DoCheats_Numpad_and_KeyPressedFlag.cs
// which can be found in the download link above.
//
// This should somehow demonstrate the use of GTA3script on the making of custom scripts.
//
// Additionally, this code is set under the public domain, so do whatever you want with it.
//
SCRIPT_START
{
LVAR_INT scplayer
LVAR_INT counter
LVAR_INT tempvar tempva2
LVAR_INT id this_vehicle_name this_model_info this_vehicle_label
LVAR_INT num_vehicles vehicle_names vehicle_str_ids
LVAR_INT ptr_gsVehicleModels
LVAR_INT current_language
LVAR_INT cfg_flying cfg_putincar cfg_speed
LVAR_FLOAT x y z a
LVAR_FLOAT fwd_x fwd_y fwd_z
LVAR_INT car menu
GET_PLAYER_CHAR 0 scplayer
vehicle_names = 0
num_vehicles = 0
READ_MEMORY 0x4C6771 4 TRUE ptr_gsVehicleModels
GET_CURRENT_LANGUAGE current_language
GOSUB load_vehicle_names
IF NOT READ_INT_FROM_INI_FILE "CLEO/QVHS.ini" "SPAWNER" "PutInCar" cfg_putincar
cfg_putincar = TRUE
ENDIF
IF NOT READ_INT_FROM_INI_FILE "CLEO/QVHS.ini" "SPAWNER" "Flying" cfg_flying
cfg_flying = TRUE
ENDIF
IF NOT READ_INT_FROM_INI_FILE "CLEO/QVHS.ini" "SPAWNER" "Speed" cfg_speed
cfg_speed = 1
ENDIF
main_loop:
WAIT 0
#ifdef DEBUG
IF IS_KEY_PRESSED VK_F6
PRINT_HELP_STRING "Reloading QVHS.cs"
STREAM_CUSTOM_SCRIPT "QVHS.cs"
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
#endif
GET_CURRENT_LANGUAGE tempvar
IF NOT current_language = tempvar
current_language = tempvar
GOSUB load_vehicle_names
ENDIF
IF IS_PLAYER_PLAYING 0
IF IS_PLAYER_CONTROL_ON 0
IF TEST_CHEAT "QVHSCFG"
GOSUB config_menu
GOTO main_loop
ENDIF
ENDIF
IF NOT IS_CHAR_IN_ANY_CAR scplayer
counter = 0
WHILE counter < num_vehicles
// Spawn by text label
this_model_info = 0x308 * counter // sizeof CVehicleModelInfo
this_model_info += ptr_gsVehicleModels
this_vehicle_label = this_model_info + 0x36 // + (4 + 0x32) (->m_nGameName)
IF TEST_CHEAT $this_vehicle_label
GOSUB spawn_vehicle
GOTO main_loop
ENDIF
// Spawn by text label string
this_vehicle_name = 4 * counter
this_vehicle_name += vehicle_names
READ_MEMORY this_vehicle_name 4 FALSE tempvar
IF NOT tempvar = 0
IF TEST_CHEAT $tempvar
GOSUB spawn_vehicle
GOTO main_loop
ENDIF
ENDIF
// Spawn by ID
tempvar = 8 * counter
tempva2 = vehicle_str_ids + tempvar
IF TEST_CHEAT $tempva2
GOSUB spawn_vehicle
GOTO main_loop
ENDIF
++counter
MOD counter 50 tempvar
IF tempvar = 0
WAIT 0
ENDIF
ENDWHILE
ENDIF
ENDIF
GOTO main_loop
config_menu:
SET_PLAYER_CONTROL 0 FALSE
DISPLAY_HUD FALSE
DISPLAY_RADAR FALSE
ADD_TEXT_LABEL QVHS_TL "Quick Vehicle Spawner"
ADD_TEXT_LABEL QVHS_CP "Put player in vehicle"
ADD_TEXT_LABEL QVHS_CF "Spawn flying"
ADD_TEXT_LABEL QVHS_CS "Vehicle speed"
ADD_TEXT_LABEL QVHS_S0 "Stopped"
ADD_TEXT_LABEL QVHS_S1 "Normal"
ADD_TEXT_LABEL QVHS_S2 "Fast"
CREATE_MENU QVHS_TL (120.00 300.00) (400.0) TRUE TRUE TRUE 0 menu
SET_MENU_COLUMN menu 0 (DUMMY) (QVHS_CP QVHS_CF QVHS_CS DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY)
SET_ACTIVE_MENU_ITEM menu 0
WHILE NOT IS_BUTTON_PRESSED 0 TRIANGLE
HIGHLIGHT_MENU_ITEM menu 0 cfg_putincar
HIGHLIGHT_MENU_ITEM menu 1 cfg_flying
IF cfg_speed = 0
HIGHLIGHT_MENU_ITEM menu 2 FALSE
ELSE
HIGHLIGHT_MENU_ITEM menu 2 TRUE
ENDIF
WAIT 0
IF IS_BUTTON_PRESSED 0 CROSS
GET_MENU_ITEM_SELECTED menu tempvar
SWITCH tempvar
CASE 0
BITWISE_XOR cfg_putincar 0x1 cfg_putincar
WRITE_INT_TO_INI_FILE cfg_putincar "CLEO/QVHS.ini" "SPAWNER" "PutInCar"
BREAK
CASE 1
BITWISE_XOR cfg_flying 0x1 cfg_flying
WRITE_INT_TO_INI_FILE cfg_flying "CLEO/QVHS.ini" "SPAWNER" "Flying"
BREAK
CASE 2
IF cfg_speed >= 2
cfg_speed = 0
ELSE
++cfg_speed
ENDIF
WRITE_INT_TO_INI_FILE cfg_speed "CLEO/QVHS.ini" "SPAWNER" "Speed"
SWITCH cfg_speed
CASE 0
PRINT_HELP QVHS_S0
BREAK
CASE 1
PRINT_HELP QVHS_S1
BREAK
CASE 2
PRINT_HELP QVHS_S2
BREAK
ENDSWITCH
BREAK
ENDSWITCH
WHILE IS_BUTTON_PRESSED 0 CROSS
WAIT 0
ENDWHILE
ENDIF
ENDWHILE
DELETE_MENU menu
REMOVE_TEXT_LABEL QVHS_TL
REMOVE_TEXT_LABEL QVHS_CP
REMOVE_TEXT_LABEL QVHS_CF
REMOVE_TEXT_LABEL QVHS_CS
REMOVE_TEXT_LABEL QVHS_S0
REMOVE_TEXT_LABEL QVHS_S1
REMOVE_TEXT_LABEL QVHS_S2
SET_PLAYER_CONTROL 0 TRUE
DISPLAY_HUD TRUE
DISPLAY_RADAR TRUE
RETURN
load_vehicle_names:
FREE_MEMORY vehicle_names
vehicle_names = 0
READ_MEMORY ptr_gsVehicleModels 4 FALSE num_vehicles
IF num_vehicles > 0
tempvar = 4 * num_vehicles
tempva2 = 8 * num_vehicles // max is ID65535
tempvar = tempvar + tempva2
ALLOCATE_MEMORY tempvar vehicle_names
vehicle_str_ids = 4 * num_vehicles
vehicle_str_ids += vehicle_names
counter = 0
WHILE counter < num_vehicles
this_model_info = 0x308 * counter // sizeof CVehicleModelInfo
this_model_info += ptr_gsVehicleModels
this_model_info += 0x4
// Store text label string
this_vehicle_name = 4 * counter
this_vehicle_name += vehicle_names
this_vehicle_label = this_model_info + 0x32 // +0x32 (->m_nGameName)
GET_TEXT_LABEL_STRING $this_vehicle_label tempvar
READ_MEMORY tempvar 1 FALSE tempva2
IF tempva2 = 0 // test if empty string
tempvar = 0
ENDIF
WRITE_MEMORY this_vehicle_name 4 tempvar FALSE
// Store vehicle id string
tempvar = 4 * num_vehicles
tempva2 = 8 * counter
this_vehicle_name = tempvar + tempva2
this_vehicle_name += vehicle_names
CLEO_CALL get_id_from_model_info 0 this_model_info id
STRING_FORMAT this_vehicle_name "ID%d" id
++counter
ENDWHILE
ENDIF
RETURN
spawn_vehicle:
this_model_info = 0x308 * counter // sizeof CVehicleModelInfo
this_model_info += ptr_gsVehicleModels
this_model_info += 0x4
CLEO_CALL get_id_from_model_info 0 this_model_info id
IF cfg_putincar = FALSE
SPAWN_VEHICLE_BY_CHEATING id
ELSE
REQUEST_MODEL id
LOAD_ALL_MODELS_NOW
GET_CHAR_COORDINATES scplayer x y z
GET_CHAR_HEADING scplayer a
CREATE_CAR id x y z car
SET_CAR_HEADING car a
WARP_CHAR_INTO_CAR scplayer car
IF cfg_speed > 0
IF cfg_speed = 2
SET_CAR_FORWARD_SPEED car 60.0
ELSE
SET_CAR_FORWARD_SPEED car 23.0
ENDIF
ENDIF
IF IS_CHAR_IN_FLYING_VEHICLE scplayer
AND cfg_flying = TRUE
GET_GROUND_Z_FOR_3D_COORD x y 9999.0 z
z = z + 100.0
SET_CAR_COORDINATES car x y z
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS car 0.0 200.0 0.0 fwd_x fwd_y fwd_z
WHILE NOT IS_LINE_OF_SIGHT_CLEAR x y z fwd_x fwd_y fwd_z TRUE FALSE FALSE FALSE FALSE
z = z + 100.0
SET_CAR_COORDINATES car x y z
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS car 0.0 200.0 0.0 fwd_x fwd_y fwd_z
ENDWHILE
SET_CAR_FORWARD_SPEED car 100.0
SET_PLANE_UNDERCARRIAGE_UP car TRUE
PLANE_STARTS_IN_AIR car
ENDIF
MARK_CAR_AS_NO_LONGER_NEEDED car
MARK_MODEL_AS_NO_LONGER_NEEDED id
ENDIF
RETURN
}
{
get_id_from_model_info:
LVAR_INT model_info
LVAR_INT id hash
hash = model_info + 0x4 // +0x4 (->m_dwKey)
READ_MEMORY hash 4 FALSE hash
GET_VAR_POINTER id id
CALL_FUNCTION 0x4C59B0 2 2 id hash // CModelInfo::GetModelInfoFromHashKey
CLEO_RETURN 0 id
}
SCRIPT_END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment