running when dashing is animating when pressing a movement key

Vestige

Member
For some reason when i'm dashing and at a standstill the running animation isn't playing properly

here's an example



Not pressing a movement key

srb20014.gif


Pressing a movement key

srb20015.gif



BOOST CODE THINGY


running:
    if data.dashing then
        data.dash_energy = dash_energy - dash_drain_per_tick
        if data.dash_energy <= 0 or (not (player.cmd.buttons & button) and player.playerstate == PST_LIVE) and not P_PlayerInPain(player) then
            data.dashing = false
            player.mo.dashtime = 0
            player.charflags = player.charflags & ~SF_CANBUSTWALLS
        else
            player.mo.dashtime = player.mo.dashtime + 1
            P_RadiusAttack(player.mo, player.mo, 140*FRACUNIT, DMG_INSTAKILL, player)
            afterimage(player)
            player.charflags = player.charflags | SF_CANBUSTWALLS
            player.pflags = player.pflags & ~PF_SPINNING
            P_InstaThrust(player.mo, player.drawangle, data.energy_force * FRACUNIT)
            player.pflags = $ & ~PF_SPINNING
            if P_IsObjectOnGround(player.mo) then
                player.mo.state = S_PLAY_RUN
                P_SpawnSkidDust(player, player.mo.radius, true)
                player.mo.state = S_PLAY_RUN
                    elseif player.pflags & PF_JUMPED and player.mo.dashtime  <= 9 then
                        player.mo.momz = ((player.speed + (player.speed / 2)) / FRACUNIT) + sin(player.mo.angle) + 4 * FRACUNIT
            end

        end
    end

Full code:
-- Vestige Dash System - Rework: Longer Hold Dash, Breaks Objects, Colored HUD, Shield Bypass, Feedback, Combo Score Multiplier, Bounce Bracelet
freeslot("VEST_SPRT", "BAR_SPRT")
local button = BT_CUSTOM1
local bounceButton = BT_SPIN
local skin = "vestige"
local starttimer = 200
local max_dash_energy = 400
local dash_drain_per_tick = 2
local bounce_scale = {stretch = 14/10, squash = 6/10, duration = 10}
local bounce_force = 15 * FRACUNIT

-- Helper Functions
local function SpeedBoost_Reset(player)
    if player.mo and player.mo.skin == skin then
        player.normalspeed = skins[skin].normalspeed
        player.jumpfactor = skins[skin].jumpfactor
        player.charflags = player.charflags & ~SF_RUNONWATER
        player.camerascale = skins[skin].camerascale
        player.acceleration = skins[skin].acceleration
        player.mo.blendmode = AST_COPY
        player.mo.colorized = false
        player.mo.color = player.skincolor
        player.mo.scale = FRACUNIT
        player.accelstart = skins[skin].accelstart
    end
end

local function SpeedBoost_start(player, overcharge)
    if player.mo and player.mo.skin == skin then
        player.charflags = player.charflags | SF_RUNONWATER
        player.normalspeed = skins[skin].normalspeed + 10 + overcharge
        player.jumpfactor = skins[skin].jumpfactor + (player.jumpfactor / 3) + overcharge
        player.acceleration = skins[skin].acceleration - 20
        player.camerascale = skins[skin].camerascale + (player.camerascale / 4) + overcharge
        player.mo.blendmode = overcharge >= 1 and AST_REVERSESUBTRACT or AST_SUBTRACT
        player.mo.colorized = true
        player.accelstart = 400
        player.mo.color = SKINCOLOR_POWER
    end
end

local function afterimage(player)
    local trail = P_SpawnGhostMobj(player.mo)
    trail.flags = $|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY
    trail.angle = player.mo.angle
    trail.color = player.mo.color
    trail.scale = player.mo.scale
    trail.blendmode = AST_ADD
    trail.colorized = true
    trail.fuse = 6
end

local function dashParticleBurst(player)
    for i = 0, 31 do
        local angle = i * ANG1 * 11
        local px = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z + 8*FRACUNIT, MT_THOK)
        px.momx = FixedMul(cos(angle), 5*FRACUNIT)
        px.momy = FixedMul(sin(angle), 5*FRACUNIT)
        px.momz = P_RandomRange(-2, 2)*FRACUNIT
        px.fuse = 10
        px.scale = FRACUNIT/2
        px.color = player.mo.color
        px.state = S_THOK
    end
