303 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- NT functions for multiscalpel mode setting
 | 
						|
-- Hooks XML Lua events defined in the multiscalpel item.xml
 | 
						|
-- Hooks Lua event "roundStart" to RefreshAllMultiscalpels descriptions
 | 
						|
function NT.SetMultiscalpelFunction(item, func)
 | 
						|
	if func ~= "" then
 | 
						|
		item.Tags = "multiscalpel_" .. func
 | 
						|
	else
 | 
						|
		item.Tags = ""
 | 
						|
	end
 | 
						|
	NT.RefreshScalpelDescription(item)
 | 
						|
end
 | 
						|
 | 
						|
local function GetMultiscalpelMode(item)
 | 
						|
	local functiontag = ""
 | 
						|
	local tags = HF.SplitString(item.Tags, ",")
 | 
						|
	for tag in tags do
 | 
						|
		if HF.StartsWith(tag, "multiscalpel_") then
 | 
						|
			functiontag = HF.SplitString(tag, "_")[2]
 | 
						|
			break
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return functiontag
 | 
						|
end
 | 
						|
 | 
						|
function NT.RefreshScalpelDescription(item)
 | 
						|
	-- if not HF.ItemHasTag(item,"init") then return end
 | 
						|
	-- hostside only
 | 
						|
	if Game.IsMultiplayer and CLIENT then
 | 
						|
		return
 | 
						|
	end
 | 
						|
 | 
						|
	if not Entity.Spawner then
 | 
						|
		Timer.Wait(function()
 | 
						|
			NT.RefreshScalpelDescription(item)
 | 
						|
		end, 35)
 | 
						|
		return
 | 
						|
	end
 | 
						|
 | 
						|
	local functiontag = GetMultiscalpelMode(item)
 | 
						|
 | 
						|
	local description = ""
 | 
						|
	if functiontag ~= "" then
 | 
						|
		description = HF.GetText("multiscalpel." .. functiontag)
 | 
						|
	end
 | 
						|
 | 
						|
	if description == "" then
 | 
						|
		return
 | 
						|
	end
 | 
						|
 | 
						|
	local targetinventory = item.ParentInventory
 | 
						|
	local targetslot = 0
 | 
						|
	if targetinventory ~= nil then
 | 
						|
		targetslot = targetinventory.FindIndex(item)
 | 
						|
	end
 | 
						|
 | 
						|
	local function SpawnFunc(newscalpelitem, targetinventory)
 | 
						|
		if targetinventory ~= nil then
 | 
						|
			targetinventory.TryPutItem(newscalpelitem, targetslot, true, true, nil)
 | 
						|
		end
 | 
						|
		newscalpelitem.Description = description
 | 
						|
		newscalpelitem.Tags = "multiscalpel_" .. functiontag
 | 
						|
	end
 | 
						|
	HF.RemoveItem(item)
 | 
						|
	Timer.Wait(function()
 | 
						|
		local prefab = item.Prefab
 | 
						|
		Entity.Spawner.AddItemToSpawnQueue(prefab, item.WorldPosition, nil, nil, function(newscalpelitem)
 | 
						|
			SpawnFunc(newscalpelitem, targetinventory)
 | 
						|
		end)
 | 
						|
	end, 35)
 | 
						|
end
 | 
						|
 | 
						|
Hook.Add("roundStart", "NT.RoundStart.Multiscalpels", function()
 | 
						|
	Timer.Wait(function()
 | 
						|
		NT.RefreshAllMultiscalpels()
 | 
						|
	end, 10000) -- maybe 10 seconds is enough?
 | 
						|
end)
 | 
						|
 | 
						|
function NT.RefreshAllMultiscalpels()
 | 
						|
	-- descriptions dont get serialized, so i have to respawn
 | 
						|
	-- every scalpel every round to keep their descriptions (big oof)
 | 
						|
 | 
						|
	-- fetch scalpel items
 | 
						|
	local scalpelItems = {}
 | 
						|
	for item in Item.ItemList do
 | 
						|
		if item.Prefab.Identifier.Value == "multiscalpel" then
 | 
						|
			table.insert(scalpelItems, item)
 | 
						|
		end
 | 
						|
	end
 | 
						|
	-- refresh items
 | 
						|
	for scalpel in scalpelItems do
 | 
						|
		NT.RefreshScalpelDescription(scalpel)
 | 
						|
	end
 | 
						|
end
 | 
						|
