mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
@@ -0,0 +1,394 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
ITEM.name = "Bodygroup Clothing"
|
||||
ITEM.model = Model("models/props_c17/BriefCase001a.mdl")
|
||||
ITEM.description = "A generic piece of clothing."
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item.outlineColor and not item:GetData("equip")) then
|
||||
surface.SetDrawColor(item.outlineColor)
|
||||
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
|
||||
end
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:PopulateTooltip(tooltip)
|
||||
if (self:GetData("equip")) then
|
||||
local name = tooltip:GetRow("name")
|
||||
name:SetBackgroundColor(derma.GetColor("Success", tooltip))
|
||||
end
|
||||
|
||||
if (self.maxArmor) then
|
||||
local panel = tooltip:AddRowAfter("name", "armor")
|
||||
panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
|
||||
panel:SetText("Armor: " .. (self:GetData("equip") and LocalPlayer():Armor() or self:GetData("armor", self.maxArmor)))
|
||||
panel:SizeToContents()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:RemoveOutfit(client)
|
||||
local char = client.GetCharacter and client:GetCharacter()
|
||||
|
||||
self:SetData("equip", false)
|
||||
if (self.maxArmor) then
|
||||
self:SetData("armor", math.Clamp(client:Armor(), 0, self.maxArmor))
|
||||
client:SetArmor(0)
|
||||
end
|
||||
|
||||
local groups = char:GetData("groups", {})
|
||||
|
||||
if self.bodyGroups then
|
||||
for k in pairs(self.bodyGroups) do
|
||||
local index = client:FindBodygroupByName(k)
|
||||
|
||||
if (index > -1) then
|
||||
groups[index] = 0
|
||||
char:SetData("groups", groups)
|
||||
client:SetBodygroup(index, 0)
|
||||
|
||||
netstream.Start(client, "ItemEquipBodygroups", index, 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if self.outfitCategory == "Head" then
|
||||
local hairIndex = client:FindBodygroupByName("hair")
|
||||
local hair = char.GetHair and char:GetHair() or {}
|
||||
local curHair = hair.hair or false
|
||||
|
||||
if curHair then
|
||||
if char then
|
||||
groups[hairIndex] = curHair
|
||||
char:SetData("groups", groups)
|
||||
end
|
||||
|
||||
client:SetBodygroup(hairIndex, curHair)
|
||||
netstream.Start(client, "ItemEquipBodygroups", hairIndex, curHair)
|
||||
end
|
||||
end
|
||||
|
||||
if (self.proxy) then
|
||||
local charProxies = char and char:GetProxyColors() or {}
|
||||
|
||||
for proxy, _ in pairs(self.proxy) do
|
||||
if charProxies[proxy] then
|
||||
charProxies[proxy] = nil
|
||||
end
|
||||
end
|
||||
|
||||
char:SetProxyColors(charProxies)
|
||||
end
|
||||
end
|
||||
|
||||
ITEM:Hook("drop", function(item)
|
||||
if (item.isGasmask and item.player:GetFilterItem()) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (item:GetData("equip")) then
|
||||
item:RemoveOutfit(item:GetOwner())
|
||||
end
|
||||
end)
|
||||
|
||||
ITEM.functions.Repair = { -- sorry, for name order.
|
||||
name = "Repair",
|
||||
tip = "repairTip",
|
||||
icon = "icon16/wrench.png",
|
||||
OnRun = function(item)
|
||||
local item = item
|
||||
local player = item.player
|
||||
|
||||
player:Freeze(true)
|
||||
player:SetAction("Repairing Armor...", 5, function()
|
||||
if !IsValid(player) then return end
|
||||
player:Freeze(false)
|
||||
item:Repair(player)
|
||||
end)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(item)
|
||||
local client = item.player
|
||||
|
||||
if timer.Exists("combattimer" .. item.player:SteamID64()) then
|
||||
item.player:Notify("You cannot use this item while in combat.")
|
||||
return false
|
||||
end
|
||||
|
||||
return (item.maxArmor != nil and item:GetData("equip") == false and !IsValid(item.entity)
|
||||
and IsValid(client) and client:GetCharacter():GetInventory():HasItem("tool_repair") and item:GetData("armor") < item.maxArmor
|
||||
and (client.nextRepair or 0) <= CurTime())
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.EquipUn = { -- sorry, for name order.
|
||||
name = "Unequip",
|
||||
tip = "unequipTip",
|
||||
icon = "icon16/cross.png",
|
||||
OnRun = function(item, creationClient)
|
||||
local client = item.player or creationClient
|
||||
|
||||
if (client) then
|
||||
item:RemoveOutfit(client)
|
||||
|
||||
client:UpdateLegs()
|
||||
|
||||
if item.OnUnEquip then
|
||||
item:OnUnEquip(client)
|
||||
end
|
||||
else
|
||||
item:SetData("equip", false)
|
||||
|
||||
client:UpdateLegs()
|
||||
|
||||
if item.OnUnEquip then
|
||||
item:OnUnEquip(client)
|
||||
end
|
||||
end
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(item, creationClient)
|
||||
local client = item.player or creationClient
|
||||
|
||||
return !IsValid(item.entity) and IsValid(client) and item:GetData("equip") == true and
|
||||
hook.Run("CanPlayerUnequipItem", client, item) != false and item:CanUnequipOutfit(client)
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:OnEquip(client)
|
||||
if !client or client and !IsValid(client) then return end
|
||||
if !client.GetNumBodyGroups then return end
|
||||
if !client.GetModel then return end
|
||||
local model = client:GetModel()
|
||||
local model1, model2 = "models/willardnetworks/citizens/", "wn7new/metropolice"
|
||||
if !model:find(model1) and !model:find(model2) then return end
|
||||
|
||||
local hairBG = client:FindBodygroupByName( "hair" )
|
||||
local toFind = model:find(model1) and "headwear" or "cp_Head"
|
||||
local curHeadwearBG = client:GetBodygroup(client:FindBodygroupByName( toFind ))
|
||||
local curHairBG = client:GetBodygroup(hairBG)
|
||||
|
||||
local hairBgLength = 0
|
||||
for _, v in pairs(client:GetBodyGroups()) do
|
||||
if v.name != "hair" then continue end
|
||||
if !v.submodels then continue end
|
||||
if !istable(v.submodels) then continue end
|
||||
|
||||
hairBgLength = #v.submodels
|
||||
break
|
||||
end
|
||||
|
||||
if (curHeadwearBG != 0) then
|
||||
if curHairBG != 0 or model:find(model2) then
|
||||
local char = client.GetCharacter and client:GetCharacter()
|
||||
if char then
|
||||
local groups = char:GetData("groups", {})
|
||||
groups[hairBG] = hairBgLength
|
||||
char:SetData("groups", groups)
|
||||
end
|
||||
|
||||
client:SetBodygroup(hairBG, hairBgLength)
|
||||
netstream.Start(client, "ItemEquipBodygroups", hairBG, hairBgLength)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.Equip = {
|
||||
name = "Equip",
|
||||
tip = "equipTip",
|
||||
icon = "icon16/tick.png",
|
||||
OnRun = function(item, creationClient)
|
||||
local client = item.player or creationClient
|
||||
local char = client:GetCharacter()
|
||||
local items = char:GetInventory():GetItems()
|
||||
local groups = char:GetData("groups", {})
|
||||
|
||||
-- Checks if any [Torso] is already equipped.
|
||||
for _, v in pairs(items) do
|
||||
if (v.id != item.id) then
|
||||
local itemTable = ix.item.instances[v.id]
|
||||
|
||||
if (v.outfitCategory == item.outfitCategory and itemTable:GetData("equip")) then
|
||||
client:NotifyLocalized(item.equippedNotify or "outfitAlreadyEquipped")
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (item.maxArmor) then
|
||||
client:SetArmor(item:GetData("armor", item.maxArmor))
|
||||
end
|
||||
|
||||
item:SetData("equip", true)
|
||||
|
||||
if (item.proxy) then
|
||||
local charProxies = char:GetProxyColors() or {}
|
||||
|
||||
for proxy, color in pairs(item.proxy) do
|
||||
charProxies[proxy] = color
|
||||
end
|
||||
|
||||
char:SetProxyColors(charProxies)
|
||||
end
|
||||
|
||||
client:UpdateLegs()
|
||||
|
||||
if (item.bodyGroups) then
|
||||
for k, value in pairs(item.bodyGroups) do
|
||||
local index = client:FindBodygroupByName(k)
|
||||
|
||||
if (index > -1) then
|
||||
groups[index] = value
|
||||
char:SetData("groups", groups)
|
||||
client:SetBodygroup(index, value)
|
||||
|
||||
netstream.Start(client, "ItemEquipBodygroups", index, value)
|
||||
|
||||
if item.OnEquip then
|
||||
item:OnEquip(client)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(item, creationClient)
|
||||
local client = item.player or creationClient
|
||||
|
||||
if (item.factionList and !table.HasValue(item.factionList, client:GetCharacter():GetFaction())) then
|
||||
return false
|
||||
end
|
||||
|
||||
-- I shouldn't hardcode this but I can't think of any other instance where we'd need this, so meh.
|
||||
-- luacheck: ignore 1
|
||||
if (client:Team() == FACTION_VORT and (!item.factionList or !table.HasValue(item.factionList, FACTION_VORT))) then
|
||||
return false
|
||||
end
|
||||
|
||||
return !IsValid(item.entity) and IsValid(client) and item:GetData("equip") != true
|
||||
and hook.Run("CanPlayerEquipItem", client, item) != false and item:CanEquipOutfit(client)
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:Repair(client, amount)
|
||||
local repairItem = client:GetCharacter():GetInventory():HasItem("tool_repair")
|
||||
|
||||
if (repairItem) then
|
||||
amount = amount or self.maxArmor
|
||||
|
||||
if (repairItem.isTool) then
|
||||
repairItem:DamageDurability(1)
|
||||
end
|
||||
|
||||
client.nextRepair = CurTime() + 20
|
||||
|
||||
self:SetData("armor", math.Clamp(self:GetData("armor") + amount, 0, self.maxArmor))
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:CanTransfer(oldInventory, newInventory)
|
||||
if (hook.Run("CanTransferBGClothes", oldInventory, newInventory) != false) then
|
||||
return true
|
||||
end
|
||||
|
||||
if (newInventory and self:GetData("equip")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced()
|
||||
if (self.maxArmor) then
|
||||
self:SetData("armor", self.maxArmor)
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetProxyColors()
|
||||
return self.proxy
|
||||
end
|
||||
|
||||
function ITEM:OnInventoryDraw(entity, proxyList)
|
||||
if !entity or entity and !IsValid(entity) then return end
|
||||
|
||||
entity.GetProxyColors = function()
|
||||
if !self.proxy then return end
|
||||
|
||||
local colors = {}
|
||||
|
||||
if proxyList then
|
||||
for proxy, color in pairs(proxyList) do
|
||||
colors[proxy] = color
|
||||
end
|
||||
else
|
||||
for proxy, color in pairs(self.proxy) do
|
||||
if colors[proxy] then continue end
|
||||
|
||||
colors[proxy] = color
|
||||
end
|
||||
end
|
||||
|
||||
return colors
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnRemoved()
|
||||
if (self.invID != 0 and self:GetData("equip")) then
|
||||
self.player = self:GetOwner()
|
||||
self:RemoveOutfit(self.player)
|
||||
|
||||
if self.OnUnEquip then
|
||||
self:OnUnEquip()
|
||||
end
|
||||
|
||||
self.player = nil
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnLoadout()
|
||||
if (self.maxArmor and self:GetData("equip")) then
|
||||
self.player:SetArmor(self:GetData("armor", self.maxArmor))
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnSave()
|
||||
if (self:GetData("equip") and self.maxArmor) then
|
||||
local armor = math.Clamp(self.player:Armor(), 0, self.maxArmor)
|
||||
self:SetData("armor", armor)
|
||||
if (armor != self.player:Armor()) then
|
||||
self.player:SetArmor(armor)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:CanEquipOutfit(client)
|
||||
local player = self.player or client
|
||||
if (self.maxArmor) then
|
||||
local bgItems = player:GetCharacter():GetInventory():GetItemsByBase("base_bgclothes", true)
|
||||
for _, v in pairs(bgItems) do
|
||||
if (v:GetData("equip") and v.maxArmor) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ITEM:CanUnequipOutfit()
|
||||
return true
|
||||
end
|
||||
148
gamemodes/helix/plugins/willardclothing/items/base/sh_mask.lua
Normal file
148
gamemodes/helix/plugins/willardclothing/items/base/sh_mask.lua
Normal file
@@ -0,0 +1,148 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
ITEM.base = "base_bgclothes"
|
||||
|
||||
ITEM.isGasmask = true
|
||||
ITEM.isMask = true
|
||||
|
||||
ITEM.filterQuality = 0.1
|
||||
ITEM.maxFilterValue = 30
|
||||
ITEM.refillItem = nil
|
||||
ITEM.filterDecayStart = 0.1
|
||||
|
||||
ITEM.noReplace = true
|
||||
ITEM.noUseOutGas = true
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item.outlineColor and not item:GetData("equip")) then
|
||||
surface.SetDrawColor(item.outlineColor)
|
||||
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
|
||||
end
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:PopulateTooltip(tooltip)
|
||||
if (self:GetData("equip")) then
|
||||
local name = tooltip:GetRow("name")
|
||||
name:SetBackgroundColor(derma.GetColor("Success", tooltip))
|
||||
end
|
||||
|
||||
local panel = tooltip:AddRowAfter("name", "integrity")
|
||||
panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
|
||||
panel:SetText("Integrity: "..math.Round(self:GetData("filterValue", self.maxFilterValue) * 100 / self.maxFilterValue, 1).."%\n"..
|
||||
"Quality: "..math.Round(self:GetFilterQuality() * 100, 1).."%")
|
||||
panel:SizeToContents()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetFilterQuality()
|
||||
local filterValue = self:GetData("filterValue", self.maxFilterValue)
|
||||
|
||||
if (filterValue > self.maxFilterValue * self.filterDecayStart) then
|
||||
return self.filterQuality
|
||||
else
|
||||
return math.Remap(filterValue, 0, self.maxFilterValue * self.filterDecayStart, 0, self.filterQuality)
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:RemoveFilter(client)
|
||||
self:SetData("equip", false)
|
||||
|
||||
local character = client:GetCharacter()
|
||||
if (character:GetFilterItem() == self:GetID()) then
|
||||
character:SetFilterItem(0)
|
||||
end
|
||||
end
|
||||
|
||||
ITEM:Hook("drop", function(item)
|
||||
if (item.isGasmask and item.player:GetFilterItem() == item:GetID()) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (item:GetData("equip")) then
|
||||
item:RemoveOutfit(item:GetOwner())
|
||||
item:RemoveFilter(item.player)
|
||||
end
|
||||
end)
|
||||
|
||||
ITEM.functions.Clean = {
|
||||
name = "Clean",
|
||||
tip = "repairTip",
|
||||
icon = "icon16/wand.png",
|
||||
OnRun = function(item)
|
||||
item:Refill(item.player)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(item)
|
||||
local client = item.player
|
||||
return item.refillItem != nil and item:GetData("equip") == false and
|
||||
!IsValid(item.entity) and IsValid(client) and
|
||||
item:GetData("filterValue") < item.maxFilterValue and
|
||||
client:GetCharacter():GetInventory():HasItem(item.refillItem)
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:Refill(client, amount)
|
||||
amount = amount or self.maxFilterValue
|
||||
local refillItem = client:GetCharacter():GetInventory():HasItem(self.refillItem)
|
||||
|
||||
if (refillItem) then
|
||||
refillItem:Remove()
|
||||
self:SetData("filterValue", math.Clamp(self:GetData("filterValue") + amount, 0, self.maxFilterValue))
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnUnEquip(client)
|
||||
local player = client or self.player
|
||||
self:RemoveFilter(player)
|
||||
end
|
||||
|
||||
function ITEM:OnEquip(client)
|
||||
client:GetCharacter():SetFilterItem(self:GetID())
|
||||
end
|
||||
|
||||
function ITEM:OnRemoved()
|
||||
if (self.invID != 0 and self:GetData("equip")) then
|
||||
self.player = self:GetOwner()
|
||||
self:RemoveFilter(self.player)
|
||||
|
||||
if self.OnUnEquip then
|
||||
self:OnUnEquip()
|
||||
end
|
||||
|
||||
self.player = nil
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnLoadout()
|
||||
if (self:GetData("equip")) then
|
||||
if (self.player.HasGasmask and !self.player:HasGasmask()) then
|
||||
self:SetData("equip", false)
|
||||
return
|
||||
end
|
||||
|
||||
local character = self.player:GetCharacter()
|
||||
if (character:GetFilterItem() != 0 and character:GetFilterItem() != self:GetID()) then
|
||||
self:SetData("equip", false)
|
||||
else
|
||||
character:SetFilterItem(self:GetID())
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced()
|
||||
self:SetData("filterValue", self.maxFilterValue)
|
||||
end
|
||||
Reference in New Issue
Block a user