Truth Nuke

From the Garry's Mod Factions Wiki
Revision as of 03:45, 14 January 2026 by Astronautical (talk | contribs) ([Auto] Spelling/grammar/formatting fixes., typos fixed: March 4, 2024 → March 4, 2024,)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search








Imperial Alliance Members Involved
BluemetaknightSteam Profile
BREACHER/2SPROCKETSteam Profile
RatakisSteam Profile
DuffSteam Profile
ComputerationSteam Profile


Truth Nuke is an exposé produced by the Cerulean Taskforce in the form of a YouTube video during early 2024. It spanned several skirmishes during the period of February 15, 2024 to March 4, 2024, between the Kestrel-Astria Treaty Organization and the Imperial Alliance. The video exposed that several members of the Imperial Alliance were found to be producing and/or knowingly using technology which abused exploits in ACF-3, and several others did not care it was happening. The video ultimately led to the internal fracturing of the alliance, and later its dissolution after The Imperium and the Cerulean Taskforce worked together in a second exposé named Truth Meteor.

Prelude

On May 7, 2023, the Yakugirian leader CRISIS asked one of his members, BREACHER, to help him set up YSR's T-80BVM. Unknowingly to CRISIS, BREACHER installed a chip on the T-80BVM called "ABS." This is the first time the chip was seen on production vehicles, although previous members/affiliates of the Imperial Alliance attest it was used even earlier than this. The chips purpose is to apply external non-ACF forces to the tank for the purpose of stabilization. Chips that apply external force to a contraption are against most faction and server rulesets when used outside of rare exceptions (aircraft, for example, due to the fact there's no practical alternative at the moment). The chip also set wheel inertia to further assist in stabilization.

The declaration of war given by Bluemetaknight on July 15th, 2023

At the same time that this was happening, the Cerulean Taskforce and its allies were attempting to start a faction-combat server named "Biden's Hair," while also attempting to work with the Imperial Alliance on an agreed upon ruleset, despite their previous behavior strongly discouraging an attempt to work together. The extents of their cheating - notably, during these attempts at good faith discussions - were not known until post-exposé. On July 15, 2023, conflicts between the Imperial Alliance and the Kestrel-Astria Treaty Organization had come to a head. The Biden's Hair ruleset discussions, partially due to some aggression from KATO members during the talks, and some actions of lower-KATO members, had started to fall apart. Subsequently, Bluemetaknight announced that he was no longer interested in discussions.

The conflicts spanning the next twelve days are undocumented for the most part, with the exception of the final conflict on July 27, 2023. During the conflicts, the Cerulean Taskforce was developing their first iteration of their scanners. These were developed both because of the conflicts, and because it was believed that the Imperial Alliance never wanted Biden's Hair to work out, and were just waiting until they could find a way to blame KATO and justify escalation. These prototype scanners discovered that Bluemetaknight and BREACHER were using not solid seats, and although they claimed at the time it was accidental, conflicts ceased soon after. It was also discovered that one variant of the VTOL had two seats on it, but it was unknown at the time if this was anything of significance. Plausible deniability led to people initially believing this was some sort of multi-role setup, but it was later admitted by Bluemetaknight its intention was to game K/D ratios.

February 15th, 2024

On February 15, 2024, around 9:30 PM PST, Bluemetaknight, BREACHER, and Ratakis were noticed on Valen Sandbox by Captain Cancer and March, both being Cerulean Taskforce directors. Notably, Computeration was also on, but went unnoticed. Captain Cancer joined at 9:38 PM, with March following shortly after, at 9:44 PM. Immediately out of the gate, the first instance of illegal technology in play was recorded at 9:51 PM by Bluemetaknight. While it was not noticed at the time, recordings show a fuel tank under the map following his tank. The scanner at this stage was very primitive, and publicly available as the Cerulean Taskforce wanted to encourage transparency in faction combat - both factors likely contributed to the under-the-map fuel going unnoticed. The conflict ended with March disconnecting at 10:38 PM, and with Bluemetanight/BREACHER disconnecting at the same time at 10:59 PM. March immediately began work on more in-depth scanners.

February–March 2024

(NOTE: still work to do in separating these out into their own individual days)

On February 24, Phil_2014, a non-KATO member at the time, joined a Modrik voice channel during a battle and witnessed a large argument between Crisis and other Modrik members over personal matters. After Crisis left, Xgonn (AKA Fabinot) resurrected the Imperial Alliance the same day. Phil was then contacted by March, the leader of the Cerulean Taskforce, and introduced to a private group chat with other KATO members to share his findings from spying on IA. Over the next few days, Phil secretly recorded IA voice channels and their streams during battles against KATO.

During a review of the footage Phil captured, it was discovered that the Phucat, the main battle tank produced by Bluemetaknight, was using a microscopic nano_compare seat to make the driver nearly invulnerable. It was also found to be using the ABS chip that was seen on Crisis' T-80BVM and BREACHER's Big Ounce, a recreation of the ISA Thumper tank.

References

ABS

This is the source code for ABS, coded by Bluemetaknight.

--@name ABS V2
--@author
--@server
--@model models/cheeze/wires/nano_chip.mdl

