Advertisement
Yirktos

yk_fightArmor.lua

Jul 7th, 2015
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.03 KB | None | 0 0
  1. require "base/internal/ui/reflexcore";
  2.  
  3. yk_fightArmor = {};
  4. registerWidget("yk_fightArmor");
  5. ---------------
  6.  
  7. local armor = {
  8.     x = 0;
  9.     y = 0;
  10.     border = 5;
  11.     width = 340;
  12.     height = 34;
  13.    
  14.     reversed = false;
  15.    
  16.     text = {
  17.         x = -66;
  18.         y = 0;
  19.         size = 54;
  20.         border = 16;
  21.     };
  22.    
  23.     icon = {
  24.         size = 22;
  25.         gap = 12;
  26.         file = "internal/ui/icons/armor";
  27.     };
  28.    
  29.     old = 0;
  30.     damage = {
  31.         net = 0; -- current buffer of damage
  32.         lost = 0; -- buffered damage lost to pickups
  33.         fade = 0; -- A normalized value used to lerp the damage color to transparency
  34.         dur = 1; -- The amount of time that the fade-out takes
  35.         delay = 0.25; -- The deleay before the fade-out starts
  36.         timer = 0; -- A timer to keep track of the delay
  37.     };
  38.     pickup = {
  39.         net = 0;
  40.         lost = 0;
  41.         fade = 0;
  42.         dur = 1;
  43.         delay = 0.25;
  44.         timer = 0;
  45.     };
  46.    
  47.     color = {
  48.         frame = Color(0, 8, 16, 160);
  49.         trim = Color(255, 255, 242);
  50.        
  51.         highGA = Color(0, 172, 64);
  52.         lowGA = Color(96, 255, 0);
  53.        
  54.         highYA = Color(255, 176, 0);
  55.         lowYA = Color(255, 255, 160);
  56.        
  57.         highRA = Color(192, 0, 48);
  58.         lowRA = Color(255, 72, 0);
  59.        
  60.         damageGA = Color(0, 138, 64);
  61.         damageYA = Color(255, 112, 0);
  62.         damageRA = Color(150, 0, 32);
  63.        
  64.         damageFinal = Color(0, 0, 0, 0);
  65.         pickup = Color(255, 255, 255); -- 0, 191, 96
  66.         pickupFinal = Color(255, 255, 255);
  67.     }; 
  68. };
  69.  
  70. local colorArmorFinal = Color(255, 255, 255);
  71. local damageAlpha = 0;
  72. ---------------
  73. function yk_fightArmor:draw()
  74.     -- PLAYER, FIRST OUT
  75.     local player = getPlayer();
  76.    
  77.     if player == nil or
  78.         player.state == PLAYER_STATE_EDITOR or
  79.         player.state == PLAYER_STATE_SPECTATOR or
  80.         world.gameState == GAME_STATE_GAMEOVER or
  81.         isInMenu()
  82.     then return false end;
  83.    
  84.     if not player.connected then return end;
  85.    
  86.     -- IF YOU DIE, CLEAR EVERYTHING
  87.     if player.health <= 0 then
  88.         armor.old = 0;
  89.        
  90.         armor.damage.net = 0;
  91.         armor.damage.lost = 0;
  92.         armor.damage.fade = 0;
  93.         armor.damage.timer = 0;
  94.        
  95.         armor.pickup.net = 0;
  96.         armor.pickup.lost = 0;
  97.         armor.pickup.fade = 0;
  98.         armor.damage.timer = 0;
  99.     end
  100.    
  101.     -- SECOND OUT
  102.     if not shouldShowHUD() then return end;
  103.    
  104.     -- ARMOR CONSTANT
  105.     if (player.armor == armor.old) then
  106.         -- FADE DAMAGE BUFFERS
  107.         if armor.damage.timer < armor.damage.delay then
  108.             armor.damage.timer = math.min(armor.damage.delay, armor.damage.timer + deltaTime);
  109.         else
  110.             if armor.damage.fade < 1 then
  111.                 armor.damage.fade = math.min(1, armor.damage.fade + (deltaTime / armor.damage.dur));
  112.                
  113.                 damageAlpha = lerp(255, 0, armor.damage.fade);
  114.             else
  115.                 armor.damage.net = 0;
  116.                 armor.damage.lost = 0;
  117.             end
  118.         end
  119.        
  120.         -- FADE PICKUP BUFFERS
  121.         if armor.pickup.timer < armor.pickup.delay then
  122.             armor.pickup.timer = math.min(armor.pickup.delay, armor.pickup.timer + deltaTime);
  123.         else
  124.             if armor.pickup.fade < 1 then
  125.                 armor.pickup.fade = math.min(1, armor.pickup.fade + (deltaTime / armor.pickup.dur));
  126.                
  127.                 armor.color.pickupFinal = Color(armor.color.pickup.r, armor.color.pickup.g, armor.color.pickup.b,
  128.                     lerp(armor.color.pickup.a, 0, armor.pickup.fade)
  129.                 );
  130.             else
  131.                 armor.pickup.net = 0;
  132.                 armor.pickup.lost = 0;
  133.                 armor.pickup.timer = 0;
  134.             end
  135.         end
  136.     end
  137.    
  138.     -- ARMOR DAMAGE
  139.     if player.armor < armor.old then
  140.         local d = (armor.old - player.armor);
  141.         armor.damage.net = armor.damage.net + d;
  142.        
  143.         -- DON'T BUFFER OVERARMOR DRAIN
  144.         if (d > 1) or (armor.old < 100) then
  145.             armor.damage.fade = 0;
  146.             armor.damage.timer = 0;
  147.             damageAlpha = lerp(255, 0, armor.damage.fade);
  148.         end
  149.        
  150.         -- IF PICKUP BUFFERED, DECREASE PICKUP FIRST, TRACK PICKUP LOST THIS WAY
  151.         if armor.pickup.net > 0 then
  152.             if armor.pickup.net > d then
  153.                 armor.pickup.net = armor.pickup.net - d;
  154.                 armor.pickup.lost = armor.pickup.lost + d;
  155.                
  156.             elseif armor.pickup.net <= d then
  157.                 armor.pickup.lost = armor.pickup.lost + armor.pickup.net;
  158.                 armor.pickup.net = 0;
  159.             end
  160.         end
  161.        
  162.         armor.old = player.armor;
  163.     end
  164.    
  165.     -- ARMOR PICKUP
  166.     if player.armor > armor.old then
  167.         local p = (player.armor - armor.old);
  168.         armor.pickup.net = armor.pickup.net + p;
  169.        
  170.         armor.pickup.fade = 0;
  171.         armor.pickup.timer = 0;
  172.         armor.color.pickupFinal = Color(armor.color.pickup.r, armor.color.pickup.g, armor.color.pickup.b,
  173.             lerp(armor.color.pickup.a, 0, armor.pickup.fade)
  174.         );
  175.        
  176.         -- IF DAMAGE BUFFERED, DECREASE DAMAGE FIRST, TRACK DAMAGE LOST THIS WAY
  177.         if armor.damage.net > p then
  178.             armor.damage.net = armor.damage.net - p;
  179.             armor.damage.lost = armor.damage.lost + p;
  180.            
  181.         elseif armor.damage.net <= p then
  182.             armor.damage.lost = armor.damage.lost + armor.damage.net;
  183.             armor.damage.net = 0;
  184.             armor.damage.timer = 0;
  185.         end
  186.        
  187.         armor.old = player.armor;
  188.     end
  189.    
  190.     -- PREPARE TO DRAW
  191.     local barArmorFull = math.max(3, player.armor) / 200 * armor.width;
  192.     local barArmorDamage = armor.damage.net / 200 * armor.width;
  193.     local barArmorPickup = armor.pickup.net / 200 * armor.width;
  194.    
  195.  
  196.     if player.armorProtection == 0 then
  197.         colorArmorFinal = Color(
  198.             lerp(armor.color.lowGA.r, armor.color.highGA.r, player.armor / 200),
  199.             lerp(armor.color.lowGA.g, armor.color.highGA.g, player.armor / 200),
  200.             lerp(armor.color.lowGA.b, armor.color.highGA.b, player.armor / 200),
  201.             lerp(armor.color.lowGA.a, armor.color.highGA.a, player.armor / 200)
  202.         );
  203.         armor.color.damageFinal = Color(
  204.             armor.color.damageGA.r, armor.color.damageGA.g, armor.color.damageGA.b,
  205.             damageAlpha
  206.         );
  207.        
  208.     elseif player.armorProtection == 1 then
  209.         colorArmorFinal = Color(
  210.             lerp(armor.color.lowYA.r, armor.color.highYA.r, player.armor / 200),
  211.             lerp(armor.color.lowYA.g, armor.color.highYA.g, player.armor / 200),
  212.             lerp(armor.color.lowYA.b, armor.color.highYA.b, player.armor / 200),
  213.             lerp(armor.color.lowYA.a, armor.color.highYA.a, player.armor / 200)
  214.         );
  215.         armor.color.damageFinal = Color(
  216.             armor.color.damageYA.r, armor.color.damageYA.g, armor.color.damageYA.b,
  217.             damageAlpha
  218.         );
  219.        
  220.     elseif player.armorProtection == 2 then
  221.         colorArmorFinal = Color(
  222.             lerp(armor.color.lowRA.r, armor.color.highRA.r, player.armor / 200),
  223.             lerp(armor.color.lowRA.g, armor.color.highRA.g, player.armor / 200),
  224.             lerp(armor.color.lowRA.b, armor.color.highRA.b, player.armor / 200),
  225.             lerp(armor.color.lowRA.a, armor.color.highRA.a, player.armor / 200)
  226.         );
  227.         armor.color.damageFinal = Color(
  228.             armor.color.damageRA.r, armor.color.damageRA.g, armor.color.damageRA.b,
  229.             damageAlpha
  230.         );
  231.        
  232.     end
  233.    
  234.     if not armor.reversed then
  235.         -- DRAW BG
  236.         nvgBeginPath();
  237.         nvgCircle(
  238.             armor.x,
  239.             armor.y,
  240.             armor.icon.size + 4
  241.         );
  242.        
  243.         nvgRoundedRect(
  244.             armor.x,
  245.             armor.y - (armor.height / 2) + (armor.height / 6), -- simplify later
  246.             armor.width + armor.icon.size + armor.icon.gap,
  247.             2 * armor.height / 3,
  248.             3
  249.         );
  250.        
  251.         nvgRoundedRect(
  252.             armor.x + armor.icon.size + armor.icon.gap - 2,
  253.             armor.y - (armor.height / 2) - 4,
  254.             barArmorFull + 4,
  255.             armor.height + 8,
  256.             5
  257.         );
  258.         nvgClosePath();
  259.        
  260.         nvgFillColor(armor.color.frame);
  261.         nvgFill();
  262.        
  263.         -- DRAW ICON
  264.         nvgFillColor(armor.color.trim);
  265.  
  266.         nvgSvg(
  267.             armor.icon.file,
  268.             armor.x,
  269.             armor.y + 2,
  270.             armor.icon.size
  271.         );
  272.         -- DRAW DAMAGE
  273.         if armor.damage.net > 0 then
  274.             nvgBeginPath();
  275.             nvgRoundedRect(
  276.                 armor.x + armor.icon.size + armor.icon.gap,
  277.                 armor.y - (armor.height / 2) + (armor.height / 6),
  278.                 barArmorFull + barArmorDamage,
  279.                 2 * armor.height / 3,
  280.                 3
  281.             );
  282.             nvgClosePath();
  283.             nvgFillColor(armor.color.damageFinal);
  284.             nvgFill();
  285.         end
  286.        
  287.         -- DRAW ARMOR
  288.         nvgBeginPath();
  289.         nvgRoundedRect(
  290.             armor.x + armor.icon.size + armor.icon.gap,
  291.             armor.y - (armor.height / 2),
  292.             barArmorFull,
  293.             armor.height,
  294.             3
  295.         );
  296.         nvgClosePath();
  297.         nvgFillColor(colorArmorFinal);
  298.         nvgFill();
  299.        
  300.         -- DRAW PICKUP
  301.         if armor.pickup.net > 0 then
  302.             nvgBeginPath();
  303.             nvgRoundedRect(
  304.                 armor.x + armor.icon.size + armor.icon.gap + barArmorFull - barArmorPickup,
  305.                 armor.y - (armor.height / 2),
  306.                 barArmorPickup,
  307.                 armor.height,
  308.                 3
  309.             );
  310.             nvgClosePath();
  311.             nvgFillColor(armor.color.pickupFinal);
  312.             nvgFill();
  313.         end
  314.        
  315.         -- DRAW TEXT
  316.         nvgBeginPath();
  317.         nvgRoundedRect(
  318.             armor.text.x - (armor.text.size / 2) - (armor.text.border / 2),
  319.             armor.text.y - (armor.text.size / 2) + 4,
  320.             armor.text.size + armor.text.border,
  321.             armor.text.size - 6,
  322.             6
  323.         );
  324.         nvgClosePath();
  325.         nvgFillColor(armor.color.frame);
  326.         nvgFill();
  327.        
  328.         nvgFontFace(FONT_HUD);
  329.         nvgFontSize(armor.text.size);
  330.         nvgTextAlign(NVG_ALIGN_CENTER, NVG_ALIGN_MIDDLE);
  331.        
  332.         nvgFontBlur(4);
  333.         nvgFillColor(colorArmorFinal);
  334.         nvgText(armor.text.x, armor.text.y, player.armor);
  335.        
  336.         nvgFillColor(armor.color.trim);
  337.         nvgFontBlur(0);
  338.         nvgText(armor.text.x, armor.text.y, player.armor);
  339.        
  340.        
  341.     elseif armor.reversed then
  342.         -- DRAW BG
  343.         nvgBeginPath();
  344.         nvgCircle(
  345.             armor.x,
  346.             armor.y,
  347.             armor.icon.size + 4
  348.         );
  349.        
  350.         nvgRoundedRect(
  351.             armor.x - armor.width - armor.icon.size - armor.icon.gap,
  352.             armor.y - (armor.height / 2) + (armor.height / 6), -- simplify later
  353.             armor.width + armor.icon.size + armor.icon.gap,
  354.             2 * armor.height / 3,
  355.             3
  356.         );
  357.        
  358.         nvgRoundedRect(
  359.             armor.x - armor.icon.size - armor.icon.gap - 2 - barArmorFull,
  360.             armor.y - (armor.height / 2) - 4,
  361.             barArmorFull + 4,
  362.             armor.height + 8,
  363.             5
  364.         );
  365.         nvgClosePath();
  366.        
  367.         nvgFillColor(armor.color.frame);
  368.         nvgFill();
  369.        
  370.         -- DRAW ICON
  371.         nvgFillColor(armor.color.trim);
  372.  
  373.         nvgSvg(
  374.             armor.icon.file,
  375.             armor.x,
  376.             armor.y + 2,
  377.             armor.icon.size
  378.         );
  379.         -- DRAW DAMAGE
  380.         if armor.damage.net > 0 then
  381.             nvgBeginPath();
  382.             nvgRoundedRect(
  383.                 armor.x - armor.icon.size - armor.icon.gap - barArmorDamage - barArmorFull,
  384.                 armor.y - (armor.height / 2) + (armor.height / 6),
  385.                 barArmorFull + barArmorDamage,
  386.                 2 * armor.height / 3,
  387.                 3
  388.             );
  389.             nvgClosePath();
  390.             nvgFillColor(armor.color.damageFinal);
  391.             nvgFill();
  392.         end
  393.        
  394.         -- DRAW ARMOR
  395.         nvgBeginPath();
  396.         nvgRoundedRect(
  397.             armor.x - armor.icon.size - armor.icon.gap - barArmorFull,
  398.             armor.y - (armor.height / 2),
  399.             barArmorFull,
  400.             armor.height,
  401.             3
  402.         );
  403.         nvgClosePath();
  404.         nvgFillColor(colorArmorFinal);
  405.         nvgFill();
  406.        
  407.         -- DRAW PICKUP
  408.         if armor.pickup.net > 0 then
  409.             nvgBeginPath();
  410.             nvgRoundedRect(
  411.                 armor.x - armor.icon.size - armor.icon.gap - barArmorFull,
  412.                 armor.y - (armor.height / 2),
  413.                 barArmorPickup,
  414.                 armor.height,
  415.                 3
  416.             );
  417.             nvgClosePath();
  418.             nvgFillColor(armor.color.pickupFinal);
  419.             nvgFill();
  420.         end
  421.        
  422.         -- DRAW TEXT
  423.         nvgBeginPath();
  424.         nvgRoundedRect(
  425.             -1 * (armor.text.x + (armor.text.size / 2) + (armor.text.border / 2)),
  426.             armor.text.y - (armor.text.size / 2) + 4,
  427.             armor.text.size + armor.text.border,
  428.             armor.text.size - 6,
  429.             6
  430.         );
  431.         nvgClosePath();
  432.         nvgFillColor(armor.color.frame);
  433.         nvgFill();
  434.        
  435.         nvgFontFace(FONT_HUD);
  436.         nvgFontSize(armor.text.size);
  437.         nvgTextAlign(NVG_ALIGN_CENTER, NVG_ALIGN_MIDDLE);
  438.        
  439.         nvgFontBlur(4);
  440.         nvgFillColor(colorArmorFinal);
  441.         nvgText(-armor.text.x, armor.text.y, player.armor);
  442.        
  443.         nvgFillColor(armor.color.trim);
  444.         nvgFontBlur(0);
  445.         nvgText(-armor.text.x, armor.text.y, player.armor);
  446.     end
  447. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement