2024-12-11 11:28:08 +01:00

2578 lines
58 KiB
Plaintext

#include common_scripts\utility;
#include common_scripts\_fx;
#include common_scripts\_createfxMenu;
createEffect( type, fxid )
{
ent = spawnStruct();
if ( !IsDefined( level.createFXent ) )
{
level.createFXent = [];
}
level.createFXent[ level.createFXent.size ] = ent;
ent.v = [];
ent.v[ "type" ] = type;
ent.v[ "fxid" ] = fxid;
ent.v[ "angles" ] = ( 0, 0, 0 );
ent.v[ "origin" ] = ( 0, 0, 0 );
ent.drawn = true;
if ( IsDefined( fxid ) && IsDefined( level.createFXbyFXID ) )
{ // if we're using the optimized lookup, add it in the proper place
ary = level.createFXbyFXID[ fxid ];
if ( !IsDefined( ary ) )
{
ary = [];
}
ary[ ary.size ] = ent;
level.createFXbyFXID[ fxid ] = ary;
}
return ent;
}
// the following "get" functions are used to centralize the default values for some of the createFX options.
// This is so that we don't have to write the options into the createfx file if they are the same as the default.
getLoopEffectDelayDefault()
{
return 0.5;
}
getOneshotEffectDelayDefault()
{
return -15;
}
getExploderDelayDefault()
{
return 0;
}
getIntervalSoundDelayMinDefault()
{
return .75;
}
getIntervalSoundDelayMaxDefault()
{
return 2;
}
createLoopSound()
{
ent = spawnStruct();
if ( !IsDefined( level.createFXent ) )
level.createFXent = [];
level.createFXent[ level.createFXent.size ] = ent;
ent.v = [];
ent.v[ "type" ] = "soundfx";
ent.v[ "fxid" ] = "No FX";
ent.v[ "soundalias" ] = "nil";
ent.v[ "angles" ] = ( 0, 0, 0 );
ent.v[ "origin" ] = ( 0, 0, 0 );
ent.v[ "server_culled" ] = 1;
if ( getdvar( "serverCulledSounds" ) != "1" )
ent.v[ "server_culled" ] = 0;
ent.drawn = true;
return ent;
}
createIntervalSound()
{
ent = createLoopSound();
ent.v[ "type" ] = "soundfx_interval";
ent.v[ "delay_min" ] = getIntervalSoundDelayMinDefault();
ent.v[ "delay_max" ] = getIntervalSoundDelayMaxDefault();
return ent;
}
createNewExploder()
{
ent = spawnStruct();
if ( !IsDefined( level.createFXent ) )
level.createFXent = [];
level.createFXent[ level.createFXent.size ] = ent;
ent.v = [];
ent.v[ "type" ] = "exploder";
ent.v[ "fxid" ] = "No FX";
ent.v[ "soundalias" ] = "nil";
ent.v[ "loopsound" ] = "nil";
ent.v[ "angles" ] = ( 0, 0, 0 );
ent.v[ "origin" ] = ( 0, 0, 0 );
ent.v[ "exploder" ] = 1;
ent.v[ "flag" ] = "nil";
ent.v[ "exploder_type" ] = "normal";
ent.drawn = true;
return ent;
}
createExploderEx( fxid, exploderID )
{
ent = createExploder( fxid );
ent.v[ "exploder" ] = exploderID;
return ent;
}
createReactiveEnt()
{
ent = SpawnStruct();
level.createFXent[ level.createFXent.size ] = ent;
ent.v = [];
ent.v[ "origin" ] = ( 0, 0, 0 );
ent.v[ "reactive_radius" ] = 200;
ent.v[ "fxid" ] = "No FX";
ent.v[ "type" ] = "reactive_fx";
ent.v[ "soundalias" ] = "nil";
return ent;
}
set_origin_and_angles( origin, angles )
{
// Use this if your level mapfile is offset in the main map.
if( isDefined( level.createFX_offset ))
{
origin = ( origin + level.createFX_offset );
}
self.v[ "origin" ] = origin;
self.v[ "angles" ] = angles;
}
set_forward_and_up_vectors()
{
self.v[ "up" ] = AnglesToUp( self.v[ "angles" ] );
self.v[ "forward" ] = AnglesToForward( self.v[ "angles" ] );
}
createfx_common()
{
precacheShader( "black" );
level._createfx = SpawnStruct();
level._createfx.grenade = Spawn( "script_origin", ( 0, 0, 0 ) );
level._createfx.grenade.fx = LoadFX("fx/explosions/grenadeexp_default");
level._createfx.grenade.sound = "grenade_explode_default";
level._createfx.grenade.radius = 256;
if ( level.mp_createfx )
{
hack_start( "painter_mp" );
}
else
{
hack_start( "painter" );
}
flag_init( "createfx_saving" );
flag_init( "createfx_started" );
// Effects placing tool
if ( !IsDefined( level.createFX ) )
{
level.createFX = [];
}
level.createfx_loopcounter = 0;
// NOT MP FRIENDLY
// array_call( GetSpawnerArray(), ::Delete );
//
// ents = GetEntArray( "trigger_multiple", "code_classname" );
// ents = array_combine( ents, GetEntArray( "trigger_radius", "code_classname" ) );
// ents = array_combine( ents, GetEntArray( "trigger_once", "code_classname" ) );
// array_call( ents, ::Delete );
level notify( "createfx_common_done" );
}
//---------------------------------------------------------
// CreateFx Logic Initialization Section
//---------------------------------------------------------
init_level_variables()
{
// gets cumulatively added to to create digital accelleration
level._createfx.selectedMove_up = 0;
level._createfx.selectedMove_forward = 0;
level._createfx.selectedMove_right = 0;
level._createfx.selectedRotate_pitch = 0;
level._createfx.selectedRotate_roll = 0;
level._createfx.selectedRotate_yaw = 0;
level._createfx.selected_fx = [];
level._createfx.selected_fx_ents = [];
// Selected Ent Settings
level._createfx.rate = 1;
level._createfx.snap2normal = 0;
level._createfx.axismode = 0;
// Select By Name
level._createfx.select_by_name = false; // unhighlights current ent
level._createfx.player_speed = GetDvarFloat( "g_speed" );
set_player_speed_hud();
}
init_locked_list()
{
level._createfx.lockedList = [];
level._createfx.lockedList[ "escape" ] = true;
level._createfx.lockedList[ "BUTTON_LSHLDR" ] = true;
level._createfx.lockedList[ "BUTTON_RSHLDR" ] = true;
level._createfx.lockedList[ "mouse1" ] = true;
level._createfx.lockedList[ "ctrl" ] = true;
}
init_colors()
{
colors = [];
colors[ "loopfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "loopfx" ][ "highlighted" ] = ( 0.4, 0.95, 1.0 );
colors[ "loopfx" ][ "default" ] = ( 0.3, 0.8, 1.0 );
colors[ "oneshotfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "oneshotfx" ][ "highlighted" ] = ( 0.4, 0.95, 1.0 );
colors[ "oneshotfx" ][ "default" ] = ( 0.3, 0.8, 1.0 );
colors[ "exploder" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "exploder" ][ "highlighted" ] = ( 1.0, 0.2, 0.2 );
colors[ "exploder" ][ "default" ] = ( 1.0, 0.1, 0.1 );
colors[ "rainfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "rainfx" ][ "highlighted" ] = ( .95, 0.4, 0.95 );
colors[ "rainfx" ][ "default" ] = ( .78, 0.0, 0.73 );
colors[ "soundfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "soundfx" ][ "highlighted" ] = ( .5, 1.0, 0.75 );
colors[ "soundfx" ][ "default" ] = ( .2, 0.9, 0.2 );
colors[ "soundfx_interval" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "soundfx_interval" ][ "highlighted" ] = ( .5, 1.0, 0.75 );
colors[ "soundfx_interval" ][ "default" ] = ( .2, 0.9, 0.2 );
colors[ "reactive_fx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
colors[ "reactive_fx" ][ "highlighted" ] = ( .5, 1.0, 0.75 );
colors[ "reactive_fx" ][ "default" ] = ( .2, 0.9, 0.2 );
level._createfx.colors = colors;
}
//---------------------------------------------------------
// CreateFx Logic Section
//---------------------------------------------------------
createFxLogic()
{
waittillframeend;// let _load run first
wait( 0.05 );
if ( !IsDefined( level._effect ) )
{
level._effect = [];
}
if ( GetDvar( "createfx_map" ) == "" )
{
SetDevDvar( "createfx_map", get_template_level() );
}
else if ( GetDvar( "createfx_map" ) == get_template_level() )
{
[[ level.func_position_player ]]();
}
init_crosshair();
init_menu();
init_huds();
init_tool_hud();
init_crosshair();
init_level_variables();
init_locked_list();
init_colors();
SetDevDvar( "fx", "nil" );
SetDevDvar( "select_by_substring", "" );
if ( GetDvar( "createfx_use_f4" ) == "" )
SetDevDvar( "createfx_use_f4", "0" );
if ( GetDvar( "createfx_no_autosave" ) == "" )
SetDevDvar( "createfx_no_autosave", "0" );
level.createfx_draw_enabled = true;
level.last_displayed_ent = undefined;
level.buttonIsHeld = [];
lastPlayerOrigin = (0,0,0);
flag_set( "createfx_started" );
if ( !level.mp_createfx )
{
lastPlayerOrigin = level.player.origin;
}
lastHighlightedEnt = undefined;
level.fx_rotating = false;
setMenu( "none" );
level.createfx_selecting = false;
// black background for text
black = newHudElem();
black.x = -120;
black.y = 200;
black.foreground = 0;
black setShader( "black", 250, 160 );
black.alpha = 0;// 0.6;
level.createfx_inputlocked = false;
foreach ( ent in level.createFXent )
{
ent post_entity_creation_function();
}
thread draw_distance();
lastSelectEntity = undefined;
thread createfx_autosave();
for ( ;; )
{
changedSelectedEnts = false;
// calculate the "cursor"
right = anglestoright( level.player getplayerangles() );
forward = anglestoforward( level.player getplayerangles() );
up = anglestoup( level.player getplayerangles() );
dot = 0.85;
placeEnt_vector = ( forward * 750 );
level.createfxCursor = bullettrace( level.player geteye(), level.player geteye() + placeEnt_vector, false, undefined );
highlightedEnt = undefined;
// ************************************************************
//
// General input
//
// ************************************************************
level.buttonClick = [];
level.button_is_kb = [];
process_button_held_and_clicked();
ctrlHeld = button_is_held( "ctrl", "BUTTON_LSHLDR" );
leftClick = button_is_clicked( "mouse1", "BUTTON_A" );
leftHeld = button_is_held( "mouse1", "BUTTON_A" );
create_fx_menu();
//changing to allow devgui item
// FOR PC Debugging purposes
btn = "F5";
if ( GetDvarInt( "createfx_use_f4" ) )
{
btn = "F4";
}
if ( button_is_clicked( btn ) )
SetDevDvar( "scr_createfx_dump", 1 );
if( GetDvarInt( "scr_createfx_dump" ) )
{
SetDevDvar( "scr_createfx_dump", 0 );
generate_fx_log();
}
if ( button_is_clicked( "F2" ) )
toggle_createfx_drawing();
if ( button_is_clicked( "ins" ) )
insert_effect();
if ( button_is_clicked( "del" ) )
delete_pressed();
if ( button_is_clicked( "escape" ) )
clear_settable_fx();
if ( button_is_clicked( "space" ) )
set_off_exploders();
// if (button_is_clicked("j"))
// setmenu("jump_to_effect");
if ( button_is_clicked( "u" ) )
select_by_name_list();
modify_player_speed();
if ( !ctrlHeld && button_is_clicked( "g" ) )
{
select_all_exploders_of_currently_selected( "exploder" );
select_all_exploders_of_currently_selected( "flag" );
}
if ( button_is_held( "h", "F1" ) )
{
show_help();
wait( 0.05 );
continue;
}
if ( button_is_clicked( "BUTTON_LSTICK" ) )
copy_ents();
if ( button_is_clicked( "BUTTON_RSTICK" ) )
paste_ents();
if ( ctrlHeld )
{
if ( button_is_clicked( "c" ) )
copy_ents();
if ( button_is_clicked( "v" ) )
paste_ents();
if ( button_is_clicked( "g" ) )
spawn_grenade(); // for testing reactive ents
}
if ( isdefined( level._createfx.selected_fx_option_index ) )
menu_fx_option_set();
//-------------------------------------------------
// Highlighted Entity Handling
//-------------------------------------------------
for ( i = 0; i < level.createFXent.size; i++ )
{
ent = level.createFXent[ i ];
difference = VectorNormalize( ent.v[ "origin" ] - ( level.player.origin + ( 0, 0, 55 ) ) );
newdot = vectordot( forward, difference );
if ( newdot < dot )
{
continue;
}
dot = newdot;
highlightedEnt = ent;
}
level.fx_highLightedEnt = highLightedEnt;
if ( IsDefined( highLightedEnt ) )
{
if ( IsDefined( lastHighlightedEnt ) )
{
if ( lastHighlightedEnt != highlightedEnt )
{
// a highlighted ent is no longer highlighted so scale down the text size
// lastHighlightedEnt.text = ".";
// lastHighlightedEnt.textsize = 2;
if ( !ent_is_selected( lastHighlightedEnt ) )
lastHighlightedEnt thread entity_highlight_disable();
// an ent became highlighted for the first time so scale up the text size on the new ent
// highlightedEnt.text = HighlightedEnt.v["fxid"];
// highlightedEnt.textsize = 1;
if ( !ent_is_selected( highlightedEnt ) )
highlightedEnt thread entity_highlight_enable();
}
}
else
{
// an ent became highlighted for the first time so scale up the text size on the new ent
// HighlightedEnt.text = HighlightedEnt.v["fxid"];
// HighlightedEnt.textsize = 1;
if ( !ent_is_selected( highlightedEnt ) )
highlightedEnt thread entity_highlight_enable();
}
}
manipulate_createfx_ents( highlightedEnt, leftClick, leftHeld, ctrlHeld, right );
//-------------------------------------------------
// Handle Selected Entities
//-------------------------------------------------
changedSelectedEnts = handle_selected_ents( changedSelectedEnts );
wait( 0.05 );
if ( changedSelectedEnts )
update_selected_entities();
if( !level.mp_createfx )
lastPlayerOrigin = [[ level.func_position_player_get ]]( lastPlayerOrigin );
lastHighlightedEnt = highlightedEnt;
// if the last selected entity changes then reset the options offset
if ( last_selected_entity_has_changed( lastSelectEntity ) )
{
level.effect_list_offset = 0;
clear_settable_fx();
setmenu( "none" );
}
if ( level._createfx.selected_fx_ents.size )
lastSelectEntity = level._createfx.selected_fx_ents[ level._createfx.selected_fx_ents.size - 1 ];
else
lastSelectEntity = undefined;
}
}
modify_player_speed()
{
modify_speed = false;
ctrl_held = button_is_held( "ctrl" );
if ( button_is_held( "." ) )
{
if ( ctrl_held )
{
if ( level._createfx.player_speed < 190 )
{
level._createfx.player_speed = 190;
}
else
{
level._createfx.player_speed += 10;
}
}
else
{
level._createfx.player_speed += 5;
}
modify_speed = true;
}
else if ( button_is_held( "," ) )
{
if ( ctrl_held )
{
if ( level._createfx.player_speed > 190 )
{
level._createfx.player_speed = 190;
}
else
{
level._createfx.player_speed -= 10;
}
}
else
{
level._createfx.player_speed -= 5;
}
modify_speed = true;
}
if ( modify_speed )
{
level._createfx.player_speed = Clamp( level._createfx.player_speed, 5, 500 );
[[ level.func_player_speed ]]();
set_player_speed_hud();
}
}
set_player_speed_hud()
{
if ( !IsDefined( level._createfx.player_speed_hud ) )
{
hud = newHudElem();
hud.alignX = "right";
hud.foreground = 1;
hud.fontScale = 1.2;
hud.alpha = 0.2;
hud.x = 320;
hud.y = 420;
hud SetDevText( "Speed: " );
hud_value = newHudElem();
hud_value.alignX = "left";
hud_value.foreground = 1;
hud_value.fontScale = 1.2;
hud_value.alpha = 0.2;
hud_value.x = 320;
hud_value.y = 420;
hud.hud_value = hud_value;
level._createfx.player_speed_hud = hud;
}
level._createfx.player_speed_hud.hud_value SetValue( level._createfx.player_speed );
}
toggle_createfx_drawing()
{
level.createfx_draw_enabled = !level.createfx_draw_enabled;
}
insert_effect()
{
setMenu( "creation" );
level.effect_list_offset = 0;
clear_fx_hudElements();
set_fx_hudElement( "Pick effect type to create:" );
set_fx_hudElement( "1. One Shot FX" );
set_fx_hudElement( "2. Looping sound" );
set_fx_hudElement( "3. Exploder" );
set_fx_hudElement( "4. One Shot Sound" );
set_fx_hudElement( "5. Reactive Sound" );
set_fx_hudElement( "(c) Cancel >" );
set_fx_hudElement( "(x) Exit >" );
/*
set_fx_hudElement("Pick an effect:");
set_fx_hudElement("In the console, type");
set_fx_hudElement("/fx name");
set_fx_hudElement("Where name is the name of the sound alias");
*/
}
manipulate_createfx_ents( highlightedEnt, leftClick, leftHeld, ctrlHeld, right )
{
if ( !level.createfx_draw_enabled )
return;
if ( level._createfx.select_by_name )
{
level._createfx.select_by_name = false;
highlightedEnt = undefined;
}
else if ( select_by_substring() )
{
highlightedEnt = undefined;
}
for ( i = 0; i < level.createFXent.size; i++ )
{
ent = level.createFXent[ i ];
if ( !ent.drawn )
continue;
scale = GetDvarFloat( "createfx_scaleid" );
if ( IsDefined( highlightedEnt ) && ent == highlightedEnt )
{
if ( !entities_are_selected() )
display_fx_info( ent );
if ( leftClick )
{
entWasSelected = index_is_selected( i );
level.createfx_selecting = !entWasSelected;// used for drag select / deselect
if ( !ctrlHeld )
{
selectedSize = level._createfx.selected_fx_ents.size;
clear_entity_selection();
if ( entWasSelected && selectedSize == 1 )
select_entity( i, ent );
}
toggle_entity_selection( i, ent );
}
else
if ( leftHeld )
{
if ( ctrlHeld )
{
if ( level.createfx_selecting )
select_entity( i, ent );
if ( !level.createfx_selecting )
deselect_entity( i, ent );
}
}
colorIndex = "highlighted";
}
else
{
colorIndex = "default";
}
if ( index_is_selected( i ) )
colorIndex = "selected";
ent createfx_print3d( colorIndex, scale, right );
}
}
createfx_print3d( colorIndex, scale, right )
{
// Line( level.player.origin, ( 0, 0, 0 ) );
print3d( self.v[ "origin" ], ".", level._createfx.colors[ self.v[ "type" ] ][ colorIndex ], 1, scale );
if ( self.textalpha > 0 )
{
text = self get_print3d_text();
printRight = ( right * ( text.size * -2.93 ) );
color = level._createfx.colors[ self.v[ "type" ] ][ colorIndex ];
if ( IsDefineD( self.is_playing ) )
color = ( 1, 0.5, 0 );
print3d( self.v[ "origin" ] + printRight + ( 0, 0, 15 ), text, color, self.textalpha, scale );
if ( IsDefined( self.v[ "reactive_radius" ] ) )
{
Sphere( self.v[ "origin" ], self.v[ "reactive_radius" ], color );
}
}
}
get_print3d_text()
{
switch ( self.v[ "type" ] )
{
case "reactive_fx":
return "reactive: " + self.v[ "soundalias" ];
default:
return self.v[ "fxid" ];
}
}
select_by_name_list()
{
level.effect_list_offset = 0;
clear_fx_hudElements();
setmenu( "select_by_name" );
draw_effects_list();
}
//---------------------------------------------------------
// Selected Ent Section
//---------------------------------------------------------
handle_selected_ents( changedSelectedEnts )
{
if ( level._createfx.selected_fx_ents.size > 0 )
{
changedSelectedEnts = selected_ent_buttons( changedSelectedEnts );
if ( !current_mode_hud( "selected_ents" ) )
{
new_tool_hud( "selected_ents" );
set_tool_hudelem( "Selected Ent Mode" );
set_tool_hudelem( "Mode:", "move" );
set_tool_hudelem( "Rate:", level._createfx.rate );
set_tool_hudelem( "Snap2Normal:", level._createfx.snap2normal );
}
if ( level._createfx.axismode && level._createfx.selected_fx_ents.size > 0 )
{
set_tool_hudelem( "Mode:", "rotate" );
// draw axis and do rotation if shift is held
thread [[ level.func_process_fx_rotater ]]();
if ( button_is_clicked( "enter", "p" ) )
reset_axis_of_selected_ents();
if ( button_is_clicked( "v" ) )
copy_angles_of_selected_ents();
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
level._createfx.selected_fx_ents[ i ] draw_axis();
if ( level.selectedRotate_pitch != 0 || level.selectedRotate_yaw != 0 || level.selectedRotate_roll != 0 )
changedSelectedEnts = true;
/*
for ( i=0; i < level._createfx.selected_fx_ents.size; i++)
{
ent = level._createfx.selected_fx_ents[i];
ent.angles = ent.angles + (level.selectedRotate_pitch, level.selectedRotate_yaw, 0);
ent set_forward_and_up_vectors();
}
if (level.selectedRotate_pitch != 0 || level.selectedRotate_yaw != 0)
changedSelectedEnts = true;
*/
}
else
{
set_tool_hudelem( "Mode:", "move" );
selectedMove_vector = get_selected_move_vector();
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
if ( IsDefined( ent.model ) )// ents with brushmodels are from radiant and dont get moved
continue;
ent draw_cross();
ent.v[ "origin" ] = ent.v[ "origin" ] + selectedMove_vector;
}
if ( distance( ( 0, 0, 0 ), selectedMove_vector ) > 0 )
changedSelectedEnts = true;
}
}
else
{
clear_tool_hud();
}
return changedSelectedEnts;
}
selected_ent_buttons( changedSelectedEnts )
{
if ( button_is_clicked( "shift", "BUTTON_X" ) )
{
toggle_axismode();
}
modify_rate();
if ( button_is_clicked( "s" ) )
{
toggle_snap2normal();
}
if ( button_is_clicked( "end", "l" ) )
{
drop_selection_to_ground();
changedSelectedEnts = true;
}
if ( button_is_clicked( "tab", "BUTTON_RSHLDR" ) )
{
move_selection_to_cursor();
changedSelectedEnts = true;
}
return changedSelectedEnts;
}
modify_rate()
{
shift_held = button_is_held( "shift" );
ctrl_held = button_is_held( "ctrl" );
if ( button_is_clicked( "=" ) )
{
if ( shift_held )
{
level._createfx.rate += 1;
}
else if ( ctrl_held )
{
if ( level._createfx.rate < 1 )
{
level._createfx.rate = 1;
}
else
{
level._createfx.rate += 10;
}
}
else
{
level._createfx.rate += 0.1;
}
}
else if ( button_is_clicked( "-" ) )
{
if ( shift_held )
{
level._createfx.rate -= 1;
}
else if ( ctrl_held )
{
if ( level._createfx.rate > 1 )
{
level._createfx.rate = 1;
}
else
{
level._createfx.rate = 0.1;
}
}
else
{
level._createfx.rate -= 0.1;
}
}
level._createfx.rate = Clamp( level._createfx.rate, 0.1, 100 );
set_tool_hudelem( "Rate:", level._createfx.rate );
}
toggle_axismode()
{
level._createfx.axismode = !level._createfx.axismode;
}
toggle_snap2normal()
{
level._createfx.snap2normal = !level._createfx.snap2normal;
set_tool_hudelem( "Snap2Normal:", level._createfx.snap2normal );
}
copy_angles_of_selected_ents()
{
// so it stops rotating them over time
level notify( "new_ent_selection" );
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
ent.v[ "angles" ] = level._createfx.selected_fx_ents[ level._createfx.selected_fx_ents.size - 1 ].v[ "angles" ];
ent set_forward_and_up_vectors();
}
update_selected_entities();
}
reset_axis_of_selected_ents()
{
// so it stops rotating them over time
level notify( "new_ent_selection" );
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
ent.v[ "angles" ] = ( 0, 0, 0 );
ent set_forward_and_up_vectors();
}
update_selected_entities();
}
last_selected_entity_has_changed( lastSelectEntity )
{
if ( IsDefined( lastSelectEntity ) )
{
if ( !entities_are_selected() )
return true;
}
else
return entities_are_selected();
return( lastSelectEntity != level._createfx.selected_fx_ents[ level._createfx.selected_fx_ents.size - 1 ] );
}
drop_selection_to_ground()
{
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
trace = BulletTrace( ent.v[ "origin" ], ent.v[ "origin" ] + ( 0, 0, -2048 ), false, undefined );
ent.v[ "origin" ] = trace[ "position" ];
}
}
set_off_exploders()
{
level notify( "createfx_exploder_reset" );
exploders = [];
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
if ( IsDefined( ent.v[ "exploder" ] ) )
exploders[ ent.v[ "exploder" ] ] = true;
}
keys = getarraykeys( exploders );
for ( i = 0; i < keys.size; i++ )
exploder( keys[ i ] );
}
draw_distance()
{
count = 0;
if ( GetDvarInt( "createfx_drawdist" ) == 0 )
{
SetDevDvar( "createfx_drawdist", "500" );
}
for ( ;; )
{
maxDist = GetDvarInt( "createfx_drawdist" );
maxDist *= maxDist;
for ( i = 0; i < level.createFXent.size; i++ )
{
ent = level.createFXent[ i ];
ent.drawn = DistanceSquared( level.player.origin, ent.v[ "origin" ] ) <= maxDist;
count++ ;
if ( count > 100 )
{
count = 0;
wait( 0.05 );
}
}
if ( level.createFXent.size == 0 )
{
wait( 0.05 );
}
}
}
createfx_autosave()
{
SetDvarIfUninitialized( "createfx_autosave_time", "300" );
for ( ;; )
{
wait( GetDvarInt( "createfx_autosave_time" ) );
flag_waitopen( "createfx_saving" );
if ( GetDvarInt( "createfx_no_autosave" ) )
{
continue;
}
generate_fx_log( true );
}
}
rotate_over_time( org, rotater )
{
level endon( "new_ent_selection" );
timer = 0.1;
for ( p = 0; p < timer * 20; p++ )
{
if ( level.selectedRotate_pitch != 0 )
org AddPitch( level.selectedRotate_pitch );
else
if ( level.selectedRotate_yaw != 0 )
org AddYaw( level.selectedRotate_yaw );
else
org AddRoll( level.selectedRotate_roll );
wait( 0.05 );
org draw_axis();
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
if ( IsDefined( ent.model ) )// ents with brushmodels are from radiant and dont get moved
continue;
ent.v[ "origin" ] = rotater[ i ].origin;
ent.v[ "angles" ] = rotater[ i ].angles;
}
}
}
delete_pressed()
{
if ( level.createfx_inputlocked )
{
remove_selected_option();
return;
}
delete_selection();
}
remove_selected_option()
{
if ( !IsDefined( level._createfx.selected_fx_option_index ) )
{
return;
}
name = level._createfx.options[ level._createfx.selected_fx_option_index ][ "name" ];
for ( i = 0; i < level.createFXent.size; i++ )
{
ent = level.createFXent[ i ];
if ( !ent_is_selected( ent ) )
continue;
ent remove_option( name );
}
update_selected_entities();
clear_settable_fx();
}
remove_option( name )
{
self.v[ name ] = undefined;
}
delete_selection()
{
newArray = [];
for ( i = 0; i < level.createFXent.size; i++ )
{
ent = level.createFXent[ i ];
if ( ent_is_selected( ent ) )
{
if ( IsDefined( ent.looper ) )
ent.looper delete();
ent notify( "stop_loop" );
}
else
newArray[ newArray.size ] = ent;
}
level.createFXent = newArray;
level._createfx.selected_fx = [];
level._createfx.selected_fx_ents = [];
clear_fx_hudElements();
}
move_selection_to_cursor()
{
origin = level.createfxCursor[ "position" ];
if ( level._createfx.selected_fx_ents.size <= 0 )
{
return;
}
center = get_center_of_array( level._createfx.selected_fx_ents );
difference = center - origin;
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
if ( IsDefined( ent.model ) )// ents with brushmodels are from radiant and dont get moved
{
continue;
}
ent.v[ "origin" ] -= difference;
if ( level._createfx.snap2normal )
{
if ( IsDefined( level.createfxCursor[ "normal" ] ) )
{
ent.v[ "angles" ] = VectorToAngles( level.createfxCursor[ "normal" ] );;
}
}
}
}
select_last_entity()
{
select_entity( level.createFXent.size - 1, level.createFXent[ level.createFXent.size - 1 ] );
}
select_all_exploders_of_currently_selected( key )
{
selected_exploders = [];
foreach ( ent in level._createfx.selected_fx_ents )
{
if ( !IsDefined( ent.v[ key ] ) )
continue;
value = ent.v[ key ];
selected_exploders[ value ] = true;
}
foreach ( value, _ in selected_exploders )
{
foreach ( index, ent in level.createFXent )
{
if ( index_is_selected( index ) )
continue;
if ( !IsDefined( ent.v[ key ] ) )
continue;
if ( ent.v[ key ] != value )
continue;
select_entity( index, ent );
}
}
update_selected_entities();
}
copy_ents()
{
if ( level._createfx.selected_fx_ents.size <= 0 )
return;
array = [];
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
ent = level._createfx.selected_fx_ents[ i ];
newent = spawnstruct();
newent.v = ent.v;
newent post_entity_creation_function();
array[ array.size ] = newent;
}
level.stored_ents = array;
}
post_entity_creation_function()
{
self.textAlpha = 0;
self.drawn = true;
}
paste_ents()
{
if ( !IsDefined( level.stored_ents ) )
return;
clear_entity_selection();
for ( i = 0;i < level.stored_ents.size;i++ )
add_and_select_entity( level.stored_ents[ i ] );
move_selection_to_cursor();
update_selected_entities();
level.stored_ents = [];
copy_ents();// roundabout way to put new entities in the copy queue
}
add_and_select_entity( ent )
{
level.createFXent[ level.createFXent.size ] = ent;
select_last_entity();
}
get_center_of_array( array )
{
center = ( 0, 0, 0 );
for ( i = 0; i < array.size; i++ )
center = ( center[ 0 ] + array[ i ].v[ "origin" ][ 0 ], center[ 1 ] + array[ i ].v[ "origin" ][ 1 ], center[ 2 ] + array[ i ].v[ "origin" ][ 2 ] );
return( center[ 0 ] / array.size, center[ 1 ] / array.size, center[ 2 ] / array.size );
}
ent_draw_axis()
{
self endon( "death" );
for ( ;; )
{
draw_axis();
wait( 0.05 );
}
}
rotation_is_occuring()
{
if ( level.selectedRotate_roll != 0 )
return true;
if ( level.selectedRotate_pitch != 0 )
return true;
return level.selectedRotate_yaw != 0;
}
print_fx_options( ent, tab, autosave )
{
for ( i = 0; i < level._createfx.options.size; i++ )
{
option = level._createfx.options[ i ];
optionName = option[ "name" ];
if ( !IsDefined( ent.v[ optionName ] ) )
continue;
if ( !mask( option[ "mask" ], ent.v[ "type" ] ) )
continue;
if( !level.mp_createfx )
{
if ( mask( "fx", ent.v[ "type" ] ) && optionName == "fxid" )
continue; // fxid is already set in the create functions
if ( ent.v[ "type" ] == "exploder" && optionName == "exploder" )
continue; // exploder is set in createExploderEx()
key = ent.v[ "type" ] + "/" + optionName;
if ( IsDefined( level._createfx.defaults[ key ] ) && ( level._createfx.defaults[ key ] == ent.v[ optionName ] ) )
continue;
}
if ( option[ "type" ] == "string" )
{
stringValue = ent.v[ optionName ] + "";
if ( stringValue == "nil" ) // nil is treated the same as !defined - so why print it out?
continue;
// if ( !autosave )
// println( " ent.v[ \"" + optionName + "\" ] = \"" + ent.v[ optionName ] + "\";" );
cfxprintln( tab + "ent.v[ \"" + optionName + "\" ] = \"" + ent.v[ optionName ] + "\";" );
continue;
}
// int or float
// if ( !autosave )
// println( " ent.v[ \"" + optionName + "\" ] = " + ent.v[ optionName ] + ";" );
cfxprintln( tab + "ent.v[ \"" + optionName + "\" ] = " + ent.v[ optionName ] + ";" );
}
}
entity_highlight_disable()
{
self notify( "highlight change" );
self endon( "highlight change" );
for ( ;; )
{
self.textalpha = self.textalpha * 0.85;
self.textalpha = self.textalpha - 0.05;
if ( self.textalpha < 0 )
break;
wait( 0.05 );
}
self.textalpha = 0;
}
entity_highlight_enable()
{
self notify( "highlight change" );
self endon( "highlight change" );
for ( ;; )
{
// self.textalpha = sin(gettime()) * 0.5 + 0.5;
self.textalpha = self.textalpha + 0.05;
self.textalpha = self.textalpha * 1.25;
if ( self.textalpha > 1 )
break;
wait( 0.05 );
}
self.textalpha = 1;
}
clear_settable_fx()
{
level.createfx_inputlocked = false;
SetDevDvar( "fx", "nil" );
// in case we were modifying an option
level._createfx.selected_fx_option_index = undefined;
reset_fx_hud_colors();
}
reset_fx_hud_colors()
{
for ( i = 0;i < level._createfx.hudelem_count; i++ )
level._createfx.hudelems[ i ][ 0 ].color = ( 1, 1, 1 );
}
toggle_entity_selection( index, ent )
{
if ( IsDefined( level._createfx.selected_fx[ index ] ) )
deselect_entity( index, ent );
else
select_entity( index, ent );
}
select_entity( index, ent )
{
if ( IsDefined( level._createfx.selected_fx[ index ] ) )
return;
clear_settable_fx();
level notify( "new_ent_selection" );
ent thread entity_highlight_enable();
level._createfx.selected_fx[ index ] = true;
level._createfx.selected_fx_ents[ level._createfx.selected_fx_ents.size ] = ent;
}
ent_is_highlighted( ent )
{
if ( !IsDefined( level.fx_highLightedEnt ) )
return false;
return ent == level.fx_highLightedEnt;
}
deselect_entity( index, ent )
{
if ( !IsDefined( level._createfx.selected_fx[ index ] ) )
return;
clear_settable_fx();
level notify( "new_ent_selection" );
level._createfx.selected_fx[ index ] = undefined;
if ( !ent_is_highlighted( ent ) )
ent thread entity_highlight_disable();
// remove the entity from the array of selected entities
newArray = [];
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
if ( level._createfx.selected_fx_ents[ i ] != ent )
newArray[ newArray.size ] = level._createfx.selected_fx_ents[ i ];
}
level._createfx.selected_fx_ents = newArray;
}
index_is_selected( index )
{
return IsDefined( level._createfx.selected_fx[ index ] );
}
ent_is_selected( ent )
{
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
if ( level._createfx.selected_fx_ents[ i ] == ent )
return true;
}
return false;
}
clear_entity_selection()
{
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
if ( !ent_is_highlighted( level._createfx.selected_fx_ents[ i ] ) )
level._createfx.selected_fx_ents[ i ] thread entity_highlight_disable();
}
level._createfx.selected_fx = [];
level._createfx.selected_fx_ents = [];
}
draw_axis()
{
/#
range = 25 * GetDvarFloat( "createfx_scaleid" );
// range = 25;
forward = AnglesToForward( self.v[ "angles" ] );
forward *= range;
right = AnglesToRight( self.v[ "angles" ] );
right *= range;
up = AnglesToUp( self.v[ "angles" ] );
up *= range ;
line( self.v[ "origin" ], self.v[ "origin" ] + forward, ( 1, 0, 0 ), 1 );
line( self.v[ "origin" ], self.v[ "origin" ] + up, ( 0, 1, 0 ), 1 );
line( self.v[ "origin" ], self.v[ "origin" ] + right, ( 0, 0, 1 ), 1 );
if ( IsDefined( self.v[ "soundalias" ] ) )
{
DrawSoundShape( self.v[ "origin" ], self.v[ "angles" ], self.v[ "soundalias" ], ( 1, 0, 1 ), 1 );
}
#/
}
draw_cross()
{
/#
range = 4;
Line( self.v[ "origin" ] - ( 0, 0, range ), self.v[ "origin" ] + ( 0, 0, range ) );
Line( self.v[ "origin" ] - ( 0, range, 0 ), self.v[ "origin" ] + ( 0, range, 0 ) );
Line( self.v[ "origin" ] - ( range, 0, 0 ), self.v[ "origin" ] + ( range, 0, 0 ) );
#/
}
createfx_centerprint( text )
{
thread createfx_centerprint_thread( text );
}
createfx_centerprint_thread( text )
{
level notify( "new_createfx_centerprint" );
level endon( "new_createfx_centerprint" );
for ( p = 0;p < 5;p++ )
level.createFX_centerPrint[ p ] setDevText( text );
wait( 4.5 );
for ( p = 0;p < 5;p++ )
level.createFX_centerPrint[ p ] setDevText( "" );
}
get_selected_move_vector()
{
yaw = level.player GetPlayerAngles()[ 1 ];
angles = ( 0, yaw, 0 );
right = AnglesToRight( angles );
forward = AnglesToForward( angles );
up = AnglesToUp( angles );
keypressed = false;
rate = level._createfx.rate;
if ( buttonDown( "kp_uparrow", "DPAD_UP" ) )
{
if ( level.selectedMove_forward < 0 )
level.selectedMove_forward = 0;
level.selectedMove_forward = level.selectedMove_forward + rate;
}
else
if ( buttonDown( "kp_downarrow", "DPAD_DOWN" ) )
{
if ( level.selectedMove_forward > 0 )
level.selectedMove_forward = 0;
level.selectedMove_forward = level.selectedMove_forward - rate;
}
else
level.selectedMove_forward = 0;
if ( buttonDown( "kp_rightarrow", "DPAD_RIGHT" ) )
{
if ( level.selectedMove_right < 0 )
level.selectedMove_right = 0;
level.selectedMove_right = level.selectedMove_right + rate;
}
else
if ( buttonDown( "kp_leftarrow", "DPAD_LEFT" ) )
{
if ( level.selectedMove_right > 0 )
level.selectedMove_right = 0;
level.selectedMove_right = level.selectedMove_right - rate;
}
else
level.selectedMove_right = 0;
if ( buttonDown( "BUTTON_Y" ) )
{
if ( level.selectedMove_up < 0 )
level.selectedMove_up = 0;
level.selectedMove_up = level.selectedMove_up + rate;
}
else
if ( buttonDown( "BUTTON_B" ) )
{
if ( level.selectedMove_up > 0 )
level.selectedMove_up = 0;
level.selectedMove_up = level.selectedMove_up - rate;
}
else
level.selectedMove_up = 0;
// vector = (level.selectedMove_right, level.selectedMove_forward, level.selectedMove_up);
vector = ( 0, 0, 0 );
vector += ( forward * level.selectedMove_forward );
vector += ( right * level.selectedMove_right );
vector += ( up * level.selectedMove_up );
return vector;
}
set_anglemod_move_vector()
{
rate = level._createfx.rate;
if ( buttonDown( "kp_uparrow", "DPAD_UP" ) )
{
if ( level.selectedRotate_pitch < 0 )
level.selectedRotate_pitch = 0;
level.selectedRotate_pitch = level.selectedRotate_pitch + rate;
}
else
if ( buttonDown( "kp_downarrow", "DPAD_DOWN" ) )
{
if ( level.selectedRotate_pitch > 0 )
level.selectedRotate_pitch = 0;
level.selectedRotate_pitch = level.selectedRotate_pitch - rate;
}
else
level.selectedRotate_pitch = 0;
if ( buttonDown( "kp_leftarrow", "DPAD_LEFT" ) )
{
if ( level.selectedRotate_yaw < 0 )
level.selectedRotate_yaw = 0;
level.selectedRotate_yaw = level.selectedRotate_yaw + rate;
}
else
if ( buttonDown( "kp_rightarrow", "DPAD_RIGHT" ) )
{
if ( level.selectedRotate_yaw > 0 )
level.selectedRotate_yaw = 0;
level.selectedRotate_yaw = level.selectedRotate_yaw - rate;
}
else
level.selectedRotate_yaw = 0;
if ( buttonDown( "BUTTON_Y" ) )
{
if ( level.selectedRotate_roll < 0 )
level.selectedRotate_roll = 0;
level.selectedRotate_roll = level.selectedRotate_roll + rate;
}
else
if ( buttonDown( "BUTTON_B" ) )
{
if ( level.selectedRotate_roll > 0 )
level.selectedRotate_roll = 0;
level.selectedRotate_roll = level.selectedRotate_roll - rate;
}
else
level.selectedRotate_roll = 0;
}
update_selected_entities()
{
has_reactive_ents = false;
foreach ( ent in level._createfx.selected_fx_ents )
{
if ( ent.v[ "type" ] == "reactive_fx" )
has_reactive_ents = true;
ent [[ level.func_updatefx ]]();
}
if ( has_reactive_ents )
refresh_reactive_fx_ents();
}
hack_start( painter_spmp )
{
if ( !IsDefined( painter_spmp ) )
painter_spmp = "painter_mp";
precachemenu( painter_spmp );
wait .05; // make sure this wait stays above the return, since there is some logic in the calling code that assumes hack_start takes a frame.
if( painter_spmp == "painter_mp" )
return;
level.player openpopupmenu( painter_spmp );// painter.menu execs some console commands( ufo mode ).. sneaky hacks.
level.player closepopupmenu( painter_spmp );
}
stop_fx_looper()
{
if ( IsDefined( self.looper ) )
self.looper delete();
self stop_loopsound();
}
stop_loopsound()
{
self notify( "stop_loop" );
}
func_get_level_fx()
{
AssertEx( IsDefined( level._effect ), "No effect aliases defined!" );
if ( !IsDefined( level._effect_keys ) )
{
keys = GetArrayKeys( level._effect );
}
else
{
keys = GetArrayKeys( level._effect );
if ( keys.size == level._effect_keys.size )
{
return level._effect_keys;
}
}
println( "alphabetizing fx" );
keys = alphabetize( keys );
level._effect_keys = keys;
return keys;
}
restart_fx_looper()
{
stop_fx_looper();
//!!! new entities from copy/paste wont have a looper
self set_forward_and_up_vectors();
switch ( self.v[ "type" ] )
{
case "oneshotfx":
self create_triggerfx();
break;
case "soundfx":
self create_loopsound();
break;
case "soundfx_interval":
self create_interval_sound();
break;
}
}
refresh_reactive_fx_ents()
{
level._fx.reactive_fx_ents = undefined;
foreach ( ent in level.createFXent )
{
if ( ent.v[ "type" ] == "reactive_fx" )
{
ent set_forward_and_up_vectors();
ent add_reactive_fx();
}
}
}
process_fx_rotater()
{
if ( level.fx_rotating )
{
return;
}
set_anglemod_move_vector();
if ( !rotation_is_occuring() )
{
return;
}
level.fx_rotating = true;
if ( level._createfx.selected_fx_ents.size > 1 )
{
center = get_center_of_array( level._createfx.selected_fx_ents );
org = spawn( "script_origin", center );
org.v[ "angles" ] = level._createfx.selected_fx_ents[ 0 ].v[ "angles" ];
org.v[ "origin" ] = center;
rotater = [];
for ( i = 0; i < level._createfx.selected_fx_ents.size; i++ )
{
rotater[ i ] = spawn( "script_origin", level._createfx.selected_fx_ents[ i ].v[ "origin" ] );
rotater[ i ].angles = level._createfx.selected_fx_ents[ i ].v[ "angles" ];
rotater[ i ] linkto( org );
}
// println ("pitch " + level.selectedRotate_pitch + " yaw " + level.selectedRotate_yaw);
rotate_over_time( org, rotater );
org delete();
for ( i = 0; i < rotater.size; i++ )
rotater[ i ] delete();
}
else if ( level._createfx.selected_fx_ents.size == 1 )
{
ent = level._createfx.selected_fx_ents[ 0 ];
rotater = spawn( "script_origin", ( 0, 0, 0 ) );
rotater.angles = ent.v[ "angles" ];
if ( level.selectedRotate_pitch != 0 )
rotater AddPitch( level.selectedRotate_pitch );
else
if ( level.selectedRotate_yaw != 0 )
rotater AddYaw( level.selectedRotate_yaw );
else
rotater AddRoll( level.selectedRotate_roll );
ent.v[ "angles" ] = rotater.angles;
rotater delete();
wait( 0.05 );
}
level.fx_rotating = false;
}
spawn_grenade()
{
// if ( isSP() )
// noself_func( "magicgrenade", level.createfxCursor[ "position" ] + ( 0, 0, 10 ), level.createfxCursor[ "position" ] );
// else
// noself_func( "magicbullet", "frag_createfx_mp", level.createfxCursor[ "position" ] + ( 0, 0, 10 ), level.createfxCursor[ "position" ] );
// Fake nade
PlayFX( level._createfx.grenade.fx, level.createfxCursor[ "position" ] );
level._createfx.grenade PlaySound( level._createfx.grenade.sound );
RadiusDamage( level.createfxCursor[ "position" ], level._createfx.grenade.radius, 50, 5, undefined, "MOD_EXPLOSIVE" );
level notify( "code_damageradius", undefined, level._createfx.grenade.radius, level.createfxCursor[ "position" ] );
}
//---------------------------------------------------------
// Help Section
//---------------------------------------------------------
show_help()
{
clear_fx_hudElements();
set_fx_hudElement( "Help:" );
set_fx_hudElement( "Insert Insert entity" );
set_fx_hudElement( "L Drop selected entities to the ground" );
set_fx_hudElement( "A Add option to the selected entities" );
set_fx_hudElement( "P Reset the rotation of the selected entities" );
set_fx_hudElement( "V Copy the angles from the most recently selected fx onto all selected fx." );
set_fx_hudElement( "Delete Kill the selected entities" );
set_fx_hudElement( "ESCAPE Cancel out of option-modify-mode, must have console open" );
set_fx_hudElement( "Ctrl-C Copy" );
set_fx_hudElement( "Ctrl-V Paste" );
set_fx_hudElement( "F2 Toggle createfx dot and text drawing" );
set_fx_hudElement( "F5 SAVES your work" );
set_fx_hudElement( "Dpad Move selected entitise on X/Y or rotate pitch/yaw" );
set_fx_hudElement( "A button Toggle the selection of the current entity" );
set_fx_hudElement( "X button Toggle entity rotation mode" );
set_fx_hudElement( "Y button Move selected entites up or rotate roll" );
set_fx_hudElement( "B button Move selected entites down or rotate roll" );
set_fx_hudElement( "R Shoulder Move selected entities to the cursor" );
set_fx_hudElement( "L Shoulder Hold to select multiple entites" );
set_fx_hudElement( "L JoyClick Copy" );
set_fx_hudElement( "R JoyClick Paste" );
set_fx_hudElement( "N UFO" );
set_fx_hudElement( "T Toggle Timescale FAST" );
set_fx_hudElement( "Y Toggle Timescale SLOW" );
set_fx_hudElement( "[ Toggle FX Visibility" );
set_fx_hudElement( "] Toggle ShowTris" );
set_fx_hudElement( "F11 Toggle FX Profile" );
}
//---------------------------------------------------------
// Write CreateFX Section
//---------------------------------------------------------
generate_fx_log( autosave )
{
// first lets fix all the really small numbers so they dont cause errors because the game will print out
// 4.2343-7e or whatever but cant accept it back in from script
/#
check_createfx_limit();
flag_waitopen( "createfx_saving" );
flag_set( "createfx_saving" );
autosave = IsDefined( autosave );
tab = "\t";
radiant_exploder_add_string = "";
if( GetDvarInt( "scr_map_exploder_dump" ) )
{
radiant_exploder_add_string = "_radiant_exploders";
}
createfx_filter_types();
createfx_adjust_array();
// filename is deprecated
// filename = "createfx/" + get_template_level() + radiant_exploder_add_string + "_fx.gsc";
// if ( autosave )
// {
// filename = "createfx/backup.gsc";
// }
// file = openfile( filename, "write" );
// assertex( file != -1, "File not writeable (maybe you should check it out): " + filename );
file = -1;
// func_cap = 700;// 700 is approximately 3500 lines in a function
// total_functions = level.createFXEnt.size / func_cap;
// for( i = 0; i < total_functions; i++ )
// {
// cfxprintln( tab + "fx_" + ( i + 1 ) + "();" );
// }
// creates default values. This is to stop createfx files from being filled with redundant settings.
level._createfx.defaults = [];
level._createfx.defaults[ "exploder/delay" ] = getExploderDelayDefault();
level._createfx.defaults[ "oneshotfx/delay" ] = getOneshotEffectDelayDefault();
level._createfx.defaults[ "soundfx_interval/delay_min" ] = getIntervalSoundDelayMinDefault();
level._createfx.defaults[ "soundfx_interval/delay_max" ] = getIntervalSoundDelayMaxDefault();
if ( isSP() )
{
type = "fx";
array = get_createfx_array( type );
write_log( array, type, autosave, radiant_exploder_add_string );
type = "sound";
array = get_createfx_array( type );
write_log( array, type, autosave, radiant_exploder_add_string );
}
else // MP, For now
{
write_log( level.createFXEnt, "fx", autosave, radiant_exploder_add_string );
}
// saved = closefile( file );
// assertex( saved == 1, "File not saved (see above message?): " + filename );
flag_clear( "createfx_saving" );
// println( "CreateFX entities placed: " + level.createFxEnt.size );
#/
}
write_log( array, type, autosave, radiant_exploder_add_string )
{
tab = "\t";
cfxprintlnStart();
cfxprintln( "//_createfx generated. Do not touch!!" );
cfxprintln( "#include common_scripts\\utility;" );
cfxprintln( "#include common_scripts\\_createfx;\n" );
cfxprintln( "" );
cfxprintln( "main()" );
cfxprintln( "{" );
cfxprintln( tab + "// CreateFX " + type + " entities placed: " + array.size );
foreach ( e in array )
{
if ( level.createfx_loopcounter > 16 )
{
level.createfx_loopcounter = 0;
wait .1; // give IWLauncher a chance to keep up
}
level.createfx_loopcounter++;
assertEX( IsDefined( e.v[ "type" ] ), "effect at origin " + e.v[ "origin" ] + " has no type" );
// don't post .map effects in the script.
// if (e.v["worldfx"])
// continue;
// when scr_map_exploder_dump is set just output the exploders from radiant. could output two scripts but keeping it simple.
if( GetDvarInt("scr_map_exploder_dump") )
{
if ( !IsDefined( e.model ) )
continue;
}
else if ( IsDefined( e.model ) )
{
continue; // entities with models are from radiant and don't get reported
}
if ( e.v[ "type" ] == "oneshotfx" )
{
cfxprintln( tab + "ent = createOneshotEffect( \"" + e.v[ "fxid" ] + "\" );" );
}
if ( e.v[ "type" ] == "exploder" )
{
if( IsDefined( e.v[ "exploder" ] ) && !level.mp_createfx )
{
cfxprintln( tab + "ent = createExploderEx( \"" + e.v[ "fxid" ] + "\", \"" + e.v[ "exploder" ] + "\" );" );
}
else
{
cfxprintln( tab + "ent = createExploder( \"" + e.v[ "fxid" ] + "\" );" );
}
}
if ( e.v[ "type" ] == "soundfx" )
{
cfxprintln( tab + "ent = createLoopSound();" );
}
if ( e.v[ "type" ] == "soundfx_interval" )
{
cfxprintln( tab + "ent = createIntervalSound();" );
}
if ( e.v[ "type" ] == "reactive_fx" )
{
cfxprintln( tab + "ent = createReactiveEnt();" );
}
cfxprintln( tab + "ent set_origin_and_angles( " + e.v[ "origin" ] + ", " + e.v[ "angles" ] + " );" );
print_fx_options( e, tab, autosave );
cfxprintln( "" );
}
cfxprintln( "}" );
cfxprintln( " " );
cfxprintlnEnd( autosave, radiant_exploder_add_string, type );
}
createfx_adjust_array()
{
limit = 0.1;
foreach ( ent in level.createFXent )
{
origin = [];
angles = [];
for ( i = 0;i < 3;i++ )
{
origin[ i ] = ent.v[ "origin" ][ i ];
angles[ i ] = ent.v[ "angles" ][ i ];
if ( origin[ i ] < limit && origin[ i ] > limit * - 1 )
{
origin[ i ] = 0;
}
if ( angles[ i ] < limit && angles[ i ] > limit * - 1 )
{
angles[ i ] = 0;
}
}
ent.v[ "origin" ] = ( origin[ 0 ], origin[ 1 ], origin[ 2 ] );
ent.v[ "angles" ] = ( angles[ 0 ], angles[ 1 ], angles[ 2 ] );
}
}
get_createfx_array( type )
{
types = get_createfx_types( type );
array = [];
foreach ( index, _ in types )
{
array[ index ] = [];
}
foreach ( ent in level.createFXent )
{
found_type = false;
foreach ( index, type in types )
{
if ( ent.v[ "type" ] != type )
continue;
found_type = true;
array[ index ][ array[ index ].size ] = ent;
break;
}
}
new_array = [];
for ( i = 0; i < types.size; i++ )
{
foreach ( ent in array[ i ] )
{
new_array[ new_array.size ] = ent;
}
}
return new_array;
}
get_createfx_types( type )
{
types = [];
if ( type == "fx" )
{
types[ 0 ] = "oneshotfx";
types[ 1 ] = "exploder";
}
else // sound
{
types[ 0 ] = "soundfx";
types[ 1 ] = "soundfx_interval";
types[ 2 ] = "reactive_fx";
}
return types;
}
is_createfx_type( ent, type )
{
types = get_createfx_types( type );
foreach ( t in types )
{
if ( ent.v[ "type" ] == t )
{
return true;
}
}
return false;
}
createfx_filter_types()
{
types = [];
types[ 0 ] = "soundfx";
types[ 1 ] = "oneshotfx";
types[ 2 ] = "exploder";
types[ 3 ] = "soundfx_interval";
types[ 4 ] = "reactive_fx";
array = [];
foreach ( index, _ in types )
{
array[ index ] = [];
}
foreach ( ent in level.createFXent )
{
found_type = false;
foreach ( index, type in types )
{
if ( ent.v[ "type" ] != type )
continue;
found_type = true;
array[ index ][ array[ index ].size ] = ent;
break;
}
assertex( found_type, "Didnt understand createfx type " + ent.v[ "type" ] );
}
new_array = [];
for ( i = 0; i < types.size; i++ )
{
foreach ( ent in array[ i ] )
{
new_array[ new_array.size ] = ent;
}
}
level.createFXent = new_array;
}
cfxprintlnStart()
{
fileprint_launcher_start_file();
}
cfxprintln( string )
{
fileprint_launcher( string );
}
cfxprintlnEnd( autosave, radiant_exploder_add_string, type )
{
bP4add = true;
if( radiant_exploder_add_string != "" || autosave )
{
bP4add = false;
}
if ( isSP() )
{
scriptname = get_template_level() + radiant_exploder_add_string + "_" + type + ".gsc";
if ( autosave )
{
scriptname = "backup" + "_" + type + ".gsc";
}
}
else // MP, for now
{
scriptname = get_template_level() + radiant_exploder_add_string + "_" + type + ".gsc";
if ( autosave )
{
scriptname = "backup.gsc";
}
}
fileprint_launcher_end_file( "/share/raw/maps/createfx/" + scriptname, bP4add );
}
//---------------------------------------------------------
// Button Section
//---------------------------------------------------------
process_button_held_and_clicked()
{
add_button( "mouse1" );
add_button( "BUTTON_RSHLDR" );
add_button( "BUTTON_LSHLDR" );
add_button( "BUTTON_RSTICK" );
add_button( "BUTTON_LSTICK" );
add_button( "BUTTON_A" );
add_button( "BUTTON_B" );
add_button( "BUTTON_X" );
add_button( "BUTTON_Y" );
add_button( "DPAD_UP" );
add_button( "DPAD_LEFT" );
add_button( "DPAD_RIGHT" );
add_button( "DPAD_DOWN" );
add_kb_button( "shift" );
add_kb_button( "ctrl" );
add_kb_button( "escape" );
add_kb_button( "F1" );
add_kb_button( "F5" );
add_kb_button( "F4" );
add_kb_button( "F2" );
add_kb_button( "a" );
add_kb_button( "g" );
add_kb_button( "c" );
add_kb_button( "h" );
add_kb_button( "i" );
add_kb_button( "k" );
add_kb_button( "l" );
add_kb_button( "m" );
add_kb_button( "p" );
add_kb_button( "s" );
add_kb_button( "u" );
add_kb_button( "v" );
add_kb_button( "x" );
add_kb_button( "del" );// DEL is allowed to be pressed while in select mode
add_kb_button( "end" );
add_kb_button( "tab" );
add_kb_button( "ins" );
add_kb_button( "add" );
add_kb_button( "space" );
add_kb_button( "enter" );
add_kb_button( "1" );
add_kb_button( "2" );
add_kb_button( "3" );
add_kb_button( "4" );
add_kb_button( "5" );
add_kb_button( "6" );
add_kb_button( "7" );
add_kb_button( "8" );
add_kb_button( "9" );
add_kb_button( "0" );
add_kb_button( "-" );
add_kb_button( "=" );
add_kb_button( "," );
add_kb_button( "." );
add_kb_button( "[" );
add_kb_button( "]" );
add_kb_button( "leftarrow" );
add_kb_button( "rightarrow" );
add_kb_button( "uparrow" );
add_kb_button( "downarrow" );
}
locked( name )
{
if ( IsDefined( level._createfx.lockedList[ name ] ) )
return false;
return kb_locked( name );
}
kb_locked( name )
{
return level.createfx_inputlocked && IsDefined( level.button_is_kb[ name ] );
}
add_button( name )
{
if ( locked( name ) )
return;
if ( !IsDefined( level.buttonIsHeld[ name ] ) )
{
if ( level.player buttonPressed( name ) )
{
level.buttonIsHeld[ name ] = true;
level.buttonClick[ name ] = true;
// println("Button: " + name);
}
}
else
{
if ( !level.player buttonPressed( name ) )
{
level.buttonIsHeld[ name ] = undefined;
}
}
}
add_kb_button( name )
{
level.button_is_kb[ name ] = true;
add_button( name );
}
buttonDown( button, button2 )
{
return buttonPressed_internal( button ) || buttonPressed_internal( button2 );
}
buttonPressed_internal( button )
{
if ( !IsDefined( button ) )
return false;
// keyboard buttons can be locked so you can type in the fx info on the keyboard without
// accidentally activating features
if ( kb_locked( button ) )
return false;
return level.player buttonPressed( button );
}
button_is_held( name, name2 )
{
if ( IsDefined( name2 ) )
{
if ( IsDefined( level.buttonIsHeld[ name2 ] ) )
return true;
}
return IsDefined( level.buttonIsHeld[ name ] );
}
button_is_clicked( name, name2 )
{
if ( IsDefined( name2 ) )
{
if ( IsDefined( level.buttonClick[ name2 ] ) )
return true;
}
return IsDefined( level.buttonClick[ name ] );
}
//---------------------------------------------------------
// HUD Section
//---------------------------------------------------------
init_huds()
{
level._createfx.hudelems = [];
level._createfx.hudElem_count = 30;
// all this offset stuff lets us duplicate the text which puts an outline around
// it and makes it more legible
strOffsetX = [];
strOffsetY = [];
strOffsetX[ 0 ] = 0;
strOffsetY[ 0 ] = 0;
strOffsetX[ 1 ] = 1;
strOffsetY[ 1 ] = 1;
strOffsetX[ 2 ] = -2;
strOffsetY[ 2 ] = 1;
strOffsetX[ 3 ] = 1;
strOffsetY[ 3 ] = -1;
strOffsetX[ 4 ] = -2;
strOffsetY[ 4 ] = -1;
// setup the free text marker to allow some permanent strings
level.clearTextMarker = newHudElem();
level.clearTextMarker.alpha = 0;
level.clearTextMarker setDevText( "marker" );
for ( i = 0;i < level._createfx.hudelem_count;i++ )
{
newStrArray = [];
for ( p = 0;p < 1;p++ )
{
newStr = newHudElem();
newStr.alignX = "left";
newStr.location = 0;
newStr.foreground = 1;
newStr.fontScale = 1.40;
newStr.sort = 20 - p;
newStr.alpha = 1;
newStr.x = 0 + strOffsetX[ p ];
newStr.y = 60 + strOffsetY[ p ] + i * 15;
if ( p > 0 )
{
newStr.color = ( 0, 0, 0 );
}
newStrArray[ newStrArray.size ] = newStr;
}
level._createfx.hudelems[ i ] = newStrArray;
}
newStrArray = [];
for ( p = 0; p < 5; p++ )
{
// setup instructional text
newStr = newHudElem();
newStr.alignX = "center";
newStr.location = 0;
newStr.foreground = 1;
newStr.fontScale = 1.40;
newStr.sort = 20 - p;
newStr.alpha = 1;
newStr.x = 320 + strOffsetX[ p ];
newStr.y = 80 + strOffsetY[ p ];
if ( p > 0 )
{
newStr.color = ( 0, 0, 0 );
}
newStrArray[ newStrArray.size ] = newStr;
}
level.createFX_centerPrint = newStrArray;
}
init_crosshair()
{
// setup "crosshair"
crossHair = newHudElem();
crossHair.location = 0;
crossHair.alignX = "center";
crossHair.alignY = "middle";
crossHair.foreground = 1;
crossHair.fontScale = 2;
crossHair.sort = 20;
crossHair.alpha = 1;
crossHair.x = 320;
crossHair.y = 233;
crossHair setDevText( "." );
}
clear_fx_hudElements()
{
level.clearTextMarker ClearAllTextAfterHudElem();
for ( i = 0;i < level._createfx.hudelem_count;i++ )
{
for ( p = 0; p < 1; p++ )
level._createfx.hudelems[ i ][ p ] setDevText( "" );
}
level.fxHudElements = 0;
}
set_fx_hudElement( text )
{
for ( p = 0;p < 1;p++ )
level._createfx.hudelems[ level.fxHudElements ][ p ] setDevText( text );
level.fxHudElements++;
assert( level.fxHudElements < level._createfx.hudelem_count );
}
init_tool_hud()
{
if ( !IsDefined( level._createfx.tool_hudelems ) )
{
level._createfx.tool_hudelems = [];
}
if ( !IsDefined( level._createfx.tool_hud_visible ) )
{
level._createfx.tool_hud_visible = true;
}
if ( !IsDefined( level._createfx.tool_hud ) )
{
level._createfx.tool_hud = "";
}
}
new_tool_hud( name )
{
foreach ( idx, hud in level._createfx.tool_hudelems )
{
if ( IsDefined( hud.value_hudelem ) )
{
hud.value_hudelem Destroy();
}
hud Destroy();
level._createfx.tool_hudelems[ idx ] = undefined;
}
level._createfx.tool_hud = name;
}
current_mode_hud( name )
{
return level._createfx.tool_hud == name;
}
clear_tool_hud()
{
new_tool_hud( "" );
}
new_tool_hudelem( n )
{
hud = newHudElem();
hud.alignX = "left";
hud.location = 0;
hud.foreground = 1;
hud.fontScale = 1.2;
hud.alpha = 1;
hud.x = 0;
hud.y = 320 + ( n * 15 );
return hud;
}
get_tool_hudelem( name )
{
if ( IsDefined( level._createfx.tool_hudelems[ name ] ) )
{
return level._createfx.tool_hudelems[ name ];
}
return undefined;
}
set_tool_hudelem( var, value )
{
hud = get_tool_hudelem( var );
if ( !IsDefined( hud ) )
{
hud = new_tool_hudelem( level._createfx.tool_hudelems.size );
level._createfx.tool_hudelems[ var ] = hud;
hud SetDevText( var );
hud.text = var;
}
if ( IsDefined( value ) )
{
if ( IsDefined( hud.value_hudelem ) )
{
value_hud = hud.value_hudelem;
}
else
{
value_hud = new_tool_hudelem( level._createfx.tool_hudelems.size );
value_hud.x += 80;
value_hud.y = hud.y;
hud.value_hudelem = value_hud;
}
if ( IsDefined( value_hud.text ) && value_hud.text == value )
{
return;
}
value_hud SetDevText( value );
value_hud.text = value;
}
}
select_by_substring()
{
substring = GetDvar( "select_by_substring" );
if ( substring == "" )
{
return false;
}
SetDvar( "select_by_substring", "" );
index_array = [];
foreach ( i, ent in level.createFXent )
{
if ( IsSubStr( ent.v[ "fxid" ], substring ) )
{
index_array[ index_array.size ] = i;
}
}
if ( index_array.size == 0 )
{
PrintLn( "^1select_by_substring could not find \"" + substring + "\"" );
return false;
}
deselect_all_ents();
select_index_array( index_array );
foreach ( index in index_array )
{
ent = level.createFXent[ index ];
select_entity( index, ent );
}
PrintLn( "select_by_substring found \"" + substring + "\" [" + index_array.size + "]" );
return true;
}
select_index_array( index_array )
{
foreach ( index in index_array )
{
ent = level.createFXent[ index ];
select_entity( index, ent );
}
}
deselect_all_ents()
{
foreach ( i, ent in level._createfx.selected_fx_ents )
{
deselect_entity( i, ent );
}
}