if not P_SetOrigin then
    rawset(_G, "P_SetOrigin", P_TeleportMove)
end
if not P_MoveOrigin then
    rawset(_G, "P_MoveOrigin", P_TeleportMove)
end
local function CobaltEnemyLook(player) 
	local twod = (twodlevel or player.mo.flags2 & MF2_TWOD)
	local ringdist, span
	--if not(twod)
		ringdist = 300*FRACUNIT
		span = FixedAngle(45*FRACUNIT)
	--else
		--ringdist = 100*FRACUNIT
		--span = ANG20
	--end

	local maxdist = FixedMul(ringdist, player.mo.scale)
	local closestdist = 0
	local closestmo = nil
	local nonenemiesdisregard = MF_SPRING
	searchBlockmap("objects",function(pmo,mo)
		if (mo.flags & MF_NOCLIPTHING) return end
		if (mo.health <= 0) return end -- dead

		if not(mo.player)
		--and (!((mo.flags & (MF_ENEMY|MF_BOSS|MF_MONITOR)
		--and (mo.flags & MF_SHOOTABLE)) or (mo.flags & MF_SPRING)) == !(mo.flags2 & MF2_INVERTAIMABLE)) -- allows if it has the flags desired XOR it has the invert aimable flag
			return -- not a valid target
		end
		//CTF monitor 
		--if mo.type == MT_RING_REDBOX and not(G_GametypeHasTeams() and player.ctfteam == 1) then return end
		--if mo.type == MT_RING_BLUEBOX and not(G_GametypeHasTeams() and player.ctfteam == 2) then return end

		if (mo == pmo) return end


		//Do angle/distance checks
		local zdist = (pmo.z + pmo.height/2) - (mo.z + mo.height/2)
		local dist = P_AproxDistance(pmo.x-mo.x, pmo.y-mo.y)
		//CBW: 	Made the angle checks their own locals, for readability purposes
		//		I also unsigned the angle checks, which appears to correct failed OutOfBounds checks above the player.
		local xyz_angle = abs(R_PointToAngle2(0, 0, dist, zdist))
		local xy_angle = abs(R_PointToAngle2(
				pmo.x + P_ReturnThrustX(pmo, pmo.angle, pmo.radius),
				pmo.y + P_ReturnThrustY(pmo, pmo.angle, pmo.radius),
				mo.x, mo.y
			) - pmo.angle)
			
			
		dist = P_AproxDistance(dist, zdist)
		if (dist > maxdist)
			return -- out of range
		end
		if (xyz_angle > span)
			return -- Don't home outside of desired angle!
		end


		if (twod
		and abs(pmo.y-mo.y) > pmo.radius)
			return -- not in your 2d plane
		end

		if ((closestmo and closestmo.valid) and (dist > closestdist))
			return
		end
		if (xy_angle > span)
			return -- behind back
		end

		if not (P_CheckSight(pmo, mo))
			return -- out of sight
		end

		closestmo = mo
		closestdist = dist
	end,player.mo,player.mo.x-maxdist,player.mo.x+maxdist,player.mo.y-maxdist,player.mo.y+maxdist)
	return closestmo
end
local ammount = -12*FRACUNIT
local invtimer_max = 60*TICRATE
local jumptimer_max = 35*TICRATE
local speedtimer_max = 30*TICRATE
local cheertimer_max = 10*TICRATE
local cheerduration = 5*TICRATE
local function NewElfrideVars()
  return {
	doublejump = 0,
	hovertime = 0,
	thokked = false,
	speedcooldown = speedtimer_max,
	jumpcooldown = jumptimer_max,
	invcooldown = invtimer_max,
	cheercooldown = cheertimer_max,
	jumpboost = 0,
	hadjump = false,
	cheerdur = 0,
	xoffset = 0,
	livesenabled = false,
	fakerngnum = 0,
	twist = 0,
	sparkletime = 0,
	elf = 0,
	lastrings = 0
  }
end
addHook("PreThinkFrame", function(aeeaaeaeea)
	for p in players.iterate
		if p.mo and p.mo.valid
			if p.elfride == nil
				p.elfride = NewElfrideVars()
			end
		else
			p.elfride = nil
		end
	end
end)
addHook("PlayerSpawn", function(p)
	if p.mo and p.mo.valid
		p.elfride = NewElfrideVars()
	else
		p.elfride = nil
	end
end)
local function SpawnCircle(x, y, z, mobjtype, orientation, number, scale, dist, origin, special, below)
	for i = 1, number
		local m = P_SpawnMobj(0, 0, 0, mobjtype)
		m.ang = FixedAngle((360*FRACUNIT)/number)
		--m.ori = orientation
		m.target = origin
		m.i = i
		m.scale = scale
		m.special = special
		m.orientation = orientation
		m.dist = dist
		m.below = below
		m.color = m.target.color --SKINCOLOR_EMERALD + (leveltime % 3)
		m.blendmode = AST_ADD
		m.life = 15
		P_SetOrigin(m, x+P_ReturnThrustX(m, m.ang*i+orientation, dist), y+P_ReturnThrustY(m, m.ang*i+orientation, dist), z)
	end
end
addHook("MobjThinker", function(mo)
	if mo and mo.valid and mo.health and mo.target and mo.target.valid and mo.target.health
		local x = mo.target.x
		local y = mo.target.y
		local z = mo.target.z
		local i = mo.i
		local dist = mo.dist
		local orientation = mo.orientation
		mo.life = $-1
		mo.dur = $ or 1
		mo.dur = $+1
		mo.dist = $+mo.target.scale+(mo.life*mo.target.scale/4)
		mo.below = $-mo.target.scale+(max(0, mo.dur*mo.target.scale/3))
		if P_MobjFlip(mo.target) == 1
			if mo.special
				mo.below = $-mo.target.scale+(max(0, mo.dur*mo.target.scale/3))
				P_MoveOrigin(mo, x+P_ReturnThrustX(mo, mo.ang*i+orientation, dist), y+P_ReturnThrustY(mo, mo.ang*i+orientation, dist), z+mo.target.height+(mo.below*-1))
			else
				P_MoveOrigin(mo, x+P_ReturnThrustX(mo, mo.ang*i+orientation, dist), y+P_ReturnThrustY(mo, mo.ang*i+orientation, dist), z+mo.below)
			end
		else
			if mo.special
				mo.below = $-mo.target.scale+(max(0, mo.dur*mo.target.scale/3))
				P_MoveOrigin(mo, x+P_ReturnThrustX(mo, mo.ang*i+orientation, dist), y+P_ReturnThrustY(mo, mo.ang*i+orientation, dist), z+(mo.below))
			else
				P_MoveOrigin(mo, x+P_ReturnThrustX(mo, mo.ang*i+orientation, dist), y+P_ReturnThrustY(mo, mo.ang*i+orientation, dist), z+mo.below*-1+mo.target.height)
			end
		end
	end
end, MT_ELFILIN_SPARKLE)
--P_TeleportMove(p.mo, p.mo.x+P_ReturnThrustX(p.mo, p.drawangle, ammount), p.mo.y+P_ReturnThrustY(p.mo, p.drawangle, ammount), p.mo.z+45*p.mo.scale)
addHook("ThinkFrame", function(ae)
	for p in players.iterate
		if p.mo and p.mo.health and p.mo.valid
			if p.mo.skin == "elfilin" and p.elfilin
				local found = CobaltEnemyLook(p)
				local ride = p.elfilin.ridingplayer
				if found and found.valid and found.health and found.player and found.skin != "elfilin" and not (ride and ride.valid and ride.health)
					P_SpawnLockOn(p, found, S_LOCKON1)
				end
				if (p.cmd.buttons & BT_CUSTOM1) and not (p.elfilin.c1down)
					if ride and ride.valid and ride.health
						p.elfilin.ridingplayer = 0
						p.mo.flags = $&~MF_NOCLIP&~MF_NOCLIPHEIGHT&~MF_NOCLIPTHING
						p.mo.state = S_PLAY_FALL
					elseif found and found.valid and found.health and found.player and not (found.player.elfride and found.player.elfride.elf and found.player.elfride.elf.valid) and found.skin != "elfilin"
						p.elfilin.ridingplayer = found
					end
				end
				local ride = p.elfilin.ridingplayer --update it because game stupid
				if ride
					if ride and ride.valid and ride.health and ride.skin != "elfilin"
						local ridex = ride.x+P_ReturnThrustX(p.mo, ride.player.drawangle, ammount)
						local ridey = ride.y+P_ReturnThrustY(p.mo, ride.player.drawangle, ammount)
						if P_TryMove(p.mo, ridex, ridey) then -- Check the movement, see if it's valid.
							if P_MobjFlip(p.mo) == 1
								P_MoveOrigin(p.mo, ridex, ridey, 
								ride.z+ride.height-ride.height/5)
							else
								P_MoveOrigin(p.mo, ridex, ridey, 
								ride.z-ride.height+p.mo.height+ride.height/5)		
							end
						else -- If it's not, set your x/y position to that of your player you're riding!
							if P_MobjFlip(p.mo) == 1
								P_MoveOrigin(p.mo, ride.x, ride.y,
								ride.z+ride.height-ride.height/5)
							else
								P_MoveOrigin(p.mo, ride.x, ride.y,
								ride.z-ride.height+p.mo.height+ride.height/5)							
							end
						end
						if p.mo.state != S_PLAY_ELFILIN_RIDE
							p.mo.state = S_PLAY_ELFILIN_RIDE
						end
						if S_SoundPlaying(p.mo, sfx_s3k4a)
							S_StopSoundByID(p.mo, sfx_s3k4a)
						end
						if ride.player.starpostnum > p.starpostnum
							p.starpostnum = ride.player.starpostnum
							p.starpostx = ride.player.starpostx
							p.starposty = ride.player.starposty
							p.starpostz = ride.player.starpostz
							p.starposttime = ride.player.starposttime
							p.starpostangle = ride.player.starpostangle
							p.starpostscale = ride.player.starpostscale
						end
						if p.powers[pw_super]
							ride.player.powers[pw_sneakers] = max($, TICRATE)
							ride.player.powers[pw_invulnerability] = max($, TICRATE)
							ride.player.elfride.jumpboost = max($, TICRATE)
							if ride.player.powers[pw_super]
								ride.player.elfride.thokked = false
							end
						end
						p.mo.flags = $|MF_NOCLIPTHING -- Don't collide with other objects while riding
						p.mo.momx = 0
						p.mo.momy = 0
						p.mo.momz = 0
						p.powers[pw_underwater] = underwatertics
						ride.player.powers[pw_underwater] = underwatertics
						p.powers[pw_spacetime] = spacetimetics
						ride.player.powers[pw_spacetime] = spacetimetics
						p.powers[pw_carry] = CR_NONE
						ride.player.elfride.elf = p.mo
						if (p.cmd.buttons & BT_CUSTOM2) and ride.player.bot --debug
							P_DoJump(ride.player, true)
							ride.player.pflags = $&~PF_STARTJUMP
						end
						if (ride.player.elfioset and ride.player.elfioset == 1)
							if (p.cmd.forwardmove > 40)
								if ride.player.elfride.speedcooldown == speedtimer_max
									ride.player.powers[pw_sneakers] = 20*TICRATE
									S_StartSound(ride, sfx_cdfm57)
									ride.player.elfride.speedcooldown = 1
								end
							end
							if (p.cmd.forwardmove < -40)
								if ride.player.elfride.invcooldown == invtimer_max
									ride.player.powers[pw_invulnerability] = 20*TICRATE
									S_StartSound(ride, sfx_cdpcm9)
									ride.player.elfride.invcooldown = 1
								end
							end
							if (p.cmd.sidemove > 40)
								if ride.player.elfride.jumpcooldown == jumptimer_max
									--print("temp")
									ride.player.elfride.jumpboost = 20*TICRATE
									S_StartSound(ride, sfx_cdfm60)
									ride.player.elfride.jumpcooldown = 1
								end
							end
							if (p.cmd.sidemove < -40)
								if ride.player.elfride.cheercooldown == cheertimer_max
									--print("yay you did it or something")
									ride.player.elfride.cheerdur = cheerduration
									if not (leveltime % 256 == 0) --weird bug
										ride.player.elfride.fakerngnum = (leveltime % 50)+1
										p.elfilin.voicenum = $+1+(leveltime % 1)
										if p.elfilin.voicenum > 5
											p.elfilin.voicenum = 0
										end
										S_StartSound(p.mo, sfx_elf_1+p.elfilin.voicenum)
									else --reset
										ride.player.elfride.fakerngnum = -1
										S_StartSound(p.mo, sfx_elf_7)
									end
									ride.player.elfride.xoffset = 0
									ride.player.elfride.cheercooldown = 1
								end
							end
							if (p.cmd.buttons & BT_JUMP) and not (p.elfilin.jumpdownmp) and (ride.player.pflags & PF_JUMPED or ride.player.pflags & PF_THOKKED) and not (ride.player.elfride.thokked)
								ride.player.pflags = $&~PF_STARTJUMP
								ride.player.elfride.doublejump = 15
								ride.player.elfride.thokked = true
							end
							local below = -5*ride.scale
							if (p.cmd.buttons & BT_SPIN) --and (ride.player.pflags & PF_JUMPED)
								if ride.momz*P_MobjFlip(ride) <= -5*ride.scale
									P_SetObjectMomZ(ride, -5*p.mo.scale, false)
								end
								ride.player.elfride.twist = $+FixedAngle(8*FRACUNIT)
								if leveltime % 3 == 0
									SpawnCircle(ride.x, 
									ride.y, 
									ride.z+below, 
									MT_ELFILIN_SPARKLE, 
									ride.player.elfride.twist, 
									3, 
									p.mo.scale/4, 
									10*p.mo.scale, 
									ride, 
									false,
									below)
								end
								if not (ride.player.elfride.sparkletime)
									local ghost = P_SpawnGhostMobj(ride)
									ghost.destscale = 0
									ghost.tics = 4
									ghost.blendmode = AST_ADD
								end
							end
						end
						if ride.player.elfride.lastrings < ride.player.rings
							p.rings = $+(ride.player.rings-ride.player.elfride.lastrings)
						end
						p.drawangle = ride.player.drawangle--R_PointToAngle2(p.mo.x, p.mo.y, ride.x, ride.y)
						if p.followmobj and p.followmobj.valid
							p.followmobj.angle = ride.player.drawangle
						end
						--p.cmd.forwardmove = 0
						--p.cmd.sidemove = 0
						--p.cmd.buttons = $&~BT_SPIN&~BT_JUMP
					else
						p.elfilin.ridingplayer = 0
						p.mo.flags = $ & ~MF_NOCLIPTHING&~MF_NOCLIP&~MF_NOCLIPHEIGHT
						P_ResetPlayer(p)
						p.mo.state = S_PLAY_FALL
					end
				end
				p.elfilin.c1down = (p.cmd.buttons & BT_CUSTOM1)
				p.elfilin.jumpdownmp = (p.cmd.buttons & BT_JUMP)
				p.elfilin.spindownmp = (p.cmd.buttons & BT_SPIN)
			end
		end
	end
end)
addHook("PostThinkFrame", do
	for p in players.iterate
		if p and p.mo and p.mo.valid and p.mo.health and p.elfride 
			p.elfride.lastrings = p.rings
		end
	end
end)
addHook("PlayerThink", function(p)
	if p.mo and p.mo.valid and p.mo.health
		--print(p.cmd.forwardmove)
		if P_IsObjectOnGround(p.mo) or (p.mo.eflags & MFE_JUSTHITFLOOR)
			p.elfride.thokked = false
			p.elfride.hovertime = TICRATE*3
			p.elfride.doublejump = 0
		end
		if (p.elfride.jumpboost > 0)
			if p.elfride.jumpboost % 5 == 0
				local arrow = P_SpawnMobjFromMobj(p.mo, P_RandomRange(30, -30)*p.mo.scale, P_RandomRange(30, -30)*p.mo.scale, p.mo.height/2+P_RandomRange(30, -30)*p.mo.scale, MT_JUMPBOOSTARROW)
				P_SetObjectMomZ(arrow, 3*FRACUNIT, false)
				arrow.fuse = 20
				arrow.destscale = 0
				arrow.scalespeed = $/2
			end
			if (p.pflags & PF_JUMPED) and not (p.elfride.hadjump)
				p.mo.momz = $+$/2
			end
			p.elfride.jumpboost = $-1
		else
			p.elfride.jumpcooldown = min($+1, jumptimer_max)
		end
		if (p.elfride.cheerdur >= cheerduration-4)
			p.elfride.xoffset = $+51*FRACUNIT+FRACUNIT/3-FRACUNIT/7
		elseif p.elfride.cheerdur <= 4
			p.elfride.xoffset = $-51*FRACUNIT+FRACUNIT/3-FRACUNIT/7
		end
		p.elfride.cheerdur = max ($-1, 0)
		if not (p.powers[pw_sneakers])
			p.elfride.speedcooldown = min($+1, speedtimer_max)
		end
		if not (p.powers[pw_invulnerability])
			p.elfride.invcooldown = min($+1, invtimer_max)
		end
		p.elfride.cheercooldown = min($+1, cheertimer_max)
		p.elfride.hadjump = (p.pflags & PF_JUMPED)
		if (p.mo.eflags & MFE_JUSTHITFLOOR)
			p.elfride.hadjump = false
		end
		if not (p.elfride.elf and p.elfride.elf.valid and p.elfride.elf.health and p.elfride.elf.player.elfilin.ridingplayer == p.mo)
			--print(p.elfride.elf)
			p.elfride.elf = 0
			return
		end
		--print(leveltime)
		if (p.elfride.doublejump > 0)
			--print(leveltime)
			if P_MobjFlip(p.mo) == 1
				p.mo.momz = max($, 0)
			else
				p.mo.momz = min($, 0)
			end
			p.elfride.sparkletime = 14
			P_SetObjectMomZ(p.mo, FRACUNIT+FRACUNIT/2, true)
			if (p.elfride.elf.player.cmd.buttons & BT_JUMP)
				p.elfride.doublejump = $-1
			else
				p.elfride.doublejump = 0
				p.mo.momz = $/2
			end
		end
		local below = 0
		if (p.elfride.sparkletime > 0)
			local ghost = P_SpawnGhostMobj(p.mo)
			ghost.destscale = 0
			ghost.tics = 4
			ghost.blendmode = AST_ADD
			if p.elfride.sparkletime > 7
				if leveltime % 2 == 0
					p.elfride.twist = $+FixedAngle(24*FRACUNIT)
					SpawnCircle(p.mo.x, 
					p.mo.y, 
					p.mo.z, 
					MT_ELFILIN_SPARKLE, 
					p.elfride.twist, 
					3, 
					p.mo.scale/4, 
					10*p.mo.scale, 
					p.mo, 
					true,
					0)
				end
			else
				if leveltime % 3 == 0
					p.elfride.twist = $+FixedAngle(24*FRACUNIT)
					SpawnCircle(p.mo.x, 
					p.mo.y, 
					p.mo.z, 
					MT_ELFILIN_SPARKLE, 
					p.elfride.twist, 
					3, 
					p.mo.scale/4, 
					10*p.mo.scale, 
					p.mo, 
					true,
					0)
				end					
			end
			p.elfride.sparkletime = $-1
		end
	end
end)
--258, 63
local centerx = 265*FRACUNIT
local centery = 53*FRACUNIT
--local x = 160*FRACUNIT
--local y = 100*FRACUNIT
local offset = 30*FRACUNIT
local function isfull(num)
	if num == 20
		return 1
	else
		return 2
	end
