Post: More About the Built-in UFO!
02-26-2011, 04:38 AM #1
(adsbygoogle = window.adsbygoogle || []).push({}); Well in my last post I stated that I had found this:
    
ufo_mode()
{
level.player openpopupmenu( "painter_mp" );// [COLOR="Red"]painter.menu execs some console commands( ufo mode ).. sneaky hacks.[/COLOR]
level.player closepopupmenu( "painter_mp" );
}


Well I have found the _painter.gsc!

    #include common_scripts\utility;

main( painter_spmp )
{

painter_setup_array = getentarray( "painter_setup", "targetname" );

if ( !painter_setup_array.size )
return;

if ( !getdvarint( "painter" ) )
{
array_thread( painter_setup_array, ::painter_clean_me );
return;
}

painter_initvars( painter_spmp );

painter_groups = [];

groups = get_painter_groups( painter_setup_array );

foreach ( group in groups )
setup_painter_group( group );

thread painter_init();

array_thread( level.spam_model_group, ::default_undefined );
level.stop_load = true;
level waittill( "forever" );
}

painter_clean_me()
{
if( isdefined( self.target ) )
{
ent = getent(self.target,"targetname");
ent delete();
}
self delete();
}

default_undefined()
{
if ( !isdefined( self.bPosedstyle ) )
self.bPosedstyle = false;
if ( !isdefined( self.bOrienttoplayeryrot ) )
self.bOrienttoplayeryrot = false;
if ( !isdefined( self.bTreeOrient ) )
self.bTreeOrient = false;
if ( !isdefined( self.bFacade ) )
self.bFacade = false;
if ( !isdefined( self.density ) )
self.density = 32;
if ( !isdefined( self.radius ) )
self.radius = 84;
if ( !isdefined( self.maxdist ) )
self.maxdist = 1000;
if ( !isdefined( self.angleoffset ) )
self.angleoffset = [];

}

setup_painter_group( group )
{
density = 100000001;
group_copy = group;
// figure out default radius and density for the group
bTreeOrient = undefined;
bFacade = undefined;
radius = undefined;
maxdist = undefined;
offsetheight = undefined;
bPosedstyle = undefined;
bOrienttoplayeryrot = undefined;
angleoffset = undefined;


foreach ( obj in group )
{
angleoffset = get_angle_offset( obj );
offsetheight = get_height_offset( obj );
modeluseprefab = ( isdefined( obj.script_parameters ) && obj.script_parameters == "use_prefab_model" );


if ( isdefined( obj.radius ) )
radius = obj.radius;
if ( isdefined( obj.script_painter_treeorient ) && obj.script_painter_treeorient )
bTreeOrient = true;
if ( isdefined( obj.script_painter_maxdist ) && obj.script_painter_maxdist )
maxdist = obj.script_painter_maxdist;
if ( isdefined( obj.script_painter_facade ) && obj.script_painter_facade )
bFacade = true;
foreach ( other_obj in group_copy )
{
if ( obj == other_obj )
continue;
dist = distance( obj.origin, other_obj.origin );
assert( dist > 0 );
if ( dist < density )
density = dist;
}
if ( density == 100000001 )
density = undefined;
add_spammodel( obj.script_paintergroup, obj.model, bTreeOrient, bFacade, density, radius, maxdist, offsetheight, bPosedstyle, bOrienttoplayeryrot, angleoffset, modeluseprefab );
}
}

get_angle_offset( obj )
{
if( !isdefined( obj.target ) )
return undefined;

targent = getent( obj.target, "targetname" );
assert( isdefined ( targent ) );
return targent.angles - obj.angles;
}

get_height_offset( obj )
{
if( !isdefined( obj.target ) )
return undefined;

targent = getent( obj.target, "targetname" );
assert( isdefined ( targent ) );
origin = targent.origin[2] - obj.origin[2];
targent delete();
return origin;
}




get_painter_groups( painter_setup_array )
{
groups = [];
script_paintergroup = "";
foreach ( paint_obj in painter_setup_array )
{
if ( !isdefined( paint_obj.script_paintergroup ) )
{
paint_obj.script_paintergroup = paint_obj.model;
}
script_paintergroup = paint_obj.script_paintergroup;

level.painter_startgroup = script_paintergroup;

if ( !isdefined( groups[ script_paintergroup ] ) || ! groups[ script_paintergroup ].size )
groups[ script_paintergroup ] = [];
groups[ script_paintergroup ][ groups[ script_paintergroup ].size ] = paint_obj;
}
return groups;
}

