mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-18 14:13:46 +03:00
Upload
This commit is contained in:
108
gamemodes/ixhl2rp/plugins/willardskills/cl_hooks.lua
Normal file
108
gamemodes/ixhl2rp/plugins/willardskills/cl_hooks.lua
Normal file
@@ -0,0 +1,108 @@
|
||||
--[[
|
||||
| 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
|
||||
|
||||
local smallerIconSize = SScaleMin(16 / 3)
|
||||
local function firstUpper(str)
|
||||
return str:gsub("^%l", string.utf8upper)
|
||||
end
|
||||
|
||||
function PLUGIN:PopulateHelpMenu(tabs)
|
||||
local permitsList = ix.permits.get()
|
||||
if (permitsList and !table.IsEmpty(permitsList)) then
|
||||
tabs["Zezwolenia"] = function(container)
|
||||
local permits = table.GetKeys(permitsList)
|
||||
table.sort(permits)
|
||||
|
||||
for _, v in pairs(permits) do
|
||||
local permitsButton = container:Add("DButton")
|
||||
permitsButton:Dock(TOP)
|
||||
permitsButton:SetText(Schema:FirstToUpper(v))
|
||||
permitsButton:SetFont("TitlesFontNoClamp")
|
||||
permitsButton:SizeToContents()
|
||||
permitsButton.Paint = nil
|
||||
permitsButton:SetContentAlignment(4)
|
||||
permitsButton.DoClick = function()
|
||||
LocalPlayer():NotifyLocalized("ID zezwolenia '"..v.."' skopiowane do schowka")
|
||||
SetClipboardText( v )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:CreateExtraCharacterTabInfo(character, informationSubframe, CreatePart)
|
||||
-- Permits
|
||||
local permitsPanel = informationSubframe:Add("Panel")
|
||||
local permitsData = LocalPlayer():GetCharacter():GetGenericdata().permits
|
||||
if !istable(permitsData) then
|
||||
CreatePart(permitsPanel, "Zezwolenia:", "Brak zezwoleń", "licenses", true, false, true)
|
||||
return
|
||||
end
|
||||
|
||||
permitsData = table.GetKeys(LocalPlayer():GetCharacter():GetGenericdata().permits)
|
||||
|
||||
for k, v in pairs(permitsData) do
|
||||
permitsData[k] = firstUpper(v)
|
||||
end
|
||||
|
||||
if !table.IsEmpty(permitsData) then
|
||||
CreatePart(permitsPanel, "Zezwolenia:", table.concat(permitsData, ", "), "licenses", true, false, true)
|
||||
else
|
||||
CreatePart(permitsPanel, "Zezwolenia:", "Brak zezwoleń", "licenses", true, false, true)
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:AdjustInnerStatusPanel(innerStatus, CreateTitle, CreateSubBar)
|
||||
if (ix.special) then
|
||||
local attributesTitle = innerStatus:Add("DLabel")
|
||||
CreateTitle(attributesTitle, "ATRYBUTY")
|
||||
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
for attributeID, v in pairs(ix.special.list) do
|
||||
local attribute = innerStatus:Add("Panel")
|
||||
local special = character:GetSpecial(tostring(v.uniqueID))
|
||||
|
||||
CreateSubBar(attribute, "willardnetworks/tabmenu/inventory/inv_" .. attributeID .. ".png", v.name, special .. "/10", smallerIconSize, smallerIconSize)
|
||||
end
|
||||
end
|
||||
|
||||
if (ix.skill) then
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
|
||||
local skillsTitle = innerStatus:Add("DLabel")
|
||||
CreateTitle(skillsTitle, "UMIEJĘTNOŚCI")
|
||||
|
||||
for skillID, skillInfo in pairs(ix.skill.list) do
|
||||
if (skillInfo.uniqueID == "vort" and !LocalPlayer():IsVortigaunt()) or skillInfo.uniqueID == "bartering" then
|
||||
continue
|
||||
end
|
||||
|
||||
local skillsPanel = innerStatus:Add("Panel")
|
||||
local level = character:GetSkillLevel(skillID)
|
||||
CreateSubBar(skillsPanel, "willardnetworks/tabmenu/inventory/inv_" .. skillID .. ".png", skillInfo.name, level .. "/50", smallerIconSize, smallerIconSize)
|
||||
end
|
||||
|
||||
local char = LocalPlayer().GetCharacter and LocalPlayer():GetCharacter()
|
||||
|
||||
-- Misc section
|
||||
local miscTitle = innerStatus:Add("DLabel")
|
||||
CreateTitle(miscTitle, "INNE")
|
||||
|
||||
if char then
|
||||
local money = char.GetMoney and char:GetMoney() or 0
|
||||
-- Display the amount of chips the player has
|
||||
local chipsPanel = innerStatus:Add("Panel")
|
||||
CreateSubBar(chipsPanel, "willardnetworks/tabmenu/charmenu/chips.png", "Żetony", money, smallerIconSize, smallerIconSize)
|
||||
end
|
||||
end
|
||||
end
|
||||
33
gamemodes/ixhl2rp/plugins/willardskills/cl_recipe.lua
Normal file
33
gamemodes/ixhl2rp/plugins/willardskills/cl_recipe.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
--[[
|
||||
| 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
|
||||
|
||||
netstream.Hook("RebuildCrafting", function(data)
|
||||
PLUGIN.craftingPanel:Rebuild()
|
||||
end)
|
||||
|
||||
netstream.Hook("CraftTime", function(data)
|
||||
ix.CraftCooldown = data
|
||||
end)
|
||||
|
||||
netstream.Hook("SendMessageListToClient", function(messagelist, storedNewspapers)
|
||||
LocalPlayer().messagelist = messagelist
|
||||
local capda = vgui.Create("ixCAPDA")
|
||||
capda.storedNewspapers = storedNewspapers
|
||||
capda:CreateNewspaperButton()
|
||||
end)
|
||||
|
||||
-- Called when the local player's crafting is rebuilt.
|
||||
function PLUGIN:PlayerCraftingRebuilt(panel, categories) end
|
||||
|
||||
-- Called when the local player's crafting item should be adjusted.
|
||||
function PLUGIN:PlayerAdjustCraftingRecipe(recipe) end
|
||||
1279
gamemodes/ixhl2rp/plugins/willardskills/derma/cl_baserecipepanel.lua
Normal file
1279
gamemodes/ixhl2rp/plugins/willardskills/derma/cl_baserecipepanel.lua
Normal file
File diff suppressed because it is too large
Load Diff
493
gamemodes/ixhl2rp/plugins/willardskills/derma/cl_capda.lua
Normal file
493
gamemodes/ixhl2rp/plugins/willardskills/derma/cl_capda.lua
Normal file
@@ -0,0 +1,493 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
local padding = SScaleMin(10 / 3)
|
||||
|
||||
function PANEL:Init()
|
||||
self:SetSize(ScrW(), ScrH())
|
||||
self:SetAlpha(0)
|
||||
self:AlphaTo(255, 0.5, 0)
|
||||
self.Paint = function( self, w, h )
|
||||
surface.SetDrawColor(Color(63, 58, 115, 220))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
Derma_DrawBackgroundBlur( self, 1 )
|
||||
end
|
||||
|
||||
self.content = self:Add("EditablePanel")
|
||||
self.content:SetSize(SScaleMin(400 / 3), SScaleMin(600 / 3))
|
||||
self.content:Center()
|
||||
self.content:MakePopup()
|
||||
Schema:AllowMessage(self.content)
|
||||
self.content.Paint = function(self, w, h)
|
||||
surface.SetDrawColor(0, 0, 0, 130)
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
self.topbar = self.content:Add("Panel")
|
||||
self.topbar:SetSize(self.content:GetWide(), SScaleMin(50 / 3))
|
||||
self.topbar:Dock(TOP)
|
||||
self.topbar.Paint = function( self, w, h )
|
||||
surface.SetDrawColor(0, 0, 0, 130)
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
local titleText = self.topbar:Add("DLabel")
|
||||
titleText:SetFont("LargerTitlesFontNoClamp")
|
||||
titleText:Dock(LEFT)
|
||||
titleText:SetText("Administracja Cywilna")
|
||||
titleText:DockMargin(SScaleMin(10 / 3), 0, 0, 0)
|
||||
titleText:SetContentAlignment(4)
|
||||
titleText:SizeToContents()
|
||||
|
||||
local exit = self.topbar:Add("DImageButton")
|
||||
exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
|
||||
exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
|
||||
exit:DockMargin(0, SScaleMin(15 / 3), SScaleMin(10 / 3), SScaleMin(15 / 3))
|
||||
exit:Dock(RIGHT)
|
||||
exit.DoClick = function()
|
||||
LocalPlayer().messagelist = nil
|
||||
self:Remove()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
end
|
||||
|
||||
self:CreateInner()
|
||||
end
|
||||
|
||||
local function PaintButton(self, w, h)
|
||||
surface.SetDrawColor(Color(0, 0, 0, 100))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
function PANEL:CreateBackButton()
|
||||
local divider = self.topbar:Add("DShape")
|
||||
divider:SetType("Rect")
|
||||
divider:Dock(RIGHT)
|
||||
divider:DockMargin(padding, padding, padding, padding)
|
||||
divider:SetWide(1)
|
||||
divider:SetColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
|
||||
local back = self.topbar:Add("DButton")
|
||||
back:Dock(RIGHT)
|
||||
back:SetText("POWRÓT")
|
||||
back:SetFont("TitlesFontNoClamp")
|
||||
back.Paint = nil
|
||||
back:SizeToContents()
|
||||
back.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self:Remove()
|
||||
local panel = vgui.Create("ixCAPDA")
|
||||
panel:SetAlpha(255)
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateNewspaperButton()
|
||||
self.newspapers = self.innerContent:Add("DButton")
|
||||
self.newspapers:Dock(TOP)
|
||||
self.newspapers:SetTall(SScaleMin(50 / 3))
|
||||
self.newspapers:SetText("Gazety")
|
||||
self.newspapers:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
self.newspapers:SetContentAlignment(4)
|
||||
self.newspapers:SetTextInset(SScaleMin(10 / 3), 0)
|
||||
self.newspapers.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
self.newspapers:DockMargin(0, -1, 0, 0)
|
||||
|
||||
self.newspapers.DoClick = function()
|
||||
self:CreateBackButton()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self.innerContent:Clear()
|
||||
|
||||
for k, v in pairs(self.storedNewspapers) do
|
||||
local newspaper = self.innerContent:Add("DButton")
|
||||
newspaper:Dock(TOP)
|
||||
newspaper:SetTall(SScaleMin(50 / 3))
|
||||
newspaper:SetText(v[3][1].columnTitle.." | "..v[3][1].columnSubtitle)
|
||||
newspaper:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
newspaper:SetContentAlignment(4)
|
||||
newspaper:SetTextInset(SScaleMin(10 / 3), 0)
|
||||
newspaper.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
if k != 1 then
|
||||
newspaper:DockMargin(0, -1, 0, 0)
|
||||
end
|
||||
|
||||
newspaper.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
local areyousure = vgui.Create("Panel")
|
||||
areyousure:SetSize(SScaleMin(300 / 3), SScaleMin(100 / 3))
|
||||
areyousure:Center()
|
||||
areyousure:MakePopup()
|
||||
areyousure.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
local label = areyousure:Add("DLabel")
|
||||
label:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
label:SetText("Usunąć przechowywane gazety?")
|
||||
label:SizeToContents()
|
||||
label:Dock(TOP)
|
||||
label:SetContentAlignment(5)
|
||||
|
||||
local buttonpanel = areyousure:Add("Panel")
|
||||
buttonpanel:Dock(BOTTOM)
|
||||
buttonpanel:SetTall(SScaleMin(50 / 3))
|
||||
|
||||
local yes = buttonpanel:Add("DButton")
|
||||
yes:Dock(LEFT)
|
||||
yes:SetWide((areyousure:GetWide() * 0.5) - SScaleMin(5 / 3))
|
||||
yes:SetText("Tak")
|
||||
yes:SetFont("MenuFontNoClamp")
|
||||
yes.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
yes.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
areyousure:Remove()
|
||||
newspaper:Remove()
|
||||
|
||||
netstream.Start("RemoveStoredNewspaper", k)
|
||||
end
|
||||
|
||||
local no = buttonpanel:Add("DButton")
|
||||
no:Dock(RIGHT)
|
||||
no:SetWide((areyousure:GetWide() * 0.5) - SScaleMin(5 / 3))
|
||||
no:SetText("Nie")
|
||||
no:SetFont("MenuFontNoClamp")
|
||||
no.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
no.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
areyousure:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateDoorAccessButton()
|
||||
self.doorAccess = self.innerContent:Add("DButton")
|
||||
self.doorAccess:Dock(TOP)
|
||||
self.doorAccess:SetTall(SScaleMin(50 / 3))
|
||||
self.doorAccess:SetText("Drzwi Kombinatu")
|
||||
self.doorAccess:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
self.doorAccess:SetContentAlignment(4)
|
||||
self.doorAccess:SetTextInset(SScaleMin(10 / 3), 0)
|
||||
self.doorAccess.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
self.doorAccess:DockMargin(0, -1, 0, 0)
|
||||
|
||||
self.doorAccess.DoClick = function()
|
||||
self:CreateBackButton()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self.innerContent:Clear()
|
||||
|
||||
for k, v in ipairs(ents.GetAll()) do
|
||||
if (v:IsDoor()) then
|
||||
if (!v:HasSpawnFlags(256) and !v:HasSpawnFlags(1024) and v:GetNetVar("combineDoor")) then
|
||||
local name = v:GetNetVar("combineDoor")
|
||||
if name then
|
||||
local doorNameButton = self.innerContent:Add("DButton")
|
||||
doorNameButton:Dock(TOP)
|
||||
doorNameButton:SetText(name)
|
||||
doorNameButton:SetTall(SScaleMin(50 / 3))
|
||||
doorNameButton:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
doorNameButton:SetContentAlignment(4)
|
||||
doorNameButton:SetTextInset(padding, 0)
|
||||
doorNameButton.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
doorNameButton.DoClick = function()
|
||||
Derma_StringRequest(
|
||||
"Przyznaj dostęp",
|
||||
"Wprowadź CID",
|
||||
"",
|
||||
function(enteredCid)
|
||||
for k2, v2 in pairs(ix.char.loaded) do
|
||||
if v2:GetCid() == enteredCid then
|
||||
netstream.Start("SetDoorAccessCID", v, k2)
|
||||
break
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
nil
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateInner()
|
||||
self.innerContent = self.content:Add("DScrollPanel")
|
||||
self.innerContent:Dock(TOP)
|
||||
self.innerContent:SetTall(self.content:GetTall() - SScaleMin(50 / 3))
|
||||
|
||||
self.barteringConfigs = self.innerContent:Add("DButton")
|
||||
self.barteringConfigs:Dock(TOP)
|
||||
self.barteringConfigs:SetTall(SScaleMin(50 / 3))
|
||||
self.barteringConfigs:SetText("Handel")
|
||||
self.barteringConfigs:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
self.barteringConfigs:SetContentAlignment(4)
|
||||
self.barteringConfigs:SetTextInset(padding, 0)
|
||||
self.barteringConfigs.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
self.barteringConfigs.DoClick = function()
|
||||
self:CreateBackButton()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self.innerContent:Clear()
|
||||
|
||||
local recipes = ix.recipe.stored
|
||||
local categories = {}
|
||||
for uniqueID, RECIPE in SortedPairs(recipes) do
|
||||
if RECIPE.cost and RECIPE.skill == "bartering" then
|
||||
if !table.HasValue(categories, RECIPE.category) then
|
||||
table.insert(categories, RECIPE.category)
|
||||
|
||||
local priceMultiplier = self.innerContent:Add("DButton")
|
||||
priceMultiplier:Dock(TOP)
|
||||
priceMultiplier:SetText("Mnożnik ceny "..RECIPE.category)
|
||||
priceMultiplier:SetTall(SScaleMin(50 / 3))
|
||||
priceMultiplier:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
priceMultiplier:SetContentAlignment(4)
|
||||
priceMultiplier:SetTextInset(padding, 0)
|
||||
priceMultiplier.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
priceMultiplier.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
Derma_StringRequest(
|
||||
"Ustaw mnożnik "..RECIPE.category,
|
||||
"Mnożnik ceny "..RECIPE.category.." (maks. 1 miejsce po przecinku, domyślnie 1,0)",
|
||||
ix.config.Get("BarteringPriceMultiplier"..RECIPE.category),
|
||||
function(number)
|
||||
local toNumber = tonumber(number)
|
||||
if isnumber(toNumber) then
|
||||
local maxValue = ix.config.stored.BarteringPriceMultiplierClothing.data.data.max or 100
|
||||
local minValue = ix.config.stored.BarteringPriceMultiplierClothing.data.data.min or 0
|
||||
if (toNumber <= maxValue) and (toNumber >= minValue) then
|
||||
netstream.Start("ixBarteringPriceMultiplier", RECIPE.category, tonumber(number))
|
||||
LocalPlayer():NotifyLocalized("Ustawiono mnożnik ceny handlu "..RECIPE.category.." na "..number)
|
||||
else
|
||||
LocalPlayer():NotifyLocalized("Liczba musi być mniejsza lub równa (⩽) 100 i większa lub równa (⩾) 0.")
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
nil
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.ration = self.innerContent:Add("DButton")
|
||||
self.ration:Dock(TOP)
|
||||
self.ration:SetTall(SScaleMin(50 / 3))
|
||||
self.ration:SetText("Racje")
|
||||
self.ration:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
self.ration:SetContentAlignment(4)
|
||||
self.ration:SetTextInset(padding, 0)
|
||||
self.ration.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
self.ration:DockMargin(0, -1, 0, 0)
|
||||
|
||||
self.ration.DoClick = function()
|
||||
self:CreateBackButton()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self.innerContent:Clear()
|
||||
|
||||
local rationInterval = self.innerContent:Add("DButton")
|
||||
rationInterval:Dock(TOP)
|
||||
rationInterval:SetTall(SScaleMin(50 / 3))
|
||||
rationInterval:SetText("Interwał Racji")
|
||||
rationInterval:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
rationInterval:SetContentAlignment(4)
|
||||
rationInterval:SetTextInset(padding, 0)
|
||||
rationInterval.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
rationInterval.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
Derma_StringRequest(
|
||||
"Ustaw Interwał Racji",
|
||||
"Ustaw Interwał Racji w godzinach (0 miejsc po przecinku, domyślnie 4)",
|
||||
ix.config.Get("rationInterval"),
|
||||
function(number)
|
||||
local toNumber = tonumber(number)
|
||||
if isnumber(toNumber) then
|
||||
local maxValue = ix.config.stored.rationInterval.data.data.max or 10
|
||||
local minValue = ix.config.stored.rationInterval.data.data.min or 1
|
||||
if (toNumber <= maxValue) and (toNumber >= minValue) then
|
||||
netstream.Start("SetRationIntervalPDA", tonumber(number))
|
||||
LocalPlayer():NotifyLocalized("Ustawiono licznik Interwału Racji na "..number.. " h")
|
||||
else
|
||||
LocalPlayer():NotifyLocalized("Liczba musi być mniejsza lub równa (⩽) 10 i większa lub równa (⩾) 1.")
|
||||
end
|
||||
end
|
||||
end,
|
||||
nil)
|
||||
end
|
||||
end
|
||||
|
||||
if istable(LocalPlayer().messagelist) then
|
||||
if !table.IsEmpty(LocalPlayer().messagelist) then
|
||||
self.messages = self.innerContent:Add("DButton")
|
||||
self.messages:Dock(TOP)
|
||||
self.messages:SetTall(SScaleMin(50 / 3))
|
||||
self.messages:SetText("Wiadomości")
|
||||
self.messages:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
self.messages:SetContentAlignment(4)
|
||||
self.messages:SetTextInset(padding, 0)
|
||||
self.messages.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
self.messages:DockMargin(0, -1, 0, 0)
|
||||
|
||||
self.messages.DoClick = function()
|
||||
self:CreateBackButton()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self.innerContent:Clear()
|
||||
|
||||
local messagePanel = self.innerContent:Add("Panel")
|
||||
messagePanel:Dock(TOP)
|
||||
messagePanel:SetTall(self.innerContent:GetTall())
|
||||
|
||||
for k, v in pairs(LocalPlayer().messagelist) do
|
||||
local message = messagePanel:Add("DButton")
|
||||
message:Dock(TOP)
|
||||
message:SetTall(SScaleMin(50 / 3))
|
||||
message:SetText(v["message_date"].." | "..string.utf8sub(v["message_poster"], 1, 18).." | #"..v["message_cid"])
|
||||
if v["message_reply"] then
|
||||
message:SetTextColor(Color(210, 255, 255, 255))
|
||||
else
|
||||
message:SetTextColor(Color(255, 205, 205, 255))
|
||||
end
|
||||
message:SetFont("WNBleedingMinutesBold")
|
||||
message:SetContentAlignment(4)
|
||||
message:SetTextInset(padding, 0)
|
||||
message.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
if k != 1 then
|
||||
message:DockMargin(0, -1, 0, 0)
|
||||
end
|
||||
|
||||
message.DoClick = function()
|
||||
messagePanel:Clear()
|
||||
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
|
||||
local textEntry = messagePanel:Add("DTextEntry")
|
||||
textEntry:Dock(FILL)
|
||||
textEntry:SetTextColor(Color(200, 200, 200, 255))
|
||||
textEntry:SetMultiline( true )
|
||||
textEntry:SetEditable(false)
|
||||
textEntry:SetVerticalScrollbarEnabled( true )
|
||||
textEntry:SetCursorColor(Color(200, 200, 200, 255))
|
||||
textEntry:SetValue(v["message_text"])
|
||||
textEntry.Paint = function(self, w, h)
|
||||
surface.SetDrawColor(Color(0, 0, 0, 100))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
|
||||
self:DrawTextEntryText( self:GetTextColor(), self:GetHighlightColor(), self:GetCursorColor() )
|
||||
end
|
||||
|
||||
local optionsPanel = messagePanel:Add("Panel")
|
||||
optionsPanel:Dock(BOTTOM)
|
||||
optionsPanel:SetSize(self.content:GetWide(), SScaleMin(50 / 3))
|
||||
|
||||
local remove = optionsPanel:Add("DButton")
|
||||
remove:Dock(FILL)
|
||||
remove:SetText("USUŃ")
|
||||
remove:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
remove:SetContentAlignment(5)
|
||||
remove.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
remove.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
LocalPlayer().messagelist[k] = nil
|
||||
netstream.Start("RemoveCAMessage", v["message_id"])
|
||||
|
||||
self.innerContent:Remove()
|
||||
self:CreateInner()
|
||||
end
|
||||
|
||||
local sendReply = optionsPanel:Add("DButton")
|
||||
sendReply:Dock(RIGHT)
|
||||
sendReply:SetWide(optionsPanel:GetWide() * 0.5)
|
||||
if v["message_reply"] then
|
||||
sendReply:SetText("PRZECZYTAJ ODPOWIEDŹ")
|
||||
else
|
||||
sendReply:SetText("ODPOWIEDŹ")
|
||||
end
|
||||
sendReply:SetFont("WNBleedingMinutesBold")
|
||||
sendReply:SetContentAlignment(5)
|
||||
sendReply.Paint = function(self, w, h)
|
||||
PaintButton(self, w, h)
|
||||
end
|
||||
|
||||
sendReply.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
if v["message_reply"] then
|
||||
textEntry:SetValue(v["message_reply"])
|
||||
return
|
||||
end
|
||||
|
||||
textEntry:SetEditable(true)
|
||||
sendReply:SetText("ODPOWIEDZ")
|
||||
textEntry:SetValue("Napisz tutaj swoją odpowiedź..")
|
||||
|
||||
sendReply.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
v["message_reply"] = textEntry:GetValue()
|
||||
netstream.Start("SetCAMessageReply", v["message_id"], textEntry:GetValue())
|
||||
self.innerContent:Remove()
|
||||
self:CreateInner()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self:CreateDoorAccessButton()
|
||||
end
|
||||
|
||||
vgui.Register("ixCAPDA", PANEL, "EditablePanel")
|
||||
@@ -0,0 +1,224 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
self:SetSize(ScrW(), ScrH())
|
||||
self:SetAlpha(0)
|
||||
self:AlphaTo(255, 0.5, 0)
|
||||
self.Paint = function(this, w, h)
|
||||
surface.SetDrawColor(Color(63, 58, 115, 220))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
Derma_DrawBackgroundBlur( this, 1 )
|
||||
end
|
||||
|
||||
self.innerContent = self:Add("Panel")
|
||||
self.innerContent:SetSize(SScaleMin(500 / 3), SScaleMin(600 / 3))
|
||||
self.innerContent:Center()
|
||||
self.innerContent:MakePopup()
|
||||
Schema:AllowMessage(self.innerContent)
|
||||
self.innerContent.Paint = function(this, w, h)
|
||||
surface.SetDrawColor(0, 0, 0, 130)
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
self:CreateTopBar()
|
||||
self:CreateItems()
|
||||
end
|
||||
|
||||
function PANEL:CreateTopBar()
|
||||
local topbar = self.innerContent:Add("Panel")
|
||||
topbar:SetSize(self.innerContent:GetWide(), SScaleMin(50 / 3))
|
||||
topbar:Dock(TOP)
|
||||
topbar.Paint = function( this, w, h )
|
||||
surface.SetDrawColor(0, 0, 0, 130)
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
self.titleText = topbar:Add("DLabel")
|
||||
self.titleText:SetFont("CharCreationBoldTitleNoClamp")
|
||||
self.titleText:Dock(LEFT)
|
||||
self.titleText:SetText("Wybierz element do wydania")
|
||||
self.titleText:DockMargin(SScaleMin(10 / 3), 0, 0, 0)
|
||||
self.titleText:SetContentAlignment(4)
|
||||
self.titleText:SizeToContents()
|
||||
|
||||
self.exit = topbar:Add("DImageButton")
|
||||
self.exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
|
||||
self.exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
|
||||
self.exit:DockMargin(0, SScaleMin(15 / 3), SScaleMin(10 / 3), SScaleMin(15 / 3))
|
||||
self.exit:Dock(RIGHT)
|
||||
self.exit.DoClick = function()
|
||||
netstream.Start("ClosePanels", LocalPlayer().activePickupDispenser)
|
||||
LocalPlayer().activePickupDispenser = nil
|
||||
LocalPlayer().boughtItems = nil
|
||||
self:Remove()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
end
|
||||
|
||||
local function createDivider(parent)
|
||||
parent:SetSize(1, topbar:GetTall())
|
||||
parent:Dock(RIGHT)
|
||||
parent:DockMargin(0, SScaleMin(10 / 3), SScaleMin(SScaleMin(10 / 3) / 3), SScaleMin(10 / 3))
|
||||
parent.Paint = function(this, w, h)
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawLine(0, 0, 0, h)
|
||||
end
|
||||
end
|
||||
|
||||
local divider = topbar:Add("Panel")
|
||||
createDivider(divider)
|
||||
end
|
||||
|
||||
function PANEL:CreateItems()
|
||||
if !LocalPlayer().boughtItems then
|
||||
return
|
||||
end
|
||||
|
||||
local scrollPanel = self.innerContent:Add("DScrollPanel")
|
||||
scrollPanel:Dock(TOP)
|
||||
scrollPanel:SetSize(self.innerContent:GetWide(), self.innerContent:GetTall() - SScaleMin(50 / 3))
|
||||
|
||||
for k, v in pairs (LocalPlayer().boughtItems) do
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
|
||||
local width = istable(v) and 1 or ix.item.list[k].width or 1
|
||||
local height = istable(v) and 1 or ix.item.list[k].height or 1
|
||||
|
||||
local frame, modelPanel, textPanel, amountPanel, amount, title = self:CreateItem(scrollPanel, k, v)
|
||||
local actualAmount = istable(v) and 1 or v or 1
|
||||
local actualTitle = istable(v) and v.title or ix.item.list[k].name or "Pudełko kartonowe"
|
||||
|
||||
if !inventory:FindEmptySlot(width, height) then
|
||||
amount:SetTextColor(Color(150, 150, 150, 255))
|
||||
title:SetTextColor(Color(150, 150, 150, 255))
|
||||
end
|
||||
|
||||
self:CreateInvisibleButton(frame, modelPanel, textPanel, amountPanel, inventory, width, height, actualAmount, actualTitle, amount, k)
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateInvisibleButton(frame, modelPanel, textPanel, amountPanel, inventory, width, height, actualAmount, actualTitle, amount, k)
|
||||
local invisibleButton = frame:Add("DButton")
|
||||
invisibleButton:SetSize(modelPanel:GetWide() + textPanel:GetWide() + amountPanel:GetWide(), frame:GetTall())
|
||||
invisibleButton:SetText("")
|
||||
invisibleButton.Paint = function(this, w, h)
|
||||
if inventory then
|
||||
if (this:IsHovered() and !inventory:FindEmptySlot(width, height)) then
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 15)))
|
||||
surface.DrawOutlinedRect(SScaleMin(4 / 3), SScaleMin(4 / 3), w - SScaleMin(8 / 3), h - SScaleMin(8 / 3))
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if (this:IsHovered()) then
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 15)))
|
||||
surface.DrawOutlinedRect(SScaleMin(4 / 3), SScaleMin(4 / 3), w - SScaleMin(8 / 3), h - SScaleMin(8 / 3))
|
||||
end
|
||||
end
|
||||
|
||||
invisibleButton.DoClick = function()
|
||||
if inventory then
|
||||
if inventory:FindEmptySlot(width, height) then
|
||||
actualAmount = actualAmount - 1
|
||||
amount:SetText(actualAmount)
|
||||
|
||||
if actualAmount == 0 then
|
||||
frame:Remove()
|
||||
end
|
||||
|
||||
LocalPlayer():NotifyLocalized("Odebrałeś "..actualTitle)
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
netstream.Start("SetPurchasedItems", k, LocalPlayer().activePickupDispenser)
|
||||
else
|
||||
LocalPlayer():NotifyLocalized("Nie masz wystarczająco dużo miejsca dla "..actualTitle.."!")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return invisibleButton
|
||||
end
|
||||
|
||||
function PANEL:CreateItem(scrollPanel, itemID, number)
|
||||
local frame = scrollPanel:Add("Panel")
|
||||
frame:Dock(TOP)
|
||||
frame:DockMargin(0, 0, 0, -1)
|
||||
frame:SetTall(SScaleMin(110 / 3) - 5)
|
||||
frame.Paint = function(this, w, h)
|
||||
surface.SetDrawColor(Color(0, 0, 0, 100))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
local modelPanel = frame:Add("Panel")
|
||||
modelPanel:Dock(LEFT)
|
||||
modelPanel:SetWide(scrollPanel:GetWide() / 3)
|
||||
modelPanel.Paint = function(this, w, h)
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawLine(w - 1, SScaleMin(10 / 3), w - 1, h - SScaleMin(10 / 3))
|
||||
end
|
||||
|
||||
local modelIcon = modelPanel:Add("SpawnIcon")
|
||||
local model = istable(number) and "models/props_c17/paper01.mdl" or ix.item.list[itemID].model or "models/props_junk/cardboard_box004a.mdl"
|
||||
modelIcon:Dock(FILL)
|
||||
modelIcon:DockMargin(SScaleMin(43 / 3), SScaleMin(10 / 3), SScaleMin(43 / 3), SScaleMin(10 / 3))
|
||||
modelIcon:SetModel(model)
|
||||
modelIcon.Paint = nil
|
||||
|
||||
modelIcon.PaintOver = nil
|
||||
modelIcon:SetTooltip(nil)
|
||||
|
||||
local textPanel = frame:Add("Panel")
|
||||
textPanel:Dock(LEFT)
|
||||
textPanel:DockPadding(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), 0)
|
||||
textPanel:SetSize(scrollPanel:GetWide() / 2, frame:GetTall())
|
||||
textPanel.Paint = function(this, w, h)
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawLine(w - 1, SScaleMin(10 / 3), w - 1, h - SScaleMin(10 / 3))
|
||||
end
|
||||
|
||||
local title = textPanel:Add("DLabel")
|
||||
local actualTitle = istable(number) and number.title or ix.item.list[itemID].name or "Pudełko kartonowe"
|
||||
title:Dock(TOP)
|
||||
title:SetText(actualTitle..(istable(number) and " - FROM: "..number.fromName.." | "..number.fromCID or ""))
|
||||
title:SetFont(istable(number) and "MenuFontBoldNoClamp" or "WNBleedingMinutesBoldNoClamp")
|
||||
title:SetWrap(true)
|
||||
title:SetAutoStretchVertical(true)
|
||||
title.PerformLayout = function(this)
|
||||
this:DockMargin(0, textPanel:GetTall() * 0.5 - this:GetTall() * 0.5, 0, textPanel:GetTall() * 0.5 - this:GetTall() * 0.5)
|
||||
end
|
||||
|
||||
local amountPanel = frame:Add("Panel")
|
||||
amountPanel:Dock(FILL)
|
||||
amountPanel:SetSize(scrollPanel:GetWide() - modelPanel:GetWide() - textPanel:GetWide(), frame:GetTall())
|
||||
if LocalPlayer().boughtItems and istable(LocalPlayer().boughtItems) then
|
||||
if table.Count(LocalPlayer().boughtItems) >= 6 then
|
||||
amountPanel:SetWide(amountPanel:GetWide() - SScaleMin(15 / 3))
|
||||
end
|
||||
end
|
||||
|
||||
local amount = amountPanel:Add("DLabel")
|
||||
local actualAmount = istable(number) and 1 or number or 1
|
||||
amount:SetContentAlignment(5)
|
||||
amount:SetText(actualAmount)
|
||||
amount:SetFont("WNBleedingMinutesBoldNoClamp")
|
||||
amount:SizeToContents()
|
||||
amount:Center()
|
||||
|
||||
return frame, modelPanel, textPanel, amountPanel, amount, title
|
||||
end
|
||||
|
||||
vgui.Register("PickupDispenser", PANEL, "EditablePanel")
|
||||
@@ -0,0 +1,63 @@
|
||||
--[[
|
||||
| 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 vgui = vgui
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Dostawy"
|
||||
self.secondTitle = "Kup"
|
||||
self.thirdTitle = "Podgląd"
|
||||
self.nothingSelected = "Nie wybrano przedmiotu"
|
||||
self.requirementsTitleText = "Wymagania: "
|
||||
self.skill = "bartering"
|
||||
self.built = false
|
||||
|
||||
ix.city:SyncCityStock()
|
||||
end
|
||||
|
||||
function PANEL:Proceed()
|
||||
self.built = true
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
function PANEL:Remove()
|
||||
if (self.model) then
|
||||
self.model:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
vgui.Register("BarteringBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateBarteringPanel(container)
|
||||
local panel = container:Add("BarteringBasePanel")
|
||||
|
||||
ix.gui.barteringpanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "BarteringBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["bartering"].uniqueID] = CreateBarteringPanel
|
||||
end)
|
||||
@@ -0,0 +1,58 @@
|
||||
--[[
|
||||
| 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 vgui = vgui
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Przepisy"
|
||||
self.secondTitle = "Gotuj"
|
||||
self.thirdTitle = "Podgląd"
|
||||
self.nothingSelected = "Nie wybrano przedmiotu"
|
||||
self.requirementsTitleText = "Wymagania: "
|
||||
self.ingredientsTitleText = "Składniki:"
|
||||
self.skill = "cooking"
|
||||
self.craftSound = "willardnetworks/skills/skill_cooking.wav"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
function PANEL:Remove()
|
||||
if (self.model) then
|
||||
self.model:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
vgui.Register("CookingBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateCookingPanel(container)
|
||||
local panel = container:Add("CookingBasePanel")
|
||||
|
||||
ix.gui.cookingpanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "CookingBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["cooking"].uniqueID] = CreateCookingPanel
|
||||
end)
|
||||
@@ -0,0 +1,102 @@
|
||||
--[[
|
||||
| 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 vgui = vgui
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
if parent then
|
||||
if parent.contentPanel then
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
else
|
||||
self:SetSize(ScrW() * 0.75, ScrH() * 0.70)
|
||||
end
|
||||
else
|
||||
self:SetSize(ScrW() * 0.75, ScrH() * 0.70)
|
||||
end
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Receptury"
|
||||
self.secondTitle = "Wytwórz"
|
||||
self.thirdTitle = "Podgląd"
|
||||
self.nothingSelected = "Nie wybrano przedmiotu/receptury"
|
||||
self.requirementsTitleText = "Wymagania: "
|
||||
self.ingredientsTitleText = "Składniki:"
|
||||
self.skill = "crafting"
|
||||
self.craftSound = "willardnetworks/skills/skill_crafting.wav"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
function PANEL:Remove()
|
||||
if (self.model) then
|
||||
self.model:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
vgui.Register("CraftingBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateCraftingPanel(container)
|
||||
local panel = container:Add("CraftingBasePanel")
|
||||
|
||||
ix.gui.craftingpanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "CraftingBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["crafting"].uniqueID] = CreateCraftingPanel
|
||||
end)
|
||||
|
||||
netstream.Hook("OpenCraftingMenu", function()
|
||||
if ix.gui.craftingpanel then
|
||||
if ix.gui.craftingpanel.Remove then
|
||||
ix.gui.craftingpanel:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
local parentPanel = vgui.Create("Panel")
|
||||
parentPanel:SetSize(ScrW(), ScrH())
|
||||
parentPanel:SetAlpha(0)
|
||||
parentPanel:AlphaTo(200, 0.5, 0)
|
||||
parentPanel.Paint = function(self, w, h)
|
||||
surface.SetDrawColor(0, 0, 0, 255)
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
local craftingPanel = parentPanel:Add("CraftingBasePanel")
|
||||
craftingPanel:MakePopup()
|
||||
craftingPanel:Center()
|
||||
|
||||
local close = craftingPanel:Add("DButton")
|
||||
close:Dock(BOTTOM)
|
||||
close:SetFont("TitlesFont")
|
||||
close:SetText("CLOSE CRAFTING")
|
||||
close:DockMargin(((craftingPanel:GetWide() + 20) / 1.5), 0, 2, 0)
|
||||
close:SetTall(math.Clamp(ScreenScale(50 / 3), 0, 50))
|
||||
close.DoClick = function()
|
||||
parentPanel:AlphaTo(0, 0.5, 0, function()
|
||||
parentPanel:Remove()
|
||||
end)
|
||||
end
|
||||
|
||||
ix.gui.craftingpanel = craftingPanel
|
||||
ix.gui.activeSkill = craftingPanel
|
||||
end)
|
||||
@@ -0,0 +1,44 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Poziom odblokowywuje"
|
||||
self.skill = "guns"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
vgui.Register("GunsBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateGunsPanel(container)
|
||||
local panel = container:Add("GunsBasePanel")
|
||||
|
||||
ix.gui.gunspanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "GunsBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["guns"].uniqueID] = CreateGunsPanel
|
||||
end)
|
||||
@@ -0,0 +1,58 @@
|
||||
--[[
|
||||
| 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 vgui = vgui
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Receptury"
|
||||
self.secondTitle = "Stwórz"
|
||||
self.thirdTitle = "Podgląd"
|
||||
self.nothingSelected = "Nie wybrano przedmiotu/receptury"
|
||||
self.requirementsTitleText = "Wymagania: "
|
||||
self.ingredientsTitleText = "Składniki:"
|
||||
self.skill = "medicine"
|
||||
self.craftSound = "willardnetworks/skills/skill_medicine.wav"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
function PANEL:Remove()
|
||||
if (self.model) then
|
||||
self.model:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
vgui.Register("MedicalBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateMedicalPanel(container)
|
||||
local panel = container:Add("MedicalBasePanel")
|
||||
|
||||
ix.gui.medicalpanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "MedicalBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["medicine"].uniqueID] = CreateMedicalPanel
|
||||
end)
|
||||
@@ -0,0 +1,44 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Poziom odblokowywuje"
|
||||
self.skill = "melee"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
vgui.Register("MeleeBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateMeleePanel(container)
|
||||
local panel = container:Add("MeleeBasePanel")
|
||||
|
||||
ix.gui.gunspanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "MeleeBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["melee"].uniqueID] = CreateMeleePanel
|
||||
end)
|
||||
@@ -0,0 +1,56 @@
|
||||
--[[
|
||||
| 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 vgui = vgui
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Przedmioty"
|
||||
self.secondTitle = "Info"
|
||||
self.thirdTitle = "Podgląd"
|
||||
self.nothingSelected = "Nie wybrano przedmiotu"
|
||||
self.requirementsTitleText = "Wymagania: "
|
||||
self.skill = "smuggling"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
function PANEL:Remove()
|
||||
if (self.model) then
|
||||
self.model:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
vgui.Register("SmugglingBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateSmugglingPanel(container)
|
||||
local panel = container:Add("SmugglingBasePanel")
|
||||
|
||||
ix.gui.smugglingpanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "SmugglingBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["smuggling"].uniqueID] = CreateSmugglingPanel
|
||||
end)
|
||||
@@ -0,0 +1,44 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
local parent = self:GetParent():GetParent()
|
||||
self:SetSize(parent.contentPanel:GetSize())
|
||||
|
||||
-- Config
|
||||
self.firstTitle = "Poziom odblokowywuje"
|
||||
self.skill = "speed"
|
||||
|
||||
-- Create titles
|
||||
self:Add("CraftingBaseTopTitleBase")
|
||||
|
||||
-- Create inner content
|
||||
self:Add("CraftingBaseInnerContent")
|
||||
|
||||
-- Rebuild inner content
|
||||
self:Add("CraftingBaseRebuild")
|
||||
end
|
||||
|
||||
vgui.Register("SpeedBasePanel", PANEL, "EditablePanel")
|
||||
|
||||
local function CreateSpeedPanel(container)
|
||||
local panel = container:Add("SpeedBasePanel")
|
||||
|
||||
ix.gui.speedpanel = panel
|
||||
ix.gui.activeSkill = panel
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
hook.Add("CreateSkillPanels", "SpeedBasePanel", function(tabs)
|
||||
tabs[ix.skill.list["speed"].uniqueID] = CreateSpeedPanel
|
||||
end)
|
||||
722
gamemodes/ixhl2rp/plugins/willardskills/derma/cl_skills.lua
Normal file
722
gamemodes/ixhl2rp/plugins/willardskills/derma/cl_skills.lua
Normal file
@@ -0,0 +1,722 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
local PLUGIN = PLUGIN
|
||||
|
||||
local titlePushDown = SScaleMin(85 / 3)
|
||||
local fixHeight = SScaleMin(55 / 3)
|
||||
local scale780 = SScaleMin(780 / 3)
|
||||
local scale120 = SScaleMin(120 / 3)
|
||||
|
||||
function PANEL:Init()
|
||||
ix.gui.skills = self
|
||||
|
||||
local margin = SScaleMin(10 / 3)
|
||||
local topPushDown = SScaleMin(150 / 3)
|
||||
|
||||
self:SetWide(ScrW() - (topPushDown * 2))
|
||||
|
||||
local sizeXtitle, sizeYtitle = self:GetWide(), scale120
|
||||
local sizeXcontent, sizeYcontent = self:GetWide(), (scale780) - fixHeight
|
||||
|
||||
self.titlePanel = self:Add("Panel")
|
||||
self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
|
||||
self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)
|
||||
|
||||
self.contentPanel = self:Add("Panel")
|
||||
self.contentPanel:SetSize(sizeXcontent, sizeYcontent)
|
||||
self.contentPanel:SetPos(self:GetWide() * 0.5 - self.contentPanel:GetWide() * 0.5, titlePushDown)
|
||||
|
||||
self:SetTall(scale120 + scale780 - fixHeight + titlePushDown)
|
||||
self:Center()
|
||||
|
||||
local skillsIcon = self.titlePanel:Add("DImage")
|
||||
skillsIcon:SetImage("willardnetworks/tabmenu/navicons/crafting.png")
|
||||
skillsIcon:SetSize(SScaleMin(18 / 3), SScaleMin(18 / 3))
|
||||
skillsIcon:SetPos(0, SScaleMin(3 / 3))
|
||||
|
||||
local skillsTitle = self.titlePanel:Add("DLabel")
|
||||
skillsTitle:SetFont("TitlesFontNoClamp")
|
||||
skillsTitle:SetText("Poziomy postaci " .. LocalPlayer():Name())
|
||||
skillsTitle:SetPos(SScaleMin(26 / 3))
|
||||
skillsTitle:SizeToContents()
|
||||
|
||||
local skillsDesc = self.titlePanel:Add("DLabel")
|
||||
skillsDesc:SetFont("MenuFontLargerNoClamp")
|
||||
skillsDesc:SetText("Maksymalny łączny poziom umiejętności to " .. ix.config.Get("MaxTotalSkill", 0) .. ".")
|
||||
skillsDesc:SetTextColor(Color(200, 200, 200, 255))
|
||||
skillsDesc:SetPos(0, SScaleMin(25 / 3) + margin * 0.7)
|
||||
skillsDesc:SizeToContents()
|
||||
|
||||
local skillsDesc2 = self.titlePanel:Add("DLabel")
|
||||
skillsDesc2:SetFont("MenuFontLargerBoldNoFix")
|
||||
skillsDesc2:SetTextColor(Color(255, 78, 69, 255))
|
||||
skillsDesc2:SetText("Rozdane punkty umiejętności: " .. LocalPlayer():GetCharacter():GetTotalSkillLevel() .. "/" .. ix.config.Get("MaxTotalSkill", 0))
|
||||
skillsDesc2:SetPos(0, SScaleMin(42 / 3) + margin * 0.7)
|
||||
skillsDesc2:SizeToContents()
|
||||
|
||||
self:CreateAttributesPanel()
|
||||
|
||||
self.panels = {}
|
||||
|
||||
hook.Run("CreateSkillPanels", self.panels) -- Create subpanels for example Crafting
|
||||
|
||||
self:CreateSkills()
|
||||
end
|
||||
|
||||
function PANEL:CreateSkills()
|
||||
if (self.skillPanels) then
|
||||
for _, v in ipairs(self.skillPanels) do
|
||||
v:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
self.skillPanels = {}
|
||||
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
|
||||
self.skillGrid = self.contentPanel:Add("DGrid")
|
||||
self.skillGrid:Dock(FILL)
|
||||
self.skillGrid:SetCols( 3 )
|
||||
self.skillGrid:SetColWide( self.contentPanel:GetWide() / 3 )
|
||||
self.skillGrid:SetRowHeight( self.contentPanel:GetTall() / 3 )
|
||||
|
||||
for skillID, skillInfo in SortedPairs(ix.skill.list) do
|
||||
if character:GetFaction() != FACTION_VORT and skillInfo.uniqueID == "vort" then
|
||||
continue
|
||||
end
|
||||
|
||||
self.skillPanels[skillID] = self:CreateSkillPanel(skillID, skillInfo)
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateSkillPanel(skillID, skillInfo)
|
||||
local bottomPanelH = SScaleMin(35 / 3)
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
|
||||
local skillPanel = vgui.Create("Panel")
|
||||
skillPanel:SetSize((self.contentPanel:GetWide() / 3) - SScaleMin(10 / 3), (self.contentPanel:GetTall() / 3) - SScaleMin(10 / 3))
|
||||
skillPanel:Center()
|
||||
skillPanel.Paint = function(_, w, h)
|
||||
surface.SetDrawColor(color_white)
|
||||
surface.SetMaterial(ix.util.GetMaterial(skillInfo.image))
|
||||
surface.DrawTexturedRect(0, 0, w, h - bottomPanelH)
|
||||
|
||||
surface.SetDrawColor(ColorAlpha(color_black, 100))
|
||||
surface.DrawRect(0, h - bottomPanelH, w, bottomPanelH)
|
||||
|
||||
surface.SetDrawColor(Color(116, 113, 130, 255))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
|
||||
surface.DrawLine(0, h - bottomPanelH, w, h - bottomPanelH)
|
||||
end
|
||||
|
||||
-- Bottom Panel
|
||||
local dPadding = SScaleMin(5 / 3)
|
||||
local bottomPanel = skillPanel:Add("Panel")
|
||||
bottomPanel:Dock(BOTTOM)
|
||||
bottomPanel:SetTall(bottomPanelH)
|
||||
|
||||
local skillName = bottomPanel:Add("DLabel")
|
||||
self:CreateSkillLabel(skillName, skillInfo.name, "TitlesFontNoClamp", dPadding * 4, dPadding * 2)
|
||||
|
||||
skillPanel.skillLevel = bottomPanel:Add("DLabel")
|
||||
self:CreateSkillLabel(skillPanel.skillLevel, "Poziom: " .. character:GetSkillLevel(skillID) .. "/" .. ix.skill.MAX_SKILL, "MenuFontLargerNoClamp", 0, 0, Color(255, 204, 0, 255))
|
||||
|
||||
local experiencePanel = bottomPanel:Add("Panel")
|
||||
experiencePanel:Dock(RIGHT)
|
||||
experiencePanel:SetWide(SScaleMin(200 / 3))
|
||||
experiencePanel:DockMargin(dPadding * 2, dPadding, dPadding * 4, dPadding)
|
||||
experiencePanel:DockPadding(dPadding, dPadding, dPadding, dPadding)
|
||||
experiencePanel.Paint = function(_, w, h)
|
||||
surface.SetDrawColor(ColorAlpha(color_black, 100))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
surface.SetDrawColor(Color(116, 113, 130, 255))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
local skillProgress = math.Clamp(character:GetSkillStoredExp(skillID) / 1000, 0, 1)
|
||||
|
||||
skillPanel.progressBar = experiencePanel:Add("Panel")
|
||||
skillPanel.progressBar:Dock(FILL)
|
||||
skillPanel.progressBar.progress = skillProgress
|
||||
skillPanel.progressBar.Paint = function(panel, w, h)
|
||||
surface.SetDrawColor(Color(255, 78, 70, 255))
|
||||
surface.DrawRect(0, 0, w * panel.progress, h)
|
||||
end
|
||||
|
||||
skillPanel.processLabel = skillPanel.progressBar:Add("DLabel")
|
||||
skillPanel.processLabel.skillID = skillID
|
||||
skillPanel.processLabel.SetupText = function(panel, char)
|
||||
if (char:GetSkill(skillID) == ix.skill.MAX_SKILL) then
|
||||
panel:SetText("MAX POZIOM")
|
||||
elseif (char:GetTotalSkillLevel() == ix.config.Get("MaxTotalSkill")) then
|
||||
panel:SetText("MAX ŁĄCZNY POZIOM")
|
||||
elseif (char:CanLevelSkill(panel.skillID)) then
|
||||
panel:SetText("AWANS")
|
||||
else
|
||||
local skillProg = math.Clamp(character:GetSkillStoredExp(panel.skillID) / 1000, 0, 1)
|
||||
panel:SetText((skillProg * 100) .. "%")
|
||||
end
|
||||
end
|
||||
|
||||
skillPanel.processLabel:SetupText(character)
|
||||
skillPanel.processLabel:SetFont("MenuFontLargerNoClamp")
|
||||
skillPanel.processLabel:SetContentAlignment(5)
|
||||
skillPanel.processLabel:Dock(FILL)
|
||||
|
||||
local levelUp = skillPanel.progressBar:Add("DButton")
|
||||
levelUp:Dock(FILL)
|
||||
levelUp:SetText("")
|
||||
levelUp.Paint = nil
|
||||
levelUp.DoClick = function()
|
||||
if character:CanLevelSkill(skillID) then
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
|
||||
net.Start("ixSkillLevelUp")
|
||||
net.WriteString(skillID)
|
||||
net.SendToServer()
|
||||
end
|
||||
end
|
||||
|
||||
local imagePanel = skillPanel:Add("Panel")
|
||||
imagePanel:Dock(FILL)
|
||||
|
||||
local boostPanel = imagePanel:Add("Panel")
|
||||
boostPanel:SetSize(skillPanel:GetWide(), skillPanel:GetTall() - bottomPanelH)
|
||||
boostPanel:DockPadding(dPadding * 4, dPadding * 3, dPadding * 4, dPadding * 4)
|
||||
boostPanel.Paint = self.CoolHover
|
||||
|
||||
local skillButton = imagePanel:Add("DButton")
|
||||
skillButton:Dock(FILL)
|
||||
skillButton:SetText("")
|
||||
skillButton:DockPadding(dPadding * 4, dPadding * 4, dPadding * 4, dPadding * 4)
|
||||
skillButton.Paint = nil
|
||||
|
||||
skillButton.OnCursorEntered = function()
|
||||
surface.PlaySound("helix/ui/rollover.wav")
|
||||
boostPanel.Paint = nil
|
||||
end
|
||||
|
||||
skillButton.OnCursorExited = function()
|
||||
boostPanel.Paint = self.CoolHover
|
||||
end
|
||||
|
||||
skillButton.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self:OpenSkillPanel(skillInfo)
|
||||
end
|
||||
|
||||
self:CreateBoostInfo(boostPanel, skillInfo)
|
||||
self:CheckForCurrent(skillInfo)
|
||||
|
||||
local autoLevel = skillButton:Add("DButton")
|
||||
skillPanel.autoLevel = autoLevel
|
||||
|
||||
autoLevel.autoLevel = character:GetSkillAutoLevel(skillID)
|
||||
autoLevel:Dock(BOTTOM)
|
||||
autoLevel:SetTall(SScaleMin(20 / 3))
|
||||
autoLevel:SetContentAlignment(4)
|
||||
autoLevel:SetText("Autopoziom")
|
||||
autoLevel:SetFont("MenuFontBoldNoClamp")
|
||||
autoLevel:SetTextInset(SScaleMin(30 / 3), 0)
|
||||
autoLevel:DockMargin(0, 0, skillPanel:GetWide() * 0.63, 0)
|
||||
autoLevel.Paint = function(panel, w, h)
|
||||
surface.SetDrawColor(color_white)
|
||||
surface.DrawOutlinedRect(0, 0, SScaleMin(20 / 3), h)
|
||||
|
||||
if panel.autoLevel then
|
||||
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/tabmenu/skills_v2/tick.png"))
|
||||
surface.DrawTexturedRect(SScaleMin(20 / 3) * 0.5 - SScaleMin(15 / 3) * 0.5, SScaleMin(20 / 3) * 0.5 - SScaleMin(10 / 3) * 0.5, SScaleMin(15 / 3), SScaleMin(11 / 3))
|
||||
end
|
||||
end
|
||||
|
||||
autoLevel.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
net.Start("ixSkillSetAutoLevel")
|
||||
net.WriteString(skillID)
|
||||
net.SendToServer()
|
||||
|
||||
autoLevel.autoLevel = !autoLevel.autoLevel
|
||||
end
|
||||
|
||||
if skillInfo.uniqueID == "bartering" then
|
||||
experiencePanel:SetVisible(false)
|
||||
skillPanel.skillLevel:SetText("Masz " .. (istable(character:GetPermits()) and table.Count(character:GetPermits()) or "0") .. " aktywnych zezwoleń")
|
||||
skillPanel.skillLevel:SizeToContents()
|
||||
autoLevel:SetVisible(false)
|
||||
end
|
||||
|
||||
self.skillGrid:AddItem( skillPanel )
|
||||
return skillPanel
|
||||
end
|
||||
|
||||
function PANEL:OpenSkillPanel(skill)
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
if self.panels[skill.uniqueID] then
|
||||
if (self.contentPanel) then
|
||||
self.contentPanelOriginX, self.contentPanelOriginY = self.contentPanel:GetPos()
|
||||
self.contentPanel:MoveTo(ScrW(), self.contentPanelOriginY, 1, 0)
|
||||
end
|
||||
|
||||
for k, v in pairs(self.panels) do
|
||||
if k == skill.uniqueID then
|
||||
self:CreateNewContent(v, skill.uniqueID)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CheckForCurrent(skill)
|
||||
if self.panels[skill.uniqueID] then
|
||||
if self.contentPanel then
|
||||
if LocalPlayer().lastSelectedSkill then
|
||||
if LocalPlayer().lastSelectedSkill == skill.uniqueID then
|
||||
self.contentPanelOriginX, self.contentPanelOriginY = self.contentPanel:GetPos()
|
||||
|
||||
self.contentPanel:SetPos(ScrW(), self.contentPanelOriginY)
|
||||
|
||||
for k, v in pairs(self.panels) do
|
||||
if k == skill.uniqueID then
|
||||
self:CreateNewContent(v, skill.uniqueID)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL.CoolHover(self, w, h)
|
||||
surface.SetDrawColor(Color(0, 0, 0, 150))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
function PANEL:CreateBoostInfo(boostPanel, skill)
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
local attributes = ix.special.list or {}
|
||||
local skillAttributes = {}
|
||||
|
||||
-- Find the attributes that boost the skill
|
||||
for _, v in pairs(attributes) do
|
||||
if v.skills then
|
||||
if v.skills[skill.uniqueID] then
|
||||
skillAttributes[v.skills[skill.uniqueID]] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if skillAttributes[2] then
|
||||
local boostedByLabel = boostPanel:Add("DLabel")
|
||||
boostedByLabel:SetText("Znaczne wzmocnienie od " .. skillAttributes[2].name)
|
||||
boostedByLabel:SetFont("MenuFontBoldNoClamp")
|
||||
boostedByLabel:SetContentAlignment(4)
|
||||
boostedByLabel:SizeToContents()
|
||||
boostedByLabel:Dock(TOP)
|
||||
end
|
||||
|
||||
if skillAttributes[1] then
|
||||
local boostedByLabel = boostPanel:Add("DLabel")
|
||||
boostedByLabel:SetText("Niewielkie wzmocnienie od " .. skillAttributes[1].name)
|
||||
boostedByLabel:SetFont("MenuFontBoldNoClamp")
|
||||
boostedByLabel:SetContentAlignment(4)
|
||||
boostedByLabel:SizeToContents()
|
||||
boostedByLabel:Dock(TOP)
|
||||
end
|
||||
|
||||
local varBoostLevel = character:GetSkillBoostLevels(skill.uniqueID)
|
||||
local varNeedsLevel, reducedHunger, reducedThirst, reducedGas, reducedHealth = character:GetSkillNeedsReducing(skill.uniqueID)
|
||||
|
||||
if (varBoostLevel > 0) then
|
||||
-- ATLE HAPPY
|
||||
local boostedLevels = boostPanel:Add("DLabel")
|
||||
boostedLevels:Dock(TOP)
|
||||
boostedLevels:SetContentAlignment(4)
|
||||
boostedLevels:SetFont("MenuFontLargerBoldNoFix")
|
||||
boostedLevels:SetTextColor(Color(75, 238, 75))
|
||||
boostedLevels:SetText("Wzmocnione poziomy: +" .. varBoostLevel)
|
||||
boostedLevels:SizeToContents()
|
||||
end
|
||||
|
||||
if (varNeedsLevel > 0) then
|
||||
if (reducedHunger) then
|
||||
local hungerReducing = boostPanel:Add("DLabel")
|
||||
hungerReducing:Dock(TOP)
|
||||
hungerReducing:SetContentAlignment(4)
|
||||
hungerReducing:SetFont("MenuFontLargerBoldNoFix")
|
||||
hungerReducing:SetTextColor(Color(238, 75, 75))
|
||||
hungerReducing:SetText("-" .. math.Round(reducedHunger, 1) .. " poziomy z powodu Głodu")
|
||||
hungerReducing:SizeToContents()
|
||||
end
|
||||
|
||||
if (reducedThirst) then
|
||||
local thirstReducing = boostPanel:Add("DLabel")
|
||||
thirstReducing:Dock(TOP)
|
||||
thirstReducing:SetContentAlignment(4)
|
||||
thirstReducing:SetFont("MenuFontLargerBoldNoFix")
|
||||
thirstReducing:SetTextColor(Color(238, 75, 75))
|
||||
thirstReducing:SetText("-" .. math.Round(reducedThirst, 1) .. " poziomów z powodu Pragnienia")
|
||||
thirstReducing:SizeToContents()
|
||||
end
|
||||
|
||||
if (reducedGas) then
|
||||
local gasReducing = boostPanel:Add("DLabel")
|
||||
gasReducing:Dock(TOP)
|
||||
gasReducing:SetContentAlignment(4)
|
||||
gasReducing:SetFont("MenuFontLargerBoldNoFix")
|
||||
gasReducing:SetTextColor(Color(238, 75, 75))
|
||||
gasReducing:SetText("-" .. math.Round(reducedGas, 1) .. " poziomu z powodu Zarodników")
|
||||
gasReducing:SizeToContents()
|
||||
end
|
||||
|
||||
if (reducedHealth) then
|
||||
local healthReducing = boostPanel:Add("DLabel")
|
||||
healthReducing:Dock(TOP)
|
||||
healthReducing:SetContentAlignment(4)
|
||||
healthReducing:SetFont("MenuFontLargerBoldNoFix")
|
||||
healthReducing:SetTextColor(Color(238, 75, 75))
|
||||
healthReducing:SetText("-" .. math.Round(reducedHealth, 1) .. " poziomu z powodu Urazów")
|
||||
healthReducing:SizeToContents()
|
||||
end
|
||||
|
||||
local needsReducing = boostPanel:Add("DLabel")
|
||||
needsReducing:Dock(TOP)
|
||||
needsReducing:SetContentAlignment(4)
|
||||
needsReducing:SetFont("MenuFontLargerBoldNoFix")
|
||||
needsReducing:SetTextColor(Color(238, 75, 75))
|
||||
needsReducing:SetText("Łączne obniżenie poziomu: -" .. varNeedsLevel)
|
||||
needsReducing:SizeToContents()
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateSkillLabel(parent, text, font, leftMargin, rightMargin, color)
|
||||
parent:Dock(LEFT)
|
||||
parent:SetFont(font)
|
||||
parent:SetText(text or "")
|
||||
parent:SetContentAlignment(4)
|
||||
parent:DockMargin(leftMargin, 0, rightMargin, 0)
|
||||
parent:SizeToContents()
|
||||
parent:SetTextColor(color or color_white)
|
||||
end
|
||||
|
||||
function PANEL:CreateNewContent(v, name)
|
||||
local newContent = self:Add("Panel")
|
||||
newContent:SetSize(self.contentPanel:GetSize())
|
||||
newContent:SetPos(self:GetWide() * 0.5 - self.contentPanel:GetWide() * 0.5, titlePushDown)
|
||||
local x, y = newContent:GetPos()
|
||||
|
||||
if !LocalPlayer().lastSelectedSkill then
|
||||
newContent:SetPos(0 - ScrW(), y)
|
||||
newContent:MoveTo(x, y, 1, 0)
|
||||
else
|
||||
newContent:SetPos(x, y)
|
||||
end
|
||||
|
||||
LocalPlayer().lastSelectedSkill = name
|
||||
|
||||
if self.chosenSkillPanel then
|
||||
self.chosenSkillPanel:Remove()
|
||||
end
|
||||
|
||||
if self.backButton then
|
||||
self.backButton:Remove()
|
||||
end
|
||||
|
||||
self.chosenSkillPanel = v(newContent)
|
||||
|
||||
self.attributesButton:SetVisible(false)
|
||||
|
||||
self.backButton = self.titlePanel:Add("DButton")
|
||||
self.backButton:Dock(RIGHT)
|
||||
self.backButton:SetText("Powrót do menu umiejętności")
|
||||
self.backButton:SetFont("TitlesFontNoClamp")
|
||||
self.backButton:SetContentAlignment(6)
|
||||
self.backButton:SetAlpha(0)
|
||||
self.backButton:AlphaTo(255, 1, 0)
|
||||
self.backButton:SizeToContents()
|
||||
self.backButton:DockMargin(0, self.titlePanel:GetTall() * 0.3 - self.backButton:GetTall(), 0, self.titlePanel:GetTall() * 0.5 - self.backButton:GetTall() * 0.5)
|
||||
self.backButton.Paint = function(_, w, h) end
|
||||
|
||||
self.backButton.OnCursorEntered = function()
|
||||
self.backButton:SetTextColor(Color(200, 200, 200, 255))
|
||||
surface.PlaySound("willardnetworks/charactercreation/hover.wav")
|
||||
end
|
||||
|
||||
self.backButton.OnCursorExited = function()
|
||||
self.backButton:SetTextColor(Color(255, 255, 255, 255))
|
||||
end
|
||||
|
||||
self.backButton.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self.backButton:AlphaTo(0, 1, 0, function()
|
||||
self.attributesButton:SetVisible(true)
|
||||
self.attributesButton:SetAlpha(0)
|
||||
self.attributesButton:AlphaTo(255, 0.5, 0)
|
||||
end)
|
||||
newContent:MoveTo(0 - ScrW(), y, 1, 0)
|
||||
self.contentPanel:MoveTo(self:GetWide() * 0.5 - self.contentPanel:GetWide() * 0.5, self.contentPanelOriginY, 1, 0)
|
||||
LocalPlayer().lastSelectedSkill = nil
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateAttributesPanel()
|
||||
self.attributesButton = self.titlePanel:Add("DButton")
|
||||
self.attributesButton:Dock(RIGHT)
|
||||
self.attributesButton:DockMargin(0, SScaleMin(25 / 3), 0, SScaleMin(63 / 3))
|
||||
self.attributesButton:SetText("Wzmocnienia Atrybutów")
|
||||
self.attributesButton:SetFont("MenuFontBoldNoClamp")
|
||||
self.attributesButton:SetWide(SScaleMin(170 / 3))
|
||||
self.attributesButton.Paint = function(_, w, h)
|
||||
surface.SetDrawColor(0, 0, 0, 100)
|
||||
surface.DrawRect(0, 1, w - 2, h - 1)
|
||||
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
self.attributesButton.DoClick = function()
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
self:CreateAttributePopup()
|
||||
end
|
||||
end
|
||||
|
||||
local attributePadding = SScaleMin(10 / 3)
|
||||
|
||||
function PANEL:CreateAttributeBar(parent, attributeID)
|
||||
local character = LocalPlayer():GetCharacter()
|
||||
local special = tonumber(character:GetSpecial(attributeID)) or 0
|
||||
local attribute = ix.special:Find(attributeID)
|
||||
local icon = attribute.icon or ""
|
||||
local boost = tonumber(character:GetBoostedAttribute(attributeID)) or 0
|
||||
local specialBoost = character:GetSpecialBoost()[attributeID] or {}
|
||||
|
||||
parent:SetTall(SScaleMin(100 / 3))
|
||||
parent:Dock(TOP)
|
||||
parent:DockMargin(attributePadding * 2, 0, attributePadding * 2, attributePadding)
|
||||
|
||||
local barPanel = parent:Add("Panel")
|
||||
barPanel:Dock(TOP)
|
||||
barPanel:SetTall(SScaleMin(27 / 3))
|
||||
|
||||
-- icon
|
||||
local iconImage = barPanel:Add("DImage")
|
||||
iconImage:Dock(LEFT)
|
||||
iconImage:SetWide(SScaleMin(20 / 3))
|
||||
iconImage:SetImage(icon)
|
||||
iconImage:DockMargin(0, SScaleMin(2 / 3), attributePadding * 2, SScaleMin(2 / 3))
|
||||
|
||||
local backgroundBar = barPanel:Add("Panel")
|
||||
backgroundBar:Dock(FILL)
|
||||
backgroundBar.Paint = function(_, w, h)
|
||||
surface.SetDrawColor(Color(0, 0, 0, 100))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
local positivePoints = 0
|
||||
local negativePoints = 0
|
||||
|
||||
for _, v in pairs(specialBoost) do
|
||||
if v.level > 0 then
|
||||
positivePoints = positivePoints + v.level
|
||||
elseif v.level < 0 then
|
||||
negativePoints = negativePoints - v.level
|
||||
end
|
||||
end
|
||||
|
||||
local green = Color(138, 200, 97, 255)
|
||||
local grey = Color(200, 200, 200, 255)
|
||||
local red = Color(200, 97, 97, 255)
|
||||
|
||||
local baseBar = backgroundBar:Add("Panel")
|
||||
baseBar:SetSize(SScaleMin(360 / 3), barPanel:GetTall())
|
||||
baseBar.Paint = function(_, w, h)
|
||||
if positivePoints > 0 then
|
||||
surface.SetDrawColor(green)
|
||||
surface.DrawRect(0, 0, (positivePoints + special) * (w / 10), h)
|
||||
end
|
||||
|
||||
if special > 0 then
|
||||
surface.SetDrawColor(Color(200, 200, 200, 255))
|
||||
surface.DrawRect(0, 0, (special * w) / 10, h)
|
||||
end
|
||||
|
||||
if negativePoints > 0 then
|
||||
surface.SetDrawColor(red)
|
||||
surface.DrawRect(math.max((positivePoints + special) - negativePoints, 0) * (w / 10), 0, negativePoints, h)
|
||||
end
|
||||
end
|
||||
|
||||
local attributeAmount = barPanel:Add("DLabel")
|
||||
attributeAmount:Dock(RIGHT)
|
||||
attributeAmount:SetText(boost .. "/10")
|
||||
attributeAmount:SetTextColor((boost > special and green) or (boost < special and red) or grey)
|
||||
attributeAmount:DockMargin(attributePadding * 2 + ((boost == 10 and SScaleMin(3 / 3)) or SScaleMin(11 / 3)), 0, 0, 0)
|
||||
attributeAmount:SetFont("MenuFontNoClamp")
|
||||
attributeAmount:SizeToContents()
|
||||
|
||||
if specialBoost.long then
|
||||
local level = specialBoost.long.level
|
||||
local longBoost = parent:Add("DLabel")
|
||||
longBoost:Dock(TOP)
|
||||
if (level != 0) then
|
||||
local change = level > specialBoost.long.target and "zmniejszy się" or "zwiększy się"
|
||||
local sign = level > 0 and "+" or ""
|
||||
longBoost:SetText(string.format("Obecnie masz %s%d wzmocnienie od żywności, %s o 1 za %d min", sign, level, change, specialBoost.long.time))
|
||||
elseif (specialBoost.long.time) then
|
||||
local sign = specialBoost.long.target > 0 and "+" or "-"
|
||||
longBoost:SetText(string.format("%s1 wzmocnienie od żywności stanie się aktywne za %d min", sign, specialBoost.long.time))
|
||||
end
|
||||
longBoost:SetContentAlignment(5)
|
||||
longBoost:SetFont("MenuFontNoClamp")
|
||||
longBoost:DockMargin(0, attributePadding, 0, attributePadding)
|
||||
longBoost:SizeToContents()
|
||||
end
|
||||
|
||||
if specialBoost.short then
|
||||
local level = specialBoost.short.level
|
||||
local shortBoost = parent:Add("DLabel")
|
||||
shortBoost:Dock(TOP)
|
||||
if (level != 0) then
|
||||
local change = level > specialBoost.short.target and "zmniejszy się" or "zwiększy się"
|
||||
local sign = level > 0 and "+" or ""
|
||||
shortBoost:SetText(string.format("Obecnie masz %s%d wzmocnienie od substancji, %s o 1 za %d s", sign, level, change, specialBoost.short.time))
|
||||
elseif (specialBoost.short.time) then
|
||||
local sign = specialBoost.short.target > 0 and "+" or "-"
|
||||
shortBoost:SetText(string.format("%s1 wzmocnienie od substancji stanie się aktywne za %d s", sign, specialBoost.short.time))
|
||||
end
|
||||
shortBoost:SetContentAlignment(5)
|
||||
shortBoost:SetFont("MenuFontNoClamp")
|
||||
shortBoost:DockMargin(0, attributePadding, 0, 0)
|
||||
shortBoost:SizeToContents()
|
||||
end
|
||||
|
||||
if specialBoost.neg then
|
||||
local negativeBoost = parent:Add("DLabel")
|
||||
negativeBoost:Dock(TOP)
|
||||
negativeBoost:SetText("-" .. specialBoost.neg.level .. " od głodu i pragnienia")
|
||||
negativeBoost:SetContentAlignment(5)
|
||||
negativeBoost:SetFont("MenuFontNoClamp")
|
||||
negativeBoost:DockMargin(0, attributePadding, 0, 0)
|
||||
negativeBoost:SizeToContents()
|
||||
end
|
||||
end
|
||||
|
||||
function PANEL:CreateAttributePopup()
|
||||
if ix.gui.attributeFrame then
|
||||
ix.gui.attributeFrame:Remove()
|
||||
end
|
||||
|
||||
ix.gui.attributeFrame = vgui.Create("Panel")
|
||||
local attributeFrame = ix.gui.attributeFrame
|
||||
attributeFrame:SetSize(SScaleMin(500 / 3), SScaleMin(507 / 3))
|
||||
attributeFrame:SetAlpha(0)
|
||||
attributeFrame:AlphaTo(255, 0.5, 0)
|
||||
attributeFrame:Center()
|
||||
attributeFrame:MakePopup()
|
||||
attributeFrame.Paint = function(panel, w, h)
|
||||
local blur = Material("pp/blurscreen")
|
||||
|
||||
local x, y = panel:LocalToScreen(0, 0)
|
||||
surface.SetDrawColor( 255, 255, 255 )
|
||||
surface.SetMaterial( blur )
|
||||
|
||||
for i = 1, 6 do
|
||||
blur:SetFloat( "$blur", (i / 6 ) * ( 3 ) )
|
||||
blur:Recompute()
|
||||
render.UpdateScreenEffectTexture()
|
||||
surface.DrawTexturedRect( x * -1, y * -1, ScrW(), ScrH() )
|
||||
end
|
||||
|
||||
surface.SetDrawColor(Color(0, 0, 0, 100))
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
|
||||
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
|
||||
surface.DrawOutlinedRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
attributeFrame.Think = function()
|
||||
if !IsValid(PLUGIN.SkillsMenu) then
|
||||
ix.gui.attributeFrame:Remove()
|
||||
end
|
||||
|
||||
if ix.gui.attributeFrame then
|
||||
ix.gui.attributeFrame:MoveToFront()
|
||||
end
|
||||
end
|
||||
|
||||
local topbar = attributeFrame:Add("Panel")
|
||||
topbar:SetSize(attributeFrame:GetWide(), SScaleMin(50 / 3))
|
||||
topbar:Dock(TOP)
|
||||
topbar:DockMargin(0, 0, 0, attributePadding)
|
||||
topbar.Paint = function( _, w, h )
|
||||
surface.SetDrawColor(0, 0, 0, 130)
|
||||
surface.DrawRect(0, 0, w, h)
|
||||
end
|
||||
|
||||
local titleText = topbar:Add("DLabel")
|
||||
titleText:SetFont("CharCreationBoldTitleNoClamp")
|
||||
titleText:Dock(LEFT)
|
||||
titleText:SetText("Wzmocnienia Atrybutów")
|
||||
titleText:DockMargin(attributePadding, 0, 0, 0)
|
||||
titleText:SetContentAlignment(4)
|
||||
titleText:SizeToContents()
|
||||
|
||||
local exit = topbar:Add("DImageButton")
|
||||
exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
|
||||
exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
|
||||
exit:DockMargin(0, SScaleMin(15 / 3), attributePadding, SScaleMin(15 / 3))
|
||||
exit:Dock(RIGHT)
|
||||
exit.DoClick = function()
|
||||
if !IsValid(self) then
|
||||
return
|
||||
end
|
||||
|
||||
if attributeFrame then
|
||||
attributeFrame:Remove()
|
||||
end
|
||||
|
||||
surface.PlaySound("helix/ui/press.wav")
|
||||
end
|
||||
|
||||
local strength = attributeFrame:Add("Panel")
|
||||
self:CreateAttributeBar(strength, "strength")
|
||||
|
||||
local intelligence = attributeFrame:Add("Panel")
|
||||
self:CreateAttributeBar(intelligence, "intelligence")
|
||||
|
||||
local perception = attributeFrame:Add("Panel")
|
||||
self:CreateAttributeBar(perception, "perception")
|
||||
|
||||
local agility = attributeFrame:Add("Panel")
|
||||
self:CreateAttributeBar(agility, "agility")
|
||||
end
|
||||
|
||||
vgui.Register("WNSkillPanel", PANEL, "EditablePanel")
|
||||
|
||||
hook.Add("CreateMenuButtons", "WNSkillPanel", function(tabs)
|
||||
tabs["skills"] = {
|
||||
RowNumber = 2,
|
||||
Width = 18,
|
||||
Height = 18,
|
||||
Icon = "willardnetworks/tabmenu/navicons/crafting.png",
|
||||
Create = function(info, container)
|
||||
if PLUGIN.SkillsMenu then
|
||||
PLUGIN.SkillsMenu:Remove()
|
||||
end
|
||||
|
||||
PLUGIN.SkillsMenu = container:Add("WNSkillPanel")
|
||||
end
|
||||
}
|
||||
end)
|
||||
@@ -0,0 +1,54 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
-- Called when the entity initializes.
|
||||
function ENT:Initialize()
|
||||
self.fireSize = 100
|
||||
self.nextFlicker = 0
|
||||
end
|
||||
|
||||
-- Called when the entity should draw.
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
-- Called when the entity should think.
|
||||
function ENT:Think()
|
||||
local curTime = CurTime()
|
||||
local dlight = DynamicLight( self:EntIndex() )
|
||||
|
||||
if (!self.nextFlicker) then
|
||||
self.nextFlicker = curTime + math.random(0.1, 0.15)
|
||||
end
|
||||
|
||||
if ( dlight ) then
|
||||
local r, g, b, a = self:GetColor()
|
||||
dlight.Pos = self:GetPos()
|
||||
dlight.r = 250
|
||||
dlight.g = 255
|
||||
dlight.b = 125
|
||||
dlight.Brightness = 0
|
||||
dlight.Size = self.fireSize
|
||||
dlight.Decay = 5
|
||||
dlight.DieTime = CurTime() + 0.1
|
||||
self:Flicker()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Flicker()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (curTime >= self.nextFlicker) then
|
||||
self.fireSize = math.random(300, 400)
|
||||
self.nextFlicker = nil
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,117 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
|
||||
-- Called when the entity initializes.
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/props_junk/rock001a.mdl")
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:SetMaterial("models/effects/splode1_sheet")
|
||||
local phys = self:GetPhysicsObject()
|
||||
if phys:IsValid() then
|
||||
phys:Wake()
|
||||
phys:EnableMotion(false)
|
||||
end
|
||||
self:SpawnProps()
|
||||
self:startFire()
|
||||
end
|
||||
|
||||
-- Called when the entity is spawned.
|
||||
function ENT:SpawnProps()
|
||||
|
||||
local rotation1 = Vector(0, 0, 45)
|
||||
local angle1 = self:GetAngles()
|
||||
angle1:RotateAroundAxis(angle1:Forward(), rotation1.z)
|
||||
|
||||
local rotation2 = Vector(90, 0, 45)
|
||||
local angle2 = self:GetAngles()
|
||||
angle2:RotateAroundAxis(angle2:Up(), rotation2.x)
|
||||
angle2:RotateAroundAxis(angle2:Forward(), rotation2.z)
|
||||
|
||||
local rotation3 = Vector(180, 0, 45)
|
||||
local angle3 = self:GetAngles()
|
||||
angle3:RotateAroundAxis(angle3:Up(), rotation3.x)
|
||||
angle3:RotateAroundAxis(angle3:Forward(), rotation3.z)
|
||||
|
||||
local rotation4 = Vector(270, 0, 45)
|
||||
local angle4 = self:GetAngles()
|
||||
angle4:RotateAroundAxis(angle4:Up(), rotation4.x)
|
||||
angle4:RotateAroundAxis(angle4:Forward(), rotation4.z)
|
||||
|
||||
local Up = 16
|
||||
|
||||
local wood1 = ents.Create("prop_dynamic")
|
||||
wood1:SetPos(self:GetPos() + self:GetUp() * Up)
|
||||
wood1:SetAngles(angle1)
|
||||
wood1:SetModel("models/props_debris/wood_chunk01b.mdl")
|
||||
wood1:Activate()
|
||||
wood1:SetParent(self)
|
||||
wood1:Spawn()
|
||||
wood1:DeleteOnRemove(self)
|
||||
|
||||
local ground = ents.Create("prop_dynamic")
|
||||
ground:SetPos(self:GetPos())
|
||||
ground:SetAngles(self:GetAngles())
|
||||
ground:SetModel("models/willardnetworks/skills/campfire.mdl")
|
||||
ground:Activate()
|
||||
ground:SetParent(self)
|
||||
ground:Spawn()
|
||||
ground:DeleteOnRemove(self)
|
||||
|
||||
local wood2 = ents.Create("prop_dynamic")
|
||||
wood2:SetPos(self:GetPos() + self:GetUp() * Up)
|
||||
wood2:SetAngles(angle2)
|
||||
wood2:SetModel("models/props_debris/wood_chunk01b.mdl")
|
||||
wood2:Activate()
|
||||
wood2:SetParent(self)
|
||||
wood2:Spawn()
|
||||
wood2:DeleteOnRemove(self)
|
||||
|
||||
local wood3 = ents.Create("prop_dynamic")
|
||||
wood3:SetPos(self:GetPos() + self:GetUp() * Up)
|
||||
wood3:SetAngles(angle3)
|
||||
wood3:SetModel("models/props_debris/wood_chunk01b.mdl")
|
||||
wood3:Activate()
|
||||
wood3:SetParent(self)
|
||||
wood3:Spawn()
|
||||
wood3:DeleteOnRemove(self)
|
||||
|
||||
local wood4 = ents.Create("prop_dynamic")
|
||||
wood4:SetPos(self:GetPos() + self:GetUp() * Up)
|
||||
wood4:SetAngles(angle4)
|
||||
wood4:SetModel("models/props_debris/wood_chunk01b.mdl")
|
||||
wood4:Activate()
|
||||
wood4:SetParent(self)
|
||||
wood4:Spawn()
|
||||
wood4:DeleteOnRemove(self)
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
self:stopFire()
|
||||
end
|
||||
|
||||
function ENT:startFire()
|
||||
self:Ignite(1)
|
||||
timer.Create( tostring(self:GetCreationID()), 1, 0,
|
||||
function()
|
||||
self:Ignite(1)
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:stopFire()
|
||||
timer.Remove( tostring(self:GetCreationID()) )
|
||||
self:Extinguish()
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
DEFINE_BASECLASS("base_gmodentity");
|
||||
|
||||
ENT.Type = "anim";
|
||||
ENT.Author = "RJ";
|
||||
ENT.PrintName = "Campfire";
|
||||
ENT.Spawnable = true;
|
||||
ENT.AdminSpawnable = true;
|
||||
@@ -0,0 +1,65 @@
|
||||
--[[
|
||||
| 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
|
||||
include('shared.lua')
|
||||
|
||||
netstream.Hook("OpenPickupDispenser", function(boughtItems, entity)
|
||||
LocalPlayer().activePickupDispenser = entity
|
||||
LocalPlayer().boughtItems = boughtItems
|
||||
vgui.Create("PickupDispenser")
|
||||
end)
|
||||
|
||||
netstream.Hook("OpenCIDSelector", function(entity)
|
||||
LocalPlayer().activePickupDispenser = entity
|
||||
local cidSelector = vgui.Create("CIDSelector")
|
||||
cidSelector.activeEntity = entity
|
||||
|
||||
cidSelector.ExitCallback = function()
|
||||
netstream.Start("ClosePanels", LocalPlayer().activePickupDispenser)
|
||||
LocalPlayer().activePickupDispenser = nil
|
||||
LocalPlayer().boughtItems = nil
|
||||
end
|
||||
|
||||
cidSelector.SelectCallback = function(idCardID, cid, cidName, entity2)
|
||||
netstream.Start("SelectCID", idCardID, cid, cidName, entity2)
|
||||
end
|
||||
end)
|
||||
|
||||
function ENT:Draw()
|
||||
local position, angles = self:GetPos(), self:GetAngles()
|
||||
local display = self.Displays[self:GetDisplay()] or self.Displays[6]
|
||||
|
||||
angles:RotateAroundAxis(angles:Forward(), 90)
|
||||
angles:RotateAroundAxis(angles:Right(), 270)
|
||||
|
||||
cam.Start3D2D(position + self:GetForward() * 8.4 + self:GetRight()* 8.5 + self:GetUp() * 3, angles, 0.1)
|
||||
render.PushFilterMin(TEXFILTER.NONE)
|
||||
render.PushFilterMag(TEXFILTER.NONE)
|
||||
|
||||
surface.SetDrawColor(color_black)
|
||||
surface.DrawRect(10, 16, 153, 40)
|
||||
|
||||
surface.SetDrawColor(60, 60, 60)
|
||||
surface.DrawOutlinedRect(9, 16, 155, 40)
|
||||
|
||||
surface.SetDrawColor( Color( 255, 255, 255, 3 ) )
|
||||
surface.DrawRect( 11, 36 + math.sin( CurTime() * 4 ) * 38 / 2, 151, 1 )
|
||||
|
||||
local alpha = 191 + 64 * math.sin( CurTime() * 4 )
|
||||
local color = ColorAlpha(display[2], alpha)
|
||||
|
||||
draw.SimpleText(display[1], "MenuFont", 86, 36, color, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
|
||||
render.PopFilterMin()
|
||||
render.PopFilterMag()
|
||||
cam.End3D2D()
|
||||
end
|
||||
@@ -0,0 +1,377 @@
|
||||
--[[
|
||||
| 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
|
||||
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
|
||||
include('shared.lua')
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local dispenser = ents.Create("ix_pickupterminal")
|
||||
|
||||
dispenser:SetPos(trace.HitPos)
|
||||
dispenser:SetAngles(trace.HitNormal:Angle())
|
||||
dispenser:Spawn()
|
||||
dispenser:Activate()
|
||||
|
||||
ix.saveEnts:SaveEntity(dispenser)
|
||||
PLUGIN:SavePickupTerminals()
|
||||
return dispenser
|
||||
end
|
||||
|
||||
ix.log.AddType("pickupDispenserGotItem", function(client)
|
||||
return string.format("[PICKUP DISPENSER] %s ( %s ) picked up an item from the pickup dispenser.", client:SteamName(), client:Name())
|
||||
end)
|
||||
|
||||
function ENT:Initialize()
|
||||
-- Because dispenser model has no physics object in order to allow pass through walls
|
||||
self:SetModel("models/props_junk/watermelon01.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:DrawShadow(false)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetDisplay(1)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
|
||||
self.dispenser = ents.Create("prop_dynamic")
|
||||
self.dispenser:SetModel("models/props_combine/pickup_dispenser3.mdl")
|
||||
self.dispenser:SetPos(self:GetPos())
|
||||
self.dispenser:SetAngles(self:GetAngles())
|
||||
self.dispenser:SetParent(self)
|
||||
self.dispenser:Spawn()
|
||||
self.dispenser:Activate()
|
||||
self.dispenser:SetTrigger(true)
|
||||
self:DeleteOnRemove(self.dispenser)
|
||||
|
||||
local physics = self.dispenser:GetPhysicsObject()
|
||||
physics:EnableMotion(false)
|
||||
physics:Wake()
|
||||
|
||||
self.canUse = true
|
||||
self.nextUseTime = CurTime()
|
||||
end
|
||||
|
||||
function ENT:ItemChoiceLogic(item, inventory, cid, purchasedItems)
|
||||
if (item == "newspaper_printer") then
|
||||
if (!inventory:Add(item, 1, {registeredCID = cid:GetData("cid")})) then
|
||||
return false
|
||||
end
|
||||
elseif (item == "apartmentkey" or item == "shopkey") then
|
||||
local housing = ix.plugin.list["housing"]
|
||||
if housing and housing.GetApartmentByCID then
|
||||
local cidData = cid:GetData("cid")
|
||||
local appID = housing:GetApartmentByCID(cidData, item)
|
||||
if appID then
|
||||
if (!inventory:Add(item, 1, {cid = cidData, apartment = appID})) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif (string.find(item, "letter")) then
|
||||
local itemData = purchasedItems[item]
|
||||
if (!inventory:Add("paper", 1, {title = itemData.title, writingID = itemData.writingID, owner = itemData.currentOwner})) then
|
||||
return false
|
||||
end
|
||||
else
|
||||
if (!inventory:Add(item)) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:GiveItem(client, item, cid)
|
||||
local character = client:GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
local itemTable = string.find(item, "letter") and ix.item.list["paper"] or ix.item.list[item]
|
||||
if (!itemTable) then return false end
|
||||
|
||||
if (!inventory:FindEmptySlot(itemTable.width, itemTable.height)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if !inventory:GetItemByID(cid.id) then
|
||||
return false
|
||||
end
|
||||
|
||||
if self.charLoaded then
|
||||
if ix.char.loaded[self.charLoaded] then
|
||||
local items = ix.char.loaded[self.charLoaded]:GetPurchasedItems()
|
||||
if (!items[item] or (!istable(items[item]) and items[item] <= 0)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if self:ItemChoiceLogic(item, inventory, cid, items) then
|
||||
ix.char.loaded[self.charLoaded]:SetPurchasedItems(item)
|
||||
ix.log.Add(client, "pickupDispenserGotItem")
|
||||
end
|
||||
end
|
||||
else
|
||||
if self.dbGeneric then
|
||||
local queryObj = mysql:Select("ix_characters_data")
|
||||
queryObj:Where("id", self.dbGeneric)
|
||||
queryObj:Where("key", "purchasedItems")
|
||||
queryObj:Select("data")
|
||||
queryObj:Callback(function(result)
|
||||
if (!istable(result) or !result[1]) then return end
|
||||
if !result[1].data then return end
|
||||
local items = util.JSONToTable(result[1].data)
|
||||
|
||||
if !items[item] then return end
|
||||
|
||||
if !istable(items[item]) then
|
||||
if items[item] > 0 then
|
||||
items[item] = items[item] - 1
|
||||
|
||||
if items[item] == 0 then
|
||||
items[item] = nil
|
||||
end
|
||||
else
|
||||
return
|
||||
end
|
||||
else
|
||||
if items[item] then items[item] = nil end
|
||||
end
|
||||
|
||||
if self:ItemChoiceLogic(item, inventory, cid, items) then
|
||||
local updateQuery = mysql:Update("ix_characters_data")
|
||||
updateQuery:Update("data", util.TableToJSON(items))
|
||||
updateQuery:Where("id", self.dbGeneric)
|
||||
updateQuery:Where("key", "purchasedItems")
|
||||
updateQuery:Execute()
|
||||
ix.log.Add(client, "pickupDispenserGotItem")
|
||||
end
|
||||
end)
|
||||
|
||||
queryObj:Execute()
|
||||
end
|
||||
end
|
||||
|
||||
self:EmitSound("buttons/button1.wav")
|
||||
self:SetDisplay(3)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:OpenCIDSelector(client)
|
||||
netstream.Start(client, "OpenCIDSelector", self)
|
||||
end
|
||||
|
||||
function ENT:CreateCombineAlert(client, message)
|
||||
ix.combineNotify:AddImportantNotification(message, nil, client, self:GetPos())
|
||||
end
|
||||
|
||||
function ENT.OpenDispenserFail(idCard, client, activeDispenser)
|
||||
if (!IsValid(activeDispenser)) then return end
|
||||
|
||||
activeDispenser:SetDisplay(4)
|
||||
activeDispenser:EmitSound("ambient/machines/combine_terminal_idle1.wav")
|
||||
activeDispenser.charLoaded = nil
|
||||
activeDispenser.dbGeneric = nil
|
||||
activeDispenser.activeCID = nil
|
||||
|
||||
timer.Simple(2, function()
|
||||
if IsValid(activeDispenser) then
|
||||
activeDispenser:SetDisplay(1)
|
||||
activeDispenser.canUse = true
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:CheckForVerdicts(client, idCard, genericData)
|
||||
if (idCard:GetData("active", false) == false) then
|
||||
self:CreateCombineAlert(client, "WRN:// Inactive Identification Card #" .. idCard:GetData("cid", 00000) .. " usage attempt detected")
|
||||
|
||||
self:SetDisplay(9)
|
||||
timer.Simple(1.5, function()
|
||||
if self then
|
||||
self.OpenDispenserFail(nil, client, self)
|
||||
end
|
||||
end)
|
||||
return
|
||||
end
|
||||
|
||||
local isBOL = genericData.bol
|
||||
local isAC = genericData.anticitizen
|
||||
if (isBOL or isAC) then
|
||||
local text = isBOL and "BOL Suspect" or "Anti-Citizen"
|
||||
self:CreateCombineAlert(client, "WRN:// " .. text .. " Identification Card activity detected")
|
||||
|
||||
if isAC then
|
||||
self:SetDisplay(9)
|
||||
timer.Simple(1.5, function()
|
||||
if self then
|
||||
self.OpenDispenserFail(nil, client, self)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
return !isAC -- stop if isAC, continue for isBOL
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT.OpenDispenser(idCard, genericData, client, activeTerminal)
|
||||
if (!IsValid(activeTerminal)) then return end
|
||||
|
||||
activeTerminal:EmitSound("buttons/button4.wav")
|
||||
|
||||
activeTerminal:SetDisplay(2)
|
||||
if (activeTerminal:CheckForVerdicts(client, idCard, genericData)) then
|
||||
timer.Simple(2, function()
|
||||
if table.IsEmpty(genericData) then
|
||||
activeTerminal:SetDisplay(9)
|
||||
activeTerminal:EmitSound("buttons/button2.wav")
|
||||
timer.Simple(2, function()
|
||||
if IsValid(activeTerminal) then
|
||||
activeTerminal.charLoaded = nil
|
||||
activeTerminal.dbGeneric = nil
|
||||
activeTerminal.activeCID = nil
|
||||
activeTerminal:SetDisplay(1)
|
||||
activeTerminal.canUse = true
|
||||
end
|
||||
end)
|
||||
else
|
||||
activeTerminal:OnSuccess(idCard, genericData, client)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnSuccess(idCard, genericData, client)
|
||||
self:SetDisplay(7)
|
||||
self:EmitSound("ambient/machines/combine_terminal_idle3.wav")
|
||||
self.activeCID = idCard
|
||||
|
||||
if ix.char.loaded[genericData.id] then
|
||||
self.charLoaded = genericData.id
|
||||
netstream.Start(client, "OpenPickupDispenser", ix.char.loaded[genericData.id]:GetPurchasedItems(), self)
|
||||
return
|
||||
end
|
||||
|
||||
local queryObj = mysql:Select("ix_characters_data")
|
||||
queryObj:Where("id", genericData.id)
|
||||
queryObj:Where("key", "purchasedItems")
|
||||
queryObj:Select("data")
|
||||
queryObj:Callback(function(result)
|
||||
if (!istable(result) or !result[1]) then return end
|
||||
if !result[1].data then return end
|
||||
|
||||
netstream.Start(client, "OpenPickupDispenser", util.JSONToTable(result[1].data), self)
|
||||
self.dbGeneric = genericData.id
|
||||
end)
|
||||
|
||||
queryObj:Execute()
|
||||
end
|
||||
|
||||
function ENT:CheckForCID(client)
|
||||
local idCards = self.activeCharacter:GetInventory():GetItemsByUniqueID("id_card")
|
||||
|
||||
if (#idCards > 1) then
|
||||
self:OpenCIDSelector(client)
|
||||
return
|
||||
end
|
||||
|
||||
if (#idCards == 1) then
|
||||
idCards[1]:LoadOwnerGenericData(self.OpenDispenser, self.OpenDispenserFail, client, self)
|
||||
else
|
||||
self.canUse = false
|
||||
self:EmitSound("buttons/button2.wav")
|
||||
timer.Simple(1, function()
|
||||
if (IsValid(self)) then
|
||||
self.canUse = true
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:CheckGlobalUse(client)
|
||||
if client.CantPlace then
|
||||
client:NotifyLocalized("You need to wait before you can use this!")
|
||||
return false
|
||||
end
|
||||
|
||||
client.CantPlace = true
|
||||
|
||||
timer.Simple(3, function()
|
||||
if client then
|
||||
client.CantPlace = false
|
||||
end
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:CheckLocalUse(client)
|
||||
if (!self.canUse and IsValid(self.activePlayer) and self.activePlayer:GetCharacter() == self.activeCharacter) then
|
||||
return false
|
||||
else
|
||||
self.canUse = false
|
||||
self.activePlayer = client
|
||||
self.activeCharacter = client:GetCharacter()
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:StartTouch(entity)
|
||||
if (entity:GetClass() != "ix_item") then return end
|
||||
if !self.canUse then return end
|
||||
|
||||
self.canUse = false
|
||||
|
||||
local itemID = entity:GetItemID()
|
||||
if ix.city:IsDisallowment(itemID) then
|
||||
self:SetDisplay(11)
|
||||
self:EmitSound("ambient/machines/combine_terminal_idle1.wav")
|
||||
|
||||
timer.Simple(2, function()
|
||||
if IsValid(self) then
|
||||
self:SetDisplay(1)
|
||||
self.canUse = true
|
||||
end
|
||||
end)
|
||||
else
|
||||
ix.city.main:AddItem(itemID, entity:GetData("stack", 1))
|
||||
entity:Remove()
|
||||
|
||||
self:SetDisplay(10)
|
||||
self:EmitSound("ambient/machines/combine_terminal_idle1.wav")
|
||||
|
||||
timer.Simple(2, function()
|
||||
if IsValid(self) then
|
||||
self:SetDisplay(1)
|
||||
self.canUse = true
|
||||
end
|
||||
end)
|
||||
|
||||
self:EmitSound("physics/metal/weapon_impact_soft" .. math.random(1, 3) .. ".wav")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnUse(client)
|
||||
self:CheckForCID(client)
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
if !self:CheckGlobalUse(client) then
|
||||
return false
|
||||
end
|
||||
|
||||
if !self:CheckLocalUse(client) then
|
||||
return false
|
||||
end
|
||||
|
||||
self:OnUse(client)
|
||||
end
|
||||
@@ -0,0 +1,45 @@
|
||||
--[[
|
||||
| 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
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Terminal Odbiorczy"
|
||||
ENT.Author = "Fruity"
|
||||
ENT.Contact = "Willard Networks"
|
||||
ENT.Purpose = "Pickup items bought with certain skills."
|
||||
ENT.Instructions = "Press E"
|
||||
ENT.Category = "HL2 RP"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
ENT.canMalfunction = true
|
||||
|
||||
ENT.Displays = {
|
||||
[1] = {"WŁÓŻ CID", Color( 255, 255, 180 ), true},
|
||||
[2] = {"SKAN CID", Color(255, 200, 0)},
|
||||
[3] = {"WYDAWANIE", Color(0, 255, 0)},
|
||||
[4] = {"ODŚWIEŻANIE", Color(255, 200, 0)},
|
||||
[5] = {"OFFLINE", Color(255, 0, 0), true},
|
||||
[6] = {"WŁÓŻ CID", Color( 255, 255, 180 )},
|
||||
[7] = {"WYDAWANIE", Color(0, 255, 0)},
|
||||
[8] = {"BRAK ZAKUPÓW", Color(0, 255, 0)},
|
||||
[9] = {"BŁĘDNY CID", Color(255, 0, 0)},
|
||||
[10] = {"DODANO PRZEDMIOT", Color(0, 255, 0)},
|
||||
[11] = {"ODRZUCONO PRZEDMIOT", Color(255, 0, 0), true},
|
||||
}
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Int", 0, "Display")
|
||||
end
|
||||
@@ -0,0 +1,564 @@
|
||||
--[[
|
||||
| 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
|
||||
|
||||
if (SERVER) then
|
||||
AddCSLuaFile("shared.lua")
|
||||
end
|
||||
|
||||
SWEP.PrintName = "CIVIL ADMINISTRATION PDA"
|
||||
SWEP.Category = "Half-Life 2"
|
||||
SWEP.Spawnable= true
|
||||
SWEP.AdminSpawnable= true
|
||||
SWEP.AdminOnly = false
|
||||
|
||||
SWEP.ViewModelFOV = 70
|
||||
SWEP.ViewModel = "models/weapons/c_slam.mdl"
|
||||
SWEP.WorldModel = "models/weapons/c_slam.mdl"
|
||||
SWEP.ShowViewModel = false
|
||||
SWEP.ShowWorldModel = false
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.BobScale = 1
|
||||
SWEP.SwayScale = 0
|
||||
|
||||
SWEP.AutoSwitchTo = false
|
||||
SWEP.AutoSwitchFrom = false
|
||||
SWEP.Weight = 0
|
||||
SWEP.Slot = 0
|
||||
SWEP.SlotPos = 1
|
||||
|
||||
SWEP.UseHands = true
|
||||
SWEP.FireWhenLowered = true
|
||||
SWEP.FiresUnderwater = true
|
||||
SWEP.DrawAmmo = false
|
||||
SWEP.CSMuzzleFlashes = 1
|
||||
SWEP.Base = "weapon_base"
|
||||
SWEP.IsAlwaysRaised = true
|
||||
SWEP.HoldType = "knife"
|
||||
|
||||
SWEP.Primary.ClipSize = -1
|
||||
SWEP.Primary.DefaultClip = -1
|
||||
SWEP.Primary.Automatic = false
|
||||
SWEP.Primary.Ammo = ""
|
||||
SWEP.Primary.Damage = 5
|
||||
SWEP.Primary.Delay = 0.75
|
||||
|
||||
SWEP.Secondary.ClipSize = -1
|
||||
SWEP.Secondary.DefaultClip = 0
|
||||
SWEP.Secondary.Automatic = false
|
||||
SWEP.Secondary.Ammo = ""
|
||||
SWEP.Secondary.Delay = 0.5
|
||||
|
||||
SWEP.MaxOffFlat = 80 -- Maximum degrees off of flat to be.
|
||||
|
||||
SWEP.LastFire = 0
|
||||
|
||||
SWEP.IronSightsPos = Vector(0, 0, 0)
|
||||
SWEP.IronSightsAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_UpperArm"] = { scale = Vector(1, 1, 1), pos = Vector(-1, 1, 0), angle = Angle(5, 10, 5) },
|
||||
["ValveBiped.Bip01_L_UpperArm"] = { scale = Vector(1, 1, 1), pos = Vector(-3.5,-1.8, 0.8), angle = Angle(12, -5, 0) },
|
||||
["Slam_base"] = { scale = Vector(0.001, 0.001, 0.001), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) },
|
||||
["Detonator"] = { scale = Vector(0.001, 0.001, 0.001), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) }
|
||||
}
|
||||
|
||||
SWEP.VElements = {
|
||||
["v_element"] = { type = "Model", model = "models/fruity/pda.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(4.68, 2.7514, -1.198), angle = Angle(-90, -50.392, 90), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
|
||||
}
|
||||
|
||||
SWEP.WElements = {
|
||||
["w_element"] = { type = "Model", model = "models/fruity/pda.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(5, 1.111, 0), angle = Angle(-90, -50.392, 90), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
|
||||
}
|
||||
|
||||
function SWEP:Initialize()
|
||||
self:SetWeaponHoldType( self.HoldType )
|
||||
|
||||
if CLIENT then
|
||||
// Create a new table for every weapon instance
|
||||
self.VElements = table.FullCopy( self.VElements )
|
||||
self.WElements = table.FullCopy( self.WElements )
|
||||
self.ViewModelBoneMods = table.FullCopy( self.ViewModelBoneMods )
|
||||
self:SetWeaponHoldType( self.HoldType )
|
||||
|
||||
self:CreateModels(self.VElements) // create viewmodels
|
||||
self:CreateModels(self.WElements) // create worldmodels
|
||||
|
||||
// init view model bone build function
|
||||
if IsValid(self.Owner) then
|
||||
local vm = self.Owner:GetViewModel()
|
||||
if IsValid(vm) then
|
||||
self:ResetBonePositions(vm)
|
||||
|
||||
// Init viewmodel visibility
|
||||
if (self.ShowViewModel == nil or self.ShowViewModel) then
|
||||
vm:SetColor(Color(255,255,255,255))
|
||||
else
|
||||
// we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
|
||||
vm:SetColor(Color(255,255,255,1))
|
||||
// ^ stopped working in GMod 13 because you have to do Entity:SetRenderMode(1) for translucency to kick in
|
||||
// however for some reason the view model resets to render mode 0 every frame so we just apply a debug material to prevent it from drawing
|
||||
vm:SetMaterial("Debug/hsv")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
if CLIENT then
|
||||
|
||||
SWEP.vRenderOrder = nil
|
||||
function SWEP:ViewModelDrawn()
|
||||
|
||||
local vm = self.Owner:GetViewModel()
|
||||
if !IsValid(vm) then return end
|
||||
|
||||
if (!self.VElements) then return end
|
||||
|
||||
self:UpdateBonePositions(vm)
|
||||
|
||||
if (!self.vRenderOrder) then
|
||||
|
||||
// we build a render order because sprites need to be drawn after models
|
||||
self.vRenderOrder = {}
|
||||
|
||||
for k, v in pairs( self.VElements ) do
|
||||
if (v.type == "Model") then
|
||||
table.insert(self.vRenderOrder, 1, k)
|
||||
elseif (v.type == "Sprite" or v.type == "Quad") then
|
||||
table.insert(self.vRenderOrder, k)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
for k, name in ipairs( self.vRenderOrder ) do
|
||||
|
||||
local v = self.VElements[name]
|
||||
if (!v) then self.vRenderOrder = nil break end
|
||||
if (v.hide) then continue end
|
||||
|
||||
local model = v.modelEnt
|
||||
local sprite = v.spriteMaterial
|
||||
|
||||
if (!v.bone) then continue end
|
||||
|
||||
local pos, ang = self:GetBoneOrientation( self.VElements, v, vm )
|
||||
|
||||
if (!pos) then continue end
|
||||
|
||||
if (v.type == "Model" and IsValid(model)) then
|
||||
|
||||
model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
|
||||
ang:RotateAroundAxis(ang:Up(), v.angle.y)
|
||||
ang:RotateAroundAxis(ang:Right(), v.angle.p)
|
||||
ang:RotateAroundAxis(ang:Forward(), v.angle.r)
|
||||
|
||||
model:SetAngles(ang)
|
||||
//model:SetModelScale(v.size)
|
||||
local matrix = Matrix()
|
||||
matrix:Scale(v.size)
|
||||
model:EnableMatrix( "RenderMultiply", matrix )
|
||||
|
||||
if (v.material == "") then
|
||||
model:SetMaterial("")
|
||||
elseif (model:GetMaterial() != v.material) then
|
||||
model:SetMaterial( v.material )
|
||||
end
|
||||
|
||||
model:SetSkin(0)
|
||||
|
||||
if (v.bodygroup) then
|
||||
for k, v in pairs( v.bodygroup ) do
|
||||
if (model:GetBodygroup(k) != v) then
|
||||
model:SetBodygroup(k, v)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (v.surpresslightning) then
|
||||
render.SuppressEngineLighting(true)
|
||||
end
|
||||
|
||||
render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
|
||||
render.SetBlend(v.color.a/255)
|
||||
model:DrawModel()
|
||||
render.SetBlend(1)
|
||||
render.SetColorModulation(1, 1, 1)
|
||||
|
||||
if (v.surpresslightning) then
|
||||
render.SuppressEngineLighting(false)
|
||||
end
|
||||
|
||||
elseif (v.type == "Sprite" and sprite) then
|
||||
|
||||
local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
|
||||
render.SetMaterial(sprite)
|
||||
render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
|
||||
|
||||
elseif (v.type == "Quad" and v.draw_func) then
|
||||
|
||||
local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
|
||||
ang:RotateAroundAxis(ang:Up(), v.angle.y)
|
||||
ang:RotateAroundAxis(ang:Right(), v.angle.p)
|
||||
ang:RotateAroundAxis(ang:Forward(), v.angle.r)
|
||||
|
||||
cam.Start3D2D(drawpos, ang, v.size)
|
||||
v.draw_func( self )
|
||||
cam.End3D2D()
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
SWEP.wRenderOrder = nil
|
||||
function SWEP:DrawWorldModel()
|
||||
|
||||
if (self.ShowWorldModel == nil or self.ShowWorldModel) then
|
||||
end
|
||||
|
||||
if (!self.WElements) then return end
|
||||
|
||||
if (!self.wRenderOrder) then
|
||||
|
||||
self.wRenderOrder = {}
|
||||
|
||||
for k, v in pairs( self.WElements ) do
|
||||
if (v.type == "Model") then
|
||||
table.insert(self.wRenderOrder, 1, k)
|
||||
elseif (v.type == "Sprite" or v.type == "Quad") then
|
||||
table.insert(self.wRenderOrder, k)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if (IsValid(self.Owner)) then
|
||||
bone_ent = self.Owner
|
||||
else
|
||||
// when the weapon is dropped
|
||||
bone_ent = self
|
||||
end
|
||||
|
||||
for k, name in pairs( self.wRenderOrder ) do
|
||||
|
||||
local v = self.WElements[name]
|
||||
if (!v) then self.wRenderOrder = nil break end
|
||||
if (v.hide) then continue end
|
||||
|
||||
local pos, ang
|
||||
|
||||
if (v.bone) then
|
||||
pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent )
|
||||
else
|
||||
pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent, "ValveBiped.Bip01_R_Hand" )
|
||||
end
|
||||
|
||||
if (!pos) then continue end
|
||||
|
||||
local model = v.modelEnt
|
||||
local sprite = v.spriteMaterial
|
||||
|
||||
if (v.type == "Model" and IsValid(model)) then
|
||||
|
||||
model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
|
||||
ang:RotateAroundAxis(ang:Up(), v.angle.y)
|
||||
ang:RotateAroundAxis(ang:Right(), v.angle.p)
|
||||
ang:RotateAroundAxis(ang:Forward(), v.angle.r)
|
||||
|
||||
model:SetAngles(ang)
|
||||
//model:SetModelScale(v.size)
|
||||
local matrix = Matrix()
|
||||
matrix:Scale(v.size)
|
||||
model:EnableMatrix( "RenderMultiply", matrix )
|
||||
|
||||
if (v.material == "") then
|
||||
model:SetMaterial("")
|
||||
elseif (model:GetMaterial() != v.material) then
|
||||
model:SetMaterial( v.material )
|
||||
end
|
||||
|
||||
model:SetSkin(0)
|
||||
|
||||
if (v.bodygroup) then
|
||||
for k, v in pairs( v.bodygroup ) do
|
||||
if (model:GetBodygroup(k) != v) then
|
||||
model:SetBodygroup(k, v)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (v.surpresslightning) then
|
||||
render.SuppressEngineLighting(true)
|
||||
end
|
||||
|
||||
render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
|
||||
render.SetBlend(v.color.a/255)
|
||||
model:DrawModel()
|
||||
render.SetBlend(1)
|
||||
render.SetColorModulation(1, 1, 1)
|
||||
|
||||
if (v.surpresslightning) then
|
||||
render.SuppressEngineLighting(false)
|
||||
end
|
||||
|
||||
elseif (v.type == "Sprite" and sprite) then
|
||||
|
||||
local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
|
||||
render.SetMaterial(sprite)
|
||||
render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
|
||||
|
||||
elseif (v.type == "Quad" and v.draw_func) then
|
||||
|
||||
local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
|
||||
ang:RotateAroundAxis(ang:Up(), v.angle.y)
|
||||
ang:RotateAroundAxis(ang:Right(), v.angle.p)
|
||||
ang:RotateAroundAxis(ang:Forward(), v.angle.r)
|
||||
|
||||
cam.Start3D2D(drawpos, ang, v.size)
|
||||
v.draw_func( self )
|
||||
cam.End3D2D()
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function SWEP:GetBoneOrientation( basetab, tab, ent, bone_override )
|
||||
|
||||
local bone, pos, ang
|
||||
if (tab.rel and tab.rel != "") then
|
||||
|
||||
local v = basetab[tab.rel]
|
||||
|
||||
if (!v) then return end
|
||||
|
||||
|
||||
pos, ang = self:GetBoneOrientation( basetab, v, ent )
|
||||
|
||||
if (!pos) then return end
|
||||
|
||||
pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
|
||||
ang:RotateAroundAxis(ang:Up(), v.angle.y)
|
||||
ang:RotateAroundAxis(ang:Right(), v.angle.p)
|
||||
ang:RotateAroundAxis(ang:Forward(), v.angle.r)
|
||||
|
||||
else
|
||||
|
||||
bone = ent:LookupBone(bone_override or tab.bone)
|
||||
|
||||
if (!bone) then return end
|
||||
|
||||
pos, ang = Vector(0,0,0), Angle(0,0,0)
|
||||
local m = ent:GetBoneMatrix(bone)
|
||||
if (m) then
|
||||
pos, ang = m:GetTranslation(), m:GetAngles()
|
||||
end
|
||||
|
||||
if (IsValid(self.Owner) and self.Owner:IsPlayer() and
|
||||
ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
|
||||
ang.r = -ang.r // Fixes mirrored models
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return pos, ang
|
||||
end
|
||||
|
||||
function SWEP:CreateModels( tab )
|
||||
|
||||
if (!tab) then return end
|
||||
|
||||
for k, v in pairs( tab ) do
|
||||
if (v.type == "Model" and v.model and v.model != "" and (!IsValid(v.modelEnt) or v.createdModel != v.model) and
|
||||
string.find(v.model, ".mdl") and file.Exists (v.model, "GAME") ) then
|
||||
|
||||
v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
|
||||
if (IsValid(v.modelEnt)) then
|
||||
v.modelEnt:SetPos(self:GetPos())
|
||||
v.modelEnt:SetAngles(self:GetAngles())
|
||||
v.modelEnt:SetParent(self)
|
||||
v.modelEnt:SetNoDraw(true)
|
||||
v.createdModel = v.model
|
||||
else
|
||||
v.modelEnt = nil
|
||||
end
|
||||
|
||||
elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
|
||||
and file.Exists ("materials/"..v.sprite..".vmt", "GAME")) then
|
||||
|
||||
local name = v.sprite.."-"
|
||||
local params = { ["$basetexture"] = v.sprite }
|
||||
// make sure we create a unique name based on the selected options
|
||||
local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
|
||||
for i, j in pairs( tocheck ) do
|
||||
if (v[j]) then
|
||||
params["$"..j] = 1
|
||||
name = name.."1"
|
||||
else
|
||||
name = name.."0"
|
||||
end
|
||||
end
|
||||
|
||||
v.createdSprite = v.sprite
|
||||
v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local allbones
|
||||
local hasGarryFixedBoneScalingYet = false
|
||||
|
||||
function SWEP:UpdateBonePositions(vm)
|
||||
|
||||
if self.ViewModelBoneMods then
|
||||
|
||||
if (!vm:GetBoneCount()) then return end
|
||||
|
||||
// !! WORKAROUND !! //
|
||||
// We need to check all model names :/
|
||||
local loopthrough = self.ViewModelBoneMods
|
||||
if (!hasGarryFixedBoneScalingYet) then
|
||||
allbones = {}
|
||||
for i=0, vm:GetBoneCount() do
|
||||
local bonename = vm:GetBoneName(i)
|
||||
if (self.ViewModelBoneMods[bonename]) then
|
||||
allbones[bonename] = self.ViewModelBoneMods[bonename]
|
||||
else
|
||||
allbones[bonename] = {
|
||||
scale = Vector(1,1,1),
|
||||
pos = Vector(0,0,0),
|
||||
angle = Angle(0,0,0)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
loopthrough = allbones
|
||||
end
|
||||
// !! ----------- !! //
|
||||
|
||||
for k, v in pairs( loopthrough ) do
|
||||
local bone = vm:LookupBone(k)
|
||||
if (!bone) then continue end
|
||||
|
||||
// !! WORKAROUND !! //
|
||||
local s = Vector(v.scale.x,v.scale.y,v.scale.z)
|
||||
local p = Vector(v.pos.x,v.pos.y,v.pos.z)
|
||||
local ms = Vector(1,1,1)
|
||||
if (!hasGarryFixedBoneScalingYet) then
|
||||
local cur = vm:GetBoneParent(bone)
|
||||
while(cur >= 0) do
|
||||
local pscale = loopthrough[vm:GetBoneName(cur)].scale
|
||||
ms = ms * pscale
|
||||
cur = vm:GetBoneParent(cur)
|
||||
end
|
||||
end
|
||||
|
||||
s = s * ms
|
||||
// !! ----------- !! //
|
||||
|
||||
if vm:GetManipulateBoneScale(bone) != s then
|
||||
vm:ManipulateBoneScale( bone, s )
|
||||
end
|
||||
if vm:GetManipulateBoneAngles(bone) != v.angle then
|
||||
vm:ManipulateBoneAngles( bone, v.angle )
|
||||
end
|
||||
if vm:GetManipulateBonePosition(bone) != p then
|
||||
vm:ManipulateBonePosition( bone, p )
|
||||
end
|
||||
end
|
||||
else
|
||||
self:ResetBonePositions(vm)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function SWEP:ResetBonePositions(vm)
|
||||
|
||||
if (!vm:GetBoneCount()) then return end
|
||||
for i=0, vm:GetBoneCount() do
|
||||
vm:ManipulateBoneScale( i, Vector(1, 1, 1) )
|
||||
vm:ManipulateBoneAngles( i, Angle(0, 0, 0) )
|
||||
vm:ManipulateBonePosition( i, Vector(0, 0, 0) )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
function table.FullCopy( tab )
|
||||
|
||||
if (!tab) then return nil end
|
||||
|
||||
local res = {}
|
||||
for k, v in pairs( tab ) do
|
||||
if (type(v) == "table") then
|
||||
res[k] = table.FullCopy(v)
|
||||
elseif (type(v) == "Vector") then
|
||||
res[k] = Vector(v.x, v.y, v.z)
|
||||
elseif (type(v) == "Angle") then
|
||||
res[k] = Angle(v.p, v.y, v.r)
|
||||
else
|
||||
res[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
return res
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
function SWEP:Deploy()
|
||||
--if !IsValid(self.Owner.C4s) then self.Owner.C4s = {} end
|
||||
self.Weapon:SendWeaponAnim(ACT_SLAM_TRIPMINE_DRAW)
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack()
|
||||
self:EmitSound( "UI/buttonclick.wav" )
|
||||
self:SetNextPrimaryFire( CurTime()+2 )
|
||||
if CLIENT and IsFirstTimePredicted() then
|
||||
if self.Owner:GetCharacter() then
|
||||
if self.Owner:GetCharacter():GetFaction() == FACTION_ADMIN then
|
||||
if IsValid(self.Owner) then
|
||||
netstream.Start("GetMessageList")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
end
|
||||
|
||||
function SWEP:Holster()
|
||||
|
||||
if CLIENT and IsValid(self.Owner) then
|
||||
local vm = self.Owner:GetViewModel()
|
||||
if IsValid(vm) then
|
||||
self:ResetBonePositions(vm)
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function SWEP:OnRemove()
|
||||
self:Holster()
|
||||
end
|
||||
@@ -0,0 +1,253 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
SWEP.PrintName = "Workbench Placer"
|
||||
SWEP.Author = "JohnyReaper/Fruity"
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Category = "HL2 RP"
|
||||
|
||||
SWEP.Slot = 0
|
||||
SWEP.SlotPos = 1
|
||||
|
||||
SWEP.ViewModel = Model("")
|
||||
SWEP.WorldModel = Model("")
|
||||
SWEP.ViewModelFOV = 70
|
||||
SWEP.UseHands = false
|
||||
SWEP.HoldType = "normal"
|
||||
|
||||
SWEP.Ent = "ix_item"
|
||||
SWEP.BarricadePlace = nil
|
||||
SWEP.item = false
|
||||
|
||||
SWEP.PreviewModel = false
|
||||
|
||||
SWEP.Spawnable = true
|
||||
|
||||
SWEP.Primary.ClipSize = -1
|
||||
SWEP.Primary.DefaultClip = -1
|
||||
SWEP.Primary.Automatic = false
|
||||
SWEP.Primary.Ammo = "none"
|
||||
|
||||
SWEP.Secondary.ClipSize = -1
|
||||
SWEP.Secondary.DefaultClip = -1
|
||||
SWEP.Secondary.Automatic = false
|
||||
SWEP.Secondary.Ammo = "none"
|
||||
|
||||
SWEP.DrawAmmo = false
|
||||
|
||||
SWEP.IsAlwaysLowered = true
|
||||
SWEP.FireWhenLowered = true
|
||||
|
||||
function SWEP:Initialize()
|
||||
self:SetWeaponHoldType(self.HoldType)
|
||||
if CLIENT then
|
||||
self:GhostProp()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Deploy()
|
||||
if CLIENT then
|
||||
self:GhostProp()
|
||||
end
|
||||
end
|
||||
|
||||
if (CLIENT) then
|
||||
SWEP.nextModelRequest = CurTime()
|
||||
|
||||
net.Receive("ixRequestWorkBenchGhostModel", function()
|
||||
local model = net.ReadString()
|
||||
|
||||
if LocalPlayer().ghostProp and IsValid(LocalPlayer().ghostProp) then
|
||||
LocalPlayer().ghostProp:SetModel(model)
|
||||
end
|
||||
end)
|
||||
else
|
||||
util.AddNetworkString("ixRequestWorkBenchGhostModel")
|
||||
|
||||
net.Receive("ixRequestWorkBenchGhostModel", function(_, client)
|
||||
local weapon = client:GetActiveWeapon()
|
||||
if IsValid(weapon) and weapon.GetClass and weapon:GetClass() == "weapon_workbench_placer" then
|
||||
net.Start("ixRequestWorkBenchGhostModel")
|
||||
net.WriteString(weapon.PreviewModel)
|
||||
net.Send(client)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function SWEP:GhostProp()
|
||||
if (IsValid(self.ghostProp)) then self.ghostProp:Remove() end
|
||||
self.ghostProp = ents.CreateClientProp()
|
||||
|
||||
local curTime = CurTime()
|
||||
if !self.PreviewModel and self.nextModelRequest <= curTime then
|
||||
LocalPlayer().ghostProp = self.ghostProp
|
||||
|
||||
net.Start("ixRequestWorkBenchGhostModel")
|
||||
net.SendToServer()
|
||||
|
||||
self.nextModelRequest = curTime + 2
|
||||
return
|
||||
end
|
||||
|
||||
-- self.ghostProp:SetMaterial("models/wireframe")
|
||||
self.ghostProp:Spawn()
|
||||
self.ghostProp:Activate()
|
||||
self.ghostProp:SetParent(self.Owner)
|
||||
self.ghostProp:SetRenderMode(RENDERMODE_TRANSALPHA)
|
||||
end
|
||||
|
||||
function SWEP:CalcViewModelView(vm, oldPos, oldAng, pos, ang)
|
||||
local newPos = pos + ang:Up() * 5 + ang:Forward()
|
||||
return newPos, ang
|
||||
end
|
||||
|
||||
function SWEP:SetInfo(uniqueID, model)
|
||||
self.item = uniqueID
|
||||
self.PreviewModel = model
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack()
|
||||
local tr = self.Owner:GetEyeTrace()
|
||||
if (game.SinglePlayer()) then self:CallOnClient("PrimaryAttack") end
|
||||
|
||||
if (SERVER) then
|
||||
self.Owner:SetAnimation(PLAYER_ATTACK1)
|
||||
end
|
||||
|
||||
if (tr.HitWorld) then
|
||||
if (!self.BarricadePlace) then
|
||||
self.BarricadePlace = self.Owner:GetPos() + Angle(0, self.Owner:GetAngles().y, 0):Forward() * 50 + Angle(0, self.Owner:GetAngles().y, 0):Right() * -10 + Angle(0, self.Owner:GetAngles().y, 0):Up()
|
||||
self.testowyang = Angle(0, self.Owner:GetAngles().y + 180, 0):SnapTo("y", 1)
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
if (self.BarricadePlace) then
|
||||
local angles = self.testowyang
|
||||
angles.p = 0
|
||||
angles.r = 0
|
||||
angles:RotateAroundAxis(angles:Up(), 360)
|
||||
|
||||
if (self.item) then
|
||||
local client = self:GetOwner()
|
||||
local char = client.GetCharacter and client:GetCharacter()
|
||||
local id = char and char.GetID and char:GetID()
|
||||
local actualItem = char:GetInventory():HasItem(self.item)
|
||||
|
||||
if (actualItem) then
|
||||
actualItem:Remove()
|
||||
|
||||
local currentItems = client:GetNetVar("visibleItems", {})
|
||||
local itemName = ix.item.list[self.item].name
|
||||
|
||||
if (currentItems[itemName]) then
|
||||
currentItems[itemName] = nil
|
||||
end
|
||||
|
||||
client:SetNetVar("visibleItems", currentItems)
|
||||
|
||||
if (id) then
|
||||
ix.item.Spawn(self.item, self.BarricadePlace, function(_, entity)
|
||||
if IsValid(entity) then
|
||||
local physObj = entity:GetPhysicsObject()
|
||||
if IsValid(physObj) then
|
||||
physObj:EnableMotion( false )
|
||||
end
|
||||
end
|
||||
end, angles, {placer = id})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (self.Owner.previousWep) then
|
||||
self.Owner:SelectWeapon(self.Owner.previousWep)
|
||||
self.Owner.previousWep = nil
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
self.Owner:EmitSound("physics/metal/metal_canister_impact_soft"..math.random(1,3)..".wav", 60, 100, 0.5)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
if (SERVER) then
|
||||
local char = self.Owner:GetCharacter()
|
||||
local inventory = char:GetInventory()
|
||||
|
||||
if (self.Owner.previousWep) then
|
||||
self.Owner:SelectWeapon(self.Owner.previousWep)
|
||||
self.Owner.previousWep = nil
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
if (CLIENT) then
|
||||
function SWEP:DrawHUD()
|
||||
local ply = LocalPlayer()
|
||||
if (!ply:Alive()) then return end
|
||||
|
||||
draw.SimpleTextOutlined("Press LMB to place", "DermaLarge", ScrW() / 2, ScrH()-230, Color(250,250,250), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(25, 25, 25, 250))
|
||||
draw.SimpleTextOutlined("Press RMB to exit", "DermaLarge", ScrW() / 2, ScrH()-200, Color(250,250,250), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(25, 25, 25, 250))
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Think()
|
||||
if (CLIENT) then
|
||||
|
||||
if (IsValid(self.ghostProp)) then
|
||||
self.ghostProp:SetPos(self.Owner:GetPos() + Angle(0, self.Owner:GetAngles().y, 0):Forward() * 50 + Angle(0, self.Owner:GetAngles().y, 0):Right() * -10 + Angle(0, self.Owner:GetAngles().y, 0):Up() )
|
||||
self.ghostProp:SetAngles(Angle(0, self.Owner:GetAngles().y + 180, 0):SnapTo("y", 1))
|
||||
|
||||
else
|
||||
self:GhostProp()
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function SWEP:PreDrawViewModel()
|
||||
if (CLIENT) then
|
||||
if (!IsValid(self.ghostProp)) then
|
||||
self:GhostProp()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Holster()
|
||||
if (CLIENT) then
|
||||
if (IsValid(self.ghostProp)) then
|
||||
self.ghostProp:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function SWEP:OnDrop()
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function SWEP:OnRemove()
|
||||
if (CLIENT) then
|
||||
if (IsValid(self.ghostProp)) then
|
||||
self.ghostProp:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| 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.uniqueID = "tool_chembench_assembly"
|
||||
ITEM.name = "Zestaw do montażu stacji chemicznej"
|
||||
ITEM.description = "W środku tej drewnianej skrzyni znajduje się wiele części jak i instrukcja potrzebna do złożenia tego urządzenia."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_chembench"
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| 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.uniqueID = "tool_craftingbench_assembly"
|
||||
ITEM.name = "Zestaw do montażu stołu warsztatowego"
|
||||
ITEM.description = "W środku tej drewnianej skrzyni znajduje się wiele części jak i instrukcja potrzebna do złożenia tego urządzenia."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_craftingbench"
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| 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.uniqueID = "tool_distillery_assembly"
|
||||
ITEM.name = "Zestaw do montażu destylarni"
|
||||
ITEM.description = "W środku tej drewnianej skrzyni znajduje się wiele części jak i instrukcja potrzebna do złożenia tego urządzenia."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_distillery"
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
@@ -0,0 +1,22 @@
|
||||
--[[
|
||||
| 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.uniqueID = "tool_metalbench_assembly"
|
||||
ITEM.name = "Zestaw do montażu stołu warsztatowego do przetwarzania metalu."
|
||||
ITEM.description = "W środku tej drewnianej skrzyni znajduje się wiele części jak i instrukcja potrzebna do złożenia tego urządzenia."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_metalbench"
|
||||
ITEM.openRequirementAmount = 1
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| 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.uniqueID = "tool_oven_assembly"
|
||||
ITEM.name = "Zestaw do montażu kuchenki"
|
||||
ITEM.description = "W środku tej drewnianej skrzyni znajduje się wiele części jak i instrukcja potrzebna do złożenia tego urządzenia."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_oven"
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| 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.uniqueID = "tool_oven_rusty_assembly"
|
||||
ITEM.name = "Zestaw do montażu zardzewiałej kuchenki"
|
||||
ITEM.description = "W środku tej drewnianej skrzyni znajduje się wiele części jak i instrukcja potrzebna do złożenia tego urządzenia."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_oven_rusty"
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
@@ -0,0 +1,82 @@
|
||||
--[[
|
||||
| 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.uniqueID = "base_assembly"
|
||||
ITEM.name = "Base Assembly Kit"
|
||||
ITEM.description = "Alongside a set of instructions, this wooden package contains a high ordeal of different component pieces for Crafting apperatus."
|
||||
ITEM.category = "Tools"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.useSound = "physics/metal/metal_box_break1.wav"
|
||||
ITEM.openedItem = "tool_craftingbench"
|
||||
ITEM.openRequirement = "tool_toolkit"
|
||||
|
||||
ITEM.functions.Assemble = {
|
||||
icon = "icon16/wrench.png",
|
||||
OnCanRun = function(item)
|
||||
return !IsValid(item.entity)
|
||||
end,
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
|
||||
if (client.CantPlace) then
|
||||
client:NotifyLocalized("assembleCant")
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
client.CantPlace = true
|
||||
|
||||
timer.Simple(3, function()
|
||||
if (client) then
|
||||
client.CantPlace = false
|
||||
end
|
||||
end)
|
||||
|
||||
local character = client:GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
local requirementTable = ix.item.list[item.openRequirement]
|
||||
local requirementName = requirementTable.name or item.openRequirement
|
||||
local openerItem = inventory:HasItem(item.openRequirement)
|
||||
|
||||
if (!openerItem) then
|
||||
client:NotifyLocalized("assembleMissingRequirement", requirementName)
|
||||
|
||||
return false
|
||||
else
|
||||
if (item.openedItem) then
|
||||
local openedItemName = ix.item.list[item.openedItem].name or item.openedItem
|
||||
local openedItemWidth, openedItemHeight = ix.item.list[item.openedItem].width, ix.item.list[item.openedItem].height
|
||||
|
||||
timer.Simple(0.25, function()
|
||||
if (inventory:FindEmptySlot(openedItemWidth, openedItemHeight)) then
|
||||
inventory:Add(item.openedItem)
|
||||
|
||||
if (openerItem.isTool) then
|
||||
openerItem:DamageDurability(1)
|
||||
end
|
||||
|
||||
client:EmitSound(item.useSound)
|
||||
|
||||
client:NotifyLocalized("assembleSuccess", openedItemName)
|
||||
else
|
||||
client:NotifyLocalized("assembleNoSpace", openedItemWidth, openedItemHeight)
|
||||
|
||||
inventory:Add(item.uniqueID)
|
||||
end
|
||||
end)
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
--[[
|
||||
| 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 = "Crafting Components Base"
|
||||
ITEM.description = "Just for file structuring, not an item."
|
||||
ITEM.category = "Crafting Components"
|
||||
ITEM.base = "base_stackable"
|
||||
|
||||
ITEM.maxStackSize = 8
|
||||
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| 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 = "Dummy Base"
|
||||
ITEM.description = "Just for file structuring, not an item."
|
||||
ITEM.category = "Dummy"
|
||||
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| 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 = "Expedition Base"
|
||||
ITEM.description = "Just for file structuring, not an item."
|
||||
ITEM.category = "Expedition"
|
||||
@@ -0,0 +1,16 @@
|
||||
--[[
|
||||
| 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 = "Ingredient Base"
|
||||
ITEM.description = "Just for file structuring, not an item."
|
||||
ITEM.category = "Ingredients"
|
||||
ITEM.base = "base_stackable"
|
||||
|
||||
ITEM.maxStackSize = 8
|
||||
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| 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 = "Junk Base"
|
||||
ITEM.description = "Just for file structuring, not an item."
|
||||
ITEM.category = "Junk"
|
||||
227
gamemodes/ixhl2rp/plugins/willardskills/items/base/sh_liquor.lua
Normal file
227
gamemodes/ixhl2rp/plugins/willardskills/items/base/sh_liquor.lua
Normal file
@@ -0,0 +1,227 @@
|
||||
--[[
|
||||
| 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 = "Liquor Base"
|
||||
ITEM.model = Model("models/props_junk/garbage_takeoutcarton001a.mdl")
|
||||
ITEM.description = "A base for alcoholic consumables."
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.category = "Consumable"
|
||||
|
||||
ITEM.useSound = {"npc/barnacle/barnacle_crunch3.wav", "npc/barnacle/barnacle_crunch2.wav"}
|
||||
|
||||
ITEM.hunger = 0
|
||||
ITEM.thirst = 0
|
||||
ITEM.health = 0
|
||||
ITEM.damage = 0
|
||||
ITEM.strength = 25
|
||||
ITEM.abv = 10
|
||||
ITEM.colorAppendix = {}
|
||||
|
||||
ITEM.base = "base_stackable"
|
||||
ITEM.maxStackSize = 1
|
||||
|
||||
ITEM.boosts = {
|
||||
strength = 3,
|
||||
agility = -3,
|
||||
perception = -2,
|
||||
intelligence = 1
|
||||
}
|
||||
|
||||
ITEM.grade = "LOW" -- ix.inebriation.grades
|
||||
|
||||
function ITEM:GetBoostAppend()
|
||||
local boostAppend = {}
|
||||
if (self.boosts) then
|
||||
boostAppend[#boostAppend + 1] = "SHORT-TERM BOOSTS:\n"
|
||||
|
||||
if (self.boosts.strength) then
|
||||
boostAppend[#boostAppend + 1] = string.format("Strength: %d\n", self.boosts.strength)
|
||||
end
|
||||
if (self.boosts.agility) then
|
||||
boostAppend[#boostAppend + 1] = string.format("Agility: %d\n", self.boosts.agility)
|
||||
end
|
||||
if (self.boosts.intelligence) then
|
||||
boostAppend[#boostAppend + 1] = string.format("Intelligence: %d\n", self.boosts.intelligence)
|
||||
end
|
||||
if (self.boosts.perception) then
|
||||
boostAppend[#boostAppend + 1] = string.format("Perception: %d", self.boosts.perception)
|
||||
end
|
||||
end
|
||||
|
||||
return table.concat(boostAppend, "")
|
||||
end
|
||||
|
||||
function ITEM:GetColorAppendix()
|
||||
local tbl = {
|
||||
["yellow"] = self:GetBoostAppend(),
|
||||
["blue"] = "\nABV: "..tostring(self.abv or 0).."%%"
|
||||
}
|
||||
|
||||
if (self.shotsPerItem and self.shotsPoured) then
|
||||
tbl["red"] = "Glasses Left: "..tostring(self.shotsPerItem - self.shotsPoured)
|
||||
end
|
||||
|
||||
if (self.grade and ix.inebriation.grades[self.grade]) then
|
||||
local _grade = ix.inebriation.grades[self.grade]
|
||||
if (_grade and _grade.appendText) then
|
||||
tbl["green"] = "Grade: ".._grade.appendText
|
||||
end
|
||||
end
|
||||
|
||||
return tbl
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced()
|
||||
if (!self:GetData("stack")) then
|
||||
self:SetStack(self:GetStackSize())
|
||||
end
|
||||
end
|
||||
|
||||
local function consume(item, client, character)
|
||||
if (item.useSound) then
|
||||
if (istable(item.useSound)) then
|
||||
client:EmitSound(table.Random(item.useSound))
|
||||
else
|
||||
client:EmitSound(item.useSound)
|
||||
end
|
||||
end
|
||||
|
||||
if item.OnConsume then
|
||||
item:OnConsume(client, character)
|
||||
end
|
||||
if (item.thirst > 0) then
|
||||
character:SetThirst(math.Clamp(character:GetThirst() - (client:Team() == FACTION_BIRD and item.thirst * 2 or item.thirst), 0, 100))
|
||||
end
|
||||
|
||||
if (item.hunger > 0) then
|
||||
character:SetHunger(math.Clamp(character:GetHunger() - (client:Team() == FACTION_BIRD and item.hunger * 2 or item.hunger), 0, 100))
|
||||
end
|
||||
|
||||
if (item.health > 0) then
|
||||
client:SetHealth(math.Clamp(client:Health() + (client:Team() == FACTION_BIRD and item.health * 2 or item.health), 0, client:GetMaxHealth()))
|
||||
end
|
||||
|
||||
if (item.strength > 0) then
|
||||
if (ix.inebriation and ix.inebriation.allowedFactions[character:GetFaction()]) then
|
||||
character:SetInebriation(character:GetInebriation() + item.strength)
|
||||
client:SetNetVar("inebriation", character:GetInebriation())
|
||||
end
|
||||
end
|
||||
|
||||
if (item.grade) then
|
||||
local grade = ix.inebriation.grades[item.grade]
|
||||
if (grade.damage > 0) then
|
||||
client:SetHealth(math.Clamp(client:Health() - grade.damage, 0, client:GetMaxHealth()))
|
||||
end
|
||||
end
|
||||
|
||||
if (item.boosts) then
|
||||
for k, v in pairs(item.boosts) do
|
||||
character:SetSpecialBoost(k, v, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.Consume = {
|
||||
icon = "icon16/user.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local character = item.player:GetCharacter()
|
||||
|
||||
consume(item, client, character)
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.give = {
|
||||
name = "Use on character",
|
||||
tip = "giveTip",
|
||||
icon = "icon16/user_go.png",
|
||||
OnCanRun = function(item)
|
||||
if (item.entity) then return false end
|
||||
|
||||
local trace = item.player:GetEyeTraceNoCursor()
|
||||
local target = trace.Entity
|
||||
if (!IsValid(target)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (CLIENT and target:GetClass() == "prop_ragdoll") then
|
||||
return true
|
||||
end
|
||||
|
||||
if (target:GetClass() == "prop_ragdoll" and IsValid(target.ixPlayer)) then
|
||||
target = target.ixPlayer
|
||||
end
|
||||
|
||||
if (!target:IsPlayer() or !target:GetCharacter()) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (target:Health() >= target:GetMaxHealth()) then
|
||||
local targetChar = target:GetCharacter()
|
||||
if (targetChar:GetHealing("fakeHealth") == 0 and targetChar:GetBleedout() == -1) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end,
|
||||
OnRun = function(item)
|
||||
local trace = item.player:GetEyeTraceNoCursor()
|
||||
local target = trace.Entity
|
||||
if (target:GetClass() == "prop_ragdoll" and IsValid(target.ixPlayer)) then
|
||||
target = target.ixPlayer
|
||||
end
|
||||
|
||||
local targetChar = target:GetCharacter()
|
||||
|
||||
consume(item, target, targetChar)
|
||||
end,
|
||||
}
|
||||
|
||||
ITEM.functions.Pour = {
|
||||
OnCanRun = function(item)
|
||||
return item.shareable and ix.item.list[item.shotItem]
|
||||
end,
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local character = item.player:GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
|
||||
local itemName = ix.item.list[item.shotItem] and ix.item.list[item.shotItem].uniqueID or item.shotItem
|
||||
if (!itemName) then
|
||||
client:NotifyLocalized("Invalid item.")
|
||||
return
|
||||
end
|
||||
|
||||
local tr = client:GetEyeTrace()
|
||||
|
||||
ix.item.Spawn(itemName, tr.HitPos, function(_item, _)
|
||||
_item.grade = item.grade or "LOW"
|
||||
end)
|
||||
|
||||
client:NotifyLocalized("You have poured a glass of "..item.name..".")
|
||||
|
||||
item.shotsPoured = item.shotsPoured + 1
|
||||
if (item.shotsPoured >= item.shotsPerItem) then
|
||||
client:NotifyLocalized("You have poured the last glass of "..item.name..".")
|
||||
if (item.junk) then
|
||||
if (!inventory:Add(item.junk)) then
|
||||
ix.item.Spawn(item.junk, client)
|
||||
end
|
||||
end
|
||||
else
|
||||
-- don't remove the item if it's not the last shot
|
||||
return false
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
--[[
|
||||
| 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 = "Medical Components Base"
|
||||
ITEM.description = "Just for file structuring, not an item."
|
||||
ITEM.category = "Medical Components"
|
||||
ITEM.base = "base_stackable"
|
||||
|
||||
ITEM.maxStackSize = 4
|
||||
@@ -0,0 +1,187 @@
|
||||
--[[
|
||||
| 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 = "Workbench Base"
|
||||
ITEM.description = "It is a workbench. Can only be picked up by the first person to place it."
|
||||
ITEM.category = "Workbenches"
|
||||
ITEM.isWorkbench = true
|
||||
|
||||
ITEM.functions.place = {
|
||||
name = "Place",
|
||||
tip = "Place the workbench",
|
||||
icon = "icon16/brick_add.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
|
||||
if (!client:Alive()) then return false end
|
||||
client:EmitSound("physics/cardboard/cardboard_box_break3.wav")
|
||||
|
||||
client.previousWep = client:GetActiveWeapon():GetClass()
|
||||
client:Give("weapon_workbench_placer")
|
||||
client:SelectWeapon("weapon_workbench_placer")
|
||||
|
||||
local weapon = client:GetActiveWeapon()
|
||||
weapon:SetInfo(item.uniqueID, item.model)
|
||||
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(item)
|
||||
return (!IsValid(item.entity))
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.Use = {
|
||||
name = "Use",
|
||||
icon = "icon16/wrench.png",
|
||||
OnCanRun = function(itemTable)
|
||||
return IsValid(itemTable.entity)
|
||||
end,
|
||||
OnClick = function(itemTable)
|
||||
LocalPlayer().lastSelectedSkill = itemTable.workbenchSkill
|
||||
ix.gui.lastMenuTab = 3
|
||||
|
||||
if (!IsValid(ix.gui.menu)) then
|
||||
vgui.Create("ixMenu")
|
||||
end
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.PackUp = {
|
||||
name = "Pack Up",
|
||||
icon = "icon16/box.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local character = client and IsValid(client) and client.GetCharacter and client:GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
local toolkit = inventory:HasItem("tool_toolkit")
|
||||
|
||||
if (!toolkit) then
|
||||
client:Notify("You need a toolkit to pack up this workbench!")
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
if (item:GetData("bolted", false)) then
|
||||
client:Notify("This workbench is bolted down!")
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
local placerData = item:GetData("placer", false)
|
||||
if placerData and character:GetID() != placerData then
|
||||
client:Notify("You do not own this workbench!")
|
||||
return false
|
||||
end
|
||||
|
||||
client:SetAction("Packing up workbench...", 10, function()
|
||||
if (inventory:Add(item.uniqueID .. "_assembly")) then
|
||||
toolkit:DamageDurability(1)
|
||||
client:Notify("Workbench packed up.")
|
||||
else
|
||||
client:Notify("You do not have enough inventory space to pack up this workbench!")
|
||||
|
||||
return false
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnCanRun = function(item)
|
||||
return !item.noPackUp
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.Bolt = {
|
||||
name = "Bolt Workbench",
|
||||
icon = "icon16/wrench.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local inventory = client:GetCharacter():GetInventory()
|
||||
local toolkit = inventory:HasItem("tool_toolkit")
|
||||
|
||||
if (!toolkit) then
|
||||
client:Notify("You need a toolkit to bolt down this workbench!")
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
client:SetAction("Bolting down workbench...", 10, function()
|
||||
item:SetData("bolted", true)
|
||||
|
||||
client:Notify("You bolt down the workbench.")
|
||||
end)
|
||||
|
||||
toolkit:DamageDurability(1)
|
||||
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
return itemTable.entity and itemTable.entity:IsValid() and !itemTable:GetData("bolted", false)
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.UnBolt = {
|
||||
name = "Unbolt Workbench",
|
||||
icon = "icon16/wrench_orange.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
|
||||
if (client:IsAdmin()) then
|
||||
item:SetData("bolted", false)
|
||||
|
||||
client:Notify("Workbench unbolted.")
|
||||
else
|
||||
client:Notify("Workbench unbolting requires admin supervision. Please contact one before proceeding!")
|
||||
end
|
||||
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
return itemTable.entity and itemTable.entity:IsValid() and itemTable:GetData("bolted", false)
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.postHooks.drop = function(item, result)
|
||||
if (item.player and !item:GetData("placer")) then
|
||||
item:SetData("placer", item.player:GetCharacter():GetID())
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:CanTransfer(oldInventory, newInventory)
|
||||
local placerData = self:GetData("placer", false)
|
||||
local newInvOwner = newInventory and newInventory.GetOwner and newInventory:GetOwner()
|
||||
|
||||
if newInventory and newInvOwner then
|
||||
if newInvOwner and IsValid(newInvOwner) then
|
||||
if placerData and newInvOwner.GetCharacter and newInvOwner:GetCharacter():GetID() != placerData then
|
||||
newInvOwner:Notify("You are not the owner of this workbench!")
|
||||
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ITEM:OnEntityCreated(entity)
|
||||
timer.Simple(1, function()
|
||||
if (IsValid(entity)) then
|
||||
local physObj = entity:GetPhysicsObject()
|
||||
physObj:EnableMotion(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ITEM:OnEntityTakeDamage(entity, damage)
|
||||
return false
|
||||
end
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Zestaw montażowy do maszyny do gier typu 'Arcade'"
|
||||
ITEM.description = "Zestaw montażowy do złożenia maszyny zręcznościowej."
|
||||
ITEM.category = "misc"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działającą maszynę do gier."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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 = "Materiał budowlany"
|
||||
ITEM.description = "Zapakowany materiał używany w budowie, zapewniony przez Komitet Logistyczny Kombinatu."
|
||||
ITEM.category = "misc"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/props_junk/cardboard_box001a.mdl"
|
||||
ITEM.maxStackSize = 4
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Zestaw montażowy stołu do gry w warcaby"
|
||||
ITEM.description = "Zestaw montażowy do złożenia stołu do gry w warcaby."
|
||||
ITEM.category = "misc"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający stół."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Zestaw do montażu stołu szachowego"
|
||||
ITEM.description = "Zestaw montażowy do złożenia stolika szachowego."
|
||||
ITEM.category = "misc"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający stół."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_charcoal"
|
||||
ITEM.name = "Węgiel drzewny"
|
||||
ITEM.description = "Zamień drewno w węgiel drzewny używając ciepła oraz chemii."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/props/charcoal.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności wytwarzania.", ["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(1642.86, 1354.28, 862.92),
|
||||
ang = Angle(22.03, 219.49, 0),
|
||||
fov = 0.27
|
||||
}
|
||||
ITEM.maxStackSize = 8
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_charcoal_refill"
|
||||
ITEM.name = "Wkład filtra z węglem drzewnym"
|
||||
ITEM.description = "Trochę węgla drzewnego własnej roboty, starannie zawiniętego w szmatkę, do użycia jako filtr."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/props/charcoal.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności wytwarzania."}
|
||||
ITEM.maxStackSize = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(1642.86, 1354.28, 862.92),
|
||||
ang = Angle(22.03, 219.49, 0),
|
||||
fov = 0.27
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_cloth"
|
||||
ITEM.name = "Szmaty"
|
||||
ITEM.description = "Kawałki brudnych szmat, można coś z nich wytworzyć."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/cloth.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Możesz zdobyć ten przedmiot poprzez umiejętność Wytwarzania lub przez przeszukiwanie śmieci.", ["red"] = "Noszenie więcej jak 8 przedmiotów tego typu, może zostać uznane za nielegalne."}
|
||||
ITEM.maxStackSize = 24
|
||||
@@ -0,0 +1,23 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_condensed_resin"
|
||||
ITEM.name = "Skondensowana żywica"
|
||||
ITEM.description = "Szary, solidny cylinder, który jest miękki w dotyku. Lekki i łatwy do rozbicia... może być użyty w kompatybilnej maszynie."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/willardnetworks/props_combine/resin_puck.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(173.79, 146.1, 107.55),
|
||||
ang = Angle(25.1, 219.9, 0),
|
||||
fov = 3.8
|
||||
}
|
||||
ITEM.outlineColor = Color(255, 102, 0)
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Przewody"
|
||||
ITEM.description = "Stare zezłomowane przewody. Ciekawe do czego służyły..."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/circuit.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Możesz zdobyć ten przedmiot poprzez umiejętność Wytwarzania lub przez przeszukiwanie śmieci.", ["red"] = "Noszenie więcej jak 8 przedmiotów tego typu, może zostać uznane za nielegalne."}
|
||||
ITEM.maxStackSize = 24
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_explosive"
|
||||
ITEM.name = "Materiał wybuchowy"
|
||||
ITEM.description = "Troche miękkiego materiału wybuchowego. Tylko nie baw się w bombermana."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/explosive_material.mdl"
|
||||
ITEM.maxStackSize = 6
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_fabric"
|
||||
ITEM.name = "Tkanina"
|
||||
ITEM.description = "Kawałek tkaniny, jest dosyć miękka."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/fabric.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.maxStackSize = 8
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_iron"
|
||||
ITEM.name = "Żelazo"
|
||||
ITEM.description = "Żelazo zrobione z materiałów z recyklingu, cięższe i wytrzymalsze niż wcześniej."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/willardnetworks/props/reshaped_metal.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(509.64, 427.61, 310.24),
|
||||
ang = Angle(25, 220, 0),
|
||||
fov = 1.27
|
||||
}
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności Wytwarzania.", ["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.maxStackSize = 12
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_plastic"
|
||||
ITEM.name = "Plastik"
|
||||
ITEM.description = "Kawałki plastiku. Kto wie co to mogło być."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/props_junk/garbage_bag001a.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Możesz zdobyć ten przedmiot poprzez umiejętność Wytwarzania lub przez przeszukiwanie śmieci.", ["red"] = "Noszenie więcej jak 8 przedmiotów tego typu, może zostać uznane za nielegalne."}
|
||||
ITEM.maxStackSize = 24
|
||||
@@ -0,0 +1,20 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_refined_plastic"
|
||||
ITEM.name = "Arkusz z tworzywa sztucznego"
|
||||
ITEM.description = "Arkusz tworzywa sztucznego zrobiony z plastikowych śmieci."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/props_junk/garbage_bag001a.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności Wytwarzania.", ["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.outlineColor = Color(255, 204, 0, 100)
|
||||
ITEM.maxStackSize = 12
|
||||
@@ -0,0 +1,23 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_resin"
|
||||
ITEM.name = "Żywica"
|
||||
ITEM.description = "Szary, solidny cylinder, który jest miękki w dotyku. Lekki i łatwy do rozbicia... może być użyty w kompatybilnej maszynie."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/willardnetworks/props_combine/resin_puck.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(173.79, 146.1, 107.55),
|
||||
ang = Angle(25.1, 219.9, 0),
|
||||
fov = 3.8
|
||||
}
|
||||
ITEM.outlineColor = Color(255, 204, 0)
|
||||
@@ -0,0 +1,20 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_rivbolts"
|
||||
ITEM.name = "Pudełko z nitami i śrubami"
|
||||
ITEM.description = "Pudełko wytrzymałych śrub, przydatne dla doświadczonych majsterkowiczów."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/screws.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności Wytwarzania.", ["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.outlineColor = Color(255, 204, 0, 100)
|
||||
ITEM.maxStackSize = 8
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_scrap"
|
||||
ITEM.name = "Złom"
|
||||
ITEM.description = "Kawałki złomu, przydatne przy wytwarzaniu."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/willardnetworks/props/scrap.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(509.64, 427.61, 310.24),
|
||||
ang = Angle(25, 220, 0),
|
||||
fov = 1.27
|
||||
}
|
||||
ITEM.colorAppendix = {["blue"] = "Możesz zdobyć ten przedmiot poprzez umiejętność Wytwarzania lub przez przeszukiwanie śmieci.", ["red"] = "Noszenie więcej jak 8 przedmiotów tego typu, może zostać uznane za nielegalne."}
|
||||
ITEM.maxStackSize = 24
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_screws"
|
||||
ITEM.name = "Pudełko z wkrętami"
|
||||
ITEM.description = "Pudełko z wkrętami. Lekko zardzewiałe."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/screws.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Możesz zdobyć ten przedmiot poprzez umiejętność wytwarzania lub przez przeszukiwanie śmieci.", ["red"] = "Noszenie więcej jak 8 przedmiotów tego typu, może zostać uznane za nielegalne."}
|
||||
ITEM.maxStackSize = 24
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_steel"
|
||||
ITEM.name = "Stal"
|
||||
ITEM.description = "Hartowana stal wykonana przez doskonałego rafinatora. Niezwykle wytrzymałe i świetnie wykonane."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/gibs/scanner_gib02.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności Wytwarzania.", ["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.maxStackSize = 8
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_stitched_cloth"
|
||||
ITEM.name = "Zszyty materiał"
|
||||
ITEM.description = "Kawałek zszytego materiału, wytrzymalszy niż wcześniej."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/stitched_cloth.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot może zostać stworzony dzięki umiejętności wytwarzania.", ["red"] = "CP uzna cię za podejrzanego, jeżeli będziesz miał przy sobie ten przedmiot podczas przeszukania."}
|
||||
ITEM.maxStackSize = 12
|
||||
@@ -0,0 +1,20 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_weapon_parts"
|
||||
ITEM.name = "Części do broni"
|
||||
ITEM.description = "Części używane do stworzenia broni."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/skills/weaponparts.mdl"
|
||||
|
||||
ITEM.outlineColor = Color(255, 204, 0, 100)
|
||||
ITEM.maxStackSize = 6
|
||||
@@ -0,0 +1,33 @@
|
||||
--[[
|
||||
| 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.uniqueID = "comp_wood"
|
||||
ITEM.name = "Odłamki drewna"
|
||||
ITEM.description = "Kolekcja drewnianych odłamków, które można ponownie wykorzystać do tworzenia przedmiotów."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/Gibs/wood_gib01a.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Możesz zdobyć ten przedmiot poprzez umiejętność wytwarzania lub przez przeszukiwanie śmieci.", ["red"] = "Noszenie więcej jak 8 przedmiotów tego typu, może zostać uznane za nielegalne."}
|
||||
|
||||
ITEM.maxStackSize = 24
|
||||
|
||||
ITEM.functions.Breakdown = {
|
||||
icon = "icon16/link_break.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
|
||||
client:GetCharacter():GetInventory():Add("woodstick", 10)
|
||||
end,
|
||||
OnCanRun = function(item)
|
||||
return !IsValid(item.entity) and item.player:Team() == FACTION_BIRD
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| 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 = "Duży pojemnik"
|
||||
ITEM.description = "Pojemnik o rozmiarze 9x9. Skontaktuj się z adminem aby ustawić ten pojemnik, potrzebny jest zamek na pojemnik aby go zamknąć."
|
||||
ITEM.category = "Storage"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 4
|
||||
ITEM.model = "models/props_wasteland/controlroom_storagecloset001a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający pojemnik. Wymagana jest grupa z conajmniej 5 członkami.", ["blue"] = "Obowiązuje limit 2 małych pojemników LUB 1 średni pojemnik na gracza\nGrupy mogą mieć dodatkowo 3 duże pojemniki."}
|
||||
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Duża skrzynia"
|
||||
ITEM.description = "Pojemnik o rozmiarze 10x10, skontaktuj się z adminem aby ustawić ten Pojemnik, potrzebny jest zamek na Pojemnik aby go zamknąć."
|
||||
ITEM.category = "Storage"
|
||||
ITEM.width = 4
|
||||
ITEM.height = 4
|
||||
ITEM.model = "models/props_junk/wood_crate002a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający pojemnik.", ["blue"] = "Ze względu na limit, możesz posiadać tylko 1 skrzynię."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Średni pojemnik"
|
||||
ITEM.description = "Pojemnik o rozmiarze 5x8. Skontaktuj się z adminem aby ustawić ten pojemnik, potrzebny jest zamek na pojemnik aby go zamknąć."
|
||||
ITEM.category = "Storage"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/props_wasteland/controlroom_filecabinet002a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający pojemnik.", ["blue"] = "Obowiązuje limit 2 małych pojemników LUB 1 średni pojemnik na gracza.\nGrupy mogą mieć dodatkowo 3 duże pojemniki."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Standardowa skrzynia"
|
||||
ITEM.description = "Pojemnik o rozmiarze 6x6, skontaktuj się z adminem aby ustawić ten Pojemnik, potrzebny jest zamek na Pojemnik aby go zamknąć"
|
||||
ITEM.category = "Storage"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/props_junk/wood_crate001a.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający pojemnik.", ["blue"] = "Ze względu na limit, możesz posiadać tylko 1 skrzynie."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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 = "Mały pojemnik"
|
||||
ITEM.description = "Pojemnik o rozmiarze 5x3, skontaktuj się z adminem aby ustawić ten pojemnik, potrzebny jest zamek na pojemnik aby go zamknąć."
|
||||
ITEM.category = "Storage"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/props_lab/filecabinet02.mdl"
|
||||
ITEM.colorAppendix = {["red"] = "Skontaktuj się z administracją, aby ustawić działający pojemnik.", ["blue"] = "Obowiązuje limit 2 małych pojemników LUB 1 średni pojemnik na gracza.\nGrupy mogą mieć dodatkowo 3 duże pojemniki."}
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,47 @@
|
||||
--[[
|
||||
| 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.uniqueID = "crafting_water"
|
||||
ITEM.name = "Woda do wytwarzania"
|
||||
ITEM.description = "Puszka wody używana przy wytwarzaniu."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/props_junk/popcan01a.mdl"
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(509.64, 427.61, 310.24),
|
||||
ang = Angle(25.01, 220.01, 0),
|
||||
fov = 0.6
|
||||
}
|
||||
ITEM.maxStackSize = 4
|
||||
|
||||
ITEM.functions.Convert = {
|
||||
name = "Przekonwertuj",
|
||||
icon = "icon16/wrench.png",
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local inventory = client:GetCharacter():GetInventory()
|
||||
local originalID = item:GetData("original")
|
||||
local original = ix.item.list[originalID]
|
||||
|
||||
if (!original) then return end
|
||||
|
||||
inventory:Add(originalID, 1, {spoilTime = item:GetData("spoilTime", 0)})
|
||||
client:Notify("Przekonwertowałeś wodę spowrotem na " .. original.name .. ".")
|
||||
end,
|
||||
OnCanRun = function(item)
|
||||
return item:GetData("original")
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local item = ix.item.list[self:GetData("original")]
|
||||
return "A converted " .. (item and item.name or "can of water") .. " used for crafting."
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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 = "Pulsacyjna Komora Nabojowa"
|
||||
ITEM.description = "Główna komora, która zabezpiecza najbardziej delikatną część całej broni Pulsacyjnej. Istotne ze względów bezpieczeństwa."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/props_junk/cardboard_box004a.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.maxStackSize = 2
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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 = "Pulsacyjny Mechanizm Spustowy"
|
||||
ITEM.description = "Mechanizm spustowy dla broni pulsacyjnej. Niezbędny do strzelania z broni pulsacyjnej bez zainstalowanego Biolocka."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/props_junk/cardboard_box004a.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.maxStackSize = 2
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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 = "Broń Pulsacyjna - Główny Korpus"
|
||||
ITEM.description = "Główny zewnętrzny korpus broni pulsacyjnej. Musi być umieszczony wokół wewnętrznych komponentów"
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/props_junk/cardboard_box004a.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.maxStackSize = 1
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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 = "Kolba Pulsacyjna"
|
||||
ITEM.description = "Kolba do broni pulsacyjnej... tylko na tył, w przypadku tworzenia AR-2 lub SR-1."
|
||||
ITEM.category = "Crafting"
|
||||
ITEM.model = "models/props_junk/cardboard_box004a.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.maxStackSize = 2
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_biolock_ar2"
|
||||
ITEM.name = "Karabin Pulsacyjny z Biolockiem"
|
||||
ITEM.description = "Karabin Pulsacyjny, AR2, upuszczony przez Żołnierza Overwatch... Wygląda na to, że jest zablokowany przez jakiś mechanizm. Potrzebowałbyś Vortigaunta aby go odblokować."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 4
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/weapons/w_IRifle.mdl"
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_biolock_psmg"
|
||||
ITEM.name = "Pulsacyjny Pistolet Maszynowy z Biolockiem"
|
||||
ITEM.description = "Pulsacyjny pistolet maszynowy Overwatch, PSMG, standardowa broń piechoty... jeszcze nieużywalna."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/weapons/w_IRifle.mdl"
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_biolock_sg1"
|
||||
ITEM.name = "Strzelba Overwatch z Biolockiem"
|
||||
ITEM.description = "Nieporęczna i ciężka strzelba Overwatch, SG1, zdolna zadawać poważne obrażenia nie tylko ludziom, ale także konstrukcjom."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 4
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/weapons/w_IRifle.mdl"
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_biolock_sr1"
|
||||
ITEM.name = "Karabin Ordinala z Biolockiem"
|
||||
ITEM.description = "Karabin Overwatch, SR1. Wydaje się być nie do użycia."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 4
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/weapons/oar/w_orifle.mdl"
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_biolock_sup"
|
||||
ITEM.name = "Biolocked Suppressor"
|
||||
ITEM.description = "Ręczny Karabin Maszynowy Suppresora Overwatch, SUP... zasadniczo zbyt ciężki, by móc go nosić."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 5
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/weapons/w_IRifle.mdl"
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_emp"
|
||||
ITEM.name = "Ładunek EMP"
|
||||
ITEM.description = "Mały jednorazowy ładunek elektromagnetyczny, służy do wyłączenia elektroniki w okolicy detonacji. Można także użyć ładunek na technologii Kombinatu - jest w stanie wyłączyć pola siłowe na 5 minut, wieżyczki na 10 minut i wyłączyć skanery na stałe."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/Items/car_battery01.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Jest to przedmiot stworzony do RP, skontaktuj się z administracją aby go wykorzystać. Może wyłączyć prawie wszystkie formy technologii Kombinatu - z wyjątkiem syntetyków lub zaawansowanej technologii Kombinatu."}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_largebomb"
|
||||
ITEM.name = "Duża Bomba"
|
||||
ITEM.description = "Największa bomba jaką można zrobić ze złomu i starych schematów znalezionych na odludziach. Jego siła jest porównywalna do 10kg TNT. Jest zdolna do zdemolowania paru budynków na raz i zadania dużych uszkodzeń Dystryktowi."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 3
|
||||
ITEM.height = 3
|
||||
ITEM.model = "models/Items/car_battery01.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "This is an RP item, call a GM to use.", ["red"] = "NIE MOŻE ZOSTAĆ ZESPAWNOWANY LUB PRZEKAZANY BEZ ZGODY ZARZĄDU SERWERA!"}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_littlebomb"
|
||||
ITEM.name = "Malutka Bomba"
|
||||
ITEM.description = "Mała, ręcznie stworzona bomba o małej sile rażenia. Głównie używana jako mina przeciwpiechotna lub pułapka. Nie jest zdolna do wysadzenia ściany. Stworzona przy pomocy 370g Cyclotolu."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/Items/car_battery01.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Jest to przedmiot stworzony do RP, skontaktuj się z administracją aby go wykorzystać."}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_mediumbomb"
|
||||
ITEM.name = "Średnia Bomba"
|
||||
ITEM.description = "Średniego rozmaru bomba w kształcie C4 lub IED, o sile porównywalnej to 4 kilogramów TNT. Idealnie nadająca się do wysadzania budynków czy posterunków Kombinatu."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/Items/car_battery01.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Jest to przedmiot stworzony do RP, skontaktuj się z administracją aby go wykorzystać."}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "dummy_smallbomb"
|
||||
ITEM.name = "Mała Bomba"
|
||||
ITEM.description = "W porównaniu do malutkiej bomby, ta jest zdolna stworzyć eksplozje porównywalną do 1KG TNT. Może wysadzić ściane, ale bez poważniejszych obrażeń dla całej konstrukcji budynku. Stworzona przy pomocy 1,2kg Cyclotolu."
|
||||
ITEM.category = "Dummy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/Items/car_battery01.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Jest to przedmiot stworzony do RP, skontaktuj się z administracją aby go wykorzystać."}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "expo_battery"
|
||||
ITEM.name = "Akumulator (Naładowany)"
|
||||
ITEM.description = ""
|
||||
ITEM.category = "Expedition"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/Items/car_battery01.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot stworzony jest głównie pod RP i nie ma oprócz tego żadnej funkcji w grze."}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "expo_campingbag"
|
||||
ITEM.name = "Zestaw namiotowy"
|
||||
ITEM.description = "Zestaw namiotowy przydany podczas kempingu. Może zapewnić odpoczynek dla conajmniej 3 osób."
|
||||
ITEM.category = "Expedition"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/vj_props/duffle_bag.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot stworzony jest głównie pod RP i nie ma oprócz tego żadnej funkcji w grze."}
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| 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.uniqueID = "expo_settlementkit"
|
||||
ITEM.name = "Zestaw do budowy obozowiska"
|
||||
ITEM.description = "Zestaw przydatny przy rozbijaniu obozowiska, można przy nim znaleźć parę narzędzi."
|
||||
ITEM.category = "Expedition"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.model = "models/props/de_prodigy/concretebags3.mdl"
|
||||
ITEM.colorAppendix = {["blue"] = "Ten przedmiot stworzony jest głównie pod RP i nie ma oprócz tego żadnej funkcji w grze."}
|
||||
@@ -0,0 +1,22 @@
|
||||
--[[
|
||||
| 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 = "Przyprawione mięso Antliona"
|
||||
ITEM.description = "Po dodaniu kilku przypraw, smakuje o niebo lepiej."
|
||||
ITEM.category = "Food"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/food/canned_food4.mdl"
|
||||
ITEM.hunger = 40
|
||||
ITEM.boosts = {
|
||||
strength = 3
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
| 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 = "Pieczone mięso z Antliona"
|
||||
ITEM.description = "Pieczony kawałek mięsa z Antliona. Nie syci tak bardzo, jak by się chciało. Jest dość żylasty i ma dziwną konsystencję."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/cooked_alienmeat.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(125.61, 104.91, 78.59),
|
||||
ang = Angle(25.01, 219.94, 0),
|
||||
fov = 4
|
||||
}
|
||||
ITEM.hunger = 30
|
||||
ITEM.boosts = {
|
||||
strength = 2
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
@@ -0,0 +1,41 @@
|
||||
--[[
|
||||
| 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 = "Kanapka z Antliona"
|
||||
ITEM.description = "Może i nie jest daniem najwyższych lotów, ale jest w miarę zjadliwe."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/sandwich.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.color = Color(217, 243, 217)
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(509.64, 427.61, 310.24),
|
||||
ang = Angle(24.9, 219.85, 0),
|
||||
fov = 0.75
|
||||
}
|
||||
ITEM.hunger = 45
|
||||
ITEM.boosts = {
|
||||
strength = 3,
|
||||
perception = 1
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -2,
|
||||
up = 0,
|
||||
forward = -0.5
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 90
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
--[[
|
||||
| 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 = "Mięso z Antliona na szaszłyku"
|
||||
ITEM.description = "Całkiem smaczne, żylaste mięso z Antliona nabite na szaszłyk."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/meatskewer.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(150.5, 126.23, 92.34),
|
||||
ang = Angle(25.07, 219.54, 0),
|
||||
fov = 2.7
|
||||
}
|
||||
ITEM.hunger = 6
|
||||
ITEM.boosts = {
|
||||
strength = 1
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
ITEM.maxStackSize = 3
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -1.5,
|
||||
up = 0,
|
||||
forward = 5
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 90
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
--[[
|
||||
| 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 = "Gulasz z Antliona"
|
||||
ITEM.description = "Mieszanka kawałków mięsa, warzyw i przypraw połączona w pozornie apetyczny gulasz."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/meatysoup.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(125.61, 104.91, 78.59),
|
||||
ang = Angle(24.78, 219.86, 0),
|
||||
fov = 3
|
||||
}
|
||||
ITEM.hunger = 65
|
||||
ITEM.thirst = 15
|
||||
ITEM.boosts = {
|
||||
strength = 5
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "ambient/levels/canals/toxic_slime_gurgle4.wav"
|
||||
|
||||
ITEM.addVE = 20
|
||||
function ITEM:OnConsume(client, character)
|
||||
if character:IsVortigaunt() then
|
||||
local percentage = ix.config.Get("maxVortalEnergy", 100) / 100
|
||||
percentage = percentage * self.addVE
|
||||
character:AddVortalEnergy(percentage)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| 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 = "Plasterek syntetycznego sera"
|
||||
ITEM.description = "Wygląda i pachnie jak normalny ser, ale zdecydowanie smakuje inaczej. Nic dziwnego, trudno w tych czasach o prawdziwą krowę."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/cheesewheel2c.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(169.82, 142.5, 102.64),
|
||||
ang = Angle(24.34, 220.07, 0),
|
||||
fov = 1.76
|
||||
}
|
||||
ITEM.hunger = 7
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
@@ -0,0 +1,42 @@
|
||||
--[[
|
||||
| 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 = "Syntetyczna pasta serowa"
|
||||
ITEM.description = "Nie jest to jakiś 'creme de la creme', ale da się zjeść."
|
||||
ITEM.category = "Food"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/props_lab/jar01b.mdl"
|
||||
ITEM.color = Color(254, 255, 212)
|
||||
ITEM.hunger = 35
|
||||
ITEM.boosts = {
|
||||
perception = 2,
|
||||
intelligence = 2
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "ambient/levels/canals/toxic_slime_gurgle4.wav"
|
||||
ITEM.junk = "junk_jar"
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(6.22, -199.61, 10.73),
|
||||
ang = Angle(3.12, 91.84, 0),
|
||||
fov = 3.64
|
||||
}
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -1.5,
|
||||
up = 0,
|
||||
forward = 0
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 0
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
| 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 = "Pieczone syntetyczne mięso"
|
||||
ITEM.description = "Łatwy do zjedzenia blok proteinowy. Zapewne nafaszerowane substancjami chemicznymi i innymi substytutami podtrzymującymi ważność."
|
||||
ITEM.category = "Food"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/willardnetworks/food/steak2.mdl"
|
||||
ITEM.hunger = 30
|
||||
ITEM.boosts = {
|
||||
intelligence = 2
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(509.64, 427.61, 310.24),
|
||||
ang = Angle(24.99, 220.01, 0),
|
||||
fov = 0.62
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
--[[
|
||||
| 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 = "Syntetyczna pasta mięsna"
|
||||
ITEM.description = "Może i nie jest to jakość znana sprzed okupacji, ale w pewnym sensie przypomina dawne czasy.."
|
||||
ITEM.category = "Food"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.model = "models/props_lab/jar01b.mdl"
|
||||
ITEM.color = Color(243, 217, 217)
|
||||
ITEM.hunger = 60
|
||||
ITEM.boosts = {
|
||||
strength = 2,
|
||||
intelligence = 2
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "ambient/levels/canals/toxic_slime_gurgle4.wav"
|
||||
ITEM.junk = "junk_jar"
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(6.22, -199.61, 10.73),
|
||||
ang = Angle(3.12, 91.84, 0),
|
||||
fov = 3.64
|
||||
}
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -1.5,
|
||||
up = 0,
|
||||
forward = 0
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 0
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
--[[
|
||||
| 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 = "Syntetyczne mięso na szaszłykach"
|
||||
ITEM.description = "Syntetyczne mięso na szaszłykach to opcja dla wegan i wegetarian, która pozwala poczuć smak grillowania, bez uczucia winy wobec zwierząt."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/meatskewer2.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(150.5, 126.23, 92.34),
|
||||
ang = Angle(25.07, 219.54, 0),
|
||||
fov = 2.7
|
||||
}
|
||||
ITEM.hunger = 6
|
||||
ITEM.boosts = {
|
||||
intelligence = 1
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
ITEM.maxStackSize = 3
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -1.5,
|
||||
up = 0,
|
||||
forward = 5
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 90
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
--[[
|
||||
| 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 = "Syntetyczny gulasz mięsny"
|
||||
ITEM.description = "Plastry syntetycznego mięsa wymieszane w sosie z kawałkami warzyw."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/meatysoup2.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(125.61, 104.91, 78.59),
|
||||
ang = Angle(24.78, 219.86, 0),
|
||||
fov = 3
|
||||
}
|
||||
ITEM.hunger = 65
|
||||
ITEM.thirst = 15
|
||||
ITEM.boosts = {
|
||||
intelligence = 5
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "ambient/levels/canals/toxic_slime_gurgle4.wav"
|
||||
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
| 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 = "Syntetyczne mięso z solą i makaronem."
|
||||
ITEM.description = "Smażone syntetyczne mięso, wymieszane z solą i makaronem. Raczej nie zalecane jest serwowania tego dania do osób, którzy są koneserami gastronomicznymi."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/canned_food2.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(69.87, 58.63, 44.49),
|
||||
ang = Angle(24.95, 220, 0),
|
||||
fov = 4.27
|
||||
}
|
||||
ITEM.hunger = 40
|
||||
ITEM.boosts = {
|
||||
intelligence = 3
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
@@ -0,0 +1,28 @@
|
||||
--[[
|
||||
| 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 = "Szarlotka"
|
||||
ITEM.description = "Nie ma nic lepszego niż smak cynamonu i jabłek, które rozgrzewają duszę i wprowadzają nas w stan błogiej nirwany."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/pie.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(169.82, 142.5, 102.64),
|
||||
ang = Angle(24.95, 219.95, 0),
|
||||
fov = 2.78
|
||||
}
|
||||
ITEM.hunger = 65
|
||||
ITEM.boosts = {
|
||||
strength = 3,
|
||||
intelligence = 5
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/antlion_grub/squashed.wav"
|
||||
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
| 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 = "Bajgiel"
|
||||
ITEM.description = "Dzięki innowacyjnym sposobom udało się uzyskać bajgle z ciasta na chleb. Jest nieco suche, ale podoła."
|
||||
ITEM.model = "models/willardnetworks/food/bagel2.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(509.64, 427.61, 310.24),
|
||||
ang = Angle(24.94, 219.98, 0),
|
||||
fov = 0.58
|
||||
}
|
||||
ITEM.category = "Food"
|
||||
ITEM.hunger = 20
|
||||
ITEM.boosts = {
|
||||
intelligence = 2
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
@@ -0,0 +1,82 @@
|
||||
--[[
|
||||
| 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 = "Chleb razowy"
|
||||
ITEM.description = "Świeżo wypieczony, chrupiący i pięknie pachnący bochen chleba. Po prostu najzwyklejszy chleb."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/bread_loaf.mdl"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(258.35, 217.47, 159.76),
|
||||
ang = Angle(25.18, 220.07, 0),
|
||||
fov = 2.39
|
||||
}
|
||||
ITEM.hunger = 40
|
||||
ITEM.boosts = {
|
||||
strength = 3,
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -2,
|
||||
up = 0,
|
||||
forward = 0
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 90
|
||||
},
|
||||
}
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch3.wav"
|
||||
ITEM.openedItem = "baking_bread_half" -- the uniqueID e.g what comes after 'sh_' in the file name unless ITEM.uniqueID is specified
|
||||
ITEM.openRequirementAmount = 2
|
||||
ITEM.openRequirements = {"tool_knife", "cleaver", "hatchet", "kitknife", "machete"} -- same desc as above
|
||||
|
||||
ITEM.functions.Slice = {
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local character = item.player:GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
local openerItem
|
||||
|
||||
if (item.openRequirements) then
|
||||
for k, v in ipairs(item.openRequirements) do
|
||||
if inventory:HasItem(v) then
|
||||
openerItem = inventory:HasItem(v)
|
||||
break
|
||||
end
|
||||
end
|
||||
if !openerItem then
|
||||
client:NotifyLocalized("Nie posiadasz wymaganego narzędzia!")
|
||||
return false
|
||||
else
|
||||
if (openerItem.isTool) then
|
||||
openerItem:DamageDurability(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
client:EmitSound(item.useSound)
|
||||
|
||||
-- Spawn the opened item if it exists
|
||||
local requirementAmount = item.openRequirementAmount or 1
|
||||
if (item.openedItem) then
|
||||
local openedItemName = ix.item.list[item.openedItem].name or item.openedItem
|
||||
if (!inventory:Add(item.openedItem, requirementAmount)) then
|
||||
client:NotifyLocalized("Potrzebujesz "..requirementAmount.." slotów w ekwipunku aby pokroić ten przedmiot.")
|
||||
return
|
||||
end
|
||||
|
||||
client:NotifyLocalized("Pokroiłeś "..item.name.." i otrzymałeś "..openedItemName)
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
--[[
|
||||
| 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 = "Połówka chleba"
|
||||
ITEM.description = "Połówka bochenka chleba czekająca na zjedzenie."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/bread_half.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(258.35, 217.47, 159.76),
|
||||
ang = Angle(25.14, 219.92, 0),
|
||||
fov = 1.49
|
||||
}
|
||||
ITEM.hunger = 20
|
||||
ITEM.boosts = {
|
||||
strength = 2
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.holdData = {
|
||||
vectorOffset = {
|
||||
right = -2,
|
||||
up = 0,
|
||||
forward = 0
|
||||
},
|
||||
angleOffset = {
|
||||
right = 0,
|
||||
up = 0,
|
||||
forward = 90
|
||||
},
|
||||
}
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch3.wav"
|
||||
ITEM.openedItem = "baking_bread_slice" -- the uniqueID e.g what comes after 'sh_' in the file name unless ITEM.uniqueID is specified
|
||||
ITEM.openRequirementAmount = 4
|
||||
ITEM.openRequirements = {"tool_knife", "cleaver", "hatchet", "kitknife", "machete"} -- same desc as above
|
||||
|
||||
ITEM.functions.Slice = {
|
||||
OnRun = function(item)
|
||||
local client = item.player
|
||||
local character = item.player:GetCharacter()
|
||||
local inventory = character:GetInventory()
|
||||
local openerItem
|
||||
|
||||
if (item.openRequirements) then
|
||||
for k, v in ipairs(item.openRequirements) do
|
||||
if inventory:HasItem(v) then
|
||||
openerItem = inventory:HasItem(v)
|
||||
break
|
||||
end
|
||||
end
|
||||
if !openerItem then
|
||||
client:NotifyLocalized("You do not have a required tool to assemble this item")
|
||||
return false
|
||||
else
|
||||
if (openerItem.isTool) then
|
||||
openerItem:DamageDurability(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
client:EmitSound(item.useSound)
|
||||
|
||||
-- Spawn the opened item if it exists
|
||||
local requirementAmount = item.openRequirementAmount or 1
|
||||
if (item.openedItem) then
|
||||
local openedItemName = ix.item.list[item.openedItem].name or item.openedItem
|
||||
if (!inventory:Add(item.openedItem, requirementAmount)) then
|
||||
client:NotifyLocalized("You need "..requirementAmount.." inventory spaces to slice this item.")
|
||||
return
|
||||
end
|
||||
|
||||
client:NotifyLocalized("You have sliced a "..item.name.." and been given a "..openedItemName)
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
| 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 = "Kromka chleba"
|
||||
ITEM.description = "Kromka świeżego chleba, nie jest zbyt sycąca ale na ten moment ujdzie."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/bread_slice.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(258.35, 217.47, 159.76),
|
||||
ang = Angle(25.26, 220.13, 0),
|
||||
fov = 1.25
|
||||
}
|
||||
ITEM.hunger = 10
|
||||
ITEM.boosts = {
|
||||
strength = 1
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/barnacle/barnacle_crunch2.wav"
|
||||
@@ -0,0 +1,28 @@
|
||||
--[[
|
||||
| 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 = "Ceglasty sernik"
|
||||
ITEM.description = "Solidny sernik, często po prostu nazywany cegłą. Niedobór podstawowych składników do pieczenia doprowadził do dość nietuzinkowych rozwiązań."
|
||||
ITEM.category = "Food"
|
||||
ITEM.model = "models/willardnetworks/food/wn_food_cheesecake.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(258.35, 217.47, 159.76),
|
||||
ang = Angle(25.18, 220.07, 0),
|
||||
fov = 0.96
|
||||
}
|
||||
ITEM.hunger = 65
|
||||
ITEM.boosts = {
|
||||
perception = 5,
|
||||
intelligence = 3
|
||||
}
|
||||
ITEM.spoil = true
|
||||
ITEM.useSound = "npc/antlion_grub/squashed.wav"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user