actor ScrapHook : BasicMapProp 18831
{
	//$Category MMQG-Props
	+NOINTERACTION
	+NOGRAVITY
	height 16
	radius 8
	scale 2.0
	States
	{
		Spawn:
			SCHK A -1
			stop
	}
}

actor ScrapMag : Magfly 18856
{
//$Category MMQG-Props
//$Arg0 Moving?
//$Arg0Enum { 0 = "Yes"; 1 = "No"; }
//$Arg0Type 11
//$Arg1 Movement Speed
+SOLID
+NOGRAVITY
+CANPASS
+ACTIVATEPCROSS
+ACTIVATEMCROSS
height 64
radius 32
scale 2.5
States
{
Spawn:
MAGS A 0
MAGS A 0 ACS_NamedExecuteAlways("core_stickyLifts",0,STICKYMODE_MAGFLY)
MAGS A 0 A_JumpIf(Args[0] > 0, "SpeedCheck")
Goto Spawn2
Spawn2:
MAGS AB 3 A_SpawnItemEx("MagParticleSpawner", 0, 0, -(z-floorz), momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
loop
SpeedCheck:
MAGS A 0 A_JumpIf(Args[1] <= 0, "Move1")
Goto Move2
Move1:
MAGS AB 3 A_SpawnItemEx("MagParticleSpawner", 0, 0, -(z-floorz), momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
MAGS A 0 A_Stop
MAGS A 0 A_Recoil(-5)
Loop
Move2:
MAGS AB 3 A_SpawnItemEx("MagParticleSpawner", 0, 0, -(z-floorz), momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
MAGS A 0 A_Stop
MAGS A 0 A_Recoil(-Args[1])
Loop
}
}

const int HOOK_CHAIN_HEIGHT = 170; // chain sprite height * scaleY
const int HOOK_END_HEIGHT = 112; // hook sprite height * scaleY
actor "A Lifting Hook" : BasicMapProp {
	mass 0 +NOINTERACTION +NOGRAVITY states {
		spawn: TNT1 A 35
			loop
		start:
			TNT1 A 0 A_SpawnItemEx("__A Lifting Hook",0,0,0, 0,mass,damage, 0, SXF_ABSOLUTEVELOCITY)
			TNT1 A -1
			loop}}
			
			
actor "__A Lifting Hook" : BasicMapProp {
	renderstyle "translucent" args 0,0
	var int user_hang;	var int user_start; var int user_carriedPlayer; 
	var int user_retractSpeed; var int user_hookHeight;
	+MISSILE +NOINTERACTION +NOGRAVITY states {
		spawn: 
			TNT1 A 1 nodelay A_RearrangePointers(AAPTR_NULL,AAPTR_TARGET,AAPTR_NULL)
			TNT1 A 0 A_SetArg(1,velz)
			TNT1 A 0 A_SetUserVar(user_retractSpeed, vely>>8)
			TNT1 A 0 A_SetUserVar(user_hookHeight,HOOK_END_HEIGHT)
			TNT1 A 0 A_SetMass(vely&0xFF)
			TNT1 A 0 A_Stop
			TNT1 A 0 A_SetArg(0,HOOK_END_HEIGHT)
		generateChain:
			TNT1 A 0 A_JumpIf(args[0] < args[1], 1)
				goto chainDone
			TNT1 A 0 A_SpawnItemEx("A Lifting Hook Chain",0,0,0, 0,0,0, 0, SXF_TRANSFERSPECIAL)
			TNT1 A 0 A_SetArg(0,args[0]+HOOK_CHAIN_HEIGHT)
			goto generateChain
		chainDone:
			TNT1 A 0 A_SetUserVar(user_hang, -args[1])
			TNT1 A 0 A_SetUserVar(user_start, user_hang)
			HOOK A 0 A_SpawnItemEx("A Lifting Hook Contact")
			TNT1 A 0 A_ChangeFlag("MISSILE", false)
		check:
			HOOK A 0 A_Warp(AAPTR_MASTER,0,0,user_hang,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			HOOK A 0 ACS_NamedExecuteWithResult("__Lifting Hook",1) // velocity sync
			HOOK A 0 A_JumpIfInventory("Once", 1, "caught")
			goto idle
		caught: 
			TNT1 A 0 A_SpawnItemEx("MagParticle", random(-3, 3)<<4, random(-3, 3)<<4, -8,velx, vely, 16, 0, SXF_ABSOLUTEMOMENTUM)
		idle:
			HOOK B 1
			goto check}}
			
actor "A Lifting Hook Chain" : basicwatcher { renderstyle normal scale 2.5
	states { 
		spawn: TNT1 A 0 A_SetArg(1,args[1]-args[0]-HOOK_END_HEIGHT)
		action: TNT1 A 69 A_JumpIf(true,1) loop
			HOOK B 0 A_Warp(AAPTR_TARGET,0,0,args[0],0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetArg(2,z)
		idle:
			HOOK A 1
			HOOK B 0 A_Warp(AAPTR_TARGET,0,0,args[0],0,WARPF_NOCHECKPOSITION)
			HOOK B 0 A_JumpIf((z-args[2]) <= args[1], "idle")
			HOOK A 69 A_JumpIf(true, "retracted")
			goto idle
		retracted:
			TNT1 A 1
			TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,args[0],0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIf((z-args[2]) > args[1], "retracted")
			TNT1 A 69 A_JumpIf(true, "idle")
			goto retracted}}
			
actor "A Lifting Hook Contact" : BasicProjectile {  -USESPAWNEVENTSCRIPT
	+HITTRACER +SKYEXPLODE +DONTBLAST +DONTREFLECT
	radius 40 height 80 DAMAGE (0) states { 	
	spawn:
		TNT1 A 0
		TNT1 A 0 A_changeflag("MISSILE", true)
	warp:
		TNT1 A 1 A_Warp(AAPTR_TARGET,0,0,0,0,WARPF_NOCHECKPOSITION)
		loop
	death: TNT1 A 0
		goto afterHit
	xdeath: crash:
		TNT1 A 0 A_JumpIfInTargetInventory("Once", 1, "afterHit")
		TNT1 A 0 ACS_NamedExecuteWithResult("__Lifting Hook") 
	afterHit: TNT1 A 1
		goto spawn}}
		
actor "A Lifting Hook CD" : powerup { powerup.duration 12 }