end

local dash_squash = {
    stretch = 5/4,     -- Elongate during dash
    squash = 6/10,     -- Compress briefly at start
    duration = 6       -- Frames squash/stretch lasts
}

-- Bounce logic with cooldown and delayed bounce on landing
addHook("PlayerThink", function(player)
    if not player.mo or player.mo.skin ~= skin then return end

    if not player.vestige then player.vestige = {} end
    local data = player.vestige

    -- Bounce Bracelet Ability - Midair activation
    if (player.cmd.buttons & bounceButton)
        and not P_IsObjectOnGround(player.mo)
        and not data.dashing
        and not (player.pflags & PF_THOKKED) then

        -- Perform midair bounce
        P_SetObjectMomZ(player.mo, -30*FRACUNIT)
        player.pflags = $ | PF_THOKKED
        S_StartSound(player.mo, sfx_bnce2, player)
        data.dash_energy = max(0, data.dash_energy - 20)

        -- Store intent to bounce on landing
        data.want_to_bounce = true
    end

    -- Ground bounce if intent was stored and cooldown is over
    if data.want_to_bounce and P_IsObjectOnGround(player.mo) then
        P_SetObjectMomZ(player.mo, 15 * FRACUNIT + bounce_force * FRACUNIT)
        player.mo.state = S_PLAY_JUMP
        player.pflags = $ | PF_SPINNING
        P_StartQuake(10 * FRACUNIT, TICRATE / 2)
        S_StartSound(player.mo, sfx_bnce2)
        data.want_to_bounce = false
        data.bounce_cooldown = bounce_cooldown_max
    end
end)



addHook("HUD", function(v, player, cam)
    if not player.mo then return end
    if not player.vestigedash then return end

    -- Energy Bar Position
    local bar_x = 160
    local bar_y = 170
    local bar_w = 60
    local bar_h = 6

    -- Draw Background Box
    v.drawFill(bar_x, bar_y, bar_w, bar_h, 31)

    -- Energy Fill (scaled to dashenergy)
    local energy = player.vestigedash.dashenergy or 0
    local fill_w = FixedMul(bar_w * FRACUNIT, energy)
    v.drawFill(bar_x, bar_y, fill_w>>FRACBITS, bar_h, v.getColormap(TC_RAINBOW, SKINCOLOR_SAPPHIRE))

    -- Border Lines (top and bottom)
    v.drawLineRaw(bar_x, bar_y, bar_x + bar_w, bar_y, 0)
    v.drawLineRaw(bar_x, bar_y + bar_h, bar_x + bar_w, bar_y + bar_h, 0)

    -- Draw Dash Combo
    local combo = player.vestigedash.combo or 0
    if combo > 1 then
        v.drawString(bar_x + bar_w + 5, bar_y - 2, "Combo x"..combo, V_ALLOWLOWERCASE, "thin")
    end
end)

