Advertisement
Adam445

Untitled

May 27th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 47.83 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4.  
  5. init()
  6. {
  7. level.flagmodel["neutral"] = "prop_flag_neutral";
  8. level.flagmodel["allies"] = "prop_flag_american";
  9. level.flagmodel["axis"] = "prop_flag_opfor";
  10. precacheModel(level.flagmodel["neutral"]);
  11. precacheModel(level.flagmodel["allies"]);
  12. precacheModel(level.flagmodel["axis"]);
  13.  
  14. /*game["objective_neutral"] = "hudicon_neutral";
  15. game["objective_allies"] = "objective_" + game["allies"];
  16. game["objective_axis"] = "objective_" + game["axis"];
  17. precacheShader(game["objective_neutral"]);
  18. precacheShader(game["objective_allies"]);
  19. precacheShader(game["objective_axis"]);*/
  20.  
  21. precacheLocationSelector("map_artillery_selector");
  22.  
  23.  
  24. precacheString(&"MP_WAR_WAITING_FOR_AIRSTRIKE");
  25. precacheString(&"PLATFORM_PRESS_TO_USE_AIRSTRIKE");
  26. precacheString(&"MP_WAR_AIRSTRIKE_CROSSHAIR");
  27.  
  28. precacheString(&"MP_WAR_AIRSTRIKE_INSTRUCTIONS1");
  29. precacheString(&"MP_WAR_AIRSTRIKE_INSTRUCTIONS2");
  30. precacheString(&"MP_WAR_AIRSTRIKE_INSTRUCTIONS3");
  31.  
  32. precacheString(&"MP_WAR_AIRSTRIKE_INBOUND");
  33. precacheString(&"MP_WAR_AIRSTRIKE_INBOUND_NEAR_YOUR_POSITION");
  34.  
  35. precacheString(&"MP_WAR_WAITING_FOR_COPTER_TO_BE_READY_FOR_ORDERS");
  36. precacheString(&"MP_WAR_WAITING_FOR_COPTER_TO_REACH_DESTINATION");
  37. precacheString(&"MP_WAR_WAITING_FOR_COPTER_TO_BE_AVAILABLE");
  38. precacheString(&"PLATFORM_PRESS_TO_USE_COPTER");
  39.  
  40. precacheString(&"MP_WAR_WAITING_FOR_AMMO");
  41. precacheString(&"MP_WAR_PRESS_TO_REPLENISH_AMMO");
  42.  
  43. precacheString(&"MP_WAR_COPTER_INSTRUCTIONS1");
  44. precacheString(&"MP_WAR_COPTER_INSTRUCTIONS2");
  45.  
  46. precacheString(&"MP_WAR_WAITING_FOR_RADAR");
  47. precacheString(&"MP_WAR_RADAR_ACQUIRED");
  48. precacheString(&"MP_WAR_RADAR_ACQUIRED_ENEMY");
  49. precacheString(&"MP_WAR_RADAR_EXPIRED");
  50. precacheString(&"MP_WAR_RADAR_EXPIRED_ENEMY");
  51. precacheString(&"PLATFORM_PRESS_TO_USE_RADAR");
  52.  
  53. precacheItem( "artillery_mp" );
  54. precacheModel( "vehicle_mig29_desert" );
  55. precacheModel( "projectile_cbu97_clusterbomb" );
  56. precacheModel( "tag_origin" );
  57.  
  58. level.airstrikefx = loadfx ("explosions/clusterbomb");
  59. level.mortareffect = loadfx ("explosions/artilleryExp_dirt_brown");
  60. level.bombstrike = loadfx ("explosions/wall_explosion_pm_a");
  61.  
  62. level.fx_airstrike_afterburner = loadfx ("fire/jet_afterburner");
  63. level.fx_airstrike_contrail = loadfx ("smoke/jet_contrail");
  64.  
  65. //level.copterInterval = 120;
  66. //level.copterFightTime = 30; // length of time the helicopter sticks around once it arrives
  67.  
  68. level.artilleryInterval = 60; // time between allowed uses of artillery
  69.  
  70. // time interval between usage of helicopter hardpoint
  71. if ( getdvar( "scr_heli_hardpoint_interval" ) != "" )
  72. level.helicopterInterval = getdvarfloat( "scr_heli_hardpoint_interval" );
  73. else
  74. {
  75. setdvar( "scr_heli_hardpoint_interval" , 180 );
  76. level.helicopterInterval = 180; // time between allowed uses of helicopter
  77. }
  78.  
  79. level.artillerylikelyrange = 256+128;
  80. level.artilleryunlikelyrange = level.artillerylikelyrange*2;
  81. level.artillerymininterval = .4;
  82. level.artillerymaxinterval = 1.5;
  83.  
  84. level.artilleryDangerMaxRadius = level.artilleryunlikelyrange + 300;
  85. level.artilleryDangerMinRadius = level.artillerylikelyrange;
  86.  
  87. level.artilleryDangerMaxRadiusSq = level.artilleryDangerMaxRadius * level.artilleryDangerMaxRadius;
  88.  
  89. level.radarInterval = 60; // time between allowed uses of radar
  90.  
  91. level.radarViewTime = 60; // time radar remains active
  92.  
  93. level.objProgressBarHeight = 12;
  94. if(level.splitscreen)
  95. level.objProgressBarWidth = 152;
  96. else
  97. level.objProgressBarWidth = 192;
  98.  
  99.  
  100. level.numHardpointReservedObjectives = 0;
  101.  
  102. if ( !maps\mp\gametypes\_tweakables::getTweakableValue( "hud", "showobjicons" ) )
  103. level.suppressHardpoint3DIcons = true;
  104.  
  105. thread objectives();
  106. }
  107.  
  108. nullfunc() {}
  109.  
  110. objectives()
  111. {
  112. objTypes = [];
  113. objTypes[0] = "artillery_obj";
  114. objTypes[1] = "radar_obj";
  115. objTypes[2] = "armor_obj";
  116. objTypes[3] = "heli_obj";
  117. objTypes[4] = "ammo_obj";
  118.  
  119. objThinkFuncs = [];
  120. objThinkFuncs[objTypes[0]] = ::obj_artillery_think;
  121. objThinkFuncs[objTypes[1]] = ::obj_radar_think;
  122. objThinkFuncs[objTypes[2]] = ::nullfunc;
  123. objThinkFuncs[objTypes[3]] = ::obj_heli_think; //::obj_copter_think;
  124. objThinkFuncs[objTypes[4]] = ::obj_ammo_think;
  125.  
  126. objTeamSeparated[objTypes[0]] = true;
  127. objTeamSeparated[objTypes[1]] = true;
  128. objTeamSeparated[objTypes[2]] = false;
  129. objTeamSeparated[objTypes[3]] = true;
  130. objTeamSeparated[objTypes[4]] = false;
  131.  
  132. // artillery
  133. level.objwaypointshader[objTypes[0]]["available"] = "waypoint_airstrike_white";
  134. level.objwaypointshader[objTypes[0]]["used_enemy"] = "waypoint_airstrike_red";
  135. level.objwaypointshader[objTypes[0]]["used_friendly"] = "waypoint_airstrike_green";
  136. level.objwaypointshadercompass[objTypes[0]]["available"] = "compass_objpoint_airstrike";
  137. level.objwaypointshadercompass[objTypes[0]]["used_enemy"] = "compass_objpoint_airstrike_busy";
  138. level.objwaypointshadercompass[objTypes[0]]["used_friendly"] = "compass_objpoint_airstrike_friendly";
  139.  
  140. // radar
  141. level.objwaypointshader[objTypes[1]]["available"] = "waypoint_radar_white";
  142. level.objwaypointshader[objTypes[1]]["used_enemy"] = "waypoint_radar_red";
  143. level.objwaypointshader[objTypes[1]]["used_friendly"] = "waypoint_radar_green";
  144. level.objwaypointshadercompass[objTypes[1]]["available"] = "compass_objpoint_satallite";
  145. level.objwaypointshadercompass[objTypes[1]]["used_enemy"] = "compass_objpoint_satallite_busy";
  146. level.objwaypointshadercompass[objTypes[1]]["used_friendly"] = "compass_objpoint_satallite_friendly";
  147.  
  148. // helicopter
  149. level.objwaypointshader[objTypes[3]]["available"] = "waypoint_heli_white";
  150. level.objwaypointshader[objTypes[3]]["used_enemy"] = "waypoint_heli_red";
  151. level.objwaypointshader[objTypes[3]]["used_friendly"] = "waypoint_heli_green";
  152. level.objwaypointshadercompass[objTypes[3]]["available"] = "compass_objpoint_helicopter";
  153. level.objwaypointshadercompass[objTypes[3]]["used_enemy"] = "compass_objpoint_helicopter_busy";
  154. level.objwaypointshadercompass[objTypes[3]]["used_friendly"] = "compass_objpoint_helicopter_friendly";
  155.  
  156. objs = [];
  157. for (i = 0; i < objTypes.size; i++)
  158. {
  159. theseobjs = getentarray(objTypes[i], "targetname");
  160.  
  161. // precache what we'll use
  162. if (theseobjs.size > 0)
  163. {
  164. if ( !maps\mp\gametypes\_tweakables::getTweakableValue( "hardpoint", "allowartillery" ) && objTypes[i] == "artillery_obj" )
  165. {
  166. for ( index = 0; index < theseObjs.size; index++ )
  167. theseObjs[index] delete_hardpoint();
  168.  
  169. theseObjs = [];
  170. }
  171. else if ( !maps\mp\gametypes\_tweakables::getTweakableValue( "hardpoint", "allowuav" ) && objTypes[i] == "radar_obj" )
  172. {
  173. for ( index = 0; index < theseObjs.size; index++ )
  174. theseObjs[index] delete_hardpoint();
  175.  
  176. theseObjs = [];
  177. }
  178. else if ( !maps\mp\gametypes\_tweakables::getTweakableValue( "hardpoint", "allowsupply" ) && objTypes[i] == "ammo_obj" )
  179. {
  180. for ( index = 0; index < theseObjs.size; index++ )
  181. theseObjs[index] delete_hardpoint();
  182.  
  183. theseObjs = [];
  184. }
  185. else if ( !maps\mp\gametypes\_tweakables::getTweakableValue( "hardpoint", "allowhelicopter" ) && objTypes[i] == "heli_obj" )
  186. {
  187. for ( index = 0; index < theseObjs.size; index++ )
  188. theseObjs[index] delete_hardpoint();
  189.  
  190. theseObjs = [];
  191. }
  192. else if (isdefined(level.objwaypointshader[objTypes[i]]))
  193. {
  194. if ( isdefined( level.objwaypointshader[objTypes[i]]["available"] ) )
  195. precacheShader(level.objwaypointshader[objTypes[i]]["available"]);
  196. if ( isdefined( level.objwaypointshader[objTypes[i]]["unavailable"] ) )
  197. precacheShader(level.objwaypointshader[objTypes[i]]["unavailable"]);
  198. if ( isdefined( level.objwaypointshader[objTypes[i]]["used_enemy"] ) )
  199. precacheShader(level.objwaypointshader[objTypes[i]]["used_enemy"]);
  200. if ( isdefined( level.objwaypointshader[objTypes[i]]["used_friendly"] ) )
  201. precacheShader(level.objwaypointshader[objTypes[i]]["used_friendly"]);
  202.  
  203. if ( isdefined( level.objwaypointshadercompass[objTypes[i]]["available"] ) )
  204. precacheShader(level.objwaypointshadercompass[objTypes[i]]["available"]);
  205. if ( isdefined( level.objwaypointshadercompass[objTypes[i]]["unavailable"] ) )
  206. precacheShader(level.objwaypointshadercompass[objTypes[i]]["unavailable"]);
  207. if ( isdefined( level.objwaypointshadercompass[objTypes[i]]["used_enemy"] ) )
  208. precacheShader(level.objwaypointshadercompass[objTypes[i]]["used_enemy"]);
  209. if ( isdefined( level.objwaypointshadercompass[objTypes[i]]["used_friendly"] ) )
  210. precacheShader(level.objwaypointshadercompass[objTypes[i]]["used_friendly"]);
  211. }
  212. }
  213.  
  214. for (j = 0; j < theseobjs.size; j++)
  215. {
  216. obji = objs.size;
  217. objs[obji] = theseobjs[j];
  218. objs[obji].objtype = objTypes[i];
  219. objs[obji].id = obji;
  220. }
  221. }
  222.  
  223. for (i = 0; i < objs.size; i++)
  224. {
  225. // objs[i] is a trigger.
  226.  
  227. if (isdefined(objs[i].target)) {
  228. targetent = getent(objs[i].target, "targetname");
  229. if (targetent.classname == "script_model")
  230. objs[i].flag = targetent;
  231. }
  232.  
  233. objs[i] thread createObj(level.numHardpointReservedObjectives, objTeamSeparated[objs[i].objtype]);
  234. if (objTeamSeparated[objs[i].objtype])
  235. level.numHardpointReservedObjectives += 2;
  236. else
  237. level.numHardpointReservedObjectives++;
  238.  
  239. objs[i] thread [[ objThinkFuncs[objs[i].objtype] ]]();
  240.  
  241. // no longer using flags
  242. if (isdefined(objs[i].flag)) objs[i].flag delete();
  243. }
  244.  
  245. level.objs = objs;
  246.  
  247. maps\mp\_helicopter::init(); //maps\mp\gametypes\_copter::init();
  248. thread ammo();
  249. }
  250.  
  251. createObj(firstobj, teamseparated)
  252. {
  253. self endon ( "death" );
  254. waittillframeend; // make sure level.numGametypeReservedObjectives has a chance to be defined
  255.  
  256. self.objectiveid = [];
  257. if (!teamseparated) {
  258. self.objectiveid["all"] = firstobj;
  259. if (isdefined(level.objwaypointshader[self.objtype]))
  260. objective_add(self.objectiveid["all"], "active", self.origin, level.objwaypointshadercompass[self.objtype]["available"]);
  261. }
  262. else {
  263. self.objectiveid["axis"] = firstobj;
  264. self.objectiveid["allies"] = firstobj + 1;
  265. if (isdefined(level.objwaypointshader[self.objtype])) {
  266. objective_add(self.objectiveid["axis"], "active", self.origin, level.objwaypointshadercompass[self.objtype]["available"]);
  267. objective_team(self.objectiveid["axis"], "axis");
  268. objective_add(self.objectiveid["allies"], "active", self.origin, level.objwaypointshadercompass[self.objtype]["available"]);
  269. objective_team(self.objectiveid["allies"], "allies");
  270. }
  271. }
  272.  
  273. self notify("objective_created");
  274. }
  275.  
  276. updateObjStatus(team, status)
  277. {
  278. if (isdefined(level.objwaypointshader[self.objtype]))
  279. {
  280. objective_icon(self.objectiveid[team], level.objwaypointshadercompass[self.objtype][status]);
  281. if (!isdefined(level.suppressHardpoint3DIcons))
  282. maps\mp\gametypes\_objpoints::createTeamObjPoint( "hardpoint_" + team + "_" + self.id, self.origin, team, level.objwaypointshader[self.objtype][status] );
  283. }
  284. }
  285.  
  286. teamHasRadar(team)
  287. {
  288. return getTeamRadar(team);
  289. }
  290.  
  291. delete_hardpoint()
  292. {
  293. if ( isDefined( self.flag ) )
  294. {
  295. if ( isDefined( self.flag.target ) )
  296. getEnt( self.flag.target, "targetname" ) delete();
  297.  
  298. self.flag delete();
  299. }
  300. self delete();
  301. }
  302.  
  303. // hardpoint think
  304. obj_heli_think()
  305. {
  306. self.trig = getent(self.flag.target, "targetname");
  307. self.trig setHintString(&"PLATFORM_PRESS_TO_USE_COPTER");
  308.  
  309. self.trig.originalorigin = self.trig.origin;
  310.  
  311. self.lastusage = gettime() - 1000*60*60;
  312.  
  313. self thread timedHardpointHUD( &"MP_WAR_WAITING_FOR_COPTER_TO_BE_AVAILABLE", level.helicopterInterval );
  314.  
  315. self waittill("objective_created");
  316.  
  317. for( ;; )
  318. {
  319. self updateObjStatus("axis", "available");
  320. self updateObjStatus("allies", "available");
  321. self.trig waittill ( "trigger", player );
  322.  
  323. self.trig.origin += (0,0,-50000);
  324. self.lastusage = gettime();
  325.  
  326. assertex( ( isdefined( player ) && isdefined( player.pers["team"] ) ), "Invalid player triggered helicopter" );
  327.  
  328. if ( player.pers["team"] == "allies" )
  329. {
  330. self updateObjStatus("axis", "used_enemy");
  331. self updateObjStatus("allies", "used_friendly");
  332. helicopter_team = "allies";
  333. //iPrintlnBold( "Incoming Marine helicopter support!" );
  334. }
  335. else
  336. {
  337. self updateObjStatus("allies", "used_enemy");
  338. self updateObjStatus("axis", "used_friendly");
  339. helicopter_team = "axis";
  340. //iPrintlnBold( "Incoming Opposition helicopter support!" );
  341. }
  342.  
  343. assertex( isdefined( level.heli_paths ), "There are no helicopter paths in this map" );
  344.  
  345. destination = 0;
  346. random_path = randomint( level.heli_paths[destination].size );
  347. startnode = level.heli_paths[destination][random_path];
  348.  
  349. thread maps\mp\_helicopter::heli_think( player, startnode, helicopter_team );
  350.  
  351. wait( level.helicopterInterval );
  352. self.trig.origin = self.trig.originalOrigin;
  353. }
  354. }
  355.  
  356. obj_artillery_think()
  357. {
  358. self.trig = getent(self.flag.target, "targetname");
  359. self.trig.originalOrigin = self.trig.origin;
  360. self.trig.origin += (0,0,-50000);
  361. self.trig setHintString(&"PLATFORM_PRESS_TO_USE_AIRSTRIKE");
  362.  
  363. self.lastusage = gettime() - 1000*60*60;
  364.  
  365. self thread obj_locationSelect(::artilleryUsed);
  366. self thread timedHardpointHUD( &"MP_WAR_WAITING_FOR_AIRSTRIKE", level.artilleryInterval );
  367.  
  368. // no longer owned by a specific team, so let anyone use it
  369. self.trig.origin = self.trig.originalOrigin;
  370.  
  371. self waittill("objective_created");
  372.  
  373. self updateObjStatus("axis", "available");
  374. self updateObjStatus("allies", "available");
  375. }
  376. obj_locationSelect(usedCallback)
  377. {
  378. while(1)
  379. {
  380. self.trig waittill("trigger", guy);
  381. if (isalive(guy) /*&& guy.pers["team"] == self.team*/)
  382. {
  383. guy thread startLocationSelection(self, usedCallback);
  384. self.trig.origin += (0,0,-50000);
  385.  
  386. thread returnTrigAfterTime( self.trig );
  387.  
  388. self waittill("allow_other_players_to_use");
  389. }
  390. }
  391. }
  392. returnTrigAfterTime( trig )
  393. {
  394. self endon("allow_other_players_to_use");
  395. wait 10;
  396. trig.origin = trig.originalorigin;
  397. self notify("allow_other_players_to_use");
  398. }
  399. startLocationSelection(obj, usedCallback)
  400. {
  401. self beginLocationSelection("map_artillery_selector", level.artilleryunlikelyrange * 1.2);
  402.  
  403. self thread allowLocationEnd(obj, "cancel_location");
  404. self thread allowLocationEnd(obj, "death");
  405. self thread allowLocationEnd(obj, "disconnect");
  406. self thread endLocationSelectionOnUse(obj);
  407.  
  408. self endon("stop_location_selection");
  409. self waittill("confirm_location", location);
  410.  
  411. self thread finishUsage(location, usedCallback, obj);
  412. }
  413. finishUsage(location, usedCallback, obj)
  414. {
  415. obj notify("used");
  416. self thread stopLocationSelection(obj, false);
  417. obj thread [[usedCallback]](location, self);
  418. }
  419. allowLocationEnd(obj, waitfor)
  420. {
  421. self endon("stop_location_selection");
  422.  
  423. self waittill(waitfor);
  424.  
  425. obj.trig.origin = obj.trig.originalorigin;
  426. self thread stopLocationSelection(obj, (waitfor == "disconnect"));
  427. }
  428. endLocationSelectionOnUse(obj)
  429. {
  430. self endon("stop_location_selection");
  431.  
  432. obj waittill("used");
  433.  
  434. self thread stopLocationSelection(obj, false);
  435. }
  436. stopLocationSelection(obj, disconnected)
  437. {
  438. if ( !disconnected )
  439. self endLocationSelection();
  440.  
  441. obj notify("allow_other_players_to_use");
  442. self notify("stop_location_selection");
  443. }
  444.  
  445. artilleryUsed(pos, player)
  446. {
  447. trace = bullettrace(self.origin + (0,0,10000), self.origin, false, undefined);
  448. pos = (pos[0], pos[1], trace["position"][2] - 514);
  449.  
  450. team = player.pers["team"];
  451. otherteam = "allies";
  452. if ( team == "allies" )
  453. otherteam = "axis";
  454.  
  455. thread doArtillery(pos, player, /*self.team*/ team);
  456.  
  457. self notify("used_artillery");
  458.  
  459. self.trig.origin += (0,0,-50000);
  460.  
  461. self.lastusage = gettime();
  462.  
  463.  
  464. if ( player.pers["team"] == "allies" )
  465. {
  466. self updateObjStatus("axis", "used_enemy");
  467. self updateObjStatus("allies", "used_friendly");
  468. }
  469. else
  470. {
  471. self updateObjStatus("allies", "used_enemy");
  472. self updateObjStatus("axis", "used_friendly");
  473. }
  474. //self thread unavailableOnArtilleryHit(otherteam);
  475.  
  476. wait(level.artilleryInterval);
  477.  
  478. self.trig.origin = self.trig.originalOrigin;
  479.  
  480. players = getentarray("players", "classname");
  481. for (i = 0; i < players.size; i++)
  482. players[i] timedHardpointHUDHide(self);
  483.  
  484. self updateObjStatus("axis", "available");
  485. self updateObjStatus("allies", "available");
  486. }
  487. unavailableOnArtilleryHit(otherteam)
  488. {
  489. level waittill( "artillery_hit" );
  490. self updateObjStatus(otherteam, "unavailable");
  491. }
  492. distance2d(a,b)
  493. {
  494. return distance((a[0],a[1],0), (b[0],b[1],0));
  495. }
  496.  
  497.  
  498. doArtillery(origin, owner, team)
  499. {
  500. num = 17 + randomint(3);
  501.  
  502. level.artilleryDangerCenter = origin;
  503.  
  504. wait(1);
  505.  
  506. // play distant gun sounds
  507. /*
  508. soundplace = getent("artillery_gunsound_" + team, "targetname"); // this should be a script_origin somewhere on the map
  509.  
  510. soundplace playsound("distant_artillery_barrage");
  511. wait(3);
  512. soundplace playsound("distant_artillery_barrage");
  513. wait(2);
  514. */
  515.  
  516. players = getentarray("player", "classname");
  517. for(i = 0; i < players.size; i++)
  518. {
  519. if(isalive(players[i]) && (isdefined(players[i].pers["team"])) && (players[i].pers["team"] == team)) {
  520. if (distance2d(players[i].origin, origin) <= level.artilleryunlikelyrange * 1.25)
  521. players[i] iprintlnbold(&"MP_WAR_AIRSTRIKE_INBOUND_NEAR_YOUR_POSITION");
  522. //else
  523. // players[i] iprintlnbold(&"MP_WAR_ARTILLERY_INBOUND");
  524. }
  525. }
  526.  
  527. thread playSoundOnPlayers( "US_Tmp_stm_artilleryinbound", team );
  528.  
  529. /*if ( team == "allies" )
  530. thread playSoundOnPlayers( "US_Tmp_stm_enemyartilleryin", "axis" );
  531. else
  532. thread playSoundOnPlayers( "US_Tmp_stm_enemyartilleryin", "allies" );*/
  533.  
  534. wait 5;
  535.  
  536. /*
  537.  
  538. intervals = [];
  539. timeremaining = 0;
  540. for (i = 0; i < num - 1; i++) {
  541. intervals[i] = randomfloat(level.artillerymaxinterval - level.artillerymininterval) + level.artillerymininterval;
  542. timeremaining += intervals[i];
  543. }
  544.  
  545. for (i = 0; i < num; i++)
  546. {
  547. if (randomfloat(1) < .3)
  548. thisorigin = origin + ((randomfloat(2)-1)*level.artilleryunlikelyrange, (randomfloat(2)-1)*level.artilleryunlikelyrange, 0);
  549. else
  550. thisorigin = origin + ((randomfloat(2)-1)*level.artillerylikelyrange, (randomfloat(2)-1)*level.artillerylikelyrange, 0);
  551. trace = bullettrace(thisorigin, thisorigin + (0,0,-10000), false, undefined);
  552. targetpos = trace["position"];
  553.  
  554. thread artilleryDrop(targetpos, owner, team, timeremaining);
  555.  
  556. if (i < num - 1) {
  557. wait(intervals[i]);
  558. timeremaining -= intervals[i];
  559. }
  560. }
  561. */
  562.  
  563. trace = bullettrace(origin, origin + (0,0,-10000), false, undefined);
  564. targetpos = trace["position"];
  565. callStrike( owner, targetpos );
  566.  
  567. wait 2.5;
  568. level.artilleryDangerCenter = undefined;
  569. }
  570. artilleryDrop(targetpos, owner, team, timeremaining)
  571. {
  572. projectile = spawn("script_model", (0,0,0));
  573. projectile setModel("weapon_m67_grenade");
  574. projectile.origin = targetpos + (0,0,2000);
  575. projectile.modelscale = 2.5;
  576.  
  577. //projectile playsound("fast_artillery_round");
  578. projectile movez(-2000, 1);
  579. wait(1);
  580.  
  581. projectile maps\mp\gametypes\_shellshock::artillery_earthQuake();
  582. thread playsoundinspace("artillery_impact", targetpos);
  583. playfx (level.mortareffect, targetpos);
  584. //projectile.team = team;
  585. losRadiusDamage(targetpos + (0,0,16), 650, 300, 0, owner); // targetpos, radius, maxdamage, mindamage, player causing damage
  586.  
  587. level notify( "artillery_hit" );
  588.  
  589. // no more shellshock
  590. /*
  591. maxduration = timeremaining + 9;
  592. minduration = timeremaining*.5 + 5;
  593. if (maxduration < 5) maxduration = 5;
  594. if (minduration < 3) minduration = 3;
  595. if (maxduration > 15) maxduration = 15;
  596. if (minduration > 5) minduration = 5;
  597. radiusArtilleryShellshock(targetpos, 512*1.5, maxduration,minduration);
  598. */
  599.  
  600. wait(1);
  601. projectile delete();
  602. }
  603. losRadiusDamage(pos, radius, max, min, owner)
  604. {
  605. //oldff = level.friendlyfire;
  606. //level.friendlyfire = "1";
  607.  
  608. ents = maps\mp\gametypes\_weapons::getDamageableEnts(pos, radius, true);
  609. for (i = 0; i < ents.size; i++)
  610. {
  611. if (ents[i].entity == self)
  612. continue;
  613.  
  614. dist = distance(pos, ents[i].damageCenter);
  615.  
  616. if ( ents[i].isPlayer )
  617. {
  618. // check if there is a path to this entity 130 units above his feet. if not, they're probably indoors
  619. indoors = !maps\mp\gametypes\_weapons::weaponDamageTracePassed( ents[i].entity.origin, ents[i].entity.origin + (0,0,130), 0, undefined );
  620. if ( !indoors )
  621. {
  622. indoors = !maps\mp\gametypes\_weapons::weaponDamageTracePassed( ents[i].entity.origin + (0,0,130), pos + (0,0,130 - 16), 0, undefined );
  623. if ( indoors )
  624. {
  625. // give them a distance advantage for being indoors.
  626. dist *= 4;
  627. if ( dist > radius )
  628. continue;
  629. }
  630. }
  631. }
  632.  
  633. damage = int(max + (min-max)*dist/radius);
  634.  
  635. // do damage to the entity.
  636.  
  637. ents[i] maps\mp\gametypes\_weapons::damageEnt(
  638. undefined, // eInflictor = the entity that causes the damage (e.g. a claymore)
  639. owner, // eAttacker = the player that is attacking
  640. damage, // iDamage = the amount of damage to do
  641. "MOD_PROJECTILE_SPLASH", // sMeansOfDeath = string specifying the method of death (e.g. "MOD_PROJECTILE_SPLASH")
  642. "artillery_mp", // sWeapon = string specifying the weapon used (e.g. "claymore_mp")
  643. pos, // damagepos = the position damage is coming from
  644. vectornormalize(ents[i].damageCenter - pos) // damagedir = the direction damage is moving in
  645. );
  646. }
  647.  
  648. //level.friendlyfire = oldff;
  649. }
  650.  
  651. radiusArtilleryShellshock(pos, radius, maxduration,minduration)
  652. {
  653. players = getentarray("player", "classname");
  654. for (i = 0; i < players.size; i++)
  655. {
  656. if (!isalive(players[i]))
  657. continue;
  658.  
  659. playerpos = players[i].origin + (0,0,32);
  660. dist = distance(pos, playerpos);
  661. if (dist < radius) {
  662. duration = int(maxduration + (minduration-maxduration)*dist/radius);
  663.  
  664. players[i] thread artilleryShellshock("default", duration);
  665. }
  666. }
  667. }
  668.  
  669. artilleryShellshock(type, duration)
  670. {
  671. if (isdefined(self.beingArtilleryShellshocked) && self.beingArtilleryShellshocked)
  672. return;
  673. self.beingArtilleryShellshocked = true;
  674.  
  675. self shellshock(type, duration);
  676. wait(duration + 1);
  677.  
  678. self.beingArtilleryShellshocked = false;
  679. }
  680.  
  681. doPlaneStrike( owner, bombsite, startPoint, endPoint, bombTime, flyTime, direction )
  682. {
  683. // Spawn the planes
  684. plane = spawnplane( owner, "script_model", startPoint + ( (randomint( 200 ) - 100 ), (randomint( 200 ) - 100 ), 0 ) );
  685. plane setModel( "vehicle_mig29_desert" );
  686. plane.angles = direction;
  687.  
  688. plane thread playContrail();
  689.  
  690. plane moveTo( endPoint + ( (randomint( 300 ) - 150 ), (randomint( 300 ) - 150 ), 0 ), flyTime, 0, 0 );
  691.  
  692. thread callStrike_planeSound( plane, bombsite );
  693.  
  694. // callStrike_bomb( bomb time, bomb location, number of bombs )
  695. thread callStrike_bombEffect( plane, bombTime - 1.0, owner );
  696. // thread callStrike_bomb( bombTime, bombsite, 2, owner );
  697.  
  698. // Delete the plane after it's flyby
  699. wait flyTime;
  700. plane notify( "delete" );
  701. plane delete();
  702. }
  703.  
  704. callStrike_bombEffect( plane, launchTime, owner )
  705. {
  706. wait ( launchTime );
  707.  
  708. bomb = spawnbomb( plane.origin, plane.angles );
  709. bomb moveGravity( vector_scale( anglestoforward( plane.angles ), 7000/1.5 ), 3.0 );
  710.  
  711. wait ( 1.0 );
  712. newBomb = spawn( "script_model", bomb.origin );
  713. newBomb setModel( "tag_origin" );
  714. newBomb.origin = bomb.origin;
  715. newBomb.angles = bomb.angles;
  716. wait (0.05);
  717.  
  718. bomb delete();
  719. bomb = newBomb;
  720.  
  721. bombOrigin = bomb.origin;
  722. bombAngles = bomb.angles;
  723. playfxontag( level.airstrikefx, bomb, "tag_origin" );
  724. // bomb hide();
  725.  
  726. wait ( 0.5 );
  727. repeat = 12;
  728. minAngles = 5;
  729. maxAngles = 55;
  730. angleDiff = (maxAngles - minAngles) / repeat;
  731.  
  732. for( i = 0; i < repeat; i++ )
  733. {
  734. traceAngles = anglesToForward( bombAngles + (maxAngles-(angleDiff * i),randomInt( 10 )-5,0) );
  735. trace = bulletTrace( bombOrigin, bombOrigin + vector_scale( traceAngles, 10000 ), false, undefined );
  736.  
  737. //thread drawLine( bombOrigin, trace["position"], 1.0 );
  738. losRadiusDamage( trace["position"] + (0,0,16), 512, 200, 30, owner ); // targetpos, radius, maxdamage, mindamage, player causing damage
  739.  
  740. if ( i%3 == 0 )
  741. {
  742. thread playsoundinspace( "artillery_impact", trace["position"] );
  743. playRumbleOnPosition( "artillery_rumble", trace["position"] );
  744. earthquake( 0.7, 0.75, trace["position"], 1000 );
  745. }
  746.  
  747. wait ( 0.75/repeat );
  748. }
  749. wait ( 1.0 );
  750. bomb delete();
  751. }
  752.  
  753.  
  754. spawnbomb( origin, angles )
  755. {
  756. bomb = spawn( "script_model", origin );
  757. bomb.angles = angles;
  758. bomb setModel( "projectile_cbu97_clusterbomb" );
  759.  
  760. return bomb;
  761. }
  762.  
  763.  
  764. drawLine( start, end, timeSlice )
  765. {
  766. drawTime = int(timeSlice * 20);
  767. for( time = 0; time < drawTime; time++ )
  768. {
  769. line( start, end, (1,0,0),false, 1 );
  770. wait ( 0.05 );
  771. }
  772. }
  773.  
  774.  
  775. playContrail()
  776. {
  777. while ( isdefined( self ) )
  778. {
  779. if ( distance( self.origin , level.mapCenter ) <= 4000 )
  780. {
  781. playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
  782. playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
  783. return;
  784. }
  785. wait 0.05;
  786. }
  787. }
  788.  
  789. callStrike( owner, coord )
  790. {
  791. // Get starting and ending point for the plane
  792. direction = ( 0, randomint( 360 ), 0 );
  793. planeHalfDistance = 24000;
  794. planeBombExplodeDistance = 1500;
  795. planeFlyHeight = 850;
  796. planeFlySpeed = 7000;
  797.  
  798. startPoint = coord + vector_scale( anglestoforward( direction ), -1 * planeHalfDistance );
  799. startPoint += ( 0, 0, planeFlyHeight );
  800.  
  801. endPoint = coord + vector_scale( anglestoforward( direction ), planeHalfDistance );
  802. endPoint += ( 0, 0, planeFlyHeight );
  803.  
  804. // Make the plane fly by
  805. d = length( startPoint - endPoint );
  806. flyTime = ( d / planeFlySpeed );
  807.  
  808. // bomb explodes planeBombExplodeDistance after the plane passes the center
  809. d = abs( d/2 + planeBombExplodeDistance );
  810. bombTime = ( d / planeFlySpeed );
  811.  
  812. assert( flyTime > bombTime );
  813.  
  814. level thread doPlaneStrike( owner, coord, startPoint+(0,0,randomInt(500)), endPoint+(0,0,randomInt(500)), bombTime, flyTime, direction );
  815. wait 2; //wait 0.10;
  816. level thread doPlaneStrike( owner, coord, startPoint+(0,0,randomInt(200)), endPoint+(0,0,randomInt(200)), bombTime, flyTime, direction );
  817. wait 0.5; //wait 0.50;
  818. level thread doPlaneStrike( owner, coord, startPoint+(0,0,randomInt(200)), endPoint+(0,0,randomInt(200)), bombTime, flyTime, direction );
  819. wait 2;
  820. level thread doPlaneStrike( owner, coord, startPoint+(0,0,randomInt(200)), endPoint+(0,0,randomInt(200)), bombTime, flyTime, direction );
  821. }
  822.  
  823. callStrike_bomb( bombTime, coord, repeat, owner )
  824. {
  825. accuracyRadius = 512;
  826.  
  827. for( i = 0; i < repeat; i++ )
  828. {
  829. randVec = ( 0, randomint( 360 ), 0 );
  830. bombPoint = coord + vector_scale( anglestoforward( randVec ), accuracyRadius );
  831.  
  832. wait bombTime;
  833.  
  834. // playfx( level.bombstrike, bombPoint );
  835. // playfx( level.mortareffect, bombPoint );
  836. thread playsoundinspace( "artillery_impact", bombPoint );
  837. /*
  838. sound = [];
  839. sound[0] = "building_explosion1";
  840. sound[1] = "building_explosion2";
  841. sound[2] = "building_explosion3";
  842.  
  843. thread play_sound_in_space( sound[ randomint( sound.size ) ], bombPoint );
  844. */
  845. radiusArtilleryShellshock( bombPoint, 512, 8, 4);
  846. losRadiusDamage( bombPoint + (0,0,16), 768, 300, 50, owner); // targetpos, radius, maxdamage, mindamage, player causing damage
  847.  
  848. //radiusDamage( bombPoint + ( 0, 0, 128 ), 768, 200, 25 );*/
  849. }
  850. }
  851.  
  852. flat_origin(org)
  853. {
  854. rorg = (org[0],org[1],0);
  855. return rorg;
  856.  
  857. }
  858.  
  859. flat_angle(angle)
  860. {
  861. rangle = (0,angle[1],0);
  862. return rangle;
  863. }
  864.  
  865. targetisclose(other, target)
  866. {
  867. infront = targetisinfront(other, target);
  868. if(infront)
  869. dir = 1;
  870. else
  871. dir = -1;
  872. a = flat_origin(other.origin);
  873. b = a+vector_scale(anglestoforward(flat_angle(other.angles)), (dir*100000));
  874. point = pointOnSegmentNearestToPoint(a,b, target);
  875. dist = distance(a,point);
  876. if (dist < 3000)
  877. return true;
  878. else
  879. return false;
  880. }
  881.  
  882. targetisinfront(other, target)
  883. {
  884. forwardvec = anglestoforward(flat_angle(other.angles));
  885. normalvec = vectorNormalize(flat_origin(target)-other.origin);
  886. dot = vectordot(forwardvec,normalvec);
  887. if(dot > 0)
  888. return true;
  889. else
  890. return false;
  891. }
  892.  
  893. delete_on_death (ent)
  894. {
  895. ent endon ("death");
  896. self waittill ("death");
  897. if (isdefined (ent))
  898. ent delete();
  899. }
  900.  
  901. play_loop_sound_on_entity(alias, offset)
  902. {
  903. org = spawn ("script_origin",(0,0,0));
  904. org endon ("death");
  905. thread delete_on_death (org);
  906. if (isdefined (offset))
  907. {
  908. org.origin = self.origin + offset;
  909. org.angles = self.angles;
  910. org linkto (self);
  911. }
  912. else
  913. {
  914. org.origin = self.origin;
  915. org.angles = self.angles;
  916. org linkto (self);
  917. }
  918. // org endon ("death");
  919. org playloopsound (alias);
  920. // println ("playing loop sound ", alias," on entity at origin ", self.origin, " at ORIGIN ", org.origin);
  921. self waittill ("stop sound" + alias);
  922. org stoploopsound (alias);
  923. org delete();
  924. }
  925.  
  926.  
  927.  
  928. callStrike_planeSound( plane, bombsite )
  929. {
  930. plane thread play_loop_sound_on_entity( "veh_mig29_dist_loop" );
  931. while( !targetisclose( plane, bombsite ) )
  932. wait .05;
  933. plane notify ( "stop sound" + "veh_mig29_dist_loop" );
  934. plane thread play_loop_sound_on_entity( "veh_mig29_close_loop" );
  935. while( targetisinfront( plane, bombsite ) )
  936. wait .05;
  937. wait .5;
  938. plane thread play_sound_in_space( "veh_mig29_sonic_boom" );
  939. while( targetisclose( plane, bombsite ) )
  940. wait .05;
  941. plane notify ( "stop sound" + "veh_mig29_close_loop" );
  942. plane thread play_loop_sound_on_entity( "veh_mig29_dist_loop" );
  943. plane waittill( "delete" );
  944. plane notify ( "stop sound" + "veh_mig29_dist_loop" );
  945. }
  946.  
  947.  
  948. timedHardpointHUD( hudtext, usageInterval )
  949. {
  950. // self should be the hardpoint's trigger.
  951. // it must have lastusage defined as the time of the last usage.
  952. while(1)
  953. {
  954. self waittill("trigger", player);
  955. player thread timedHardpointHUDOnPlayer(self, hudtext, usageInterval);
  956. }
  957. }
  958. timedHardpointHUDOnPlayer(hardpointobj, hudtext, usageInterval)
  959. {
  960. if (hardpointobj timedHardpointCanBeUsed( usageInterval ))
  961. return;
  962.  
  963. self endon("disconnect");
  964.  
  965. if (isdefined(self.timedHardpointHUDThread))
  966. return;
  967. self.timedHardpointHUDThread = true;
  968.  
  969. self timedHardpointHUDShow(hardpointobj, hudtext, usageInterval);
  970.  
  971. // we loop until we die, leave the trigger, or the hardpoint can be used, then we hide the timer hud
  972. while(1)
  973. {
  974. if (self.sessionstate != "playing" || !isalive(self) || !self istouching(hardpointobj))
  975. break;
  976.  
  977. if (hardpointobj timedHardpointCanBeUsed( usageInterval ))
  978. break;
  979.  
  980. wait .1;
  981. }
  982. self timedHardpointHUDHide(hardpointobj);
  983.  
  984. self.timedHardpointHUDThread = undefined;
  985. }
  986. timedHardpointCanBeUsed( usageInterval )
  987. {
  988. assert( isdefined( self.lastusage ) );
  989. return ((gettime() - self.lastusage) / 1000 >= usageInterval);
  990. }
  991. timedHardpointHUDShow( hardpointobj, hudtext, usageInterval )
  992. {
  993. if (isdefined(self.showingObjHUD))
  994. return;
  995. self.showingObjHUD = hardpointobj;
  996.  
  997. assert( isdefined( hardpointobj.lastusage ) );
  998.  
  999. if ( !isdefined( self.timedHardpointHUDText ) )
  1000. self.timedHardpointHUDText = newClientHudElem(self);
  1001.  
  1002. self.timedHardpointHUDText.alpha = 1;
  1003. self.timedHardpointHUDText.alignX = "center";
  1004. self.timedHardpointHUDText.alignY = "top";
  1005. self.timedHardpointHUDText.fontScale = 1.5;
  1006. self.timedHardpointHUDText.x = 0;
  1007. self.timedHardpointHUDText.y = 50;
  1008. self.timedHardpointHUDText.horzAlign = "center";
  1009. self.timedHardpointHUDText.vertAlign = "fullscreen";
  1010. self.timedHardpointHUDText setText( hudtext );
  1011.  
  1012. if ( !isdefined( self.timedHardpointHUDTimer ) )
  1013. self.timedHardpointHUDTimer = newClientHudElem(self);
  1014.  
  1015. self.timedHardpointHUDTimer.alpha = 1;
  1016. self.timedHardpointHUDTimer.alignX = "center";
  1017. self.timedHardpointHUDTimer.alignY = "top";
  1018. self.timedHardpointHUDTimer.fontScale = 1.5;
  1019. self.timedHardpointHUDTimer.x = 0;
  1020. self.timedHardpointHUDTimer.y = 75;
  1021. self.timedHardpointHUDTimer.horzAlign = "center";
  1022. self.timedHardpointHUDTimer.vertAlign = "fullscreen";
  1023. self.timedHardpointHUDTimer setTimer(usageInterval - ((gettime() - hardpointobj.lastusage) / 1000));
  1024. }
  1025.  
  1026. timedHardpointHUDHide( hardpointobj )
  1027. {
  1028. if (!isdefined(self.showingObjHUD) || self.showingObjHUD != hardpointobj)
  1029. return;
  1030. self.showingObjHUD = undefined;
  1031.  
  1032. self.timedHardpointHUDText.alpha = 0;
  1033. self.timedHardpointHUDTimer.alpha = 0;
  1034. }
  1035.  
  1036. playSoundinSpace (alias, origin, master)
  1037. {
  1038. org = spawn ("script_origin",(0,0,1));
  1039. if (!isdefined (origin))
  1040. origin = self.origin;
  1041. org.origin = origin;
  1042. if (isdefined(master) && master)
  1043. org playsoundasmaster (alias, "sounddone");
  1044. else
  1045. org playsound (alias, "sounddone");
  1046. org waittill ("sounddone");
  1047. org delete();
  1048. }
  1049.  
  1050. obj_radar_think()
  1051. {
  1052. self.trig = getent(self.flag.target, "targetname");
  1053. self.trig setHintString(&"PLATFORM_PRESS_TO_USE_RADAR");
  1054.  
  1055. self.trig.originalorigin = self.trig.origin;
  1056.  
  1057. self.lastusage = gettime() - 1000*60*60;
  1058. self thread timedHardpointHUD( &"MP_WAR_WAITING_FOR_RADAR", level.radarInterval );
  1059.  
  1060. self waittill("objective_created");
  1061. self updateObjStatus("axis", "available");
  1062. self updateObjStatus("allies", "available");
  1063.  
  1064. while(1)
  1065. {
  1066. self.trig waittill("trigger", guy);
  1067.  
  1068. if (!isalive(guy) || !isdefined(guy.pers["team"]) )
  1069. continue;
  1070.  
  1071. guyTriggeredRadar( guy );
  1072.  
  1073.  
  1074. self.trig.origin += (0,0,-50000);
  1075.  
  1076. self.lastusage = gettime();
  1077.  
  1078. wait(level.radarInterval);
  1079.  
  1080. self.trig.origin = self.trig.originalOrigin;
  1081.  
  1082. /*
  1083. players = getentarray("players", "classname");
  1084. for (i = 0; i < players.size; i++)
  1085. players[i] timedHardpointHUDHide(self);
  1086. */
  1087.  
  1088. self updateObjStatus("axis", "available");
  1089. self updateObjStatus("allies", "available");
  1090. }
  1091. }
  1092.  
  1093. guyTriggeredRadar( guy )
  1094. {
  1095. // this function was written to handle someone triggering radar even when they or the other team already had it.
  1096. // that functionality is still in place, because it's harmless.
  1097.  
  1098. team = guy.pers["team"];
  1099. otherteam = "axis";
  1100. if (team == "axis")
  1101. otherteam = "allies";
  1102. if (!teamHasRadar(team) || gettime() - level.radarLastUsageTime[team] > 1000*5)
  1103. {
  1104. printOnTeamArg(&"MP_WAR_RADAR_ACQUIRED", team, level.radarViewTime);
  1105. printOnTeamArg(&"MP_WAR_RADAR_ACQUIRED_ENEMY", otherteam, level.radarViewTime);
  1106.  
  1107. if (!teamHasRadar(team)) { // don't play the sound if they already have radar
  1108. playSoundOnPlayers( "US_Tmp_stm_uavonline", team );
  1109. playSoundOnPlayers( "US_Tmp_stm_enemyuavonline", otherTeam );
  1110. }
  1111.  
  1112. level.radarLastUsageTime[team] = gettime();
  1113.  
  1114. level notify("radar_timer_kill_" + team);
  1115. self thread giveTeamRadar(team, otherteam);
  1116. }
  1117. }
  1118.  
  1119. giveTeamRadar(team, otherteam)
  1120. {
  1121. level endon("intermission");
  1122. level endon("radar_timer_kill_" + team);
  1123.  
  1124.  
  1125. setTeamRadar(team, true);
  1126.  
  1127. level notify("radar_timer_kill_" + otherteam);
  1128. setTeamRadar(otherteam, false);
  1129.  
  1130. self updateObjStatus(team, "used_friendly");
  1131. self updateObjStatus(otherteam, "used_enemy");
  1132.  
  1133. wait level.radarViewTime;
  1134.  
  1135. setTeamRadar(team, false);
  1136.  
  1137. printOnTeam(&"MP_WAR_RADAR_EXPIRED", team);
  1138. printOnTeam(&"MP_WAR_RADAR_EXPIRED_ENEMY", otherteam);
  1139.  
  1140. playSoundOnPlayers( "US_Tmp_stm_uavoffline", team );
  1141. playSoundOnPlayers( "US_Tmp_stm_enemyuavoffline", otherTeam );
  1142.  
  1143. //thread playSoundOnPlayers("mp_war_objective_taken");
  1144. }
  1145.  
  1146. ammo()
  1147. {
  1148. ammoHandler = maps\mp\gametypes\_perplayer::init("ammo_handler", ::ammoPlayerPlaying, ::ammoPlayerNotPlaying);
  1149. maps\mp\gametypes\_perplayer::enable(ammoHandler);
  1150.  
  1151. level.ammoInterval = 60;
  1152. }
  1153.  
  1154. ammoPlayerPlaying()
  1155. {
  1156. self.ammoLastUsageTime = gettime() - 1000*60*60;
  1157. }
  1158. ammoPlayerNotPlaying(disconnected)
  1159. {
  1160.  
  1161. }
  1162.  
  1163. obj_ammo_think()
  1164. {
  1165. self setHintString(&"MP_WAR_PRESS_TO_REPLENISH_AMMO");
  1166.  
  1167. self thread ammoHUD();
  1168.  
  1169. self waittill("objective_created");
  1170. self updateObjStatus("all", "available");
  1171.  
  1172. while(1)
  1173. {
  1174. self waittill("trigger", guy);
  1175. if (isalive(guy) && guy canUseAmmo())
  1176. {
  1177. guy playsound("weap_pickup");
  1178. guy thread maps\mp\gametypes\_class::replenishLoadout();
  1179. guy.ammoLastUsageTime = gettime();
  1180. }
  1181. }
  1182. }
  1183.  
  1184. canUseAmmo()
  1185. {
  1186. if (!isdefined(self.ammoLastUsageTime))
  1187. self.ammoLastUsageTime = gettime() - 1000*60*60;
  1188. return (gettime() - self.ammoLastUsageTime) / 1000 >= level.ammoInterval;
  1189. }
  1190.  
  1191. ammoHUD()
  1192. {
  1193. if (!isdefined(self.target))
  1194. return;
  1195. touchtrig = getent(self.target, "targetname");
  1196. wait 1;
  1197. while(1)
  1198. {
  1199. touchtrig waittill("trigger", player);
  1200. player thread ammoHUDOnPlayer(touchtrig, self);
  1201. }
  1202. }
  1203. ammoHUDOnPlayer(trig, ammoobj)
  1204. {
  1205. self endon("disconnect");
  1206.  
  1207. if (isdefined(self.ammoHUDThread))
  1208. return;
  1209. self.ammoHUDThread = true;
  1210.  
  1211. // we loop until we die or leave the trigger, showing and hiding the ammo hud as necessary, then we hide the ammo hud
  1212. while(1)
  1213. {
  1214. if (self.sessionstate != "playing" || !isalive(self) || !self istouching(trig))
  1215. break;
  1216.  
  1217. if (!self canUseAmmo())
  1218. self ammoHUDShow(ammoobj);
  1219. else
  1220. self ammoHUDHide(ammoobj);
  1221.  
  1222. wait .1;
  1223. }
  1224. self ammoHUDHide(ammoobj);
  1225.  
  1226. self.ammoHUDThread = undefined;
  1227. }
  1228. ammoHUDShow(ammoobj)
  1229. {
  1230. if (isdefined(self.showingObjHUD))
  1231. return;
  1232. self.showingObjHUD = ammoobj;
  1233.  
  1234. self.ammoHUDText = newClientHudElem(self);
  1235. self.ammoHUDText.alignX = "center";
  1236. self.ammoHUDText.alignY = "top";
  1237. self.ammoHUDText.fontScale = 1.5;
  1238. self.ammoHUDText.x = 0;
  1239. self.ammoHUDText.y = 50;
  1240. self.ammoHUDText.horzAlign = "center";
  1241. self.ammoHUDText.vertAlign = "fullscreen";
  1242. self.ammoHUDText setText(&"MP_WAR_WAITING_FOR_AMMO");
  1243. self.ammoHUDTimer = newClientHudElem(self);
  1244. self.ammoHUDTimer.alignX = "center";
  1245. self.ammoHUDTimer.alignY = "top";
  1246. self.ammoHUDTimer.fontScale = 1.5;
  1247. self.ammoHUDTimer.x = 0;
  1248. self.ammoHUDTimer.y = 75;
  1249. self.ammoHUDTimer.horzAlign = "center";
  1250. self.ammoHUDTimer.vertAlign = "fullscreen";
  1251. self.ammoHUDTimer setTimer(level.ammoInterval - ((gettime() - self.ammoLastUsageTime) / 1000));
  1252. }
  1253. ammoHUDHide(ammoobj)
  1254. {
  1255. if (!isdefined(self.showingObjHUD) || self.showingObjHUD != ammoobj)
  1256. return;
  1257. self.showingObjHUD = undefined;
  1258.  
  1259. self.ammoHUDText destroy();
  1260. self.ammoHUDTimer destroy();
  1261. }
  1262.  
  1263. obj_copter_think()
  1264. {
  1265. if (!isdefined(level.copterErrorChecked))
  1266. copterErrorCheck();
  1267.  
  1268. damagetrigs = getentarray("copter_damage_trig", "targetname");
  1269. for (i = 0; i < damagetrigs.size; i++)
  1270. {
  1271. if ( !isdefined(damagetrigs[i].beingUsed) )
  1272. break;
  1273. }
  1274. assert( i < damagetrigs.size );
  1275. self.damagetrig = damagetrigs[i];
  1276. self.damagetrig.beingUsed = true;
  1277.  
  1278. self.trig = getent(self.flag.target, "targetname");
  1279. self.trig.originalOrigin = self.trig.origin;
  1280. self.trig.origin += (0,0,-50000);
  1281. self.trig setHintString(&"PLATFORM_PRESS_TO_USE_COPTER");
  1282.  
  1283. self.lastusage = gettime() - 1000*60*60;
  1284.  
  1285. //thread trigdebug(self.trig);
  1286.  
  1287. self.lastarrivaltime = gettime() - 1000*60*60;
  1288. self.lastdeathtime = gettime() - 1000*60*60;
  1289. self.waitingForArrival = false;
  1290.  
  1291. self.oldcopter = [];
  1292.  
  1293. self thread obj_locationSelect(
  1294. ::copterUsed,
  1295. ::copterInstructionsHUDShow,
  1296. ::copterInstructionsHUDHide,
  1297. ::canUseCopter
  1298. );
  1299.  
  1300. // no longer owned by a specific team, so let anyone use it
  1301. self.trig.origin = self.trig.originalOrigin;
  1302.  
  1303. self thread copterHUD();
  1304. }
  1305. trigdebug(trig)
  1306. {
  1307. while(1)
  1308. {
  1309. players = getentarray("player", "classname");
  1310. if (players.size > 0)
  1311. line(trig.origin, players[0].origin, (1,1,1));
  1312. wait .05;
  1313. }
  1314. }
  1315. copterErrorCheck()
  1316. {
  1317. level.copterErrorChecked = true;
  1318.  
  1319. copter_targets = getentarray("copter_target", "targetname");
  1320. for (i = 0; i < copter_targets.size; i++)
  1321. {
  1322. assert(isdefined(copter_targets[i].radius));
  1323.  
  1324. descentEnts = [];
  1325. if (isdefined(copter_targets[i].target))
  1326. descentEnts = getentarray(copter_targets[i].target, "targetname");
  1327. for (j = 0; j < descentEnts.size; j++)
  1328. {
  1329. assert(isdefined(descentEnts[j].radius));
  1330. assert(isdefined(descentEnts[j].target));
  1331. assert(getentarray(descentEnts[j].target, "targetname").size == 1);
  1332. }
  1333. }
  1334. }
  1335. deleteCopterOnArrival(destent)
  1336. {
  1337. self endon("death");
  1338. self endon("dont_delete_on_arrival");
  1339. while(1) {
  1340. selfpos = (self.origin[0], self.origin[1], destent.origin[2]);
  1341. if (distance(selfpos, destent.origin) < 256) {
  1342. self maps\mp\gametypes\_copter::deleteCopter();
  1343. return;
  1344. }
  1345. wait 1;
  1346. }
  1347. }
  1348.  
  1349. canUseCopter(player)
  1350. {
  1351. return (gettime() - self.lastusage) / 1000 >= level.copterInterval;
  1352. }
  1353.  
  1354. copterUsed(pos, player)
  1355. {
  1356. self.team = player.pers["team"];
  1357.  
  1358. userpos = (pos[0], pos[1], 0);
  1359. copter_targets = getentarray("copter_target", "targetname");
  1360. closest = undefined;
  1361. closestdist = 0;
  1362. for (i = 0; i < copter_targets.size; i++) {
  1363. targetpos = (copter_targets[i].origin[0], copter_targets[i].origin[1], 0);
  1364. thisdist = distance(userpos, targetpos);
  1365. if (!isdefined(closest) || thisdist < closestdist) {
  1366. closest = copter_targets[i];
  1367. closestdist = thisdist;
  1368. }
  1369. }
  1370. self useCopter(closest);
  1371.  
  1372. self notify("used_copter");
  1373.  
  1374. self.trig.origin = self.trig.originalOrigin + (0,0,-50000);
  1375.  
  1376.  
  1377. wait(level.copterInterval);
  1378.  
  1379. self.trig.origin = self.trig.originalOrigin;
  1380. }
  1381.  
  1382. useCopter(targetent)
  1383. {
  1384. copterteam = self.team;
  1385. //copterteam = "noteam";
  1386. if (isdefined(self.copter))
  1387. {
  1388. if ( self.copter.team != copterteam )
  1389. {
  1390. self sendCopterAway();
  1391. }
  1392. }
  1393. if ( !isdefined(self.copter) )
  1394. {
  1395. // check if an old one for this team is flying away; if so, bring it back
  1396. if (isdefined(self.oldcopter[copterteam]) && !isdefined(self.oldcopter[copterteam].dead)) {
  1397. self.copter = self.oldcopter[copterteam];
  1398. self.oldcopter[copterteam] = undefined;
  1399. self.copter maps\mp\gametypes\_copter::makeCopterActive(self.damagetrig);
  1400. self thread handleCopterDeath();
  1401. self.copter notify("dont_delete_on_arrival");
  1402. }
  1403. else {
  1404. location = getent("copter_spawn_" + self.team, "targetname").origin; // should be a script_origin in the level
  1405. self.copter = maps\mp\gametypes\_copter::createCopter(location, copterteam, self.damagetrig);
  1406. self thread handleCopterDeath();
  1407. }
  1408. }
  1409. else
  1410. assert( self.copter.team == copterteam );
  1411. self.copter maps\mp\gametypes\_copter::setCopterDefenseArea(targetent);
  1412. self.copterdest = targetent;
  1413.  
  1414. self.lastusage = gettime();
  1415.  
  1416. self.waitingForArrival = true;
  1417. self thread waitForCopterArrival();
  1418. }
  1419. handleCopterDeath()
  1420. {
  1421. self.copter endon("passive");
  1422. self.copter waittill("death");
  1423.  
  1424. self notify("copter_death");
  1425.  
  1426. self.copter = undefined;
  1427. self.lastdeathtime = gettime();
  1428. self.lastarrivaltime = gettime() - 1000*60*60;
  1429. self.waitingForArrival = false;
  1430.  
  1431. self.trig.origin = self.trig.originalOrigin + (0,0,-50000);
  1432. }
  1433. waitForCopterArrival()
  1434. {
  1435. self.copter endon("death");
  1436. self.copter endon("passive");
  1437. while(1)
  1438. {
  1439. copterpos = (self.copter.origin[0], self.copter.origin[1], self.copterdest.origin[2]);
  1440. if (distance(copterpos, self.copterdest.origin) < self.copterdest.radius) {
  1441. self.waitingForArrival = false;
  1442. self.lastarrivaltime = gettime();
  1443. self thread fightAndLeave();
  1444. return;
  1445. }
  1446. wait 1;
  1447. }
  1448. }
  1449.  
  1450. fightAndLeave()
  1451. {
  1452. self.copter endon("death");
  1453. self.copter endon("passive");
  1454.  
  1455. wait level.copterFightTime;
  1456.  
  1457. self thread sendCopterAway();
  1458. }
  1459.  
  1460. sendCopterAway()
  1461. {
  1462. self.copter maps\mp\gametypes\_copter::makeCopterPassive(); // TODO: copter can't be killed while flying away =\
  1463. destent = getent("copter_spawn_" + self.copter.team, "targetname"); // should be a script_origin in the level
  1464. self.copter maps\mp\gametypes\_copter::setCopterDest(destent.origin);
  1465. self.copter thread deleteCopterOnArrival(destent);
  1466. self.oldcopter[self.copter.team] = self.copter;
  1467. self.copter = undefined;
  1468. }
  1469.  
  1470. copterInstructionsHUDShow()
  1471. {
  1472. if (isdefined(self.showingCopterInstructions))
  1473. return;
  1474. self.showingCopterInstructions = true;
  1475.  
  1476. if ( !isdefined( self.copterInstructions1 ) )
  1477. self.copterInstructions1 = newClientHudElem(self);
  1478.  
  1479. self.copterInstructions1.alignX = "center";
  1480. self.copterInstructions1.alignY = "top";
  1481. self.copterInstructions1.fontScale = 1.5;
  1482. self.copterInstructions1.x = 0;
  1483. self.copterInstructions1.y = 50;
  1484. self.copterInstructions1.horzAlign = "center";
  1485. self.copterInstructions1.vertAlign = "fullscreen";
  1486. self.copterInstructions1 setText(&"MP_WAR_COPTER_INSTRUCTIONS1");
  1487. self.copterInstructions1.alpha = 0;
  1488.  
  1489. if ( !isdefined( self.copterInstructions2 ) )
  1490. self.copterInstructions2 = newClientHudElem(self);
  1491.  
  1492. self.copterInstructions2.alpha = 1;
  1493. self.copterInstructions2.alignX = "center";
  1494. self.copterInstructions2.alignY = "top";
  1495. self.copterInstructions2.fontScale = 1.5;
  1496. self.copterInstructions2.x = 0;
  1497. self.copterInstructions2.y = 75;
  1498. self.copterInstructions2.horzAlign = "center";
  1499. self.copterInstructions2.vertAlign = "fullscreen";
  1500. self.copterInstructions2 setText(&"MP_WAR_COPTER_INSTRUCTIONS2");
  1501.  
  1502. self thread monitorCopterInstructions();
  1503. }
  1504. monitorCopterInstructions()
  1505. {
  1506. self endon("hiding_copter_instructions");
  1507. copter_targets = getentarray("copter_target", "targetname");
  1508. while(1)
  1509. {
  1510. showit = false;
  1511. mypos = (self.origin[0], self.origin[1], 0);
  1512. for (i = 0; i < copter_targets.size; i++) {
  1513. targetpos = (copter_targets[i].origin[0], copter_targets[i].origin[1], 0);
  1514. if (distance(mypos, targetpos) <= copter_targets[i].radius) {
  1515. showit = true;
  1516. break;
  1517. }
  1518. }
  1519.  
  1520. if (showit)
  1521. self.copterInstructions1.alpha = 1;
  1522. else
  1523. self.copterInstructions1.alpha = 0;
  1524.  
  1525. wait .3;
  1526. }
  1527. }
  1528. copterInstructionsHUDHide(disconnected)
  1529. {
  1530. if ( disconnected )
  1531. return;
  1532.  
  1533. if (!isdefined(self.showingCopterInstructions))
  1534. return;
  1535. self.showingCopterInstructions = undefined;
  1536.  
  1537. self notify("hiding_copter_instructions");
  1538.  
  1539. self.copterInstructions1.alpha = 0;
  1540. self.copterInstructions2.alpha = 0;
  1541. }
  1542.  
  1543. shouldShowCopterHUD(player)
  1544. {
  1545. if (player.pers["team"] != self.team)
  1546. return false;
  1547. if (distance(player.origin, self.origin) < 256)
  1548. return true;
  1549. return isdefined(player.usingObj) && player.usingObj == self;
  1550. }
  1551.  
  1552. waittillAny(str1, str2, str3, str4, str5)
  1553. {
  1554. waitingobj = spawnstruct();
  1555.  
  1556. if (isdefined(str1))
  1557. waitingobj thread waittillAndNotify(self, str1);
  1558. if (isdefined(str2))
  1559. waitingobj thread waittillAndNotify(self, str2);
  1560. if (isdefined(str3))
  1561. waitingobj thread waittillAndNotify(self, str3);
  1562. if (isdefined(str4))
  1563. waitingobj thread waittillAndNotify(self, str4);
  1564. if (isdefined(str5))
  1565. waitingobj thread waittillAndNotify(self, str5);
  1566.  
  1567. waitingobj waittill("happened");
  1568. waitingobj notify("cancel");
  1569. return;
  1570. }
  1571. waittillAndNotify(obj, str)
  1572. {
  1573. self endon("cancel");
  1574. obj waittill(str);
  1575. self notify("happened");
  1576. }
  1577.  
  1578. copterHUD()
  1579. {
  1580. while(1)
  1581. {
  1582. self waittill("trigger", player);
  1583. player thread copterHUDOnPlayer(self);
  1584. }
  1585. }
  1586. copterHUDOnPlayer(copterobj)
  1587. {
  1588. if (copterobj copterCanBeUsed())
  1589. return;
  1590.  
  1591. self endon("disconnect");
  1592.  
  1593. if (isdefined(self.copterHUDThread))
  1594. return;
  1595. self.copterHUDThread = true;
  1596.  
  1597. self copterHUDShow(copterobj);
  1598.  
  1599. // we loop until we die, leave the trigger, or artillery can be used, then we hide the artillery hud
  1600. while(1)
  1601. {
  1602. if (self.sessionstate != "playing" || !isalive(self) || !self istouching(copterobj))
  1603. break;
  1604.  
  1605. if (copterobj copterCanBeUsed())
  1606. break;
  1607.  
  1608. wait .1;
  1609. }
  1610. self copterHUDHide(copterobj);
  1611.  
  1612. self.copterHUDThread = undefined;
  1613. }
  1614. copterCanBeUsed()
  1615. {
  1616. return ((gettime() - self.lastusage) / 1000 >= level.copterInterval);
  1617. }
  1618. copterHUDShow(copterobj)
  1619. {
  1620. if (isdefined(self.showingObjHUD))
  1621. return;
  1622. self.showingObjHUD = copterobj;
  1623.  
  1624. self.copterHUDText = newClientHudElem(self);
  1625. self.copterHUDText.alignX = "center";
  1626. self.copterHUDText.alignY = "top";
  1627. self.copterHUDText.fontScale = 1.5;
  1628. self.copterHUDText.x = 0;
  1629. self.copterHUDText.y = 50;
  1630. self.copterHUDText.horzAlign = "center";
  1631. self.copterHUDText.vertAlign = "fullscreen";
  1632. self.copterHUDText setText(&"MP_WAR_WAITING_FOR_COPTER_TO_BE_AVAILABLE");
  1633. self.copterHUDTimer = newClientHudElem(self);
  1634. self.copterHUDTimer.alignX = "center";
  1635. self.copterHUDTimer.alignY = "top";
  1636. self.copterHUDTimer.fontScale = 1.5;
  1637. self.copterHUDTimer.x = 0;
  1638. self.copterHUDTimer.y = 75;
  1639. self.copterHUDTimer.horzAlign = "center";
  1640. self.copterHUDTimer.vertAlign = "fullscreen";
  1641. self.copterHUDTimer setTimer(level.copterInterval - ((gettime() - copterobj.lastusage) / 1000));
  1642. }
  1643. copterHUDHide(copterobj)
  1644. {
  1645. if (!isdefined(self.showingObjHUD) || self.showingObjHUD != copterobj)
  1646. return;
  1647. self.showingObjHUD = undefined;
  1648.  
  1649. self.copterHUDText.alpha = 0;
  1650. self.copterHUDTimer.alpha = 0;
  1651. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement