Hook.Add("item.applyTreatment", "NT.itemused", function(item, usingCharacter, targetCharacter, limb)
	if -- invalid use, dont do anything
		item == nil
		or usingCharacter == nil
		or targetCharacter == nil
		or limb == nil
	then
		return
	end

	local identifier = item.Prefab.Identifier.Value

	local methodtorun = NT.ItemMethods[identifier] -- get the function associated with the identifier
	if methodtorun ~= nil then
		-- run said function
		methodtorun(item, usingCharacter, targetCharacter, limb)
		return
	end

	-- startswith functions
	for key, value in pairs(NT.ItemStartsWithMethods) do
		if HF.StartsWith(identifier, key) then
			value(item, usingCharacter, targetCharacter, limb)
			return
		end
	end
end)
-- TODO: some items trigger afflictions after a single human update, to fix, trigger them immediately for consistency
-- storing all of the item-specific functions in a table
NT.ItemMethods = {} -- with the identifier as the key
NT.ItemStartsWithMethods = {} -- with the start of the identifier as the key

-- misc

NT.ItemMethods.healthscanner = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	local containedItem = item.OwnInventory.GetItemAt(0)
	if containedItem == nil then
		return
	end
	local hasVoltage = containedItem.Condition > 0

	if hasVoltage then
		--set base color values
		local BaseColor = "127,255,255"
		local NameColor = "127,255,255"
		local LowColor = "127,255,255"
		local MedColor = "127,255,255"
		local HighColor = "127,255,255"
		local VitalColor = "127,255,255"
		local RemovalColor = "127,255,255"
		local CustomColor = "127,255,255"

		if NTConfig.Get("NTSCAN_enablecoloredscanner", 1) then
			BaseColor = table.concat(NTConfig.Get("NTSCAN_basecolor", 1), ",")
			NameColor = table.concat(NTConfig.Get("NTSCAN_namecolor", 1), ",")
			LowColor = table.concat(NTConfig.Get("NTSCAN_lowcolor", 1), ",")
			MedColor = table.concat(NTConfig.Get("NTSCAN_medcolor", 1), ",")
			HighColor = table.concat(NTConfig.Get("NTSCAN_highcolor", 1), ",")
			VitalColor = table.concat(NTConfig.Get("NTSCAN_vitalcolor", 1), ",")
			RemovalColor = table.concat(NTConfig.Get("NTSCAN_removalcolor", 1), ",")
			CustomColor = table.concat(NTConfig.Get("NTSCAN_customcolor", 1), ",")
		end

		local LowMedThreshold = NTConfig.Get("NTSCAN_lowmedThreshold", 1)
		local MedHighThreshold = NTConfig.Get("NT_medhighThreshold", 1)

		local VitalCategory = NTConfig.Get("NTSCAN_VitalCategory", 1)
		local RemovalCategory = NTConfig.Get("NTSCAN_RemovalCategory", 1)
		local CustomCategory = NTConfig.Get("NTSCAN_CustomCategory", 1)
		local PressureCategory = { "bloodpressure" }
		local IgnoredCategory = NTConfig.Get("NTSCAN_IgnoredCategory", 1)

		HF.GiveItem(targetCharacter, "ntsfx_selfscan")
		containedItem.Condition = containedItem.Condition - 5
		HF.AddAffliction(targetCharacter, "radiationsickness", 1, usingCharacter)
		HF.AddAffliction(usingCharacter, "radiationsickness", 0.6)

		-- print readout of afflictions
		local startReadout = "‖color:"
			.. BaseColor
			.. "‖"
			.. "Affliction readout for "
			.. "‖color:end‖"
			.. "‖color:"
			.. NameColor
			.. "‖"
			.. targetCharacter.Name
			.. "‖color:end‖"
			.. "‖color:"
			.. BaseColor
			.. "‖"
			.. " on limb "
			.. HF.LimbTypeToString(limbtype)
			.. ":\n"
			.. "‖color:end‖"
		local LowPressureReadout = ""
		local HighPressureReadout = ""
		local LowStrengthReadout = ""
		local MediumStrengthReadout = ""
		local HighStrengthReadout = ""
		local VitalReadout = ""
		local RemovalReadout = ""
		local CustomReadout = ""

		local afflictionlist = targetCharacter.CharacterHealth.GetAllAfflictions()
		local afflictionsdisplayed = 0
		for value in afflictionlist do
			local strength = HF.Round(value.Strength)
			local prefab = value.Prefab
			local limb = targetCharacter.CharacterHealth.GetAfflictionLimb(value)
			local afflimbtype = LimbType.Torso

			if not prefab.LimbSpecific then
				afflimbtype = prefab.IndicatorLimb
			elseif limb ~= nil then
				afflimbtype = limb.type
			end

			afflimbtype = HF.NormalizeLimbType(afflimbtype)

			if strength >= prefab.ShowInHealthScannerThreshold and afflimbtype == limbtype then
				if --low readout
					(strength < LowMedThreshold)
					and not HF.TableContains(VitalCategory, value.Identifier)
					and not HF.TableContains(RemovalCategory, value.Identifier)
					and not HF.TableContains(PressureCategory, value.Identifier)
					and not HF.TableContains(CustomCategory, value.Identifier)
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					LowStrengthReadout = LowStrengthReadout
						.. "\n"
						.. value.Prefab.Name.Value
						.. ": "
						.. strength
						.. "%"
				end

				if --medium readout
					(strength >= LowMedThreshold)
					and (strength < MedHighThreshold)
					and not HF.TableContains(VitalCategory, value.Identifier)
					and not HF.TableContains(RemovalCategory, value.Identifier)
					and not HF.TableContains(PressureCategory, value.Identifier)
					and not HF.TableContains(CustomCategory, value.Identifier)
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					MediumStrengthReadout = MediumStrengthReadout
						.. "\n"
						.. value.Prefab.Name.Value
						.. ": "
						.. strength
						.. "%"
				end

				if --high readout
					(strength >= MedHighThreshold)
					and not HF.TableContains(VitalCategory, value.Identifier)
					and not HF.TableContains(RemovalCategory, value.Identifier)
					and not HF.TableContains(PressureCategory, value.Identifier)
					and not HF.TableContains(CustomCategory, value.Identifier)
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					HighStrengthReadout = HighStrengthReadout
						.. "\n"
						.. value.Prefab.Name.Value
						.. ": "
						.. strength
						.. "%"
				end

				if --vital readout
					HF.TableContains(VitalCategory, value.Identifier)
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					VitalReadout = VitalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
				end

				if --removed readout
					HF.TableContains(RemovalCategory, value.Identifier)
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					RemovalReadout = RemovalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
				end

				if --custom readout
					HF.TableContains(CustomCategory, value.Identifier)
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					CustomReadout = CustomReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
				end

				if --bloodpressure readout
					HF.TableContains(PressureCategory, value.Identifier)
					and ((strength > 130) or (strength < 70))
					and not HF.TableContains(IgnoredCategory, value.Identifier)
				then
					HighPressureReadout = HighPressureReadout
						.. "\n"
						.. value.Prefab.Name.Value
						.. ": "
						.. strength
						.. "%"
				elseif HF.TableContains(PressureCategory, value.Identifier) then
					LowPressureReadout = LowPressureReadout
						.. "\n"
						.. value.Prefab.Name.Value
						.. ": "
						.. strength
						.. "%"
				end

				afflictionsdisplayed = afflictionsdisplayed + 1
			end
		end

		-- add a message in case there is nothing to display
		if afflictionsdisplayed <= 0 then
			LowStrengthReadout = LowStrengthReadout .. "\nNo afflictions! Good work!"
		end

		Timer.Wait(function()
			HF.DMClient(
				HF.CharacterToClient(usingCharacter),

				startReadout
					.. "‖color:"
					.. LowColor
					.. "‖"
					.. LowPressureReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. HighColor
					.. "‖"
					.. HighPressureReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. LowColor
					.. "‖"
					.. LowStrengthReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. MedColor
					.. "‖"
					.. MediumStrengthReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. HighColor
					.. "‖"
					.. HighStrengthReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. VitalColor
					.. "‖"
					.. VitalReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. RemovalColor
					.. "‖"
					.. RemovalReadout
					.. "‖color:end‖"
					.. "‖color:"
					.. CustomColor
					.. "‖"
					.. CustomReadout
					.. "‖color:end‖"
			)
		end, 2000)
	end
end
NT.HematologyDetectable = {
	"sepsis",
	"immunity",
	"acidosis",
	"alkalosis",
	"bloodloss",
	"bloodpressure",
	"afimmunosuppressant",
	"afthiamine",
	"afadrenaline",
	"afstreptokinase",
	"afantibiotics",
	"afsaline",
	"afringerssolution",
	"afpressuredrug",
}
NT.ItemMethods.bloodanalyzer = function(item, usingCharacter, targetCharacter, limb)
	-- only work if no cooldown
	if item.Condition < 50 then
		return
	end

	local limbtype = limb.type

	local success = HF.GetSkillRequirementMet(usingCharacter, "medical", 30)
	local bloodlossinduced = 1
	if not success then
		bloodlossinduced = 3
	end
	HF.AddAffliction(targetCharacter, "bloodloss", bloodlossinduced, usingCharacter)

	-- spawn donor card
	local containedItem = item.OwnInventory.GetItemAt(0)
	local hasCartridge = containedItem ~= nil
		and (containedItem.Prefab.Identifier.Value == "bloodcollector" or containedItem.HasTag("donorCard"))
	if hasCartridge then
		HF.RemoveItem(containedItem)
		local bloodtype = NT.GetBloodtype(targetCharacter)
		local targetIDCard = targetCharacter.Inventory.GetItemAt(0)
		if targetIDCard ~= nil and targetIDCard.OwnInventory.GetItemAt(0) == nil then
			-- put the donor card into the id card
			HF.PutItemInsideItem(targetIDCard, bloodtype .. "card")
		else
			-- put it in the analyzer instead
			HF.PutItemInsideItem(item, bloodtype .. "card")
		end
	end

	local LowPressureReadout = ""
	local HighPressureReadout = ""
	local LowStrengthReadout = ""
	local MediumStrengthReadout = ""
	local HighStrengthReadout = ""
	local VitalReadout = ""
	local RemovalReadout = ""
	local CustomReadout = ""

	--set base color values
	local BaseColor = "127,255,255"
	local NameColor = "127,255,255"
	local LowColor = "127,255,255"
	local MedColor = "127,255,255"
	local HighColor = "127,255,255"
	local VitalColor = "127,255,255"
	local RemovalColor = "127,255,255"
	local CustomColor = "127,255,255"

	if NTConfig.Get("NTSCAN_enablecoloredscanner", 1) then
		BaseColor = table.concat(NTConfig.Get("NTSCAN_basecolor", 1), ",")
		NameColor = table.concat(NTConfig.Get("NTSCAN_namecolor", 1), ",")
		LowColor = table.concat(NTConfig.Get("NTSCAN_lowcolor", 1), ",")
		MedColor = table.concat(NTConfig.Get("NTSCAN_medcolor", 1), ",")
		HighColor = table.concat(NTConfig.Get("NTSCAN_highcolor", 1), ",")
		VitalColor = table.concat(NTConfig.Get("NTSCAN_vitalcolor", 1), ",")
		RemovalColor = table.concat(NTConfig.Get("NTSCAN_removalcolor", 1), ",")
		CustomColor = table.concat(NTConfig.Get("NTSCAN_customcolor", 1), ",")
	end

	local LowMedThreshold = NTConfig.Get("NTSCAN_lowmedThreshold", 1)
	local MedHighThreshold = NTConfig.Get("NT_medhighThreshold", 1)

	local VitalCategory = NTConfig.Get("NTSCAN_VitalCategory", 1)
	local RemovalCategory = NTConfig.Get("NTSCAN_RemovalCategory", 1)
	local CustomCategory = NTConfig.Get("NTSCAN_CustomCategory", 1)
	local PressureCategory = { "bloodpressure" }
	local IgnoredCategory = NTConfig.Get("NTSCAN_IgnoredCategory", 1)

	-- print readout of afflictions
	local bloodtype = AfflictionPrefab.Prefabs[NT.GetBloodtype(targetCharacter)].Name.Value
	local startReadout = "‖color:"
		.. NameColor
		.. "‖"
		.. "Bloodtype: "
		.. bloodtype
		.. "‖color:end‖"
		.. "‖color:"
		.. BaseColor
		.. "‖"
		.. "\nAffliction readout for the blood of "
		.. "‖color:end‖"
		.. "‖color:"
		.. NameColor
		.. "‖"
		.. targetCharacter.Name
		.. ":\n"
		.. "‖color:end‖"
	local afflictionlist = targetCharacter.CharacterHealth.GetAllAfflictions()
	local afflictionsdisplayed = 0
	for value in afflictionlist do
		local strength = HF.Round(value.Strength)
		local prefab = value.Prefab

		if strength > 2 and HF.TableContains(NT.HematologyDetectable, prefab.Identifier.Value) then
			-- add the affliction to the readout
			if --low readout
				(strength < LowMedThreshold)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
				and not HF.TableContains(PressureCategory, value.Identifier)
			then
				LowStrengthReadout = LowStrengthReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			end

			if --medium readout
				(strength >= LowMedThreshold)
				and (strength < MedHighThreshold)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
				and not HF.TableContains(PressureCategory, value.Identifier)
			then
				MediumStrengthReadout = MediumStrengthReadout
					.. "\n"
					.. value.Prefab.Name.Value
					.. ": "
					.. strength
					.. "%"
			end

			if --high readout
				(strength >= MedHighThreshold)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
				and not HF.TableContains(PressureCategory, value.Identifier)
			then
				HighStrengthReadout = HighStrengthReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			end

			if --vital readout
				HF.TableContains(VitalCategory, value.Identifier)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
				and not HF.TableContains(PressureCategory, value.Identifier)
			then
				VitalReadout = VitalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			end

			if --removed readout
				HF.TableContains(RemovalCategory, value.Identifier)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
				and not HF.TableContains(PressureCategory, value.Identifier)
			then
				RemovalReadout = RemovalReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			end

			if --custom readout
				HF.TableContains(CustomCategory, value.Identifier)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
				and not HF.TableContains(PressureCategory, value.Identifier)
			then
				CustomReadout = CustomReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			end

			if --bloodpressure readout
				HF.TableContains(PressureCategory, value.Identifier)
				and ((strength > 130) or (strength < 70))
				and not HF.TableContains(IgnoredCategory, value.Identifier)
			then
				HighPressureReadout = HighPressureReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			elseif
				HF.TableContains(PressureCategory, value.Identifier)
				and not HF.TableContains(IgnoredCategory, value.Identifier)
			then
				LowPressureReadout = LowPressureReadout .. "\n" .. value.Prefab.Name.Value .. ": " .. strength .. "%"
			end

			afflictionsdisplayed = afflictionsdisplayed + 1
		end
	end

	-- add a message in case there is nothing to display
	if afflictionsdisplayed <= 0 then
		LowStrengthReadout = LowStrengthReadout .. "\nNo blood pressure detected..."
	end

	HF.DMClient(
		HF.CharacterToClient(usingCharacter),
		startReadout
			.. "‖color:"
			.. LowColor
			.. "‖"
			.. LowPressureReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. HighColor
			.. "‖"
			.. HighPressureReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. LowColor
			.. "‖"
			.. LowStrengthReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. MedColor
			.. "‖"
			.. MediumStrengthReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. HighColor
			.. "‖"
			.. HighStrengthReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. VitalColor
			.. "‖"
			.. VitalReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. RemovalColor
			.. "‖"
			.. RemovalReadout
			.. "‖color:end‖"
			.. "‖color:"
			.. CustomColor
			.. "‖"
			.. CustomReadout
			.. "‖color:end‖"
	)
end

-- trauma shears and diving knife
NT.CuttableAfflictions = { "bandaged", "dirtybandage" }
NT.TraumashearsAfflictions = { "gypsumcast" }
NT.ItemMethods.traumashears = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	-- does the target have any cuttable afflictions?
	local cuttables = HF.CombineArrays(NT.CuttableAfflictions, NT.TraumashearsAfflictions)
	local canCut = false
	for val in cuttables do
		local prefab = AfflictionPrefab.Prefabs[val]
		if prefab ~= nil then
			if prefab.LimbSpecific then
				if HF.HasAfflictionLimb(targetCharacter, val, limbtype, 0.1) then
					canCut = true
					break
				end
			elseif limbtype == prefab.IndicatorLimb then
				if HF.HasAffliction(targetCharacter, val, 0.1) then
					canCut = true
					break
				end
			end
		end
	end

	if canCut then
		if HF.GetSkillRequirementMet(usingCharacter, "medical", 10) then
			HF.GiveItem(targetCharacter, "ntsfx_scissors")

			-- remove 8% fracture so that they dont scream again
			if
				NT.LimbIsBroken(targetCharacter, limbtype)
				and HF.HasAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 0.1)
			then
				NT.BreakLimb(targetCharacter, limbtype, -8)
			end

			-- remove cuttables
			for val in cuttables do
				local prefab = AfflictionPrefab.Prefabs[val]
				if prefab ~= nil then
					if prefab.LimbSpecific then
						HF.SetAfflictionLimb(targetCharacter, val, limbtype, 0, usingCharacter)
					elseif limbtype == prefab.IndicatorLimb then
						HF.SetAffliction(targetCharacter, val, 0, usingCharacter)
					end
				end
			end
		else
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 10, usingCharacter)
		end
	end
end
NT.ItemStartsWithMethods.divingknife = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	-- does the target have any cuttable afflictions?
	local canCut = false
	for val in NT.CuttableAfflictions do
		local prefab = AfflictionPrefab.Prefabs[val]
		if prefab ~= nil then
			if prefab.LimbSpecific then
				if HF.HasAfflictionLimb(targetCharacter, val, limbtype, 0.1) then
					canCut = true
					break
				end
			elseif HF.NormalizeLimbType(limbtype) == prefab.IndicatorLimb then
				if HF.HasAffliction(targetCharacter, val, 0.1) then
					canCut = true
					break
				end
			end
		end
	end

	if canCut then
		if HF.GetSkillRequirementMet(usingCharacter, "medical", 30) then
			HF.GiveItem(targetCharacter, "ntsfx_bandage")
			-- remove cuttables
			for val in NT.CuttableAfflictions do
				local prefab = AfflictionPrefab.Prefabs[val]
				if prefab ~= nil then
					if prefab.LimbSpecific then
						HF.SetAfflictionLimb(targetCharacter, val, limbtype, 0, usingCharacter)
					elseif HF.NormalizeLimbType(limbtype) == prefab.IndicatorLimb then
						HF.SetAffliction(targetCharacter, val, 0, usingCharacter)
					end
				end
			end
		else
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 10, usingCharacter)
		end
	end
end

NT.ItemMethods.gypsum = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		HF.HasAfflictionLimb(targetCharacter, "bandaged", limbtype, 0.1)
		and not HF.HasAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 0.1)
		and not HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 1)
		and HF.LimbIsExtremity(limbtype)
	then
		if HF.GetSkillRequirementMet(usingCharacter, "medical", 40) then
			HF.SetAfflictionLimb(targetCharacter, "bandaged", limbtype, 0, usingCharacter)
			HF.SetAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 100, usingCharacter)
			NT.BreakLimb(targetCharacter, limbtype, -20)
			HF.GiveSkillScaled(usingCharacter, "medical", 6000)
			HF.RemoveItem(item)
		else
			HF.RemoveItem(item)
		end
	end
