--can @p1 damage @p2?
--P_TagDamage, P_PlayerHitsPlayer
--takis func

--Thanks for letting me use this Lu xd - Rampage Dude
--Original code from takis mod

local TR = TICRATE

rawset(_G, "CanPlayerHurtPlayer", function(p1,p2,nobs)
	if not (p1 and p1.valid)
	or not (p2 and p2.valid)
		return false
	end
	
	local allowhurt = true
	local ff = CV_FindVar("friendlyfire").value
	if p1 == p2 then //allow self damage
		ff = true
		//print("skip ff check")
	end
	
	if not (nobs)
		--no griefing!
		
		if not (p1.mo and p1.mo.valid)
			return false
		end
		if not (p2.mo and p2.mo.valid)
			return false
		end
		
		if not p1.mo.health
			return false
		end
		if not p2.mo.health
			return false
		end
		
		/*if not p1.phealth
			return false
		end
		if not p2.phealth
			return false
		end*/
		
		if ((p2.powers[pw_flashing])
		or (p2.powers[pw_invulnerability])
		or (p2.powers[pw_super]))
		or (p2.pflags & PF_GODMODE)
			return false
		end
		
		if (leveltime <= CV_FindVar("hidetime").value*TR)
		and (gametyperules & GTR_STARTCOUNTDOWN)
			return false
		end
		
		if (p1.botleader == p2)
			return false
		end
		
	end
	
	--this should already account for all cases
	if (not (ff or gametyperules & GTR_FRIENDLYFIRE)) and (gametyperules & GTR_FRIENDLY)
		allowhurt = false
	end
	
	if G_GametypeHasTeams()
		if (not (ff or gametyperules & GTR_FRIENDLYFIRE)) and (p2.ctfteam == p1.ctfteam)
			allowhurt = false
		end
	end
	
	
	return allowhurt
	
end)

rawset(_G, "CanPlayerHurtPlayerTeam", function(p1,p2,nobs)
	if not (p1 and p1.valid)
	or not (p2 and p2.valid)
		return false
	end
	
	local allowhurt = true
	local ff = 0
	
	if not (nobs)
		--no griefing!		
		if not (p1.mo and p1.mo.valid)
			return false
		end
		if not (p2.mo and p2.mo.valid)
			return false
		end
		
		if not p1.mo.health
			return false
		end
		if not p2.mo.health
			return false
		end
		
		if (leveltime <= CV_FindVar("hidetime").value*TR)
		and (gametyperules & GTR_STARTCOUNTDOWN)
			return false
		end
		
		if (p1.botleader == p2)
			return false
		end
		
	end
	
	--this should already account for all cases
	if (not (ff or gametyperules & GTR_FRIENDLYFIRE)) and (gametyperules & GTR_FRIENDLY)
		allowhurt = false
	end
	
	if G_GametypeHasTeams()
		if (not (ff or gametyperules & GTR_FRIENDLYFIRE)) and (p2.ctfteam == p1.ctfteam)
			allowhurt = false
		end
	end
	
	return allowhurt
	
end)

--lu why is this shit so long lmfao

addHook("ShouldDamage", function(mo, i, s, d, dt) //stjr you fucking cucks
	if not (mo.type == MT_PLAYER and s and s.type == MT_PLAYER) then return end
	return CanPlayerHurtPlayer(s.player, mo.player, 0, 0)
end)