//Rock
freeslot("MT_ROCKTRAP")

local function P_MobjSlope(mo)
	if mo.standingslope
		if not (mo.standingslope.flags & SL_NOPHYSICS)
			if not (mo.flags & (MF_NOCLIPHEIGHT|MF_NOGRAVITY))
			local thrust = sin(mo.standingslope.zangle)*3/2*(mo.eflags & MFE_VERTICALFLIP and 1 or -1)
				if (mo.momx or mo.momy)
				thrust = FixedMul(thrust, FRACUNIT+P_AproxDistance(mo.momx, mo.momy)/16)
				end
			thrust = FixedMul(thrust, abs(P_GetMobjGravity(mo)))
			thrust = FixedMul(thrust, FixedDiv(mo.friction, 29*FRACUNIT/32))
			P_Thrust(mo, mo.standingslope.xydirection, thrust)
			end
		end
	end
end

local function P_BreakFOF(mo, sector)
	if sector
	and sector.valid
		for rover in sector.ffloors()
			if rover.flags & FF_EXISTS
			and rover.flags & FF_BUSTUP
				if mo.z < rover.topheight
				and mo.z+mo.height*2 >= rover.bottomheight
				EV_CrumbleChain(sector, rover)
				end
			end
		end
	end
end

addHook("MobjSpawn", function(rock)
rock.scale = 2*FRACUNIT
rock.color = SKINCOLOR_RED
rock.colorized = true
end, MT_ROCKTRAP)

addHook("MobjThinker", function(rock)
	if rock
	and rock.valid
	and rock.type == MT_ROCKTRAP
	and rock.health
	local sector = R_PointInSubsector(rock.x+rock.momx+FixedMul(cos(rock.angle), FixedMul(rock.radius, rock.scale)), rock.y+rock.momy+FixedMul(sin(rock.angle), FixedMul(rock.radius, rock.scale))).sector
	P_MobjSlope(rock)
	P_BreakFOF(rock, sector)
	//rock.flags2 = $1|MF2_SCATTER
	rock.flags2 = $1 & ~MF2_DONTDRAW
	rock.fuse = 9999 //Hacks
		if rock.tag == nil
			if rock.spawnpoint
				if rock.spawnpoint.extrainfo
				rock.tag = rock.spawnpoint.extrainfo
				else
				rock.tag = 0
				end
			end
		end
		if rock.launched == nil
		rock.launched = false
		else
			if rock.launched == true
			rock.friction = FRACUNIT
			rock.flags = MF_PAIN|MF_SLIDEME
				if FixedHypot(rock.momx, rock.momy) == 0
				P_KillMobj(rock)
				end
			elseif rock.launched == false
			rock.friction = FRACUNIT
			rock.flags = MF_SOLID|MF_SLIDEME
			rock.momx = 0
			rock.momy = 0
			end
		end
	end
end, MT_ROCKTRAP)

addHook("MobjMoveBlocked", function(rock)
	if rock
	and rock.valid
	and rock.type == MT_ROCKTRAP
	and rock.health
		if rock.launched == true
		P_KillMobj(rock)
		end
	end
end, MT_ROCKTRAP)

addHook("MobjMoveCollide", function(rock, mo)
	if rock
	and rock.valid
	and rock.type == MT_ROCKTRAP
	and rock.health
		if not (rock.z > mo.z+mo.height)
		and not (mo.z > rock.z+FixedMul(rock.height, rock.scale))
			if mo.flags & MF_ENEMY
			and mo.health
			P_KillMobj(mo)
			end
			if mo.player
			and mo.player.playerstate == PST_LIVE
			P_InstaThrust(mo, R_PointToAngle2(0, 0, rock.momx, rock.momy), FixedHypot(rock.momx, rock.momy)+2*FRACUNIT)
			end
		end
	end
end, MT_ROCKTRAP)

addHook("MobjDeath", function(rock)
	if rock
	and rock.valid
	and rock.type == MT_ROCKTRAP
	rock.fuse = 2
		for i = 1, 16
		local rock1 = P_SpawnMobj(rock.x, rock.y, rock.z+4*FRACUNIT, MT_BROKENROBOT)
			if rock1
			and rock1.valid
			rock1.state = S_ROCKCRUMBLEB
			P_InstaThrust(rock1, P_RandomRange(0, 360)*ANG1, P_RandomRange(1, 8)*FRACUNIT)
			P_SetObjectMomZ(rock1, P_RandomRange(1, 8)*FRACUNIT)
				if i == 1
				S_StartSound(rock1, sfx_crumbl)
				end
			end
		end
	end
end, MT_ROCKTRAP)

addHook("LinedefExecute", function(line, mo)
	for rock in mobjs.iterate()
		if rock
		and rock.valid
		and rock.type == MT_ROCKTRAP
		and rock.health
			if FixedInt(line.frontside.textureoffset) == rock.tag
			and rock.launched == false
			P_InstaThrust(rock, rock.angle, line.frontside.rowoffset)
			rock.launched = true
			end
		end
	end
end, "LAUNCHROCK")