wire.adjustPorts({Active = 'number',A = 'number',D = 'number',Base = 'entity', I = "entity",II = "entity",III = "entity",IV = "entity", ZAxis = 'entity', ZAxisPar = 'entity', LGB = 'entity', RGB = 'entity'},{Weld = 'number', RBrakeMod = 'number', LBrakeMod = 'number'})

local function filter(ent) return ent:getOwner() != owner() end
local function filter2(ent) return ent:getOwner() == owner() end

local Base = wire.ports.Base
local Core = 0
local Up = Vector(0,0,1)

local LG = wire.ports.LGB
local RG = wire.ports.RGB

local last_think = timer.curtime()
local last_pos = Base:getPos()
local HoloLastYaw = 0

local ZAxis = wire.ports.ZAxis
local ZAxisPar = wire.ports.ZAxisPar
constraint.breakType(ZAxisPar,"AdvBallsocket")
local Inertia = 1
local Multi = 10000

local UseConst = 1 --Experimental oversteer correction. Bugs outsomtimes and locks your yaw. Use at your own risk.

if UseConst == 1 then
    ConstFric = 66666
    Const = constraint.ballsocketadv(ZAxis, ZAxisPar, nil, nil, Vector(), Vector(), nil, nil, Vector(-360), Vector(360), Vector(ConstFric),true)
end

local Pod = wire.ports.Pod
local LG = wire.ports.LGB
local RG = wire.ports.RGB

Wheels=find.byModel("models/sprops/trans/wheel_f/f_wheel50.mdl",filter2)
for i, v in ipairs(Wheels) do
    if v:isValid()==true then
        v:setInertia(Vector(13.85,9.83,9.83))
        v:setCollisionGroup(1)
    end
end
timer.create("Link", 0.5, 0, function()
    RG:acfLinkTo(wire.ports.III,false)
    LG:acfLinkTo(wire.ports.II,false)
end)

if UseConst == 1 then
    hook.add( "input", "", function(name,value)
        if name == "A" then
            if value == 1 then
                if Const:isValid() then
                    Const:remove()
                end
                Const = constraint.ballsocketadv(ZAxis, ZAxisPar, nil, nil, Vector(), Vector(), nil, nil, Vector(-360), Vector(360), Vector(0),true)
            elseif value == 0 then
                if Const:isValid() then
                    Const:remove()
                end
                Const = constraint.ballsocketadv(ZAxis, ZAxisPar, nil, nil, Vector(), Vector(), nil, nil, Vector(-360), Vector(360), Vector(ConstFric),true)
            end
        elseif name == "D" then
            if value == 1 then
                if Const:isValid() then
                    Const:remove()
                end
                Const = constraint.ballsocketadv(ZAxis, ZAxisPar, nil, nil, Vector(), Vector(), nil, nil, Vector(-360), Vector(360), Vector(0),true)
            elseif value == 0 then
                if Const:isValid() then
                    Const:remove()
                end
                Const = constraint.ballsocketadv(ZAxis, ZAxisPar, nil, nil, Vector(), Vector(), nil, nil, Vector(-360), Vector(360), Vector(ConstFric),true)
            end
        end
    end)
end
hook.add("Think","",function()

    local delta_t = timer.curtime() - last_think
    last_think = timer.curtime()

    local Active = wire.ports.Active
    local MPH = (wire.ports.Base:getVelocity():getLength()*0.75) * (3600 / 63360)
    if Active == 1 then
        Core = Core + 1
        if Core == 10 then
            local t = trace.trace(Base:getPos(), Base:getPos()+Vector(0,0,-500), filter)
            Base:setCollisionGroup(1)
            Up = t.HitNormal
            if Up == Vector() then Up = Vector(0,0,1) end
            Core = 0
        end

        local Forward = Base:getForward()

        local WorldForward = Forward:setZ(0)
        local Velocity = Base:getVelocity():getNormalized():setZ(0)
        local Cross = WorldForward:cross(Velocity).z
        local ForceDir = Forward:cross(Up)

        local Dot = WorldForward:dot(Velocity)
        local Ang = math.acos(Dot)*(180/math.pi)*math.sign(Cross)

        wire.ports.RBrakeMod = (-Ang)*0.5
        wire.ports.LBrakeMod = (Ang)*0.5

        if wire.ports.A == 1 or wire.ports.D == 1 then
            Inertia = 0
            ZAxis:setInertia(Vector(250))
            wire.ports.Weld = 0
        elseif Inertia <= 1 then
            Inertia = math.clamp(Inertia+0.15,0,1)
            ZAxis:setInertia(Vector(250+(Inertia*Multi)))
            wire.ports.Weld = 1
        end
        if MPH > 5  then
            wire.ports.I:applyForceCenter((1+(math.clamp(Cross,0,10)*15))*Vector(0,0,-10)*wire.ports.I:getMass())
            wire.ports.II:applyForceCenter((1+(math.clamp(Cross,0,10)*15))*Vector(0,0,-10)*wire.ports.II:getMass())
            wire.ports.III:applyForceCenter((1+(math.clamp(-Cross,0,10)*15))*Vector(0,0,-10)*wire.ports.III:getMass())
            wire.ports.IV:applyForceCenter((1+(math.clamp(-Cross,0,10)*15))*Vector(0,0,-10)*wire.ports.IV:getMass())
        end
    end
end)