painter_initvars( painter_spmp )
{
level._clearalltextafterhudelem = false;
level.bPosedstyle = false;
level.bOrienttoplayeryrot = false;
level.spam_density_scale = 16;
level.spaming_models = false;
level.spam_model_group = [];
level.spamed_models = [];
level.spam_models_flowrate = .1;
level.spam_model_radius = 31;
level.spam_maxdist = 1000;
level.previewmodels = [];
level.spam_models_isCustomrotation = false;
level.spam_models_isCustomheight = false;
level.spam_models_customheight = 0;
level.spam_model_circlescale_lasttime = 0;
level.spam_model_circlescale_accumtime = 0;
level.paintadd = ::add_spammodel;
// level.geteyeoffset = (0,0,24);
level.timeLimitOverride = true;
thread hack_start( painter_spmp );
thread hud_init();
}

hack_start( painter_spmp )
{
if ( !isdefined( painter_spmp ) )
painter_spmp = "painter";

precachemenu( painter_spmp );

//who knows what the mp scripts are doing I took a dive deep into them and discovered many hud elements being controled through code and not through a menu that can be easily disabled
// here I simply automate some things to get the user up and running.
// get the player going. I don't handle people dieing in this tool since they are in ufo mode anyway.

flag_init( "user_alive" );
while ( !isdefined( get_player() ) )
wait .05;
level.painter_player = get_player();
wait .05;
menu = "team_marinesopfor";
response = "autoassign";
level.painter_player notify( "menuresponse", menu, response );
wait .05;
menu = "changeclass_offline";
response = "offline_class1_mp, 0";
level.painter_player notify( "menuresponse", menu, response );
level.painter_player openpopupmenu( painter_spmp );// painter.menu execs some console commands( ufo mode ).. sneaky hacks.
wait .05;
level.painter_player closepopupmenu();
flag_set( "user_alive" );
}

painter_init()
{
array_call( getentarray( "script_model", "classname" ), ::delete );
setcurrentgroup( level.painter_startgroup );
level.painter_startgroup = undefined;
playerInit();
}

hud_update_placed_model_count()
{
level.hud_controler[ "helppm" ].description setvalue( level.spamed_models.size );
whitecap = 256;
if ( level.spamed_models.size < whitecap )
{
level.hud_controler[ "helppm" ].description.color = ( 1, 1, 1 );
return;
}

r = 1;
g = 1 - ( ( level.spamed_models.size - whitecap ) / whitecap );
b = g;

level.hud_controler[ "helppm" ].description.color = ( r, g, b );

}

hud_init()
{
flag_init( "user_hud_active" );
flag_wait( "user_alive" );

//shorter list for mp cause it's got too many g_configstring somesuch. There is probably better check than substr on the mapname. I don't think this will bite me though, knock on wood.
listsize = 7;
if ( is_mp() )
listsize = 7;

hudelems = [];
spacer = 15;
div = int( listsize / 2 );
org = 240 + div * spacer;
alphainc = .5 / div;
alpha = alphainc;

for ( i = 0;i < listsize;i++ )
{
hudelems[ i ] = _newhudelem();
hudelems[ i ].location = 0;
hudelems[ i ].alignX = "left";
hudelems[ i ].alignY = "middle";
hudelems[ i ].foreground = 1;
hudelems[ i ].fontScale = 2;
hudelems[ i ].sort = 20;
if ( i == div )
hudelems[ i ].alpha = 1;
else
hudelems[ i ].alpha = alpha;

hudelems[ i ].x = 20;
hudelems[ i ].y = org;
hudelems[ i ] _settext( "." );

if ( i == div )
alphainc *= -1;

alpha += alphainc;

org -= spacer;
}

level.spam_group_hudelems = hudelems;

crossHair = _newhudelem();
crossHair.location = 0;
crossHair.alignX = "center";
crossHair.alignY = "bottom";
crossHair.foreground = 1;
crossHair.fontScale = 2;
crossHair.sort = 20;
crossHair.alpha = 1;
crossHair.x = 320;
crossHair.y = 244;
crossHair _settext( "." );
level.crosshair = crossHair;

// setup "crosshair"
crossHair = _newhudelem();
crossHair.location = 0;
crossHair.alignX = "center";
crossHair.alignY = "bottom";
crossHair.foreground = 1;
crossHair.fontScale = 2;
crossHair.sort = 20;
crossHair.alpha = 0;
crossHair.x = 320;
crossHair.y = 244;
crossHair setvalue( 0 );
level.crosshair_value = crossHair;

controler_hud_add( "helppm", 1, "^5Placed Models: ", undefined, level.spamed_models.size );
controler_hud_add( "helpdensity", 2, "^5Spacing: ", undefined, level.spam_density_scale );
controler_hud_add( "helpradius", 3, "^5Radius: ", undefined, level.spam_model_radius );
controler_hud_add( "helpxy", 6, "^4X / ^3Y: ", undefined, level.spam_model_radius );
controler_hud_add( "helpab", 7, "^2A / ^1B^7: ", " - " );
controler_hud_add( "helplsrs", 8, "^8L^7 / R Stick: ", " - " );
controler_hud_add( "helplbrb", 9, "^8L^7 / R Shoulder: ", " - " );
controler_hud_add( "helpdpu", 10, "^8DPad U / ^7Sad Awesome ", " - " );
controler_hud_add( "helpdpl", 11, "^8DPad L / ^7R: ", " - " );
controler_hud_add( "helpF", 17, "^8F: ^7( dump ) ^3map_source/" + level.script + "_modeldump.map", "" );

hint_buttons_main();

flag_set( "user_hud_active" );
}

