Фикс color.lua в plib v2 после October 2024 Update

Данный фикс решает проблему с ошибкой в функции COLOR:Lerp мода plib_v2 после обновления Garry’s Mod. Последнее обновление изменило поведение функции Lerp или обработку объектов Color, что привело к тому, что COLOR:Lerp получал числовые значения вместо объектов Color. Это вызывало попытки обращения к свойствам числа (from.r), что приводило к ошибкам.

/garrysmod/addons/plib_v2/lua/plib/extensions/color.lua

local tonumber       = tonumber
local string_format  = string.format
local string_match    = string.match
local bit_band        = bit.band
local bit_rshift      = bit.rshift
local Lerp            = Lerp

local COLOR = FindMetaTable('Color')

-- fix flizan_1
local function iscolor(var)
    return type(var) == "table" and getmetatable(var) == FindMetaTable("Color")
end

function Color(r, g, b, a)
    return setmetatable({
        r = tonumber(r) or 255,
        g = tonumber(g) or 255,
        b = tonumber(b) or 255,
        a = tonumber(a) or 255
    }, COLOR)
end

function COLOR:Copy()
    return Color(self.r, self.g, self.b, self.a)
end

function COLOR:Unpack()
    return self.r, self.g, self.b, self.a
end

function COLOR:SetHex(hex)
    local r, g, b = string_match(hex, '#(..)(..)(..)')
    self.r, self.g, self.b = tonumber(r, 16), tonumber(g, 16), tonumber(b, 16)
end

function COLOR:ToHex()
    return string_format('#%02X%02X%02X', self.r, self.g, self.b)
end

function COLOR:SetEncodedRGB(num)
    self.r, self.g, self.b = bit_band(bit_rshift(num, 16), 0xFF), bit_band(bit_rshift(num, 8), 0xFF), bit_band(num, 0xFF)
end

function COLOR:ToEncodedRGB()
    return (self.r * 0x100 + self.g) * 0x100 + self.b
end

function COLOR:SetEncodedRGBA(num)
    self.r, self.g, self.b, self.a = bit_band(bit_rshift(num, 24), 0xFF), bit_band(bit_rshift(num, 16), 0xFF), bit_band(bit_rshift(num, 8), 0xFF), bit_band(num, 0xFF)
end

function COLOR:ToEncodedRGBA()
    return ((self.a * 0x100 + self.r) * 0x100 + self.g) * 0x100 + self.b
end

function COLOR:Lerp(fraction, from, to)
    if iscolor(from) and iscolor(to) then
        self.r = Lerp(fraction, from.r, to.r)
        self.g = Lerp(fraction, from.g, to.g)
        self.b = Lerp(fraction, from.b, to.b)
        self.a = Lerp(fraction, from.a, to.a)
    elseif type(from) == "number" and type(to) == "number" then
        local lerped = Lerp(fraction, from, to)
        self.r = lerped
        self.g = lerped
        self.b = lerped
        self.a = lerped
    end
end

true фикс без костылей. Удалить отсюда Lerp и Unpack методы, которые появились в гмоде и начать использовать стоковые, а не пилить костыли.

Также обращаем сверху внимание на local COLOR = getmetatable(Color(0,0,0))

local tonumber 		= tonumber
local string_format = string.format
local string_match 	= string.match
local bit_band		= bit.band
local bit_rshift 	= bit.rshift

local COLOR = getmetatable(Color(0,0,0))

function Color(r, g, b, a)
	return setmetatable({
		r = tonumber(r) or 255,
		g = tonumber(g) or 255,
		b = tonumber(b) or 255,
		a = tonumber(a) or 255
	}, COLOR)
end

function COLOR:Copy()
	return Color(self.r, self.g, self.b, self.a)
end

function COLOR:SetHex(hex)
	local r, g, b = string_match(hex, '#(..)(..)(..)')
	self.r, self.g, self.b = tonumber(r, 16), tonumber(g, 16), tonumber(b, 16)
	return self
end

function COLOR:ToHex()
	return string_format('#%02X%02X%02X', self.r, self.g, self.b)
end

function COLOR:SetEncodedRGB(num)
	self.r, self.g, self.b = bit_band(bit_rshift(num, 16), 0xFF), bit_band(bit_rshift(num, 8), 0xFF), bit_band(num, 0xFF)
	return self
end

function COLOR:ToEncodedRGB()
	return (self.r * 0x100 + self.g) * 0x100 + self.b
end

function COLOR:SetEncodedRGBA(num)
	self.r, self.g, self.b, self.a = bit_band(bit_rshift(num, 16), 0xFF), bit_band(bit_rshift(num, 8), 0xFF), bit_band(num, 0xFF), bit_band(bit_rshift(num, 24), 0xFF)
	return self
end

function COLOR:ToEncodedRGBA()
	return ((self.a * 0x100 + self.r) * 0x100 + self.g) * 0x100 + self.b
end

1 лайк