spacebuild/spacebuild

View on GitHub
lua/caf/stools/ls3_receptacles.lua

Summary

Maintainability
Test Coverage
TOOL.Category = "Life Support"
TOOL.Name = "#Storage Devices"

TOOL.DeviceName = "Storage Device"
TOOL.DeviceNamePlural = "Storage Devices"
TOOL.ClassName = "ls3_receptacles"

TOOL.DevSelect = true
TOOL.CCVar_type = "storage_gas_o2"
TOOL.CCVar_sub_type = "Small (Phx)"
TOOL.CCVar_model = "models/props_phx/life_support/canister_small.mdl"

TOOL.Limited = true
TOOL.LimitName = "ls3_receptacles"
TOOL.Limit = 20

CAFToolSetup.SetLang("Life Support Storage Devices", "Create Storage Devices attached to any surface.", "Left-Click: Spawn a Device.  Reload: Repair Device.")


TOOL.ExtraCCVars = {
    extra_num = 0,
    extra_bool = 0,
}

function TOOL.EnableFunc()
    if not CAF then
        return false;
    end
    if not CAF.GetAddon("Resource Distribution") or not CAF.GetAddon("Resource Distribution").GetStatus() then
        return false;
    end
    return true;
end

function TOOL.ExtraCCVarsCP(tool, panel)
    panel:NumSlider("Extra Number", "ls3_receptacles_extra_num", 0, 10, 0)
    panel:CheckBox("Extra Bool", "ls3_receptacles_extra_bool")
end

function TOOL:GetExtraCCVars()
    local Extra_Data = {}
    Extra_Data.extra_num = self:GetClientNumber("extra_num")
    Extra_Data.extra_bool = self:GetClientNumber("extra_bool") == 1
    return Extra_Data
end


TOOL.Renamed = {
    class = {
        air_tank = "storage_gas_o2",
        coolant_tank = "storage_liquid_water",
        energy_cell = "storage_energy",
        steam_tank = "storage_gas_steam",
        water_tank = "storage_liquid_water",
        hvywater_tank = "storage_liquid_hvywater"
    },
    type = {
        air_tank = "storage_gas_o2",
        coolant_tank = "storage_liquid_water",
        energy_cell = "storage_energy",
        steam_tank = "storage_gas_steam",
        water_tank = "storage_liquid_water",
        hvywater_tank = "storage_liquid_hvywater",
    },
}


--[[
    TOOL.AdminOnly             = true --Make the Stool admin only
    TOOL.EnableFunc  = function(ply) return true or false end (Optional)
    
    
    type = {
        type            = "entity type", --same as key (optional). typically same as class
        class            = "entity class", --entity class used by ents.Create() (optional if type is class)
        Name            = "Print Name used for device catagory in tool",
        legacy        = true, --if _WHOLE_ group contains _ONLY_ ents that are from orginal ls2 (optional) this is for old dupe saves that use model as a sub type
        hide            = true, --if this group should be hidden on the control panel (optional)
        
        MakeFunc        = function(tool, ply, Ang, Pos, type, sub_type, model, frozen, Extra_Data, devinfo) return ent end (optional)
        MakeFuncReturn    = true, --skips rest of make rd2 ent function and returns ent (optional)
        EnableFunc  = function(ply) return true or false end (Optional)
        func            = function(ent,type,sub_type,devinfo,Extra_Data,ent_extras) addres(ent) return mass, maxhealth end (optional)
        AdminOnly        = true/false --Make the Device group Admin only
        devices = {
            sub_type = {
                Name        = "Print Name for this sub_type in tool",
                type        = "entity class", can be different than group type (optional)
                class        = "entity class", --entity class used by ents.Create() (optional if type is class or if same as group.class or group.type)
                model        = "path/to/model",
                skin        = # for skin, (optional)
                res            = {coolant = 4000},
                EnableFunc  = function(ply) return true or false end (Optional)
                maxhealth    = 300,
                mass        = 20,
                legacy    = true, --if ent is from ls2 (optional)
                hide        = true, --if this sub_type should be hidden on the control panel (optional)
                ent_extras    = {}, --table of exra info to copy to ent (optional)
                AdminOnly        = true/false --Make the Device Admin only
            },
            sub_type = {
                Name        = "Print Name for this sub_type in tool",
                model        = "path/to/model",
                material    = "path/to/material", (optional)
                func        = function(ent,type,sub_type,devinfo,Extra_Data,ent_extras) addres(ent) return mass, maxhealth end (optional)
            },
        },
    },
]]


