boiii-scripts/shared/dev_shared.gsc
2023-04-13 17:30:38 +02:00

383 lines
16 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\array_shared;
#using scripts\shared\colors_shared;
#using scripts\shared\math_shared;
#using scripts\shared\spawner_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#namespace dev;
/#
function debug_sphere( origin, radius, color, alpha, time )
{
if ( !isdefined(time) )
{
time = 1000;
}
if ( !isdefined(color) )
{
color = (1,1,1);
}
sides = Int(10 * ( 1 + Int(radius) % 100 ));
sphere( origin, radius, color, alpha, true, sides, time );
}
function updateMinimapSetting()
{
// use 0 for no required map aspect ratio.
requiredMapAspectRatio = GetDvarfloat( "scr_requiredMapAspectRatio");
if (!isdefined(level.minimapheight)) {
SetDvar("scr_minimap_height", "0");
level.minimapheight = 0;
}
minimapheight = GetDvarfloat( "scr_minimap_height");
if (minimapheight != level.minimapheight)
{
if ( minimapheight <= 0 )
{
util::getHostPlayer() CameraActivate( false );
level.minimapheight = minimapheight;
level notify("end_draw_map_bounds");
}
if (minimapheight > 0)
{
level.minimapheight = minimapheight;
players = GetPlayers();
if (players.size > 0)
{
player = util::getHostPlayer();
corners = getentarray("minimap_corner", "targetname");
if (corners.size == 2)
{
viewpos = (corners[0].origin + corners[1].origin);
viewpos = (viewpos[0]*.5, viewpos[1]*.5, viewpos[2]*.5);
level thread minimapWarn( corners );
maxcorner = (corners[0].origin[0], corners[0].origin[1], viewpos[2]);
mincorner = (corners[0].origin[0], corners[0].origin[1], viewpos[2]);
if (corners[1].origin[0] > corners[0].origin[0])
maxcorner = (corners[1].origin[0], maxcorner[1], maxcorner[2]);
else
mincorner = (corners[1].origin[0], mincorner[1], mincorner[2]);
if (corners[1].origin[1] > corners[0].origin[1])
maxcorner = (maxcorner[0], corners[1].origin[1], maxcorner[2]);
else
mincorner = (mincorner[0], corners[1].origin[1], mincorner[2]);
viewpostocorner = maxcorner - viewpos;
viewpos = (viewpos[0], viewpos[1], viewpos[2] + minimapheight);
northvector = (cos(getnorthyaw()), sin(getnorthyaw()), 0);
eastvector = (northvector[1], 0 - northvector[0], 0);
disttotop = vectordot(northvector, viewpostocorner);
if (disttotop < 0)
disttotop = 0 - disttotop;
disttoside = vectordot(eastvector, viewpostocorner);
if (disttoside < 0)
disttoside = 0 - disttoside;
// extend map bounds to meet the required aspect ratio
if ( requiredMapAspectRatio > 0 )
{
mapAspectRatio = disttoside / disttotop;
if ( mapAspectRatio < requiredMapAspectRatio )
{
incr = requiredMapAspectRatio / mapAspectRatio;
disttoside *= incr;
addvec = vecscale( eastvector, vectordot( eastvector, maxcorner - viewpos ) * (incr - 1) );
mincorner -= addvec;
maxcorner += addvec;
}
else
{
incr = mapAspectRatio / requiredMapAspectRatio;
disttotop *= incr;
addvec = vecscale( northvector, vectordot( northvector, maxcorner - viewpos ) * (incr - 1) );
mincorner -= addvec;
maxcorner += addvec;
}
}
if ( level.console )
{
aspectratioguess = 16.0/9.0;
// .8 would be .75 but it needs to be bigger because of safe area
angleside = 2 * atan(disttoside * .8 / minimapheight);
angletop = 2 * atan(disttotop * aspectratioguess * .8 / minimapheight);
}
else
{
aspectratioguess = 4.0/3.0;
angleside = 2 * atan(disttoside / minimapheight);
angletop = 2 * atan(disttotop * aspectratioguess / minimapheight);
}
if (angleside > angletop)
angle = angleside;
else
angle = angletop;
znear = minimapheight - 1000;
if (znear < 16) znear = 16;
if (znear > 10000) znear = 10000;
player CameraSetPosition( viewpos, ( 90, getnorthyaw(), 0 ) );
player CameraActivate( true );
player TakeAllWeapons();
SetDvar( "cg_drawGun", 0 );
SetDvar( "cg_draw2D", 0 );
SetDvar( "cg_drawFPS", 0 );
SetDvar( "fx_enable", 0 );
SetDvar( "r_fog", 0 );
SetDvar( "r_highLodDist", 0 ); // (turns off lods)
SetDvar( "r_znear", znear ); // (reduces z-fighting)
SetDvar( "r_lodScaleRigid", 0.1 );
SetDvar( "cg_drawVersion", 0 );
SetDvar( "sm_enable", 1 );
SetDvar( "player_view_pitch_down", 90 );
SetDvar( "player_view_pitch_up", 0 );
SetDvar( "cg_drawMinimap", 1 );
SetDvar( "r_umbraDistanceScale", 1 );
SetDvar( "r_useLensFov", 0 );
SetDvar( "ui_enabled", 0 );
SetDvar( "debug_show_viewpos", "0" );
// hide 3D icons
if ( isdefined( level.objPoints ) )
{
for ( i = 0; i < level.objPointNames.size; i++ )
{
if ( isdefined( level.objPoints[level.objPointNames[i]] ) )
level.objPoints[level.objPointNames[i]] destroy();
}
level.objPoints = [];
level.objPointNames = [];
}
thread drawMiniMapBounds(viewpos, mincorner, maxcorner);
}
else
println("^1Error: There are not exactly 2 \"minimap_corner\" entities in the level.");
}
else
SetDvar("scr_minimap_height", "0");
}
}
}
function vecscale(vec, scalar)
{
return (vec[0]*scalar, vec[1]*scalar, vec[2]*scalar);
}
function drawMiniMapBounds(viewpos, mincorner, maxcorner)
{
level notify("end_draw_map_bounds");
level endon("end_draw_map_bounds");
viewheight = (viewpos[2] - maxcorner[2]);
north = (cos(getnorthyaw()), sin(getnorthyaw()), 0);
diaglen = length(mincorner - maxcorner);
/*diagonal = maxcorner - mincorner;
side = vecscale(north, vectordot(diagonal, north));
origcorner0 = mincorner;
origcorner1 = mincorner + side;
origcorner2 = maxcorner;
origcorner3 = maxcorner - side;*/
mincorneroffset = (mincorner - viewpos);
mincorneroffset = vectornormalize((mincorneroffset[0], mincorneroffset[1], 0));
mincorner = mincorner + vecscale(mincorneroffset, diaglen * 1/800);
maxcorneroffset = (maxcorner - viewpos);
maxcorneroffset = vectornormalize((maxcorneroffset[0], maxcorneroffset[1], 0));
maxcorner = maxcorner + vecscale(maxcorneroffset, diaglen * 1/800);
diagonal = maxcorner - mincorner;
side = vecscale(north, vectordot(diagonal, north));
sidenorth = vecscale(north, abs(vectordot(diagonal, north)));
corner0 = mincorner;
corner1 = mincorner + side;
corner2 = maxcorner;
corner3 = maxcorner - side;
toppos = vecscale(mincorner + maxcorner, .5) + vecscale(sidenorth, .51);
textscale = diaglen * .003;
while(1)
{
line(corner0, corner1);
line(corner1, corner2);
line(corner2, corner3);
line(corner3, corner0);
/*line(origcorner0, origcorner1, (1,0,0));
line(origcorner1, origcorner2, (1,0,0));
line(origcorner2, origcorner3, (1,0,0));
line(origcorner3, origcorner0, (1,0,0));*/
print3d(toppos, "This Side Up", (1,1,1), 1, textscale);
wait .05;
}
}
function minimapWarn( corners )
{
threshold = 10;
width = Abs( corners[0].origin[0] - corners[1].origin[0] );
width = Int( width );
height = Abs( corners[0].origin[1] - corners[1].origin[1] );
height = Int( height );
if ( Abs( width - height ) > threshold )
{
for ( ;; )
{
iprintln( "^1Warning: Minimap corners do not form a square (width: " + width + " height: " + height + ")\n" );
if ( height > width )
{
scale = height / width;
iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in height more than width\n" );
}
else
{
scale = width / height;
iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in width more than height\n" );
}
wait( 10 );
}
}
}
function body_customization_setup_helmet( helmet_index )
{
foreach( player in GetPlayers() )
{
player SetCharacterHelmetStyle( helmet_index );
}
}
function body_customization_setup_body( character_index, body_index )
{
foreach( player in GetPlayers() )
{
player SetCharacterBodyType( character_index );
player SetCharacterBodyStyle( body_index );
}
}
function body_customization_process_command( character_index )
{
split = StrTok( character_index, "+" );
switch( split.size )
{
default:
case 1:
command0 = StrTok( split[0], ":" );
character_index = Int( command0[1] );
body_index = 0;
helmet_index = 0;
body_customization_setup_helmet( helmet_index );
body_customization_setup_body( character_index, body_index );
break;
case 2:
command0 = StrTok( split[0], ":" );
character_index = Int( command0[1] );
command1 = StrTok( split[1], ":" );
if( command1[0] == "bodystyle" )
{
body_index = Int( command1[1] );
body_customization_setup_body( character_index, body_index );
}
else if( command1[0] == "helmet" )
{
helmet_index = Int( command1[1] );
body_customization_setup_helmet( helmet_index );
}
break;
}
}
function body_customization_populate( mode )
{
bodies = GetAllCharacterBodies( mode );
body_customization_devgui_base = "devgui_cmd \"Player/Customization/Body/";
foreach( playerbodytype in bodies )
{
body_name = MakeLocalizedString(GetCharacterDisplayName( playerbodytype, mode )) + " (" + GetCharacterAssetName( playerbodytype, mode ) + ")";
//add default option
AddDebugCommand( body_customization_devgui_base + body_name + "/Default" + "\" \"set "+"char_devgui"+" "+ "bodytype:" + playerbodytype +"\" \n");
//populate all body models
for( i = 0; i < GetCharacterBodyModelCount( playerbodytype, mode ); i++ )
{
AddDebugCommand( body_customization_devgui_base + body_name + "/Body Styles/Body " + i +"\" \"set "+"char_devgui"+" "+ "bodytype:" + playerbodytype + "+" + "bodystyle:" + i +"\" \n");
{wait(.05);};
}
//populate all head models
for( i = 0; i < GetCharacterHelmetModelCount( playerbodytype, mode ); i++ )
{
AddDebugCommand( body_customization_devgui_base + body_name + "/Helmets/Helmet " + i +"\" \"set "+"char_devgui"+" "+ "bodytype:" + playerbodytype + "+" + "helmet:" + i +"\" \n");
{wait(.05);};
}
{wait(.05);};
}
}
function body_customization_devgui( mode )
{
thread body_customization_populate( mode );
for ( ;; )
{
character_index = GetDvarString( "char_devgui" );
if ( character_index != "" )
{
body_customization_process_command( character_index );
}
SetDvar( "char_devgui", "" );
wait( 0.5 );
}
}
function add_perk_devgui( name, specialties )
{
perk_devgui_base = "devgui_cmd \"Player/Perks/Give Perk/";
perk_name = MakeLocalizedString(name);
test = perk_devgui_base + perk_name + "\" \"set "+"scr_giveperk"+" "+ specialties +"\" \n";
AddDebugCommand( perk_devgui_base + perk_name + "\" \"set "+"scr_giveperk"+" "+ specialties +"\" \n");
}
#/