end

-- treatment items

NT.SutureAfflictions = {
	bonecut = { xpgain = 0, case = "surgeryincision" },
	drilledbones = { xpgain = 0, case = "surgeryincision" },

	ll_arterialcut = { xpgain = 3, case = "retractedskin" },
	rl_arterialcut = { xpgain = 3, case = "retractedskin" },
	la_arterialcut = { xpgain = 3, case = "retractedskin" },
	ra_arterialcut = { xpgain = 3, case = "retractedskin" },
	h_arterialcut = { xpgain = 3, case = "retractedskin" },
	t_arterialcut = { xpgain = 6, case = "retractedskin" },
	arteriesclamp = { xpgain = 0, case = "retractedskin" },
	tamponade = { xpgain = 3, case = "retractedskin" },
	internalbleeding = { xpgain = 3, case = "retractedskin" },
	stroke = { xpgain = 6, case = "retractedskin" },

	clampedbleeders = {},
	surgeryincision = {},
	retractedskin = {},
}
NT.ItemMethods.suture = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	if HF.GetSkillRequirementMet(usingCharacter, "medical", 30) then
		-- in field use
		local healeddamage = 0
		healeddamage = healeddamage
			+ HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "lacerations", 0), 0, 20)
		healeddamage = healeddamage
			+ HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "bitewounds", 0), 0, 20)
		healeddamage = healeddamage
			+ HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "explosiondamage", 0), 0, 20)
		healeddamage = healeddamage
			+ HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "gunshotwound", 0), 0, 20)
		healeddamage = healeddamage
			+ HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "bleeding", 0) / 10, 0, 40)
		healeddamage = healeddamage
			+ HF.Clamp(HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "bleedingnonstop", 0) / 10, 0, 40)

		HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, -20, usingCharacter)
		HF.AddAfflictionLimb(targetCharacter, "bitewounds", limbtype, -20, usingCharacter)
		HF.AddAfflictionLimb(targetCharacter, "explosiondamage", limbtype, -20, usingCharacter)
		HF.AddAfflictionLimb(targetCharacter, "gunshotwound", limbtype, -20, usingCharacter)
		HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, -40, usingCharacter)
		HF.AddAfflictionLimb(targetCharacter, "suturedw", limbtype, healeddamage)

		HF.GiveSkillScaled(usingCharacter, "medical", healeddamage * 100)

		-- terminating surgeries
		-- amputations
		if HF.HasAfflictionLimb(targetCharacter, "bonecut", limbtype, 1) then
			local droplimb = not NT.LimbIsAmputated(targetCharacter, limbtype)
				and not HF.HasAfflictionLimb(targetCharacter, "gangrene", limbtype, 15)
			-- drop previously held item
			local previtem = HF.GetHeadWear(targetCharacter)
			if previtem ~= nil and limbtype == LimbType.Head then
				previtem.Drop(character, true)
			end
			NT.SurgicallyAmputateLimb(targetCharacter, limbtype)
			if droplimb then
				local limbtoitem = {}
				limbtoitem[LimbType.RightLeg] = "rleg"
				limbtoitem[LimbType.LeftLeg] = "lleg"
				limbtoitem[LimbType.RightArm] = "rarm"
				limbtoitem[LimbType.LeftArm] = "larm"
				if limbtoitem[limbtype] ~= nil then
					HF.GiveItem(usingCharacter, limbtoitem[limbtype])
					HF.GiveSurgerySkill(usingCharacter, 0.5)
				end
			end
		end

		-- the other stuff
		local function removeAfflictionPlusGainSkill(affidentifier, skillgain)
			if HF.HasAfflictionLimb(targetCharacter, affidentifier, limbtype) then
				HF.SetAfflictionLimb(targetCharacter, affidentifier, limbtype, 0, usingCharacter)

				HF.GiveSurgerySkill(usingCharacter, skillgain)
			end
		end
		local function removeAfflictionNonLimbSpecificPlusGainSkill(affidentifier, skillgain)
			if HF.HasAffliction(targetCharacter, affidentifier) then
				HF.SetAffliction(targetCharacter, affidentifier, 0, usingCharacter)

				HF.GiveSurgerySkill(usingCharacter, skillgain)
			end
		end

		for key, value in pairs(NT.SutureAfflictions) do
			local prefab = AfflictionPrefab.Prefabs[key]
			if prefab ~= nil and (value.case == nil or HF.HasAfflictionLimb(targetCharacter, value.case, limbtype)) then
				if value.func ~= nil then
					value.func(item, usingCharacter, targetCharacter, limb)
				else
					local skillgain = value.xpgain or 0
					if prefab.LimbSpecific then
						removeAfflictionPlusGainSkill(key, skillgain)
					elseif prefab.IndicatorLimb == limbtype then
						removeAfflictionNonLimbSpecificPlusGainSkill(key, skillgain)
					end
				end
			end
		end
	else
		HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 6)
	end
end
NT.ItemMethods.tourniquet = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	if
		HF.GetSkillRequirementMet(usingCharacter, "medical", 30)
		and not HF.HasAfflictionLimb(targetCharacter, "arteriesclamp", limbtype, 1)
	then
		if NT.LimbIsArterialCut(targetCharacter, limbtype) then
			if HF.LimbIsExtremity(limbtype) then
				HF.SetAfflictionLimb(targetCharacter, "arteriesclamp", limbtype, 100, usingCharacter)
				HF.GiveSkillScaled(usingCharacter, "medical", 6000)
			elseif limbtype == LimbType.Head then
				HF.SetAffliction(targetCharacter, "oxygenlow", 200, usingCharacter)
				HF.AddAffliction(targetCharacter, "cerebralhypoxia", 15, usingCharacter)
			end
			HF.RemoveItem(item)
		end
	else
		HF.AddAfflictionLimb(targetCharacter, "blunttrauma", limbtype, 6, usingCharacter)
	end
end
NT.ItemMethods.emptybloodpack = function(item, usingCharacter, targetCharacter, limb)
	if item.Condition <= 0 then
		return
	end

	if targetCharacter.Bloodloss <= 31 then
		local success = HF.GetSkillRequirementMet(usingCharacter, "medical", 30)
		local bloodlossinduced = 30
		if not success then
			bloodlossinduced = 40
		end

		local bloodtype = NT.GetBloodtype(targetCharacter)

		-- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them
		local function postSpawnFunc(args)
			local tags = {}

			if args.acidosis > 0 then
				table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis)))
			elseif args.alkalosis > 0 then
				table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis)))
			end
			if args.sepsis > 0 then
				table.insert(tags, "sepsis")
			end

			local tagstring = ""
			for index, value in ipairs(tags) do
				tagstring = tagstring .. value
				if index < #tags then
					tagstring = tagstring .. ","
				end
			end

			args.item.Tags = tagstring
		end
		local params = {
			acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"),
			alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"),
			sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"),
		}

		-- move towards isotonic
		HF.SetAffliction(targetCharacter, "acidosis", HF.GetAfflictionStrength(targetCharacter, "acidosis", 0) * 0.9)
		HF.SetAffliction(targetCharacter, "alkalosis", HF.GetAfflictionStrength(targetCharacter, "alkalosis", 0) * 0.9)

		HF.AddAffliction(targetCharacter, "bloodloss", bloodlossinduced, usingCharacter)

		local bloodpackIdentifier = "bloodpack" .. bloodtype
		if bloodtype == "ominus" then
			bloodpackIdentifier = "antibloodloss2"
		end

		HF.GiveItemPlusFunction(bloodpackIdentifier, postSpawnFunc, params, usingCharacter)
		item.Condition = 0
		--HF.RemoveItem(item)
		HF.GiveItem(targetCharacter, "ntsfx_syringe")
	end
end
NT.ItemMethods.propofol = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local anesthesiastrength = HF.GetAfflictionStrength(targetCharacter, "anesthesia", 0)
	local anesthesiaGained = 1

	if HF.HasTalent(usingCharacter, "ntsp_properfol") then
		anesthesiaGained = 15
	end

	if anesthesiastrength < 15 then
		HF.AddAffliction(targetCharacter, "anesthesia", anesthesiaGained, usingCharacter)
	else
		anesthesiaGained = 15 - anesthesiastrength
		HF.AddAffliction(targetCharacter, "anesthesia", anesthesiaGained, usingCharacter)
	end

	HF.RemoveItem(item)
	HF.GiveItem(targetCharacter, "ntsfx_syringe")
end
NT.ItemMethods.streptokinase = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	HF.AddAffliction(targetCharacter, "heartattack", -100, usingCharacter)
	HF.AddAffliction(targetCharacter, "hemotransfusionshock", -100, usingCharacter)
	HF.AddAffliction(targetCharacter, "afstreptokinase", 50, usingCharacter)

	-- make stroke worse if present
	local hasStroke = HF.HasAffliction(targetCharacter, "stroke")
	if hasStroke then
		HF.AddAffliction(targetCharacter, "stroke", 5, usingCharacter)
		HF.AddAffliction(targetCharacter, "cerebralhypoxia", 10, usingCharacter)
	end

	HF.RemoveItem(item)
	HF.GiveItem(targetCharacter, "ntsfx_syringe")
end
NT.ItemMethods.adrenaline = function(item, usingCharacter, targetCharacter, limb)
	HF.AddAffliction(targetCharacter, "afadrenaline", 55, usingCharacter)
	HF.AddAffliction(targetCharacter, "adrenalinerush", 8, usingCharacter)
	if HF.HasAffliction(targetCharacter, "cardiacarrest", 0.1) then
		HF.AddAffliction(targetCharacter, "cardiacarrest", -100, usingCharacter)
		HF.AddAffliction(targetCharacter, "fibrillation", 20, usingCharacter)
	end
	HF.RemoveItem(item)
	HF.GiveItem(targetCharacter, "ntsfx_syringe")
end
local function limbHasThirdDegreeBurns(char, limbtype)
	return HF.GetAfflictionStrengthLimb(char, limbtype, "burn", 0) > 50
end
NT.ItemMethods.ointment = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 10), 1)

	HF.AddAfflictionLimb(targetCharacter, "ointmented", limbtype, 60 * (success + 1), usingCharacter)
	if not limbHasThirdDegreeBurns(targetCharacter, limbtype) then
		HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, -7.2 - success * 4.8, usingCharacter)
	end
	HF.AddAfflictionLimb(targetCharacter, "infectedwound", limbtype, -24 - success * 48, usingCharacter)

	-- HF.RemoveItem(item)
	item.Condition = item.Condition - 12.5
	HF.GiveItem(targetCharacter, "ntsfx_ointment")
end
NT.ItemMethods.antibleeding1 = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 10), 1)
	local hasmedexp = HF.BoolToNum(HF.HasTalent(usingCharacter, "medicalexpertise"))
	HF.AddAfflictionLimb(targetCharacter, "dirtybandage", limbtype, -100, usingCharacter)
	HF.AddAfflictionLimb(targetCharacter, "bandaged", limbtype, 36 + success * 12 + hasmedexp * 12, usingCharacter)
	HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, -18 - success * 6 - hasmedexp * 6, usingCharacter)
	HF.RemoveItem(item)
	HF.GiveItem(targetCharacter, "ntsfx_bandage")
end
NT.ItemMethods.antibleeding2 = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 22), 1)
	HF.AddAfflictionLimb(targetCharacter, "dirtybandage", limbtype, -100, usingCharacter)
	HF.AddAfflictionLimb(targetCharacter, "bandaged", limbtype, 50 + success * 50, usingCharacter)
	HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, -24 - success * 24, usingCharacter)
	if HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype) then
		-- remove all burn if applied during surgery
		local affAmount = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "burn")
		local healedamount = math.min(affAmount, 200)
		HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, -healedamount, usingCharacter)
		if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
			HF.GiveSkillScaled(usingCharacter, "surgery", healedamount * 300)
		else
			HF.GiveSkillScaled(usingCharacter, "medical", healedamount * 150)
		end
	elseif not limbHasThirdDegreeBurns(targetCharacter, limbtype) then
		-- remove normal amount of burn if not third degree
		HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, -12 - success * 12, usingCharacter)
	end
	HF.RemoveItem(item)
	HF.GiveItem(targetCharacter, "ntsfx_bandage")
end

NT.ItemMethods.defibrillator = function(item, usingCharacter, targetCharacter, limb)
	if item.Condition <= 0 then
		return
	end

	local containedItem = item.OwnInventory.GetItemAt(0)
	if containedItem == nil then
		return
	end
	local hasVoltage = containedItem.Condition > 0
	-- if defib user in water = shock the user with 93 strength electricshock aff (3 second stun) + electrocution vanilla sound effect
	if not hasVoltage then
		return
	end
	HF.GiveItem(targetCharacter, "ntsfx_manualdefib")
	-- about to get deepfried if underwater (TODO)
	--local unsafe = HF.GetOuterWearIdentifier(targetCharacter) ~= "emergencysuit" and targetCharacter.InWater
	--local unsafeArrestRoll = unsafe
	--	and HF.Chance(HF.Clamp(0.3, (1 - (HF.GetSkillLevel(usingCharacter, "medical") / 100)) ^ 2 * 8.5, 1))
	--if unsafe then
	-- shock therapy the surrounding characters
	--	containedItem.Condition = containedItem.Condition - 10
	--	if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then
	--		containedItem.Condition = containedItem.Condition - 10
	--	end
	--	Timer.Wait(function()
	--		for _, character in pairs(Character.CharacterList) do
	--			local distance = HF.DistanceBetween(item.worldPosition, character.worldPosition)
	--			if
	--				distance <= 300 and character.CanSeeTarget(usingCharacter) and HF.Chance(0.3)
	--				or character == targetCharacter
	--			then
	--				local limbtypes = {
	--					LimbType.Torso,
	--					LimbType.Head,
	--					LimbType.LeftArm,
	--					LimbType.RightArm,
	--					LimbType.LeftLeg,
	--					LimbType.RightLeg,
	--				}
	--				for type in limbtypes do
	--					if math.random() < 0.5 then
	--						HF.AddAfflictionLimb(character, "burn", type, math.random(15, 20), usingCharacter)
	--						HF.AddAfflictionLimb(character, "spasm", type, 10)
	--					end
	--				end
	--				HF.SetAffliction(character, "electricshock", 100, usingCharacter)
	--				HF.AddAffliction(character, "traumaticshock", 25, usingCharacter)
	--			end
	--		end
	--	end, 2000)
	--end
	containedItem.Condition = containedItem.Condition - 10
	if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then
		containedItem.Condition = containedItem.Condition - 10
	end

	local successChance = (HF.GetSkillLevel(usingCharacter, "medical") / 100) ^ 2
	local arrestSuccessChance = (HF.GetSkillLevel(usingCharacter, "medical") / 100) ^ 4
	local arrestFailChance = (1 - (HF.GetSkillLevel(usingCharacter, "medical") / 100)) ^ 2 * 0.3

	Timer.Wait(function()
		HF.AddAffliction(targetCharacter, "stun", 2, usingCharacter)
		if HF.Chance(successChance) then
			HF.SetAffliction(targetCharacter, "tachycardia", 0, usingCharacter)
			HF.SetAffliction(targetCharacter, "fibrillation", 0, usingCharacter)
		end
		if HF.Chance(arrestSuccessChance) then
			HF.SetAffliction(targetCharacter, "cardiacarrest", 0, usingCharacter)
		end
	end, 2000)
end
NT.ItemMethods.aed = function(item, usingCharacter, targetCharacter, limb)
	if item.Condition <= 0 then
		return
	end

	local containedItem = item.OwnInventory.GetItemAt(0)
	if containedItem == nil then
		return
	end
	local hasVoltage = containedItem.Condition > 0

	if hasVoltage then
		local actionRequired = HF.HasAffliction(targetCharacter, "tachycardia", 5)
			or HF.HasAffliction(targetCharacter, "fibrillation", 1)
			or HF.HasAffliction(targetCharacter, "cardiacarrest")

		if not actionRequired then
			HF.GiveItem(targetCharacter, "ntsfx_defib2")
		else
			HF.GiveItem(targetCharacter, "ntsfx_defib1")

			containedItem.Condition = containedItem.Condition - 10
			if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then
				containedItem.Condition = containedItem.Condition - 10
			end
			-- about to get deepfried if underwater (TODO)
			--local unsafe = HF.GetOuterWearIdentifier(targetCharacter) ~= "emergencysuit" and targetCharacter.InWater
			--local unsafeArrestRoll = unsafe and HF.Chance(0.3)
			--if unsafe then
			--	-- shock therapy the surrounding characters
			--	containedItem.Condition = containedItem.Condition - 10
			--	if containedItem.Prefab.Identifier.Value ~= "fulguriumbatterycell" then
			--		containedItem.Condition = containedItem.Condition - 10
			--	end
			--	Timer.Wait(function()
			--		for _, character in pairs(Character.CharacterList) do
			--			local distance = HF.DistanceBetween(item.worldPosition, character.worldPosition)
			--			if
			--				distance <= 300 and character.CanSeeTarget(usingCharacter) and HF.Chance(0.3)
			--				or character == targetCharacter
			--			then
			--				local limbtypes = {
			--					LimbType.Torso,
			--					LimbType.Head,
			--					LimbType.LeftArm,
			--					LimbType.RightArm,
			--					LimbType.LeftLeg,
			--					LimbType.RightLeg,
			--				}
			--				for type in limbtypes do
			--					if math.random() < 0.5 then
			--						HF.AddAfflictionLimb(character, "burn", type, math.random(15, 20), usingCharacter)
			--						HF.AddAfflictionLimb(character, "spasm", type, 10)
			--					end
			--				end
			--				HF.SetAffliction(character, "electricshock", 100, usingCharacter)
			--				HF.AddAffliction(character, "traumaticshock", 25, usingCharacter)
			--			end
			--		end
			--	end, 2000)
			--end
			local arrestSuccessChance = HF.Clamp((HF.GetSkillLevel(usingCharacter, "medical") / 200), 0.2, 0.4)

			Timer.Wait(function()
				HF.AddAffliction(targetCharacter, "stun", 2, usingCharacter)
				HF.SetAffliction(targetCharacter, "tachycardia", 0, usingCharacter)
				HF.SetAffliction(targetCharacter, "fibrillation", 0, usingCharacter)
				if HF.Chance(arrestSuccessChance) then
					HF.SetAffliction(targetCharacter, "cardiacarrest", 0, usingCharacter)
				end
			end, 3200)
		end
	end
end
NT.ItemMethods.blahaj = function(item, usingCharacter, targetCharacter, limb)
	-- HF.GiveItem(targetCharacter,"ntsfx_squeak") -- this seems to be unnecessary due to the sound effect already being triggered by the xml side of things
	HF.AddAffliction(targetCharacter, "psychosis", -2, usingCharacter)
end

-- surgery

NT.ItemMethods.advscalpel = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and not HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 1)
	then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then
			HF.AddAfflictionLimb(
				targetCharacter,
				"surgeryincision",
				limbtype,
				1 + HF.GetSurgerySkill(usingCharacter) / 2,
				usingCharacter
			)
			HF.SetAfflictionLimb(targetCharacter, "suturedi", limbtype, 0, usingCharacter)
			HF.SetAfflictionLimb(targetCharacter, "gypsumcast", limbtype, 0, usingCharacter)
			HF.SetAfflictionLimb(targetCharacter, "bandaged", limbtype, 0, usingCharacter)
		else
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 10, usingCharacter)
		end

		HF.GiveItem(targetCharacter, "ntsfx_slash")
	end