local function gas_tank_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 4084
    local base_mass = 10
    local base_health = 100
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    local res = ""
    if type == "storage_gas_o2" then
        res = "oxygen"
    elseif type == "storage_gas_h" then
        res = "hydrogen"
    elseif type == "storage_gas_n" then
        res = "nitrogen"
    elseif type == "storage_gas_co2" then
        res = "carbon dioxide"
    elseif type == "storage_gas_steam" then
        res = "steam"
    end
    ent.caf.custom.resource = res;
    CAF.GetAddon("Resource Distribution").AddResource(ent, res, math.Round(4600 * volume_mul))
    ent.MAXRESOURCE = math.Round(4600 * volume_mul)
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

local function energy_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 6021
    local base_mass = 5
    local base_health = 200
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    CAF.GetAddon("Resource Distribution").AddResource(ent, "energy", math.Round(3600 * volume_mul))
    ent.MAXRESOURCE = math.Round(3600 * volume_mul)
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

local function liquid_tank_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 4084
    local base_mass = 20
    local base_health = 150
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    CAF.GetAddon("Resource Distribution").AddResource(ent, "water", math.Round(3600 * volume_mul))
    ent.MAXRESOURCE = math.Round(3600 * volume_mul)
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

local function liquid_nitrogen_tank_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 4084
    local base_mass = 20
    local base_health = 200
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    CAF.GetAddon("Resource Distribution").AddResource(ent, "liquid nitrogen", math.Round(3000 * volume_mul))
    ent.MAXRESOURCE = math.Round(3000 * volume_mul)
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

local function hot_liquid_nitrogen_tank_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 4084
    local base_mass = 20
    local base_health = 200
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    CAF.GetAddon("Resource Distribution").AddResource(ent, "hot liquid nitrogen", math.Round(2500 * volume_mul))
    ent.MAXRESOURCE = math.Round(2500 * volume_mul)
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

local function heavywater_tank_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 4084
    local base_mass = 25
    local base_health = 180
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    CAF.GetAddon("Resource Distribution").AddResource(ent, "heavy water", math.Round(3600 * volume_mul))
    ent.MAXRESOURCE = math.Round(3600 * volume_mul)
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