hint_buttons_main()
{
controler_hud_update_text( "helpxy", "^4Select Set Up ^7 / ^3Down" );
controler_hud_update_text( "helpab", "^2Spacing Down ^7 / ^1up " );
controler_hud_update_text( "helplsrs", "^8Radius Down ^7 / Up" );
controler_hud_update_text( "helplbrb", "^8Remove ^7 / Place" );
controler_hud_update_text( "helpdpl", "^8zOffset Clear ^7 / Set" );
controler_hud_update_text( "helpdpu", "^8Rotation Clear ^7 / Set" );
// controler_hud_update_text( "helpF", text );

}

hint_buttons_zoffset()
{
controler_hud_update_text( "helpxy", "^4 - ^7 / ^3 - " );
controler_hud_update_text( "helpab", "^2Height Down ^7 / ^1Up " );
controler_hud_update_text( "helplsrs", "^8 - ^7 / - " );
controler_hud_update_text( "helplbrb", "^8 - ^7 / - " );
controler_hud_update_text( "helpdpl", "^8 - ^7 / Set" );
controler_hud_update_text( "helpdpu", "^8 - ^7 / - " );
controler_hud_update_text( "helpF", " - " );
}

hint_buttons_rotation()
{
controler_hud_update_text( "helpxy", "^4 - ^7 / ^3 - " );
controler_hud_update_text( "helpab", "^2RotateOther Up ^7 / ^1Down " );
controler_hud_update_text( "helplsrs", "^8 - ^7 / - " );
controler_hud_update_text( "helplbrb", "^8 - ^7 / - " );
controler_hud_update_text( "helpdpl", "^8 - ^7 / - " );
controler_hud_update_text( "helpdpu", "^8Set ^7 / - " );
controler_hud_update_text( "helpF", " - " );
}

setcurrentgroup( group )
{
flag_wait( "user_hud_active" );
level.spam_model_current_group = group;
keys = getarraykeys( level.spam_model_group );
index = 0;
div = int( level.spam_group_hudelems.size / 2 );
for ( i = 0;i < keys.size;i++ )
if ( keys[ i ] == group )
{
index = i;
break;
}

level.spam_group_hudelems[ div ] _settext( keys[ index ] );

for ( i = 1;i < level.spam_group_hudelems.size - div;i++ )
{
if ( index - i < 0 )
{
level.spam_group_hudelems[ div + i ] _settext( "." );
continue;
}
level.spam_group_hudelems[ div + i ] _settext( keys[ index - i ] );
}

for ( i = 1;i < level.spam_group_hudelems.size - div;i++ )
{
if ( index + i > keys.size - 1 )
{
// -- --
level.spam_group_hudelems[ div - i ] _settext( "." );
continue;
}
level.spam_group_hudelems[ div - i ] _settext( keys[ index + i ] );
}

group = getcurrent_groupstruct();

level.bOrienttoplayeryrot = group.bOrienttoplayeryrot;
level.bPosedstyle = group.bPosedstyle;
level.spam_maxdist = group.maxdist;
level.spam_model_radius = group.radius;
level.hud_controler[ "helpradius" ].description setvalue( level.spam_model_radius );

level.spam_density_scale = group.density;
level.hud_controler[ "helpdensity" ].description setvalue( level.spam_density_scale );
}


setgroup_up()
{
index = undefined;
keys = getarraykeys( level.spam_model_group );
for ( i = 0;i < keys.size;i++ )
if ( keys[ i ] == level.spam_model_current_group )
{
index = i + 1;
break;
}
if ( index == keys.size )
return;
setcurrentgroup( keys[ index ] );
while ( level.painter_player buttonpressed( "BUTTON_Y" ) )
wait .05;
}

setgroup_down()
{
index = undefined;
keys = getarraykeys( level.spam_model_group );
for ( i = 0;i < keys.size;i++ )
if ( keys[ i ] == level.spam_model_current_group )
{
index = i - 1;
break;
}
if ( index < 0 )
return;
setcurrentgroup( keys[ index ] );
while ( level.painter_player buttonpressed( "BUTTON_X" ) )
wait .05;
}

