//Lua script originally written by Dabir, modified to make horizontal springs work//
CV_RegisterVar({
    name = "springlock2",
    defaultvalue = "25",
    flags = CV_SHOWMODIF,
    PossibleValue = {MIN = 1, MAX = 70}
    })

local springtime = 0

local function springBounceLock(thing, tmthing)
    local p = tmthing.player
    if not p
        return
    end
    
	--Doom collision detection checks just x and y values by default, add z value check--
	if abs(thing.z-tmthing.z)/FRACUNIT <= 25
		--Different values for different spring types--
		if thing.type == MT_BLUEHORIZ
			p.springlock2 = 2
			springtime = 2
		elseif thing.type == MT_YELLOWHORIZ
			p.springlock2 = 20
			springtime = 2
		elseif thing.type == MT_REDHORIZ
			p.springlock2 = 40
			springtime = 2
		elseif thing.type == MT_REDDIAG
			p.springlock2 = 40
		elseif thing.type == MT_YELLOWDIAG
			p.springlock2 = 25
		elseif thing.type == MT_BLUEDIAG
			p.springlock2 = 10
		else
			return
		end
	else
		return
	end
end

addHook("MobjCollide", springBounceLock, MT_REDHORIZ)
addHook("MobjCollide", springBounceLock, MT_YELLOWHORIZ)
addHook("MobjCollide", springBounceLock, MT_BLUEHORIZ)

addHook("MobjCollide", springBounceLock, MT_REDDIAG)
addHook("MobjCollide", springBounceLock, MT_YELLOWDIAG)
addHook("MobjCollide", springBounceLock, MT_BLUEDIAG)

addHook("PreThinkFrame", function()
    for player in players.iterate()
        -- Existence check
        if not(player.mo and player.mo.valid)
            continue
        end
		
        -- Controls not locked
		if not(player.springlock2 == nil) -- the variable does not have a valid number when the level starts
		
			if player.springlock2 <= 0
				continue
			else
				-- Lock controls this frame
				player.cmd.forwardmove = 0
				player.cmd.sidemove = 0
				player.cmd.angleturn = 0
				
				-- Run timer down 2x if sneakers
				if player.powers[pw_sneakers]
					player.springlock2 = max($-2, 0)
				else
					player.springlock2 = $-1
				end
			end
        end
    end
end)

addHook("MobjThinker", function()
	for player in players.iterate()
        -- Existence check
        if not(player.mo and player.mo.valid)
            continue
        end
		
		 -- Controls not locked
		if not(player.springlock2 == nil) -- the variable does not have a valid number when the level starts
		
			if player.springlock2 <= 0
				continue
			else
				if springtime > 0
					player.mo.momz = FRACUNIT*2
					springtime = springtime-1
				end
			end
		end
	end
end)
