mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
246 lines
8.6 KiB
Lua
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 |