local shieldAbilities = { none = "none", whirlwind = "jump", wind = "jump", jump = "jump", attraction = "shot", magnet = "shot", homing = "shot", shot = "shot", force = "stop", energy = "stop", stop = "stop", elemental = "stomp", element = "stomp", firewater = "stomp", waterfire = "stomp", stomp = "stomp", armageddon = "blast", nuke = "blast", pow = "blast", blast = "blast", flame = "burst", fire = "burst", aura = "burst", flameaura = "burst", thok = "burst", dash = "burst", burst = "burst", thunder = "zap", lightning = "zap", electric = "zap", coin = "zap", thundercoin = "zap", zap = "zap", bubble = "bounce", water = "bounce", wrap = "bounce", bubblewrap = "bounce", bounce = "bounce" } COM_AddCommand("shieldability", function(player, arg) if gamestate != GS_LEVEL CONS_Printf(player, "You must be in a level to do this.") return end if not arg CONS_Printf(player, "shieldability : change your double jump ability between your regular or any of the Shields'") CONS_Printf(player, '"shieldability" is "'..player.shieldability..'" default is "none"') return elseif not shieldAbilities[arg] CONS_Printf(player, "Invalid argument.") return else if tonumber(arg) player.shieldability = shieldAbilities[tonumber(arg)] else player.shieldability = shieldAbilities[arg] end if player.shieldability == "none" CONS_Printf(player, "Disabled shield ability.") else CONS_Printf(player, "Enabled '"..shieldAbilities[arg].."' shield ability.") end end end) addHook("PlayerSpawn", function(player) if not player.shieldability then player.shieldability = "none" end player.stomping = false player.armatimer = 0 end) addHook("PlayerThink", function(player) if player.shieldability == "jump" if player.mo.state == S_PLAY_DEAD or player.mo.state == S_PLAY_PAIN then return end if player.pflags & PF_THOKKED then return end if player.cmd.buttons & BT_JUMP if not player.wdjump then if not P_IsObjectOnGround(player.mo) and not (player.pflags & PF_JUMPED) if (P_MobjFlip(player.mo) == -1 and player.mo.momz > 0) or (P_MobjFlip(player.mo) == 1 and player.mo.momz < 0) if player.mo.eflags & MFE_UNDERWATER P_SetObjectMomZ(player.mo, 5*FixedMul(player.mo.scale, player.jumpfactor), false) else P_SetObjectMomZ(player.mo, 10*FixedMul(player.mo.scale, player.jumpfactor), false) end else if player.mo.eflags & MFE_UNDERWATER P_SetObjectMomZ(player.mo, 5*FixedMul(player.mo.scale, player.jumpfactor), true) else P_SetObjectMomZ(player.mo, 10*FixedMul(player.mo.scale, player.jumpfactor), true) end end S_StartSound(player.mo, sfx_wdjump) player.mo.state = S_PLAY_FALL player.pflags = $|PF_NOJUMPDAMAGE|PF_THOKKED player.pflags = $ & ~PF_SPINNING end end player.wdjump = true else player.wdjump = false end elseif player.shieldability == "shot" if player.attractiontimer player.attractiontimer = $-1 if not player.mo.target or not P_HomingAttack(player.mo, player.mo.target) or player.mo.eflags & MFE_SPRUNG then player.attractiontimer = 0 end if player.attractiontimer == 0 if player.charflags & SF_NOJUMPSPIN player.mo.state = S_PLAY_FALL end if player.charflags & SF_NOJUMPDAMAGE player.pflags = $|PF_NOJUMPDAMAGE end if player.target then player.pflags = $|PF_THOKKED end return end P_HomingAttack(player.mo, player.mo.target) P_SpawnThokMobj(player) player.pflags = $ & ~PF_NOJUMPDAMAGE player.mo.state = S_PLAY_ROLL else if P_LookForEnemies(player) and not P_IsObjectOnGround(player.mo) and not (player.mo.eflags & MFE_SPRUNG or player.pflags & PF_THOKKED) P_SpawnLockOn(player, P_LookForEnemies(player), S_LOCKON2) end end elseif player.shieldability == "stomp" or player.shieldability == "bounce" if player.stomping == true P_SetObjectMomZ(player.mo, -25*FRACUNIT) P_SpawnThokMobj(player) if player.shieldability == "stomp" P_InstaThrust(player.mo, 0, 0) end player.pflags = $ & ~PF_NOJUMPDAMAGE player.mo.state = S_PLAY_ROLL if player.mo.eflags & MFE_JUSTHITFLOOR player.stomping = false if player.shieldability == "stomp" player.mo.state = S_PLAY_FALL player.pflags = $|PF_NOJUMPDAMAGE|PF_THOKKED if (player.realmo.eflags & MFE_UNDERWATER or player.realmo.eflags & MFE_TOUCHWATER) and not (player.realmo.eflags & MFE_TOUCHLAVA) S_StartSound(player.mo, sfx_s3k4c) P_SetObjectMomZ(player.mo, 2*FRACUNIT) else P_ElementalFire(player, true) S_StartSound(player.mo, sfx_s3k47) P_SetObjectMomZ(player.mo, 4*FRACUNIT) end elseif player.shieldability == "bounce" P_SetObjectMomZ(player.mo, 15*FRACUNIT) S_StartSound(player.mo, sfx_s3k44) player.pflags = $ & ~(PF_NOJUMPDAMAGE|PF_THOKKED) player.pflags = $|PF_JUMPED player.mo.state = S_PLAY_ROLL end elseif player.mo.eflags & MFE_SPRUNG or player.mo.eflags & MFE_GOOWATER then player.stomping = false end end end if player.armatimer then player.armatimer = $-1 if player.armatimer == 0 S_StartSound(nil, sfx_armasg, player) end end if player.shieldability ~= "shot" player.attractiontimer = 0 end end) addHook("AbilitySpecial", function(player) if player.shieldability == "none" then return false end if player.pflags & PF_THOKKED return end if player.shieldability == "jump" or player.shieldability == "zap" if (P_MobjFlip(player.mo) == -1 and player.mo.momz > 0) or (P_MobjFlip(player.mo) == 1 and player.mo.momz < 0) if player.mo.eflags & MFE_UNDERWATER P_SetObjectMomZ(player.mo, 5*FixedMul(player.mo.scale, player.jumpfactor), false) else P_SetObjectMomZ(player.mo, 10*FixedMul(player.mo.scale, player.jumpfactor), false) end else if player.mo.eflags & MFE_UNDERWATER P_SetObjectMomZ(player.mo, 5*FixedMul(player.mo.scale, player.jumpfactor), true) else P_SetObjectMomZ(player.mo, 10*FixedMul(player.mo.scale, player.jumpfactor), true) end end if player.shieldability == "jump" S_StartSound(player.mo, sfx_wdjump) player.mo.state = S_PLAY_FALL player.pflags = $|PF_NOJUMPDAMAGE|PF_THOKKED elseif player.shieldability == "zap" S_StartSound(player.mo, sfx_s3k45) player.mo.state = S_PLAY_ROLL player.pflags = $ & ~PF_NOJUMPDAMAGE player.pflags = $|PF_THOKKED P_SpawnThokMobj(player) end elseif player.shieldability == "shot" player.mo.target = P_LookForEnemies(player) if not player.mo.target S_StartSound(player.mo, sfx_s3ka6) player.pflags = $|PF_THOKKED P_SpawnThokMobj(player) else player.attractiontimer = 3*TICRATE S_StartSound(player.mo, sfx_s3k40) end elseif player.shieldability == "stop" P_SpawnThokMobj(player) P_InstaThrust(player.mo, 0, 0) P_SetObjectMomZ(player.mo, 0) S_StartSound(player.mo, sfx_ngskid) player.pflags = $|PF_THOKKED elseif player.shieldability == "stomp" or player.shieldability == "bounce" player.stomping = true if player.shieldability == "stomp" player.pflags = $|PF_THOKKED S_StartSound(player.mo, sfx_s3k43) elseif player.shieldability == "bounce" P_Thrust(player.mo, player.mo.angle-ANGLE_180, player.speed/4) S_StartSound(player.mo, sfx_s3k44) end elseif player.shieldability == "blast" if not player.armatimer P_BlackOw(player) player.armatimer = 60*TICRATE player.pflags = $|PF_THOKKED else S_StartSound(nil, sfx_lose, player) player.pflags = $|PF_THOKKED end player.shieldability = "none" elseif player.shieldability == "burst" P_Thrust(player.mo, player.mo.angle, 25*player.mo.scale) P_SpawnThokMobj(player) S_StartSound(player.mo, sfx_s3k43) player.pflags = $ & ~PF_NOJUMPDAMAGE player.mo.state = S_PLAY_ROLL player.pflags = $|PF_THOKKED end player.pflags = $ & ~PF_SPINNING return true end)