mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
203 lines
6.0 KiB
Lua
203 lines
6.0 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 PLUGIN = PLUGIN
|
||
|
|
|
||
|
|
ITEM.name = "Cigarette"
|
||
|
|
ITEM.description = "A cigarette."
|
||
|
|
ITEM.model = Model("models/willardnetworks/cigarettes/cigarette.mdl")
|
||
|
|
ITEM.width = 1
|
||
|
|
ITEM.height = 1
|
||
|
|
ITEM.junkCleanTime = 120
|
||
|
|
|
||
|
|
if (CLIENT) then
|
||
|
|
function ITEM:PopulateTooltip(tooltip)
|
||
|
|
local length = self:GetData("length", 0)
|
||
|
|
|
||
|
|
local panel = tooltip:AddRowAfter("name", "remaining tobacco")
|
||
|
|
panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
|
||
|
|
panel:SetText("Remaining Tobacco: "..(math.Round(math.Remap(length, 0, 1, 100, 0), 0)).."%")
|
||
|
|
panel:SizeToContents()
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:PaintOver(item, w, h)
|
||
|
|
local length = item:GetData("length", 0)
|
||
|
|
surface.SetDrawColor(length >= 1 and (Color(255, 110, 110, 100)) or (length < 1 and length != 0 and Color(255, 193, 110, 100)) or (Color(110, 255, 110, 100)))
|
||
|
|
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:GetModelFlexes()
|
||
|
|
return {[0] = self:GetData("length", 0)}
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:CreateCigarette(client)
|
||
|
|
if ( SERVER ) then
|
||
|
|
PLUGIN:CreateCigarette(self, client)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:CheckIfModelAllowed(client)
|
||
|
|
local faceIndex = client:FindBodygroupByName("face")
|
||
|
|
|
||
|
|
if string.find(client:GetModel(), "models/willardnetworks/citizens/") then
|
||
|
|
local headIndex = client:FindBodygroupByName("head")
|
||
|
|
if client:GetBodygroup(faceIndex) == 1 or client:GetBodygroup(headIndex) == 4 then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if string.find(client:GetModel(), "models/thomask_110/") then
|
||
|
|
if client:GetBodygroup(faceIndex) == 3 or client:GetBodygroup(faceIndex) == 4 then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if string.find(client:GetModel(), "models/willardnetworks/vortigaunt.mdl") and client:GetBodygroup(faceIndex) == 1 then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if string.find(client:GetModel(), "models/wn7new/metropolice/") and client:GetBodygroup(client:FindBodygroupByName("Cp_Head")) > 0 then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if string.find(client:GetModel(), "models/wn7new/metropolice_c8/") and client:GetBodygroup(client:FindBodygroupByName("Cp_Head")) > 0 then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
for _, v in pairs(PLUGIN.allowedModels) do
|
||
|
|
if string.find(client:GetModel(), v) then return true end
|
||
|
|
end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:OnCanRunSmoke()
|
||
|
|
local client = self.player
|
||
|
|
|
||
|
|
local length = self:GetData("length", 0)
|
||
|
|
if length >= 1 then return false end
|
||
|
|
if client and !self:CheckIfModelAllowed(client) then return false end
|
||
|
|
if math.Round(math.Remap(length, 0, 1, 100, 0), 0) == 0 then return false end
|
||
|
|
if self.entity then return false end
|
||
|
|
if client and client.cigarette and IsValid(client.cigarette) then return false end
|
||
|
|
if !self.cigaretteEnt then return true end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:OnRunSmoke()
|
||
|
|
local client = self.player
|
||
|
|
if !client then return false end
|
||
|
|
if (!client:Alive()) then return false end
|
||
|
|
|
||
|
|
self:CreateCigarette(client)
|
||
|
|
client:NotifyLocalized("You insert the cigarette into your mouth. Use a lighter to light it.")
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:OnRunStopSmoke(client, value, bRemove)
|
||
|
|
client = client or self.player
|
||
|
|
|
||
|
|
if !client then return false end
|
||
|
|
if (!client:Alive()) then return false end
|
||
|
|
|
||
|
|
if (value and !bRemove) then
|
||
|
|
self:SetData("length", value)
|
||
|
|
end
|
||
|
|
|
||
|
|
if IsValid(self.cigaretteEnt) and IsEntity(self.cigaretteEnt) then
|
||
|
|
if !value and !bRemove then
|
||
|
|
local length = self.cigaretteEnt:GetFlexWeight(self.cigaretteEnt.flexIndexLength)
|
||
|
|
self:SetData("length", length)
|
||
|
|
end
|
||
|
|
|
||
|
|
self.cigaretteEnt:Remove()
|
||
|
|
client.cigarette = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
self.cigaretteEnt = nil
|
||
|
|
|
||
|
|
client:NotifyLocalized(self:GetData("length") == 1 and "You finish smoking the cigarette - all that is left is the cigarette butt." or "You have removed the cigarette from your mouth.")
|
||
|
|
|
||
|
|
local itemID = self:GetID()
|
||
|
|
if bRemove then
|
||
|
|
self:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
netstream.Start(client, "CigaretteSetClientEntity", itemID, nil, nil)
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:OnCanRunStopSmoke()
|
||
|
|
local length = self:GetData("length", 0)
|
||
|
|
if length >= 1 then return false end
|
||
|
|
if math.Round(math.Remap(length, 0, 1, 100, 0), 0) == 0 then return false end
|
||
|
|
if self.cigaretteEnt and IsEntity(self.cigaretteEnt) then return true end
|
||
|
|
if self.player and !self:CheckIfModelAllowed(self.player) then return false end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:SmokingFinished(client, value)
|
||
|
|
self:OnRunStopSmoke(client, value, true)
|
||
|
|
end
|
||
|
|
|
||
|
|
function ITEM:OnTransferred(curInv, inventory)
|
||
|
|
local client = self.player
|
||
|
|
if client and client.cigarette and IsEntity(client.cigarette) and client.cigarette.cigaretteItem and client.cigarette.cigaretteItem == self then
|
||
|
|
self:OnRunStopSmoke()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
ITEM.functions.smoke = {
|
||
|
|
name = "Place in mouth",
|
||
|
|
tip = "Place the cigarette in your mouth.",
|
||
|
|
icon = "icon16/brick_add.png",
|
||
|
|
OnRun = function(item)
|
||
|
|
item:OnRunSmoke()
|
||
|
|
|
||
|
|
return false
|
||
|
|
end,
|
||
|
|
|
||
|
|
OnCanRun = function(item)
|
||
|
|
if item:OnCanRunSmoke() then return true end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
}
|
||
|
|
|
||
|
|
ITEM.functions.stopsmoke = {
|
||
|
|
name = "Remove from mouth",
|
||
|
|
tip = "Remove the cigarette from your mouth/unlight it.",
|
||
|
|
icon = "icon16/brick_add.png",
|
||
|
|
OnRun = function(item)
|
||
|
|
item:OnRunStopSmoke()
|
||
|
|
|
||
|
|
return false
|
||
|
|
end,
|
||
|
|
OnCanRun = function(item)
|
||
|
|
if item:OnCanRunStopSmoke() then return true end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
}
|
||
|
|
|
||
|
|
if (CLIENT) then
|
||
|
|
netstream.Hook("CigaretteSetClientEntity", function(itemID, entIndex, isLit)
|
||
|
|
if itemID and ix.item.instances[itemID] then
|
||
|
|
ix.item.instances[itemID].cigaretteEnt = entIndex or nil
|
||
|
|
end
|
||
|
|
|
||
|
|
LocalPlayer().cigarette = entIndex or nil
|
||
|
|
|
||
|
|
if !LocalPlayer().cigarette then return end
|
||
|
|
LocalPlayer().cigarette.isLit = isLit or nil
|
||
|
|
end)
|
||
|
|
end
|