-- Main Logic
addHook("PlayerThink", function(player)
    if not player.mo or player.mo.skin ~= skin then return end

    if not player.vestige then
        player.vestige = {
            dash_energy = 0,
            notdashingtimer = 20,
            dashing = false,
            can_dash = true,
            combo = 0,
            combo_timer = 0,
            combo_score = 0,
            energy_force = 0,
            dash_scale_timer = 0
        }
    end

    local data = player.vestige
    local mo = player.mo

    if (player.mo.eflags & MFE_UNDERWATER) then
        data.energy_force = 30
    else
        data.energy_force = 60
    end

    data.dash_energy = tonumber(data.dash_energy) or 0
    data.combo = data.combo or 0
    data.combo_timer = data.combo_timer or 0
    data.combo_score = data.combo_score or 0
    data.notdashingtimer = data.notdashingtimer or 20
    data.energy_force = data.energy_force or 0

    local dash_energy = data.dash_energy
    local overcharged = (dash_energy > starttimer) and (dash_energy - starttimer) or 0

    if not data.dashing then
        data.notdashingtimer = data.notdashingtimer - 1
        player.mo.dashtime = 0
    end

    if dash_energy < starttimer / 2 then
        data.dash_energy = $1 + 1
        SpeedBoost_Reset(player)
    else
        SpeedBoost_start(player, overcharged)
        if dash_energy < starttimer then
            data.dash_energy = $1 + 1
        end
    end

    if data.dashing then
        data.dash_energy = dash_energy - dash_drain_per_tick
        if data.dash_energy <= 0 or (not (player.cmd.buttons & button) and player.playerstate == PST_LIVE) and not P_PlayerInPain(player) then
            data.dashing = false
            player.mo.dashtime = 0
            player.charflags = player.charflags & ~SF_CANBUSTWALLS
        else
            player.mo.dashtime = player.mo.dashtime + 1
            P_RadiusAttack(player.mo, player.mo, 140*FRACUNIT, DMG_INSTAKILL, player)
            afterimage(player)
            player.charflags = player.charflags | SF_CANBUSTWALLS
            player.pflags = player.pflags & ~PF_SPINNING
            P_InstaThrust(player.mo, player.drawangle, data.energy_force * FRACUNIT)
            player.pflags = $ & ~PF_SPINNING
            if P_IsObjectOnGround(player.mo) then
                player.mo.state = S_PLAY_RUN
                P_SpawnSkidDust(player, player.mo.radius, true)
                player.mo.state = S_PLAY_RUN
                    elseif player.pflags & PF_JUMPED and player.mo.dashtime  <= 9 then
                        player.mo.momz = ((player.speed + (player.speed / 2)) / FRACUNIT) + sin(player.mo.angle) + 4 * FRACUNIT
            end

        end
    end

    if data.dashing
    and data.dash_scale_timer > 0 then
    data.dash_scale_timer = $ - 1
    mo.scale = FixedMul(FRACUNIT, dash_squash.stretch * FRACUNIT)
else
    mo.scale = FRACUNIT
end


    if not (player.cmd.buttons & button) then
        if not data.dashing and data.notdashingtimer <= 0 then
            data.can_dash = true
            data.notdashingtimer = 20
        end
    else
        if not data.dashing and data.can_dash and dash_energy >= 20 then
            data.dashing = true
            data.can_dash = false
            data.dash_scale_timer = dash_squash.duration
            player.mo.dashtime = 1
           // P_RadiusAttack(player.mo, player.mo, 100*FRACUNIT, DMG_INSTAKILL, player)
            afterimage(player)
            S_StartSound(player.mo, sfx_vboost, player)
            P_StartQuake(10*FRACUNIT, TICRATE / 2)
            dashParticleBurst(player)
        end
    end
end)

-- Award dash energy for killing enemies
addHook("MobjDeath", function(mo, inflictor, source)
    if not source or not source.player then return end
    local player = source.player
    if not player.mo or player.mo.skin ~= skin then return end
    if not player.vestige then return end

    player.vestige.dash_energy = min(max_dash_energy, (player.vestige.dash_energy or 0) + 25)
end)


for _, spike in ipairs({MT_SPIKE, MT_WALLSPIKE}) do
    addHook("MobjCollide", function(mobj, playermobj)
        if playermobj.player and playermobj.player.vestige and playermobj.skin == skin then
            local data = playermobj.player.vestige
            if data.dashing then
                P_KillMobj(mobj, playermobj, playermobj)
                data.dash_energy = data.dash_energy + 10
            end
        end
    end, spike)
end

addHook("MobjDamage", function(target, inf, src, dmg, dmgType)
    if target.player and target.player.vestige and target.skin == skin then
        local data = target.player.vestige
        if data.dashing then
            if dmgType == DMG_FIRE or dmgType == DMG_WATER or dmgType == DMG_ELECTRIC
            or dmgType == DMG_SPIKE or dmgType == DMG_NUKE or dmgType == DMG_DROWNED
            or dmgType == DMG_CRUSHED or dmgType == DMG_CANHURTSELF then
                return true
            end
        end
    end
end, MT_PLAYER)

addHook("PlayerSpawn", function(player)
    if player.mo and player.mo.skin == skin then
        player.vestige = {
            dash_energy = 0,
            dash_penalty = 0,
            dashed_once = false,
        }

    end
end)

: Also trying to remake the sprites

Vestige2.png


to make him more like this
1751948468312.png
Rendr.png
vESFFFFFFF.PNG
 
Last edited:

Who is viewing this thread (Total: 0, Members: 0, Guests: 0)

Back
Top