mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-08 01:47:50 -05:00
checked 3 scripts 1 of which was a dual script
_copter, and _wager for patch_mp have been checked. _weapons for patch_mp and patch_zm have been checked.
This commit is contained in:
parent
2a63ea0438
commit
83a2e644ea
@ -1,5 +1,6 @@
|
||||
//checked no includes
|
||||
|
||||
init()
|
||||
init() //checked changed to match cerberus output
|
||||
{
|
||||
level.coptermodel = "vehicle_cobra_helicopter_fly";
|
||||
precachemodel( level.coptermodel );
|
||||
@ -7,55 +8,48 @@ init()
|
||||
level.copter_maxvel = 700;
|
||||
level.copter_rotspeed = 90;
|
||||
level.copter_accellookahead = 2;
|
||||
level.coptercenteroffset = vectorScale( ( 0, 0, -1 ), 72 );
|
||||
level.coptertargetoffset = vectorScale( ( 0, 0, -1 ), 45 );
|
||||
level.coptercenteroffset = vectorScale( ( 0, 0, 1 ), 72 );
|
||||
level.coptertargetoffset = vectorScale( ( 0, 0, 1 ), 45 );
|
||||
level.copterexplosion = loadfx( "explosions/fx_default_explosion" );
|
||||
level.copterfinalexplosion = loadfx( "explosions/fx_large_vehicle_explosion" );
|
||||
}
|
||||
|
||||
getabovebuildingslocation( location )
|
||||
getabovebuildingslocation( location ) //checked changed to match cerberus output
|
||||
{
|
||||
trace = bullettrace( location + vectorScale( ( 0, 0, -1 ), 10000 ), location, 0, undefined );
|
||||
trace = bullettrace( location + vectorScale( ( 0, 0, 1 ), 10000 ), location, 0, undefined );
|
||||
startorigin = trace[ "position" ] + vectorScale( ( 0, 0, -1 ), 514 );
|
||||
zpos = 0;
|
||||
maxxpos = 13;
|
||||
maxypos = 13;
|
||||
xpos = 0;
|
||||
while ( xpos < maxxpos )
|
||||
for ( xpos = 0; xpos < maxxpos; xpos++ )
|
||||
{
|
||||
ypos = 0;
|
||||
while ( ypos < maxypos )
|
||||
for ( ypos = 0; ypos < maxypos; ypos++ )
|
||||
{
|
||||
thisstartorigin = startorigin + ( ( ( xpos / ( maxxpos - 1 ) ) - 0,5 ) * 1024, ( ( ypos / ( maxypos - 1 ) ) - 0,5 ) * 1024, 0 );
|
||||
thisstartorigin = startorigin + ( ( ( xpos / ( maxxpos - 1 ) ) - 0.5 ) * 1024, ( ( ypos / ( maxypos - 1 ) ) - 0.5 ) * 1024, 0 );
|
||||
thisorigin = bullettrace( thisstartorigin, thisstartorigin + vectorScale( ( 0, 0, -1 ), 10000 ), 0, undefined );
|
||||
zpos += thisorigin[ "position" ][ 2 ];
|
||||
ypos++;
|
||||
}
|
||||
xpos++;
|
||||
}
|
||||
zpos /= maxxpos * maxypos;
|
||||
zpos += 850;
|
||||
return ( location[ 0 ], location[ 1 ], zpos );
|
||||
}
|
||||
|
||||
vectorangle( v1, v2 )
|
||||
vectorangle( v1, v2 ) //checked changed to match cerberus output
|
||||
{
|
||||
dot = vectordot( v1, v2 );
|
||||
if ( dot >= 1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
else if ( dot <= -1 )
|
||||
{
|
||||
if ( dot <= -1 )
|
||||
{
|
||||
return 180;
|
||||
}
|
||||
return 180;
|
||||
}
|
||||
return acos( dot );
|
||||
}
|
||||
|
||||
vectortowardsothervector( v1, v2, angle )
|
||||
vectortowardsothervector( v1, v2, angle ) //checked matches cerberus output
|
||||
{
|
||||
dot = vectordot( v1, v2 );
|
||||
if ( dot <= -1 )
|
||||
@ -66,18 +60,18 @@ vectortowardsothervector( v1, v2, angle )
|
||||
return vectorScale( v1, cos( angle ) ) + vectorScale( v3, sin( angle ) );
|
||||
}
|
||||
|
||||
veclength( v )
|
||||
veclength( v ) //checked changed to match cerberus output
|
||||
{
|
||||
return distance( ( 0, 0, -1 ), v );
|
||||
return distance( ( 0, 0, 0 ), v );
|
||||
}
|
||||
|
||||
createcopter( location, team, damagetrig )
|
||||
createcopter( location, team, damagetrig ) //checked changed to match cerberus output dvars taken from the beta dump
|
||||
{
|
||||
location = getabovebuildingslocation( location );
|
||||
scriptorigin = spawn( "script_origin", location );
|
||||
scriptorigin.angles = vectorToAngle( ( 0, 0, -1 ) );
|
||||
scriptorigin.angles = vectorToAngle( ( 1, 0, 0 ) );
|
||||
copter = spawn( "script_model", location );
|
||||
copter.angles = vectorToAngle( ( 0, 0, -1 ) );
|
||||
copter.angles = vectorToAngle( ( 1, 0, 0 ) );
|
||||
copter linkto( scriptorigin );
|
||||
scriptorigin.copter = copter;
|
||||
copter setmodel( level.coptermodel );
|
||||
@ -87,15 +81,15 @@ createcopter( location, team, damagetrig )
|
||||
scriptorigin.damagetrig = damagetrig;
|
||||
scriptorigin.finaldest = location;
|
||||
scriptorigin.finalzdest = location[ 2 ];
|
||||
scriptorigin.desireddir = ( 0, 0, -1 );
|
||||
scriptorigin.desireddir = ( 1, 0, 0 );
|
||||
scriptorigin.desireddirentity = undefined;
|
||||
scriptorigin.desireddirentityoffset = ( 0, 0, -1 );
|
||||
scriptorigin.vel = ( 0, 0, -1 );
|
||||
scriptorigin.desireddirentityoffset = ( 0, 0, 0 );
|
||||
scriptorigin.vel = ( 0, 0, 0 );
|
||||
scriptorigin.dontascend = 0;
|
||||
scriptorigin.health = 2000;
|
||||
if ( getDvar( #"A8262D2E" ) != "" )
|
||||
if ( getDvar( "scr_copter_health" ) != "" )
|
||||
{
|
||||
scriptorigin.health = getDvarFloat( #"A8262D2E" );
|
||||
scriptorigin.health = getDvarFloat( "scr_copter_health" );
|
||||
}
|
||||
scriptorigin.team = team;
|
||||
scriptorigin thread copterai();
|
||||
@ -103,7 +97,7 @@ createcopter( location, team, damagetrig )
|
||||
return scriptorigin;
|
||||
}
|
||||
|
||||
makecopterpassive()
|
||||
makecopterpassive() //checked matches cerberus output
|
||||
{
|
||||
self.damagetrig notify( "unlink" );
|
||||
self.damagetrig = undefined;
|
||||
@ -112,7 +106,7 @@ makecopterpassive()
|
||||
self.desireddir = undefined;
|
||||
}
|
||||
|
||||
makecopteractive( damagetrig )
|
||||
makecopteractive( damagetrig ) //checked matches cerberus output
|
||||
{
|
||||
damagetrig.origin = self.origin;
|
||||
damagetrig thread mylinkto( self );
|
||||
@ -121,18 +115,18 @@ makecopteractive( damagetrig )
|
||||
self thread copterdamage( damagetrig );
|
||||
}
|
||||
|
||||
mylinkto( obj )
|
||||
mylinkto( obj ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "unlink" );
|
||||
while ( 1 )
|
||||
{
|
||||
self.angles = obj.angles;
|
||||
self.origin = obj.origin;
|
||||
wait 0,1;
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
setcopterdefensearea( areaent )
|
||||
setcopterdefensearea( areaent ) //checked changed to match cerberus output
|
||||
{
|
||||
self.areaent = areaent;
|
||||
self.areadescentpoints = [];
|
||||
@ -140,15 +134,13 @@ setcopterdefensearea( areaent )
|
||||
{
|
||||
self.areadescentpoints = getentarray( areaent.target, "targetname" );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.areadescentpoints.size )
|
||||
for ( i = 0; i < self.areadescentpoints.size; i++ )
|
||||
{
|
||||
self.areadescentpoints[ i ].targetent = getent( self.areadescentpoints[ i ].target, "targetname" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
copterai()
|
||||
copterai() //checked changed to match cerberus output and partially the beta dump
|
||||
{
|
||||
self thread coptermove();
|
||||
self thread coptershoot();
|
||||
@ -160,16 +152,16 @@ copterai()
|
||||
returningtoarea = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
while ( !isDefined( self.areaent ) )
|
||||
if ( !isDefined( self.areaent ) )
|
||||
{
|
||||
wait 1;
|
||||
continue;
|
||||
}
|
||||
players = level.players;
|
||||
enemytargets = [];
|
||||
while ( self.team != "neutral" )
|
||||
if ( self.team != "neutral" )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( isalive( players[ i ] ) && isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] != self.team && !isDefined( players[ i ].usingobj ) )
|
||||
{
|
||||
@ -180,30 +172,25 @@ copterai()
|
||||
enemytargets[ enemytargets.size ] = players[ i ];
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
insidetargets = [];
|
||||
outsidetargets = [];
|
||||
skyheight = bullettrace( self.origin, self.origin + vectorScale( ( 0, 0, -1 ), 10000 ), 0, undefined )[ "position" ][ 2 ] - 10;
|
||||
skyheight = bullettrace( self.origin, self.origin + vectorScale( ( 0, 0, 1 ), 10000 ), 0, undefined )[ "position" ][ 2 ] - 10;
|
||||
besttarget = undefined;
|
||||
bestweight = 0;
|
||||
i = 0;
|
||||
while ( i < enemytargets.size )
|
||||
for ( i = 0; i < enemytargets.size; i++ )
|
||||
{
|
||||
inside = 0;
|
||||
trace = bullettrace( enemytargets[ i ].origin + vectorScale( ( 0, 0, -1 ), 10 ), enemytargets[ i ].origin + vectorScale( ( 0, 0, -1 ), 10000 ), 0, undefined );
|
||||
trace = bullettrace( enemytargets[ i ].origin + vectorScale( ( 0, 0, 1 ), 10 ), enemytargets[ i ].origin + vectorScale( ( 0, 0, 1 ), 10000 ), 0, undefined );
|
||||
if ( trace[ "position" ][ 2 ] >= skyheight )
|
||||
{
|
||||
outsidetargets[ outsidetargets.size ] = enemytargets[ i ];
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
insidetargets[ insidetargets.size ] = enemytargets[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
gotopos = undefined;
|
||||
calcedgotopos = 0;
|
||||
@ -218,7 +205,6 @@ copterai()
|
||||
if ( isDefined( descendingent ) )
|
||||
{
|
||||
gotopos = result[ "position" ];
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -226,19 +212,18 @@ copterai()
|
||||
}
|
||||
}
|
||||
}
|
||||
else olddescendingent = descendingent;
|
||||
if ( insidetargets.size == 0 )
|
||||
else
|
||||
{
|
||||
flying = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( outsidetargets.size > 0 )
|
||||
olddescendingent = descendingent;
|
||||
if ( insidetargets.size == 0 )
|
||||
{
|
||||
flying = 1;
|
||||
}
|
||||
else if ( outsidetargets.size > 0 )
|
||||
{
|
||||
if ( !isDefined( descendingent ) )
|
||||
{
|
||||
flying = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -265,7 +250,6 @@ copterai()
|
||||
descendingent = result[ "descendEnt" ];
|
||||
gotopos = result[ "position" ];
|
||||
reacheddescendingent = 0;
|
||||
break;
|
||||
}
|
||||
else if ( isDefined( descendingent ) )
|
||||
{
|
||||
@ -277,7 +261,6 @@ copterai()
|
||||
{
|
||||
gotopos = descendingent.origin;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -293,20 +276,20 @@ copterai()
|
||||
{
|
||||
desireddist = 2560;
|
||||
disttoarea = distance( ( self.origin[ 0 ], self.origin[ 1 ], self.areaent.origin[ 2 ] ), self.areaent.origin );
|
||||
if ( outsidetargets.size == 0 && disttoarea > ( self.areaent.radius + ( desireddist * 0,25 ) ) )
|
||||
if ( outsidetargets.size == 0 && disttoarea > ( self.areaent.radius + ( desireddist * 0.25 ) ) )
|
||||
{
|
||||
returningtoarea = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( disttoarea < ( self.areaent.radius * 0,5 ) )
|
||||
if ( disttoarea < ( self.areaent.radius * 0.5 ) )
|
||||
{
|
||||
returningtoarea = 0;
|
||||
}
|
||||
}
|
||||
while ( outsidetargets.size == 0 && !returningtoarea )
|
||||
if ( outsidetargets.size == 0 && !returningtoarea )
|
||||
{
|
||||
while ( self.team != "neutral" )
|
||||
if ( self.team != "neutral" )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
@ -326,8 +309,7 @@ copterai()
|
||||
}
|
||||
best = undefined;
|
||||
bestdist = 0;
|
||||
i = 0;
|
||||
while ( i < outsidetargets.size )
|
||||
for ( i = 0; i < outsidetargets.size; i++ )
|
||||
{
|
||||
dist = abs( distance( outsidetargets[ i ].origin, self.origin ) - desireddist );
|
||||
if ( !isDefined( best ) || dist < bestdist )
|
||||
@ -335,7 +317,6 @@ copterai()
|
||||
best = outsidetargets[ i ];
|
||||
bestdist = dist;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( isDefined( best ) )
|
||||
{
|
||||
@ -357,42 +338,51 @@ copterai()
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if ( distance( self.origin, descendingent.origin ) < descendingent.radius )
|
||||
else
|
||||
{
|
||||
reacheddescendingent = 1;
|
||||
}
|
||||
if ( isDefined( olddescendingent ) )
|
||||
{
|
||||
godirectly = olddescendingent == descendingent;
|
||||
}
|
||||
if ( godirectly )
|
||||
{
|
||||
godirectly = reacheddescendingent;
|
||||
}
|
||||
self.desireddir = vectornormalize( descendingent.targetent.origin - gotopos - level.coptercenteroffset );
|
||||
self.desireddirentity = descendingent.targetent;
|
||||
self.desireddirentityoffset = ( 0, 0, -1 );
|
||||
if ( gotopos != self.origin )
|
||||
{
|
||||
self setcopterdest( gotopos - level.coptercenteroffset, 1, godirectly );
|
||||
wait 0,3;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,3;
|
||||
if ( distance( self.origin, descendingent.origin ) < descendingent.radius )
|
||||
{
|
||||
reacheddescendingent = 1;
|
||||
}
|
||||
if ( isdefined( oldDescendingEnt ) && oldDescendingEnt == descendingEnt )
|
||||
{
|
||||
goDirectly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
goDirectly = 0;
|
||||
}
|
||||
if ( goDirectly && reachedDescendingEnt )
|
||||
{
|
||||
goDirectly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
goDirectly = 0;
|
||||
}
|
||||
self.desireddir = vectornormalize( descendingent.targetent.origin - gotopos - level.coptercenteroffset );
|
||||
self.desireddirentity = descendingent.targetent;
|
||||
self.desireddirentityoffset = ( 0, 0, 0 );
|
||||
if ( gotopos != self.origin )
|
||||
{
|
||||
self setcopterdest( gotopos - level.coptercenteroffset, 1, godirectly );
|
||||
wait 0.3;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0.3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
determinebestpos( targets, descendent, startorigin )
|
||||
determinebestpos( targets, descendent, startorigin ) //checked changed to match cerberus output
|
||||
{
|
||||
targetpos = descendent.targetent.origin;
|
||||
circleradius = distance( targetpos, descendent.origin );
|
||||
bestpoint = undefined;
|
||||
bestdist = 0;
|
||||
i = 0;
|
||||
while ( i < targets.size )
|
||||
for ( i = 0; i < targets.size; i++ )
|
||||
{
|
||||
enemypos = targets[ i ].origin + level.coptertargetoffset;
|
||||
passed = bullettracepassed( enemypos, targetpos, 0, undefined );
|
||||
@ -413,19 +403,17 @@ determinebestpos( targets, descendent, startorigin )
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return bestpoint;
|
||||
}
|
||||
|
||||
determinebestent( targets, descendents, startorigin )
|
||||
determinebestent( targets, descendents, startorigin ) //checked changed to match cerberus output
|
||||
{
|
||||
result = [];
|
||||
bestpos = undefined;
|
||||
bestent = 0;
|
||||
bestdist = 0;
|
||||
i = 0;
|
||||
while ( i < descendents.size )
|
||||
for ( i = 0; i < descendents.size; i++ )
|
||||
{
|
||||
thispos = determinebestpos( targets, descendents[ i ], startorigin );
|
||||
if ( isDefined( thispos ) )
|
||||
@ -438,7 +426,6 @@ determinebestent( targets, descendents, startorigin )
|
||||
bestdist = thisdist;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( isDefined( bestpos ) )
|
||||
{
|
||||
@ -449,7 +436,7 @@ determinebestent( targets, descendents, startorigin )
|
||||
return result;
|
||||
}
|
||||
|
||||
determinebestattackpos( targetpos, curpos, desireddist )
|
||||
determinebestattackpos( targetpos, curpos, desireddist ) //checked changed to match cerberus output
|
||||
{
|
||||
targetposcopterheight = ( targetpos[ 0 ], targetpos[ 1 ], curpos[ 2 ] );
|
||||
attackdirx = curpos - targetposcopterheight;
|
||||
@ -457,8 +444,7 @@ determinebestattackpos( targetpos, curpos, desireddist )
|
||||
attackdiry = ( 0 - attackdirx[ 1 ], attackdirx[ 0 ], 0 );
|
||||
bestpos = undefined;
|
||||
bestdist = 0;
|
||||
i = 0;
|
||||
while ( i < 8 )
|
||||
for ( i = 0; i < 8; i++ )
|
||||
{
|
||||
theta = ( i / 8 ) * 360;
|
||||
thisdir = vectorScale( attackdirx, cos( theta ) ) + vectorScale( attackdiry, sin( theta ) );
|
||||
@ -473,26 +459,28 @@ determinebestattackpos( targetpos, curpos, desireddist )
|
||||
bestdist = thisdist;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
gotopos = undefined;
|
||||
if ( isDefined( bestpos ) )
|
||||
{
|
||||
gotopos = bestpos;
|
||||
}
|
||||
else dist = distance( targetposcopterheight, curpos );
|
||||
if ( dist > desireddist )
|
||||
{
|
||||
gotopos = self.origin + vectorScale( vectornormalize( attackdirx ), 0 - dist - desireddist );
|
||||
}
|
||||
else
|
||||
{
|
||||
gotopos = self.origin;
|
||||
dist = distance( targetposcopterheight, curpos );
|
||||
if ( dist > desireddist )
|
||||
{
|
||||
gotopos = self.origin + vectorScale( vectornormalize( attackdirx ), 0 - dist - desireddist );
|
||||
}
|
||||
else
|
||||
{
|
||||
gotopos = self.origin;
|
||||
}
|
||||
}
|
||||
return gotopos;
|
||||
}
|
||||
|
||||
getrandompos( origin, radius )
|
||||
getrandompos( origin, radius ) //checked does not match cerberus output does match beta dump leaving as is
|
||||
{
|
||||
pos = origin + ( ( randomfloat( 2 ) - 1 ) * radius, ( randomfloat( 2 ) - 1 ) * radius, 0 );
|
||||
while ( distancesquared( pos, origin ) > ( radius * radius ) )
|
||||
@ -502,7 +490,7 @@ getrandompos( origin, radius )
|
||||
return pos;
|
||||
}
|
||||
|
||||
coptershoot()
|
||||
coptershoot() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "passive" );
|
||||
@ -527,31 +515,29 @@ coptershoot()
|
||||
{
|
||||
self playsound( "mp_copter_shoot" );
|
||||
numshots = 20;
|
||||
i = 0;
|
||||
while ( i < numshots )
|
||||
for ( i = 0; i < numshots; i++ )
|
||||
{
|
||||
mypos = self.origin + level.coptercenteroffset;
|
||||
dir = anglesToForward( self.angles );
|
||||
dir += ( ( randomfloat( 2 ) - 1 ) * 0,015, ( randomfloat( 2 ) - 1 ) * 0,015, ( randomfloat( 2 ) - 1 ) * 0,015 );
|
||||
dir += ( ( randomfloat( 2 ) - 1 ) * 0.015, ( randomfloat( 2 ) - 1 ) * 0.015, ( randomfloat( 2 ) - 1 ) * 0.015 );
|
||||
dir = vectornormalize( dir );
|
||||
self mymagicbullet( mypos, dir );
|
||||
wait 0,075;
|
||||
i++;
|
||||
wait 0.075;
|
||||
}
|
||||
wait 0,25;
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0,25;
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
mymagicbullet( pos, dir )
|
||||
mymagicbullet( pos, dir ) //checked matches cerberus output dvars found in beta dump
|
||||
{
|
||||
damage = 20;
|
||||
if ( getDvar( #"9E8F8CB7" ) != "" )
|
||||
if ( getDvar( "scr_copter_damage" ) != "" )
|
||||
{
|
||||
damage = getDvarInt( #"9E8F8CB7" );
|
||||
damage = getDvarInt( "scr_copter_damage" );
|
||||
}
|
||||
trace = bullettrace( pos, pos + vectorScale( dir, 10000 ), 1, undefined );
|
||||
if ( isDefined( trace[ "entity" ] ) && isplayer( trace[ "entity" ] ) && isalive( trace[ "entity" ] ) )
|
||||
@ -560,7 +546,7 @@ mymagicbullet( pos, dir )
|
||||
}
|
||||
}
|
||||
|
||||
setcopterdest( newlocation, descend, dontascend )
|
||||
setcopterdest( newlocation, descend, dontascend ) //checked matches cerberus output
|
||||
{
|
||||
self.finaldest = getabovebuildingslocation( newlocation );
|
||||
if ( isDefined( descend ) && descend )
|
||||
@ -579,13 +565,13 @@ setcopterdest( newlocation, descend, dontascend )
|
||||
}
|
||||
}
|
||||
|
||||
notifyarrived()
|
||||
notifyarrived() //checked matches cerberus output
|
||||
{
|
||||
wait 0,05;
|
||||
wait 0.05;
|
||||
self notify( "arrived" );
|
||||
}
|
||||
|
||||
coptermove()
|
||||
coptermove() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.coptermoverunning ) )
|
||||
@ -594,8 +580,8 @@ coptermove()
|
||||
}
|
||||
self.coptermoverunning = 1;
|
||||
self.intransit = 0;
|
||||
interval = 0,15;
|
||||
zinterp = 0,1;
|
||||
interval = 0.15;
|
||||
zinterp = 0.1;
|
||||
tiltamnt = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
@ -633,9 +619,11 @@ coptermove()
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( movingvertically );
|
||||
#/
|
||||
*/
|
||||
thisdest = ( self.origin[ 0 ], self.origin[ 1 ], desiredz );
|
||||
}
|
||||
movevec = thisdest - self.origin;
|
||||
@ -652,43 +640,40 @@ coptermove()
|
||||
self.vel = vectorScale( self.vel, level.copter_maxvel / vlen );
|
||||
}
|
||||
thisdest = self.origin + vectorScale( self.vel, interval );
|
||||
self moveto( thisdest, interval * 0,999 );
|
||||
self moveto( thisdest, interval * 0.999 );
|
||||
speed = veclength( self.vel );
|
||||
if ( isDefined( self.desireddirentity ) && isDefined( self.desireddirentity.origin ) )
|
||||
{
|
||||
self.destdir = vectornormalize( ( self.desireddirentity.origin + self.desireddirentityoffset ) - ( self.origin + level.coptercenteroffset ) );
|
||||
}
|
||||
else if ( isDefined( self.desireddir ) )
|
||||
{
|
||||
self.destdir = self.desireddir;
|
||||
break;
|
||||
}
|
||||
else if ( movingvertically )
|
||||
{
|
||||
self.destdir = anglesToForward( self.angles );
|
||||
self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], 0 ) );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.desireddir ) )
|
||||
tiltamnt = speed / level.copter_maxvel;
|
||||
tiltamnt = ( tiltamnt - 0.1 ) / 0.9;
|
||||
if ( tiltamnt < 0 )
|
||||
{
|
||||
self.destdir = self.desireddir;
|
||||
break;
|
||||
}
|
||||
else if ( movingvertically )
|
||||
{
|
||||
self.destdir = anglesToForward( self.angles );
|
||||
self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], 0 ) );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
tiltamnt = speed / level.copter_maxvel;
|
||||
tiltamnt = ( tiltamnt - 0,1 ) / 0,9;
|
||||
if ( tiltamnt < 0 )
|
||||
{
|
||||
tiltamnt = 0;
|
||||
}
|
||||
self.destdir = movevec;
|
||||
self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], 0 ) );
|
||||
tiltamnt *= 1 - ( vectorangle( anglesToForward( self.angles ), self.destdir ) / 180 );
|
||||
self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], tiltamnt * -0,4 ) );
|
||||
tiltamnt = 0;
|
||||
}
|
||||
self.destdir = movevec;
|
||||
self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], 0 ) );
|
||||
tiltamnt *= 1 - ( vectorangle( anglesToForward( self.angles ), self.destdir ) / 180 );
|
||||
self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], tiltamnt * -0.4 ) );
|
||||
}
|
||||
newdir = self.destdir;
|
||||
if ( newdir[ 2 ] < -0,4 )
|
||||
if ( newdir[ 2 ] < -0.4 )
|
||||
{
|
||||
newdir = vectornormalize( ( newdir[ 0 ], newdir[ 1 ], -0,4 ) );
|
||||
newdir = vectornormalize( ( newdir[ 0 ], newdir[ 1 ], -0.4 ) );
|
||||
}
|
||||
copterangles = self.angles;
|
||||
copterangles = combineangles( copterangles, vectorScale( ( 0, 0, -1 ), 90 ) );
|
||||
@ -698,7 +683,7 @@ coptermove()
|
||||
newdir2d = vectornormalize( ( newdir[ 0 ], newdir[ 1 ], 0 ) );
|
||||
angle = vectorangle( olddir2d, newdir2d );
|
||||
angle3d = vectorangle( olddir, newdir );
|
||||
if ( angle > 0,001 && thisrotspeed > 0,001 )
|
||||
if ( angle > 0.001 && thisrotspeed > 0.001 )
|
||||
{
|
||||
thisangle = thisrotspeed * interval;
|
||||
if ( thisangle > angle )
|
||||
@ -711,24 +696,21 @@ coptermove()
|
||||
interpz = oldz + ( ( newz - oldz ) * ( thisangle / angle ) );
|
||||
newdir = vectornormalize( ( newdir2d[ 0 ], newdir2d[ 1 ], interpz ) );
|
||||
copterangles = vectorToAngle( newdir );
|
||||
copterangles = combineangles( copterangles, vectorScale( ( 0, 0, -1 ), 90 ) );
|
||||
self rotateto( copterangles, interval * 0,999 );
|
||||
copterangles = combineangles( copterangles, vectorScale( ( 0, -1, 0 ), 90 ) );
|
||||
self rotateto( copterangles, interval * 0.999 );
|
||||
}
|
||||
else
|
||||
else if ( angle3d > 0.001 && thisrotspeed > 0.001 )
|
||||
{
|
||||
if ( angle3d > 0,001 && thisrotspeed > 0,001 )
|
||||
thisangle = thisrotspeed * interval;
|
||||
if ( thisangle > angle3d )
|
||||
{
|
||||
thisangle = thisrotspeed * interval;
|
||||
if ( thisangle > angle3d )
|
||||
{
|
||||
thisangle = angle3d;
|
||||
}
|
||||
newdir = vectortowardsothervector( olddir, newdir, thisangle );
|
||||
newdir = vectornormalize( newdir );
|
||||
copterangles = vectorToAngle( newdir );
|
||||
copterangles = combineangles( copterangles, vectorScale( ( 0, 0, -1 ), 90 ) );
|
||||
self rotateto( copterangles, interval * 0,999 );
|
||||
thisangle = angle3d;
|
||||
}
|
||||
newdir = vectortowardsothervector( olddir, newdir, thisangle );
|
||||
newdir = vectornormalize( newdir );
|
||||
copterangles = vectorToAngle( newdir );
|
||||
copterangles = combineangles( copterangles, vectorScale( ( 0, -1, 0 ), 90 ) );
|
||||
self rotateto( copterangles, interval * 0.999 );
|
||||
}
|
||||
wait interval;
|
||||
}
|
||||
@ -740,7 +722,7 @@ copterdamage( damagetrig )
|
||||
while ( 1 )
|
||||
{
|
||||
damagetrig waittill( "damage", amount, attacker );
|
||||
while ( isDefined( attacker ) && isplayer( attacker ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] == self.team )
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] == self.team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -753,13 +735,13 @@ copterdamage( damagetrig )
|
||||
}
|
||||
}
|
||||
|
||||
copterdie()
|
||||
copterdie() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "passive" );
|
||||
self death_notify_wrapper();
|
||||
self.dead = 1;
|
||||
self thread copterexplodefx();
|
||||
interval = 0,2;
|
||||
interval = 0.2;
|
||||
rottime = 15;
|
||||
self rotateyaw( 360 + randomfloat( 360 ), rottime );
|
||||
self rotatepitch( 360 + randomfloat( 360 ), rottime );
|
||||
@ -773,11 +755,8 @@ copterdie()
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self moveto( newpos, interval * 0,999 );
|
||||
wait interval;
|
||||
}
|
||||
self moveto( newpos, interval * 0,999 );
|
||||
wait interval;
|
||||
}
|
||||
playfx( level.copterfinalexplosion, self.origin );
|
||||
fakeself = spawn( "script_origin", self.origin );
|
||||
@ -788,7 +767,7 @@ copterdie()
|
||||
fakeself delete();
|
||||
}
|
||||
|
||||
deletecopter()
|
||||
deletecopter() //checked matches cerberus output
|
||||
{
|
||||
if ( isDefined( self.damagetrig ) )
|
||||
{
|
||||
@ -799,13 +778,14 @@ deletecopter()
|
||||
self delete();
|
||||
}
|
||||
|
||||
copterexplodefx()
|
||||
copterexplodefx() //checked matches cerberus output
|
||||
{
|
||||
self endon( "finaldeath" );
|
||||
while ( 1 )
|
||||
{
|
||||
playfx( level.copterexplosion, self.origin );
|
||||
self playsound( "mp_copter_explosion" );
|
||||
wait ( 0,5 + randomfloat( 1 ) );
|
||||
wait ( 0.5 + randomfloat( 1 ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/killstreaks/_killstreaks;
|
||||
#include maps/mp/gametypes/_class;
|
||||
#include maps/mp/gametypes/_globallogic_audio;
|
||||
@ -10,7 +11,7 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
precachestring( &"MP_HEADS_UP" );
|
||||
precachestring( &"MP_U2_ONLINE" );
|
||||
@ -37,7 +38,7 @@ init()
|
||||
level.takelivesondeath = 1;
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
@ -47,7 +48,7 @@ onplayerconnect()
|
||||
}
|
||||
}
|
||||
|
||||
initwagerplayer()
|
||||
initwagerplayer() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self waittill( "spawned_player" );
|
||||
@ -57,7 +58,7 @@ initwagerplayer()
|
||||
self.pers[ "wager_sideBetWinnings" ] = 0;
|
||||
self.pers[ "wager_sideBetLosses" ] = 0;
|
||||
}
|
||||
if ( isDefined( level.inthemoneyonradar ) || level.inthemoneyonradar && isDefined( level.firstplaceonradar ) && level.firstplaceonradar )
|
||||
if ( isDefined( level.inthemoneyonradar ) && level.inthemoneyonradar || isDefined( level.firstplaceonradar ) && level.firstplaceonradar )
|
||||
{
|
||||
self.pers[ "hasRadar" ] = 1;
|
||||
self.hasspyplane = 1;
|
||||
@ -70,7 +71,7 @@ initwagerplayer()
|
||||
self thread deductplayerante();
|
||||
}
|
||||
|
||||
ondisconnect()
|
||||
ondisconnect() //checked matches cerberus output
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "player_eliminated" );
|
||||
@ -78,7 +79,7 @@ ondisconnect()
|
||||
level notify( "player_eliminated" );
|
||||
}
|
||||
|
||||
deductplayerante()
|
||||
deductplayerante() //checked matches cerberus output
|
||||
{
|
||||
if ( isDefined( self.pers[ "hasPaidWagerAnte" ] ) )
|
||||
{
|
||||
@ -109,7 +110,7 @@ deductplayerante()
|
||||
self thread maps/mp/gametypes/_persistence::uploadstatssoon();
|
||||
}
|
||||
|
||||
incrementescrowforplayer( amount )
|
||||
incrementescrowforplayer( amount ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( self ) || !isplayer( self ) )
|
||||
{
|
||||
@ -130,7 +131,7 @@ incrementescrowforplayer( amount )
|
||||
game[ "escrows" ][ game[ "escrows" ].size ] = escrowstruct;
|
||||
}
|
||||
|
||||
clearescrows()
|
||||
clearescrows() //checked changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( game[ "escrows" ] ) )
|
||||
{
|
||||
@ -138,22 +139,20 @@ clearescrows()
|
||||
}
|
||||
escrows = game[ "escrows" ];
|
||||
numescrows = escrows.size;
|
||||
i = 0;
|
||||
while ( i < numescrows )
|
||||
for ( i = 0; i < numescrows; i++ )
|
||||
{
|
||||
escrowstruct = escrows[ i ];
|
||||
i++;
|
||||
}
|
||||
game[ "escrows" ] = [];
|
||||
}
|
||||
|
||||
addrecentearningstostat( recentearnings )
|
||||
addrecentearningstostat( recentearnings ) //checked matches cerberus output
|
||||
{
|
||||
currearnings = self maps/mp/gametypes/_persistence::getrecentstat( 1, 0, "score" );
|
||||
self maps/mp/gametypes/_persistence::setrecentstat( 1, 0, "score", currearnings + recentearnings );
|
||||
}
|
||||
|
||||
prematchperiod()
|
||||
prematchperiod() //checked matches cerberus output
|
||||
{
|
||||
if ( !level.wagermatch )
|
||||
{
|
||||
@ -161,7 +160,7 @@ prematchperiod()
|
||||
}
|
||||
}
|
||||
|
||||
finalizewagerround()
|
||||
finalizewagerround() //checked matches cerberus output
|
||||
{
|
||||
if ( level.wagermatch == 0 )
|
||||
{
|
||||
@ -176,9 +175,13 @@ finalizewagerround()
|
||||
|
||||
determinewagerwinnings()
|
||||
{
|
||||
if ( isDefined( level.dontcalcwagerwinnings ) )
|
||||
if ( !isDefined( level.dontcalcwagerwinnings ) || !level.dontcalcwagerwinnings )
|
||||
{
|
||||
shouldcalculatewinnings = !level.dontcalcwagerwinnings;
|
||||
shouldcalculatewinnings = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
shouldcalculatewinnings = 1;
|
||||
}
|
||||
if ( !shouldcalculatewinnings )
|
||||
{
|
||||
@ -194,33 +197,28 @@ determinewagerwinnings()
|
||||
}
|
||||
}
|
||||
|
||||
calculatefreeforallpayouts()
|
||||
calculatefreeforallpayouts() //checked changed to match cerberus output
|
||||
{
|
||||
playerrankings = level.placement[ "all" ];
|
||||
payoutpercentages = array( 0,5, 0,3, 0,2 );
|
||||
payoutpercentages = array( 0.5, 0.3, 0.2 );
|
||||
if ( playerrankings.size == 2 )
|
||||
{
|
||||
payoutpercentages = array( 0,7, 0,3 );
|
||||
payoutpercentages = array( 0.7, 0.3 );
|
||||
}
|
||||
else
|
||||
else if ( playerrankings.size == 1 )
|
||||
{
|
||||
if ( playerrankings.size == 1 )
|
||||
{
|
||||
payoutpercentages = array( 1 );
|
||||
}
|
||||
payoutpercentages = array( 1 );
|
||||
}
|
||||
setwagerwinningsonplayers( level.players, 0 );
|
||||
if ( isDefined( level.hostforcedend ) && level.hostforcedend )
|
||||
{
|
||||
wagerbet = getDvarInt( "scr_wagerBet" );
|
||||
i = 0;
|
||||
while ( i < playerrankings.size )
|
||||
for ( i = 0; i < playerrankings.size; i++ )
|
||||
{
|
||||
if ( !playerrankings[ i ] islocaltohost() )
|
||||
{
|
||||
playerrankings[ i ].wagerwinnings = wagerbet;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else if ( level.players.size == 1 )
|
||||
@ -233,8 +231,7 @@ calculatefreeforallpayouts()
|
||||
cumulativepayoutpercentage = payoutpercentages[ 0 ];
|
||||
playergroup = [];
|
||||
playergroup[ playergroup.size ] = playerrankings[ 0 ];
|
||||
i = 1;
|
||||
while ( i < playerrankings.size )
|
||||
for ( i = 1; i < playerrankings.size; i++ )
|
||||
{
|
||||
if ( playerrankings[ i ].pers[ "score" ] < playergroup[ 0 ].pers[ "score" ] )
|
||||
{
|
||||
@ -248,20 +245,18 @@ calculatefreeforallpayouts()
|
||||
{
|
||||
cumulativepayoutpercentage += payoutpercentages[ currentpayoutpercentage ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
setwagerwinningsonplayers( playergroup, int( ( game[ "wager_pot" ] * cumulativepayoutpercentage ) / playergroup.size ) );
|
||||
}
|
||||
}
|
||||
|
||||
calculateplacesbasedonscore()
|
||||
calculateplacesbasedonscore() //checked changed to match cerberus output
|
||||
{
|
||||
level.playerplaces = array( [], [], [] );
|
||||
playerrankings = level.placement[ "all" ];
|
||||
placementscores = array( playerrankings[ 0 ].pers[ "score" ], -1, -1 );
|
||||
currentplace = 0;
|
||||
index = 0;
|
||||
while ( index < playerrankings.size && currentplace < placementscores.size )
|
||||
for ( index = 0; index < playerrankings.size && currentplace < placementscores.size; index++ )
|
||||
{
|
||||
player = playerrankings[ index ];
|
||||
if ( player.pers[ "score" ] < placementscores[ currentplace ] )
|
||||
@ -269,19 +264,15 @@ calculateplacesbasedonscore()
|
||||
currentplace++;
|
||||
if ( currentplace >= level.playerplaces.size )
|
||||
{
|
||||
return;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
placementscores[ currentplace ] = player.pers[ "score" ];
|
||||
}
|
||||
level.playerplaces[ currentplace ][ level.playerplaces[ currentplace ].size ] = player;
|
||||
index++;
|
||||
placementscores[ currentplace ] = player.pers[ "score" ];
|
||||
}
|
||||
level.playerplaces[ currentplace ][ level.playerplaces[ currentplace ].size ] = player;
|
||||
}
|
||||
}
|
||||
|
||||
calculateteampayouts()
|
||||
calculateteampayouts() //checked changed to match cerberus output
|
||||
{
|
||||
winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
if ( winner == "tie" )
|
||||
@ -290,8 +281,7 @@ calculateteampayouts()
|
||||
return;
|
||||
}
|
||||
playersonwinningteam = [];
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
player = level.players[ index ];
|
||||
player.wagerwinnings = 0;
|
||||
@ -299,7 +289,6 @@ calculateteampayouts()
|
||||
{
|
||||
playersonwinningteam[ playersonwinningteam.size ] = player;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
if ( playersonwinningteam.size == 0 )
|
||||
{
|
||||
@ -310,17 +299,15 @@ calculateteampayouts()
|
||||
setwagerwinningsonplayers( playersonwinningteam, winningssplit );
|
||||
}
|
||||
|
||||
setwagerwinningsonplayers( players, amount )
|
||||
setwagerwinningsonplayers( players, amount ) //checked changed to match cerberus output
|
||||
{
|
||||
index = 0;
|
||||
while ( index < players.size )
|
||||
for ( index = 0; index < players.size; index++ )
|
||||
{
|
||||
players[ index ].wagerwinnings = amount;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
finalizewagergame()
|
||||
finalizewagergame() //checked changed to match cerberus output
|
||||
{
|
||||
level.wagergamefinalized = 1;
|
||||
if ( level.wagermatch == 0 )
|
||||
@ -330,10 +317,9 @@ finalizewagergame()
|
||||
determinewagerwinnings();
|
||||
determinetopearners();
|
||||
players = level.players;
|
||||
wait 0,5;
|
||||
wait 0.5;
|
||||
playerrankings = level.wagertopearners;
|
||||
index = 0;
|
||||
while ( index < players.size )
|
||||
for ( index = 0; index < players.size; index++ )
|
||||
{
|
||||
player = players[ index ];
|
||||
if ( isDefined( player.pers[ "wager_sideBetWinnings" ] ) )
|
||||
@ -348,12 +334,11 @@ finalizewagergame()
|
||||
{
|
||||
maps/mp/gametypes/_globallogic_score::updatewinstats( player );
|
||||
}
|
||||
index++;
|
||||
}
|
||||
clearescrows();
|
||||
}
|
||||
|
||||
payoutwagerwinnings( player, winnings )
|
||||
payoutwagerwinnings( player, winnings ) //checked matches cerberus output
|
||||
{
|
||||
if ( winnings == 0 )
|
||||
{
|
||||
@ -365,12 +350,11 @@ payoutwagerwinnings( player, winnings )
|
||||
player addrecentearningstostat( winnings );
|
||||
}
|
||||
|
||||
determinetopearners()
|
||||
determinetopearners() //checked changed to match beta dump
|
||||
{
|
||||
topwinnings = array( -1, -1, -1 );
|
||||
level.wagertopearners = [];
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
player = level.players[ index ];
|
||||
if ( !isDefined( player.wagerwinnings ) )
|
||||
@ -385,8 +369,6 @@ determinetopearners()
|
||||
level.wagertopearners[ 2 ] = level.wagertopearners[ 1 ];
|
||||
level.wagertopearners[ 1 ] = level.wagertopearners[ 0 ];
|
||||
level.wagertopearners[ 0 ] = player;
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( player.wagerwinnings > topwinnings[ 1 ] )
|
||||
{
|
||||
@ -394,22 +376,16 @@ determinetopearners()
|
||||
topwinnings[ 1 ] = player.wagerwinnings;
|
||||
level.wagertopearners[ 2 ] = level.wagertopearners[ 1 ];
|
||||
level.wagertopearners[ 1 ] = player;
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
else if ( player.wagerwinnings > topwinnings[ 2 ] )
|
||||
{
|
||||
if ( player.wagerwinnings > topwinnings[ 2 ] )
|
||||
{
|
||||
topwinnings[ 2 ] = player.wagerwinnings;
|
||||
level.wagertopearners[ 2 ] = player;
|
||||
}
|
||||
topwinnings[ 2 ] = player.wagerwinnings;
|
||||
level.wagertopearners[ 2 ] = player;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
postroundsidebet()
|
||||
postroundsidebet() //checked matches cerberus output
|
||||
{
|
||||
if ( isDefined( level.sidebet ) && level.sidebet )
|
||||
{
|
||||
@ -418,7 +394,7 @@ postroundsidebet()
|
||||
}
|
||||
}
|
||||
|
||||
sidebettimer()
|
||||
sidebettimer() //checked changed to match cerberus output
|
||||
{
|
||||
level endon( "side_bet_end" );
|
||||
secondstowait = ( level.sidebetendtime - getTime() ) / 1000;
|
||||
@ -427,19 +403,17 @@ sidebettimer()
|
||||
secondstowait = 0;
|
||||
}
|
||||
wait secondstowait;
|
||||
playerindex = 0;
|
||||
while ( playerindex < level.players.size )
|
||||
for ( playerindex = 0; playerindex < level.players.size; playerindex++ )
|
||||
{
|
||||
if ( isDefined( level.players[ playerindex ] ) )
|
||||
{
|
||||
level.players[ playerindex ] closemenu();
|
||||
}
|
||||
playerindex++;
|
||||
}
|
||||
level notify( "side_bet_end" );
|
||||
}
|
||||
|
||||
sidebetallbetsplaced()
|
||||
sidebetallbetsplaced() //checked changed to match cerberus output
|
||||
{
|
||||
secondsleft = ( level.sidebetendtime - getTime() ) / 1000;
|
||||
if ( secondsleft <= 3 )
|
||||
@ -448,19 +422,17 @@ sidebetallbetsplaced()
|
||||
}
|
||||
level.sidebetendtime = getTime() + 3000;
|
||||
wait 3;
|
||||
playerindex = 0;
|
||||
while ( playerindex < level.players.size )
|
||||
for ( playerindex = 0; playerindex < level.players.size; playerindex++ )
|
||||
{
|
||||
if ( isDefined( level.players[ playerindex ] ) )
|
||||
{
|
||||
level.players[ playerindex ] closemenu();
|
||||
}
|
||||
playerindex++;
|
||||
}
|
||||
level notify( "side_bet_end" );
|
||||
}
|
||||
|
||||
setupblankrandomplayer( takeweapons, chooserandombody, weapon )
|
||||
setupblankrandomplayer( takeweapons, chooserandombody, weapon ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( chooserandombody ) || chooserandombody )
|
||||
{
|
||||
@ -484,23 +456,21 @@ setupblankrandomplayer( takeweapons, chooserandombody, weapon )
|
||||
{
|
||||
self.hasspyplane = 1;
|
||||
}
|
||||
while ( isDefined( self.powerups ) && isDefined( self.powerups.size ) )
|
||||
if ( isDefined( self.powerups ) && isDefined( self.powerups.size ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self.powerups.size )
|
||||
for ( i = 0; i < self.powerups.size; i++ )
|
||||
{
|
||||
self applypowerup( self.powerups[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
self setradarvisibility();
|
||||
}
|
||||
|
||||
assignrandombody()
|
||||
assignrandombody() //checked matches cerberus output
|
||||
{
|
||||
}
|
||||
|
||||
queuewagerpopup( message, points, submessage, announcement )
|
||||
queuewagerpopup( message, points, submessage, announcement ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
size = self.wagernotifyqueue.size;
|
||||
@ -512,7 +482,7 @@ queuewagerpopup( message, points, submessage, announcement )
|
||||
self notify( "received award" );
|
||||
}
|
||||
|
||||
helpgameend()
|
||||
helpgameend() //checked changed to match beta dump
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
for ( ;; )
|
||||
@ -522,37 +492,30 @@ helpgameend()
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
wait 0.05;
|
||||
players = level.players;
|
||||
playersleft = 0;
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
wait 0,05;
|
||||
players = level.players;
|
||||
playersleft = 0;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
if ( isDefined( players[ i ].pers[ "lives" ] ) && players[ i ].pers[ "lives" ] > 0 )
|
||||
{
|
||||
if ( isDefined( players[ i ].pers[ "lives" ] ) && players[ i ].pers[ "lives" ] > 0 )
|
||||
{
|
||||
playersleft++;
|
||||
}
|
||||
i++;
|
||||
playersleft++;
|
||||
}
|
||||
while ( playersleft == 2 )
|
||||
}
|
||||
if ( playersleft == 2 )
|
||||
{
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
players[ i ] queuewagerpopup( &"MP_HEADS_UP", 0, &"MP_U2_ONLINE", "wm_u2_online" );
|
||||
players[ i ].pers[ "hasRadar" ] = 1;
|
||||
players[ i ].hasspyplane = 1;
|
||||
level.activeuavs[ players[ i ] getentitynumber() ]++;
|
||||
i++;
|
||||
}
|
||||
players[ i ] queuewagerpopup( &"MP_HEADS_UP", 0, &"MP_U2_ONLINE", "wm_u2_online" );
|
||||
players[ i ].pers[ "hasRadar" ] = 1;
|
||||
players[ i ].hasspyplane = 1;
|
||||
level.activeuavs[ players[ i ] getentitynumber() ]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setradarvisibility()
|
||||
setradarvisibility() //checked changed to match cerberus output
|
||||
{
|
||||
prevscoreplace = self.prevscoreplace;
|
||||
if ( !isDefined( prevscoreplace ) )
|
||||
@ -570,31 +533,27 @@ setradarvisibility()
|
||||
self setperk( "specialty_gpsjammer" );
|
||||
}
|
||||
}
|
||||
else
|
||||
else if ( isDefined( level.firstplaceonradar ) && level.firstplaceonradar )
|
||||
{
|
||||
if ( isDefined( level.firstplaceonradar ) && level.firstplaceonradar )
|
||||
if ( prevscoreplace == 1 && isDefined( self.score ) && self.score > 0 )
|
||||
{
|
||||
if ( prevscoreplace == 1 && isDefined( self.score ) && self.score > 0 )
|
||||
{
|
||||
self unsetperk( "specialty_gpsjammer" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self setperk( "specialty_gpsjammer" );
|
||||
}
|
||||
self unsetperk( "specialty_gpsjammer" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self setperk( "specialty_gpsjammer" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerscored()
|
||||
playerscored() //checked changed to match cerberus output
|
||||
{
|
||||
self notify( "wager_player_scored" );
|
||||
self endon( "wager_player_scored" );
|
||||
wait 0,05;
|
||||
wait 0.05;
|
||||
maps/mp/gametypes/_globallogic::updateplacement();
|
||||
i = 0;
|
||||
while ( i < level.placement[ "all" ].size )
|
||||
for ( i = 0; i < level.placement["all"].size; i++ )
|
||||
{
|
||||
prevscoreplace = level.placement[ "all" ][ i ].prevscoreplace;
|
||||
if ( !isDefined( prevscoreplace ) )
|
||||
@ -602,16 +561,13 @@ playerscored()
|
||||
prevscoreplace = 1;
|
||||
}
|
||||
currentscoreplace = i + 1;
|
||||
j = i - 1;
|
||||
while ( j >= 0 )
|
||||
for ( j = i - 1; j >= 0; j-- )
|
||||
{
|
||||
if ( level.placement[ "all" ][ i ].score == level.placement[ "all" ][ j ].score )
|
||||
{
|
||||
currentscoreplace--;
|
||||
|
||||
}
|
||||
j--;
|
||||
|
||||
}
|
||||
wasinthemoney = prevscoreplace <= 3;
|
||||
isinthemoney = currentscoreplace <= 3;
|
||||
@ -619,25 +575,21 @@ playerscored()
|
||||
{
|
||||
level.placement[ "all" ][ i ] wagerannouncer( "wm_in_the_money" );
|
||||
}
|
||||
else
|
||||
else if ( wasinthemoney && !isinthemoney )
|
||||
{
|
||||
if ( wasinthemoney && !isinthemoney )
|
||||
{
|
||||
level.placement[ "all" ][ i ] wagerannouncer( "wm_oot_money" );
|
||||
}
|
||||
level.placement[ "all" ][ i ] wagerannouncer( "wm_oot_money" );
|
||||
}
|
||||
level.placement[ "all" ][ i ].prevscoreplace = currentscoreplace;
|
||||
level.placement[ "all" ][ i ] setradarvisibility();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
wagerannouncer( dialog, group )
|
||||
wagerannouncer( dialog, group ) //checked matches cerberus output
|
||||
{
|
||||
self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( dialog, group );
|
||||
}
|
||||
|
||||
createpowerup( name, type, displayname, iconmaterial )
|
||||
createpowerup( name, type, displayname, iconmaterial ) //checked matches cerberus output
|
||||
{
|
||||
powerup = spawnstruct();
|
||||
powerup.name = [];
|
||||
@ -648,32 +600,30 @@ createpowerup( name, type, displayname, iconmaterial )
|
||||
return powerup;
|
||||
}
|
||||
|
||||
addpowerup( name, type, displayname, iconmaterial )
|
||||
addpowerup( name, type, displayname, iconmaterial ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( level.poweruplist ) )
|
||||
{
|
||||
level.poweruplist = [];
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.poweruplist.size )
|
||||
for ( i = 0; i < level.poweruplist.size; i++ )
|
||||
{
|
||||
if ( level.poweruplist[ i ].displayname == displayname )
|
||||
{
|
||||
level.poweruplist[ i ].name[ level.poweruplist[ i ].name.size ] = name;
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
powerup = createpowerup( name, type, displayname, iconmaterial );
|
||||
level.poweruplist[ level.poweruplist.size ] = powerup;
|
||||
}
|
||||
|
||||
copypowerup( powerup )
|
||||
copypowerup( powerup ) //checked matches cerberus output
|
||||
{
|
||||
return createpowerup( powerup.name[ 0 ], powerup.type, powerup.displayname, powerup.iconmaterial );
|
||||
}
|
||||
|
||||
applypowerup( powerup )
|
||||
applypowerup( powerup ) //checked changed to match cerberus output
|
||||
{
|
||||
switch( powerup.type )
|
||||
{
|
||||
@ -700,23 +650,20 @@ applypowerup( powerup )
|
||||
self setweaponammoclip( powerup.name[ 0 ], 2 );
|
||||
break;
|
||||
case "perk":
|
||||
i = 0;
|
||||
while ( i < powerup.name.size )
|
||||
for ( i = 0; i < powerup.name.size; i++ )
|
||||
{
|
||||
self setperk( powerup.name[ i ] );
|
||||
i++;
|
||||
}
|
||||
case "killstreak":
|
||||
self maps/mp/killstreaks/_killstreaks::givekillstreak( powerup.name[ 0 ] );
|
||||
break;
|
||||
case "score_multiplier":
|
||||
self.scoremultiplier = powerup.name[ 0 ];
|
||||
break;
|
||||
}
|
||||
case "killstreak":
|
||||
self maps/mp/killstreaks/_killstreaks::givekillstreak( powerup.name[ 0 ] );
|
||||
break;
|
||||
case "score_multiplier":
|
||||
self.scoremultiplier = powerup.name[ 0 ];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
givepowerup( powerup, doanimation )
|
||||
givepowerup( powerup, doanimation ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( self.powerups ) )
|
||||
{
|
||||
@ -724,27 +671,25 @@ givepowerup( powerup, doanimation )
|
||||
}
|
||||
powerupindex = self.powerups.size;
|
||||
self.powerups[ powerupindex ] = copypowerup( powerup );
|
||||
i = 0;
|
||||
while ( i < powerup.name.size )
|
||||
for ( i = 0; i < powerup.name.size; i++ )
|
||||
{
|
||||
self.powerups[ powerupindex ].name[ self.powerups[ powerupindex ].name.size ] = powerup.name[ i ];
|
||||
i++;
|
||||
}
|
||||
self applypowerup( self.powerups[ powerupindex ] );
|
||||
self thread showpowerupmessage( powerupindex, doanimation );
|
||||
}
|
||||
|
||||
pulsepowerupicon( powerupindex )
|
||||
pulsepowerupicon( powerupindex ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( isDefined( self ) && isDefined( self.powerups ) || !isDefined( self.powerups[ powerupindex ] ) && !isDefined( self.powerups[ powerupindex ].hud_elem_icon ) )
|
||||
if ( !isDefined( self ) || !isDefined( self.powerups ) || !isDefined( self.powerups[ powerupindex ] ) || !isDefined( self.powerups[ powerupindex ].hud_elem_icon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self endon( "delete" );
|
||||
self endon( "clearing_powerups" );
|
||||
pulsepercent = 1,5;
|
||||
pulsetime = 0,5;
|
||||
pulsepercent = 1.5;
|
||||
pulsetime = 0.5;
|
||||
hud_elem = self.powerups[ powerupindex ].hud_elem_icon;
|
||||
if ( isDefined( hud_elem.animating ) && hud_elem.animating )
|
||||
{
|
||||
@ -758,18 +703,18 @@ pulsepowerupicon( powerupindex )
|
||||
bigheight = origheight * pulsepercent;
|
||||
xoffset = ( bigwidth - origwidth ) / 2;
|
||||
yoffset = ( bigheight - origheight ) / 2;
|
||||
hud_elem scaleovertime( 0,05, int( bigwidth ), int( bigheight ) );
|
||||
hud_elem moveovertime( 0,05 );
|
||||
hud_elem scaleovertime( 0.05, int( bigwidth ), int( bigheight ) );
|
||||
hud_elem moveovertime( 0.05 );
|
||||
hud_elem.x = origx - xoffset;
|
||||
hud_elem.y = origy - yoffset;
|
||||
wait 0,05;
|
||||
wait 0.05;
|
||||
hud_elem scaleovertime( pulsetime, origwidth, origheight );
|
||||
hud_elem moveovertime( pulsetime );
|
||||
hud_elem.x = origx;
|
||||
hud_elem.y = origy;
|
||||
}
|
||||
|
||||
showpowerupmessage( powerupindex, doanimation )
|
||||
showpowerupmessage( powerupindex, doanimation ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "delete" );
|
||||
@ -836,7 +781,7 @@ showpowerupmessage( powerupindex, doanimation )
|
||||
{
|
||||
self thread queuewagerpopup( self.powerups[ powerupindex ].displayname, 0, &"MP_BONUS_ACQUIRED" );
|
||||
}
|
||||
pulsetime = 0,5;
|
||||
pulsetime = 0.5;
|
||||
if ( doanimation )
|
||||
{
|
||||
self.powerups[ powerupindex ].hud_elem fadeovertime( pulsetime );
|
||||
@ -867,33 +812,28 @@ showpowerupmessage( powerupindex, doanimation )
|
||||
{
|
||||
self thread queuewagerpopup( self.powerups[ powerupindex ].displayname, 0, &"MP_BONUS_ACQUIRED" );
|
||||
}
|
||||
wait 1,5;
|
||||
i = 0;
|
||||
while ( i <= powerupindex )
|
||||
wait 1.5;
|
||||
for ( i = 0; i <= powerupindex; i++ )
|
||||
{
|
||||
self.powerups[ i ].hud_elem fadeovertime( 0,25 );
|
||||
self.powerups[ i ].hud_elem fadeovertime( 0.25 );
|
||||
self.powerups[ i ].hud_elem.alpha = 0;
|
||||
i++;
|
||||
}
|
||||
wait 0,25;
|
||||
i = 0;
|
||||
while ( i <= powerupindex )
|
||||
wait 0.25;
|
||||
for ( i = 0; i <= powerupindex; i++ )
|
||||
{
|
||||
self.powerups[ i ].hud_elem_icon moveovertime( 0,25 );
|
||||
self.powerups[ i ].hud_elem_icon moveovertime( 0.25 );
|
||||
self.powerups[ i ].hud_elem_icon.x = 0 - iconsize;
|
||||
self.powerups[ i ].hud_elem_icon.horzalign = "user_right";
|
||||
i++;
|
||||
}
|
||||
self.powerups[ powerupindex ].hud_elem_icon.animating = 0;
|
||||
}
|
||||
|
||||
clearpowerups()
|
||||
clearpowerups() //checked changed to match cerberus output
|
||||
{
|
||||
self notify( "clearing_powerups" );
|
||||
while ( isDefined( self.powerups ) && isDefined( self.powerups.size ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self.powerups.size )
|
||||
for ( i = 0; i < self.powerups.size; i++ )
|
||||
{
|
||||
if ( isDefined( self.powerups[ i ].hud_elem ) )
|
||||
{
|
||||
@ -903,13 +843,12 @@ clearpowerups()
|
||||
{
|
||||
self.powerups[ i ].hud_elem_icon destroy();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
self.powerups = [];
|
||||
}
|
||||
|
||||
trackwagerweaponusage( name, incvalue, statname )
|
||||
trackwagerweaponusage( name, incvalue, statname ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( self.wagerweaponusage ) )
|
||||
{
|
||||
@ -926,7 +865,7 @@ trackwagerweaponusage( name, incvalue, statname )
|
||||
self.wagerweaponusage[ name ][ statname ] += incvalue;
|
||||
}
|
||||
|
||||
gethighestwagerweaponusage( statname )
|
||||
gethighestwagerweaponusage( statname ) //checked partially changed to match cerberus output did not use continues in for loop see github for more info
|
||||
{
|
||||
if ( !isDefined( self.wagerweaponusage ) )
|
||||
{
|
||||
@ -935,26 +874,22 @@ gethighestwagerweaponusage( statname )
|
||||
bestweapon = undefined;
|
||||
highestvalue = 0;
|
||||
wagerweaponsused = getarraykeys( self.wagerweaponusage );
|
||||
i = 0;
|
||||
while ( i < wagerweaponsused.size )
|
||||
for ( i = 0; i < wagerweaponsused.size; i++ )
|
||||
{
|
||||
weaponstats = self.wagerweaponusage[ wagerweaponsused[ i ] ];
|
||||
if ( !isDefined( weaponstats[ statname ] ) || !getbaseweaponitemindex( wagerweaponsused[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( bestweapon ) || weaponstats[ statname ] > highestvalue )
|
||||
{
|
||||
bestweapon = wagerweaponsused[ i ];
|
||||
highestvalue = weaponstats[ statname ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return bestweapon;
|
||||
}
|
||||
|
||||
setwagerafteractionreportstats()
|
||||
setwagerafteractionreportstats() //checked changed to match beta dump
|
||||
{
|
||||
topweapon = self gethighestwagerweaponusage( "kills" );
|
||||
topkills = 0;
|
||||
@ -978,11 +913,10 @@ setwagerafteractionreportstats()
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
while ( i < 3 )
|
||||
for(i = 0; i < 3; i++)
|
||||
{
|
||||
self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", 0, i );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -33,6 +33,8 @@ patch_mp/maps/mp/bots/_bot_sd.gsc
|
||||
|
||||
patch_mp/maps/mp/gametypes/_battlechatter_mp.gsc
|
||||
patch_mp/maps/mp/gametypes/_callbacksetup.gsc
|
||||
patch_mp/maps/mp/gametypes/_class.gsc
|
||||
patch_mp/maps/mp/gametypes/_copter.gsc
|
||||
patch_mp/maps/mp/gametypes/_damagefeedback.gsc
|
||||
patch_mp/maps/mp/gametypes/_deathicons.gsc
|
||||
patch_mp/maps/mp/gametypes/_friendicons.gsc
|
||||
@ -50,6 +52,8 @@ patch_mp/maps/mp/gametypes/_rank.gsc
|
||||
patch_mp/maps/mp/gametypes/_serversettings.gsc
|
||||
patch_mp/maps/mp/gametypes/_spectating.gsc
|
||||
patch_mp/maps/mp/gametypes/_tweakables.gsc
|
||||
patch_mp/maps/mp/gametypes/_wager.gsc
|
||||
patch_mp/maps/mp/gametypes/_weapons.gsc
|
||||
patch_mp/maps/mp/gametypes/_weapon_utils.gsc
|
||||
patch_mp/maps/mp/gametypes/conf.gsc
|
||||
patch_mp/maps/mp/gametypes/ctf.gsc
|
||||
@ -68,8 +72,6 @@ patch_mp/maps/mp/gametypes/tdm.gsc
|
||||
```
|
||||
### The following scripts are not checked yet, uploaded to setup a baseline:
|
||||
```
|
||||
patch_mp/maps/mp/gametypes/_class.gsc
|
||||
patch_mp/maps/mp/gametypes/_copter.gsc
|
||||
patch_mp/maps/mp/gametypes/_gameobjects.gsc
|
||||
patch_mp/maps/mp/gametypes/_globallogic_actor.gsc
|
||||
patch_mp/maps/mp/gametypes/_globallogic_audio.gsc
|
||||
@ -84,9 +86,7 @@ patch_mp/maps/mp/gametypes/_hud_message.gsc
|
||||
patch_mp/maps/mp/gametypes/_hud_util.gsc
|
||||
patch_mp/maps/mp/gametypes/_spawning.gsc
|
||||
patch_mp/maps/mp/gametypes/_spawnlogic.gsc
|
||||
patch_mp/maps/mp/gametypes/_wager.gsc
|
||||
patch_mp/maps/mp/gametypes/_weaponobjects.gsc
|
||||
patch_mp/maps/mp/gametypes/_weapons.gsc
|
||||
```
|
||||
### The following scipts are dev scripts filled with dev calls making them useless to modify for now
|
||||
```
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -59,6 +59,7 @@ patch_zm/maps/mp/gametypes_zm/_perplayer.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_serversettings.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_spectating.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_tweakables.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_weapons.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_blockers.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_buildables.gsc
|
||||
@ -95,7 +96,6 @@ patch_zm/maps/mp/gametypes_zm/_hud_util.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_spawning.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_weapons.gsc
|
||||
```
|
||||
### The following scripts have not been checked using the proper debugging methods:
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user