FrameworkZ 10.8.3
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
__Boot.lua
Go to the documentation of this file.
1local internalObjects = {}
2local lockedObjects = {}
3
4local function hashObject(depth, object)
5 local actualDepth = depth or 0
6 local components = {}
7
8 local function collect(tbl, prefix)
9 for k, v in pairs(tbl) do
10 local keyPath = prefix .. "." .. tostring(k)
11
12 if type(v) == "function" and not k:match("^_+") then
13 table.insert(components, keyPath .. ":" .. tostring(v))
14 elseif (actualDepth <= -1 or actualDepth >= 1) and type(v) == "table" and not k:match("^_+") and not v.__skipWrap then
16 collect(v, keyPath)
17 end
18 end
19 end
20
21 collect(object, object.Meta and object.Meta.Name or "object")
22 table.sort(components)
24 return table.concat(components, "|")
25end
27local function createSecureFunction(originalFunction, object, originalObject)
28 return setmetatable(originalObject or {}, {
29 __call = function(tbl, ...)
30 local currentHash = hashObject(object.__hashDepth, object)
31
32 if object.__hash ~= currentHash then
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.")
36 return
37 end
38
39 return originalFunction(...)
40 end
41 --[[__newindex = function(tbl, key, value)
42 if isClient() then
43 FrameworkZ.Notifications:AddToQueue("Tampering Attempt: Cannot override object after locking. This has been logged.", FrameworkZ.Notifications.Types.Danger, 60)
44 end
45
46 error("Tampering Attempt: Cannot override object after locking. This has been logged.")
47 return
48 end,--]]
49 --__metatable = false
50 })
51end
52
53local function wrapFunctionsWithValidation(depth, tbl, object, visited)
54 local actualDepth = depth or 0
55
56 visited = visited or {}
57 if visited[tbl] then return end
58 visited[tbl] = true
59
60 for k, v in pairs(tbl) do
61 if type(v) == "function" and not k:match("^_+") then
62 tbl[k] = createSecureFunction(v, object)
63 elseif (actualDepth <= -1 or actualDepth >= 1) and type(v) == "table" and not k:match("^_+") and not v.__skipWrap then
64 wrapFunctionsWithValidation(actualDepth - 1, v, object, visited)
65 end
66 end
67
68 tbl = createSecureFunction(tbl, object, tbl)
69
70 return tbl
71end
72
73-- Proper newObject with metatable
74local function newFrameworkZ()
75 local object = {
76 Meta = {
77 Name = "FrameworkZ",
78 Author = "N/A",
79 Description = "No description set.",
80 Version = "1.0.0",
81 Compatibility = ""
82 },
83 __locked = false,
84 }
85
86 setmetatable(object, {
87 __index = {}
88 })
89
90 -- Attach base object logic for module creation
91 object.CreateObject = function(self, tbl, name)
92 tbl = tbl or {}
93 tbl.Meta = {
94 Name = name,
95 Author = "N/A",
96 Description = "No description set.",
97 Version = "1.0.0",
98 Compatibility = ""
99 }
100 tbl.__locked = false
101
102 return setmetatable(tbl, {
103 __index = self
104 })
105 end
106
107 return object
108end
109
110FrameworkZ = newFrameworkZ()
111FrameworkZ.Initialized = false
112FrameworkZ.Meta.Author = "RJ_RayJay"
113FrameworkZ.Meta.Description = "FrameworkZ Bootstrap"
114FrameworkZ.Meta.Version = "1.0.0"
115
116FrameworkZ.Config = {}
117FrameworkZ.Config.Options = {
118 SkipIntro = true,
119 Version = "10.8.3",
120 VersionType = "alpha",
121
122 IntroFrameworkImage = "media/textures/fz.png",
123 IntroGamemodeImage = "media/textures/hl2rp.png",
124 MainMenuImage = "media/textures/citidel.png",
125
126 IntroMusic = "hl2_song25_teleporter_short", -- Approximately 15 seconds long
127 MainMenuMusic = "hl2_song19",
128
129 FrameworkTitle = "FrameworkZ",
130 GamemodeTitle = "No Gamemode Loaded",
131 GamemodeDescription = "The base FrameworkZ foundation.",
132
133 CharacterMinAge = 18, -- Years
134 CharacterMaxAge = 100, -- Years
135 CharacterMinHeight = 48, -- Inches
136 CharacterMaxHeight = 84, -- Inches
137 CharacterMinWeight = 80, -- Pounds
138 CharacterMaxWeight = 300, -- Pounds
139
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).
143
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.
148
149 LimboX = 18539,
150 LimboY = 79,
151 LimboZ = 0,
152
153 SpawnX = 0,
154 SpawnY = 0,
155 SpawnZ = 0,
156
157 DefaultMaxCharacters = 3,
158
159 -- Lockpicking
160 LockpickChance = 0.5,
161 LockpickCooldown = 60,
162 LockpickMaxDistance = 2,
163
164 -- Pickpocketing
165 PickPocketChance = 0.5,
166 PickPocketCooldown = 60,
167 PickPocketMaxDistance = 2,
168
169 -- Factions
170 Factions = {
171 FACTION_CITIZEN = {
172 limit = 0
173 }
174 }
175}
176
177function FrameworkZ.Config:GetOption(optionName)
178 return self.Options[optionName]
179end
180
181function FrameworkZ.Config:SetOption(optionName, value)
182 self.Options[optionName] = value
183end
184
185FrameworkZ.Config = FrameworkZ:CreateObject(FrameworkZ.Config, "Config")
186
187function FrameworkZ:LoadAndLockObject(object)
188 --local object = internalObjects[name]
189
190 if not object then
191 error("Object is not registered or is already loaded.")
192 end
193
194 if not object.Meta or not object.Meta.Name then
195 error("Invalid object passed to LockAndLoadObject.")
196 end
197
198 if object.__locked then
199 error("Object '" .. object.Meta.Name .. "' is already locked.")
200 end
201
202 local name = object.Meta.Name
203 local depth = name == "FrameworkZ" and 0 or -1
204
205 --[[object = wrapFunctionsWithValidation(depth, object, object)
206
207 if not object then
208 error("Failed to wrap functions for object: " .. name)
209 end--]]
210
211
212
213 local proxy, message = self:LoadObject(object)
214
215 if not proxy then
216 error("Failed to load object: " .. message)
217 end
218
219 proxy.__hash = hashObject(depth, proxy)
220 proxy.__hashDepth = depth
221 proxy.__locked = true
222
223 local mt = {
224 __index = function(tbl, key)
225 local currentHash = hashObject(proxy.__hashDepth, proxy)
226
227 if proxy.__hash ~= currentHash then
228 FrameworkZ.Notifications:AddToQueue("Tampering Detected: Object integrity check failed. This has been logged.", FrameworkZ.Notifications.Types.Danger, 60)
229
230 error("Tampering Detected: Object integrity check failed. This has been logged.")
231 return nil
232 end
233
234 return rawget(proxy, key)
235 end,
236 __newindex = function(tbl, key, value)
237 if isClient() then
238 FrameworkZ.Notifications:AddToQueue("Tampering Attempt: Cannot override object after locking. This has been logged.", FrameworkZ.Notifications.Types.Danger, 60)
239 end
240
241 error("Tampering Attempt: Cannot override object after locking. This has been logged.")
242 end,
243 --[[__call = function(tbl, ...)
244 local currentHash = hashObject(proxy.__hashDepth, proxy)
245
246 if proxy.__hash ~= currentHash then
247 FrameworkZ.Notifications:AddToQueue("Tampering Detected: Object integrity check failed. This has been logged.", FrameworkZ.Notifications.Types.Danger, 60)
248
249 error("Tampering Detected: Object integrity check failed. This has been logged.")
250 return print("Denied")
251 end
252
253 return tbl(...)
254 end,--]]
255 __pairs = function() return pairs(proxy) end,
256 __ipairs = function() return ipairs(proxy) end,
257 __len = function() return #proxy end,
258 __metatable = false
259 }
260
261 local lockedObject = setmetatable({}, mt)
264
265 return lockedObject
266end
267
268function FrameworkZ:LoadObject(object)
269 --local object = internalObjects[objectName]
270
271 if object then
272 local copy = FrameworkZ.Utilities:CopyTable(object)
273
274 if copy.InitializeObject then
275 copy:InitializeObject()
276 end
277
278 return copy, "Object '" .. object.Meta.Name .. "' loaded successfully."
279 end
280
281 return false, "Object '" .. object.Meta.Name .. "' is not registered or is already loaded."
282end
283
284function FrameworkZ:UnloadObject(objectName)
285 if not self.__allowUnload then
286 if isClient() then
287 FrameworkZ.Notifications:AddToQueue("Security Warning: Unload attempt blocked for '" .. objectName .. "'. This has been logged.", FrameworkZ.Notifications.Types.Danger, 60)
288 end
289
290 return false
291 end
292
293 internalObjects[objectName] = nil
294
295 return true
296end
297
298function FrameworkZ:RegisterObject(object)
299 if self.__finalized == true then
300 if isClient() then
301 FrameworkZ.Notifications:AddToQueue("Security Alert: Attempted to register object after finalization. This has been logged.", FrameworkZ.Notifications.Types.Warning, 60)
302 end
303
304 error("Security Alert: Attempted to register object after finalization. This has been logged.")
305 return
306 end
307
308 if not object.Meta or not object.Meta.Name then
309 print("Plugin missing metadata or name.")
310 return false
311 end
312
313 if object.__locked then
314 if isClient() then
315 FrameworkZ.Notifications:AddToQueue("Security Alert: Attempted to re-register locked object '" .. object.Meta.Name .. "'. This has been logged.", FrameworkZ.Notifications.Types.Warning, 60)
316 end
317
318 error("Security Alert: Attempted to re-register locked object '" .. object.Meta.Name .. "'. This has been logged.")
319 return
320 end
321
322 local name = object.Meta.Name
323
325
326 return object
327end
328
329function FrameworkZ:GetObject(objectName)
330 return lockedObjects[objectName]
331end
332
333function FrameworkZ:IsInitialized()
334 return self.__initialized or false
335end
336
337function FrameworkZ:InitializeObject()
338 if self.__initialized then return end
339 self.__initialized = true
340 self.Foundation.Initialize(self.Foundation)
341 self.__finalized = true
342end
void FrameworkZ DollarFormats __index()
void local object()
void type()
void local message
void self FrameworkZ UI self nil
Definition MainMenu.lua:95
void self self
Definition MainMenu.lua:89
void local mt()
void copy()
void visited()
void __pairs()
void __newindex()
void __len()
void object __locked()
void local lockedObject()
void local currentHash()
void __ipairs()
void __call()
void __metatable()
void local name()
void return object __hash()
void local proxy()
void tbl()
void local lockedObjects()
void local actualDepth()
void if type v()
void local keyPath()
void local components()
void local internalObjects()
void local isClient()
void module()
void FrameworkZ Foundation()
void key()
void value()
Notifications module for FrameworkZ. Queues and sends notifications.
FrameworkZ Notifications Types
void IsInitialized()
void LoadObject(object)
void RegisterObject(object)
void GetObject(objectName)
void InitializeObject()
void LoadAndLockObject(object)
void UnloadObject(objectName)
void FrameworkZ()