Advertisement
Sudz

2 team Capture the Bag

May 12th, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.52 KB | None | 0 0
  1. /*
  2.  
  3. Zombie Grinder
  4. Copyright (C) 2012 Binary Phoenix
  5.  
  6. This software is provided 'as-is' with no warrenty, either expressed
  7. Or implied. Any problems Or errors resulting from the use of this
  8. software is entirely at your risk. You assume all neccessary costs
  9. of repairs, servicing Or correction.
  10.  
  11. */
  12.  
  13. // To make a CTB map you need to make sure several things exist in the map;
  14. //
  15. // - Each player needs to be contained in a small area with a door, the door
  16. // must be set to locked and must be named PlayerXPenDoor (with X changed
  17. // for the name).
  18. //
  19. // - There must be one bag pickup in the map!
  20. //
  21. // - There must be a touch trigger by for a zone for each player to deposit
  22. // a bag. This zone must have event OnPlayerXDrop, and must
  23. // be set to only trigger when the correct player is on it.
  24.  
  25. // ------------------------------------------------------------
  26. // Game Mode Properties.
  27. // ------------------------------------------------------------
  28. var Name = "Capture The Bag";
  29. var Description = "First team to capture 5 bags!";
  30.  
  31. // ------------------------------------------------------------
  32. // Resources
  33. // ------------------------------------------------------------
  34. var bagHUDImage = LoadAnimImage("pak::Bin\\Graphics\\HUD\\Game Modes\\Capture The Bag\\bags.png", 11, 14, 1, 1);
  35.  
  36. var captureLoseSound = LoadSound("pak::Bin\\Audio\\SFX\\Game Modes\\Capture The Bag\\capture_lose.wav", 0);
  37. var captureWinSound = LoadSound("pak::Bin\\Audio\\SFX\\Game Modes\\Capture The Bag\\capture_win.wav", 0);
  38. var gameLoseSound = LoadSound("pak::Bin\\Audio\\SFX\\Game Modes\\Capture The Bag\\lose.wav", 0);
  39. var gameWinSound = LoadSound("pak::Bin\\Audio\\SFX\\Game Modes\\Capture The Bag\\win.wav", 0);
  40.  
  41. // ------------------------------------------------------------
  42. // Variables!
  43. // ------------------------------------------------------------
  44. const DIFFICULTY_CURVE = 1.5;
  45.  
  46. const BAG_BLINK_INTERVAL = 150;
  47.  
  48. const ROUND_START_DELAY = 10000.0;
  49. const OPEN_DOOR_DELAY = 3000.0;
  50. const RESTART_MAP_DELAY = 15000.0;
  51. const RESPAWN_BAG_DELAY = 15000.0;
  52.  
  53. const RESPAWN_DELAY = 3000.0;
  54.  
  55. const MIN_PLAYERS = 2;
  56. const MAX_PLAYERS = 16;
  57.  
  58. const ROUND_COUNT = 5;
  59.  
  60. var player1PenDoor;
  61. var player2PenDoor;
  62. // var player3PenDoor;
  63. // var player4PenDoor;
  64.  
  65. var roundStartTimer;
  66.  
  67. var InRound;
  68.  
  69. var OpenDoorTimer;
  70. var DoorsOpen;
  71. var WaitingForDoorOpen;
  72.  
  73. var GameOver;
  74. var RestartTimer;
  75. var WinningClient;
  76.  
  77. var RespawnBagTimer;
  78. var RespawnBag;
  79.  
  80. var BagRespawnDelayTimer;
  81. var BagAvailOld;
  82.  
  83. var oldScore;
  84. var oldTotalScore;
  85.  
  86. var oldGameOver;
  87.  
  88. var clientEverBeenAlive;
  89.  
  90. var LocalKilled;
  91. var LocalKillTimer;
  92.  
  93. var arrowObjective;
  94. var oldObjectiveTarget;
  95.  
  96. // ------------------------------------------------------------
  97. // General functionality :3
  98. // ------------------------------------------------------------
  99. function OpenDoors()
  100. {
  101. if (player1PenDoor != NULL)
  102. {
  103. SetDoorLocked(player1PenDoor, false);
  104. SetDoorAlwaysOpen(player1PenDoor, true);
  105. }
  106. if (player2PenDoor != NULL)
  107. {
  108. SetDoorLocked(player2PenDoor, false);
  109. SetDoorAlwaysOpen(player2PenDoor, true);
  110. }
  111. /*
  112. if (player3PenDoor != NULL)
  113. {
  114. SetDoorLocked(player3PenDoor, false);
  115. SetDoorAlwaysOpen(player3PenDoor, true);
  116. }
  117. if (player4PenDoor != NULL)
  118. {
  119. SetDoorLocked(player4PenDoor, false);
  120. SetDoorAlwaysOpen(player4PenDoor, true);
  121. }
  122. */
  123.  
  124. DoorsOpen = true;
  125. }
  126.  
  127. function AwardScore(client)
  128. {
  129. var bag = GetClientInventoryItem(client, "TBagPickup");
  130. RemoveClientInventoryItem(client, bag);
  131.  
  132. var score = GetClientScore(client) + 1;
  133. SetClientScore(client, score);
  134.  
  135. // Time delay for respawn.
  136. RespawnBagTimer = Millisecs();
  137. RespawnBag = bag;
  138.  
  139. var teamName = "";
  140. switch (GetClientTeamID(client))
  141. {
  142. case 0:
  143. teamName = "[c=248,0,0]Red[/c] team";
  144. break;
  145. case 1:
  146. teamName = "[c=24,128,248]Blue[/c] team";
  147. break;
  148. /*
  149. case 2:
  150. teamName = "[c=16,168,64]Green[/c] team";
  151. break;
  152. case 3:
  153. teamName = "[c=255,240,25]Yellow[/c] team";
  154. break;
  155. */
  156. }
  157. BroadcastChat(teamName+" captured the bag!", -1, -1, 2);
  158.  
  159. if (GetTeamScore(GetClientTeamID(client)) >= ROUND_COUNT)
  160. {
  161. BroadcastChat(teamName+" wins the game!", -1, -1, 2);
  162. GameFinished();
  163. }
  164. }
  165.  
  166. function GameFinished()
  167. {
  168. InRound = false;
  169. WaitingForDoorOpen = false;
  170. GameOver = true;
  171. RestartTimer = Millisecs();
  172.  
  173. // Despawn all the players!
  174. for (var i = 0; i < GetClientCount(); i++)
  175. {
  176. var client = GetClientByIndex(i);
  177. if (!IsClientDead(client))
  178. {
  179. KillClient(client);
  180. }
  181. }
  182. }
  183.  
  184. function StartRound()
  185. {
  186. // Respawn all the players!
  187. for (var i = 0; i < GetClientCount(); i++)
  188. {
  189. var client = GetClientByIndex(i);
  190. if (IsClientDead(client))
  191. {
  192. RespawnClient(client);
  193. }
  194. }
  195.  
  196. InRound = true;
  197. WaitingForDoorOpen = true;
  198.  
  199. OpenDoorTimer = Millisecs();
  200. }
  201.  
  202. function RestartMap()
  203. {
  204. RestartCurrentMap();
  205. }
  206.  
  207. // ------------------------------------------------------------
  208. // Events to track when shit happens :3.
  209. // ------------------------------------------------------------
  210. event OnPlayer1Drop(invoker, extra)
  211. {
  212. if (extra != NULL)
  213. {
  214. if (CountClientInventory(extra, "TBagPickup") > 0)
  215. {
  216. AwardScore(extra);
  217. }
  218. }
  219. }
  220. event OnPlayer2Drop(invoker, extra)
  221. {
  222. if (extra != NULL)
  223. {
  224. if (CountClientInventory(extra, "TBagPickup") > 0)
  225. {
  226. AwardScore(extra);
  227. }
  228. }
  229. }
  230. /*
  231. event OnPlayer3Drop(invoker, extra)
  232. {
  233. if (extra != NULL)
  234. {
  235. if (CountClientInventory(extra, "TBagPickup") > 0)
  236. {
  237. AwardScore(extra);
  238. }
  239. }
  240. }
  241. event OnPlayer4Drop(invoker, extra)
  242. {
  243. if (extra != NULL)
  244. {
  245. if (CountClientInventory(extra, "TBagPickup") > 0)
  246. {
  247. AwardScore(extra);
  248. }
  249. }
  250. }
  251. */
  252.  
  253. event OnPlayerKilled(client, weapon, zombie)
  254. {
  255. var bag = GetClientInventoryItem(client, "TBagPickup");
  256. if (IsServer())
  257. {
  258. if (bag != NULL)
  259. {
  260. RemoveClientInventoryItem(client, bag);
  261. }
  262. }
  263.  
  264. // Time delay for respawn.
  265. if (RespawnBag == NULL && bag != NULL)
  266. {
  267. RespawnBagTimer = Millisecs();
  268. RespawnBag = bag;
  269. }
  270.  
  271. if (client == GetLocalClient())
  272. {
  273. LocalKilled = true;
  274. LocalKillTimer = millisecs();
  275. }
  276. }
  277.  
  278. event OnClientDisconnect(client)
  279. {
  280. var bag = GetClientInventoryItem(client, "TBagPickup");
  281. if (IsServer())
  282. {
  283. if (bag != NULL)
  284. {
  285. RemoveClientInventoryItem(client, bag);
  286. }
  287. }
  288.  
  289. // Time delay for respawn.
  290. if (RespawnBag == NULL && bag != NULL)
  291. {
  292. RespawnBagTimer = Millisecs();
  293. RespawnBag = bag;
  294. }
  295. }
  296.  
  297. // ------------------------------------------------------------
  298. // Start of game mode. Disable all zombies until our waves start!
  299. // ------------------------------------------------------------
  300. event OnInit()
  301. {
  302. player1PenDoor = FindEntityByName("player1PenDoor");
  303. player2PenDoor = FindEntityByName("player2PenDoor");
  304. // player3PenDoor = FindEntityByName("player3PenDoor");
  305. // player4PenDoor = FindEntityByName("player4PenDoor");
  306.  
  307. SetDifficultyCurve (DIFFICULTY_CURVE);
  308. SetObjectiveHUDText ("Capture The Bag", 0.0);
  309. SetShowScoreHUD (false);
  310. SetShowRemotePlayerStatsHUD (false);
  311. SetFriendlyFire (true);
  312. SetManualSpawning (true);
  313. SetManualDeathScreen (false);
  314. SetDrawPlayerCompassPips (false);
  315. SetSpawnFodderZombies (false);
  316. SetSpawnGroundZombies (false);
  317. SetSpawnZombies (false);
  318. SetPVP (true);
  319. SetTeamBased (true);
  320. SetAllowRevives (false);
  321. SetTeamCount (2);
  322. DisableRoomGrid();
  323.  
  324. roundStartTimer = Millisecs();
  325.  
  326. SetLocalCompassTarget(NULL);
  327. }
  328.  
  329. // ------------------------------------------------------------
  330. // Update wave each frame :3
  331. // ------------------------------------------------------------
  332. event OnTick()
  333. {
  334. var client;
  335. var i;
  336. var hasBag = false;
  337. var otherHasBag = false;
  338.  
  339. // Start round?
  340. if (IsServer())
  341. {
  342. if (InRound == false)
  343. {
  344. if (GameOver == false)
  345. {
  346. if ((millisecs() - roundStartTimer > ROUND_START_DELAY && GetClientCount() >= MIN_PLAYERS && GetActiveTeamCount() >= 2) || (GetClientCount() >= MAX_PLAYERS && GetActiveTeamCount() >= 2))
  347. {
  348. StartRound();
  349. }
  350. }
  351. else
  352. {
  353. SetGameOver(true);
  354. if (millisecs() - RestartTimer > RESTART_MAP_DELAY)
  355. {
  356. RestartMap();
  357. }
  358. }
  359. }
  360. else
  361. {
  362. if (WaitingForDoorOpen == true && DoorsOpen == false && (Millisecs() - OpenDoorTimer) > OPEN_DOOR_DELAY)
  363. {
  364. OpenDoors();
  365. }
  366.  
  367. if (RespawnBag != NULL && millisecs() - RespawnBagTimer > RESPAWN_BAG_DELAY)
  368. {
  369. RespawnPickup(RespawnBag);
  370. RespawnBag = NULL;
  371. }
  372.  
  373. // Respawn players.
  374. for (i = 0; i < GetClientCount(); i++)
  375. {
  376. client = GetClientByIndex(i);
  377. if (IsClientDead(client))
  378. {
  379. var respawnTimer = (millisecs() - GetClientDeathTime(client));
  380. if (respawnTimer > RESPAWN_DELAY)
  381. {
  382. RespawnClient(client);
  383. }
  384. }
  385. }
  386. }
  387. }
  388. else
  389. {
  390. // Work out how long till bag respawns.
  391. var localClient = GetLocalClient();
  392. var ourTeamID = GetClientTeamID(localClient);
  393. var pickupAvail = PickupAvailable("TBagPickup");
  394. var secsRemainTillSpawn = 0;
  395. var playerWithBag;
  396. var ourTeamHasBag;
  397.  
  398. if (BagAvailOld != pickupAvail)
  399. {
  400. BagRespawnDelayTimer = millisecs();
  401. }
  402. if (pickupAvail == false)
  403. {
  404. secsRemainTillSpawn = (RESPAWN_BAG_DELAY - (millisecs() - BagRespawnDelayTimer)) / 1000;
  405. }
  406.  
  407. // Do other players have the bag at the moment?
  408. for (i = 0; i < GetClientCount(); i++)
  409. {
  410. client = GetClientByIndex(i);
  411. var clientTeamID = GetClientTeamID(client);
  412. var count = (CountClientInventory(client, "TBagPickup") > 0);
  413. if (count > 0)
  414. {
  415. if (ourTeamID == clientTeamID)
  416. {
  417. ourTeamHasBag = true;
  418. }
  419.  
  420. if (client == localClient)
  421. {
  422. hasBag = true;
  423. }
  424. else
  425. {
  426. otherHasBag = true;
  427. playerWithBag = GetClientPlayer(client);
  428. }
  429. }
  430. if (GetTeamScore(clientTeamID) >= ROUND_COUNT)
  431. {
  432. GameOver = true;
  433. WinningClient = client;
  434. }
  435. }
  436.  
  437. // Did another play get a bag? :(
  438. var totalScore = GetTotalScore();
  439. var score = GetTeamScore(ourTeamID);
  440. if (score != oldScore)
  441. {
  442. PlaySound(captureWinSound);
  443. }
  444. else
  445. {
  446. if (totalScore > oldTotalScore)
  447. {
  448. PlaySound(captureLoseSound);
  449. }
  450. }
  451. oldScore = score;
  452. oldTotalScore = totalScore;
  453.  
  454. if (GameOver == true)
  455. {
  456. SetGameOver(true);
  457. }
  458.  
  459. if (GameOver == true && GameOver != OldGameOver)
  460. {
  461. if (GetClientTeamID(WinningClient) == ourTeamID)
  462. {
  463. PlaySound(gameWinSound);
  464. }
  465. else
  466. {
  467. PlaySound(gameLoseSound);
  468. }
  469. }
  470. OldGameOver = GameOver;
  471.  
  472. var objectiveTarget = NULL;
  473. if (GameOver == true || ClientEverBeenAlive == false)
  474. {
  475. SetObjectiveHUDText("", 0.0);
  476. }
  477. else if (hasBag == true)
  478. {
  479. SetObjectiveHUDText("[c=128,255,128]Return To Your Base[/c]", 0.0);
  480. objectiveTarget = FindEntityByName("player"+(GetClientTeamID(localClient) + 1)+"PenDoor");
  481. }
  482. else if (ourTeamHasBag == true)
  483. {
  484. SetObjectiveHUDText("[c=128,255,128]Protect The Bag Carrier[/c]", 0.0);
  485. objectiveTarget = playerWithBag;
  486. }
  487. else if (otherHasBag == true)
  488. {
  489. SetObjectiveHUDText("[c=255,128,128]Retrieve The Bag![/c]", 0.0);
  490. objectiveTarget = playerWithBag;
  491. }
  492. else if (pickupAvail == false)
  493. {
  494. SetObjectiveHUDText("Bag Respawning In "+ceil(abs(secsRemainTillSpawn))+" ...", 0.0);
  495. }
  496. else
  497. {
  498. SetObjectiveHUDText("[c=128,128,255]Capture The Bag[/c]", 0.0);
  499. objectiveTarget = FindEntityByType("TBagPickup");
  500. }
  501.  
  502. // Objective target changed?
  503. if (objectiveTarget != oldObjectiveTarget)
  504. {
  505. SetLocalCompassTarget(objectiveTarget);
  506. }
  507. oldObjectiveTarget = objectiveTarget;
  508. }
  509. }
  510.  
  511. // ------------------------------------------------------------
  512. // Render the CTF hud.
  513. // ------------------------------------------------------------
  514. event OnRenderClientHUD(client, absX, x, y, width, height)
  515. {
  516. var localClient = GetLocalClient();
  517. var clientID = GetClientID(client);
  518. var nonLocalClientID = GetClientTeamID(client);
  519. var clientTeamID = GetClientTeamID(localClient);
  520. var clientTeamScore = GetTeamScore(clientTeamID);
  521.  
  522. var carryingBag = false;//(CountClientInventory(client, "TBagPickup") > 0);
  523.  
  524. for (i = 0; i < GetClientCount(); i++)
  525. {
  526. var other = GetClientByIndex(i);
  527. var teamID = GetClientTeamID(other);
  528. if (teamID == clientTeamID)
  529. {
  530. var count = (CountClientInventory(other, "TBagPickup") > 0);
  531. if (count > 0)
  532. {
  533. carryingBag = true;
  534. }
  535. }
  536. }
  537.  
  538. // DRAW MONIES!
  539. for (var i = 0; i < ROUND_COUNT; i++)
  540. {
  541. var drawx, drawy;
  542.  
  543. // We have to draw our local clients moniez a bit higher and right aligned.
  544. if (client == localClient)
  545. {
  546. drawx = ((x + width) - 2) - ((ROUND_COUNT - i) * (ImageWidth(bagHUDImage) - 1));
  547. drawy = (y - 12) - ImageHeight(bagHUDImage);
  548. }
  549. else
  550. {
  551. drawx = x + (i * (ImageWidth(bagHUDImage) - 1));
  552. drawy = (y + height) - ImageHeight(bagHUDImage);
  553. }
  554.  
  555. if (i < clientTeamScore)
  556. {
  557. DrawImage(bagHUDImage, drawx, drawy, nonLocalClientID + 1);
  558. }
  559. else
  560. {
  561. if (i == clientTeamScore && carryingBag == true)
  562. {
  563. if ((Millisecs() / BAG_BLINK_INTERVAL) % 2 == 0)
  564. {
  565. DrawImage(bagHUDImage, drawx, drawy, nonLocalClientID + 1);
  566. }
  567. else
  568. {
  569. DrawImage(bagHUDImage, drawx, drawy, 0);
  570. }
  571. }
  572. else
  573. {
  574. DrawImage(bagHUDImage, drawx, drawy, 0);
  575. }
  576. }
  577. }
  578.  
  579. // Draw game over screen?
  580. if ((GameOver == true && WinningClient != NULL) == false && IsClientDead(localClient) == false)
  581. {
  582. LocalKilled = false;
  583. ClientEverBeenAlive = true;
  584. }
  585. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement