4local function hashObject(depth,
object)
8 local function collect(
tbl, prefix)
9 for k,
v in pairs(
tbl)
do
10 local
keyPath = prefix ..
"." .. tostring(k)
12 if
type(
v) == "function" and not k:match("^_+") then
21 collect(
object,
object.Meta and
object.Meta.Name or "
object")
27local function createSecureFunction(originalFunction,
object, originalObject)
28 return setmetatable(originalObject or {}, {
33 FrameworkZ.Notifications:AddToQueue("Tampering Detected: Object integrity check failed. This has been logged.",
FrameworkZ.Notifications.Types.Danger, 60)
35 error("Tampering Detected: Object integrity check failed. This has been logged.")
39 return originalFunction(...)
43 FrameworkZ.Notifications:AddToQueue("Tampering Attempt: Cannot override
object after locking. This has been logged.",
FrameworkZ.Notifications.Types.Danger, 60)
46 error("Tampering Attempt: Cannot override
object after locking. This has been logged.")
53local function wrapFunctionsWithValidation(depth,
tbl,
object,
visited)
60 for k,
v in pairs(
tbl)
do
61 if type(
v) ==
"function" and not k:match(
"^_+") then
62 tbl[k] = createSecureFunction(
v,
object)
68 tbl = createSecureFunction(
tbl,
object,
tbl)
73-- Proper newObject with metatable
74local function newFrameworkZ()
79 Description =
"No description set.",
86 setmetatable(
object, {
90 -- Attach base
object logic
for module creation
96 Description =
"No description set.",
102 return setmetatable(
tbl, {
120 VersionType =
"alpha",
122 IntroFrameworkImage =
"media/textures/fz.png",
123 IntroGamemodeImage =
"media/textures/hl2rp.png",
124 MainMenuImage =
"media/textures/citidel.png",
126 IntroMusic =
"hl2_song25_teleporter_short", -- Approximately 15 seconds
long
127 MainMenuMusic =
"hl2_song19",
129 FrameworkTitle =
"FrameworkZ",
130 GamemodeTitle =
"No Gamemode Loaded",
131 GamemodeDescription =
"The base FrameworkZ foundation.",
133 CharacterMinAge = 18, -- Years
134 CharacterMaxAge = 100, -- Years
135 CharacterMinHeight = 48, -- Inches
136 CharacterMaxHeight = 84, -- Inches
137 CharacterMinWeight = 80, -- Pounds
138 CharacterMaxWeight = 300, -- Pounds
140 InitializationDuration = 3, --In seconds. Not recommended to set any lower than 3 second.
141 ServerTickInterval = 1, -- In seconds. Increasing
this may improve performance at the cost of responsiveness. Default: 1 second.
142 TicksUntilServerSave = 180, -- In ticks, by the Server Tick Interval. Default: 1200 (20 minutes).
144 PlayerTickInterval = 1, -- In seconds. Increasing
this may improve performance at the cost of responsiveness. Default: 1 seconds.
145 TicksUntilCharacterSave = 1200, -- In ticks, by the Player Tick Interval. Default: 1200 (10 minutes).
146 ShouldNotifyOnCharacterSave = true,
147 CharacterLoadDelay = 3, -- In seconds. 3 seconds recommended for smoother transitions. Could be shorter if preferred.
157 DefaultMaxCharacters = 3,
160 LockpickChance = 0.5,
161 LockpickCooldown = 60,
162 LockpickMaxDistance = 2,
165 PickPocketChance = 0.5,
166 PickPocketCooldown = 60,
167 PickPocketMaxDistance = 2,
178 return self.Options[optionName]
191 error("Object is not registered or is already loaded.")
194 if not
object.Meta or not
object.Meta.Name then
195 error("Invalid
object passed to LockAndLoadObject.")
199 error("Object '" ..
object.Meta.Name .. "' is already locked.")
202 local
name =
object.Meta.Name
205 --[[
object = wrapFunctionsWithValidation(depth,
object,
object)
208 error("Failed to wrap functions for
object: " ..
name)
216 error("Failed to load
object: " ..
message)
220 proxy.__hashDepth = depth
230 error("Tampering Detected: Object integrity check failed. This has been logged.")
238 FrameworkZ.Notifications:AddToQueue("Tampering Attempt: Cannot override
object after locking. This has been logged.",
FrameworkZ.Notifications.Types.Danger, 60)
241 error("Tampering Attempt: Cannot override
object after locking. This has been logged.")
247 FrameworkZ.Notifications:AddToQueue("Tampering Detected: Object integrity check failed. This has been logged.",
FrameworkZ.Notifications.Types.Danger, 60)
249 error("Tampering Detected: Object integrity check failed. This has been logged.")
250 return print("Denied")
257 __len = function() return
#proxy end,
274 if
copy.InitializeObject then
275 copy:InitializeObject()
278 return
copy,
"Object '" ..
object.Meta.Name ..
"' loaded successfully."
281 return false,
"Object '" ..
object.Meta.Name ..
"' is not registered or is already loaded."
285 if not
self.__allowUnload then
287 FrameworkZ.Notifications:AddToQueue(
"Security Warning: Unload attempt blocked for '" .. objectName ..
"'. This has been logged.",
FrameworkZ.Notifications.Types.Danger, 60)
299 if
self.__finalized == true then
301 FrameworkZ.Notifications:AddToQueue(
"Security Alert: Attempted to register object after finalization. This has been logged.",
FrameworkZ.Notifications.Types.Warning, 60)
304 error(
"Security Alert: Attempted to register object after finalization. This has been logged.")
309 print(
"Plugin missing metadata or name.")
315 FrameworkZ.Notifications:AddToQueue(
"Security Alert: Attempted to re-register locked object '" ..
object.Meta.Name ..
"'. This has been logged.",
FrameworkZ.Notifications.Types.Warning, 60)
318 error(
"Security Alert: Attempted to re-register locked object '" ..
object.Meta.Name ..
"'. This has been logged.")
334 return
self.__initialized or false
338 if
self.__initialized then return end
339 self.__initialized = true
341 self.__finalized = true
void self FrameworkZ UI self nil
void local lockedObject()
void return object __hash()
void local lockedObjects()
void local internalObjects()
void FrameworkZ Foundation()
Notifications module for FrameworkZ. Queues and sends notifications.
FrameworkZ Notifications Types
void RegisterObject(object)
void GetObject(objectName)
void LoadAndLockObject(object)
void UnloadObject(objectName)