Add_Spammodel( group, model, bTreeOrient, bFacade, density, radius, maxdist, offsetheight, bPosedstyle, bOrienttoplayeryrot, angleoffset, modelusesprefab )
{
if ( !isdefined( level.spam_model_group[ group ] ) )
{
struct = spawnstruct();
level.spam_model_group[ group ] = struct;
level.spam_model_group[ group ].models = [];
}

if( !isdefined( angleoffset ) )
angleoffset = (0,0,0);

level.spam_model_group[ group ].bFacade = bFacade;
level.spam_model_group[ group ].bTreeOrient = bTreeOrient;
level.spam_model_group[ group ].density = density;
level.spam_model_group[ group ].radius = radius;
level.spam_model_group[ group ].maxdist = maxdist;
level.spam_model_group[ group ].bPosedstyle = bPosedstyle;
level.spam_model_group[ group ].bOrienttoplayeryrot = bOrienttoplayeryrot;

if( !isdefined( level.spam_model_group[ group ].angleoffset ) )
level.spam_model_group[ group ].angleoffset = [];
level.spam_model_group[ group ].angleoffset[ model ] = angleoffset;

if( !isdefined( level.spam_model_group[ group ].heightoffset ) )
level.spam_model_group[ group ].heightoffset = [];
level.spam_model_group[ group ].heightoffset[ model ] = offsetheight;

if( !isdefined( level.spam_model_group[ group ].modelusesprefab ) )
level.spam_model_group[ group ].modelusesprefab = [];
level.spam_model_group[ group ].modelusesprefab[ model ] = modelusesprefab;

level.spam_model_group[ group ].models[ level.spam_model_group[ group ].models.size ] = model;
}


playerInit()
{
level.painter_max = 700;
level.painter_player takeAllWeapons();

flag_wait( "user_hud_active" );
while ( 1 )
{
trace = player_view_trace();
draw_placement_circle( trace );
if ( level.painter_player buttonpressed( "f" ) )
dump_models();
if ( level.painter_player buttonpressed( "DPAD_UP" ) )
customrotation_mode( trace, "DPAD_UP" );
else if ( level.painter_player buttonpressed( "DPAD_DOWN" ) )
customrotation_mode_off();
else if ( level.painter_player buttonpressed( "DPAD_RIGHT" ) )
customheight_mode( trace, "DPAD_RIGHT" );
else if ( level.painter_player buttonpressed( "DPAD_LEFT" ) )
customheight_mode_off();
else if ( level.painter_player buttonpressed( "BUTTON_X" ) )
setgroup_down();
else if ( level.painter_player buttonpressed( "BUTTON_Y" ) )
setgroup_up();
else if ( level.painter_player buttonpressed( "BUTTON_LSTICK" ) )
spam_model_circlescale( trace, -1 );
else if ( level.painter_player buttonpressed( "BUTTON_RSTICK" ) )
spam_model_circlescale( trace, 1 );
else if ( level.painter_player buttonpressed( "BUTTON_A" ) )
spam_model_densityscale( trace, -1 );
else if ( level.painter_player buttonpressed( "BUTTON_B" ) )
spam_model_densityscale( trace, 1 );
else
{
if ( level.painter_player buttonpressed( "BUTTON_LSHLDR" ) )
spam_model_erase( trace );
if ( level.painter_player buttonpressed( "BUTTON_RSHLDR" ) )
thread spam_model_place( trace );// threaded for delay
}
level notify( "clear_previews" );
wait .05;
hud_update_placed_model_count();
}
}

customheight_mode_off()
{
level.spam_models_isCustomheight = false;
hint_buttons_main();
}

customheight_mode( trace, button )
{
if ( trace[ "fraction" ] == 1 )
return;

while ( level.painter_player buttonpressed( button ) )
wait .05;

level.spam_models_isCustomheight = true;
hint_buttons_zoffset();
models = [];
models = spam_models_atcircle( trace, false, true );

inc = 2;
dir = 1;

origin = trace[ "position" ];
while ( !level.painter_player buttonpressed( button ) )
{
height = level.spam_models_customheight;
if ( level.painter_player buttonpressed( "BUTTON_A" ) )
dir = -1;
else if ( level.painter_player buttonpressed( "BUTTON_B" ) )
dir = 1;
else
dir = 0;
height += dir * inc;
if ( height == 0 )
height += dir * inc;
level.spam_models_customheight = height;

array_thread( models, ::customheight_mode_offsetmodels, trace );
draw_placement_circle( trace, ( 1, 1, 1 ) );

wait .05;
}
array_thread( models, ::deleteme );
hint_buttons_main();
while ( level.painter_player buttonpressed( button ) )
wait .05;
}

customheight_mode_offsetmodels( trace )
{
self.origin = self.orgorg + ( trace[ "normal" ] * level.spam_models_customheight );
}

