<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="rue">
	<id>https://wiki.kocky.cc/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AItem%2FVehicleItem</id>
	<title>Модуль:Item/VehicleItem - Історія едітовань</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kocky.cc/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AItem%2FVehicleItem"/>
	<link rel="alternate" type="text/html" href="https://wiki.kocky.cc/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Item/VehicleItem&amp;action=history"/>
	<updated>2026-04-04T02:30:52Z</updated>
	<subtitle>Історія едітовань той сторінкы на вікі</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://wiki.kocky.cc/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Item/VehicleItem&amp;diff=122&amp;oldid=prev</id>
		<title>Бетярь: 1 ревізія: Module:Common from StarCitizenTools</title>
		<link rel="alternate" type="text/html" href="https://wiki.kocky.cc/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Item/VehicleItem&amp;diff=122&amp;oldid=prev"/>
		<updated>2023-10-18T00:53:18Z</updated>

		<summary type="html">&lt;p&gt;1 ревізія: Module:Common from StarCitizenTools&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;rue&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Старша верзія&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Ревізія 02:53, 18 октовбра 2023&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wiki:diff::1.12:old-121:rev-122 --&gt;
&lt;/table&gt;</summary>
		<author><name>Бетярь</name></author>
	</entry>
	<entry>
		<id>https://wiki.kocky.cc/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Item/VehicleItem&amp;diff=121&amp;oldid=prev</id>
		<title>starcitizen&gt;Alistair3149 в 00:23, 30 юлія 2023</title>
		<link rel="alternate" type="text/html" href="https://wiki.kocky.cc/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Item/VehicleItem&amp;diff=121&amp;oldid=prev"/>
		<updated>2023-07-30T00:23:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require( &amp;#039;strict&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
local VehicleItem = {}&lt;br /&gt;
&lt;br /&gt;
local TNT = require( &amp;#039;Module:Translate&amp;#039; ):new()&lt;br /&gt;
local common = require( &amp;#039;Module:Common&amp;#039; )&lt;br /&gt;
local smwCommon = require( &amp;#039;Module:Common/SMW&amp;#039; )&lt;br /&gt;
local data = mw.loadJsonData( &amp;#039;Module:Item/VehicleItem/data.json&amp;#039; )&lt;br /&gt;
local config = mw.loadJsonData( &amp;#039;Module:Item/config.json&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Wrapper function for Module:Translate.translate&lt;br /&gt;
---&lt;br /&gt;
--- @param key string The translation key&lt;br /&gt;
--- @param addSuffix boolean Adds a language suffix if config.smw_multilingual_text is true&lt;br /&gt;
--- @return string If the key was not found in the .tab page, the key is returned&lt;br /&gt;
local function translate( key, addSuffix, ... )&lt;br /&gt;
    return TNT:translate( &amp;#039;Module:Item/VehicleItem/i18n.json&amp;#039;, config, key, addSuffix, {...} )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Retrieve the quantum drive modes&lt;br /&gt;
---&lt;br /&gt;
--- @param pageName string&lt;br /&gt;
--- @return table&lt;br /&gt;
local function loadQuantumDriveModes( pageName )&lt;br /&gt;
    local subobjects = mw.smw.ask( {&lt;br /&gt;
        &amp;#039;[[-Has subobject::&amp;#039; .. pageName .. &amp;#039;]]&amp;#039;,&lt;br /&gt;
        &amp;#039;[[&amp;#039; .. translate( &amp;#039;SMW_QuantumTravelType&amp;#039; ) .. &amp;#039;::+]]&amp;#039;,&lt;br /&gt;
        string.format( &amp;#039;?%s&amp;#039;, translate( &amp;#039;SMW_QuantumTravelType&amp;#039; ) ),&lt;br /&gt;
        string.format( &amp;#039;?%s&amp;#039;, translate( &amp;#039;SMW_QuantumTravelSpeed&amp;#039; ) ),&lt;br /&gt;
        string.format( &amp;#039;?%s&amp;#039;, translate( &amp;#039;SMW_CooldownTime&amp;#039; ) ),&lt;br /&gt;
        string.format( &amp;#039;?%s&amp;#039;, translate( &amp;#039;SMW_ChargeTime&amp;#039; ) ),&lt;br /&gt;
        &amp;#039;mainlabel=-&amp;#039;&lt;br /&gt;
    } )&lt;br /&gt;
    local modes = {}&lt;br /&gt;
&lt;br /&gt;
    -- FIXME: System and Planet travel can come in random order&lt;br /&gt;
    -- We need a way to ensure the order that is always system &amp;gt; planet&lt;br /&gt;
    for _, subobject in ipairs( subobjects ) do&lt;br /&gt;
        if subobject[ translate( &amp;#039;SMW_QuantumTravelType&amp;#039; ) ] then&lt;br /&gt;
            table.insert( modes, subobject )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return modes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Adds the properties valid for this item to the SMW Set object&lt;br /&gt;
---&lt;br /&gt;
--- @param smwSetObject table&lt;br /&gt;
function VehicleItem.addSmwProperties( apiData, frameArgs, smwSetObject )&lt;br /&gt;
    smwCommon.addSmwProperties(&lt;br /&gt;
        apiData,&lt;br /&gt;
        frameArgs,&lt;br /&gt;
        smwSetObject,&lt;br /&gt;
        translate,&lt;br /&gt;
        config,&lt;br /&gt;
        data,&lt;br /&gt;
        &amp;#039;Item/VehicleItem&amp;#039;&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    local setData = {}&lt;br /&gt;
&lt;br /&gt;
    local function setModifiers( modifiers )&lt;br /&gt;
        if modifiers == nil or type( modifiers ) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
            return&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        for _, modifier in pairs( modifiers ) do&lt;br /&gt;
            local name = modifier.display_name or &amp;#039;&amp;#039;&lt;br /&gt;
            name = &amp;#039;SMW_Modifier&amp;#039; .. name:gsub( &amp;#039; &amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
            if translate( name ) ~= nil then&lt;br /&gt;
                local value&lt;br /&gt;
                if modifier.name == &amp;#039;size&amp;#039; then&lt;br /&gt;
                    value = modifier.value&lt;br /&gt;
                else&lt;br /&gt;
                    value = string.gsub( modifier.value, &amp;#039;%%&amp;#039;, &amp;#039;&amp;#039; ) / 100&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                setData[ translate( name ) ] = value&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    setModifiers( apiData:get( &amp;#039;mining_laser.modifiers&amp;#039; ) )&lt;br /&gt;
    setModifiers( apiData:get( &amp;#039;mining_module.modifiers&amp;#039; ) )&lt;br /&gt;
&lt;br /&gt;
    mw.smw.set( setData )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Adds all SMW parameters set by this Module to the ASK object&lt;br /&gt;
---&lt;br /&gt;
--- @param smwAskObject table&lt;br /&gt;
--- @return void&lt;br /&gt;
function VehicleItem.addSmwAskProperties( smwAskObject )&lt;br /&gt;
    smwCommon.addSmwAskProperties(&lt;br /&gt;
        smwAskObject,&lt;br /&gt;
        translate,&lt;br /&gt;
        config,&lt;br /&gt;
        data&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Adds entries to the infobox&lt;br /&gt;
---&lt;br /&gt;
--- @param infobox table The Module:InfoboxNeue instance&lt;br /&gt;
--- @param smwData table Data from Semantic MediaWiki&lt;br /&gt;
--- @return void&lt;br /&gt;
function VehicleItem.addInfoboxData( infobox, smwData, itemPageIdentifier )&lt;br /&gt;
    local tabber = require( &amp;#039;Module:Tabber&amp;#039; ).renderTabber&lt;br /&gt;
    local tabberData = {}&lt;br /&gt;
    local section&lt;br /&gt;
&lt;br /&gt;
    -- Cooler&lt;br /&gt;
    if smwData[ translate( &amp;#039;SMW_CoolingRate&amp;#039; ) ] then&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_CoolingRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_CoolingRate&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    -- EMP Generator&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_EMPRadius&amp;#039; ) ] then&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_EMPRadius&amp;#039; ), smwData[ translate( &amp;#039;SMW_EMPRadius&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ChargeTime&amp;#039; ), smwData[ translate( &amp;#039;SMW_ChargeTime&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_CooldownTime&amp;#039; ), smwData[ translate( &amp;#039;SMW_CooldownTime&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_Duration&amp;#039; ), smwData[ translate( &amp;#039;SMW_Duration&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    -- Power Plant&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_PowerOutput&amp;#039; ) ] then&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_PowerOutput&amp;#039; ), smwData[ translate( &amp;#039;SMW_PowerOutput&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    -- Quantum Drive&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_QuantumFuelRequirement&amp;#039; ) ] then&lt;br /&gt;
        local function getQuantumDriveModesSection()&lt;br /&gt;
            local modes = loadQuantumDriveModes( itemPageIdentifier )&lt;br /&gt;
&lt;br /&gt;
            if type( modes ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
                local modeTabberData = {}&lt;br /&gt;
                local modeCount = 1&lt;br /&gt;
&lt;br /&gt;
                for _, mode in ipairs( modes ) do&lt;br /&gt;
                    modeTabberData[ &amp;#039;label&amp;#039; .. modeCount ] = translate( mode[ translate( &amp;#039;SMW_QuantumTravelType&amp;#039; ) ] )&lt;br /&gt;
                    section = {&lt;br /&gt;
                        infobox:renderItem( translate( &amp;#039;LBL_QuantumTravelSpeed&amp;#039; ), mode[ translate( &amp;#039;SMW_QuantumTravelSpeed&amp;#039; ) ] ),&lt;br /&gt;
                        infobox:renderItem( translate( &amp;#039;LBL_CooldownTime&amp;#039; ), mode[ translate( &amp;#039;SMW_CooldownTime&amp;#039; ) ] ),&lt;br /&gt;
                        infobox:renderItem( translate( &amp;#039;LBL_ChargeTime&amp;#039; ), mode[ translate( &amp;#039;SMW_ChargeTime&amp;#039; ) ] )&lt;br /&gt;
                    }&lt;br /&gt;
                    modeTabberData[ &amp;#039;content&amp;#039; .. modeCount ] = infobox:renderSection( { content = section, col = 3 }, true )&lt;br /&gt;
                    modeCount = modeCount + 1&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                return infobox:renderSection( {&lt;br /&gt;
                    title = translate( &amp;#039;LBL_Modes&amp;#039; ),&lt;br /&gt;
                    class = &amp;#039;infobox__section--tabber&amp;#039;,&lt;br /&gt;
                    content = tabber( modeTabberData ),&lt;br /&gt;
                    border = false&lt;br /&gt;
                }, true )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_QuantumFuelRequirement&amp;#039; ), smwData[ translate( &amp;#039;SMW_QuantumFuelRequirement&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_QuantumTravelDisconnectRange&amp;#039; ), smwData[ translate( &amp;#039;SMW_QuantumTravelDisconnectRange&amp;#039; ) ] )&lt;br /&gt;
            -- Does range matter currently? The range seems to be limited by the QF fuel tank of the vehicle anyways&lt;br /&gt;
            --infobox:renderItem( translate( &amp;#039;LBL_QuantumTravelRange&amp;#039; ), smwData[ translate( &amp;#039;SMW_QuantumTravelRange&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true ) .. getQuantumDriveModesSection()&lt;br /&gt;
    -- Quantum Enforcement Device&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_JammerRange&amp;#039; ) ] then&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_JammerRange&amp;#039; ), smwData[ translate( &amp;#039;SMW_JammerRange&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_InterdictionRange&amp;#039; ), smwData[ translate( &amp;#039;SMW_InterdictionRange&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_Duration&amp;#039; ), smwData[ translate( &amp;#039;SMW_Duration&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ChargeTime&amp;#039; ), smwData[ translate( &amp;#039;SMW_ChargeTime&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_CooldownTime&amp;#039; ), smwData[ translate( &amp;#039;SMW_CooldownTime&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    -- Shield&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_ShieldHealthPoint&amp;#039; ) ] then&lt;br /&gt;
        -- We need raw number from SMW to calculate shield regen, so we add the unit back&lt;br /&gt;
        local function getShieldPoint()&lt;br /&gt;
            if smwData[ translate( &amp;#039;SMW_ShieldHealthPoint&amp;#039; ) ] == nil then return end&lt;br /&gt;
            return common.formatNum( math.ceil( smwData[ translate( &amp;#039;SMW_ShieldHealthPoint&amp;#039; ) ] ) ) .. &amp;#039; 🛡️&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local function getShieldRegen()&lt;br /&gt;
            if smwData[ translate( &amp;#039;SMW_ShieldPointRegeneration&amp;#039; ) ] == nil then return end&lt;br /&gt;
            if smwData[ translate( &amp;#039;SMW_ShieldHealthPoint&amp;#039; ) ] == nil then return smwData[ translate( &amp;#039;SMW_ShieldPointRegeneration&amp;#039; ) ] end&lt;br /&gt;
&lt;br /&gt;
            local fullChargeTime = math.ceil( smwData[ translate( &amp;#039;SMW_ShieldHealthPoint&amp;#039; ) ] / smwData[ translate( &amp;#039;SMW_ShieldPointRegeneration&amp;#039; ) ] )&lt;br /&gt;
&lt;br /&gt;
            return infobox.showDescIfDiff(&lt;br /&gt;
                common.formatNum( math.ceil( smwData[ translate( &amp;#039;SMW_ShieldPointRegeneration&amp;#039; ) ] ) ) .. &amp;#039; 🛡️/s&amp;#039;,&lt;br /&gt;
                translate( &amp;#039;unit_secondtillfull&amp;#039;, false, fullChargeTime )&lt;br /&gt;
            )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local function getShieldRegenDelay()&lt;br /&gt;
            if smwData[ translate( &amp;#039;SMW_ShieldDownTime&amp;#039; ) ] == nil or smwData[ translate( &amp;#039;SMW_ShieldDamageDelay&amp;#039; ) ] == nil then return end&lt;br /&gt;
            return infobox.showDescIfDiff(&lt;br /&gt;
                smwData[ translate( &amp;#039;SMW_ShieldDamageDelay&amp;#039; ) ],&lt;br /&gt;
                translate( &amp;#039;unit_whendown&amp;#039;, false, smwData[ translate( &amp;#039;SMW_ShieldDownTime&amp;#039; ) ] )&lt;br /&gt;
            )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ShieldHealthPoint&amp;#039; ), getShieldPoint() ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ShieldPointRegeneration&amp;#039; ), getShieldRegen() ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ShieldRegenDelay&amp;#039; ), getShieldRegenDelay() )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
&lt;br /&gt;
        -- TODO: Add on API&lt;br /&gt;
        --infobox:renderSection( {&lt;br /&gt;
        --    title = translate( &amp;#039;LBL_Resistances&amp;#039; ),&lt;br /&gt;
        --    col = 3,&lt;br /&gt;
        --    content = {&lt;br /&gt;
        --        infobox:renderItem( translate( &amp;#039;LBL_ShieldPhysicalResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ShieldPhysicalResistance&amp;#039; ) ] ),&lt;br /&gt;
        --        infobox:renderItem( translate( &amp;#039;LBL_ShieldEnergyResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ShieldEnergyResistance&amp;#039; ) ] ),&lt;br /&gt;
        --        infobox:renderItem( translate( &amp;#039;LBL_ShieldDistortionResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ShieldDistortionResistance&amp;#039; ) ] ),&lt;br /&gt;
        --&lt;br /&gt;
        --        infobox:renderItem( translate( &amp;#039;LBL_ShieldThermalResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ShieldThermalResistance&amp;#039; ) ] ),&lt;br /&gt;
        --        infobox:renderItem( translate( &amp;#039;LBL_ShieldBiochemicalResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ShieldBiochemicalResistance&amp;#039; ) ] ),&lt;br /&gt;
        --        infobox:renderItem( translate( &amp;#039;LBL_ShieldStunResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ShieldStunResistance&amp;#039; ) ] ),&lt;br /&gt;
        --    }&lt;br /&gt;
        --} )&lt;br /&gt;
    -- Missile launcher&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_MissileCount&amp;#039; ) ] then&lt;br /&gt;
        --- NOTE: Should we just set the size SMW property to type:quantity, then prefix the S as a unit?&lt;br /&gt;
        local function getMissileSize()&lt;br /&gt;
            if smwData[ translate( &amp;#039;SMW_MissileSize&amp;#039; ) ] == nil then return end&lt;br /&gt;
            return &amp;#039;S&amp;#039; .. smwData[ translate( &amp;#039;SMW_MissileSize&amp;#039; ) ]&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_MissileCount&amp;#039; ), smwData[ translate( &amp;#039;SMW_MissileCount&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_MissileSize&amp;#039; ), getMissileSize() )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    -- Mining Laser&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_MiningLaserPower&amp;#039; ) ] then&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_MiningLaserPower&amp;#039; ), smwData[ translate( &amp;#039;SMW_MiningLaserPower&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ExtractionLaserPower&amp;#039; ), smwData[ translate( &amp;#039;SMW_ExtractionLaserPower&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_OptimalRange&amp;#039; ), smwData[ translate( &amp;#039;SMW_OptimalRange&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_MaximumRange&amp;#039; ), smwData[ translate( &amp;#039;SMW_MaximumRange&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ExtractionThroughput&amp;#039; ), smwData[ translate( &amp;#039;SMW_ExtractionThroughput&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModuleSlots&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModuleSlots&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
&lt;br /&gt;
        tabberData[ &amp;#039;label2&amp;#039; ] = translate( &amp;#039;LBL_Modifiers&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierCatastrophicChargeRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierCatastrophicChargeRate&amp;#039; ) ] ),&lt;br /&gt;
            --infobox:renderItem( translate( &amp;#039;LBL_ModifierExtractionLaserPower&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierExtractionLaserPower&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierLaserInstability&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierLaserInstability&amp;#039; ) ] ),&lt;br /&gt;
            --infobox:renderItem( translate( &amp;#039;LBL_ModifierMiningLaserPower&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierMiningLaserPower&amp;#039; ) ] ),&lt;br /&gt;
            --infobox:renderItem( translate( &amp;#039;LBL_ModifierOptimalChargeWindowSize&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierOptimalChargeWindowSize&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierInertMaterials&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierInertMaterials&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierOptimalChargeRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierOptimalChargeRate&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierResistance&amp;#039; ) ] ),&lt;br /&gt;
            --infobox:renderItem( translate( &amp;#039;LBL_ModifierShatterDamage&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierShatterDamage&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierSize&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierSize&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content2&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    -- Mining Module&lt;br /&gt;
    -- FIXME: Need a better way to handle this since SMW_Uses is a generic property across consumables&lt;br /&gt;
    elseif smwData[ translate( &amp;#039;SMW_Uses&amp;#039; ) ] then&lt;br /&gt;
        -- Overview&lt;br /&gt;
        tabberData[ &amp;#039;label1&amp;#039; ] = translate( &amp;#039;LBL_Overview&amp;#039; )&lt;br /&gt;
        section = {&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_Uses&amp;#039; ), smwData[ translate( &amp;#039;SMW_Uses&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_Duration&amp;#039; ), smwData[ translate( &amp;#039;SMW_Duration&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierCatastrophicChargeRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierCatastrophicChargeRate&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierExtractionLaserPower&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierExtractionLaserPower&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierLaserInstability&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierLaserInstability&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierMiningLaserPower&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierMiningLaserPower&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierOptimalChargeWindowSize&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierOptimalChargeWindowSize&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierInertMaterials&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierInertMaterials&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierOptimalChargeRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierOptimalChargeRate&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierResistance&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierResistance&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierShatterDamage&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierShatterDamage&amp;#039; ) ] ),&lt;br /&gt;
            infobox:renderItem( translate( &amp;#039;LBL_ModifierSize&amp;#039; ), smwData[ translate( &amp;#039;SMW_ModifierSize&amp;#039; ) ] )&lt;br /&gt;
        }&lt;br /&gt;
        tabberData[ &amp;#039;content1&amp;#039; ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Get the index of the last tab&lt;br /&gt;
    local tabCount = 0&lt;br /&gt;
    for _, __ in pairs( tabberData ) do&lt;br /&gt;
        tabCount = tabCount + 1&lt;br /&gt;
    end&lt;br /&gt;
    tabCount = tabCount / 2&lt;br /&gt;
&lt;br /&gt;
    -- Engineering&lt;br /&gt;
    -- TODO: Make temperatures into a graph?&lt;br /&gt;
    -- FIXME: Instead of hardcoding the unit, can we use SMW query to get the unit?&lt;br /&gt;
    tabCount = tabCount + 1&lt;br /&gt;
    tabberData[ &amp;#039;label&amp;#039; .. tabCount ] = translate( &amp;#039;LBL_Engineering&amp;#039; )&lt;br /&gt;
    section = {&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_PowerDraw&amp;#039; ), infobox.addUnitIfExists( infobox.formatRange( smwData[ translate( &amp;#039;SMW_MinimumPowerDraw&amp;#039; ) ], smwData[ translate( &amp;#039;SMW_MaximumPowerDraw&amp;#039; ) ], true ), &amp;#039;⚡/s&amp;#039; ) ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_ThermalEnergyOutput&amp;#039; ), infobox.addUnitIfExists( infobox.formatRange( smwData[ translate( &amp;#039;SMW_MinimumThermalEnergyOutput&amp;#039; ) ], smwData[ translate( &amp;#039;SMW_MaximumThermalEnergyOutput&amp;#039; ) ], true ), &amp;#039;🌡️/s&amp;#039; ) ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_MaximumCoolingRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_MaximumCoolingRate&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_StartCoolingTemperature&amp;#039; ), smwData[ translate( &amp;#039;SMW_StartCoolingTemperature&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_Temperature&amp;#039; ), infobox.addUnitIfExists( infobox.formatRange( smwData[ translate( &amp;#039;SMW_MinimumTemperature&amp;#039; ) ], smwData[ translate( &amp;#039;SMW_MaximumTemperature&amp;#039; ) ], true ), &amp;#039;°C&amp;#039; ) ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_MisfireTemperature&amp;#039; ), infobox.addUnitIfExists( infobox.formatRange( smwData[ translate( &amp;#039;SMW_MinimumMisfireTemperature&amp;#039; ) ], smwData[ translate( &amp;#039;SMW_MaximumMisfireTemperature&amp;#039; ) ], true ), &amp;#039;°C&amp;#039; ) ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_OverheatTemperature&amp;#039; ), smwData[ translate( &amp;#039;SMW_OverheatTemperature&amp;#039; ) ] )&lt;br /&gt;
    }&lt;br /&gt;
    tabberData[ &amp;#039;content&amp;#039; .. tabCount ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
&lt;br /&gt;
    -- Emission&lt;br /&gt;
    local function getMaxIR()&lt;br /&gt;
        if smwData[ translate( &amp;#039;SMW_IRTemperatureThreshold&amp;#039; ) ] == nil or smwData[ translate( &amp;#039;SMW_TemperatureToIR&amp;#039; ) ] == nil and smwData[ translate( &amp;#039;SMW_MinimumIR&amp;#039; ) ] == nil then return end&lt;br /&gt;
        return smwData[ translate( &amp;#039;SMW_IRTemperatureThreshold&amp;#039; ) ] * smwData[ translate( &amp;#039;SMW_TemperatureToIR&amp;#039; ) ] + smwData[ translate( &amp;#039;SMW_MinimumIR&amp;#039; ) ]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tabCount = tabCount + 1&lt;br /&gt;
    tabberData[ &amp;#039;label&amp;#039; .. tabCount ] = translate( &amp;#039;LBL_Emission&amp;#039; )&lt;br /&gt;
    section = {&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_EM&amp;#039; ), infobox.formatRange( smwData[ translate( &amp;#039;SMW_MinimumEM&amp;#039; ) ], smwData[ translate( &amp;#039;SMW_MaximumEM&amp;#039; ) ], true ) ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_PowerToEM&amp;#039; ), smwData[ translate( &amp;#039;SMW_PowerToEM&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_EMDecayRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_EMDecayRate&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_IR&amp;#039; ), infobox.formatRange( smwData[ translate( &amp;#039;SMW_MinimumIR&amp;#039; ) ], getMaxIR(), true ) ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_TemperatureToIR&amp;#039; ), smwData[ translate( &amp;#039;SMW_TemperatureToIR&amp;#039; ) ] )&lt;br /&gt;
    }&lt;br /&gt;
    tabberData[ &amp;#039;content&amp;#039; .. tabCount ] = infobox:renderSection( { content = section, col = 3 }, true )&lt;br /&gt;
&lt;br /&gt;
    -- Defense&lt;br /&gt;
    tabCount = tabCount + 1&lt;br /&gt;
    tabberData[ &amp;#039;label&amp;#039; .. tabCount ] = translate( &amp;#039;LBL_Defense&amp;#039; )&lt;br /&gt;
    section = {&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_Health&amp;#039; ), smwData[ translate( &amp;#039;SMW_HealthPoint&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_DistortionHealthPoint&amp;#039; ), smwData[ translate( &amp;#039;SMW_DistortionHealthPoint&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_DistortionDecayRate&amp;#039; ), smwData[ translate( &amp;#039;SMW_DistortionDecayRate&amp;#039; ) ] ),&lt;br /&gt;
        infobox:renderItem( translate( &amp;#039;LBL_DistortionDecayDelay&amp;#039; ), smwData[ translate( &amp;#039;SMW_DistortionDecayDelay&amp;#039; ) ] )&lt;br /&gt;
    }&lt;br /&gt;
    tabberData[ &amp;#039;content&amp;#039; .. tabCount ] = infobox:renderSection( { content = section, col = 2 }, true )&lt;br /&gt;
&lt;br /&gt;
    -- Dimensions&lt;br /&gt;
    --tabberData[ &amp;#039;label&amp;#039; .. tabCount ] = translate( &amp;#039;LBL_Dimensions&amp;#039; )&lt;br /&gt;
    --section = {&lt;br /&gt;
    --    infobox:renderItem( {&lt;br /&gt;
    --        label = translate( &amp;#039;LBL_Length&amp;#039; ),&lt;br /&gt;
    --        data = smwData[ translate( &amp;#039;SMW_EntityLength&amp;#039; ) ],&lt;br /&gt;
    --    } ),&lt;br /&gt;
    --    infobox:renderItem( {&lt;br /&gt;
    --        label = translate( &amp;#039;LBL_Width&amp;#039; ),&lt;br /&gt;
    --        data = smwData[ translate( &amp;#039;SMW_EntityWidth&amp;#039; ) ],&lt;br /&gt;
    --    } ),&lt;br /&gt;
    --    infobox:renderItem( {&lt;br /&gt;
    --        label = translate( &amp;#039;LBL_Height&amp;#039; ),&lt;br /&gt;
    --        data = smwData[ translate( &amp;#039;SMW_EntityHeight&amp;#039; ) ],&lt;br /&gt;
    --    } ),&lt;br /&gt;
    --    infobox:renderItem( {&lt;br /&gt;
    --        label = translate( &amp;#039;LBL_Mass&amp;#039; ),&lt;br /&gt;
    --        data = smwData[ translate( &amp;#039;SMW_Mass&amp;#039; ) ],&lt;br /&gt;
    --    } )&lt;br /&gt;
    --}&lt;br /&gt;
    --tabberData[ &amp;#039;content&amp;#039; .. tabCount ] = infobox:renderSection( { content = section, col = 3 }, true )&lt;br /&gt;
&lt;br /&gt;
    infobox:renderSection( {&lt;br /&gt;
		class = &amp;#039;infobox__section--tabber&amp;#039;,&lt;br /&gt;
		content = tabber( tabberData ),&lt;br /&gt;
        border = false&lt;br /&gt;
	} )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Add categories that are set on the page.&lt;br /&gt;
--- The categories table should only contain category names, no MW Links, i.e. &amp;#039;Foo&amp;#039; instead of &amp;#039;[[Category:Foo]]&amp;#039;&lt;br /&gt;
---&lt;br /&gt;
--- @param categories table The categories table&lt;br /&gt;
--- @param frameArgs table Frame arguments from Module:Arguments&lt;br /&gt;
--- @param smwData table Data from Semantic MediaWiki&lt;br /&gt;
--- @return void&lt;br /&gt;
function VehicleItem.addCategories( categories, frameArgs, smwData )&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Set the short description for this object&lt;br /&gt;
---&lt;br /&gt;
--- @param shortdesc string Short description&lt;br /&gt;
--- @param frameArgs table Frame arguments from Module:Arguments&lt;br /&gt;
--- @param smwData table Data from Semantic MediaWiki&lt;br /&gt;
--- @return void&lt;br /&gt;
function VehicleItem.getShortDescription( shortdesc, frameArgs, smwData )&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return VehicleItem&lt;/div&gt;</summary>
		<author><name>starcitizen&gt;Alistair3149</name></author>
	</entry>
</feed>