end
NT.ItemMethods.advhemostat = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 99)
		and not HF.HasAfflictionLimb(targetCharacter, "clampedbleeders", limbtype, 1)
	then
		HF.AddAfflictionLimb(
			targetCharacter,
			"clampedbleeders",
			limbtype,
			1 + HF.GetSurgerySkill(usingCharacter) / 2,
			usingCharacter
		)
	end
end
NT.ItemMethods.advretractors = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and HF.HasAfflictionLimb(targetCharacter, "clampedbleeders", limbtype, 99)
		and not HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1)
	then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then
			HF.AddAfflictionLimb(
				targetCharacter,
				"retractedskin",
				limbtype,
				1 + HF.GetSurgerySkill(usingCharacter) / 2,
				usingCharacter
			)
		else
			HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 10, usingCharacter)
		end
	end
end
NT.ItemMethods.surgicaldrill = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
		and not HF.HasAfflictionLimb(targetCharacter, "drilledbones", limbtype, 1)
	then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 45) then
			HF.AddAfflictionLimb(
				targetCharacter,
				"drilledbones",
				limbtype,
				1 + HF.GetSurgerySkill(usingCharacter) / 2,
				usingCharacter
			)
		else
			HF.AddAfflictionLimb(targetCharacter, "burn", limbtype, 12, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 10, usingCharacter)
		end
	end
end
NT.ItemMethods.surgerysaw = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
		and not HF.HasAfflictionLimb(targetCharacter, "bonecut", limbtype, 1)
	then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 50) then
			if limbtype ~= LimbType.Torso then
				HF.AddAfflictionLimb(
					targetCharacter,
					"bonecut",
					limbtype,
					1 + HF.GetSurgerySkill(usingCharacter) / 2,
					usingCharacter
				)
			end
		else
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 6, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 4, usingCharacter)
		end
	end
end
NT.ItemMethods.tweezers = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	local usecase = ""
	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
	then
		usecase = "surgery"
	elseif
		HF.HasAfflictionLimb(targetCharacter, "gunshotwound", limbtype, 1)
		or HF.HasAfflictionLimb(targetCharacter, "explosiondamage", limbtype, 1)
	then
		usecase = "ghetto"
	end

	if usecase ~= "" then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then
			HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 5, usingCharacter)

			if usecase == "ghetto" then
				HF.AddAffliction(targetCharacter, "traumaticshock", 5, usingCharacter)
			end

			local function healAfflictionGiveSkill(identifier, healamount, skillgain)
				local affAmount = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, identifier)
				local healedamount = math.min(affAmount, healamount)
				HF.AddAfflictionLimb(targetCharacter, identifier, limbtype, -healamount, usingCharacter)

				if NTSP ~= nil and usecase == "surgery" and NTConfig.Get("NTSP_enableSurgerySkill", true) then
					HF.GiveSkillScaled(usingCharacter, "surgery", healedamount * skillgain)
				else
					HF.GiveSkillScaled(usingCharacter, "medical", healedamount * skillgain / 2)
				end
			end

			local foreignbody = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "foreignbody", 0)
			local scrapdropchance = math.min(foreignbody, 5) / 5 * 0.05 -- 5% chance to drop scrap
			if HF.Chance(scrapdropchance) then
				HF.GiveItem(usingCharacter, "scrap")
			end

			local tohealamount = math.random(3, 10)
			healAfflictionGiveSkill("foreignbody", tohealamount, 600)

			if usecase == "surgery" then
				healAfflictionGiveSkill("internaldamage", tohealamount, 3)
				healAfflictionGiveSkill("blunttrauma", tohealamount, 3)
			end
		else
			HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 6, usingCharacter)
		end
	else
		local sedated = HF.CanPerformSurgeryOn(targetCharacter)

		-- pinchy pinchy!
		HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 1, usingCharacter)
		HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 0.5, usingCharacter)
		if not sedated then
			HF.AddAfflictionLimb(targetCharacter, "pain_extremity", limbtype, 5, usingCharacter)
			HF.AddAffliction(targetCharacter, "stun", 0.1, usingCharacter)
		end

		-- don't rip off peoples faces
		if limbtype == LimbType.Head then
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 3, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "lacerations", limbtype, 2, usingCharacter)
			if not sedated then
				HF.AddAfflictionLimb(targetCharacter, "pain_extremity", limbtype, 5, usingCharacter)
			end
		end
	end
end

NT.ItemMethods.organscalpel_liver = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then
		local damage = HF.GetAfflictionStrength(targetCharacter, "liverdamage", 0)
		local removed = HF.GetAfflictionStrength(targetCharacter, "liverremoved", 0)
		if removed <= 0 then
			if HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then
				HF.SetAffliction(targetCharacter, "liverremoved", 100, usingCharacter)
				HF.SetAffliction(targetCharacter, "liverdamage", 100, usingCharacter)

				HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter)
				local transplantidentifier = "livertransplant_q1"
				if NTC.HasTag(usingCharacter, "organssellforfull") then
					transplantidentifier = "livertransplant"
				end
				if damage < 90 then
					-- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them
					local function postSpawnFunc(args)
						local tags = {}

						if args.acidosis > 0 then
							table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis)))
						elseif args.alkalosis > 0 then
							table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis)))
						end
						if args.sepsis > 10 then
							table.insert(tags, "sepsis")
						end

						local tagstring = ""
						for index, value in ipairs(tags) do
							tagstring = tagstring .. value
							if index < #tags then
								tagstring = tagstring .. ","
							end
						end

						args.item.Tags = tagstring
						args.item.Condition = args.condition
					end
					local params = {
						acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"),
						alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"),
						sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"),
						condition = 100 - damage,
					}

					HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter)
				end
			else
				HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
				HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter)
				HF.AddAffliction(targetCharacter, "liverdamage", 20, usingCharacter)
			end

			HF.GiveItem(targetCharacter, "ntsfx_slash")
		end
	end
end
NT.ItemMethods.organscalpel_lungs = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then
		local damage = HF.GetAfflictionStrength(targetCharacter, "lungdamage", 0)
		local removed = HF.GetAfflictionStrength(targetCharacter, "lungremoved", 0)
		if removed <= 0 then
			if HF.GetSurgerySkillRequirementMet(usingCharacter, 50) then
				HF.SetAffliction(targetCharacter, "lungremoved", 100, usingCharacter)
				HF.SetAffliction(targetCharacter, "lungdamage", 100, usingCharacter)
				HF.SetAffliction(targetCharacter, "respiratoryarrest", 100, usingCharacter)

				HF.SetAffliction(targetCharacter, "pneumothorax", 0, usingCharacter)
				HF.SetAffliction(targetCharacter, "needlec", 0, usingCharacter)

				HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter)
				local transplantidentifier = "lungtransplant_q1"
				if NTC.HasTag(usingCharacter, "organssellforfull") then
					transplantidentifier = "lungtransplant"
				end
				if damage < 90 then
					-- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them
					local function postSpawnFunc(args)
						local tags = {}

						if args.acidosis > 0 then
							table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis)))
						elseif args.alkalosis > 0 then
							table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis)))
						end
						if args.sepsis > 10 then
							table.insert(tags, "sepsis")
						end

						local tagstring = ""
						for index, value in ipairs(tags) do
							tagstring = tagstring .. value
							if index < #tags then
								tagstring = tagstring .. ","
							end
						end

						args.item.Tags = tagstring
						args.item.Condition = args.condition
					end
					local params = {
						acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"),
						alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"),
						sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"),
						condition = 100 - damage,
					}

					HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter)
				end
			else
				HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
				HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter)
				HF.AddAffliction(targetCharacter, "lungdamage", 20, usingCharacter)
			end

			HF.GiveItem(targetCharacter, "ntsfx_slash")
		end
	end
end
NT.ItemMethods.organscalpel_heart = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then
		local damage = HF.GetAfflictionStrength(targetCharacter, "heartdamage", 0)
		local removed = HF.GetAfflictionStrength(targetCharacter, "heartremoved", 0)
		if removed <= 0 then
			if HF.GetSurgerySkillRequirementMet(usingCharacter, 60) then
				HF.SetAffliction(targetCharacter, "heartremoved", 100, usingCharacter)
				HF.SetAffliction(targetCharacter, "heartdamage", 100, usingCharacter)
				HF.SetAffliction(targetCharacter, "cardiacarrest", 100, usingCharacter)

				HF.SetAffliction(targetCharacter, "tamponade", 0, usingCharacter)
				HF.SetAffliction(targetCharacter, "heartattack", 0, usingCharacter)

				HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter)
				local transplantidentifier = "hearttransplant_q1"
				if NTC.HasTag(usingCharacter, "organssellforfull") then
					transplantidentifier = "hearttransplant"
				end
				if damage < 90 then
					-- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them
					local function postSpawnFunc(args)
						local tags = {}

						if args.acidosis > 0 then
							table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis)))
						elseif args.alkalosis > 0 then
							table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis)))
						end
						if args.sepsis > 10 then
							table.insert(tags, "sepsis")
						end

						local tagstring = ""
						for index, value in ipairs(tags) do
							tagstring = tagstring .. value
							if index < #tags then
								tagstring = tagstring .. ","
							end
						end

						args.item.Tags = tagstring
						args.item.Condition = args.condition
					end
					local params = {
						acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"),
						alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"),
						sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"),
						condition = 100 - damage,
					}

					HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter)
				end
			else
				HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
				HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter)
				HF.AddAffliction(targetCharacter, "heartdamage", 20, usingCharacter)
			end

			HF.GiveItem(targetCharacter, "ntsfx_slash")
		end
	end
