• reworking illness addon/code
    1 replies, posted
Hi! I recently stumbled upon this [URL="https://facepunch.com/showthread.php?t=1462075"]script[/URL]. I am now trying to rework it into a infection script for my private server. My goal for this is when an NPC hits a player, they have a chance of getting infected. Now i'm almost certain I have to use an ontakedamage hook, but im not sure how to implement it. Here is the sv_autorun for it. [CODE]include("sh_ill.lua") local CoughSounds = {"ambient/voices/cough1.wav", "ambient/voices/cough2.wav", "ambient/voices/cough3.wav", "ambient/voices/cough4.wav"} local function IllCore() local str, index = table.Random(CoughSounds) for k,v in pairs(player.GetAll()) do if v:GetNWBool("isill") then if v.NextIll == nil then v.NextIll = CurTime() + Sick[v:GetNWString("illname")].Rate v:SetHealth(v:Health()-Sick[v:GetNWString("illname")].HP) v:EmitSound(str) if v:Health() <= 0 then v:Kill() v:SilentCure() end elseif CurTime() > v.NextIll then v.NextIll = CurTime() + Sick[v:GetNWString("illname")].Rate v:SetHealth(v:Health()-Sick[v:GetNWString("illname")].HP) v:EmitSound(str) if v:Health() <= 0 then v:Kill() v:SilentCure() end end end end end timer.Create( "Timer_Ill_Core", .1, 0, IllCore ) local SickQueue = {} local function InfectTheQueue() for k,v in pairs(player.GetAll()) do local str, index = table.Random(Sick) for o,i in pairs(SickQueue) do if v:SteamID() == i then v:GiveIll(index) end end end table.Empty(SickQueue) end function InfectRandomPlayers() table.Empty(SickQueue) if #team.GetPlayers(CureMedJob) >= 1 then if #player.GetAll() >= ReqMaxPlayersIll then for k,v in pairs(player.GetAll()) do if table.Count( SickQueue ) != RandomIllPlayers and v:Alive() and not v:isArrested() then table.insert( SickQueue, v:SteamID() ) else return end end InfectTheQueue() end end end timer.Create( "Timer_Pick_Random_Ill", RandomIll, 0, InfectRandomPlayers ) local function SpreadIllnesses() for k,v in pairs(player.GetAll()) do for o,i in pairs(ents.FindInSphere(v:GetPos(), IllSpreadRadius )) do if v:GetNWBool("isill") then if i:GetClass() == "player" then local illchance = math.random(1,2) if illchance == 1 and i:SteamID() != v:SteamID() then i:GiveIll(v:GetNWString("illname")) end end end end end end timer.Create( "Spread_Ill_Timer", IllSpreadTime, 0, SpreadIllnesses ) local function CheckMedicCure() if #team.GetPlayers(CureMedJob) < 1 then for k,v in pairs(player.GetAll()) do if v:GetNWBool("isill") then v:Cure() end end end end hook.Add("OnPlayerChangedTeam", "Ill_Cure_With_No_Medic", CheckMedicCure) hook.Add("PlayerDisconnected", "Ill_Cure_Medic_Dissconnect", CheckMedicCure) local function CureOnDeath( victim, inflictor, attacker) victim:SilentCure() end hook.Add("PlayerDeath", "Player_Cure_On_Death", CureOnDeath) [/CODE] here is the sh_ill (shared) code [CODE]include("sh_ill.lua") local CoughSounds = {"ambient/voices/cough1.wav", "ambient/voices/cough2.wav", "ambient/voices/cough3.wav", "ambient/voices/cough4.wav"} local function IllCore() local str, index = table.Random(CoughSounds) for k,v in pairs(player.GetAll()) do if v:GetNWBool("isill") then if v.NextIll == nil then v.NextIll = CurTime() + Sick[v:GetNWString("illname")].Rate v:SetHealth(v:Health()-Sick[v:GetNWString("illname")].HP) v:EmitSound(str) if v:Health() <= 0 then v:Kill() v:SilentCure() end elseif CurTime() > v.NextIll then v.NextIll = CurTime() + Sick[v:GetNWString("illname")].Rate v:SetHealth(v:Health()-Sick[v:GetNWString("illname")].HP) v:EmitSound(str) if v:Health() <= 0 then v:Kill() v:SilentCure() end end end end end timer.Create( "Timer_Ill_Core", .1, 0, IllCore ) local SickQueue = {} local function InfectTheQueue() for k,v in pairs(player.GetAll()) do local str, index = table.Random(Sick) for o,i in pairs(SickQueue) do if v:SteamID() == i then v:GiveIll(index) end end end table.Empty(SickQueue) end function InfectRandomPlayers() table.Empty(SickQueue) if #team.GetPlayers(CureMedJob) >= 1 then if #player.GetAll() >= ReqMaxPlayersIll then for k,v in pairs(player.GetAll()) do if table.Count( SickQueue ) != RandomIllPlayers and v:Alive() and not v:isArrested() then table.insert( SickQueue, v:SteamID() ) else return end end InfectTheQueue() end end end timer.Create( "Timer_Pick_Random_Ill", RandomIll, 0, InfectRandomPlayers ) local function SpreadIllnesses() for k,v in pairs(player.GetAll()) do for o,i in pairs(ents.FindInSphere(v:GetPos(), IllSpreadRadius )) do if v:GetNWBool("isill") then if i:GetClass() == "player" then local illchance = math.random(1,2) if illchance == 1 and i:SteamID() != v:SteamID() then i:GiveIll(v:GetNWString("illname")) end end end end end end timer.Create( "Spread_Ill_Timer", IllSpreadTime, 0, SpreadIllnesses ) local function CheckMedicCure() if #team.GetPlayers(CureMedJob) < 1 then for k,v in pairs(player.GetAll()) do if v:GetNWBool("isill") then v:Cure() end end end end hook.Add("OnPlayerChangedTeam", "Ill_Cure_With_No_Medic", CheckMedicCure) hook.Add("PlayerDisconnected", "Ill_Cure_Medic_Dissconnect", CheckMedicCure) local function CureOnDeath( victim, inflictor, attacker) victim:SilentCure() end hook.Add("PlayerDeath", "Player_Cure_On_Death", CureOnDeath) [/CODE] Any guidance or help would be greatly appreciated! Thanks!
Well you can start here with this hook. [URL="http://wiki.garrysmod.com/page/GM/EntityTakeDamage"]here[/URL] Also I'd suggest reading through that thread that you found this in, they explain to the OP that variables should be networked with the net library. -edit- so I created something really small that applies effects based on the disease, as well as has a function to print out the status effects that the disease causes to send to players, all you really have to do is just network stuff to the client and change around a few things to your liking. Not sure how efficient this all is but it works. [CODE]--serverside diseases = { ["flu"] = { ["sideeffects"] = { "coughing", "vomiting", "other"}, ["statuseffects"] = function(ply) if IsValid(ply) then ply:TakeDamage(1) end end, }, }; hook.Add("PlayerInitialSpawn", "setIllnessStat", function(ply) ply.sickness = "none"; ply.isSick = false; end) hook.Add("PlayerSpawn", "resetIllness", function(ply) ply.sickness = "none"; ply.isSick = false; end) hook.Add("Initialize", "illnessTimer", function() timer.Create("checkSickness", 1, 0, function() local players = player.GetAll(); for k, v in pairs(players) do if IsValid(v) then if v:Alive() then v:calcSickness() print("updating player on disease") print(v.sickness) else print("currently dead") end end end end) end) hook.Add("EntityTakeDamage", "infectPlayers", function(target, dmg) if target:IsPlayer() and dmg:GetAttacker():IsNPC() or dmg:GetAttacker():IsPlayer() then local chanceToInfect = math.random(1, 10); --10 percent chance on npc attack to infect a player if chanceToInfect == 1 then target:setSickness("flu") target:PrintMessage(3, "you've been infected") end end end) local p = FindMetaTable("Player"); function p:calcSickness() if self.isSick == true then return diseases[self.sickness]["statuseffects"](self) end end function p:setSickness(name) self.sickness = name; self.isSick = true; end function p:Cure() if !self.isSick then print("not sick") return end self.sickness = "none"; self.isSick = false; end function p:getSideEffects() if !self.isSick then print("not sick") return end for k, v in pairs(diseases[self.sickness]["sideeffects"]) do print(v) end end[/CODE]
Sorry, you need to Log In to post a reply to this thread.