383 lines
16 KiB
Plaintext
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");
|
|
}
|
|
|
|
#/
|