end
NT.ItemMethods.organscalpel_kidneys = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	if limbtype == LimbType.Torso and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then
		local damage = HF.GetAfflictionStrength(targetCharacter, "kidneydamage", 0)
		local removed = HF.GetAfflictionStrength(targetCharacter, "kidneyremoved", 0)
		if removed <= 0 then
			if HF.GetSurgerySkillRequirementMet(usingCharacter, 30) then
				HF.SetAffliction(targetCharacter, "kidneyremoved", 100, usingCharacter)
				HF.SetAffliction(targetCharacter, "kidneydamage", 100, usingCharacter)
				HF.AddAffliction(targetCharacter, "organdamage", (100 - damage) / 5, usingCharacter)
				local transplantidentifier = "kidneytransplant_q1"
				if NTC.HasTag(usingCharacter, "organssellforfull") then
					transplantidentifier = "kidneytransplant"
				end
				if damage < 50 then
					-- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them
					local function postSpawnFunc(args)
						local tags = {}

						if args.acidosis > 0 then
							table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis)))
						elseif args.alkalosis > 0 then
							table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis)))
						end
						if args.sepsis > 10 then
							table.insert(tags, "sepsis")
						end

						local tagstring = ""
						for index, value in ipairs(tags) do
							tagstring = tagstring .. value
							if index < #tags then
								tagstring = tagstring .. ","
							end
						end

						args.item.Tags = tagstring
						args.item.Condition = args.condition
					end
					local params = {
						acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"),
						alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"),
						sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"),
						condition = 100,
					}

					HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter)
					damage = damage + 50
				end
				if damage < 95 then
					-- add acidosis, alkalosis and sepsis to the bloodpack if the donor has them
					local function postSpawnFunc(args)
						local tags = {}

						if args.acidosis > 0 then
							table.insert(tags, "acid:" .. tostring(HF.Round(args.acidosis)))
						elseif args.alkalosis > 0 then
							table.insert(tags, "alkal:" .. tostring(HF.Round(args.alkalosis)))
						end
						if args.sepsis > 10 then
							table.insert(tags, "sepsis")
						end

						local tagstring = ""
						for index, value in ipairs(tags) do
							tagstring = tagstring .. value
							if index < #tags then
								tagstring = tagstring .. ","
							end
						end

						args.item.Tags = tagstring
						args.item.Condition = args.condition
					end
					local params = {
						acidosis = HF.GetAfflictionStrength(targetCharacter, "acidosis"),
						alkalosis = HF.GetAfflictionStrength(targetCharacter, "alkalosis"),
						sepsis = HF.GetAfflictionStrength(targetCharacter, "sepsis"),
						condition = 100 - (damage - 50) * 2,
					}

					HF.GiveItemPlusFunction(transplantidentifier, postSpawnFunc, params, usingCharacter)
				end
			else
				HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
				HF.AddAfflictionLimb(targetCharacter, "organdamage", limbtype, 5, usingCharacter)
				HF.AddAffliction(targetCharacter, "kidneydamage", 20, usingCharacter)
			end

			HF.GiveItem(targetCharacter, "ntsfx_slash")
		end
	end
end
NT.ItemMethods.organscalpel_brain = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	if limbtype == LimbType.Head and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1) then
		local damage = HF.GetAfflictionStrength(targetCharacter, "cerebralhypoxia", 0)
		local removed = HF.GetAfflictionStrength(targetCharacter, "brainremoved", 0)
		if removed <= 0 then
			if HF.GetSurgerySkillRequirementMet(usingCharacter, 100) then
				HF.SetAffliction(targetCharacter, "brainremoved", 100, usingCharacter)
				HF.AddAffliction(targetCharacter, "cerebralhypoxia", 100, usingCharacter)

				if NTSP ~= nil then
					if HF.HasAffliction(targetCharacter, "artificialbrain") then
						HF.SetAffliction(targetCharacter, "artificialbrain", 0, usingCharacter)
						damage = 100
					end
				end

				if damage < 90 then
					local postSpawnFunction = function(item, donor, client)
						item.Condition = 100 - damage
						if client ~= nil then
							item.Description = client.Name
						end
					end

					if SERVER then
						-- use server spawn method
						local prefab = ItemPrefab.GetItemPrefab("braintransplant")
						local client = HF.CharacterToClient(targetCharacter)
						Entity.Spawner.AddItemToSpawnQueue(
							prefab,
							usingCharacter.WorldPosition,
							nil,
							nil,
							function(item)
								usingCharacter.Inventory.TryPutItem(item, nil, { InvSlotType.Any })
								postSpawnFunction(item, targetCharacter, client)
							end
						)

						if client ~= nil then
							client.SetClientCharacter(nil)
						end
					else
						-- use client spawn method
						local item = Item(ItemPrefab.GetItemPrefab("braintransplant"), usingCharacter.WorldPosition)
						usingCharacter.Inventory.TryPutItem(item, nil, { InvSlotType.Any })
						postSpawnFunction(item, targetCharacter, nil)
					end
				end
			else
				HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 15, usingCharacter)
				HF.AddAffliction(targetCharacter, "cerebralhypoxia", 50, usingCharacter)
			end

			HF.GiveItem(targetCharacter, "ntsfx_slash")
		end
	end
end

NT.ItemMethods.osteosynthesisimplants = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)

	if
		HF.CanPerformSurgeryOn(targetCharacter) and HF.HasAfflictionLimb(targetCharacter, "drilledbones", limbtype, 99)
	then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 45) then
			-- the other stuff
			local function removeAfflictionPlusGainSkill(affidentifier, skillgain)
				if HF.HasAfflictionLimb(targetCharacter, affidentifier, limbtype) then
					HF.SetAfflictionLimb(targetCharacter, affidentifier, limbtype, 0, usingCharacter)

					if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
						HF.GiveSkillScaled(usingCharacter, "surgery", skillgain)
					else
						HF.GiveSkillScaled(usingCharacter, "medical", skillgain / 4)
					end
				end
			end
			local function removeAfflictionNonLimbSpecificPlusGainSkill(affidentifier, skillgain)
				if HF.HasAffliction(targetCharacter, affidentifier) then
					HF.SetAffliction(targetCharacter, affidentifier, 0, usingCharacter)

					if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
						HF.GiveSkillScaled(usingCharacter, "surgery", skillgain)
					else
						HF.GiveSkillScaled(usingCharacter, "medical", skillgain / 4)
					end
				end
			end

			local implantafflictions = {
				ll_fracture = { xpgain = 10000 },
				rl_fracture = { xpgain = 10000 },
				la_fracture = { xpgain = 10000 },
				ra_fracture = { xpgain = 10000 },
				h_fracture = { xpgain = 10000 },
				n_fracture = { xpgain = 10000 },
				t_fracture = { xpgain = 10000 },
				boneclamp = { xpgain = 0 },
				drilledbones = { xpgain = 0 },
			}

			for key, value in pairs(implantafflictions) do
				local prefab = AfflictionPrefab.Prefabs[key]
				if
					prefab ~= nil
					and (value.case == nil or HF.HasAfflictionLimb(targetCharacter, value.case, limbtype))
				then
					local skillgain = value.xpgain or 0
					if prefab.LimbSpecific then
						removeAfflictionPlusGainSkill(key, skillgain)
					elseif prefab.IndicatorLimb == limbtype then
						removeAfflictionNonLimbSpecificPlusGainSkill(key, skillgain)
					end
				end
			end

			HF.SetAfflictionLimb(targetCharacter, "bonegrowth", limbtype, 100, usingCharacter)
			item.Condition = item.Condition - 25
			if item.Condition <= 0 then
				HF.RemoveItem(item)
			end
		else
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 5, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 5, usingCharacter)
		end
	end
end
NT.ItemMethods.spinalimplant = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	if
		HF.CanPerformSurgeryOn(targetCharacter)
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 50)
		and HF.HasAffliction(targetCharacter, "t_paralysis", 0.1)
	then
		if HF.GetSurgerySkillRequirementMet(usingCharacter, 45) then
			HF.SetAffliction(targetCharacter, "t_paralysis", 0, usingCharacter)
			HF.RemoveItem(item)

			if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
				HF.GiveSkillScaled(usingCharacter, "surgery", 12000)
			else
				HF.GiveSkillScaled(usingCharacter, "medical", 6000)
			end
		else
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 5, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "internaldamage", limbtype, 5, usingCharacter)
		end
	end
end

NT.ItemMethods.endovascballoon = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		limbtype == LimbType.Torso
		and HF.HasAfflictionLimb(targetCharacter, "surgeryincision", limbtype, 1)
		and HF.HasAffliction(targetCharacter, "t_arterialcut", 1)
	then
		HF.AddAffliction(targetCharacter, "balloonedaorta", 100, usingCharacter)
		HF.SetAffliction(targetCharacter, "internalbleeding", 0, usingCharacter)

		if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
			HF.GiveSkillScaled(usingCharacter, "surgery", 10000)
		else
			HF.GiveSkillScaled(usingCharacter, "medical", 5000)
		end

		if HF.Chance(NTC.GetMultiplier(usingCharacter, "balloonconsumechance")) then
			HF.RemoveItem(item)
		end
	end
end
NT.ItemMethods.medstent = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if limbtype == LimbType.Torso and HF.HasAffliction(targetCharacter, "balloonedaorta", 1) then
		HF.SetAffliction(targetCharacter, "balloonedaorta", 0, usingCharacter)
		HF.SetAffliction(targetCharacter, "t_arterialcut", 0, usingCharacter)

		if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
			HF.GiveSkillScaled(usingCharacter, "surgery", 20000)
		else
			HF.GiveSkillScaled(usingCharacter, "medical", 10000)
		end
	end
