Downloads containing STVcustomhudminus.mut

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Custom HUD Spaz Electro Mutator N/A Download file

File preview

  1. // TODO: make teamscore work with both teams, also add support for
  2. // 3/4 team CTF
  3.  
  4. #pragma name "Custom HUD"
  5. #pragma require "STVutilminus.asc"
  6.  
  7. #include "STVutilminus.asc"
  8.  
  9. // for intellisense
  10. #include "../../scripts/STVutilminus.asc"
  11.  
  12. bool toggled_on = true;
  13.  
  14. bool locatingItem = false;
  15. string itemBeingLocated = "";
  16.  
  17. string settingsVersion = "0.1P";
  18.  
  19. array<int> upgradedIds;
  20. array<int> unupgradedIds;
  21.  
  22. int gridSize = 10;
  23.  
  24. // the magic starts here
  25.  
  26. int ammoX = 700;
  27. int ammoY = 585;
  28. STRING::Size ammoSize = STRING::MEDIUM;
  29. bool ammoEnabled = true;
  30.  
  31. int healthX       = 785;
  32. int healthY       = 10;
  33. int healthSize    = 1;
  34. int healthPadding = 15;
  35. bool healthEnabled = true;
  36.  
  37. int teamScoreX    = 4;
  38. int teamScoreY    = 12;
  39. STRING::Size teamScoreSize = STRING::MEDIUM;
  40. bool teamScoreEnabled = false;
  41.  
  42. // the magic ends here
  43.  
  44. AnimatedSprite@ gun = AnimatedSprite(ANIM::PICKUPS, 0, 0, 0, 0.25, false);
  45.  
  46. int snap(int spot) {
  47.     return (spot + gridSize / 2) / gridSize * gridSize;
  48. }
  49.  
  50. bool upgraded(jjPLAYER @player, int id) { return player.powerup[id]; }
  51.  
  52. int idToSprite(jjPLAYER@ player, int id)
  53. {
  54.     if(id == 1) {
  55.         if(
  56.             gun.animSet == ANIM::PLUS_AMMO && player.charCurr != CHAR::LORI
  57.         ) gun.setAnimSet(ANIM::PICKUPS);
  58.  
  59.         if(player.charCurr == CHAR::JAZZ) {
  60.             if(upgraded(player, 1)) {
  61.                 gun.setAnimSet(ANIM::AMMO);
  62.                 return 18;
  63.             }
  64.  
  65.             gun.setAnimSet(ANIM::PICKUPS);
  66.  
  67.             return 29;
  68.         } else if(player.charCurr == CHAR::SPAZ) {
  69.             if(upgraded(player, 1)) {
  70.                 gun.setAnimSet(ANIM::AMMO);
  71.                 return 19;
  72.             }
  73.  
  74.             gun.setAnimSet(ANIM::PICKUPS);
  75.             return 30;
  76.         } else if(player.charCurr == CHAR::LORI) {
  77.             gun.setAnimSet(ANIM::PLUS_AMMO);
  78.            
  79.             return 5;
  80.         } else if(player.charCurr == CHAR::BIRD2) {
  81.             if(player.charOrig == CHAR::LORI) {
  82.                 gun.setAnimSet(ANIM::PLUS_AMMO);
  83.  
  84.                 if(upgraded(player, 1)) {
  85.                     return 6;
  86.                 } else {
  87.                     return 5;
  88.                 }
  89.             }
  90.  
  91.             if(upgraded(player, 1)) {
  92.                 gun.setAnimSet(ANIM::AMMO);
  93.                 return player.charOrig == CHAR::JAZZ ? 18 : 19;
  94.             }
  95.  
  96.             gun.setAnimSet(ANIM::PICKUPS);
  97.  
  98.             return player.charOrig == CHAR::JAZZ ? 29 : 30;
  99.         }
  100.  
  101.         gun.setVisible(false);
  102.         return 0;
  103.     }
  104.  
  105.     gun.setAnimSet(ANIM::AMMO);
  106.  
  107.     return upgraded(player, id) ? upgradedIds[id - 2] : unupgradedIds[id - 2];
  108. }
  109.  
  110. jjSTREAM saveSettings() {
  111.     jjSTREAM settingsStream = jjSTREAM();
  112.     settingsStream.push(settingsVersion);
  113.     settingsStream.push(toggled_on);
  114.    
  115.     // the magic starts here
  116.     settingsStream.push(formatInt(ammoX));
  117.     settingsStream.push(formatInt(ammoY));
  118.     settingsStream.push(formatSize(ammoSize));
  119.     settingsStream.push(ammoEnabled);
  120.    
  121.     settingsStream.push(formatInt(healthX));
  122.     settingsStream.push(formatInt(healthY));
  123.     settingsStream.push(formatInt(healthSize));
  124.     settingsStream.push(formatInt(healthPadding));
  125.     settingsStream.push(healthEnabled);
  126.    
  127.     settingsStream.push(formatInt(teamScoreX));
  128.     settingsStream.push(formatInt(teamScoreY));
  129.     settingsStream.push(formatSize(teamScoreSize));
  130.     settingsStream.push(teamScoreEnabled);
  131.    
  132.     settingsStream.push(formatInt(gridSize));
  133.  
  134.     // the magic ends here
  135.  
  136.     settingsStream.save("STVcustomhud-" + p.nameUnformatted + ".asdat");
  137.    
  138.     return settingsStream;
  139. }
  140.  
  141. void backupData() {
  142.     jjSTREAM("STVcustomhud-" + p.nameUnformatted + ".asdat").save("STVcustomhud-restore-" + p.nameUnformatted + ".asdat");
  143. }
  144.  
  145. void loadSettings(jjSTREAM settingsStream) {
  146.     string version;
  147.     if(!settingsStream.pop(version)) {
  148.         jjConsole("[CH] Version not found!");
  149.         return;
  150.     }
  151.  
  152.     if(version != settingsVersion) {
  153.         backupData();
  154.         jjConsole("[CH] Version mismatch found! Your old settings have been saved");
  155.         jjConsole("... into STVcustomhud-restore-" + p.nameUnformatted + ".asdat");
  156.         saveSettings();
  157.         return;
  158.     }
  159.  
  160.     settingsStream.pop(toggled_on);
  161.  
  162.     string ammoXStr, ammoYStr, ammoSizeStr;
  163.     settingsStream.pop(ammoXStr);
  164.     settingsStream.pop(ammoYStr);
  165.     settingsStream.pop(ammoSizeStr);
  166.     settingsStream.pop(ammoEnabled);
  167.  
  168.     ammoX = parseInt(ammoXStr);
  169.     ammoY = parseInt(ammoYStr);
  170.     ammoSize = parseSize(ammoSizeStr);
  171.  
  172.     string healthXStr, healthYStr, healthSizeStr, healthPaddingStr;
  173.    
  174.     settingsStream.pop(healthXStr);
  175.     settingsStream.pop(healthYStr);
  176.     settingsStream.pop(healthSizeStr);
  177.     settingsStream.pop(healthPaddingStr);
  178.     settingsStream.pop(healthEnabled);
  179.    
  180.     healthX = parseInt(healthXStr);
  181.     healthY = parseInt(healthYStr);
  182.     healthSize = parseInt(healthSizeStr);
  183.     healthPadding = parseInt(healthPaddingStr);
  184.  
  185.     string teamScoreXStr, teamScoreYStr, teamScoreSizeStr;
  186.     settingsStream.pop(teamScoreXStr);
  187.     settingsStream.pop(teamScoreYStr);
  188.     settingsStream.pop(teamScoreSizeStr);
  189.     settingsStream.pop(teamScoreEnabled);
  190.  
  191.     teamScoreX = parseInt(teamScoreXStr);
  192.     teamScoreY = parseInt(teamScoreYStr);
  193.     teamScoreSize = parseSize(teamScoreSizeStr);
  194.  
  195.     string snappingStr;
  196.     settingsStream.pop(snappingStr);
  197.  
  198.     gridSize = parseInt(snappingStr);
  199. }
  200.  
  201. void onLevelBegin() {
  202.     // jjConsole("[CH] Started!");
  203.    
  204.     jjSTREAM settingsStream("STVcustomhud-" + p.nameUnformatted + ".asdat");
  205.    
  206.     if(settingsStream.isEmpty()) {
  207.         settingsStream = saveSettings();
  208.     }
  209.  
  210.     loadSettings(jjSTREAM("STVcustomhud-" + p.nameUnformatted + ".asdat"));
  211.  
  212.     // jjConsole("[CH] Loaded settings!");
  213.  
  214.     unupgradedIds.insertLast(25); // bouncer
  215.     unupgradedIds.insertLast(29); // ice
  216.     unupgradedIds.insertLast(34); // seeker
  217.     unupgradedIds.insertLast(49); // rf
  218.     unupgradedIds.insertLast(57); // toaster
  219.     unupgradedIds.insertLast(59); // tnt
  220.     unupgradedIds.insertLast(62); // fireball
  221.     unupgradedIds.insertLast(68); // electroblaster
  222.  
  223.     upgradedIds.insertLast(24); // bouncer
  224.     upgradedIds.insertLast(28); // ice
  225.     upgradedIds.insertLast(33); // seeker
  226.     upgradedIds.insertLast(48); // rf
  227.     upgradedIds.insertLast(56); // toaster
  228.     upgradedIds.insertLast(59); // tnt
  229.     upgradedIds.insertLast(61); // fireball
  230.     upgradedIds.insertLast(67); // electroblaster
  231.  
  232.     // jjConsole("[CH] Loaded ids!");
  233. }
  234.  
  235. void onPlayer(jjPLAYER@ player) {
  236.     if(locatingItem) {
  237.         int x = snap(jjMouseX);
  238.         int y = snap(jjMouseY);
  239.        
  240.         if(itemBeingLocated == "ammo") {
  241.             ammoX = x;
  242.             ammoY = y;
  243.         }
  244.        
  245.         if(itemBeingLocated == "health") {
  246.             healthX = x;
  247.             healthY = y;
  248.         }
  249.        
  250.         if(itemBeingLocated == "teamscore") {
  251.             teamScoreX = x;
  252.             teamScoreY = y;
  253.         }
  254.  
  255.         if(jjKey[0x1]) {
  256.             locatingItem = false;
  257.             itemBeingLocated = "";
  258.             saveSettings();
  259.         }
  260.     }
  261.  
  262.     gun.setId(idToSprite(player, player.currWeapon));
  263.    
  264.     gun.update();
  265.  
  266.     if(!(
  267.         player.charCurr == CHAR::JAZZ ||
  268.         player.charCurr == CHAR::SPAZ ||
  269.         player.charCurr == CHAR::LORI ||
  270.         player.charCurr == CHAR::BIRD2
  271.     )) {
  272.         gun.visible = false;
  273.     } else {
  274.         if(!ammoEnabled && itemBeingLocated == "ammo") { gun.visible = true; } else { gun.visible = ammoEnabled; }
  275.     }
  276. }
  277.  
  278. bool onLocalChat(string &in stringReceived, CHAT::Type chatType) {
  279.     if(stringReceived.findFirst("!locate") == 0) {
  280.         if(stringReceived.split(" ").length() == 1) {
  281.             jjConsole("[CH] Provide something to locate, options: ammo, health!");
  282.             return true;
  283.         }
  284.  
  285.         string element = stringReceived.split(" ")[1];
  286.  
  287.         if(element != "ammo" && element != "health" && element != "teamscore") {
  288.             jjConsole("[CH] " + element + " does not exist, options: ammo, health!");
  289.             return true;
  290.         }
  291.  
  292.         itemBeingLocated = element;
  293.         locatingItem = true;
  294.  
  295.         return true;
  296.     }
  297.  
  298.     if(stringReceived == "!hudenable") {
  299.         toggled_on = true;
  300.  
  301.         saveSettings();
  302.  
  303.         return true;
  304.     }
  305.  
  306.     if(stringReceived == "!huddisable") {
  307.         toggled_on = false;
  308.  
  309.         saveSettings();
  310.        
  311.         return true;
  312.     }
  313.  
  314.     if(stringReceived.findFirst("!gridsize") == 0) {
  315.         if(stringReceived.split(" ").length() == 1) {
  316.             jjConsole("[CH] Provide a number to set the grid size to!");
  317.             return true;
  318.         }
  319.  
  320.         int snapping = parseInt(stringReceived.split(" ")[1]);
  321.  
  322.         gridSize = snapping;
  323.  
  324.         jjConsole("[CH] Grid size has been set to " + snapping + "!");
  325.        
  326.         saveSettings();
  327.  
  328.         return true;
  329.     }
  330.  
  331.     if(stringReceived.findFirst("!hudtoggle") == 0) {
  332.         if(stringReceived.split(" ").length() == 1) {
  333.             jjConsole("[CH] Provide something to toggle, options: ammo, health!");
  334.             return true;
  335.         }
  336.  
  337.         string element = stringReceived.split(" ")[1];
  338.  
  339.         if(element == "ammo") {
  340.             ammoEnabled = !ammoEnabled;
  341.         } else if(element == "health") {
  342.             healthEnabled = !healthEnabled;
  343.         } else if(element == "teamscore") {
  344.             teamScoreEnabled = !teamScoreEnabled;
  345.         } else {
  346.             jjConsole("[CH] " + element + " does not exist, options: ammo, health!");
  347.         }
  348.  
  349.         return true;
  350.     }
  351.  
  352.     if(stringReceived == "!hudhelp") {
  353.         jjConsole("----------------");
  354.         jjConsole("!locate - Locate a custom HUD element from the parameter");
  355.         jjConsole("!gridsize - Sets the locating grid size to the parameter");
  356.         jjConsole("!hudenable - Enables the custom HUD");
  357.         jjConsole("!huddisable - Disables the custom HUD");
  358.         jjConsole("!hudtoggle - Toggle a custom HUD element");
  359.         jjConsole("----------------");
  360.  
  361.         return true;
  362.     }
  363.  
  364.     return false;
  365. }
  366.  
  367. string determineTeamColor(TEAM::Color color) {
  368.     if(color == TEAM::RED) return "||";
  369.     if(color == TEAM::BLUE) return "|||";
  370.     if(color == TEAM::YELLOW) return "||||";
  371.    
  372.     // green
  373.     return "|";
  374. }
  375.  
  376. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  377.     // utils
  378.     if(locatingItem) {
  379.         int x = ammoX;
  380.         int y = ammoY;
  381.  
  382.         if(itemBeingLocated == "health") {
  383.             x = healthX;
  384.             y = healthY;
  385.         } else if(itemBeingLocated == "teamscore") {
  386.             x = teamScoreX;
  387.             y = teamScoreY;
  388.         }
  389.  
  390.         x += 10;
  391.         int xRatio = (jjResolutionWidth / 2) - snap(jjMouseX);
  392.         int yRatio = jjResolutionHeight - snap(jjMouseY);
  393.  
  394.         if(x + jjGetStringWidth("Bottom center ratio: " + xRatio + "x" + yRatio, STRING::SMALL, normalTextAppearance) >= jjResolutionWidth) {
  395.             x -= 200;
  396.         }
  397.  
  398.         if(y <= 50) {
  399.             y += 80;
  400.         }
  401.  
  402.         canvas.drawString(x, y - 10, "" + snap(jjMouseX) + " - " + snap(jjMouseY), STRING::SMALL);
  403.         canvas.drawString(x, y - 20, "Ratio: " + (jjResolutionWidth - snap(jjMouseX)) + "x" + (jjResolutionHeight - snap(jjMouseY)), STRING::SMALL);
  404.         canvas.drawString(x, y - 30, "Center ratio: " + xRatio + "x" + ((jjResolutionHeight / 2) - snap(jjMouseY)), STRING::SMALL);
  405.         canvas.drawString(x, y - 40, "Bottom center ratio: " + xRatio + "x" + yRatio, STRING::SMALL);
  406.     }
  407.  
  408.     if(toggled_on) {
  409.         if(ammoEnabled || itemBeingLocated == "ammo") {
  410.             string ammo = player.currWeapon == 1 ? "^" : "" + player.ammo[player.currWeapon];
  411.  
  412.             if((
  413.                 player.charCurr == CHAR::JAZZ ||
  414.                 player.charCurr == CHAR::SPAZ ||
  415.                 player.charCurr == CHAR::LORI ||
  416.                 player.charCurr == CHAR::BIRD2
  417.             )) {
  418.                 canvas.drawString(ammoX, ammoY, "x" + ammo, ammoSize);
  419.             }
  420.            
  421.             gun.x = ammoX - 10;
  422.             gun.y = ammoY;
  423.            
  424.             gun.spriteMode = (player.currWeapon == 1) ? SPRITE::PLAYER : SPRITE::NORMAL;
  425.             gun.spriteModeParam = player.clientID;
  426.  
  427.             gun.draw(canvas);
  428.         }
  429.  
  430.         return true;
  431.     } else { return false; }
  432. }
  433.  
  434. bool onDrawHealth(jjPLAYER@ player, jjCANVAS@ canvas) {
  435.     if(toggled_on) {
  436.         if(healthEnabled || itemBeingLocated == "health") {
  437.             int maxHealth = jjShowMaxHealth ? jjMaxHealth : player.health;
  438.  
  439.             for(int i = 0; i < maxHealth; i++) {
  440.                 bool isDamaged = i >= player.health;
  441.                 int sprParam = isDamaged ? 127 : 0;
  442.  
  443.                 canvas.drawResizedSprite(
  444.                     healthX - (i * (healthPadding * healthSize)),
  445.                     healthY,
  446.                     ANIM::PICKUPS,
  447.                     41,
  448.                     0,
  449.                     healthSize,
  450.                     healthSize,
  451.                     isDamaged ? SPRITE::TINTED : SPRITE::NORMAL,
  452.                     sprParam
  453.                 );
  454.             }
  455.         }
  456.  
  457.         if((jjGameMode == GAME::CTF && teamScoreEnabled) || itemBeingLocated == "teamscore") canvas.drawString(teamScoreX, teamScoreY, "" + determineTeamColor(player.team) + jjTeamScore[player.team] + "/" + jjMaxScore, teamScoreSize);
  458.  
  459.         return true;
  460.     } else { return false; }
  461. }
  462.  
  463. // bool onDrawLives(jjPLAYER@ player, jjCANVAS@ canvas) {return true;}
  464. // bool onDrawPlayerTimer(jjPLAYER@ player, jjCANVAS@ canvas) {return true;}
  465. // bool onDrawScore(jjPLAYER@ player, jjCANVAS@ canvas) {return true;}
  466. // bool onDrawGameModeHUD(jjPLAYER@ player, jjCANVAS@ canvas) { return teamScoreEnabled; }
  467.