customrotation_mode_off()
{
level.spam_models_isCustomrotation = false;
hint_buttons_main();
}

customrotation_mode( trace, button )
{
if ( trace[ "fraction" ] == 1 )
return;

while ( level.painter_player buttonpressed( button ) )
wait .05;

hint_buttons_rotation();

level.spam_models_isCustomrotation = true;
level.spam_models_customrotation = level.painter_player getplayerangles();
models = [];
models = spam_models_atcircle( trace, true, true );

otherangle = 0;
otherangleinc = 1;
dir = 0;

while ( !level.painter_player buttonpressed( button ) )
{
dir = 0;
if ( level.painter_player buttonpressed( "BUTTON_A" ) )
dir = -1;
else if ( level.painter_player buttonpressed( "BUTTON_B" ) )
dir = 1;
otherangle += dir * otherangleinc;
if ( otherangle > 360 )
otherangle = 1;
if ( otherangle < 0 )
otherangle = 359;
draw_placement_circle( trace, ( 0, 0, 1 ) );
level.spam_models_customrotation = level.painter_player getplayerangles();
level.spam_models_customrotation += ( 0, 0, otherangle );
for ( i = 0;i < models.size;i++ )
models[ i ].angles = level.spam_models_customrotation;
wait .05;
}

hint_buttons_main();

while ( level.painter_player buttonpressed( button ) )
wait .05;

for ( i = 0;i < models.size;i++ )
models[ i ] thread deleteme();

}

deleteme()
{
self delete();
}

spam_model_clearcondition()
{
self endon( "death" );
level waittill( "clear_previews" );
level.previewmodels = array_remove( level.previewmodels, self );
self delete();
}

crosshair_fadetopoint()
{
level notify( "crosshair_fadetopoint" );
level endon( "crosshair_fadetopoint" );
wait 2;
level.crosshair_value.alpha = 0;
level.crosshair.alpha = 1;
}

spam_model_circlescale( trace, dir )
{
if ( gettime() - level.spam_model_circlescale_lasttime > 60 )
level.spam_model_circlescale_accumtime = 0;

level.spam_model_circlescale_accumtime += .05;

if ( level.spam_model_circlescale_accumtime < .5 )
inc = 2;
else
inc = level.spam_model_circlescale_accumtime / .3;

radius = level.spam_model_radius;
radius += dir * inc;
if ( radius > 0 )
level.spam_model_radius = radius;

level.hud_controler[ "helpradius" ].description setvalue( level.spam_model_radius );

level.spam_model_circlescale_lasttime = gettime();
}

spam_model_densityscale( trace, dir )
{
// ghetto hack here. density scale used for distance on floating model types
inc = 2;
scale = level.spam_density_scale;
scale += dir * inc;
if ( scale > 0 )
level.spam_density_scale = scale;


level.crosshair_value.alpha = 1;
level.crosshair.alpha = 0;

level.crosshair_value setvalue( level.spam_density_scale );
level.hud_controler[ "helpdensity" ].description setvalue( level.spam_density_scale );

thread crosshair_fadetopoint();
}

draw_placement_circle( trace, coloroverride )
{
if ( !isdefined( coloroverride ) )
coloroverride = ( 0, 1, 0 );
if ( trace[ "fraction" ] == 1 )
return;
// angles = vectortoangles( anglestoup( vectortoangles( trace[ "normal" ] ) ) );
angles = vectortoangles( trace[ "normal" ] );
origin = trace[ "position" ];
radius = level.spam_model_radius;
// plot_circle( origin, radius, angles, color, circleres );
plot_circle( origin, radius, angles, coloroverride, 40, level.spam_model_radius );

if ( level.spam_models_isCustomrotation )
draw_axis( origin, level.spam_models_customrotation );
if ( level.spam_models_isCustomheight )
draw_arrow( origin, origin + ( trace[ "normal" ] * level.spam_models_customheight ), ( 1, 1, 1 ) );
}

player_view_trace()
{
maxdist = level.spam_maxdist;
traceorg = level.painter_player geteye();
return bullettrace( traceorg, traceorg + ( anglestoforward( level.painter_player getplayerangles() ) * maxdist ), 0, self );
}

Orienttoplayeryrot()
{
self addyaw( level.painter_player getplayerangles()[ 1 ] - flat_angle( self.angles )[ 1 ] );
// self.angles = ( x, y, z );
}

getcurrent_groupstruct()
{
return level.spam_model_group[ level.spam_model_current_group ];
}

orient_model()
{
group = getcurrent_groupstruct();

if ( level.spam_models_isCustomrotation )
{
self.angles = level.spam_models_customrotation;
return;
}

if ( level.bPosedstyle )
self.angles = level.painter_player getplayerangles();

if ( level.bOrienttoplayeryrot )
self Orienttoplayeryrot();

if ( group.bTreeOrient )
self.angles = flat_angle( self.angles );

if ( ! level.bOrienttoplayeryrot && !level.bPosedstyle )
self addyaw( randomint( 360 ) );

if ( group.bFacade )
{
self.angles = flat_angle( vectortoangles( self.origin - level.painter_player geteye() ) );
self addyaw( 90 );

}

assert( isdefined( group.angleoffset ) && isdefined( group.angleoffset[ self.model] ) );

self addroll( group.angleoffset[self.model][ 0 ] );
self addpitch( group.angleoffset[self.model][ 1 ] );
self addyaw( group.angleoffset[self.model][ 2 ] );



}

spam_model_place( trace )
{
if ( level.spaming_models )
return;
if ( trace[ "fraction" ] == 1 && !level.bPosedstyle )
return;
level.spaming_models = true;
models = spam_models_atcircle( trace, true );
level.spamed_models = array_combine( level.spamed_models, models );
level.spaming_models = false;
}

getrandom_spammodel()
{
models = level.spam_model_group[ level.spam_model_current_group ].models;
return models[ randomint( models.size ) ];
}

spam_models_atcircle( trace, bRandomrotation, bForcedSpam )
{
if ( !isdefined( bForcedSpam ) )
bForcedSpam = false;
models = [];
incdistance = level.spam_density_scale;
radius = level.spam_model_radius;
incs = int( radius / incdistance ) * 2;
startpoint = 0;
traceorg = trace[ "position" ];
angles = vectortoangles( trace[ "normal" ] );
if ( bRandomrotation )
angles += ( 0, randomfloat( 360 ), 0 );
xvect = vectornormalize( anglestoright( angles ) );
yvect = vectornormalize( anglestoup( angles ) );
startpos = traceorg;
startpos -= ( xvect * radius );
startpos -= ( yvect * radius );
startpos += ( xvect * incdistance );
startpos += ( yvect * incdistance );

modelpos = startpos;
// special for when circle is too small for current density to place anything. Just place one in the center..
if ( incs == 0 || level.bPosedstyle )
{
if ( !bForcedSpam )
if ( is_too_dense( traceorg ) )
return models;
if ( !bForcedSpam )
if ( level.spamed_models.size + models.size > level.painter_max )
return models;

getmodel = getrandom_spammodel();
models[ 0 ] = spam_modelattrace( trace, getmodel );
models[ 0 ] orient_model();

return models;
}

countourtrace = [];
for ( x = startpoint;x < incs;x++ )
for ( y = startpoint;y < incs;y++ )
{
if ( !bForcedSpam )
if ( level.spamed_models.size + models.size > level.painter_max )
return models;;
modelpos = startpos;
modelpos += ( xvect * x * incdistance );
modelpos += ( yvect * y * incdistance );
if ( distance( modelpos, traceorg ) > radius )
continue;
// if ( !bForcedSpam )
countourtrace = contour_point( modelpos, angles, level.spam_model_radius );

if ( countourtrace[ "fraction" ] == 1 )
continue;
if ( is_too_dense( countourtrace[ "position" ] ) )
continue;
getmodel = getrandom_spammodel();

model = spam_modelattrace( countourtrace, getmodel );
model orient_model();
models[ models.size ] = model;

}
return models;
}

is_too_dense( testorg )
{
// going backwards will be faster
for ( i = level.spamed_models.size - 1; i >= 0; i -- )
if ( distance( level.spamed_models[ i ].orgorg, testorg ) < ( level.spam_density_scale - 1 ) )
return true;
return false;
}

get_player()
{
return getentarray( "player", "classname" )[ 0 ];
}

spam_modelattrace( trace, getmodel )
{
model = spawn( "script_model", level.painter_player.origin );
model setmodel( getmodel );
model notsolid();
model.origin = trace[ "position" ];
model.angles = vectortoangles( trace[ "normal" ] );
model addpitch( 90 );
model.orgorg = model.origin;
group = getcurrent_groupstruct();
if ( level.spam_models_isCustomheight )
model.origin += ( trace[ "normal" ] * level.spam_models_Customheight );

group = getcurrent_groupstruct();
if( isdefined( group.heightoffset[ getmodel ] ) )
model.origin += ( trace[ "normal" ] * group.heightoffset[ getmodel ] );
if( isdefined( group.modelusesprefab[ getmodel ] ) )
model.modelusesprefab = group.modelusesprefab[ getmodel ];

return model;
}

contour_point( origin, angles, height )
{
offset = height;
vect = anglestoforward( angles );
destorg = origin + ( vect * offset );
targetorg = origin + ( vect * - 1 * offset );
return bullettrace( destorg, targetorg, 0, level.painter_player );
}

