Files
wnsrc/gamemodes/darkrp/plugins/cigarettes/sv_plugin.lua
lifestorm df294d03aa Upload
2024-08-04 23:54:45 +03:00

246 lines
8.6 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local ents = ents
local tonumber = tonumber
local netstream = netstream
local timer = timer
local IsValid = IsValid
local IsEntity = IsEntity
local string = string
local tostring = tostring
local math = math
local Vector = Vector
local CurTime = CurTime
local PLUGIN = PLUGIN
function PLUGIN:CreateCigarette(item, client)
local entity = ents.Create("ix_cigarette")
entity:SetOwner(client)
entity:SetParent(client)
entity:Fire("SetParentAttachment", "cigarette", 0.01)
entity:SetModel( "models/willardnetworks/cigarettes/cigarette.mdl" )
entity:SetModelScale(0.7)
entity:CreateJetLengthTimer()
entity:ChangeSkinStateTimer()
entity:Spawn()
local length = item:GetData("length", 0)
entity:SetFlexWeight(entity.flexIndexLength, tonumber(length))
client.cigarette = entity
item.cigaretteEnt = entity
entity.cigaretteItem = item
netstream.Start(client, "CigaretteSetClientEntity", item:GetID(), entity, false)
end
function PLUGIN:CreateCigaretteSmoke(entity)
entity.smoke = ents.Create( "env_smokestack" )
entity.smoke:SetParent(entity:GetParent())
entity.smoke:Fire("SetParentAttachment", "cigarette_glow", 0.01)
entity.smoke:SetKeyValue("InitialState", "1")
entity.smoke:SetKeyValue("WindAngle", "90 0 0")
entity.smoke:SetKeyValue("WindSpeed", "0.6")
entity.smoke:SetKeyValue("rendercolor", "162 162 162")
entity.smoke:SetKeyValue("renderamt", "6") -- alpha
entity.smoke:SetKeyValue("SmokeMaterial", "particle/smokesprites_0001.vmt")
entity.smoke:SetKeyValue("BaseSpread", "0.2")
entity.smoke:SetKeyValue("SpreadSpeed", "0.4")
entity.smoke:SetKeyValue("Speed", "1.4")
entity.smoke:SetKeyValue("StartSize", "0.3")
entity.smoke:SetKeyValue("EndSize", "1.5")
entity.smoke:SetKeyValue("roll", "32")
entity.smoke:SetKeyValue("Rate", "24")
entity.smoke:SetKeyValue("twist", "32")
entity:DeleteOnRemove(entity.smoke)
entity.smoke:Spawn()
entity.smoke:Activate()
timer.Simple(0.25, function()
if !IsValid(entity) then return end
if !IsEntity(entity) then return end
if entity.cigaretteItem and entity.cigaretteItem.GetID and ix.item.instances[entity.cigaretteItem:GetID()] then
local lastSmokePos = tonumber(string.Right(tostring(math.Round(entity:GetFlexWeight(entity.flexIndexLength), 2)), 2))
if entity.cigaretteItem:GetData("length", 0) > 0 then
self:ChangeSmokePos(entity, entity:GetParent(), lastSmokePos)
end
end
end)
end
function PLUGIN:ChangeSkinStateTimer(entity)
if timer.Exists("ChangeSkinStateCigarette_"..entity:EntIndex()) then timer.Remove("ChangeSkinStateCigarette_"..entity:EntIndex()) end
timer.Create("ChangeSkinStateCigarette_"..entity:EntIndex(), math.random(3, 7), 0, function()
if !IsValid(entity) then timer.Remove("ChangeSkinStateCigarette_"..entity:EntIndex()) return end
local parent = entity:GetParent()
if !IsValid(parent) then timer.Remove("ChangeSkinStateCigarette_"..entity:EntIndex()) return end
if parent.Alive and !parent:Alive() then timer.Remove("ChangeSkinStateCigarette_"..entity:EntIndex()) return end
if !entity.state then entity.state = 1 end
if (entity.state or 0) != 2 then
timer.Adjust("ChangeSkinStateCigarette_"..entity:EntIndex(), 2, 0, nil)
else
timer.Adjust("ChangeSkinStateCigarette_"..entity:EntIndex(), math.random(3, 7), 0, nil)
end
entity.state = ((entity.state or 0) > 1 and 1 or 2)
entity:SetSkin(entity.state)
if entity.cigaretteItem and entity.cigaretteItem.GetID and ix.item.instances[entity.cigaretteItem:GetID()] then
local length = entity:GetFlexWeight(entity.flexIndexLength)
entity.cigaretteItem:SetData("length", length)
end
end)
end
function PLUGIN:CreateJetLengthTimer(entity)
if timer.Exists("ChangeJetLengthCigarette_"..entity:EntIndex()) then timer.Remove("ChangeJetLengthCigarette_"..entity:EntIndex()) end
timer.Create("ChangeJetLengthCigarette_"..entity:EntIndex(), 0.2, 0, function()
if !IsValid(entity) then timer.Remove("ChangeJetLengthCigarette_"..entity:EntIndex()) return end
local parent = entity:GetParent()
if !IsValid(parent) then timer.Remove("ChangeJetLengthCigarette_"..entity:EntIndex()) return end
if parent.Alive and !parent:Alive() then timer.Remove("ChangeJetLengthCigarette_"..entity:EntIndex()) return end
if IsValid(entity.smoke) and parent:GetMoveType() == 8 then entity.smoke:Remove() return end
if IsValid(entity) and (!IsValid(entity.smoke) or (IsValid(entity.smoke) and !entity.smoke:GetInternalVariable("JetLength"))) then
if parent.cigarette and parent.cigarette.isLit then self:CreateCigaretteSmoke(entity) return end
end
if IsValid(entity.smoke) then
if parent:GetVelocity():Length2D() > parent:GetWalkSpeed() then
if math.Round(tonumber(entity.smoke:GetInternalVariable("JetLength")), 1) != 0.2 then entity.smoke:SetKeyValue("JetLength", "0.2") end
else
if tonumber(entity.smoke:GetInternalVariable("JetLength")) != 10 then entity.smoke:SetKeyValue("JetLength", "10") end
end
end
if entity.cigaretteItem and entity.cigaretteItem.GetID and ix.item.instances[entity.cigaretteItem:GetID()] then
if !parent then return end
if !entity.cigaretteItem:CheckIfModelAllowed(parent) then entity.cigaretteItem:OnRunStopSmoke(parent) end
end
end)
end
function PLUGIN:ChangeSmokePos(entity, parent, fixedPos)
if (IsValid(entity) and IsEntity(entity) and entity) then
if (entity.smoke and IsEntity(entity.smoke) and parent and IsValid(parent)) then
if parent:GetMoveType() != 8 then
if fixedPos then
fixedPos = (fixedPos * 0.001) * 10
entity.smoke:SetPos(entity.smoke:GetPos() + Vector(-fixedPos * parent:GetForward(), 0, 0))
return
end
entity.smoke:SetPos(entity.smoke:GetPos() + Vector(-0.001 * parent:GetForward(), 0, 0))
end
end
end
end
function PLUGIN:CigaretteThink(entity)
local currentWeightLength = entity:GetFlexWeight( entity.flexIndexLength )
local parent = entity:GetParent()
if !parent.cigarette then return end
if !parent.cigarette.isLit then return end
if currentWeightLength >= entity.maxValueLength then
if (SERVER) then
if IsValid(entity) and IsEntity(entity) then
if entity.cigaretteItem and entity.cigaretteItem.SmokingFinished then
entity.cigaretteItem:SmokingFinished(entity:GetParent(), 1)
end
end
end
return
end
if CurTime() < entity.smokeDelay then return end
if parent and parent:GetMoveType() == 8 then return end
if parent and !parent:Alive() or !parent then
if (SERVER) then
if IsValid(entity) and IsEntity(entity) then
entity:Remove()
end
end
return
end
self:ChangeSmokePos(entity, parent)
-- Length
entity:SetFlexWeight( entity.flexIndexLength, entity:GetLengthValue(currentWeightLength) )
-- Ashes
entity:SetFlexWeight( entity.flexIndexAshes, entity:GetAshesValue() )
entity.smokeDelay = CurTime() + 3
entity:NextThink( CurTime() ) -- Set the next think to run as soon as possible, i.e. the next frame.
return true -- Apply NextThink call
end
-- Cigarette gets smaller over time and ashes effect
function PLUGIN:GetAshesValue(entity)
local currentWeightAshes = entity:GetFlexWeight( entity.flexIndexAshes )
if currentWeightAshes < 0.5 or currentWeightAshes < 0.1 then
return math.Clamp( currentWeightAshes + entity.addValueAshes, entity.minValueAshes, entity.maxValueAshes)
else
return 0.1
end
end
function PLUGIN:GetLengthValue(entity, currentLength)
return math.Clamp( currentLength + entity.addValueLength, entity.minValueLength, entity.maxValueLength )
end
function PLUGIN:PlayerDisconnected(client)
if (client.cigarette) then
local cigaretteItem = client.cigarette.cigaretteItem
if cigaretteItem then
cigaretteItem:OnRunStopSmoke()
end
end
end
function PLUGIN:CanPlayerUseCharacter(client, character)
if (client.cigarette and IsValid(client.cigarette)) then
return false, "You currently have a cigarette in your mouth, you cannot switch characters whilst having so!"
end
end
function PLUGIN:PlayerDeath(client)
if (client.cigarette) then
local cigaretteItem = client.cigarette.cigaretteItem
if (cigaretteItem) then
cigaretteItem:OnRunStopSmoke()
if (cigaretteItem.cigaretteEnt) then cigaretteItem.cigaretteEnt:Remove() end
if (client.cigarette) then client.cigarette = nil end
end
end
end