Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "base/internal/ui/reflexcore";
- yk_fightArmor = {};
- registerWidget("yk_fightArmor");
- ---------------
- local armor = {
- x = 0;
- y = 0;
- border = 5;
- width = 340;
- height = 34;
- reversed = false;
- text = {
- x = -66;
- y = 0;
- size = 54;
- border = 16;
- };
- icon = {
- size = 22;
- gap = 12;
- file = "internal/ui/icons/armor";
- };
- old = 0;
- damage = {
- net = 0; -- current buffer of damage
- lost = 0; -- buffered damage lost to pickups
- fade = 0; -- A normalized value used to lerp the damage color to transparency
- dur = 1; -- The amount of time that the fade-out takes
- delay = 0.25; -- The deleay before the fade-out starts
- timer = 0; -- A timer to keep track of the delay
- };
- pickup = {
- net = 0;
- lost = 0;
- fade = 0;
- dur = 1;
- delay = 0.25;
- timer = 0;
- };
- color = {
- frame = Color(0, 8, 16, 160);
- trim = Color(255, 255, 242);
- highGA = Color(0, 172, 64);
- lowGA = Color(96, 255, 0);
- highYA = Color(255, 176, 0);
- lowYA = Color(255, 255, 160);
- highRA = Color(192, 0, 48);
- lowRA = Color(255, 72, 0);
- damageGA = Color(0, 138, 64);
- damageYA = Color(255, 112, 0);
- damageRA = Color(150, 0, 32);
- damageFinal = Color(0, 0, 0, 0);
- pickup = Color(255, 255, 255); -- 0, 191, 96
- pickupFinal = Color(255, 255, 255);
- };
- };
- local colorArmorFinal = Color(255, 255, 255);
- local damageAlpha = 0;
- ---------------
- function yk_fightArmor:draw()
- -- PLAYER, FIRST OUT
- local player = getPlayer();
- if player == nil or
- player.state == PLAYER_STATE_EDITOR or
- player.state == PLAYER_STATE_SPECTATOR or
- world.gameState == GAME_STATE_GAMEOVER or
- isInMenu()
- then return false end;
- if not player.connected then return end;
- -- IF YOU DIE, CLEAR EVERYTHING
- if player.health <= 0 then
- armor.old = 0;
- armor.damage.net = 0;
- armor.damage.lost = 0;
- armor.damage.fade = 0;
- armor.damage.timer = 0;
- armor.pickup.net = 0;
- armor.pickup.lost = 0;
- armor.pickup.fade = 0;
- armor.damage.timer = 0;
- end
- -- SECOND OUT
- if not shouldShowHUD() then return end;
- -- ARMOR CONSTANT
- if (player.armor == armor.old) then
- -- FADE DAMAGE BUFFERS
- if armor.damage.timer < armor.damage.delay then
- armor.damage.timer = math.min(armor.damage.delay, armor.damage.timer + deltaTime);
- else
- if armor.damage.fade < 1 then
- armor.damage.fade = math.min(1, armor.damage.fade + (deltaTime / armor.damage.dur));
- damageAlpha = lerp(255, 0, armor.damage.fade);
- else
- armor.damage.net = 0;
- armor.damage.lost = 0;
- end
- end
- -- FADE PICKUP BUFFERS
- if armor.pickup.timer < armor.pickup.delay then
- armor.pickup.timer = math.min(armor.pickup.delay, armor.pickup.timer + deltaTime);
- else
- if armor.pickup.fade < 1 then
- armor.pickup.fade = math.min(1, armor.pickup.fade + (deltaTime / armor.pickup.dur));
- armor.color.pickupFinal = Color(armor.color.pickup.r, armor.color.pickup.g, armor.color.pickup.b,
- lerp(armor.color.pickup.a, 0, armor.pickup.fade)
- );
- else
- armor.pickup.net = 0;
- armor.pickup.lost = 0;
- armor.pickup.timer = 0;
- end
- end
- end
- -- ARMOR DAMAGE
- if player.armor < armor.old then
- local d = (armor.old - player.armor);
- armor.damage.net = armor.damage.net + d;
- -- DON'T BUFFER OVERARMOR DRAIN
- if (d > 1) or (armor.old < 100) then
- armor.damage.fade = 0;
- armor.damage.timer = 0;
- damageAlpha = lerp(255, 0, armor.damage.fade);
- end
- -- IF PICKUP BUFFERED, DECREASE PICKUP FIRST, TRACK PICKUP LOST THIS WAY
- if armor.pickup.net > 0 then
- if armor.pickup.net > d then
- armor.pickup.net = armor.pickup.net - d;
- armor.pickup.lost = armor.pickup.lost + d;
- elseif armor.pickup.net <= d then
- armor.pickup.lost = armor.pickup.lost + armor.pickup.net;
- armor.pickup.net = 0;
- end
- end
- armor.old = player.armor;
- end
- -- ARMOR PICKUP
- if player.armor > armor.old then
- local p = (player.armor - armor.old);
- armor.pickup.net = armor.pickup.net + p;
- armor.pickup.fade = 0;
- armor.pickup.timer = 0;
- armor.color.pickupFinal = Color(armor.color.pickup.r, armor.color.pickup.g, armor.color.pickup.b,
- lerp(armor.color.pickup.a, 0, armor.pickup.fade)
- );
- -- IF DAMAGE BUFFERED, DECREASE DAMAGE FIRST, TRACK DAMAGE LOST THIS WAY
- if armor.damage.net > p then
- armor.damage.net = armor.damage.net - p;
- armor.damage.lost = armor.damage.lost + p;
- elseif armor.damage.net <= p then
- armor.damage.lost = armor.damage.lost + armor.damage.net;
- armor.damage.net = 0;
- armor.damage.timer = 0;
- end
- armor.old = player.armor;
- end
- -- PREPARE TO DRAW
- local barArmorFull = math.max(3, player.armor) / 200 * armor.width;
- local barArmorDamage = armor.damage.net / 200 * armor.width;
- local barArmorPickup = armor.pickup.net / 200 * armor.width;
- if player.armorProtection == 0 then
- colorArmorFinal = Color(
- lerp(armor.color.lowGA.r, armor.color.highGA.r, player.armor / 200),
- lerp(armor.color.lowGA.g, armor.color.highGA.g, player.armor / 200),
- lerp(armor.color.lowGA.b, armor.color.highGA.b, player.armor / 200),
- lerp(armor.color.lowGA.a, armor.color.highGA.a, player.armor / 200)
- );
- armor.color.damageFinal = Color(
- armor.color.damageGA.r, armor.color.damageGA.g, armor.color.damageGA.b,
- damageAlpha
- );
- elseif player.armorProtection == 1 then
- colorArmorFinal = Color(
- lerp(armor.color.lowYA.r, armor.color.highYA.r, player.armor / 200),
- lerp(armor.color.lowYA.g, armor.color.highYA.g, player.armor / 200),
- lerp(armor.color.lowYA.b, armor.color.highYA.b, player.armor / 200),
- lerp(armor.color.lowYA.a, armor.color.highYA.a, player.armor / 200)
- );
- armor.color.damageFinal = Color(
- armor.color.damageYA.r, armor.color.damageYA.g, armor.color.damageYA.b,
- damageAlpha
- );
- elseif player.armorProtection == 2 then
- colorArmorFinal = Color(
- lerp(armor.color.lowRA.r, armor.color.highRA.r, player.armor / 200),
- lerp(armor.color.lowRA.g, armor.color.highRA.g, player.armor / 200),
- lerp(armor.color.lowRA.b, armor.color.highRA.b, player.armor / 200),
- lerp(armor.color.lowRA.a, armor.color.highRA.a, player.armor / 200)
- );
- armor.color.damageFinal = Color(
- armor.color.damageRA.r, armor.color.damageRA.g, armor.color.damageRA.b,
- damageAlpha
- );
- end
- if not armor.reversed then
- -- DRAW BG
- nvgBeginPath();
- nvgCircle(
- armor.x,
- armor.y,
- armor.icon.size + 4
- );
- nvgRoundedRect(
- armor.x,
- armor.y - (armor.height / 2) + (armor.height / 6), -- simplify later
- armor.width + armor.icon.size + armor.icon.gap,
- 2 * armor.height / 3,
- 3
- );
- nvgRoundedRect(
- armor.x + armor.icon.size + armor.icon.gap - 2,
- armor.y - (armor.height / 2) - 4,
- barArmorFull + 4,
- armor.height + 8,
- 5
- );
- nvgClosePath();
- nvgFillColor(armor.color.frame);
- nvgFill();
- -- DRAW ICON
- nvgFillColor(armor.color.trim);
- nvgSvg(
- armor.icon.file,
- armor.x,
- armor.y + 2,
- armor.icon.size
- );
- -- DRAW DAMAGE
- if armor.damage.net > 0 then
- nvgBeginPath();
- nvgRoundedRect(
- armor.x + armor.icon.size + armor.icon.gap,
- armor.y - (armor.height / 2) + (armor.height / 6),
- barArmorFull + barArmorDamage,
- 2 * armor.height / 3,
- 3
- );
- nvgClosePath();
- nvgFillColor(armor.color.damageFinal);
- nvgFill();
- end
- -- DRAW ARMOR
- nvgBeginPath();
- nvgRoundedRect(
- armor.x + armor.icon.size + armor.icon.gap,
- armor.y - (armor.height / 2),
- barArmorFull,
- armor.height,
- 3
- );
- nvgClosePath();
- nvgFillColor(colorArmorFinal);
- nvgFill();
- -- DRAW PICKUP
- if armor.pickup.net > 0 then
- nvgBeginPath();
- nvgRoundedRect(
- armor.x + armor.icon.size + armor.icon.gap + barArmorFull - barArmorPickup,
- armor.y - (armor.height / 2),
- barArmorPickup,
- armor.height,
- 3
- );
- nvgClosePath();
- nvgFillColor(armor.color.pickupFinal);
- nvgFill();
- end
- -- DRAW TEXT
- nvgBeginPath();
- nvgRoundedRect(
- armor.text.x - (armor.text.size / 2) - (armor.text.border / 2),
- armor.text.y - (armor.text.size / 2) + 4,
- armor.text.size + armor.text.border,
- armor.text.size - 6,
- 6
- );
- nvgClosePath();
- nvgFillColor(armor.color.frame);
- nvgFill();
- nvgFontFace(FONT_HUD);
- nvgFontSize(armor.text.size);
- nvgTextAlign(NVG_ALIGN_CENTER, NVG_ALIGN_MIDDLE);
- nvgFontBlur(4);
- nvgFillColor(colorArmorFinal);
- nvgText(armor.text.x, armor.text.y, player.armor);
- nvgFillColor(armor.color.trim);
- nvgFontBlur(0);
- nvgText(armor.text.x, armor.text.y, player.armor);
- elseif armor.reversed then
- -- DRAW BG
- nvgBeginPath();
- nvgCircle(
- armor.x,
- armor.y,
- armor.icon.size + 4
- );
- nvgRoundedRect(
- armor.x - armor.width - armor.icon.size - armor.icon.gap,
- armor.y - (armor.height / 2) + (armor.height / 6), -- simplify later
- armor.width + armor.icon.size + armor.icon.gap,
- 2 * armor.height / 3,
- 3
- );
- nvgRoundedRect(
- armor.x - armor.icon.size - armor.icon.gap - 2 - barArmorFull,
- armor.y - (armor.height / 2) - 4,
- barArmorFull + 4,
- armor.height + 8,
- 5
- );
- nvgClosePath();
- nvgFillColor(armor.color.frame);
- nvgFill();
- -- DRAW ICON
- nvgFillColor(armor.color.trim);
- nvgSvg(
- armor.icon.file,
- armor.x,
- armor.y + 2,
- armor.icon.size
- );
- -- DRAW DAMAGE
- if armor.damage.net > 0 then
- nvgBeginPath();
- nvgRoundedRect(
- armor.x - armor.icon.size - armor.icon.gap - barArmorDamage - barArmorFull,
- armor.y - (armor.height / 2) + (armor.height / 6),
- barArmorFull + barArmorDamage,
- 2 * armor.height / 3,
- 3
- );
- nvgClosePath();
- nvgFillColor(armor.color.damageFinal);
- nvgFill();
- end
- -- DRAW ARMOR
- nvgBeginPath();
- nvgRoundedRect(
- armor.x - armor.icon.size - armor.icon.gap - barArmorFull,
- armor.y - (armor.height / 2),
- barArmorFull,
- armor.height,
- 3
- );
- nvgClosePath();
- nvgFillColor(colorArmorFinal);
- nvgFill();
- -- DRAW PICKUP
- if armor.pickup.net > 0 then
- nvgBeginPath();
- nvgRoundedRect(
- armor.x - armor.icon.size - armor.icon.gap - barArmorFull,
- armor.y - (armor.height / 2),
- barArmorPickup,
- armor.height,
- 3
- );
- nvgClosePath();
- nvgFillColor(armor.color.pickupFinal);
- nvgFill();
- end
- -- DRAW TEXT
- nvgBeginPath();
- nvgRoundedRect(
- -1 * (armor.text.x + (armor.text.size / 2) + (armor.text.border / 2)),
- armor.text.y - (armor.text.size / 2) + 4,
- armor.text.size + armor.text.border,
- armor.text.size - 6,
- 6
- );
- nvgClosePath();
- nvgFillColor(armor.color.frame);
- nvgFill();
- nvgFontFace(FONT_HUD);
- nvgFontSize(armor.text.size);
- nvgTextAlign(NVG_ALIGN_CENTER, NVG_ALIGN_MIDDLE);
- nvgFontBlur(4);
- nvgFillColor(colorArmorFinal);
- nvgText(-armor.text.x, armor.text.y, player.armor);
- nvgFillColor(armor.color.trim);
- nvgFontBlur(0);
- nvgText(-armor.text.x, armor.text.y, player.armor);
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement