//Spikeball addon for EGG CANYON!

freeslot("MT_PLAYERCHAIN2", "MT_NORMALCHAIN2", "S_PLAYERCHAIN2", "S_NORMALCHAIN2", "MT_EGGCANYON")

mobjinfo[MT_PLAYERCHAIN2] = {
	spawnstate = S_PLAYERCHAIN2,
	deathstate = S_PLAYERCHAIN2,
	speed = 12*FRACUNIT,
	height = 32*FRACUNIT,
	radius = 32*FRACUNIT
}

mobjinfo[MT_NORMALCHAIN2] = {
	spawnstate = S_NORMALCHAIN2,
	height = 10*FRACUNIT,
	radius = 10*FRACUNIT,
	flags = MF_NOCLIPHEIGHT
}

states[S_PLAYERCHAIN2] = {SPR_BMCE, A, 1, nil, 0, 0, S_PLAYERCHAIN2}
states[S_NORMALCHAIN2] = {SPR_SMCH, A, 1, nil, 0, 0, S_NORMALCHAIN2}

local chain

local targett

local distt = 1400<<FRACBITS

local crings = {}

local ccount = 0

local function initCombiLoop()
	ccount = 0
end

local function drawCombiRing(x,y,z)
	ccount = $1+1
	if crings[ccount] and crings[ccount].valid then
	      P_TeleportMove(crings[ccount], x, y, z)
    else
		crings[ccount] = P_SpawnMobj(x, y, z, MT_NORMALCHAIN2)
		crings[ccount].scale = FRACUNIT
	end
	crings[ccount].fuse = 2
end

local function attachPlayers(chain)
 for player in players.iterate
	-- Draw combi rings
	for i=1,7 do
	if chain.tracer.valid
	and chain.tracer ~= nil
		drawCombiRing(
			chain.tracer.x+(chain.x-chain.tracer.x)*i/8,
			chain.tracer.y+(chain.y-chain.tracer.y)*i/8,
			chain.tracer.z+(chain.z-chain.tracer.z)*i/8
		)
	end
	end
 end
end
addHook("MobjThinker", attachPlayers, MT_PLAYERCHAIN2)

addHook("MobjThinker", function(chain)
   local factor = FRACUNIT>>7
   if chain.valid
   and chain.goingto == nil
   chain.goingto = false
   end
   if chain.valid
   and chain.goingto == true
   and (R_PointToDist2(chain.x, chain.y, chain.tracer.x, chain.tracer.y)>= 70*FRACUNIT or abs(chain.z - chain.tracer.z)>= 70*FRACUNIT)
   local xdist = chain.tracer.x-chain.x
		xdist = FixedMul($1, factor)
		
		local ydist = chain.tracer.y-chain.y
		ydist = FixedMul($1, factor)
		
		local zdist = chain.tracer.z-chain.z
		zdist = FixedMul($1, factor)
   chain.momx = $1+xdist
   chain.momy = $1+ydist
   chain.momz = $1+zdist
   end
   if chain.valid
   and chain.tracer
   and not chain.tracer.player
   and chain.tracer.health == 0
   P_RemoveMobj(chain)
   end
end, MT_PLAYERCHAIN2)

addHook("MobjThinker", function(buzz)
   if buzz and leveltime == 4*TICRATE
   or ((gametype == 1) and buzz and leveltime == 5*TICRATE)
   local chainy = P_SpawnMobj(buzz.x, buzz.y, buzz.z, MT_PLAYERCHAIN2)
   chainy.scale = FRACUNIT/2
   chainy.tracer = buzz
   buzz.tracer = chainy
   chainy.goingto = true
   end
end, MT_EGGCANYON)

addHook("MobjMoveCollide", function(chain, targett)
		if targett and chain.valid
		and chain.tracer
		and not chain.tracer.player
		and targett.player
		and P_AproxDistance(P_AproxDistance(chain.tracer.x-chain.x, chain.tracer.y-chain.y) ,chain.tracer.z-chain.z) < distt
		and abs(chain.z - targett.z)<= targett.height
		and (targett.type == MT_PLAYER)
		P_DamageMobj(targett)
		end
end, MT_PLAYERCHAIN2)