mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
257 lines
6.2 KiB
Lua
257 lines
6.2 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
ITEM.name = "hoseItemName"
|
|
ITEM.model = Model("models/jq/hlvr/props/xen/combine_foam_hose.mdl")
|
|
ITEM.description = "hoseItemDesc"
|
|
ITEM.category = "Infestation Control"
|
|
ITEM.skin = 1
|
|
ITEM.exRender = true
|
|
ITEM.width = 4
|
|
ITEM.height = 1
|
|
ITEM.iconCam = {
|
|
pos = Vector(178.91, 88.39, 13.04),
|
|
ang = Angle(3.85, 205.44, 0),
|
|
fov = 17.03
|
|
}
|
|
|
|
-- Inventory drawing
|
|
if (CLIENT) then
|
|
-- Draw camo if it is available.
|
|
function ITEM:PaintOver(item, w, h)
|
|
if (item:GetData("connected", false)) then
|
|
surface.SetDrawColor(110, 255, 110, 100)
|
|
surface.DrawRect(w - 14, h - 14, 8, 8)
|
|
end
|
|
end
|
|
else
|
|
-- Doing all this because the hose model has no physics model.
|
|
function ITEM:OnEntityCreated(itemEntity)
|
|
itemEntity:SetModel("models/squad/sf_plates/sf_plate3x3.mdl")
|
|
itemEntity:DrawShadow(false)
|
|
itemEntity:SetColor(Color(255, 255, 255, 0))
|
|
itemEntity:SetRenderMode(RENDERMODE_TRANSCOLOR)
|
|
|
|
itemEntity:PhysicsInit(SOLID_VPHYSICS)
|
|
itemEntity:SetSolid(SOLID_VPHYSICS)
|
|
|
|
local physObj = itemEntity:GetPhysicsObject()
|
|
|
|
if (IsValid(physObj)) then
|
|
physObj:EnableMotion(true)
|
|
physObj:Wake()
|
|
end
|
|
|
|
itemEntity.tube = ents.Create("prop_dynamic")
|
|
itemEntity.tube:DrawShadow(true)
|
|
itemEntity.tube:SetParent(itemEntity)
|
|
itemEntity.tube:SetModel("models/jq/hlvr/props/xen/combine_foam_hose.mdl")
|
|
itemEntity.tube:SetSkin(1)
|
|
|
|
local forward, right, up = itemEntity:GetForward(), itemEntity:GetRight(), itemEntity:GetUp()
|
|
|
|
itemEntity.tube:SetAngles(itemEntity:GetAngles())
|
|
itemEntity.tube:SetPos(itemEntity:GetPos() + forward * 18 + right * - 20 + up * 5)
|
|
itemEntity.tube:Spawn()
|
|
itemEntity:DeleteOnRemove(itemEntity.tube)
|
|
end
|
|
end
|
|
|
|
function ITEM:CanTransfer(oldInventory, newInventory)
|
|
if (newInventory and self:GetData("connected", false)) then
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
ITEM.functions.Attach = {
|
|
icon = "icon16/basket_put.png",
|
|
OnRun = function(item)
|
|
local client = item.player
|
|
local trace = client:GetEyeTraceNoCursor()
|
|
local target = trace.Entity
|
|
|
|
if (target:GetClass() == "ix_infestation_tank" and trace.HitPos:Distance(client:GetShootPos()) <= 192) then
|
|
if (target:GetDTBool(4) or target:GetDTBool(2)) then
|
|
client:NotifyLocalized("hoseAttachFailureAttached")
|
|
|
|
return false
|
|
end
|
|
|
|
if (item:GetData("connected", false)) then
|
|
ix.item.PerformInventoryAction(client, "ConnectDis", item.id, item.invID)
|
|
end
|
|
|
|
target:SetBodygroup(target:FindBodygroupByName("Hose"), 0)
|
|
target:SetDTBool(2, true)
|
|
client:NotifyLocalized("hoseAttachSuccess")
|
|
else
|
|
client:NotifyLocalized("invalidTank")
|
|
|
|
return false
|
|
end
|
|
end,
|
|
OnCanRun = function(item)
|
|
return !IsValid(item.entity)
|
|
end
|
|
}
|
|
|
|
ITEM.functions.Connect = {
|
|
icon = "icon16/link.png",
|
|
OnRun = function(item)
|
|
local client = item.player
|
|
local trace = client:GetEyeTraceNoCursor()
|
|
local target = trace.Entity
|
|
|
|
if (target:GetClass() == "ix_infestation_tank" and trace.HitPos:Distance(client:GetShootPos()) <= 192) then
|
|
if (target:GetDTBool(4) or target:GetDTBool(2)) then
|
|
client:NotifyLocalized("hoseConnectFailureConnected")
|
|
|
|
return false
|
|
end
|
|
|
|
local inventoryID = client:GetCharacter():GetInventory():GetID()
|
|
local inventory = ix.item.inventories[inventoryID]
|
|
|
|
local hasOtherHoseConnected = false
|
|
|
|
for _, items in pairs(inventory.slots) do
|
|
for _, item in pairs(items) do
|
|
if (item.uniqueID == "hose" and item:GetData("connected", false)) then
|
|
hasOtherHoseConnected = true
|
|
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if (hasOtherHoseConnected) then
|
|
client:NotifyLocalized("hoseConnectFailureMultipleHoses")
|
|
|
|
return false
|
|
end
|
|
|
|
item:SetData("connected", target:EntIndex())
|
|
target:SetDTBool(4, true)
|
|
client:NotifyLocalized("hoseConnectSuccess")
|
|
|
|
local rope = constraint.Rope(client, target, 0, 0, Vector(0, 0, 20), Vector(0, 0, 0), 0, 750, 1, 4, "cable/combine_foam_tank_hose_rope")
|
|
|
|
rope:CallOnRemove("RopeBroken", function(entity)
|
|
if (item.functions.ConnectDis.OnCanRun(item)) then
|
|
item.functions.ConnectDis.OnRun(item, true, client)
|
|
end
|
|
end)
|
|
|
|
client:SetNetVar("tankHose", rope)
|
|
else
|
|
client:NotifyLocalized("invalidTank")
|
|
end
|
|
|
|
return false
|
|
end,
|
|
OnCanRun = function(item)
|
|
return !item:GetData("connected", false) and !IsValid(item.entity)
|
|
end
|
|
}
|
|
|
|
ITEM.functions.ConnectDis = { -- Sorry
|
|
name = "Disconnect",
|
|
icon = "icon16/link_break.png",
|
|
OnRun = function(item, forceUnequip, activator)
|
|
local client = item.player
|
|
|
|
if (forceUnequip == true) then
|
|
client = activator
|
|
end
|
|
|
|
local character
|
|
local inventory
|
|
|
|
-- This is retarded but better safe than sorry.
|
|
if (client) then
|
|
character = client:GetCharacter()
|
|
|
|
if (character) then
|
|
inventory = character:GetInventory()
|
|
|
|
if (!inventory) then
|
|
return false
|
|
end
|
|
else
|
|
return false
|
|
end
|
|
else
|
|
return false
|
|
end
|
|
|
|
if (client:HasWeapon("weapon_applicator")) then
|
|
if (forceUnequip == true) then
|
|
local applicator = inventory:HasItem("applicator")
|
|
|
|
if (applicator) then
|
|
ix.item.PerformInventoryAction(client, "EquipUn", applicator.id, applicator.invID)
|
|
end
|
|
else
|
|
client:NotifyLocalized("hoseDisconnectFailureApplicator")
|
|
|
|
return false
|
|
end
|
|
end
|
|
|
|
local target = item:GetData("connected", false)
|
|
|
|
if (target and isnumber(target)) then
|
|
target = Entity(target)
|
|
|
|
if (target and target:IsValid()) then
|
|
target:SetDTBool(4, false)
|
|
end
|
|
end
|
|
|
|
item:SetData("connected", false)
|
|
|
|
if (forceUnequip != true) then
|
|
client:NotifyLocalized("hoseDisconnectSuccess")
|
|
else
|
|
client:NotifyLocalized("hoseDisconnectForced")
|
|
end
|
|
|
|
local rope = client:GetNetVar("tankHose")
|
|
|
|
if (rope and IsValid(rope)) then
|
|
rope:Remove()
|
|
end
|
|
|
|
client:SetNetVar("tankHose", nil)
|
|
|
|
return false
|
|
end,
|
|
OnCanRun = function(item)
|
|
return item:GetData("connected", false) and !IsValid(item.entity)
|
|
end
|
|
}
|
|
|
|
function ITEM:OnLoadout()
|
|
local connected = self:GetData("connected", false)
|
|
|
|
if (connected and isnumber(connected)) then
|
|
connected = Entity(connected)
|
|
|
|
if (connected and connected:IsValid()) then
|
|
connected:SetDTBool(4, false)
|
|
end
|
|
end
|
|
|
|
self:SetData("connected", false)
|
|
end
|