end
NT.ItemMethods.drainage = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if
		limbtype == LimbType.Torso
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype)
		and HF.HasAffliction(targetCharacter, "pneumothorax")
	then
		HF.SetAffliction(targetCharacter, "pneumothorax", 0, usingCharacter)
		HF.SetAffliction(targetCharacter, "needlec", 0, usingCharacter)

		if HF.Chance(NTC.GetMultiplier(usingCharacter, "drainageconsumechance")) then
			HF.RemoveItem(item)
		end

		if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
			HF.GiveSkillScaled(usingCharacter, "surgery", 12000)
		else
			HF.GiveSkillScaled(usingCharacter, "medical", 6000)
		end
	end
end
NT.ItemMethods.needle = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type

	-- don't work on stasis
	if HF.HasAffliction(targetCharacter, "stasis", 0.1) then
		return
	end

	if limbtype == LimbType.Torso and not HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype) then
		if HF.GetSkillRequirementMet(usingCharacter, "medical", 20) then
			if
				HF.HasAffliction(targetCharacter, "pneumothorax")
				and not HF.HasAffliction(targetCharacter, "needlec", 0.1)
			then
				HF.GiveSkillScaled(usingCharacter, "medical", 4000)
			end
			HF.SetAffliction(targetCharacter, "needlec", 100, usingCharacter)
			HF.AddAffliction(targetCharacter, "pneumothorax", 1, usingCharacter)

			if HF.Chance(NTC.GetMultiplier(usingCharacter, "needleconsumechance")) then
				HF.RemoveItem(item)
			end
		else
			HF.AddAffliction(targetCharacter, "organdamage", 10, usingCharacter)
			HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 10, usingCharacter)
		end
	end
end

NT.ItemMethods.braintransplant = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local conditionmodifier = 0
	if not HF.GetSurgerySkillRequirementMet(usingCharacter, 100) then
		conditionmodifier = -40
	end
	local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100)
	if
		HF.HasAffliction(targetCharacter, "brainremoved", 1)
		and limbtype == LimbType.Head
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype)
	then
		HF.AddAffliction(targetCharacter, "cerebralhypoxia", -workcondition, usingCharacter)
		HF.SetAffliction(targetCharacter, "brainremoved", 0, usingCharacter)

		-- give character control to the donor
		if SERVER then
			local donorclient = item.Description
			local client = HF.ClientFromName(donorclient)
			if client ~= nil then
				client.SetClientCharacter(targetCharacter)
			end
		end

		HF.RemoveItem(item)
	end
end

local function reattachLimb(item, user, target, limb, itemlimbtype)
	local limbtype = HF.NormalizeLimbType(limb.type)
	if limbtype ~= itemlimbtype then
		return
	end

	if NT.LimbIsAmputated(target, limbtype) and HF.HasAfflictionLimb(target, "bonecut", limbtype, 99) then
		HF.SetAfflictionLimb(target, "bonecut", limbtype, 0, user)
		NT.SurgicallyAmputateLimb(target, limbtype, 0, 0)
		if NTSP ~= nil and NTConfig.Get("NTSP_enableSurgerySkill", true) then
			HF.GiveSkillScaled(usingCharacter, "surgery", 8000)
		else
			HF.GiveSkillScaled(usingCharacter, "medical", 4000)
		end
		HF.RemoveItem(item)
	end
end
NT.ItemMethods.rarm = function(item, usingCharacter, targetCharacter, limb)
	reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.RightArm)
end
NT.ItemMethods.larm = function(item, usingCharacter, targetCharacter, limb)
	reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.LeftArm)
end
NT.ItemMethods.rleg = function(item, usingCharacter, targetCharacter, limb)
	reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.RightLeg)
end
NT.ItemMethods.lleg = function(item, usingCharacter, targetCharacter, limb)
	reattachLimb(item, usingCharacter, targetCharacter, limb, LimbType.LeftLeg)
end

-- bionic prosthetics
NT.ItemMethods.rarmp = NT.ItemMethods.rarm
NT.ItemMethods.larmp = NT.ItemMethods.larm
NT.ItemMethods.rlegp = NT.ItemMethods.rleg
NT.ItemMethods.llegp = NT.ItemMethods.lleg

local function InfuseBloodpack(item, packtype, usingCharacter, targetCharacter, limb)
	-- determine compatibility
	local packhasantibodyA = string.find(packtype, "a")
	local packhasantibodyB = string.find(packtype, "b")
	local packhasantibodyC = string.find(packtype, "c") -- NT Cybernetics cyberblood
	local packhasantibodyRh = string.find(packtype, "plus")

	local targettype = NT.GetBloodtype(targetCharacter)

	local targethasantibodyA = string.find(targettype, "a")
	local targethasantibodyB = string.find(targettype, "b")
	local targethasantibodyC = string.find(targettype, "c")
	local targethasantibodyRh = string.find(targettype, "plus")

	local compatible = (targethasantibodyRh or not packhasantibodyRh)
		and (targethasantibodyA or not packhasantibodyA)
		and (targethasantibodyB or not packhasantibodyB)
		and (targethasantibodyC or not packhasantibodyC)
	-- TODO: give always true to team of bots on enemy submarines for future medic AI logic

	local bloodloss = HF.GetAfflictionStrength(targetCharacter, "bloodloss", 0)
	local usefulFraction = HF.Clamp(bloodloss / 30, 0, 1)

	if compatible then
		HF.AddAffliction(targetCharacter, "bloodloss", -30, usingCharacter)
		HF.AddAffliction(targetCharacter, "bloodpressure", 30, usingCharacter)
		HF.GiveSkillScaled(usingCharacter, "medical", 4000 * HF.BoolToNum(bloodloss > 100))
	else
		HF.AddAffliction(targetCharacter, "bloodloss", -20, usingCharacter)
		HF.AddAffliction(targetCharacter, "bloodpressure", 30, usingCharacter)
		HF.GiveSkillScaled(usingCharacter, "medical", 4000 * HF.BoolToNum(bloodloss > 100))
		local immunity = HF.GetAfflictionStrength(targetCharacter, "immunity", 100)
		HF.AddAffliction(targetCharacter, "hemotransfusionshock", math.max(immunity - 6, 0), usingCharacter)
	end

	-- move towards isotonic
	HF.SetAffliction(
		targetCharacter,
		"acidosis",
		HF.GetAfflictionStrength(targetCharacter, "acidosis", 0) * HF.Lerp(1, 0.9, usefulFraction)
	)
	HF.SetAffliction(
		targetCharacter,
		"alkalosis",
		HF.GetAfflictionStrength(targetCharacter, "alkalosis", 0) * HF.Lerp(1, 0.9, usefulFraction)
	)

	-- check if acidosis, alkalosis or sepsis
	local tags = HF.SplitString(item.Tags, ",")
	for tag in tags do
		if tag == "sepsis" then
			HF.AddAffliction(targetCharacter, "sepsis", 1, usingCharacter)
		end

		if HF.StartsWith(tag, "acid") then
			local split = HF.SplitString(tag, ":")
			if split[2] ~= nil then
				HF.AddAffliction(targetCharacter, "acidosis", tonumber(split[2]) / 5 * usefulFraction, usingCharacter)
			end
		elseif HF.StartsWith(tag, "alkal") then
			local split = HF.SplitString(tag, ":")
			if split[2] ~= nil then
				HF.AddAffliction(targetCharacter, "alkalosis", tonumber(split[2]) / 5 * usefulFraction, usingCharacter)
			end
		end
	end

	item.Condition = 0
	--HF.RemoveItem(item)
	HF.GiveItem(usingCharacter, "emptybloodpack")
	HF.GiveItem(targetCharacter, "ntsfx_syringe")
end
NT.ItemMethods.antibloodloss2 = function(item, usingCharacter, targetCharacter, limb)
	if item.Condition <= 0 then
		return
	end

	InfuseBloodpack(item, "ominus", usingCharacter, targetCharacter, limb)
end
NT.ItemMethods.stasisbag = function(item, usingCharacter, targetCharacter, limb)
	local condition = item.Condition
	if condition <= 0 or usingCharacter == targetCharacter then
		return
	end

	local targetInventory = targetCharacter.Inventory
	if targetInventory ~= nil then
		if targetInventory.TryPutItem(item, 4, false, true, usingCharacter, true, true) then
			HF.GiveItem(targetCharacter, "ntsfx_zipper")
		else
			local userInventory = usingCharacter.Inventory
			local targetItem = HF.GetOuterWear(targetCharacter)
			local lhand = HF.GetItemInLeftHand(usingCharacter)
			local rhand = HF.GetItemInRightHand(usingCharacter)
			if rhand ~= nil then
				userInventory.TryPutItem(rhand, nil, { InvSlotType.Any })
			end
			if lhand ~= nil then
				userInventory.TryPutItem(lhand, nil, { InvSlotType.Any })
			end
			userInventory.TryPutItem(targetItem, 5, true, true, usingCharacter, true, true)
			if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then
				HF.GiveItem(targetCharacter, "ntsfx_zipper")
			end
		end
	end
