Files
call-of-duty-tdm/lua/weapons/mg_base/modules/shared/sh_datatables.lua
2026-03-30 10:39:52 +03:00

130 lines
4.7 KiB
Lua

AddCSLuaFile()
require("mw_utils")
--name, int
SWEP.NetworkedFlags = {}
SWEP.NetworkedFlagIndices = {}
local function getFlagIndex(networkedFlag)
return math.floor(networkedFlag / 31)
end
local function getFlagValue(networkedFlag)
return 2 ^ (networkedFlag % 31)
end
--flag networking. using string literals as it's easier to add flags for custom functionality
--and lua takes care of them for us anyways
local function networkFlag(weapon, name)
local highestFlagValue = table.Count(weapon.NetworkedFlags)
local currentFlagIndex = getFlagIndex(highestFlagValue)
--have to do 31 because it's signed int
if (highestFlagValue % 31 == 0) then
weapon:CustomNetworkVar("Int", "Flags"..currentFlagIndex)
weapon.NetworkedFlagIndices[currentFlagIndex] = "Flags"..currentFlagIndex
mw_utils.DevPrint("networkFlag: Registered new set of flags (Flags"..currentFlagIndex..").")
end
weapon.NetworkedFlags[name] = highestFlagValue
end
SWEP.VarCount = {}
function SWEP:CustomNetworkVar(typ, name)
if (typ == "Flag") then
networkFlag(self, name)
return
end
local count = self.VarCount[typ] || -1
count = count + 1
self:NetworkVar(typ, count, name)
self.VarCount[typ] = count
end
--i've decided to not check if a flag name exists. if you're looking for a flag
--that doesn't exist i'd prefer if you checked your code when it errors
function SWEP:HasFlag(name)
local networkedFlag = self.NetworkedFlags[name]
local flagIndex, flagValue = getFlagIndex(networkedFlag), getFlagValue(networkedFlag)
return bit.band(self.dt[self.NetworkedFlagIndices[flagIndex]], flagValue) == flagValue
end
function SWEP:AddFlag(name)
local networkedFlag = self.NetworkedFlags[name]
local flagIndex, flagValue = getFlagIndex(networkedFlag), getFlagValue(networkedFlag)
local flagDt = self.NetworkedFlagIndices[flagIndex]
self.dt[flagDt] = bit.bor(self.dt[flagDt], flagValue)
end
function SWEP:RemoveFlag(name)
local networkedFlag = self.NetworkedFlags[name]
local flagIndex, flagValue = getFlagIndex(networkedFlag), getFlagValue(networkedFlag)
local flagDt = self.NetworkedFlagIndices[flagIndex]
self.dt[flagDt] = bit.band(self.dt[flagDt], bit.bnot(flagValue))
end
function SWEP:ToggleFlag(name)
if (self:HasFlag(name)) then
self:RemoveFlag(name)
else
self:AddFlag(name)
end
end
--TODO: reconsider a lot of these vars, some probably dont need to be
function SWEP:SetupDataTables()
--idea: most of the gun's actions can be simplified with one timer. this game does not allow for overlayed animations,
--we can't have more than one action playing on the gun at the same time.
--get rid of all these "time" dtvars, just use one
self:CustomNetworkVar("Float", "NextActionTime")
self:CustomNetworkVar("Float", "NextReloadTime")
self:CustomNetworkVar("Float", "NextMagTime")
self:CustomNetworkVar("Float", "NextHolsterTime")
self:CustomNetworkVar("Float", "AimDelta")
self:CustomNetworkVar("Float", "Cone")
self:CustomNetworkVar("Float", "NextSprintTime")
self:CustomNetworkVar("Float", "NextInspectTime")
self:CustomNetworkVar("Float", "NextFiremodeTime")
self:CustomNetworkVar("Float", "NextMeleeTime")
self:CustomNetworkVar("Float", "TriggerDelta")
self:CustomNetworkVar("Float", "NextAimModeTime")
self:CustomNetworkVar("Float", "AimModeDelta")
self:CustomNetworkVar("Float", "BreathingDelta")
self:CustomNetworkVar("Flag", "MagInserted")
self:CustomNetworkVar("Flag", "PlayFirstDraw")
self:CustomNetworkVar("Flag", "Reloading")
self:CustomNetworkVar("Flag", "Drawing")
self:CustomNetworkVar("Flag", "Holstering")
self:CustomNetworkVar("Flag", "Aiming")
self:CustomNetworkVar("Flag", "Sprinting")
self:CustomNetworkVar("Flag", "Rechambered")
self:CustomNetworkVar("Flag", "HoldingTrigger")
self:CustomNetworkVar("Flag", "Customizing")
self:CustomNetworkVar("Flag", "Lowered")
self:CustomNetworkVar("Flag", "FlashlightOn")
self:CustomNetworkVar("Flag", "BipodDeployed")
self:CustomNetworkVar("Flag", "Inspecting")
self:CustomNetworkVar("Flag", "StoppedInspectAnimation")
self:CustomNetworkVar("Bool", "ToggleAim")
self:CustomNetworkVar("Bool", "HasRunOutOfBreath")
self:CustomNetworkVar("Entity", "NextWeapon")
self:CustomNetworkVar("Entity", "ViewModel")
self:CustomNetworkVar("Int", "SprayRounds")
self:CustomNetworkVar("Int", "Firemode")
self:CustomNetworkVar("Int", "BurstRounds")
self:CustomNetworkVar("Int", "PenetrationCount")
self:CustomNetworkVar("Int", "AimMode")
--self:CustomNetworkVar("String", "0", "Camo")
self:CustomNetworkVar("Angle", "BreathingAngle")
end