local function cache_func(ent, type, sub_type, devinfo, Extra_Data, ent_extras)
    local volume_mul = 1
    local base_volume = 4084
    local base_mass = 50
    local base_health = 250
    local phys = ent:GetPhysicsObject()
    if phys:IsValid() and phys.GetVolume then
        local vol = phys:GetVolume()
        vol = math.Round(vol)
        volume_mul = vol / base_volume
    end
    CAF.GetAddon("Resource Distribution").AddResource(ent, "energy", math.Round(5500 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "oxygen", math.Round(6000 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "hydrogen", math.Round(3000 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "carbon dioxide", math.Round(5000 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "nitrogen", math.Round(7000 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "liquid nitrogen", math.Round(7000 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "water", math.Round(4000 * volume_mul))
    CAF.GetAddon("Resource Distribution").AddResource(ent, "heavy water", math.Round(360 * volume_mul))
    local mass = math.Round(base_mass * volume_mul)
    ent.mass = mass
    local maxhealth = math.Round(base_health * volume_mul)
    return mass, maxhealth
end

TOOL.Devices = {
    storage_gas_o2 = {
        Name = "Oxygen Tanks",
        type = "storage_gas_o2",
        class = "storage_gas",
        func = gas_tank_func,
        --EnableFunc = function() return false end,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 0,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 0,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 0,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 0,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 0,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 0,
                legacy = false,
            },
        },
    },
    storage_gas_co2 = {
        Name = "Carbon Dioxide Tanks",
        type = "storage_gas_co2",
        class = "storage_gas",
        func = gas_tank_func,
        devices = {
            small_phx = {
                --EnableFunc = function() return false end,
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 3,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 3,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 3,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 3,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 3,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 3,
                legacy = false,
            },
        },
    },
    storage_gas_h = {
        Name = "Hydrogen Tanks",
        type = "storage_gas_h",
        class = "storage_gas",
        func = gas_tank_func,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 2,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 2,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 2,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 2,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 2,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 2,
                legacy = false,
            },
        },
    },
    storage_gas_n = {
        Name = "Nitrogen Tanks",
        type = "storage_gas_n",
        class = "storage_gas",
        func = gas_tank_func,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 1,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 1,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 1,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 1,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 1,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 1,
                legacy = false,
            },
        },
    },
    storage_gas_steam = {
        Name = "Steam Tanks",
        type = "storage_gas_steam",
        class = "storage_gas_steam",
        func = gas_tank_func,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 5,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 5,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 5,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 5,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 5,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 5,
                legacy = false,
            },
        },
    },
    storage_liquid_water = {
        Name = "Water Tanks",
        type = "storage_liquid_water",
        class = "storage_liquid_water",
        func = liquid_tank_func,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 4,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 4,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 4,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 4,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 4,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 4,
                legacy = false,
            },
        },
    },
    storage_liquid_hvywater = {
        Name = "Heavy Water Tanks",
        type = "storage_liquid_hvywater",
        class = "storage_liquid_hvywater",
        func = heavywater_tank_func,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 6,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 6,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 6,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 6,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 6,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 6,
                legacy = false,
            },
        },
    },
    storage_energy = {
        Name = "Batteries",
        type = "storage_energy",
        class = "storage_energy",
        func = energy_func,
        devices = {
            small_phx = {
                Name = "Small (Phx)",
                model = "models/props_phx/life_support/battery_small.mdl",
                skin = 0,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium (Phx)",
                model = "models/props_phx/life_support/Battery_medium.mdl",
                skin = 0,
                legacy = false,
            },
            large_phx = {
                Name = "Large (Phx)",
                model = "models/props_phx/life_support/battery_large.mdl",
                skin = 0,
                legacy = false,
            },
        },
    },
    storage_cache = {
        Name = "Resource Caches",
        type = "storage_cache",
        func = cache_func,
        devices = {
            small = {
                Name = "CE Small",
                model = "models/ce_ls3additional/resource_cache/resource_cache_small.mdl",
            },
            medium = {
                Name = "CE Medium",
                model = "models/ce_ls3additional/resource_cache/resource_cache_medium.mdl",
            },
            large = {
                Name = "CE Large",
                model = "models/ce_ls3additional/resource_cache/resource_cache_large.mdl",
            },
            huge = {
                Name = "Levy Canister",
                model = "models/LifeSupport/Storage/CargoCanister.mdl",
            },
        },
    },
    storage_liquid_nitrogen = {
        Name = "Liquid Nitrogen Tanks",
        type = "storage_liquid_nitrogen",
        class = "storage_liquid_nitrogen",
        func = liquid_nitrogen_tank_func,
        devices = {
            small_phx = {
                Name = "Small Canister (Phx)",
                model = "models/props_phx/life_support/canister_small.mdl",
                skin = 7,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            small_phx2 = {
                Name = "Small Tank (Phx)",
                model = "models/props_phx/life_support/tank_small.mdl",
                skin = 7,
                legacy = false, --these two vars must be defined per ent as the old tanks (defined in external file) require different values
            },
            medium_phx = {
                Name = "Medium Canister (Phx)",
                model = "models/props_phx/life_support/canister_medium.mdl",
                skin = 7,
                legacy = false,
            },
            medium_phx2 = {
                Name = "Medium Tank (Phx)",
                model = "models/props_phx/life_support/tank_medium.mdl",
                skin = 7,
                legacy = false,
            },
            large_phx = {
                Name = "Large Canister (Phx)",
                model = "models/props_phx/life_support/canister_large.mdl",
                skin = 7,
                legacy = false,
            },
            large_phx2 = {
                Name = "Large Tank (Phx)",
                model = "models/props_phx/life_support/tank_large.mdl",
                skin = 7,
                legacy = false,
            },
            small = {
                Name = "CE Small",
                model = "models/ce_ls3additional/resource_cache/resource_cache_small.mdl",
            },
            medium = {
                Name = "CE Medium",
                model = "models/ce_ls3additional/resource_cache/resource_cache_medium.mdl",
            },
            large = {
                Name = "CE Large",
                model = "models/ce_ls3additional/resource_cache/resource_cache_large.mdl",
            },
            huge = {
                Name = "Levy Canister",
                model = "models/LifeSupport/Storage/CargoCanister.mdl",
            }
        },
    },
}