end
local function GetBoxScaleFM(mobj, kind, invert)
	local ng
	local fmbm
	if invert == true
		ng = -1
	else
		ng = 1
	end
	if kind == 1
		fmbm = mobj.player.cmd.forwardmove
	elseif kind == 2
		fmbm = mobj.player.cmd.sidemove
	end
	if fmbm*ng > 40
		return FRACUNIT+FRACUNIT/9
	else
		return FRACUNIT
	end
end
local function DrawCheer(v, x, y, var, color, special, scale)
	v.drawScaled(x, y, scale, v.cachePatch("cherbg1"), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_70TRANS)
	v.drawScaled(x, y, scale, v.cachePatch("cherbg2"), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_30TRANS)
	if not special
		v.drawScaled(x, y, scale, v.cachePatch("cheer" .. var), V_SNAPTOBOTTOM|V_SNAPTOLEFT, v.getColormap(TC_DEFAULT, color))
		if g_elfilinoverlaycolors[color]
			v.drawScaled(x, y, scale, v.cachePatch("chear"), V_SNAPTOBOTTOM|V_SNAPTOLEFT, v.getColormap(TC_DEFAULT, g_elfilinoverlaycolors[color]))
		else
			v.drawScaled(x, y, scale, v.cachePatch("chear"), V_SNAPTOBOTTOM|V_SNAPTOLEFT, v.getColormap(TC_DEFAULT, ColorOpposite(color)))
		end
	else
		v.drawScaled(x, y, scale, v.cachePatch("cheer3d"), V_SNAPTOBOTTOM|V_SNAPTOLEFT)
	end
end
hud.add(function(v, player, cam)
	if player.mo and player.mo.valid and player.mo.health and ((player.mo.skin == "elfilin" and player.elfilin and player.elfilin.ridingplayer) or (player.elfride and player.elfride.elf))
		local num 
		local elf
		local ride
		local scale
		local full
		local x
		local y
		if player.mo.skin == "elfilin"
			if not player.elfilin then return end
			elf = player.mo
			ride = player.elfilin.ridingplayer
		else
			elf = player.elfride.elf
			ride = player.mo
		end
		if not (ride and ride.valid) then return end
		if not (elf and elf.valid) then return end
		if (ride.player.elfioset and ride.player.elfioset == 1)
			num = ease.linear((ride.player.elfride.speedcooldown*FRACUNIT)/speedtimer_max, 1, 20)
			v.drawScaled(centerx, centery-offset, FRACUNIT, v.cachePatch("elfbar" .. num), V_SNAPTOTOP|V_SNAPTORIGHT)
			v.drawScaled(centerx, centery-offset, GetBoxScaleFM(elf, 1, false), v.cachePatch("elspd" .. isfull(num)), V_SNAPTOTOP|V_SNAPTORIGHT)

			num = ease.linear((ride.player.elfride.invcooldown*FRACUNIT)/invtimer_max, 1, 20)
			v.drawScaled(centerx, centery+offset, FRACUNIT, v.cachePatch("elfbar" .. num), V_SNAPTOTOP|V_SNAPTORIGHT)
			v.drawScaled(centerx, centery+offset, GetBoxScaleFM(elf, 1, true), v.cachePatch("elinv" .. isfull(num)), V_SNAPTOTOP|V_SNAPTORIGHT)
			
			num = ease.linear((ride.player.elfride.jumpcooldown*FRACUNIT)/jumptimer_max, 1, 20)
			v.drawScaled(centerx+offset, centery, FRACUNIT, v.cachePatch("elfbar" .. num), V_SNAPTOTOP|V_SNAPTORIGHT)
			v.drawScaled(centerx+offset, centery, GetBoxScaleFM(elf, 2, false), v.cachePatch("eljmp" .. isfull(num)), V_SNAPTOTOP|V_SNAPTORIGHT)
			
			num = ease.linear((ride.player.elfride.cheercooldown*FRACUNIT)/cheertimer_max, 1, 20)
			v.drawScaled(centerx-offset, centery, FRACUNIT, v.cachePatch("elfbar" .. num), V_SNAPTOTOP|V_SNAPTORIGHT)
			v.drawScaled(centerx-offset, centery, GetBoxScaleFM(elf, 2, true), v.cachePatch("eldia" .. isfull(num)), V_SNAPTOTOP|V_SNAPTORIGHT)
			--add 51 over 5 frames
			--157 = y
			--25*FRACUNIT+FRACUNIT/2
			local patch = v.cachePatch("cheer1")
			if ride.player.elfride.cheerdur > 0
				if ride.player.elfride.fakerngnum == -1
					DrawCheer(v, -(patch.width)*FRACUNIT+ride.player.elfride.xoffset, 175*FRACUNIT, 1, elf.color, true, FRACUNIT/2+FRACUNIT/4)
				else
					DrawCheer(v, -(patch.width)*FRACUNIT+ride.player.elfride.xoffset, 175*FRACUNIT, ride.player.elfride.fakerngnum, elf.color, false, FRACUNIT/2+FRACUNIT/4)
				end
				if hud.enabled("lives") and ride.player.elfride.cheerdur <= cheerduration-2
					hud.disable("lives")
					ride.player.elfride.livesenabled = true
				end
				if ride.player.elfride.cheerdur == 1 and ride.player.elfride.livesenabled == true
					hud.enable("lives")
				end
			end
		elseif player != ride.player
			v.drawString(270, 15, ride.player.name, V_SNAPTORIGHT|V_SNAPTOTOP|V_YELLOWMAP|V_30TRANS , "small-center")
			v.drawString(270, 20, "has elfilin", V_SNAPTORIGHT|V_SNAPTOTOP|V_AQUAMAP|V_30TRANS , "small-center")
			v.drawString(270, 25, "assist turned off.", V_SNAPTORIGHT|V_SNAPTOTOP|V_AQUAMAP|V_30TRANS , "small-center")
			/*v.drawString(160, 175, ride.player.name, V_SNAPTOBOTTOM|V_YELLOWMAP|V_30TRANS , "small-center")
			v.drawString(160, 180, "has elfilin", V_SNAPTOBOTTOM|V_AQUAMAP|V_30TRANS , "small-center")
			v.drawString(160, 185, "assist turned off.", V_SNAPTOBOTTOM|V_AQUAMAP|V_30TRANS , "small-center")*/
		end
	end
end, "game")
addHook("ShouldDamage", function(mo, inf, src, dmg, dmgt)
    if not (mo and (mo.skin == "elfilin") and mo.player) return end
	if not (mo.player.elfilin and mo.player.elfilin.ridingplayer and mo.player.elfilin.ridingplayer.valid and mo.player.elfilin.ridingplayer.health) return end
	return false
end, MT_PLAYER)