FrameworkZ 10.8.3
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
Characters.lua
Go to the documentation of this file.
1--! \page features Features
2--! \section Characters Characters
3--! Characters are the main focus of the game. They are the players that interact with the world. Characters can be given a name, description, faction, age, height, eye color, hair color, etc. They can also be given items and equipment.\n\n
4--! When a player connects to the server, they may create a character and load said character. The character is then saved to the player's data and can be loaded again when the player reconnects. Characters will be saved automatically at predetermined intervals or upon disconnection or when switching characters.\n\n
5--! Characters are not given items in the traditional sense. Instead, they are given items by a unique ID from an item defined in the framework's (or gamemode's or even plugin's) files. This special item definition is then used to create an item instance that is added to the character's inventory. This allows for items to be created dynamically and given to characters. This allows for the same Project Zomboid item to be reused for different purposes.\n\n
6
7--! \page global_variables Global Variables
8--! \section Characters Characters
9--! FrameworkZ.Characters\n
10--! See Characters for the module on characters.\n\n
11--! FrameworkZ.Characters.List\n
12--! A list of all instanced characters in the game.
13
14local isClient = isClient
15
16FrameworkZ = FrameworkZ or {}
17
18--! \brief Characters module for FrameworkZ. Defines and interacts with CHARACTER object.
19--! \class FrameworkZ.Characters
20FrameworkZ.Characters = {}
21
22SKIN_COLOR_PALE = 0
23SKIN_COLOR_WHITE = 1
24SKIN_COLOR_TANNED = 2
25SKIN_COLOR_BROWN = 3
26SKIN_COLOR_DARK_BROWN = 4
27
28HAIR_COLOR_BLACK_R = 0
29HAIR_COLOR_BLACK_G = 0
30HAIR_COLOR_BLACK_B = 0
31HAIR_COLOR_BLONDE_R = 0.9
32HAIR_COLOR_BLONDE_G = 0.9
33HAIR_COLOR_BLONDE_B = 0.6
34HAIR_COLOR_BROWN_R = 0.3
35HAIR_COLOR_BROWN_G = 0.2
36HAIR_COLOR_BROWN_B = 0.2
37HAIR_COLOR_GRAY_R = 0.5
38HAIR_COLOR_GRAY_G = 0.5
39HAIR_COLOR_GRAY_B = 0.5
40HAIR_COLOR_RED_R = 0.9
41HAIR_COLOR_RED_G = 0.4
42HAIR_COLOR_RED_B = 0.1
43HAIR_COLOR_WHITE_R = 1
44HAIR_COLOR_WHITE_G = 1
45HAIR_COLOR_WHITE_B = 1
47--! \brief Deprecated. To be removed.
48EQUIPMENT_SLOT_HEAD = "Hat"
49
50--! \brief Deprecated. To be removed.
51EQUIPMENT_SLOT_FACE = "Mask"
53--! \brief Deprecated. To be removed.
54EQUIPMENT_SLOT_EARS = "Ears"
55
56--! \brief Deprecated. To be removed.
57EQUIPMENT_SLOT_BACKPACK = "Back"
59--! \brief Deprecated. To be removed.
60EQUIPMENT_SLOT_GLOVES = "Hands"
61
62--! \brief Deprecated. To be removed.
63EQUIPMENT_SLOT_UNDERSHIRT = "Tshirt"
65--! \brief Deprecated. To be removed.
66EQUIPMENT_SLOT_OVERSHIRT = "Shirt"
67
68--! \brief Deprecated. To be removed.
69EQUIPMENT_SLOT_VEST = "TorsoExtraVest"
70
71--! \brief Deprecated. To be removed.
72EQUIPMENT_SLOT_BELT = "Belt"
73
74--! \brief Deprecated. To be removed.
75EQUIPMENT_SLOT_PANTS = "Pants"
76
77--! \brief Deprecated. To be removed.
78EQUIPMENT_SLOT_SOCKS = "Socks"
80--! \brief Deprecated. To be removed.
81EQUIPMENT_SLOT_SHOES = "Shoes"
82
83FZ_ENUM_CHARACTER_INFO_FACTION = 1
84FZ_ENUM_CHARACTER_INFO_GENDER = 2
85FZ_ENUM_CHARACTER_INFO_NAME = 2
86FZ_ENUM_CHARACTER_INFO_DESCRIPTION = 3
87FZ_ENUM_CHARACTER_INFO_AGE = 4
88FZ_ENUM_CHARACTER_INFO_HEIGHT = 5
89FZ_ENUM_CHARACTER_INFO_WEIGHT = 6
90FZ_ENUM_CHARACTER_INFO_PHYSIQUE = 7
91FZ_ENUM_CHARACTER_INFO_EYE_COLOR = 8
92FZ_ENUM_CHARACTER_INFO_BEARD_COLOR = 9
93FZ_ENUM_CHARACTER_INFO_HAIR_COLOR = 10
94FZ_ENUM_CHARACTER_INFO_SKIN_COLOR = 11
95FZ_ENUM_CHARACTER_INFO_HAIR_STYLE = 12
96FZ_ENUM_CHARACTER_INFO_BEARD_STYLE = 13
97FZ_ENUM_CHARACTER_SLOT_BANDAGE = 15
98FZ_ENUM_CHARACTER_SLOT_WOUND = 16
99FZ_ENUM_CHARACTER_SLOT_BELT_EXTRA = 17
100FZ_ENUM_CHARACTER_SLOT_BELT = 18
101FZ_ENUM_CHARACTER_SLOT_BELLY_BUTTON = 19
102FZ_ENUM_CHARACTER_SLOT_MAKEUP_FULL_FACE = 20
103FZ_ENUM_CHARACTER_SLOT_MAKEUP_EYES = 21
104FZ_ENUM_CHARACTER_SLOT_MAKEUP_EYES_SHADOW = 22
105FZ_ENUM_CHARACTER_SLOT_MAKEUP_LIPS = 23
106FZ_ENUM_CHARACTER_SLOT_MASK = 24
107FZ_ENUM_CHARACTER_SLOT_MASK_EYES = 25
108FZ_ENUM_CHARACTER_SLOT_MASK_FULL = 26
109FZ_ENUM_CHARACTER_SLOT_UNDERWEAR = 27
110FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_BOTTOM = 28
111FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_TOP = 29
112FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_EXTRA1 = 30
113FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_EXTRA2 = 31
114FZ_ENUM_CHARACTER_SLOT_HAT = 32
115FZ_ENUM_CHARACTER_SLOT_FULL_HAT = 33
116FZ_ENUM_CHARACTER_SLOT_EARS = 34
117FZ_ENUM_CHARACTER_SLOT_EAR_TOP = 35
118FZ_ENUM_CHARACTER_SLOT_NOSE = 36
119FZ_ENUM_CHARACTER_SLOT_TORSO1 = 37
120FZ_ENUM_CHARACTER_SLOT_TORSO_LEGS1 = 38
121FZ_ENUM_CHARACTER_SLOT_TANK_TOP = 39
122FZ_ENUM_CHARACTER_SLOT_TSHIRT = 40
123FZ_ENUM_CHARACTER_SLOT_SHORT_SLEEVE_SHIRT = 41
124FZ_ENUM_CHARACTER_SLOT_LEFT_WRIST = 42
125FZ_ENUM_CHARACTER_SLOT_RIGHT_WRIST = 43
126FZ_ENUM_CHARACTER_SLOT_SHIRT = 44
127FZ_ENUM_CHARACTER_SLOT_NECK = 45
128FZ_ENUM_CHARACTER_SLOT_NECKLACE = 46
129FZ_ENUM_CHARACTER_SLOT_NECKLACE_LONG = 47
130FZ_ENUM_CHARACTER_SLOT_RIGHT_MIDDLE_FINGER = 48
131FZ_ENUM_CHARACTER_SLOT_LEFT_MIDDLE_FINGER = 49
132FZ_ENUM_CHARACTER_SLOT_LEFT_RING_FINGER = 50
133FZ_ENUM_CHARACTER_SLOT_RIGHT_RING_FINGER = 51
134FZ_ENUM_CHARACTER_SLOT_HANDS = 52
135FZ_ENUM_CHARACTER_SLOT_HANDS_LEFT = 53
136FZ_ENUM_CHARACTER_SLOT_HANDS_RIGHT = 54
137FZ_ENUM_CHARACTER_SLOT_SOCKS = 55
138FZ_ENUM_CHARACTER_SLOT_LEGS1 = 56
139FZ_ENUM_CHARACTER_SLOT_PANTS = 57
140FZ_ENUM_CHARACTER_SLOT_SKIRT = 58
141FZ_ENUM_CHARACTER_SLOT_LEGS5 = 59
142FZ_ENUM_CHARACTER_SLOT_DRESS = 60
143FZ_ENUM_CHARACTER_SLOT_SWEATER = 61
144FZ_ENUM_CHARACTER_SLOT_SWEATER_HAT = 62
145FZ_ENUM_CHARACTER_SLOT_JACKET = 63
146FZ_ENUM_CHARACTER_SLOT_JACKET_DOWN = 64
147FZ_ENUM_CHARACTER_SLOT_JACKET_BULKY = 65
148FZ_ENUM_CHARACTER_SLOT_JACKET_HAT = 66
149FZ_ENUM_CHARACTER_SLOT_JACKET_HAT_BULKY = 67
150FZ_ENUM_CHARACTER_SLOT_JACKET_SUIT = 68
151FZ_ENUM_CHARACTER_SLOT_FULL_SUIT = 69
152FZ_ENUM_CHARACTER_SLOT_BOILDER_SUIT = 70
153FZ_ENUM_CHARACTER_SLOT_FULL_SUIT_HEAD = 71
154FZ_ENUM_CHARACTER_SLOT_FULL_TOP = 72
155FZ_ENUM_CHARACTER_SLOT_BATH_ROBE = 73
156FZ_ENUM_CHARACTER_SLOT_SHOES = 74
157FZ_ENUM_CHARACTER_SLOT_FANNY_PACK_FRONT = 75
158FZ_ENUM_CHARACTER_SLOT_FANNY_PACK_BACK = 76
159FZ_ENUM_CHARACTER_SLOT_AMMO_STRAP = 77
160FZ_ENUM_CHARACTER_SLOT_TORSO_EXTRA = 78
161FZ_ENUM_CHARACTER_SLOT_TORSO_EXTRA_VEST = 79
162FZ_ENUM_CHARACTER_SLOT_TAIL = 80
163FZ_ENUM_CHARACTER_SLOT_BACK = 81
164FZ_ENUM_CHARACTER_SLOT_LEFT_EYE = 82
165FZ_ENUM_CHARACTER_SLOT_RIGHT_EYE = 83
166FZ_ENUM_CHARACTER_SLOT_EYES = 84
167FZ_ENUM_CHARACTER_SLOT_SCARF = 85
168FZ_ENUM_CHARACTER_SLOT_ZED_DMG = 86
169
170FZ_SLOT_BANDAGE = "Bandage"
171FZ_SLOT_WOUND = "Wound"
172FZ_SLOT_BELT_EXTRA = "BeltExtra"
173FZ_SLOT_BELT = "Belt"
174FZ_SLOT_BELLY_BUTTON = "BellyButton"
175FZ_SLOT_MAKEUP_FULL_FACE = "MakeUp_FullFace"
176FZ_SLOT_MAKEUP_EYES = "MakeUp_Eyes"
177FZ_SLOT_MAKEUP_EYES_SHADOW = "MakeUp_EyesShadow"
178FZ_SLOT_MAKEUP_LIPS = "MakeUp_Lips"
179FZ_SLOT_MASK = "Mask"
180FZ_SLOT_MASK_EYES = "MaskEyes"
181FZ_SLOT_MASK_FULL = "MaskFull"
182FZ_SLOT_UNDERWEAR = "Underwear"
183FZ_SLOT_UNDERWEAR_BOTTOM = "UnderwearBottom"
184FZ_SLOT_UNDERWEAR_TOP = "UnderwearTop"
185FZ_SLOT_UNDERWEAR_EXTRA1 = "UnderwearExtra1"
186FZ_SLOT_UNDERWEAR_EXTRA2 = "UnderwearExtra2"
187FZ_SLOT_HAT = "Hat"
188FZ_SLOT_FULL_HAT = "FullHat"
189FZ_SLOT_EARS = "Ears"
190FZ_SLOT_EAR_TOP = "EarTop"
191FZ_SLOT_NOSE = "Nose"
192FZ_SLOT_TORSO1 = "Torso1"
193FZ_SLOT_TORSO_LEGS1 = "Torso1Legs1"
194FZ_SLOT_TANK_TOP = "TankTop"
195FZ_SLOT_TSHIRT = "Tshirt"
196FZ_SLOT_SHORT_SLEEVE_SHIRT = "ShortSleeveShirt"
197FZ_SLOT_LEFT_WRIST = "LeftWrist"
198FZ_SLOT_RIGHT_WRIST = "RightWrist"
199FZ_SLOT_SHIRT = "Shirt"
200FZ_SLOT_NECK = "Neck"
201FZ_SLOT_NECKLACE = "Necklace"
202FZ_SLOT_NECKLACE_LONG = "Necklace_Long"
203FZ_SLOT_RIGHT_MIDDLE_FINGER = "Right_MiddleFinger"
204FZ_SLOT_LEFT_MIDDLE_FINGER = "Left_MiddleFinger"
205FZ_SLOT_LEFT_RING_FINGER = "Left_RingFinger"
206FZ_SLOT_RIGHT_RING_FINGER = "Right_RingFinger"
207FZ_SLOT_HANDS = "Hands"
208FZ_SLOT_HANDS_LEFT = "HandsLeft"
209FZ_SLOT_HANDS_RIGHT = "HandsRight"
210FZ_SLOT_SOCKS = "Socks"
211FZ_SLOT_LEGS1 = "Legs1"
212FZ_SLOT_PANTS = "Pants"
213FZ_SLOT_SKIRT = "Skirt"
214FZ_SLOT_LEGS5 = "Legs5"
215FZ_SLOT_DRESS = "Dress"
216FZ_SLOT_SWEATER = "Sweater"
217FZ_SLOT_SWEATER_HAT = "SweaterHat"
218FZ_SLOT_JACKET = "Jacket"
219FZ_SLOT_JACKET_DOWN = "Jacket_Down"
220FZ_SLOT_JACKET_BULKY = "Jacket_Bulky"
221FZ_SLOT_JACKET_HAT = "JacketHat"
222FZ_SLOT_JACKET_HAT_BULKY = "JacketHat_Bulky"
223FZ_SLOT_JACKET_SUIT = "JacketSuit"
224FZ_SLOT_FULL_SUIT = "FullSuit"
225FZ_SLOT_BOILDER_SUIT = "Boilersuit"
226FZ_SLOT_FULL_SUIT_HEAD = "FullSuitHead"
227FZ_SLOT_FULL_TOP = "FullTop"
228FZ_SLOT_BATH_ROBE = "BathRobe"
229FZ_SLOT_SHOES = "Shoes"
230FZ_SLOT_FANNY_PACK_FRONT = "FannyPackFront"
231FZ_SLOT_FANNY_PACK_BACK = "FannyPackBack"
232FZ_SLOT_AMMO_STRAP = "AmmoStrap"
233FZ_SLOT_TORSO_EXTRA = "TorsoExtra"
234FZ_SLOT_TORSO_EXTRA_VEST = "TorsoExtraVest"
235FZ_SLOT_TAIL = "Tail"
236FZ_SLOT_BACK = "Back"
237FZ_SLOT_LEFT_EYE = "LeftEye"
238FZ_SLOT_RIGHT_EYE = "RightEye"
239FZ_SLOT_EYES = "Eyes"
240FZ_SLOT_SCARF = "Scarf"
241FZ_SLOT_ZED_DMG = "ZedDmg"
243FrameworkZ.Characters.DefaultData = {
244 [FZ_ENUM_CHARACTER_INFO_FACTION] = "",
245 [FZ_ENUM_CHARACTER_INFO_GENDER] = "",
246 [FZ_ENUM_CHARACTER_INFO_NAME] = "",
247 [FZ_ENUM_CHARACTER_INFO_DESCRIPTION] = "",
248 [FZ_ENUM_CHARACTER_INFO_AGE] = -1,
249 [FZ_ENUM_CHARACTER_INFO_HEIGHT] = -1,
250 [FZ_ENUM_CHARACTER_INFO_WEIGHT] = -1,
251 [FZ_ENUM_CHARACTER_INFO_PHYSIQUE] = "",
252 [FZ_ENUM_CHARACTER_INFO_EYE_COLOR] = "",
253 [FZ_ENUM_CHARACTER_INFO_BEARD_COLOR] = "",
254 [FZ_ENUM_CHARACTER_INFO_HAIR_COLOR] = "",
255 [FZ_ENUM_CHARACTER_INFO_SKIN_COLOR] = "",
256 [FZ_ENUM_CHARACTER_INFO_HAIR_STYLE] = "",
257 [FZ_ENUM_CHARACTER_INFO_BEARD_STYLE] = "",
258 [FZ_ENUM_CHARACTER_SLOT_BANDAGE] = {},
259 [FZ_ENUM_CHARACTER_SLOT_WOUND] = {},
260 [FZ_ENUM_CHARACTER_SLOT_BELT_EXTRA] = {},
261 [FZ_ENUM_CHARACTER_SLOT_BELT] = {},
262 [FZ_ENUM_CHARACTER_SLOT_BELLY_BUTTON] = {},
263 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_FULL_FACE] = {},
264 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_EYES] = {},
265 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_EYES_SHADOW] = {},
266 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_LIPS] = {},
267 [FZ_ENUM_CHARACTER_SLOT_MASK] = {},
268 [FZ_ENUM_CHARACTER_SLOT_MASK_EYES] = {},
269 [FZ_ENUM_CHARACTER_SLOT_MASK_FULL] = {},
270 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR] = {},
271 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_BOTTOM] = {},
272 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_TOP] = {},
273 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_EXTRA1] = {},
274 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_EXTRA2] = {},
275 [FZ_ENUM_CHARACTER_SLOT_HAT] = {},
276 [FZ_ENUM_CHARACTER_SLOT_FULL_HAT] = {},
277 [FZ_ENUM_CHARACTER_SLOT_EARS] = {},
278 [FZ_ENUM_CHARACTER_SLOT_EAR_TOP] = {},
279 [FZ_ENUM_CHARACTER_SLOT_NOSE] = {},
280 [FZ_ENUM_CHARACTER_SLOT_TORSO1] = {},
281 [FZ_ENUM_CHARACTER_SLOT_TORSO_LEGS1] = {},
282 [FZ_ENUM_CHARACTER_SLOT_TANK_TOP] = {},
283 [FZ_ENUM_CHARACTER_SLOT_TSHIRT] = {},
284 [FZ_ENUM_CHARACTER_SLOT_SHORT_SLEEVE_SHIRT] = {},
285 [FZ_ENUM_CHARACTER_SLOT_LEFT_WRIST] = {},
286 [FZ_ENUM_CHARACTER_SLOT_RIGHT_WRIST] = {},
287 [FZ_ENUM_CHARACTER_SLOT_SHIRT] = {},
288 [FZ_ENUM_CHARACTER_SLOT_NECK] = {},
289 [FZ_ENUM_CHARACTER_SLOT_NECKLACE] = {},
290 [FZ_ENUM_CHARACTER_SLOT_NECKLACE_LONG] = {},
291 [FZ_ENUM_CHARACTER_SLOT_RIGHT_MIDDLE_FINGER] = {},
292 [FZ_ENUM_CHARACTER_SLOT_LEFT_MIDDLE_FINGER] = {},
293 [FZ_ENUM_CHARACTER_SLOT_LEFT_RING_FINGER] = {},
294 [FZ_ENUM_CHARACTER_SLOT_RIGHT_RING_FINGER] = {},
295 [FZ_ENUM_CHARACTER_SLOT_HANDS] = {},
296 [FZ_ENUM_CHARACTER_SLOT_HANDS_LEFT] = {},
297 [FZ_ENUM_CHARACTER_SLOT_HANDS_RIGHT] = {},
298 [FZ_ENUM_CHARACTER_SLOT_SOCKS] = {},
299 [FZ_ENUM_CHARACTER_SLOT_LEGS1] = {},
300 [FZ_ENUM_CHARACTER_SLOT_PANTS] = {},
301 [FZ_ENUM_CHARACTER_SLOT_SKIRT] = {},
302 [FZ_ENUM_CHARACTER_SLOT_LEGS5] = {},
303 [FZ_ENUM_CHARACTER_SLOT_DRESS] = {},
304 [FZ_ENUM_CHARACTER_SLOT_SWEATER] = {},
305 [FZ_ENUM_CHARACTER_SLOT_SWEATER_HAT] = {},
306 [FZ_ENUM_CHARACTER_SLOT_JACKET] = {},
307 [FZ_ENUM_CHARACTER_SLOT_JACKET_DOWN] = {},
308 [FZ_ENUM_CHARACTER_SLOT_JACKET_BULKY] = {},
309 [FZ_ENUM_CHARACTER_SLOT_JACKET_HAT] = {},
310 [FZ_ENUM_CHARACTER_SLOT_JACKET_HAT_BULKY] = {},
311 [FZ_ENUM_CHARACTER_SLOT_JACKET_SUIT] = {},
312 [FZ_ENUM_CHARACTER_SLOT_FULL_SUIT] = {},
313 [FZ_ENUM_CHARACTER_SLOT_BOILDER_SUIT] = {},
314 [FZ_ENUM_CHARACTER_SLOT_FULL_SUIT_HEAD] = {},
315 [FZ_ENUM_CHARACTER_SLOT_FULL_TOP] = {},
316 [FZ_ENUM_CHARACTER_SLOT_BATH_ROBE] = {},
317 [FZ_ENUM_CHARACTER_SLOT_SHOES] = {},
318 [FZ_ENUM_CHARACTER_SLOT_FANNY_PACK_FRONT] = {},
319 [FZ_ENUM_CHARACTER_SLOT_FANNY_PACK_BACK] = {},
320 [FZ_ENUM_CHARACTER_SLOT_AMMO_STRAP] = {},
321 [FZ_ENUM_CHARACTER_SLOT_TORSO_EXTRA] = {},
322 [FZ_ENUM_CHARACTER_SLOT_TORSO_EXTRA_VEST] = {},
323 [FZ_ENUM_CHARACTER_SLOT_TAIL] = {},
324 [FZ_ENUM_CHARACTER_SLOT_BACK] = {},
325 [FZ_ENUM_CHARACTER_SLOT_LEFT_EYE] = {},
326 [FZ_ENUM_CHARACTER_SLOT_RIGHT_EYE] = {},
327 [FZ_ENUM_CHARACTER_SLOT_EYES] = {},
328 [FZ_ENUM_CHARACTER_SLOT_SCARF] = {},
329 [FZ_ENUM_CHARACTER_SLOT_ZED_DMG] = {}
331
332FrameworkZ.Characters.SlotList = {
333 [FZ_ENUM_CHARACTER_SLOT_BANDAGE] = FZ_SLOT_BANDAGE,
334 [FZ_ENUM_CHARACTER_SLOT_WOUND] = FZ_SLOT_WOUND,
335 [FZ_ENUM_CHARACTER_SLOT_BELT_EXTRA] = FZ_SLOT_BELT_EXTRA,
336 [FZ_ENUM_CHARACTER_SLOT_BELT] = FZ_SLOT_BELT,
337 [FZ_ENUM_CHARACTER_SLOT_BELLY_BUTTON] = FZ_SLOT_BELLY_BUTTON,
338 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_FULL_FACE] = FZ_SLOT_MAKEUP_FULL_FACE,
339 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_EYES] = FZ_SLOT_MAKEUP_EYES,
340 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_EYES_SHADOW] = FZ_SLOT_MAKEUP_EYES_SHADOW,
341 [FZ_ENUM_CHARACTER_SLOT_MAKEUP_LIPS] = FZ_SLOT_MAKEUP_LIPS,
342 [FZ_ENUM_CHARACTER_SLOT_MASK] = FZ_SLOT_MASK,
343 [FZ_ENUM_CHARACTER_SLOT_MASK_EYES] = FZ_SLOT_MASK_EYES,
344 [FZ_ENUM_CHARACTER_SLOT_MASK_FULL] = FZ_SLOT_MASK_FULL,
345 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR] = FZ_SLOT_UNDERWEAR,
346 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_BOTTOM] = FZ_SLOT_UNDERWEAR_BOTTOM,
347 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_TOP] = FZ_SLOT_UNDERWEAR_TOP,
348 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_EXTRA1] = FZ_SLOT_UNDERWEAR_EXTRA1,
349 [FZ_ENUM_CHARACTER_SLOT_UNDERWEAR_EXTRA2] = FZ_SLOT_UNDERWEAR_EXTRA2,
350 [FZ_ENUM_CHARACTER_SLOT_HAT] = FZ_SLOT_HAT,
351 [FZ_ENUM_CHARACTER_SLOT_FULL_HAT] = FZ_SLOT_FULL_HAT,
352 [FZ_ENUM_CHARACTER_SLOT_EARS] = FZ_SLOT_EARS,
353 [FZ_ENUM_CHARACTER_SLOT_EAR_TOP] = FZ_SLOT_EAR_TOP,
354 [FZ_ENUM_CHARACTER_SLOT_NOSE] = FZ_SLOT_NOSE,
355 [FZ_ENUM_CHARACTER_SLOT_TORSO1] = FZ_SLOT_TORSO1,
356 [FZ_ENUM_CHARACTER_SLOT_TORSO_LEGS1] = FZ_SLOT_TORSO_LEGS1,
357 [FZ_ENUM_CHARACTER_SLOT_TANK_TOP] = FZ_SLOT_TANK_TOP,
358 [FZ_ENUM_CHARACTER_SLOT_TSHIRT] = FZ_SLOT_TSHIRT,
359 [FZ_ENUM_CHARACTER_SLOT_SHORT_SLEEVE_SHIRT] = FZ_SLOT_SHORT_SLEEVE_SHIRT,
360 [FZ_ENUM_CHARACTER_SLOT_LEFT_WRIST] = FZ_SLOT_LEFT_WRIST,
361 [FZ_ENUM_CHARACTER_SLOT_RIGHT_WRIST] = FZ_SLOT_RIGHT_WRIST,
362 [FZ_ENUM_CHARACTER_SLOT_SHIRT] = FZ_SLOT_SHIRT,
363 [FZ_ENUM_CHARACTER_SLOT_NECK] = FZ_SLOT_NECK,
364 [FZ_ENUM_CHARACTER_SLOT_NECKLACE] = FZ_SLOT_NECKLACE,
365 [FZ_ENUM_CHARACTER_SLOT_NECKLACE_LONG] = FZ_SLOT_NECKLACE_LONG,
366 [FZ_ENUM_CHARACTER_SLOT_RIGHT_MIDDLE_FINGER] = FZ_SLOT_RIGHT_MIDDLE_FINGER,
367 [FZ_ENUM_CHARACTER_SLOT_LEFT_MIDDLE_FINGER] = FZ_SLOT_LEFT_MIDDLE_FINGER,
368 [FZ_ENUM_CHARACTER_SLOT_LEFT_RING_FINGER] = FZ_SLOT_LEFT_RING_FINGER,
369 [FZ_ENUM_CHARACTER_SLOT_RIGHT_RING_FINGER] = FZ_SLOT_RIGHT_RING_FINGER,
370 [FZ_ENUM_CHARACTER_SLOT_HANDS] = FZ_SLOT_HANDS,
371 [FZ_ENUM_CHARACTER_SLOT_HANDS_LEFT] = FZ_SLOT_HANDS_LEFT,
372 [FZ_ENUM_CHARACTER_SLOT_HANDS_RIGHT] = FZ_SLOT_HANDS_RIGHT,
373 [FZ_ENUM_CHARACTER_SLOT_SOCKS] = FZ_SLOT_SOCKS,
374 [FZ_ENUM_CHARACTER_SLOT_LEGS1] = FZ_SLOT_LEGS1,
375 [FZ_ENUM_CHARACTER_SLOT_PANTS] = FZ_SLOT_PANTS,
376 [FZ_ENUM_CHARACTER_SLOT_SKIRT] = FZ_SLOT_SKIRT,
377 [FZ_ENUM_CHARACTER_SLOT_LEGS5] = FZ_SLOT_LEGS5,
378 [FZ_ENUM_CHARACTER_SLOT_DRESS] = FZ_SLOT_DRESS,
379 [FZ_ENUM_CHARACTER_SLOT_SWEATER] = FZ_SLOT_SWEATER,
380 [FZ_ENUM_CHARACTER_SLOT_SWEATER_HAT] = FZ_SLOT_SWEATER_HAT,
381 [FZ_ENUM_CHARACTER_SLOT_JACKET] = FZ_SLOT_JACKET,
382 [FZ_ENUM_CHARACTER_SLOT_JACKET_DOWN] = FZ_SLOT_JACKET_DOWN,
383 [FZ_ENUM_CHARACTER_SLOT_JACKET_BULKY] = FZ_SLOT_JACKET_BULKY,
384 [FZ_ENUM_CHARACTER_SLOT_JACKET_HAT] = FZ_SLOT_JACKET_HAT,
385 [FZ_ENUM_CHARACTER_SLOT_JACKET_HAT_BULKY] = FZ_SLOT_JACKET_HAT_BULKY,
386 [FZ_ENUM_CHARACTER_SLOT_JACKET_SUIT] = FZ_SLOT_JACKET_SUIT,
387 [FZ_ENUM_CHARACTER_SLOT_FULL_SUIT] = FZ_SLOT_FULL_SUIT,
388 [FZ_ENUM_CHARACTER_SLOT_BOILDER_SUIT] = FZ_SLOT_BOILDER_SUIT,
389 [FZ_ENUM_CHARACTER_SLOT_FULL_SUIT_HEAD] = FZ_SLOT_FULL_SUIT_HEAD,
390 [FZ_ENUM_CHARACTER_SLOT_FULL_TOP] = FZ_SLOT_FULL_TOP,
391 [FZ_ENUM_CHARACTER_SLOT_BATH_ROBE] = FZ_SLOT_BATH_ROBE,
392 [FZ_ENUM_CHARACTER_SLOT_SHOES] = FZ_SLOT_SHOES,
393 [FZ_ENUM_CHARACTER_SLOT_FANNY_PACK_FRONT] = FZ_SLOT_FANNY_PACK_FRONT,
394 [FZ_ENUM_CHARACTER_SLOT_FANNY_PACK_BACK] = FZ_SLOT_FANNY_PACK_BACK,
395 [FZ_ENUM_CHARACTER_SLOT_AMMO_STRAP] = FZ_SLOT_AMMO_STRAP,
396 [FZ_ENUM_CHARACTER_SLOT_TORSO_EXTRA] = FZ_SLOT_TORSO_EXTRA,
397 [FZ_ENUM_CHARACTER_SLOT_TORSO_EXTRA_VEST] = FZ_SLOT_TORSO_EXTRA_VEST,
398 [FZ_ENUM_CHARACTER_SLOT_TAIL] = FZ_SLOT_TAIL,
399 [FZ_ENUM_CHARACTER_SLOT_BACK] = FZ_SLOT_BACK,
400 [FZ_ENUM_CHARACTER_SLOT_LEFT_EYE] = FZ_SLOT_LEFT_EYE,
401 [FZ_ENUM_CHARACTER_SLOT_RIGHT_EYE] = FZ_SLOT_RIGHT_EYE,
402 [FZ_ENUM_CHARACTER_SLOT_EYES] = FZ_SLOT_EYES,
403 [FZ_ENUM_CHARACTER_SLOT_SCARF] = FZ_SLOT_SCARF,
404 [FZ_ENUM_CHARACTER_SLOT_ZED_DMG] = FZ_SLOT_ZED_DMG
405}
407FrameworkZ.Characters.List = {}
409--! \brief Unique IDs list for characters.
410FrameworkZ.Characters.Cache = {}
411
412--! \brief Deprecated. To be removed.
413FrameworkZ.Characters.EquipmentSlots = {
414 EQUIPMENT_SLOT_HEAD,
415 EQUIPMENT_SLOT_FACE,
416 EQUIPMENT_SLOT_EARS,
417 EQUIPMENT_SLOT_BACKPACK,
418 EQUIPMENT_SLOT_GLOVES,
419 EQUIPMENT_SLOT_UNDERSHIRT,
420 EQUIPMENT_SLOT_OVERSHIRT,
421 EQUIPMENT_SLOT_VEST,
422 EQUIPMENT_SLOT_BELT,
423 EQUIPMENT_SLOT_PANTS,
424 EQUIPMENT_SLOT_SOCKS,
425 EQUIPMENT_SLOT_SHOES
427FrameworkZ.Characters = FrameworkZ.Foundation:NewModule(FrameworkZ.Characters, "Characters")
429--! \brief Character class for FrameworkZ.
430--! \class CHARACTER
431local CHARACTER = {}
432CHARACTER.__index = CHARACTER
433
434--! \brief Save the character's data from the character object.
435--! \param shouldTransmit \boolean (Optional) Whether or not to transmit the character's data to the server.
436--! \return \boolean Whether or not the character was successfully saved.
437function CHARACTER:Save(shouldTransmit)
438 if shouldTransmit == nil then shouldTransmit = true end
439
440 local player = FrameworkZ.Players:GetPlayerByID(self:GetIsoPlayer():getUsername())
441 local characterData = FrameworkZ.Players:GetCharacterDataByID(self:GetIsoPlayer():getUsername(), self.id)
443 if not player or not characterData then return false end
444 FrameworkZ.Players:ResetCharacterSaveInterval()
445
446 -- Save "physical" character inventory
447 local inventory = self:GetIsoPlayer():getInventory():getItems()
448 characterData.INVENTORY_PHYSICAL = {}
449 for i = 0, inventory:size() - 1 do
450 table.insert(characterData.INVENTORY_PHYSICAL, {id = inventory:get(i):getFullType()})
451 end
452
453 -- Save logical character inventory
454 characterData.INVENTORY_LOGICAL = self.inventory.items
455
456 -- Save character equipment
457 characterData.EQUIPMENT_SLOT_HEAD = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_HEAD) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_HEAD):getFullType()} or nil
458 characterData.EQUIPMENT_SLOT_FACE = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_FACE) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_FACE):getFullType()} or nil
459 characterData.EQUIPMENT_SLOT_EARS = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_EARS) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_EARS):getFullType()} or nil
460 characterData.EQUIPMENT_SLOT_BACKPACK = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_BACKPACK) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_BACKPACK):getFullType()} or nil
461 characterData.EQUIPMENT_SLOT_GLOVES = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_GLOVES) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_GLOVES):getFullType()} or nil
462 characterData.EQUIPMENT_SLOT_UNDERSHIRT = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_UNDERSHIRT) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_UNDERSHIRT):getFullType()} or nil
463 characterData.EQUIPMENT_SLOT_OVERSHIRT = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_OVERSHIRT) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_OVERSHIRT):getFullType()} or nil
464 characterData.EQUIPMENT_SLOT_VEST = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_VEST) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_VEST):getFullType()} or nil
465 characterData.EQUIPMENT_SLOT_BELT = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_BELT) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_BELT):getFullType()} or nil
466 characterData.EQUIPMENT_SLOT_PANTS = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_PANTS) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_PANTS):getFullType()} or nil
467 characterData.EQUIPMENT_SLOT_SOCKS = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_SOCKS) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_SOCKS):getFullType()} or nil
468 characterData.EQUIPMENT_SLOT_SHOES = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_SHOES) and {id = self:GetIsoPlayer():getWornItem(EQUIPMENT_SLOT_SHOES):getFullType()} or nil
469
470 -- Save character position/direction angle
471 characterData.POSITION_X = self:GetIsoPlayer():getX()
472 characterData.POSITION_Y = self:GetIsoPlayer():getY()
473 characterData.POSITION_Z = self:GetIsoPlayer():getZ()
474 characterData.DIRECTION_ANGLE = self:GetIsoPlayer():getDirectionAngle()
475
476 local getStats = self:GetIsoPlayer():getStats()
477 characterData.STAT_HUNGER = getStats:getHunger()
478 characterData.STAT_THIRST = getStats:getThirst()
479 characterData.STAT_FATIGUE = getStats:getFatigue()
480 characterData.STAT_STRESS = getStats:getStress()
481 characterData.STAT_PAIN = getStats:getPain()
482 characterData.STAT_PANIC = getStats:getPanic()
483 characterData.STAT_BOREDOM = getStats:getBoredom()
484 --characterData.STAT_UNHAPPINESS = getStats:getUnhappyness()
485 characterData.STAT_DRUNKENNESS = getStats:getDrunkenness()
486 characterData.STAT_ENDURANCE = getStats:getEndurance()
487 --characterData.STAT_TIREDNESS = getStats:getTiredness()
488
489 --[[
490 modData.status.health = character:getBodyDamage():getOverallBodyHealth()
491 modData.status.injuries = character:getBodyDamage():getInjurySeverity()
492 modData.status.hyperthermia = character:getBodyDamage():getTemperature()
493 modData.status.hypothermia = character:getBodyDamage():getColdStrength()
494 modData.status.wetness = character:getBodyDamage():getWetness()
495 modData.status.hasCold = character:getBodyDamage():HasACold()
496 modData.status.sick = character:getBodyDamage():getSicknessLevel()
497 --]]
498
499 player.Characters[self.id] = characterData
500
501 if isClient() and shouldTransmit == true then
502 self:GetIsoPlayer():transmitModData()
503 end
504
505 return true
506end
507
508--! \brief Destroy a character. This will remove the character from the list of characters and is usually called after a player has disconnected.
509function CHARACTER:Destroy()
510 --[[
511 if isClient() then
512 sendClientCommand("FZ_CHAR", "destroy", {self:GetIsoPlayer():getUsername()})
513 end
514 --]]
515
516 self.IsoPlayer = nil
517end
518
519--! \brief Initialize the default items for a character based on their faction. Called when FZ_CHAR mod data is first created.
520function CHARACTER:InitializeDefaultItems()
521 local faction = FrameworkZ.Factions:GetFactionByID(self.faction)
522
523 if faction then
524 for k, v in pairs(faction.defaultItems) do
525 self:GiveItems(k, v)
526 end
527 end
528end
529
530function CHARACTER:GetAge() return self.Age end
531function CHARACTER:SetAge(age) self.Age = age end
532
533function CHARACTER:GetBeardColor() return self.BeardColor end
534function CHARACTER:SetBeardColor(beardColor) self.BeardColor = beardColor end
535
536function CHARACTER:GetBeardStyle() return self.BeardStyle end
537function CHARACTER:SetBeardStyle(beardStyle) self.BeardStyle = beardStyle end
538
539function CHARACTER:GetDescription() return self.Description end
540function CHARACTER:SetDescription(description) self.Description = description end
541
542function CHARACTER:GetEyeColor() return self.EyeColor end
543function CHARACTER:SetEyeColor(eyeColor) self.EyeColor = eyeColor end
544
545function CHARACTER:GetFaction() return self.Faction end
546function CHARACTER:SetFaction(faction) self.Faction = faction end
547
548function CHARACTER:GetHairColor() return self.HairColor end
549function CHARACTER:SetHairColor(hairColor) self.HairColor = hairColor end
550
551function CHARACTER:GetHairStyle() return self.HairStyle end
552function CHARACTER:SetHairStyle(hairStyle) self.HairStyle = hairStyle end
553
554function CHARACTER:GetHeight() return self.Height end
555function CHARACTER:SetHeight(height) self.Height = height end
556
557function CHARACTER:GetID() return self.ID end
558function CHARACTER:SetID(id) self.ID = id end
559
560function CHARACTER:GetInventory() return self.Inventory end
561function CHARACTER:SetInventory(inventory) self.Inventory = inventory end
562
563function CHARACTER:GetIsoPlayer() return self.IsoPlayer end
564function CHARACTER:SetIsoPlayer(isoPlayer) print("Failed to set IsoPlayer object to '" .. tostring(isoPlayer) .. "'. IsoPlayer is read-only and must be set upon object creation.") end
565
566function CHARACTER:GetLogicalInventory() return self.LogicalInventory end
567function CHARACTER:SetLogicalInventory(logicalInventory) self.LogicalInventory = logicalInventory end
568
569function CHARACTER:GetName() return self.Name end
570function CHARACTER:SetName(name) self.Name = name end
571
572function CHARACTER:GetPhysicalInventory() return self.PhysicalInventory end
573function CHARACTER:SetPhysicalInventory(physicalInventory) self.PhysicalInventory = physicalInventory end
574
575function CHARACTER:GetPhysique() return self.Physique end
576function CHARACTER:SetPhysique(physique) self.Physique = physique end
577
578function CHARACTER:GetPlayer() return self.Player end
579function CHARACTER:SetPlayer(player) self.Player = player end
580
581function CHARACTER:GetRecognizes() return self.Recognizes end
582function CHARACTER:SetRecognizes(recognizes) self.Recognizes = recognizes end
583
584function CHARACTER:GetSkinColor() return self.SkinColor end
585function CHARACTER:SetSkinColor(skinColor) self.SkinColor = skinColor end
586
587function CHARACTER:GetUID() return self.UID end
588function CHARACTER:SetUID(uid) self.UID = uid end
589
590function CHARACTER:GetUsername() return self.Username end
591function CHARACTER:SetUsername(username) print("Failed to set username to: '" .. username .. "'. Username is read-only and must be set upon object creation.") end
592
593function CHARACTER:GetWeight() return self.Weight end
594function CHARACTER:SetWeight(weight) self.Weight = weight end
595
596function CHARACTER:GetSaveableData()
597 return FrameworkZ.Foundation:ProcessSaveableData(self, {"isoPlayer"}, {"inventory"})
598end
599
600--[[ Note: Setup UID on Player object inside of stored Characters at Character
601function CHARACTER:SetUID(uid)
602 local player = FrameworkZ.Players:GetPlayerByID(self:GetUsername()) if not player then return false, "Could not find player by ID." end
603
604 self.uid = uid
605 player.Characters[self:GetID()].META_UID = uid
606
607 return true
608end
609--]]
610
611--! \brief Give a character items by the specified amount.
612--! \param itemID \string The ID of the item to give.
613--! \param amount \integer The amount of the item to give.
614function CHARACTER:GiveItems(uniqueID, amount)
615 for i = 1, amount do
616 self:GiveItem(uniqueID)
617 end
618end
619
620function CHARACTER:TakeItems(uniqueID, amount)
621 for i = 1, amount do
622 self:TakeItem(uniqueID)
623 end
624end
625
626--! \brief Give a character an item.
627--! \param uniqueID \string The ID of the item to give.
628--! \return \boolean Whether or not the item was successfully given.
629function CHARACTER:GiveItem(uniqueID)
630 local inventory = self:GetInventory()
631 if not inventory then return false, "Failed to find inventory." end
632 local instance, message = FrameworkZ.Items:CreateItem(uniqueID, self:GetIsoPlayer())
633 if not instance then return false, "Failed to create item: " .. message end
634
635 inventory:AddItem(instance)
636
637 return instance, message
638end
639
640--! \brief Take an item from a character's inventory.
641--! \param uniqueID \string The unique ID of the item to take.
642--! \return \boolean \string Whether or not the item was successfully taken and the success or failure message.
643function CHARACTER:TakeItem(uniqueID)
644 local success, message = FrameworkZ.Items:RemoveItemInstanceByUniqueID(self:GetIsoPlayer():getUsername(), uniqueID)
645
646 if success then
647 return true, "Successfully took " .. uniqueID .. "."
648 end
649
650 return false, message
651end
652
653--! \brief Take an item from a character's inventory by its instance ID. Useful for taking a specific item from a stack.
654--! \param instanceID \integer The instance ID of the item to take.
655--! \return \boolean \string Whether or not the item was successfully taken and the success or failure message.
656function CHARACTER:TakeItemByInstanceID(instanceID)
657 local success, message = FrameworkZ.Items:RemoveInstance(instanceID, self:GetIsoPlayer():getUsername())
658
659 if success then
660 return true, "Successfully took item with instance ID " .. instanceID .. "."
661 end
662
663 return false, "Failed to find item with instance ID " .. instanceID .. ": " .. message
664end
665
666--! \brief Checks if a character is a citizen.
667--! \return \boolean Whether or not the character is a citizen.
668function CHARACTER:IsCitizen()
669 if not self.faction then return false end
670
671 if self.faction == FACTION_CITIZEN then
672 return true
673 end
674
675 return false
676end
677
678--! \brief Checks if a character is a combine.
679--! \return \boolean Whether or not the character is a combine.
680function CHARACTER:IsCombine()
681 if not self.faction then return false end
682
683 if self.faction == FACTION_CP then
684 return true
685 elseif self.faction == FACTION_OTA then
686 return true
687 elseif self.faction == FACTION_ADMINISTRATOR then
688 return true
689 end
690
691 return false
692end
693
694function CHARACTER:AddRecognition(character, alias)
695 if not character then return false, "Character not supplied in parameters." end
696
697 if not self:GetRecognizes()[character:GetUID()] then
698 self:GetRecognizes()[character:GetUID()] = alias or character:GetName()
699 return true, "Successfully added character to recognition list."
700 end
701
702 return false, "Character already exists in recognition list."
703end
704
705function CHARACTER:GetRecognition(character)
706 if not character then return false, "Character not supplied in parameters." end
707
708 local recognizes = self:GetRecognizes()
709
710 if recognizes[character:GetUID()] then
711 return recognizes[character:GetUID()]
712 else
713 return "[Unrecognized]"
714 end
715end
716
717function CHARACTER:RecognizesCharacter(character)
718 if not character then return false, "Character not supplied in parameters." end
719
720 if self:GetRecognizes()[character:GetUID()] then
721 return true
722 end
723
724 return false
725end
726
727function CHARACTER:RestoreData()
728 local player = self:GetPlayer() if not player then return false, "Player not found." end
729 local characterData = player:GetCharacterDataByID(self:GetID()) if not characterData then return false, "Character data not found." end
730
731 self:SetAge(characterData.INFO_AGE)
732 self:SetBeardColor(characterData.INFO_BEARD_COLOR)
733 self:SetBeardStyle(characterData.INFO_BEARD_STYLE)
734 self:SetDescription(characterData.INFO_DESCRIPTION)
735 self:SetEyeColor(characterData.INFO_EYE_COLOR)
736 self:SetFaction(characterData.INFO_FACTION)
737 self:SetHairColor(characterData.INFO_HAIR_COLOR)
738 self:SetHairStyle(characterData.INFO_HAIR_STYLE)
739 self:SetHeight(characterData.INFO_HEIGHT)
740 self:SetID(characterData.META_ID)
741 self:SetLogicalInventory(characterData.INVENTORY_LOGICAL)
742 self:SetName(characterData.INFO_NAME)
743 self:SetPhysique(characterData.INFO_PHYSIQUE)
744 self:SetPhysicalInventory(characterData.INVENTORY_PHYSICAL)
745 self:SetRecognizes(characterData.META_RECOGNIZES or {})
746 self:SetSkinColor(characterData.INFO_SKIN_COLOR)
747 self:SetUID(characterData.META_UID)
748 self:SetWeight(characterData.INFO_WEIGHT)
749
750 return true, "Character data restored."
751end
752
753--! \brief Initialize a character.
754--! \return \string username
755function CHARACTER:Initialize()
756 if not self:GetIsoPlayer() then return false, "IsoPlayer not set." end
757
758 --self:GetInventory():Initialize()
759 local successfullyRestored, restoreMessage = self:RestoreData() if not successfullyRestored then return false, "Failed to restore character data: " .. restoreMessage end
760
761 if not self:RecognizesCharacter(self) then
762 local successfullyRecognizes, recognizeMessage = self:AddRecognition(self) if not successfullyRecognizes then return false, "Failed to add self to recognition list: " .. recognizeMessage end
763 end
764
765 return true, "Character initialized."
766end
768--! \brief Create a new character object.
769--! \param username \string The player's username as their ID.
770--! \param id \integer The character's ID from the player stored data.
771--! \param data \table (Optional) The character's data stored on the object.
772--! \return \table The new character object.
773function FrameworkZ.Characters:New(isoPlayer, id)
774 if not isoPlayer then return false, "IsoPlayer is invalid." end
775
776 local username = isoPlayer:getUsername()
777 local object = {
778 ID = id or -1,
779 Player = FrameworkZ.Players:GetPlayerByID(username),
781 Username = username,
782 Inventory = FrameworkZ.Inventories:New(username),
783 CustomData = {},
784 Recognizes = {}
785 }
786
787 if object.ID <= -1 then return false, "New character ID is invalid." end
788 if not object.Player then return false, "Player not found." end
789 if not object.Inventory then return false, "Inventory not found." end
790 if object.Player and not object.Player:GetCharacterDataByID(object.ID) then return false, "Player character data not found." end
792 setmetatable(object, CHARACTER)
794 return object
795end
796
797--! \brief Initialize a character.
798--! \param username \string The player's username.
799--! \param character \table The character's object data.
800--! \return \string The username added to the list of characters.
801function FrameworkZ.Characters:Initialize(isoPlayer, id)
802 local character, message = FrameworkZ.Characters:New(isoPlayer, id) if not character then return false, "Could not create new character object, " .. message end
803 local username = character:GetUsername()
804 local success, message2 = character:Initialize() if not success then return false, "Failed to initialize character object: " .. message2 end
805
806 if not self:AddToList(username, character) then
807 return false, "Failed to add character to list."
808 end
810 if not self:AddToCache(character:GetUID(), character) then
811 self:RemoveFromList(username)
812 return false, "Failed to add character to cache."
813 end
814
815 return character
816end
818function FrameworkZ.Characters:AddToList(username, character)
819 if not username or not character then return false end
820
821 self.List[username] = character
822 return self.List[username]
823end
824
825function FrameworkZ.Characters:RemoveFromList(username)
826 if not username then return false end
829 return true
830end
831
832function FrameworkZ.Characters:AddToCache(uid, character)
833 if not uid or not character then return false end
835 self.Cache[uid] = character
836 return self.Cache[uid]
837end
838
839function FrameworkZ.Characters:RemoveFromCache(uid)
840 if not uid then return false end
841
843 return true
844end
845
846--! \brief Gets the user's loaded character by their ID.
847--! \param username \string The player's username to get their character object with.
848--! \return \table The character object from the list of characters.
849function FrameworkZ.Characters:GetCharacterByID(username)
850 local character = self.List[username] or nil
852 return character
853end
854
855function FrameworkZ.Characters:GetCharacterByUID(uid)
856 local character = self.Cache[uid] or nil
857
858 return character
859end
860
861function FrameworkZ.Characters:GetCharacterInventoryByID(username)
862 local character = self:GetCharacterByID(username)
863
864 if character then
865 return character:GetInventory()
866 end
867
868 return nil
869end
871--! \brief Saves the user's currently loaded character.
872--! \param username \string The player's username to get their loaded character from.
873--! \return \boolean Whether or not the character was successfully saved.
875 if not username then return false end
877 local character = self:GetCharacterByID(username)
879 if character then
880 return character:Save()
881 end
883 return false
884end
885
886function CHARACTER:OnPreLoad()
887 FrameworkZ.Foundation:ExecuteAllHooks("OnCharacterPreLoad", self)
888end
889FrameworkZ.Foundation:AddAllHookHandlers("OnCharacterPreLoad")
891function CHARACTER:OnLoad()
892 FrameworkZ.Foundation:ExecuteAllHooks("OnCharacterLoad", self)
893end
894FrameworkZ.Foundation:AddAllHookHandlers("OnCharacterLoad")
896function CHARACTER:OnPostLoad(firstLoad)
897 FrameworkZ.Foundation:ExecuteAllHooks("OnCharacterPostLoad", self, firstLoad) -- Does not actually call anymore
898end
899FrameworkZ.Foundation:AddAllHookHandlers("OnCharacterPostLoad")
900
901function FrameworkZ.Characters.PostLoad(data, characterData)
902 return FrameworkZ.Characters:OnPostLoad(data.isoPlayer, characterData)
903end
904FrameworkZ.Foundation:Subscribe("FrameworkZ.Characters.PostLoad", FrameworkZ.Characters.PostLoad)
906--! \brief Initializes a player's character after loading.
907--! \return \boolean Whether or not the post load was successful.
908function FrameworkZ.Characters:OnPostLoad(isoPlayer, characterData)
909 local username = isoPlayer:getUsername()
910 local player = FrameworkZ.Players:GetPlayerByID(username)
911 local character = FrameworkZ.Characters:New(username, characterData.META_ID)
912
913 if not player or not character then return false end
914
915 character:OnPreLoad()
916
918 character.Name = characterData.INFO_NAME
919 character.Description = characterData.INFO_DESCRIPTION
920 character.Faction = characterData.INFO_FACTION
921 character.Age = characterData.INFO_AGE
922 character.HeightInches = characterData.INFO_HEIGHT
923 character.EyeColor = characterData.INFO_EYE_COLOR
924 character.HairColor = characterData.INFO_HAIR_STYLE
925 character.SkinColor = characterData.INFO_SKIN_COLOR
926 character.Physique = characterData.INFO_PHYSIQUE
927 character.Weight = characterData.INFO_WEIGHT
928 character.Recognizes = {}
930 local newInventory = FrameworkZ.Inventories:New(username)
931 local _success, _message, rebuiltInventory = FrameworkZ.Inventories:Rebuild(isoPlayer, newInventory, characterData.INVENTORY_LOGICAL or nil)
932 character.inventory = rebuiltInventory or nil
934 if character.inventory then
935 character.inventoryID = character.inventory.id
936 character.inventory:Initialize()
937 end
938
939 character:Initialize()
940 character:OnLoad()
942 player.loadedCharacter = character
943 self.Cache[characterData.META_UID] = character
944 character:SetUID(characterData.META_UID)
946 return character
947end
948
949if isClient() then
950 local currentSaveTick = 0
952 function FrameworkZ.Characters:PlayerTick(player)
953 if currentSaveTick >= FrameworkZ.Config.Options.TicksUntilCharacterSave then
954 local success, message = FrameworkZ.Players:Save(player:GetIsoPlayer():getUsername())
956 if success then
957 if FrameworkZ.Config.Options.ShouldNotifyOnCharacterSave then
958 FrameworkZ.Notifications:AddToQueue("Saved player and character data.", FrameworkZ.Notifications.Types.Success)
959 end
960 else
961 FrameworkZ.Notifications:AddToQueue(message, FrameworkZ.Notifications.Types.Danger)
962 end
965 end
966
968 end
969end
970
971function FrameworkZ.Characters:OnStorageSet(isoPlayer, command, namespace, keys, value)
972 if namespace == "Characters" then
973 if command == "Initialize" then
974 local username = keys
975 local data = value
976 local player = FrameworkZ.Players:GetPlayerByID(username) if not player then return end
977
978 if data then
979 player:SetCharacters(data)
980 end
981 end
982 end
983end
984
985function FrameworkZ.Characters:OnInitGlobalModData()
986 FrameworkZ.Foundation:RegisterNamespace("Characters")
987end
988
990
void FrameworkZ Characters MetaObject()
void characterData INVENTORY_LOGICAL()
void UnnamedFunction()
void local isClient()
void self Cache()
void player loadedCharacter()
void local getStats()
void player Characters()
void self IsoPlayer()
void local currentSaveTick()
void FrameworkZ()
void FrameworkZ Classes List()
void self faction()
void local height()
void id()
void local success
void uniqueID()
void items()
void local object()
void local instanceID
void description()
void item()
void local message
void local instance()
void self FrameworkZ UI self nil
Definition MainMenu.lua:95
void self self
Definition MainMenu.lua:89
void local player()
void processingNotification backgroundColor a()
void characterData META_ID()
void characterData META_UID()
void self CustomData()
void self username()
void saved()
void local name()
void local data()
void gamemode()
void FrameworkZ Foundation()
void local color()
void elseif command()
void isoPlayer()
void local characters()
void value()
Character class for FrameworkZ.
void RestoreData()
boolean IsCombine()
Checks if a character is a combine.
boolean Save(shouldTransmit)
Save the character's data from the character object.
void GetRecognition(character)
void OnPostLoad(firstLoad)
void TakeItems(uniqueID, amount)
boolean TakeItem(uniqueID)
Take an item from a character's inventory.
void OnPreLoad()
void GiveItems(uniqueID, amount)
Give a character items by the specified amount.
void GetSaveableData()
boolean IsCitizen()
Checks if a character is a citizen.
void Destroy()
Destroy a character. This will remove the character from the list of characters and is usually called...
boolean TakeItemByInstanceID(instanceID)
Take an item from a character's inventory by its instance ID. Useful for taking a specific item from ...
string Initialize()
Initialize a character.
void OnLoad()
CHARACTER __index
void RecognizesCharacter(character)
boolean GiveItem(uniqueID)
Give a character an item.
void AddRecognition(character, alias)
void InitializeDefaultItems()
Initialize the default items for a character based on their faction. Called when FZ_CHAR mod data is ...
void SetUID(uid)
Characters module for FrameworkZ. Defines and interacts with CHARACTER object.
EQUIPMENT_SLOT_PANTS
Deprecated. To be removed.
EQUIPMENT_SLOT_VEST
Deprecated. To be removed.
EQUIPMENT_SLOT_FACE
Deprecated. To be removed.
table New(isoPlayer, id)
Create a new character object.
FrameworkZ Characters EquipmentSlots
Deprecated. To be removed.
EQUIPMENT_SLOT_GLOVES
Deprecated. To be removed.
FrameworkZ Characters DefaultData
table GetCharacterByID(username)
Gets the user's loaded character by their ID.
FrameworkZ Characters Cache
Unique IDs list for characters.
void PostLoad(data, characterData)
EQUIPMENT_SLOT_BELT
Deprecated. To be removed.
FrameworkZ Characters SlotList
boolean OnPostLoad(isoPlayer, characterData)
Initializes a player's character after loading.
void PlayerTick(player)
EQUIPMENT_SLOT_EARS
Deprecated. To be removed.
string Initialize(isoPlayer, id)
Initialize a character.
void RemoveFromList(username)
FrameworkZ Characters List
void GetCharacterInventoryByID(username)
void AddToList(username, character)
EQUIPMENT_SLOT_BACKPACK
Deprecated. To be removed.
void OnStorageSet(isoPlayer, command, namespace, keys, value)
void AddToCache(uid, character)
boolean Save(username)
Saves the user's currently loaded character.
EQUIPMENT_SLOT_SHOES
Deprecated. To be removed.
EQUIPMENT_SLOT_OVERSHIRT
Deprecated. To be removed.
EQUIPMENT_SLOT_SOCKS
Deprecated. To be removed.
EQUIPMENT_SLOT_HEAD
Deprecated. To be removed.
EQUIPMENT_SLOT_UNDERSHIRT
Deprecated. To be removed.
The Inventories module for FrameworkZ. Defines and interacts with INVENTORY object.
Items module for FrameworkZ. Defines and interacts with ITEM object.
Definition Items.lua:18
Players module for FrameworkZ. Defines and interacts with PLAYER object.
Definition Players.lua:13