plot_circle( origin, radius, angles, color, circleres, contourdepth )
{
if ( !isdefined( color ) )
color = ( 0, 1, 0 );
if ( !isdefined( circleres ) )
circleres = 16;
hemires = circleres / 2;
circleinc = 360 / circleres;
circleres++ ;
plotpoints = [];
rad = 0;
plotpoints = [];
rad = 0.000;
for ( i = 0;i < circleres;i++ )
{
baseorg = origin + ( anglestoup( ( angles + ( 0, 0, rad ) ) ) * radius );
point = contour_point( baseorg, angles, level.spam_model_radius );
if ( point[ "fraction" ] != 1 )
plotpoints[ plotpoints.size ] = point[ "position" ];
rad += circleinc;
}
plot_points( plotpoints, color[ 0 ], color[ 1 ], color[ 2 ] );
plotpoints = [];
}

spam_model_erase( trace )
{
traceorg = trace[ "position" ];
keepmodels = [];
deletemodels = [];
for ( i = 0;i < level.spamed_models.size;i++ )
{
if ( distance( level.spamed_models[ i ].orgorg, traceorg ) > level.spam_model_radius )
keepmodels[ keepmodels.size ] = level.spamed_models[ i ];
else
deletemodels[ deletemodels.size ] = level.spamed_models[ i ];
}
level.spamed_models = keepmodels;

for ( i = 0;i < deletemodels.size;i++ )
deletemodels[ i ] delete();
}

dump_models()
{
/#
if ( ! level.spamed_models.size )
return;
fileprint_launcher_start_file();
fileprint_map_start();
for ( i = 0;i < level.spamed_models.size;i++ )
{
origin = fileprint_radiant_vec( level.spamed_models[ i ].origin );// convert these vectors to mapfile keypair format
angles = fileprint_radiant_vec( level.spamed_models[ i ].angles );

fileprint_map_entity_start();
if( isdefined ( level.spamed_models[ i ].modelusesprefab ) && level.spamed_models[ i ].modelusesprefab )
{
fileprint_map_keypairprint( "classname", "misc_prefab" );
fileprint_map_keypairprint( "model", "prefabs/misc_models/" + level.spamed_models[ i ].model + ".map" );
}
else
{
fileprint_map_keypairprint( "classname", "misc_model" );
fileprint_map_keypairprint( "model", level.spamed_models[ i ].model );
}
fileprint_map_keypairprint( "origin", origin );
fileprint_map_keypairprint( "angles", angles );
fileprint_map_keypairprint( "spammed_model", level.spam_model_current_group );
fileprint_map_entity_end();
}
map_path = level.script+"_modeldump.map";
if( !fileprint_launcher_end_file( "/map_source/"+map_path,false ) )
return;
launcher_write_clipboard( map_path );
array_thread( level.spamed_models, ::deleteme );
level.spamed_models = [];
#/
}

draw_axis( org, angles )
{
range = 32;
forward = range * anglestoforward( angles );
right = range * anglestoright( angles );
up = range * anglestoup( angles );
line( org, org + forward, ( 1, 0, 0 ), 1 );
line( org, org + up, ( 0, 1, 0 ), 1 );
line( org, org + right, ( 0, 0, 1 ), 1 );
}

_newhudelem()
{
if ( !isdefined( level.scripted_elems ) )
level.scripted_elems = [];
elem = newhudelem();
level.scripted_elems[ level.scripted_elems.size ] = elem;
return elem;
}

_settext( text )
{
self.realtext = text;
self settext( "_" );
self thread _clearalltextafterhudelem();
sizeofelems = 0;
foreach ( elem in level.scripted_elems )
{
if ( isdefined( elem.realtext ) )
{
sizeofelems += elem.realtext.size;
elem settext( elem.realtext );
}
}
println( "SIze of elems: " + sizeofelems );
}

controler_hud_add( identifier, inc, initial_text, initial_description_text, initial_value )
{
startx = 520;
if ( is_mp() )
startx = 630;
starty = 120;
space = 18;
basealpha = .8;
denradoffset = 20;
descriptionscale = 1.4;
if ( !isdefined( initial_text ) )
initial_text = "";

if ( !isdefined( level.hud_controler ) || !isdefined( level.hud_controler[ identifier ] ) )
{
level.hud_controler[ identifier ] = _newhudelem();
description = _newhudelem();
}
else
description = level.hud_controler[ identifier ].description;

level.hud_controler[ identifier ].location = 0;
level.hud_controler[ identifier ].alignX = "right";
level.hud_controler[ identifier ].alignY = "middle";
level.hud_controler[ identifier ].foreground = 1;
level.hud_controler[ identifier ].fontscale = 1.5;
level.hud_controler[ identifier ].sort = 20;
level.hud_controler[ identifier ].alpha = basealpha;
level.hud_controler[ identifier ].x = startx + denradoffset;
level.hud_controler[ identifier ].y = starty + ( inc * space );
level.hud_controler[ identifier ] _settext( initial_text );
level.hud_controler[ identifier ].base_button_text = initial_text;

description.location = 0;
description.alignX = "left";
description.alignY = "middle";
description.foreground = 1;
description.fontscale = descriptionscale;
description.sort = 20;
description.alpha = basealpha;
description.x = startx + denradoffset;
description.y = starty + ( inc * space );
if ( isdefined( initial_value ) )
description setvalue( initial_value );
if ( isdefined( initial_description_text ) )
description _settext( initial_description_text );
level.hud_controler[ identifier ].description = description;
}

