@@ -27,7 +27,8 @@ enum CharacterData {
27
27
Character_HumanDeathSounds,
28
28
Character_PanicSounds,
29
29
Character_ZombieAmbientSounds,
30
- Character_ZombieDeathSounds
30
+ Character_ZombieDeathSounds,
31
+ Character_IsSelectable
31
32
}
32
33
33
34
new gmsgClCorpse;
@@ -36,6 +37,7 @@ new g_szCharacterDir[MAX_RESOURCE_PATH_LENGTH];
36
37
37
38
new Array: g_rgCharactersData[CharacterData];
38
39
new Trie: g_iCharactersMap;
40
+ new Array: g_iSelectableCharacters;
39
41
new g_iCharacterCount = 0 ;
40
42
41
43
new g_iPlayerCharacter[MAX_PLAYERS + 1 ] = { - 1 , ... };
@@ -68,10 +70,25 @@ public plugin_init() {
68
70
g_iCwSwipeHandler = CW_GetHandler (ZP_WEAPON_SWIPE);
69
71
}
70
72
73
+ public plugin_natives () {
74
+ register_native (" ZP_Player_SetCharacter" , " Native_SetCharacter" );
75
+ }
76
+
71
77
public plugin_end () {
72
78
DestroyCharactersStore ();
73
79
}
74
80
81
+ /* --------------------------------[ Natives ]--------------------------------*/
82
+
83
+ public bool: Native_SetCharacter (iPluginId, iArgc) {
84
+ new pPlayer = get_param (1 );
85
+
86
+ new szCharacter[32 ];
87
+ get_string (2 , szCharacter, charsmax (szCharacter));
88
+
89
+ return SetCharacter (pPlayer, szCharacter);
90
+ }
91
+
75
92
/* --------------------------------[ Forwards ]--------------------------------*/
76
93
77
94
public client_connect (pPlayer) {
@@ -148,6 +165,17 @@ public Task_Ambient(iTaskId) {
148
165
149
166
/* --------------------------------[ Methods ]--------------------------------*/
150
167
168
+ bool: SetCharacter (pPlayer, const szCharacter[]) {
169
+ new iCharacter;
170
+ if (! TrieGetCell (g_iCharactersMap, szCharacter, iCharacter)) {
171
+ return false ;
172
+ }
173
+
174
+ g_iPlayerCharacter[pPlayer] = iCharacter;
175
+
176
+ return true ;
177
+ }
178
+
151
179
UpdatePlayerModel (pPlayer) {
152
180
new iCharacter = g_iPlayerCharacter[pPlayer];
153
181
@@ -174,12 +202,13 @@ UpdatePlayerCharacter(pPlayer, bool:bOverride = false) {
174
202
get_user_info (pPlayer, CHARACTER_KEY, szCharacter, charsmax (szCharacter));
175
203
176
204
new iCharacter;
177
- if (! TrieGetCell (g_iCharactersMap, szCharacter, iCharacter)) {
205
+ if (! TrieGetCell (g_iCharactersMap, szCharacter, iCharacter)
206
+ || ! ArrayGetCell (Array: g_rgCharactersData[Character_IsSelectable], iCharacter)) {
178
207
if (! bOverride) {
179
208
return ;
180
209
}
181
210
182
- iCharacter = random (g_iCharacterCount );
211
+ iCharacter = ArrayGetCell (g_iSelectableCharacters, random (ArraySize (g_iSelectableCharacters)) );
183
212
}
184
213
185
214
g_iPlayerCharacter[pPlayer] = iCharacter;
@@ -219,6 +248,8 @@ CreateCharacter() {
219
248
CrateCharacterSoundsData (iCharacter, Character_ZombieAmbientSounds);
220
249
CrateCharacterSoundsData (iCharacter, Character_ZombieDeathSounds);
221
250
251
+ ArraySetCell (Array: g_rgCharactersData[Character_IsSelectable], iCharacter, true );
252
+
222
253
g_iCharacterCount++ ;
223
254
224
255
return iCharacter;
@@ -289,6 +320,14 @@ LoadCharacter(const szName[]) {
289
320
LoadCharacterSoundsData (iCharacter, iSoundsDoc, " zombie.ambient" , Character_ZombieAmbientSounds);
290
321
LoadCharacterSoundsData (iCharacter, iSoundsDoc, " zombie.death" , Character_ZombieDeathSounds);
291
322
323
+ if (json_object_has_value (iDoc, " selectable" )) {
324
+ ArraySetCell (Array: g_rgCharactersData[Character_IsSelectable], iCharacter, json_object_get_bool (iDoc, " selectable" ));
325
+ }
326
+
327
+ if (ArrayGetCell (Array: g_rgCharactersData[Character_IsSelectable], iCharacter)) {
328
+ ArrayPushCell (g_iSelectableCharacters, iCharacter);
329
+ }
330
+
292
331
return iCharacter;
293
332
}
294
333
@@ -315,6 +354,7 @@ LoadCharacterSoundsData(iCharacter, JSON:iSoundDoc, const szKey[], CharacterData
315
354
316
355
InitializeCharactersStore () {
317
356
g_iCharactersMap = TrieCreate ();
357
+ g_iSelectableCharacters = ArrayCreate (_, RESERVED_CHARACTER_COUNT);
318
358
319
359
g_rgCharactersData[Character_HumanModel] = ArrayCreate (MAX_RESOURCE_PATH_LENGTH, RESERVED_CHARACTER_COUNT);
320
360
g_rgCharactersData[Character_ZombieModel] = ArrayCreate (MAX_RESOURCE_PATH_LENGTH, RESERVED_CHARACTER_COUNT);
@@ -323,6 +363,7 @@ InitializeCharactersStore() {
323
363
g_rgCharactersData[Character_PanicSounds] = ArrayCreate (_, RESERVED_CHARACTER_COUNT);
324
364
g_rgCharactersData[Character_ZombieAmbientSounds] = ArrayCreate (_, RESERVED_CHARACTER_COUNT);
325
365
g_rgCharactersData[Character_ZombieDeathSounds] = ArrayCreate (_, RESERVED_CHARACTER_COUNT);
366
+ g_rgCharactersData[Character_IsSelectable] = ArrayCreate (_, RESERVED_CHARACTER_COUNT);
326
367
}
327
368
328
369
DestroyCharactersStore () {
@@ -331,6 +372,7 @@ DestroyCharactersStore() {
331
372
}
332
373
333
374
TrieDestroy (g_iCharactersMap);
375
+ ArrayDestroy (g_iSelectableCharacters);
334
376
335
377
ArrayDestroy (Array: g_rgCharactersData[Character_HumanModel]);
336
378
ArrayDestroy (Array: g_rgCharactersData[Character_ZombieModel]);
0 commit comments