Timer.Wait(function()
 | 
						|
	NT.RefreshAllMultiscalpels()
 | 
						|
end, 50)
 | 
						|
 | 
						|
Hook.Add(
 | 
						|
	"NT.multiscalpel.incision",
 | 
						|
	"NT.multiscalpel.incision",
 | 
						|
	function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
		NT.SetMultiscalpelFunction(item, "incision")
 | 
						|
	end
 | 
						|
)
 | 
						|
Hook.Add("NT.multiscalpel.kidneys", "NT.multiscalpel.kidneys", function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
	NT.SetMultiscalpelFunction(item, "kidneys")
 | 
						|
end)
 | 
						|
Hook.Add("NT.multiscalpel.liver", "NT.multiscalpel.liver", function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
	NT.SetMultiscalpelFunction(item, "liver")
 | 
						|
end)
 | 
						|
Hook.Add("NT.multiscalpel.lungs", "NT.multiscalpel.lungs", function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
	NT.SetMultiscalpelFunction(item, "lungs")
 | 
						|
end)
 | 
						|
Hook.Add("NT.multiscalpel.heart", "NT.multiscalpel.heart", function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
	NT.SetMultiscalpelFunction(item, "heart")
 | 
						|
end)
 | 
						|
Hook.Add("NT.multiscalpel.brain", "NT.multiscalpel.brain", function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
	NT.SetMultiscalpelFunction(item, "brain")
 | 
						|
end)
 | 
						|
Hook.Add("NT.multiscalpel.bandage", "NT.multiscalpel.bandage", function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
	NT.SetMultiscalpelFunction(item, "bandage")
 | 
						|
end)
 | 
						|
Hook.Add(
 | 
						|
	"NT.multiscalpel.speedflex",
 | 
						|
	"NT.multiscalpel.speedflex",
 | 
						|
	function(effect, deltaTime, item, targets, worldPosition)
 | 
						|
		NT.SetMultiscalpelFunction(item, "speedflex")
 | 
						|
	end
 | 
						|
)
 | 
						|
 | 
						|