controler_hud_update_text( hudid, text )
{
if ( is_mp() )
{
level.hud_controler[ hudid ] _settext( level.hud_controler[ hudid ].base_button_text + text );
level.hud_controler[ hudid ].description _settext( "" );
}
else
level.hud_controler[ hudid ].description _settext( text );



}

controler_hud_update_button( hudid, text )
{
level.hud_controler[ hudid ] _settext( text );
}


_clearalltextafterhudelem()
{
if ( level._clearalltextafterhudelem )
return;
level._clearalltextafterhudelem = true;
self clearalltextafterhudelem();
wait .05;
level._clearalltextafterhudelem = false;

}

is_mp()
{
return issubstr( level.script, "mp_" );
}


Here's some interesting things I found in this .gsc:
    
//who knows what the mp scripts are doing I took a dive deep into them and discovered many hud elements being controled through code and not through a menu that can be easily disabled
// here I simply automate some things to get the user up and running.
// get the player going. I don't handle people dieing in this tool since they are in ufo mode anyway.


    // painter.menu execs some console commands( ufo mode ).. sneaky hacks.


    //shorter list for mp cause it's got too many g_configstring somesuch. There is probably better check than substr on the mapname. [COLOR="Red"]I don't think this will bite me though, knock on wood.[/COLOR]



EDIT! This doesn't seem to be just ufo mode. This seems to be a script for map building. The reason I think this is because of these lines:
    hint_buttons_rotation()
{
controler_hud_update_text( "helpxy", "^4 - ^7 / ^3 - " );
controler_hud_update_text( "helpab", "^2[COLOR="Red"]RotateOther Up ^7 / ^1Down [/COLOR]" );
controler_hud_update_text( "helplsrs", "^8 - ^7 / - " );
controler_hud_update_text( "helplbrb", "^8 - ^7 / - " );
controler_hud_update_text( "helpdpl", "^8 - ^7 / - " );
controler_hud_update_text( "helpdpu", "^8Set ^7 / - " );
controler_hud_update_text( "helpF", " - " );
}


    hint_buttons_zoffset()
{
controler_hud_update_text( "helpxy", "^4 - ^7 / ^3 - " );
controler_hud_update_text( "helpab", "^2[COLOR="red"]Height Down ^7 / ^1Up [/COLOR]" );
controler_hud_update_text( "helplsrs", "^8 - ^7 / - " );
controler_hud_update_text( "helplbrb", "^8 - ^7 / - " );
controler_hud_update_text( "helpdpl", "^8 - ^7 / Set" );
controler_hud_update_text( "helpdpu", "^8 - ^7 / - " );
controler_hud_update_text( "helpF", " - " );
}


    hint_buttons_main()
{
controler_hud_update_text( "helpxy", "^4[COLOR="red"]Select Set Up ^7 / ^3Down[/COLOR]" );
controler_hud_update_text( "helpab", "^2[COLOR="red"]Spacing Down ^7 / ^1up[/COLOR] " );
controler_hud_update_text( "helplsrs", "^8[COLOR="red"]Radius Down ^7 / Up[/COLOR]" );
controler_hud_update_text( "helplbrb", "^8[COLOR="red"]Remove ^7 / Place[/COLOR]" );
controler_hud_update_text( "helpdpl", "^8[COLOR="red"]zOffset Clear ^7 / Set[/COLOR]" );
controler_hud_update_text( "helpdpu", "^8[COLOR="red"]Rotation Clear ^7 / Set[/COLOR]" );
// controler_hud_update_text( "helpF", text );

}


    
(adsbygoogle = window.adsbygoogle || []).push({});

The following user thanked FourzerotwoFAILS for this useful post:

Strike Venom
02-26-2011, 05:11 AM #2
As I say again, nice discovery Watson! This is very interesting... If this was made for map building, why was it left in here? Oh, I know IW is too LAZY as usual... Who knows what this can do in patches!
02-26-2011, 05:18 AM #3
The Open Minded
☮✌Peace Maker✌☮
Good bit of info mate. I'd love to see some features built from this!
02-26-2011, 05:18 AM #4
XKevin356
Are you high?
maybe we could use it non host?

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo