//Kickable Recycle Bin By Sonic1983
freeslot("MT_RECYCLE_MONITOR", "MT_ROBOSPIDER", "MT_RECYCLE_CAP", "S_RECYCLEBIN", "S_RECYCLEBIN_POSTDEAD")

for i = 1, 10
freeslot("S_RECYCLE_CAP_DEAD"..i, "S_RECYCLEBIN_DEAD"..i)
end

mobjinfo[MT_RECYCLE_MONITOR] = {
	//$Name Trash Can (Breakable)
	//$Sprite TRSHA0
	//$Category Trash Smash
	//$Flags1Text Add Rings
	//$Flags4Text Add Trash
	//$Flags8Text Add Spiders
	//$ParameterText Amount
	//$arg0 Amount
	//$arg1 Flags
	--$Arg1Type 12
	--$Arg1Enum {1="Add Rings"; 4="Add Trash"; 8="Add Spiders";}
	doomednum = 510,
	spawnstate = S_RECYCLEBIN,
	spawnhealth = 1,
	reactiontime = 32,
	deathstate = S_RECYCLEBIN_POSTDEAD,
	deathsound = sfx_wbreak,
	radius = 16*FRACUNIT,
	height = 48*FRACUNIT,
	mass = 100,
	damage = MT_NULL,
	activesound = sfx_cdfm36,
	flags = MF_MONITOR|MF_SHOOTABLE|MF_SOLID
}

local function RandomTrash(mo)
	if mo.spawnpoint
	local prandom = P_RandomRange(1, 3)
	local trashnum
		if udmf
			trashnum = mo.spawnpoint.args[0]
		else
			trashnum = mo.spawnpoint.extrainfo
		end
		if not trashnum
			trashnum = P_RandomRange(1, 15)
		end
		if prandom == 1 //Only Rings
			for i = 0, trashnum
				if i != 0
				local ring = P_SPMAngle(mo, MT_FLINGRING, mo.angle)
					if ring
					and ring.valid
					ring.fuse = 8*TICRATE
					P_InstaThrust(ring, ring.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					P_SetObjectMomZ(ring, P_RandomRange(4, 8)*FRACUNIT)
					end
				end
			end
		elseif prandom == 2 //Only Trash
			for i = 0, trashnum
				if i != 0
				local trash = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height/2, MT_BROKENROBOT)
					if trash
					and trash.valid
					trash.state = S_TRASH_RANDOM
					P_InstaThrust(trash, mo.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					P_SetObjectMomZ(trash, P_RandomRange(4, 8)*FRACUNIT)
					end
				end
			end
		elseif prandom == 3 //Only Spiders
			for i = 0, trashnum
				if i != 0
				local spider = P_SPMAngle(mo, MT_ROBOSPIDER, mo.angle+ANGLE_180)
					if spider
					and spider.valid
					P_InstaThrust(spider, spider.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					P_SetObjectMomZ(spider, P_RandomRange(4, 8)*FRACUNIT)
					end
				end
			end
		end
	else
	local prandom = P_RandomRange(1, 3)
	local trashnum = P_RandomRange(1, 15)
		if prandom == 1 //Only Rings
			for i = 0, trashnum
				if i != 0
				local ring = P_SPMAngle(mo, MT_FLINGRING, mo.angle)
					if ring
					and ring.valid
					ring.fuse = 8*TICRATE
					P_InstaThrust(ring, ring.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					P_SetObjectMomZ(ring, P_RandomRange(4, 8)*FRACUNIT)
					end
				end
			end
		elseif prandom == 2 //Only Trash
			for i = 0, trashnum
				if i != 0
				local trash = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height/2, MT_BROKENROBOT)
					if trash
					and trash.valid
					trash.state = S_TRASH_RANDOM
					P_InstaThrust(trash, mo.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					P_SetObjectMomZ(trash, P_RandomRange(4, 8)*FRACUNIT)
					end
				end
			end
		elseif prandom == 3 //Only Spiders
			for i = 0, trashnum
				if i != 0
				local spider = P_SPMAngle(mo, MT_ROBOSPIDER, mo.angle+ANGLE_180)
					if spider
					and spider.valid
					P_InstaThrust(spider, spider.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					P_SetObjectMomZ(spider, P_RandomRange(4, 8)*FRACUNIT)
					end
				end
			end
		end
	end
end

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_RECYCLE_MONITOR
		if not mo.health
			if mo.player_touched == nil
			mo.player_touched = 0
			end
			if (mo.eflags & MFE_JUSTHITFLOOR)
			S_StartSound(mo, sfx_cdfm36)
			end
			if udmf
				if mo.spawnpoint
					mo.spawnpoint.options = $|mo.spawnpoint.args[1]
				end
			end
			if mo.state == S_RECYCLEBIN_POSTDEAD
			mo.rollangle = $1 + 8*ANG1
				if FixedHypot(mo.momx, mo.momy) >= FRACUNIT
				mo.angle = R_PointToAngle2(0, 0, mo.momx, mo.momy)
				end
				//if (mo.eflags & MFE_JUSTHITFLOOR)
				if P_IsObjectOnGround(mo)
				and not (mo.eflags & MFE_JUSTHITFLOOR)
				local drandom = P_RandomRange(1, 2)
					if drandom == 1
					mo.rollangle = ANGLE_90-8*ANG1
					elseif drandom == 2
					mo.rollangle = -ANGLE_90+8*ANG1
					end
				local cap = P_SpawnMobj(mo.x, mo.y, mo.z+2*FRACUNIT, MT_RECYCLE_CAP)
					if cap
					and cap.valid
						if drandom == 1
						cap.rollangle = ANGLE_90-8*ANG1
						elseif drandom == 2
						cap.rollangle = -ANGLE_90+8*ANG1
						end
					P_SetObjectMomZ(cap, P_RandomRange(4, 8)*FRACUNIT)
					P_InstaThrust(cap, P_RandomRange(0, 360)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
					end
				//local prandom = P_RandomRange(1, 2)
				local prandom = 0
					if mo.spawnpoint
					local mt = mo.spawnpoint
						if (mt.options & MTF_EXTRA) //Rings
						prandom = 1
							if (mt.options & MTF_OBJECTSPECIAL) //Trash Combi
							prandom = $1 + 2
							end
							if (mt.options & MTF_AMBUSH) //Spider Combi
							prandom = $1 + 4
							end
						elseif (mt.options & MTF_OBJECTSPECIAL) //Trash
						and not (mt.options & MTF_EXTRA)
						prandom = 2
							if (mt.options & MTF_AMBUSH) //Spider Combi
							prandom = $1 + 4
							end
						elseif (mt.options & MTF_AMBUSH)
						and not (mt.options & MTF_EXTRA)
						and not (mt.options & MTF_OBJECTSPECIAL) //Only Spiders
						prandom = 4
						end
					else
					RandomTrash(mo)
					end
					if mo.spawnpoint
						if prandom == 0
						RandomTrash(mo)
						elseif prandom == 1 //Only Rings
						local ringnum
							if udmf
								ringnum = mo.spawnpoint.args[0]
							else
								ringnum = mo.spawnpoint.extrainfo
							end
							if not ringnum
								ringnum = P_RandomRange(1, 15)
							end
							for i = 0, ringnum
								if i != 0
								local ring = P_SPMAngle(mo, MT_FLINGRING, mo.angle)
									if ring
									and ring.valid
									ring.fuse = 8*TICRATE
									P_InstaThrust(ring, ring.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
									P_SetObjectMomZ(ring, P_RandomRange(4, 8)*FRACUNIT)
									end
								end
							end
						elseif prandom == 2 //Only Trash
						local trashnum
							if udmf
								trashnum = mo.spawnpoint.args[0]
							else
								trashnum = mo.spawnpoint.extrainfo
							end
							if not trashnum
								trashnum = P_RandomRange(1, 15)
							end
							for i = 0, trashnum
								if i != 0
								//local trash = P_SPMAngle(mo, MT_BROKENROBOT, mo.angle)
								local trash = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height/2, MT_BROKENROBOT)
									if trash
									and trash.valid
									trash.state = S_TRASH_RANDOM
									P_InstaThrust(trash, mo.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
									P_SetObjectMomZ(trash, P_RandomRange(4, 8)*FRACUNIT)
									end
								end
							end
						elseif prandom == 4 //Only Spiders
						local spudinum
							if udmf
								spudinum = mo.spawnpoint.args[0]
							else
								spudinum = mo.spawnpoint.extrainfo
							end
							if not spudinum
								spudinum = P_RandomRange(1, 15)
							end
							for i = 0, spudinum
								if i != 0
								local spider = P_SPMAngle(mo, MT_ROBOSPIDER, mo.angle+ANGLE_180)
									if spider
									and spider.valid
									P_InstaThrust(spider, spider.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
									P_SetObjectMomZ(spider, P_RandomRange(4, 8)*FRACUNIT)
									end
								end
							end
						elseif prandom == 3 //Rings + Trash
						local trashnum
							if udmf
								trashnum = mo.spawnpoint.args[0]
							else
								trashnum = mo.spawnpoint.extrainfo
							end
							if not trashnum
								trashnum = P_RandomRange(1, 15)
							end
							for i = 0, trashnum
								if i != 0
								local prandom2 = P_RandomRange(1, 2)
									if prandom2 == 1
									local trash = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height/2, MT_BROKENROBOT)
										if trash
										and trash.valid
										trash.state = S_TRASH_RANDOM
										P_InstaThrust(trash, mo.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(trash, P_RandomRange(4, 8)*FRACUNIT)
										end
									elseif prandom2 == 2
									local ring = P_SPMAngle(mo, MT_FLINGRING, mo.angle)
										if ring
										and ring.valid
										ring.fuse = 8*TICRATE
										P_InstaThrust(ring, ring.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(ring, P_RandomRange(4, 8)*FRACUNIT)
										end
									end
								end
							end
						elseif prandom == 5 //Rings + Spider
						local trashnum
							if udmf
								trashnum = mo.spawnpoint.args[0]
							else
								trashnum = mo.spawnpoint.extrainfo
							end
							if not trashnum
								trashnum = P_RandomRange(1, 15)
							end
							for i = 0, trashnum
								if i != 0
								local prandom2 = P_RandomRange(1, 2)
									if prandom2 == 1
									local spider = P_SPMAngle(mo, MT_ROBOSPIDER, mo.angle+ANGLE_180)
										if spider
										and spider.valid
										P_InstaThrust(spider, spider.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(spider, P_RandomRange(4, 8)*FRACUNIT)
										end
									elseif prandom2 == 2
									local ring = P_SPMAngle(mo, MT_FLINGRING, mo.angle)
										if ring
										and ring.valid
										ring.fuse = 8*TICRATE
										P_InstaThrust(ring, ring.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(ring, P_RandomRange(4, 8)*FRACUNIT)
										end
									end
								end
							end
						elseif prandom == 6 //Trash + Spider
						local trashnum
							if udmf
								trashnum = mo.spawnpoint.args[0]
							else
								trashnum = mo.spawnpoint.extrainfo
							end
							if not trashnum
								trashnum = P_RandomRange(1, 15)
							end
							for i = 0, trashnum
								if i != 0
								local prandom2 = P_RandomRange(1, 2)
									if prandom2 == 1
									local spider = P_SPMAngle(mo, MT_ROBOSPIDER, mo.angle+ANGLE_180)
										if spider
										and spider.valid
										P_InstaThrust(spider, spider.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(spider, P_RandomRange(4, 8)*FRACUNIT)
										end
									elseif prandom2 == 2
									local trash = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height/2, MT_BROKENROBOT)
										if trash
										and trash.valid
										trash.state = S_TRASH_RANDOM
										P_InstaThrust(trash, mo.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(trash, P_RandomRange(4, 8)*FRACUNIT)
										end
									end
								end
							end
						elseif prandom == 7 //Rings + Trash + Spiders
						local trashnum
							if udmf
								trashnum = mo.spawnpoint.args[0]
							else
								trashnum = mo.spawnpoint.extrainfo
							end
							if not trashnum
								trashnum = P_RandomRange(1, 15)
							end
							for i = 0, trashnum
								if i != 0
								local prandom2 = P_RandomRange(1, 3)
									if prandom2 == 1
									local trash = P_SpawnMobj(mo.x, mo.y, mo.z+mo.height/2, MT_BROKENROBOT)
										if trash
										and trash.valid
										trash.state = S_TRASH_RANDOM
										P_InstaThrust(trash, mo.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(trash, P_RandomRange(4, 8)*FRACUNIT)
										end
									elseif prandom2 == 2
									local ring = P_SPMAngle(mo, MT_FLINGRING, mo.angle)
										if ring
										and ring.valid
										ring.fuse = 8*TICRATE
										P_InstaThrust(ring, ring.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(ring, P_RandomRange(4, 8)*FRACUNIT)
										end
									elseif prandom2 == 3
									local spider = P_SPMAngle(mo, MT_ROBOSPIDER, mo.angle+ANGLE_180)
										if spider
										and spider.valid
										P_InstaThrust(spider, spider.angle+P_RandomRange(-10, 10)*ANG1, P_RandomRange(4, 8)*FRACUNIT)
										P_SetObjectMomZ(spider, P_RandomRange(4, 8)*FRACUNIT)
										end
									end
								end
							end
						end
					end
				mo.momx = 0
				mo.momy = 0
				P_SetObjectMomZ(mo, 4*FRACUNIT)
				mo.state = S_RECYCLEBIN_DEAD1
				end
			end
		end
	end
end, MT_RECYCLE_MONITOR)

addHook("MobjDeath", function(mo, inf, source)
local speed = FixedHypot(inf.momx, inf.momy)
local angle = R_PointToAngle2(inf.x, inf.y, mo.x, mo.y)
	if mo
	and mo.valid
	and mo.type == MT_RECYCLE_MONITOR
	mo.flags = $1 & ~MF_SOLID
	S_StartSound(mo, sfx_wbreak)
		if inf
		and inf.valid
		P_MoveOrigin(mo, mo.x, mo.y, mo.z+(FRACUNIT*P_MobjFlip(mo)))
		mo.angle = angle
			if speed < 16*FRACUNIT
			P_SetObjectMomZ(mo, 4*FRACUNIT)
			P_InstaThrust(mo, angle, 16*FRACUNIT)
			else
			P_SetObjectMomZ(mo, speed/4)
			P_InstaThrust(mo, angle, speed)
			end
			if inf.player
			inf.momx = $1 / 2
			inf.momy = $1 / 2
			inf.momz = $1 / 2
			end
		end
		if source
		and source.valid
		and source.player
		mo.player_touched = source
		end
	mo.flags = MF_BOUNCE
	end
end, MT_RECYCLE_MONITOR)

addHook("MobjCollide", function(mo, mo2)
	if mo
	and mo.valid
	and mo.type == MT_RECYCLE_MONITOR
	and mo.health
		if mo2
		and mo2.valid
		and mo2.type == MT_RECYCLE_MONITOR
		and not mo2.health
			if not (mo.z > mo2.z+mo2.height)
			and not (mo2.z > mo.z+mo.height)
			P_KillMobj(mo, mo2, mo2.player_touched)
				if mo2.momz < 0
				mo2.momz = $1 / -2
				else
				mo2.momz = $1 / 2
				end
			P_InstaThrust(mo2, mo2.angle+P_RandomRange(-15, 15)*ANG1, min(FixedHypot(mo2.momx, mo2.momy)/2, 16*FRACUNIT))
			end
		end
	end
end, MT_RECYCLE_MONITOR)

addHook("MobjMoveCollide", function(mo, mo2)
	if mo
	and mo.valid
	and mo.type == MT_RECYCLE_MONITOR
	and mo.state == S_RECYCLEBIN_POSTDEAD
	and not mo.health
		if mo2
		and mo2.valid
		and mo2.health
		and ((mo2.flags & MF_ENEMY) or (mo2.flags & MF_BOSS))
			if not (mo.z > mo2.z+mo2.height)
			and not (mo2.z > mo.z+mo.height)
			P_DamageMobj(mo2, mo.player_touched, mo.player_touched)
				if mo.momz < 0
				mo.momz = $1 * -1
				end
			P_InstaThrust(mo2, mo2.angle+P_RandomRange(-15, 15)*ANG1, min(FixedHypot(mo2.momx, mo2.momy)/2, 16*FRACUNIT))
			end
		end
	end
end, MT_RECYCLE_MONITOR)

addHook("MobjSpawn", function(mo)
mo.fuse = 69
end, MT_RECYCLE_CAP)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_RECYCLE_CAP
	and mo.health
		if mo.momz != 0
		mo.fuse = 4
		mo.rollangle = $1 + FixedAngle(mo.momz)
		end
	end
end, MT_RECYCLE_CAP)

addHook("ShouldDamage", function(mo)
	if mo
	and mo.type == MT_RECYCLE_CAP
	and mo.health
	return false
	end
end, MT_RECYCLE_CAP)

addHook("ShouldDamage", function(mo, inf)
	if mo
	and mo.valid
	and mo.type != MT_RECYCLE_CAP
		if inf
		and inf.type == MT_RECYCLE_CAP
		return false
		end
	end
end)

//Robo-Spiders By Sonic1983
addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_ROBOSPIDER
		if mo.fuse > 0
		and mo.fuse <= 3*TICRATE
			if (mo.fuse % 8) <= 3
			mo.color = SKINCOLOR_PURPLE
			mo.colorized = false
			else
			mo.color = SKINCOLOR_RED
			mo.colorized = true
			end
		end
		if mo.state == S_ROBO_SPIDER_FALL
			if mo.tics == 15
			mo.flags = $1 & ~MF_NOCLIPTHING
			end
			if P_IsObjectOnGround(mo)
			mo.flags = $1 & ~MF_NOCLIPTHING
			mo.state = S_ROBO_SPIDER_STND
			end
		elseif mo.state == S_ROBO_SPIDER_WALK
		A_FaceTarget(mo)
			if FixedHypot(mo.momx, mo.momy) < 8*FRACUNIT
			P_Thrust(mo, mo.angle, 2*FRACUNIT)
			end
			if R_PointToDist2(mo.x, mo.y, mo.target.x, mo.target.y) < 256*FRACUNIT
			and P_IsObjectOnGround(mo)
			P_SetObjectMomZ(mo, 6*FRACUNIT)
			mo.state = S_ROBO_SPIDER_FALL
			S_StartSound(mo, sfx_cdfm02)
			end
		end
	end
end, MT_ROBOSPIDER)

addHook("MobjFuse", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_ROBOSPIDER
	mo.colorized = false
	end
end, MT_ROBOSPIDER)

addHook("MobjDeath", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_ROBOSPIDER
	mo.colorized = false
	end
end, MT_ROBOSPIDER)

addHook("MobjMoveBlocked", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_ROBOSPIDER
	mo.z = $1 + 8*FRACUNIT
	end
end, MT_ROBOSPIDER)

addHook("MobjCollide", function(spider, spider2)
	if spider
	and spider.valid
	and spider.type == MT_ROBOSPIDER
	//and spider.health
		if spider2
		and spider2.valid
		and spider2.type == MT_ROBOSPIDER
		//and spider2.health
		return false
		end
	end
end, MT_ROBOSPIDER)