iw6-scripts-dev/maps/mp/_matchevents.gsc
2024-12-11 11:28:08 +01:00

533 lines
15 KiB
Plaintext

#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
//////////////////////////////////////////////
//
// Initialization
// add this back to common_mp_weapons.csv
// nodamage rocket for visual only
// weapon,mp/nodamage_rocket_mp
init()
{
level.match_events_fx["smoke"] = loadFx( "fx/smoke/smoke_grenade_11sec_mp" );
level.match_events_fx["tracer"] = loadFx( "fx/misc/tracer_incoming" );
level.match_events_fx["explosion"] = loadFx( "fx/explosions/building_explosion_huge_gulag" );
//precacheItem( "nodamage_rocket_mp" );
level.matchEvents["mortar"] = ::doMortar;
level.matchEvents["smoke"] = ::doSmoke;
level.matchEvents["airstrike"] = ::doAirstrike;
level.matchEvents["pavelow"] = ::doPavelow;
level.matchEvents["heli_insertion"] = ::doHeliInsertion;
level.matchEvents["osprey_insertion"] = ::doOspreyInsertion;
level.matchEventStarted = false;
level thread onPlayerConnect();
}
onPlayerConnect()
{
if ( level.prematchPeriod > 0 )
{
for ( ;; )
{
level waittill( "connected", player );
//player thread onPlayerSpawned();
//player thread doHeliInsertion();
}
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
level endon( "matchevent_started" );
//level.alliesInsertChopper endon ("stopLinking");
self waittill( "spawned_player" );
if ( isDefined( level.alliesInsertChopper ) && !level.alliesInsertChopper.droppedOff && level.prematchPeriod > 0 && self.team == "allies")
{
self PlayerLinkTo( level.alliesInsertChopper );
level.alliesInsertChopper.linkedPlayers[level.alliesInsertChopper.linkedPlayers.size] = self;
}
else if ( isDefined( level.alliesInsertChopper ) && !level.alliesInsertChopper.droppedOff && level.prematchPeriod > 0 && self.team == "axis")
{
self PlayerLinkTo( level.axisInsertChopper );
level.axisInsertChopper.linkedPlayers[level.axisInsertChopper.linkedPlayers.size] = self;
}
}
//////////////////////////////////////////////
//
// Utilities
getMapCenter()
{
if ( isDefined( level.mapCenter ) )
return level.mapCenter;
alliesStart = GetSpawnArray( "mp_tdm_spawn_allies_start");
axisStart = GetSpawnArray( "mp_tdm_spawn_axis_start");
if ( isDefined( alliesStart ) && isDefined( alliesStart[0] ) && isDefined( axisStart ) && isDefined( axisStart[0] ) )
{
halfDist = Distance( alliesStart[0].origin, axisStart[0].origin ) / 2;
dir = vectorToAngles( alliesStart[0].origin - axisStart[0].origin );
dir = vectorNormalize( dir );
return alliesStart[0].origin + dir*halfDist;
}
return (0,0,0);
}
getStartSpawns()
{
alliesStart = GetSpawnArray( "mp_tdm_spawn_allies_start");
axisStart = GetSpawnArray( "mp_tdm_spawn_axis_start");
if ( isDefined( alliesStart ) && isDefined( alliesStart[0] ) && isDefined( axisStart ) && isDefined( axisStart[0] ) )
{
startSpawns = [];
startSpawns["axis"] = axisStart;
startSpawns["allies"] = alliesStart;
return startSpawns;
}
else
return undefined;
}
//////////////////////////////////////////////
//
// Event - Heli Insertion
doHeliInsertion( teamHeli, axisPoint, alliesPoint )
{
spawnHeight = 1200;
hoverOffset = 1200;
leaveOffset = 1000;
if( !isdefined( teamHeli ) )
teamHeli = "both";
if ( teamHeli == "axis" )
{
self thread insertaxisInsertChopper( axisPoint );
}
else if ( teamHeli == "allies" )
{
self thread insertalliesInsertChopper( alliesPoint );
}
else
{
self thread insertalliesInsertChopper( alliesPoint );
self thread insertaxisInsertChopper( axisPoint );
}
}
insertalliesInsertChopper( pointOverRide )
{
startSpawns = getStartSpawns();
spawnHeight = 1200;
hoverOffset = 1200;
leaveOffset = 1000;
if ( !isDefined( pointOverRide ) )
pointOverRide = startSpawns["allies"][0];
// allies chopper
forward1 = AnglesToForward( startSpawns["allies"][0].angles ) * 300;
up1 = AnglesToUp( startSpawns["allies"][0].angles ) * spawnHeight;
right1 = AnglesToRight( startSpawns["allies"][0].angles ) * 3200;
left1 = AnglesToRight( startSpawns["allies"][0].angles ) * -3200;
rightPos1 = startSpawns["allies"][0].origin+forward1+up1+right1;
leftPos1 = startSpawns["allies"][0].origin+forward1+up1+left1;
alliesInsertChopper = spawnHelicopter( self, rightPos1, startSpawns["allies"][0].angles, "pavelow_mp", "vehicle_pavelow" );
if ( !isDefined( alliesInsertChopper ) )
return;
level.alliesInsertChopper = alliesInsertChopper;
level.alliesInsertChopper.linkedPlayers = [];
level.alliesInsertChopper.droppedOff = false;
// move to spawn position
alliesInsertChopper Vehicle_SetSpeed( 50, 15 );
alliesInsertChopper setVehGoalPos( startSpawns["allies"][0].origin + (0,0,hoverOffset/2), 1 );
alliesInsertChopper waittill ( "goal" );
// lower to drop off
alliesInsertChopper setyawspeed( 0, 1, 1 );
alliesInsertChopper setVehGoalPos( startSpawns["allies"][0].origin + (0,0,hoverOffset/6), 1 );
alliesInsertChopper waittill ( "goal" );
level.alliesInsertChopper.droppedOff = true;
foreach( player in level.alliesInsertChopper.linkedPlayers )
{
player Unlink();
}
wait( 2 );
alliesInsertChopper SetYawSpeed( 60, 40, 40, 0.3 );
alliesInsertChopper setVehGoalPos( startSpawns["allies"][0].origin + (0,0,hoverOffset), 1 );
alliesInsertChopper waittill ( "goal" );
// rise to leave
alliesInsertChopper Vehicle_SetSpeed( 80, 60 );
alliesInsertChopper setVehGoalPos( rightPos1+(0,0,leaveOffset)+right1*2, 1 );
alliesInsertChopper waittill ( "goal" );
// leave
alliesInsertChopper Vehicle_SetSpeed( 120, 120 );
alliesInsertChopper setVehGoalPos( rightPos1+(0,0,leaveOffset)+right1*2+forward1*-20, 1 );
alliesInsertChopper waittill ( "goal" );
alliesInsertChopper delete();
}
insertaxisInsertChopper( pointOverRide )
{
startSpawns = getStartSpawns();
spawnHeight = 1200;
hoverOffset = 1200;
leaveOffset = 1000;
// axis chopper
forward1 = AnglesToForward( startSpawns["axis"][0].angles ) * 300;
up1 = AnglesToUp( startSpawns["axis"][0].angles ) * spawnHeight;
right1 = AnglesToRight( startSpawns["axis"][0].angles ) * 3200;
left1 = AnglesToRight( startSpawns["axis"][0].angles ) * -3200;
rightPos1 = startSpawns["axis"][0].origin+forward1+up1+right1;
leftPos1 = startSpawns["axis"][0].origin+forward1+up1+left1;
axisInsertChopper = spawnHelicopter( self, rightPos1, startSpawns["axis"][0].angles, "pavelow_mp", "vehicle_pavelow" );
if ( !isDefined( axisInsertChopper ) )
return;
level.axisInsertChopper = axisInsertChopper;
level.axisInsertChopper.linkedPlayers = [];
level.axisInsertChopper.droppedOff = false;
// move to spawn position
axisInsertChopper Vehicle_SetSpeed( 50, 15 );
axisInsertChopper setVehGoalPos( startSpawns["axis"][0].origin + (0,0,hoverOffset/2), 1 );
axisInsertChopper waittill ( "goal" );
// lower to drop off
axisInsertChopper setyawspeed( 0, 1, 1 );
axisInsertChopper setVehGoalPos( startSpawns["axis"][0].origin + (0,0,hoverOffset/6), 1 );
axisInsertChopper waittill ( "goal" );
level.axisInsertChopper.droppedOff = true;
foreach( player in level.axisInsertChopper.linkedPlayers )
{
player Unlink();
}
wait( 2 );
axisInsertChopper SetYawSpeed( 60, 40, 40, 0.3 );
axisInsertChopper setVehGoalPos( startSpawns["axis"][0].origin + (0,0,hoverOffset), 1 );
axisInsertChopper waittill ( "goal" );
// rise to leave
axisInsertChopper Vehicle_SetSpeed( 80, 60 );
axisInsertChopper setVehGoalPos( rightPos1+(0,0,leaveOffset)+right1*2, 1 );
axisInsertChopper waittill ( "goal" );
// leave
axisInsertChopper Vehicle_SetSpeed( 120, 120 );
axisInsertChopper setVehGoalPos( rightPos1+(0,0,leaveOffset)+right1*2+forward1*-20, 1 );
axisInsertChopper waittill ( "goal" );
axisInsertChopper delete();
}
//////////////////////////////////////////////
//
// Event - Mortar
doMortar()
{
mapCenter = getMapCenter();
offset = 1;
for ( i=0; i<5; i++ )
{
mortarTarget = mapCenter + ( RandomIntRange(100, 600)*offset, RandomIntRange(100, 600)*offset, 0 );
traceData = BulletTrace( mortarTarget+(0,0,500), mortarTarget-(0,0,500), false );
if ( isDefined( traceData["position"] ) )
{
PlayFx( level.match_events_fx["tracer"], mortarTarget );
thread playSoundinSpace( "fast_artillery_round", mortarTarget );
wait( RandomFloatRange( 0.5, 1.5 ) );
PlayFx( level.match_events_fx["explosion"], mortarTarget );
PlayRumbleOnPosition( "grenade_rumble", mortarTarget );
Earthquake( 1.0, 0.6, mortarTarget, 2000 );
thread playSoundinSpace( "exp_suitcase_bomb_main", mortarTarget );
physicsExplosionSphere( mortarTarget + (0,0,30), 250, 125, 2 );
offset *= -1;
}
}
}
//////////////////////////////////////////////
//
// Event - Smoke
doSmoke()
{
mapCenter = getMapCenter();
offset = 1;
for ( i=0; i<3; i++ )
{
smokeTarget = mapCenter + ( RandomIntRange(100, 600)*offset, RandomIntRange(100, 600)*offset, 0 );
PlayFx( level.match_events_fx["smoke"], smokeTarget );
offset *= -1;
wait( 2 );
}
}
//////////////////////////////////////////////
//
// Event - Airstrike
doAirstrike()
{
level endon( "game_ended" );
offset = 1;
mapCenter = getMapCenter();
for( i = 0; i < 3; i++ )
{
strikeTarget = mapCenter + ( RandomIntRange(100, 600)*offset, RandomIntRange(100, 600)*offset, 0 );
traceData = BulletTrace( strikeTarget+(0,0,500), strikeTarget-(0,0,500), false );
if ( isDefined( traceData["position"] ) )
{
thread doAirstrikeFlyBy( traceData["position"] );
offset *= -1;
wait ( randomIntRange( 2,4 ) );
}
}
}
doAirstrikeFlyBy( strikeTarget )
{
randSpawn = randomInt( level.spawnPoints.size - 1 );
targetPos = level.spawnPoints[randSpawn].origin * (1,1,0);
backDist = 8000;
forwardDist = 8000;
heightEnt = GetEnt( "airstrikeheight", "targetname" );
upVector = (0, 0, heightEnt.origin[2] + randomIntRange(-100, 600) );
forward = AnglesToForward( (0,randomInt(45),0) );
startpos = targetPos + upVector + forward * backDist * -1;
endPos = targetPos + upVector + forward * forwardDist;
plane2StartPos = startpos + ( randomIntRange(400,500), randomIntRange(400,500), randomIntRange(200,300) );
plane2EndPos = endPos + ( randomIntRange(400,500), randomIntRange(400,500), randomIntRange(200,300) );
plane = spawnplane( self, "script_model", startpos );
plane2 = spawnplane( self, "script_model", plane2StartPos );
if ( cointoss() )
{
plane setModel( "vehicle_av8b_harrier_jet_mp" );
plane2 setModel( "vehicle_av8b_harrier_jet_mp" );
}
else
{
plane setModel( "vehicle_av8b_harrier_jet_opfor_mp" );
plane2 setModel( "vehicle_av8b_harrier_jet_opfor_mp" );
}
plane.angles = vectorToAngles( endPos-startPos );
plane playloopsound( "veh_mig29_dist_loop" );
plane thread playPlaneFx();
plane2.angles = vectorToAngles( endPos-plane2StartPos );
plane2 playloopsound( "veh_mig29_dist_loop" );
plane2 thread playPlaneFx();
length = distance(startPos, endPos);
plane moveTo( endPos * 2, length/2000, 0, 0 );
wait( randomFloatRange( .25, .5 ) );
plane2 moveTo( plane2EndPos * 2, length/2000, 0, 0 );
//MagicBullet( "nodamage_rocket_mp", plane.origin, strikeTarget );
wait( length/2000 );
plane delete();
plane2 delete();
}
playPlaneFx()
{
self endon ( "death" );
wait( 0.5);
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_right" );
wait( 0.5);
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_left" );
wait( 0.5);
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
wait( 0.5);
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
}
//////////////////////////////////////////////
//
// Event - Pavelow
doPavelow()
{
mapCenter = getMapCenter();
traceData = BulletTrace( mapCenter+(0,0,500), mapCenter-(0,0,500), false );
if ( isDefined( traceData["position"] ) )
{
if ( cointoss() )
vehicleModel = "vehicle_pavelow";
else
vehicleModel = "vehicle_pavelow_opfor";
chopper = spawnHelicopter( self, traceData["position"]+(0,0,1000), (0,0,0), "pavelow_mp", vehicleModel );
if ( !isDefined( chopper ) )
return;
chopper.team = self.pers["team"];
chopper.heli_type = level.heli_types[ vehicleModel ];
chopper thread [[ level.lightFxFunc[ level.heli_types[ vehicleModel ] ] ]]();
chopper.zOffset = (0,0,chopper getTagOrigin( "tag_origin" )[2] - chopper getTagOrigin( "tag_ground" )[2]);
wait( 1 );
playFxOnTag( level.chopper_fx["damage"]["on_fire"], chopper, "tag_engine_left" );
chopper thread maps\mp\killstreaks\_helicopter::heli_crash();
}
}
//////////////////////////////////////////////
//
// Event - Osprey Insertion
doOspreyInsertion()
{
startSpawns = getStartSpawns();
if ( isDefined( startSpawns ) )
{
spawnHeight = 200;
hoverOffset = 200;
leaveOffset = 1000;
// allies osprey
forward1 = AnglesToForward( startSpawns["allies"][0].angles ) * 300;
up1 = AnglesToUp( startSpawns["allies"][0].angles ) * spawnHeight;
pos1 = startSpawns["allies"][0].origin+forward1+up1;
airShip1 = spawnHelicopter( self, pos1, startSpawns["allies"][0].angles, "osprey_minigun_mp", "vehicle_v22_osprey_body_mp" );
if ( !isDefined( airShip1 ) )
return;
// axis osprey
forward2 = AnglesToForward( startSpawns["axis"][0].angles ) * 300;
up2 = AnglesToUp( startSpawns["axis"][0].angles ) * spawnHeight;
pos2 = startSpawns["axis"][0].origin+forward2+up2;
airShip2 = spawnHelicopter( self, pos2, startSpawns["axis"][0].angles, "osprey_minigun_mp", "vehicle_v22_osprey_body_mp" );
if ( !isDefined( airShip2 ) )
{
airShip1 delete();
return;
}
// rise to hover
airship1 thread maps\mp\killstreaks\_escortairdrop::airShipPitchPropsUp();
airship2 thread maps\mp\killstreaks\_escortairdrop::airShipPitchPropsUp();
airShip1 thread maps\mp\killstreaks\_escortairdrop::airShipPitchHatchDown();
airShip2 thread maps\mp\killstreaks\_escortairdrop::airShipPitchHatchDown();
airShip1 Vehicle_SetSpeed( 20, 10 );
airShip1 SetYawSpeed( 3, 3, 3, 0.3 );
airShip1 setVehGoalPos( pos1+(0,0,hoverOffset), 1 );
airShip2 Vehicle_SetSpeed( 20, 10 );
airShip2 SetYawSpeed( 3, 3, 3, 0.3 );
airShip2 setVehGoalPos( pos2+(0,0,hoverOffset), 1 );
airShip1 waittill ( "goal" );
airShip1 thread maps\mp\killstreaks\_escortairdrop::airShipPitchHatchUp();
airShip2 thread maps\mp\killstreaks\_escortairdrop::airShipPitchHatchUp();
wait( 2 );
// rise to leave
airShip1 Vehicle_SetSpeed( 80, 60 );
airShip1 SetYawSpeed( 30, 15, 15, 0.3 );
airShip1 setVehGoalPos( pos1+(0,0,leaveOffset), 1 );
airShip2 Vehicle_SetSpeed( 80, 60 );
airShip2 SetYawSpeed( 30, 15, 15, 0.3 );
airShip2 setVehGoalPos( pos2+(0,0,leaveOffset), 1 );
airShip1 waittill ( "goal" );
// leave
airship1 thread maps\mp\killstreaks\_escortairdrop::airShipPitchPropsDown();
airship2 thread maps\mp\killstreaks\_escortairdrop::airShipPitchPropsDown();
airShip1 Vehicle_SetSpeed( 120, 120 );
airShip1 SetYawSpeed( 100, 100, 40, 0.3 );
airShip1 setVehGoalPos( pos1+(0,0,leaveOffset)+forward1*-20, 1 );
airShip2 Vehicle_SetSpeed( 120, 120 );
airShip2 SetYawSpeed( 100, 100, 40, 0.3 );
airShip2 setVehGoalPos( pos2+(0,0,leaveOffset)+forward2*-20, 1 );
airShip1 waittill ( "goal" );
airShip1 delete();
airShip2 delete();
}
}