NT.ItemMethods.multiscalpel = function(item, usingCharacter, targetCharacter, limb)
 | 
						|
	local limbtype = HF.NormalizeLimbType(limb.type)
 | 
						|
 | 
						|
	local mode = GetMultiscalpelMode(item)
 | 
						|
	if mode == "" then
 | 
						|
		mode = "none"
 | 
						|
	end
 | 
						|
 | 
						|
	local modeFunctions = {
 | 
						|
		none = function(item, usingCharacter, targetCharacter, limb) end,
 | 
						|
		incision = NT.ItemMethods.advscalpel,
 | 
						|
		kidneys = NT.ItemMethods.organscalpel_kidneys,
 | 
						|
		liver = NT.ItemMethods.organscalpel_liver,
 | 
						|
		lungs = NT.ItemMethods.organscalpel_lungs,
 | 
						|
		heart = NT.ItemMethods.organscalpel_heart,
 | 
						|
		brain = NT.ItemMethods.organscalpel_brain,
 | 
						|
		bandage = function(item, usingCharacter, targetCharacter, limb)
 | 
						|
			-- remove casts, bandages, and if none of those apply, cause some damage
 | 
						|
 | 
						|
			-- code snippet taken from NT.ItemMethods.traumashears
 | 
						|
			-- 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
 | 
						|
				NT.ItemMethods.traumashears(item, usingCharacter, targetCharacter, limb)
 | 
						|
			else
 | 
						|
				-- malpractice time!!!!
 | 
						|
				local open = HF.HasAfflictionLimb(targetCharacter, "retractedskin", limbtype, 1)
 | 
						|
				local istorso = limbtype == LimbType.Torso
 | 
						|
				local ishead = limbtype == LimbType.Head
 | 
						|
 | 
						|
				if not open then
 | 
						|
					HF.AddAfflictionLimb(targetCharacter, "bleeding", limbtype, 6 + math.random() * 4, usingCharacter)
 | 
						|
					HF.AddAfflictionLimb(
 | 
						|
						targetCharacter,
 | 
						|
						"lacerations",
 | 
						|
						limbtype,
 | 
						|
						2.5 + math.random() * 5,
 | 
						|
						usingCharacter
 | 
						|
					)
 | 
						|
					HF.GiveItem(targetCharacter, "ntsfx_slash")
 | 
						|
				else
 | 
						|
					if istorso then
 | 
						|
						-- stabbing an open torso (not good for the organs therein!)
 | 
						|
 | 
						|
						HF.AddAffliction(targetCharacter, "internalbleeding", 6 + math.random() * 12, usingCharacter)
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"lacerations",
 | 
						|
							limbtype,
 | 
						|
							4 + math.random() * 6,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"internaldamage",
 | 
						|
							limbtype,
 | 
						|
							4 + math.random() * 6,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
 | 
						|
						local case = math.random()
 | 
						|
						local casecount = 4
 | 
						|
						if case < 1 / casecount then
 | 
						|
							HF.AddAffliction(targetCharacter, "kidneydamage", 10 + math.random() * 10, usingCharacter)
 | 
						|
						elseif case < 2 / casecount then
 | 
						|
							HF.AddAffliction(targetCharacter, "liverdamage", 10 + math.random() * 10, usingCharacter)
 | 
						|
						elseif case < 3 / casecount then
 | 
						|
							HF.AddAffliction(targetCharacter, "lungdamage", 10 + math.random() * 10, usingCharacter)
 | 
						|
						elseif case < 4 / casecount then
 | 
						|
							HF.AddAffliction(targetCharacter, "heartdamage", 10 + math.random() * 10, usingCharacter)
 | 
						|
						end
 | 
						|
					elseif ishead then
 | 
						|
						-- stabbing an open head (brain surgery done right!)
 | 
						|
 | 
						|
						HF.AddAffliction(targetCharacter, "cerebralhypoxia", 15 + math.random() * 15, usingCharacter)
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"internaldamage",
 | 
						|
							limbtype,
 | 
						|
							10 + math.random() * 10,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"bleeding",
 | 
						|
							limbtype,
 | 
						|
							6 + math.random() * 12,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
					else
 | 
						|
						-- stabbing an open arm or leg (how to cause fractures)
 | 
						|
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"bleeding",
 | 
						|
							limbtype,
 | 
						|
							6 + math.random() * 6,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"lacerations",
 | 
						|
							limbtype,
 | 
						|
							4 + math.random() * 6,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
						HF.AddAfflictionLimb(
 | 
						|
							targetCharacter,
 | 
						|
							"internaldamage",
 | 
						|
							limbtype,
 | 
						|
							4 + math.random() * 6,
 | 
						|
							usingCharacter
 | 
						|
						)
 | 
						|
						if HF.Chance(0.1) then
 | 
						|
							NT.BreakLimb(targetCharacter, limbtype)
 | 
						|
						end
 | 
						|
					end
 | 
						|
 | 
						|
					HF.GiveItem(targetCharacter, "ntsfx_slash")
 | 
						|
				end
 | 
						|
			end
 | 
						|
		end,
 | 
						|
		speedflex = function(item, usingCharacter, targetCharacter, limb)
 | 
						|
			local animcontroller = targetCharacter.AnimController
 | 
						|
			local torsoLimb = limb
 | 
						|
			if animcontroller ~= nil then
 | 
						|
				torsoLimb = animcontroller.MainLimb
 | 
						|
			end
 | 
						|
 | 
						|
			if limbtype == LimbType.Head then
 | 
						|
				NT.ItemMethods.organscalpel_brain(item, usingCharacter, targetCharacter, limb)
 | 
						|
			elseif limbtype == LimbType.LeftArm then
 | 
						|
				NT.ItemMethods.organscalpel_kidneys(item, usingCharacter, targetCharacter, torsoLimb)
 | 
						|
			elseif limbtype == LimbType.Torso then
 | 
						|
				NT.ItemMethods.organscalpel_liver(item, usingCharacter, targetCharacter, torsoLimb)
 | 
						|
			elseif limbtype == LimbType.RightArm then
 | 
						|
				NT.ItemMethods.organscalpel_heart(item, usingCharacter, targetCharacter, torsoLimb)
 | 
						|
			elseif limbtype == LimbType.LeftLeg then
 | 
						|
				NT.ItemMethods.organscalpel_lungs(item, usingCharacter, targetCharacter, torsoLimb)
 | 
						|
			end
 | 
						|
		end,
 | 
						|
	}
 | 
						|
 | 
						|
	if modeFunctions[mode] ~= nil then
 | 
						|
		modeFunctions[mode](item, usingCharacter, targetCharacter, limb)
 | 
						|
	end
 | 
						|
 | 
						|
	if mode ~= "none" then
 | 
						|
		Timer.Wait(function()
 | 
						|
			item.Tags = "multiscalpel_" .. mode
 | 
						|
		end, 50)
 | 
						|
	end
 | 
						|
end
 |