end
--NT.ItemMethods.emergencysuit = function(item, usingCharacter, targetCharacter, limb)
--	local condition = item.Condition
--	if condition <= 0 or usingCharacter == targetCharacter then
--		return
--	end
--
--	local targetInventory = targetCharacter.Inventory
--	if targetInventory ~= nil then
--		if targetInventory.TryPutItem(item, 4, false, true, usingCharacter, true, true) then
--			HF.GiveItem(targetCharacter, "ntsfx_zipper")
--		else
--			local userInventory = usingCharacter.Inventory
--			local targetItem = HF.GetOuterWear(targetCharacter)
--			local lhand = HF.GetItemInLeftHand(usingCharacter)
--			local rhand = HF.GetItemInRightHand(usingCharacter)
--			if rhand ~= nil then
--				userInventory.TryPutItem(rhand, nil, { InvSlotType.Any })
--			end
--			if lhand ~= nil then
--				userInventory.TryPutItem(lhand, nil, { InvSlotType.Any })
--			end
--			userInventory.TryPutItem(targetItem, 5, true, true, usingCharacter, true, true)
--			if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then
--				HF.GiveItem(targetCharacter, "ntsfx_zipper")
--			end
--		end
--	end
--end
NT.ItemMethods.autocpr = function(item, usingCharacter, targetCharacter, limb)
	local condition = item.Condition
	if targetCharacter.InWater then
		return
	end

	local targetInventory = targetCharacter.Inventory
	if targetInventory ~= nil then
		if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then
			HF.GiveItem(targetCharacter, "ntsfx_zipper")
		else
			local userInventory = usingCharacter.Inventory
			local targetItem = HF.GetOuterWear(targetCharacter)
			local lhand = HF.GetItemInLeftHand(usingCharacter)
			local rhand = HF.GetItemInRightHand(usingCharacter)
			if rhand ~= nil then
				userInventory.TryPutItem(rhand, nil, { InvSlotType.Any })
			end
			if lhand ~= nil then
				userInventory.TryPutItem(lhand, nil, { InvSlotType.Any })
			end
			userInventory.TryPutItem(targetItem, 5, true, true, usingCharacter, true, true)
			if targetInventory.TryPutItem(item, 4, true, true, usingCharacter, true, true) then
				HF.GiveItem(targetCharacter, "ntsfx_zipper")
			end
		end
	end
end
NT.ItemMethods.gelipack = function(item, usingCharacter, targetCharacter, limb)
	if item.Condition <= 25 then
		return
	end
	local limbtype = limb.type
	local success = HF.BoolToNum(HF.GetSkillRequirementMet(usingCharacter, "medical", 40), 1)
	HF.AddAfflictionLimb(targetCharacter, "iced", limbtype, 75 + success * 25, usingCharacter)

	if success and limbtype == LimbType.Torso and HF.HasAffliction(targetCharacter, "internalbleeding", 1) then
		local affAmount = HF.GetAfflictionStrengthLimb(targetCharacter, limbtype, "internalbleeding")
		local healedamount = math.min(affAmount, 100)
		HF.AddAfflictionLimb(targetCharacter, "internalbleeding", limbtype, -healedamount, usingCharacter)
		HF.GiveSkillScaled(usingCharacter, "medical", healedamount * 1000)
	end
	HF.GiveItem(targetCharacter, "ntsfx_bandage")

	item.Condition = item.Condition - 35
end

-- startswith region begins

-- transplants

NT.ItemStartsWithMethods.livertransplant = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local conditionmodifier = 0
	if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then
		conditionmodifier = -40
	end
	local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100)
	if
		HF.HasAffliction(targetCharacter, "liverremoved", 1)
		and limbtype == LimbType.Torso
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
	then
		HF.AddAffliction(targetCharacter, "liverdamage", -workcondition, usingCharacter)
		HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 5, usingCharacter)
		HF.SetAffliction(targetCharacter, "liverremoved", 0, usingCharacter)
		HF.RemoveItem(item)

		local rejectionchance = HF.Clamp(
			(HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10)
				/ 150
				* NTC.GetMultiplier(usingCharacter, "organrejectionchance"),
			0,
			1
		)
		if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then
			HF.SetAffliction(targetCharacter, "liverdamage", 100)
		end
	end
end
NT.ItemStartsWithMethods.hearttransplant = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local conditionmodifier = 0
	if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then
		conditionmodifier = -40
	end
	local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100)
	if
		HF.HasAffliction(targetCharacter, "heartremoved", 1)
		and limbtype == LimbType.Torso
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
	then
		HF.AddAffliction(targetCharacter, "heartdamage", -workcondition, usingCharacter)
		HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 5, usingCharacter)
		HF.SetAffliction(targetCharacter, "heartremoved", 0, usingCharacter)
		HF.RemoveItem(item)

		local rejectionchance = HF.Clamp(
			(HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10)
				/ 150
				* NTC.GetMultiplier(usingCharacter, "organrejectionchance"),
			0,
			1
		)
		if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then
			HF.SetAffliction(targetCharacter, "heartdamage", 100)
		end
	end
end
NT.ItemStartsWithMethods.lungtransplant = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local conditionmodifier = 0
	if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then
		conditionmodifier = -40
	end
	local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100)
	if
		HF.HasAffliction(targetCharacter, "lungremoved", 1)
		and limbtype == LimbType.Torso
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
	then
		HF.AddAffliction(targetCharacter, "lungdamage", -workcondition, usingCharacter)
		HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 5, usingCharacter)
		HF.SetAffliction(targetCharacter, "lungremoved", 0, usingCharacter)
		HF.RemoveItem(item)

		local rejectionchance = HF.Clamp(
			(HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10)
				/ 150
				* NTC.GetMultiplier(usingCharacter, "organrejectionchance"),
			0,
			1
		)
		if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then
			HF.SetAffliction(targetCharacter, "lungdamage", 100)
		end
	end
end
NT.ItemStartsWithMethods.kidneytransplant = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = limb.type
	local conditionmodifier = 0
	if not HF.GetSurgerySkillRequirementMet(usingCharacter, 40) then
		conditionmodifier = -40
	end
	local workcondition = HF.Clamp(item.Condition + conditionmodifier, 0, 100)
	if
		HF.HasAffliction(targetCharacter, "kidneyremoved", 1)
		and limbtype == LimbType.Torso
		and HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 99)
	then
		Timer.Wait(function()
			HF.SetAffliction(targetCharacter, "kidneyremoved", 0, usingCharacter)
		end, 5000)

		local rejectionchance = HF.Clamp(
			(HF.GetAfflictionStrength(targetCharacter, "immunity", 0) - 10)
				/ 150
				* NTC.GetMultiplier(usingCharacter, "organrejectionchance"),
			0,
			1
		)
		if HF.Chance(rejectionchance) and NTConfig.Get("NT_organRejection", false) then
			HF.RemoveItem(item)
			return
		end

		HF.AddAffliction(targetCharacter, "kidneydamage", -workcondition / 2, usingCharacter)
		HF.AddAffliction(targetCharacter, "organdamage", -workcondition / 10, usingCharacter)
		HF.RemoveItem(item)
	end
end

-- misc

NT.ItemStartsWithMethods.wrench = function(item, usingCharacter, targetCharacter, limb)
	local limbtype = HF.NormalizeLimbType(limb.type)
	if NT.LimbIsDislocated(targetCharacter, limbtype) then
		local skillrequired = 60
		if
			HF.HasAffliction(targetCharacter, "analgesia", 0.5)
			or HF.HasAffliction(targetCharacter, "afadrenaline", 0.5)
		then
			skillrequired = skillrequired - 30
		end

		if HF.GetSkillRequirementMet(usingCharacter, "medical", skillrequired) then
			NT.DislocateLimb(targetCharacter, limbtype, -1000)
			HF.GiveSkillScaled(usingCharacter, "medical", 4000)
		else
			NT.BreakLimb(targetCharacter, limbtype, 1)
		end

		if not HF.HasAffliction(targetCharacter, "analgesia", 0.5) then
			HF.AddAffliction(targetCharacter, "severepain", 5, usingCharacter)
		end
	elseif not HF.HasAffliction(targetCharacter, "sym_unconsciousness", 0.1) then
		local outerWearId = HF.GetOuterWearIdentifier(targetCharacter)
		if outerWearId == "stasisbag" or outerWearId == "bodybag" or outerWearId == "autocpr" then
			local usingInventory = usingCharacter.Inventory
			local equippedOuterItem = HF.GetOuterWear(targetCharacter)
			if usingInventory.TryPutItem(equippedOuterItem, nil, { InvSlotType.Any }) then
				HF.GiveItem(targetCharacter, "ntsfx_velcro")
			end
		end
	end
end
NT.ItemMethods.heavywrench = NT.ItemStartsWithMethods.wrench
NT.ItemMethods.repairpack = NT.ItemStartsWithMethods.wrench

NT.ItemStartsWithMethods.bloodpack = function(item, usingCharacter, targetCharacter, limb)
	if item.Condition <= 0 then
		return
	end

	local identifier = item.Prefab.Identifier.Value
	local packtype = string.sub(identifier, string.len("bloodpack") + 1)
	InfuseBloodpack(item, packtype, usingCharacter, targetCharacter, limb)
end

-- make it so that the person dragging the wearer of a body bag can drag fast
-- fast dragging may start a little late
Hook.Add("bodybag.dragfast", "bodybag.dragfast", function(effect, deltaTime, item, targets, worldPosition)
	local target = nil

	for key in targets do
		target = key
	end

	if target == nil then
		return
	end

	local dragger = target.SelectedBy
	if dragger == nil then
		return
	end
	HF.SetAffliction(dragger, "stretchers", 100)
end)

-- this exists purely for NT metabolism
Hook.Add("NT.RotOrgan", "NT.RotOrgan", function(effect, deltaTime, item, targets, worldPosition)
	if item then
		NT.RotOrgan(item)
	end
end)
function NT.RotOrgan(item)
	HF.RemoveItem(item)
end
NT.FixCondition = {
	"healthscanner",
	"bloodanalyzer",
	"defibrillator",
	"antisepticspray",
	"bvm",
	"autocpr",
}
function NT.RefreshCondition()
	for item in Item.ItemList do
		if HF.TableContains(NT.FixCondition, item.Prefab.Identifier.Value) then
			item.Condition = 100
		end
	end
end
Timer.Wait(function()
	NT.RefreshCondition()
end, 1000)
Hook.Add("roundStart", "NT.RoundStart.ConditionItems", function()
	Timer.Wait(function()
		NT.RefreshCondition()
	end, 10000)
end)
