DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
PluginLifespan.c
См. документацию.
1//-----------------------------
2// LIFESPAN plugin
3//-----------------------------
4/*
5Lifespan plugin handles player facial hair, bloody hands, blood type in HUD
6*/
7
9{
10 CLEAN = 0,//clean needs to be 0
13 //--- ONLY LAST_INDEX BELLOW !!!
15}
16
17enum LifeSpanState
18{
23 COUNT = 4,
24}
25
26class PluginLifespan extends PluginBase
27{
28 protected static const int LIFESPAN_MIN = 0;
29 protected static const int LIFESPAN_MAX = 240; // value in minutes when player achieved maximum age in order to have full beard
30 protected int m_FakePlaytime;
31
36
37 //========================================
38 // GetInstance
39 //========================================
41 {
43 }
44
52
53//-----------------------------
54// Player load from config
55//-----------------------------
57 {
60
61 const int LIFESPAN_LENGTH = LIFESPAN_MAX - LIFESPAN_MIN;
62
63 //cfg_name = 'CfgVehicles'
64 // config_name = 'CfgVehicles'
65 //cfg_class_count = 2348
66 // config_count = 2348
67 //cfg_class_name = 'SurvivorMale_Base'
68 // survivor_name = 'SurvivorMale_Base'
69 //cfg_class_fullname = 'CfgVehicles SurvivorMale_Base'
70 // survivor_path = 'CfgVehicles SurvivorMale_Base'
71 //cfg_class_member_count = 10
72 // survivor_lifespan_count = 10
73 //cfg_class_member_name = 'Lifespan'
74 // survivor_lifespan_name = 'Lifespan'
75 //cfg_class_member_fullname = 'CfgVehicles SurvivorMale_Base Lifespan';
76 // survivor_lifespan_path = 'CfgVehicles SurvivorMale_Base Lifespan';
77 //cfg_class_member_member_count = 1
78 // survivor_lifespan_beard_count = 1
79 //cfg_class_member_member_name = 'Beard'
80 // survivor_lifespan_beard_name = 'Beard'
81 //cfg_class_member_member_fullname = 'CfgVehicles SurvivorMale_Base Lifespan Beard'
82 // survivor_lifespan_beard_path = 'CfgVehicles SurvivorMale_Base Lifespan Beard'
83 //cfg_class_member_member_variable_name = 'mat'
84 // survivor_lifespan_beard_material_name = 'mat'
85 //cfg_class_member_member_variable_fullname = 'CfgVehicles SurvivorMale_Base Lifespan Beard mat'
86 // survivor_lifespan_beard_material_path = 'CfgVehicles SurvivorMale_Base Lifespan Beard mat'
87
88 string config_name = "CfgVehicles";
89 int config_count = GetGame().ConfigGetChildrenCount( config_name );
90
91 int i, j, k, l, m;
92
93 //Print( "config_count: " + config_count );
94 for ( i = 0; i < config_count; i++ )
95 {
96 string survivor_name = "";
97 GetGame().ConfigGetChildName( config_name, i, survivor_name );
98
99 if ( survivor_name != "" && survivor_name != "access" )
100 {
101 if ( GetGame().IsKindOf(survivor_name, "SurvivorMale_Base") || GetGame().IsKindOf(survivor_name, "SurvivorFemale_Base") )
102 {
103 string survivor_path = config_name + " " + survivor_name;
104 int survivor_lifespan_count = GetGame().ConfigGetChildrenCount( survivor_path );
105
106 //Print( "survivor_path: " + survivor_path );
107 for ( j = 0; j < survivor_lifespan_count; j++ )
108 {
109 string survivor_lifespan_name = "";
110 GetGame().ConfigGetChildName( survivor_path, j, survivor_lifespan_name );
111
112 string survivor_lifespan_path = survivor_path + " " + survivor_lifespan_name;
113
114 if ( survivor_lifespan_name == "Lifespan" )
115 {
116 int survivor_lifespan_beard_count = GetGame().ConfigGetChildrenCount( survivor_lifespan_path );
117
118 for ( k = 0; k < survivor_lifespan_beard_count; k++ )
119 {
120 string survivor_lifespan_beard_name = "";
121 GetGame().ConfigGetChildName( survivor_lifespan_path, k, survivor_lifespan_beard_name );
122
123 string survivor_lifespan_beard_path = survivor_lifespan_path + " " + survivor_lifespan_beard_name;
124
125 if ( survivor_lifespan_beard_name == "Beard" )
126 {
127 TStringArray materials = new TStringArray;
128 int cfg_class_member_member_variable_count = GetGame().ConfigGetChildrenCount( survivor_lifespan_beard_path );
129
130 for ( l = 0; l < cfg_class_member_member_variable_count; l++ )
131 {
132 string survivor_lifespan_beard_material_name = "";
133 GetGame().ConfigGetChildName( survivor_lifespan_beard_path, l, survivor_lifespan_beard_material_name );
134 string survivor_lifespan_beard_material_path = survivor_lifespan_beard_path + " " + survivor_lifespan_beard_material_name;
135
136 if ( survivor_lifespan_beard_material_name == "mat" )
137 {
138 GetGame().ConfigGetTextArray( survivor_lifespan_beard_material_path, materials );
139
141
142 int level_count = materials.Count() / 2;
143 for ( m = 0; m < level_count; m++ )
144 {
145 int tex = m*2;
146 int mat = ((m*2)+1);
147 if ( mat < materials.Count() )
148 {
149 float threshold = (((float)m / (float)(level_count - 1)) * (float)LIFESPAN_LENGTH) + (float)LIFESPAN_MIN;
150 lifespan_levels.Insert( new LifespanLevel(m, threshold, materials.Get(tex), materials.Get(mat)) );
151 //Print("material a textura a threshold: " + materials.Get(tex) + " " + materials.Get(mat) + " " + threshold );
152 }
153 }
154
155 if ( lifespan_levels.Count() > 0 )
156 {
157 m_LifespanLevels.Set( survivor_name, lifespan_levels );
158 }
159 }
160 }
161 }
162 }
163 }
164 else if ( survivor_lifespan_name == "BloodyHands" )
165 {
166 string bloody_material, normal_material;
167 string path_normal = survivor_lifespan_path + " mat_normal";
168 string path_bloody = survivor_lifespan_path + " mat_blood";
169 GetGame().ConfigGetText(path_normal, normal_material);
170 GetGame().ConfigGetText(path_bloody, bloody_material);
171 m_BloodyHands.Set( survivor_name, new BloodyHands(normal_material, bloody_material) );
172 }
173 }
174 }
175 }
176 }
177
178 /*for ( int cl = 0; cl < m_LifespanLevels.Count(); cl++ )
179 {
180 string class_name = m_LifespanLevels.GetKey( cl );
181 array<ref LifespanLevel> levels = m_LifespanLevels.GetElement( cl );
182
183 Print( class_name );
184
185 for ( int ll = 0; ll < levels.Count(); ll++)
186 {
187 Print( "lvl: " + levels.Get( ll ).GetLevel() );
188 Print( "treshold: " + levels.Get( ll ).GetThreshold() );
189 Print( "texture: " + levels.Get( ll ).GetTextureName() );
190 Print( "material: " + levels.Get( ll ).GetMaterialName() );
191 }
192 }*/
193 }
194
195//-----------------------------
196// Support functions
197//-----------------------------
198
199 void SynchLifespanVisual( PlayerBase player, int beard_state_visible, bool bloody_hands_visible, bool blood_type_visible, int blood_type )
200 {
201 SynchBeardVisual( player, beard_state_visible );
202 SynchBloodyHandsVisual( player, bloody_hands_visible );
203 SynchShowBloodTypeVisual( player, blood_type_visible );
204 SynchShowBloodType( player, blood_type );
205 }
206
207 void ChangeFakePlaytime( PlayerBase player, int change )
208 {
209 if ( !GetGame().IsMultiplayer() )
210 {
211 m_FakePlaytime = change;
212 UpdateLifespan( player, true );
213 }
214 }
215
216//-----------------------------
217// Facial hair
218//-----------------------------
219
220 void UpdateLifespan(PlayerBase player, bool force_update = false)
221 {
222 if (player != null)
223 {
224 float playerPlaytime = m_FakePlaytime;
225
226 if (GetGame().IsMultiplayer() && GetGame().IsServer())
227 playerPlaytime = player.StatGet(AnalyticsManagerServer.STAT_PLAYTIME);
228
229 float playerBeard = playerPlaytime - player.GetLastShavedSeconds();
230 playerBeard = playerBeard / 60.0;
231
232 UpdateLifespanLevel(player, playerBeard, force_update);
233 }
234 }
235
236 protected void UpdateLifespanLevel( PlayerBase player, float player_beard, bool force_update = false )
237 {
238 if ( !player.IsAlive() )
239 return;
240
241 if ( m_PlayerCurrentLevel.Contains(player) )
242 {
243 LifespanLevel current_level = m_PlayerCurrentLevel.Get( player );
244
245 if ( player_beard > current_level.GetThreshold() || force_update )
246 {
247 LifespanLevel next_level = GetLifespanLevel( player.GetPlayerClass(), player_beard );
248
249 if ( next_level != NULL )
250 {
251 SetPlayerLifespanLevel( player, next_level );
252 m_PlayerCurrentLevel.Set( player, next_level );
253 }
254 }
255 }
256 else
257 {
258 if ( m_LifespanLevels.Contains( player.GetPlayerClass() ) )
259 {
260 LifespanLevel level = GetLifespanLevel( player.GetPlayerClass(), player_beard );
261
262 if ( level != NULL )
263 {
264 SetPlayerLifespanLevel( player, level );
265 m_PlayerCurrentLevel.Set( player, level );
266 }
267 }
268 }
269 }
270
271 protected LifespanLevel GetLifespanLevel( string player_class, float age = 0 )
272 {
273 array<ref LifespanLevel> lifespan_levels = m_LifespanLevels.Get( player_class );
274
275 if ( lifespan_levels != NULL )
276 {
277 for ( int i = lifespan_levels.Count() - 1; i >= 0; i-- )
278 {
279 LifespanLevel level = lifespan_levels.Get( i );
280
281 if ( age >= level.GetThreshold() )
282 {
283 return level;
284 }
285 }
286 }
287
288 return NULL;
289 }
290
291 protected void SetPlayerLifespanLevel( PlayerBase player, LifespanLevel level )
292 {
293 if (player.m_CorpseState != 0)
294 return;
295 int slot_id = InventorySlots.GetSlotIdFromString("Head");
296 EntityAI players_head = player.GetInventory().FindPlaceholderForSlot( slot_id );
297
298 if ( players_head )
299 {
300 switch (level.GetLevel())
301 {
302 case LifeSpanState.BEARD_NONE:
303 {
304 players_head.SetObjectTexture( 0, "");
305 players_head.SetObjectMaterial( 0, "");
306
307 player.SetFaceTexture( level.GetTextureName() );
308 player.SetFaceMaterial( level.GetMaterialName() );
309
310 player.SetLifeSpanStateVisible(LifeSpanState.BEARD_NONE);
311 //Print("LifeSpanState.BEARD_NONE");
312 break;
313 }
314 case LifeSpanState.BEARD_MEDIUM:
315 {
316 players_head.SetObjectTexture( 0, "");
317 players_head.SetObjectMaterial( 0, "");
318
319 player.SetFaceTexture( level.GetTextureName() );
320 player.SetFaceMaterial( level.GetMaterialName() );
321
322 player.SetLifeSpanStateVisible(LifeSpanState.BEARD_MEDIUM);
323 //Print("LifeSpanState.BEARD_MEDIUM");
324 break;
325 }
326
327 case LifeSpanState.BEARD_LARGE:
328 {
329 players_head.SetObjectTexture( 0, "");
330 players_head.SetObjectMaterial( 0, "");
331
332 player.SetFaceTexture( level.GetTextureName() );
333 player.SetFaceMaterial( level.GetMaterialName() );
334
335 player.SetLifeSpanStateVisible(LifeSpanState.BEARD_LARGE);
336 //Print("LifeSpanState.BEARD_LARGE");
337 break;
338 }
339
340 case LifeSpanState.BEARD_EXTRA:
341 {
342 players_head.SetObjectTexture( 0, level.GetTextureName() );
343 players_head.SetObjectMaterial( 0, level.GetMaterialName() );
344
345 array< ref LifespanLevel> lifespan_levels = m_LifespanLevels.Get( player.GetPlayerClass() );
346 LifespanLevel prev_level = lifespan_levels.Get(LifeSpanState.BEARD_LARGE);
347
348 player.SetFaceTexture( prev_level.GetTextureName() );
349 player.SetFaceMaterial( prev_level.GetMaterialName() );
350
351 player.SetLifeSpanStateVisible(LifeSpanState.BEARD_EXTRA);
352 //Print("LifeSpanState.BEARD_EXTRA");
353 break;
354 }
355
356 default:
357 {
358 Print("Lifespan state missing");
359 break;
360 }
361 }
362 }
363 }
364
365 void SynchBeardVisual( PlayerBase player, int state )
366 {
367 float player_beard;
368
369 switch (state)
370 {
371 case LifeSpanState.BEARD_NONE:
372 {
373 // first out of 4 states
374 player_beard = LIFESPAN_MIN;
375 break;
376 }
377 case LifeSpanState.BEARD_MEDIUM:
378 {
379 // second out of 4 states
380 player_beard = LIFESPAN_MAX/3;
381 break;
382 }
383
384 case LifeSpanState.BEARD_LARGE:
385 {
386 // third out of 4 states
387 player_beard = LIFESPAN_MAX/1.5;
388 break;
389 }
390
391 case LifeSpanState.BEARD_EXTRA:
392 {
393 // fourth out of 4 states
394 player_beard = LIFESPAN_MAX;
395 break;
396 }
397
398 default:
399 {
400 Print("Lifespan state missing");
401 break;
402 }
403 }
404
405 UpdateLifespanLevel( player, player_beard, true );
406 }
407
408//-----------------------------
409// Bloody hands
410//-----------------------------
411
413 {
414 if ( CanMakeHandsBloody( player ) )
415 {
416 SetBloodyHandsEx( player, type );
417 }
418 }
419
420 void UpdateBloodyHandsVisibility( PlayerBase player, bool show )
421 {
422 if ( CanMakeHandsBloody( player ) )
423 {
424 SetBloodyHands( player, show );
425 }
426 }
427
428 void SynchBloodyHandsVisual( PlayerBase player, bool has_bloody_hands )
429 {
430 UpdateBloodyHandsVisibility( player, has_bloody_hands );
431 }
432
433
435 {
436 player.SetBloodyHandsEx( type );
437
438 if ( type )
439 {
441 }
442 else
443 {
445 }
446
447 }
448
449 void SetBloodyHands( PlayerBase player, bool show )
450 {
451 player.SetBloodyHands( show );
452
453 if ( show )
454 {
456 }
457 else
458 {
460 }
461 }
462
463 protected void SetHandsMaterial( PlayerBase player, int material_type )
464 {
465 string player_class = player.GetPlayerClass();
466 int slot_id;
467 EntityAI eai;
468
469 if ( m_BloodyHands.Contains(player_class))
470 {
471 slot_id = InventorySlots.GetSlotIdFromString("Gloves");
472 eai = player.GetInventory().FindPlaceholderForSlot( slot_id );
473
474 if (eai)
475 {
476 eai.SetObjectMaterial( 0, m_BloodyHands.Get(player_class).GetMaterial(material_type) );
477 }
478 }
479 else
480 {
481 //Print("Error! Player class <" + player_class + "> does not contain valid configuration for bloody hands!");
482 }
483 }
484
486 {
487 return !player.FindAttachmentBySlotName( "Gloves" ) );
488 }
489
490//-----------------------------
491// Blood type in HUD
492//-----------------------------
493
494 void UpdateBloodTypeVisibility( PlayerBase player, bool show )
495 {
496 player.SetBloodTypeVisible( show );
497
498 if ( player.m_Hud )
499 {
500 player.m_Hud.UpdateBloodName();
501 }
502 }
503
504 void UpdateBloodType( PlayerBase player, int blood_type )
505 {
506 player.SetBloodType( blood_type );
507 }
508
509 void SynchShowBloodTypeVisual( PlayerBase player, bool show )
510 {
511 UpdateBloodTypeVisibility( player, show );
512 }
513
514 void SynchShowBloodType( PlayerBase player, int blood_type )
515 {
516 UpdateBloodType( player, blood_type );
517 }
518
519//-----------------------------
520// Getters for other systems
521//-----------------------------
522
524 {
525 if ( m_PlayerCurrentLevel.Contains(player) )
526 {
527 LifespanLevel current_level = m_PlayerCurrentLevel.Get( player );
528 return current_level.GetTextureName();
529 }
530 return "";
531 }
532
534 {
535 if ( m_PlayerCurrentLevel.Contains(player) )
536 {
537 LifespanLevel current_level = m_PlayerCurrentLevel.Get( player );
538 return current_level.GetMaterialName();
539 }
540 return "";
541 }
542}
map
Определения ControlsXboxNew.c:4
@ COUNT
Определения EGameStateIcons.c:7
@ LAST_INDEX
Определения ModifiersManager.c:17
void SetPlayerLifespanLevel(PlayerBase player, LifespanLevel level)
Определения PluginLifespan.c:291
void UpdateBloodyHandsVisibility(PlayerBase player, bool show)
Определения PluginLifespan.c:420
void SynchShowBloodTypeVisual(PlayerBase player, bool show)
Определения PluginLifespan.c:509
static const int LIFESPAN_MAX
Определения PluginLifespan.c:29
void UpdateLifespan(PlayerBase player, bool force_update=false)
Определения PluginLifespan.c:220
void SynchBloodyHandsVisual(PlayerBase player, bool has_bloody_hands)
Определения PluginLifespan.c:428
void SetBloodyHandsEx(PlayerBase player, eBloodyHandsTypes type)
Определения PluginLifespan.c:434
void SynchLifespanVisual(PlayerBase player, int beard_state_visible, bool bloody_hands_visible, bool blood_type_visible, int blood_type)
Определения PluginLifespan.c:199
void SynchBeardVisual(PlayerBase player, int state)
Определения PluginLifespan.c:365
void UpdateBloodTypeVisibility(PlayerBase player, bool show)
Определения PluginLifespan.c:494
void UpdateBloodType(PlayerBase player, int blood_type)
Определения PluginLifespan.c:504
void PluginLifespan()
Определения PluginLifespan.c:45
ref map< PlayerBase, int > m_BloodType
Определения PluginLifespan.c:35
eBloodyHandsTypes
Определения PluginLifespan.c:9
@ JUST_BLOOD
Определения PluginLifespan.c:12
@ CLEAN
Определения PluginLifespan.c:10
@ SALMONELA
Определения PluginLifespan.c:11
enum eBloodyHandsTypes BEARD_MEDIUM
enum eBloodyHandsTypes BEARD_NONE
void ChangeFakePlaytime(PlayerBase player, int change)
Определения PluginLifespan.c:207
string GetCurrentHeadMaterial(PlayerBase player)
Определения PluginLifespan.c:533
enum eBloodyHandsTypes BEARD_LARGE
enum eBloodyHandsTypes LIFESPAN_MIN
int m_FakePlaytime
Определения PluginLifespan.c:30
string GetCurrentHeadTexture(PlayerBase player)
Определения PluginLifespan.c:523
void SetHandsMaterial(PlayerBase player, int material_type)
Определения PluginLifespan.c:463
ref map< string, ref BloodyHands > m_BloodyHands
Определения PluginLifespan.c:34
void UpdateLifespanLevel(PlayerBase player, float player_beard, bool force_update=false)
Определения PluginLifespan.c:236
enum eBloodyHandsTypes BEARD_EXTRA
void SetBloodyHands(PlayerBase player, bool show)
Определения PluginLifespan.c:449
bool CanMakeHandsBloody(PlayerBase player)
Определения PluginLifespan.c:485
LifespanLevel GetLifespanLevel(string player_class, float age=0)
Определения PluginLifespan.c:271
ref map< string, ref array< ref LifespanLevel > > m_LifespanLevels
Определения PluginLifespan.c:33
void UpdateBloodyHandsVisibilityEx(PlayerBase player, eBloodyHandsTypes type)
Определения PluginLifespan.c:412
ref map< PlayerBase, ref LifespanLevel > m_PlayerCurrentLevel
Определения PluginLifespan.c:32
void SynchShowBloodType(PlayerBase player, int blood_type)
Определения PluginLifespan.c:514
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
const string STAT_PLAYTIME
Определения AnalyticsManagerServer.c:4
const int MATERIAL_TYPE_BLOODY
Определения BloodyHands.c:6
const int MATERIAL_TYPE_NORMAL
Определения BloodyHands.c:5
Определения BloodyHands.c:2
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto bool ConfigGetText(string path, out string value)
Get string value from config on path.
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
Определения Building.c:6
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
provides access to slot configuration
Определения InventorySlots.c:6
int GetLevel()
Определения LifespanLevel.c:17
string GetMaterialName()
Определения LifespanLevel.c:32
float GetThreshold()
Определения LifespanLevel.c:22
string GetTextureName()
Определения LifespanLevel.c:27
Определения LifespanLevel.c:2
Определения PlayerBaseClient.c:2
void LoadFromCfg()
Определения PluginHorticulture.c:12
static PluginCameraTools GetInstance()
Определения PluginCameraTools.c:11
Определения PluginBase.c:2
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения EnConvert.c:97
proto native CGame GetGame()
proto void Print(void var)
Prints content of variable to console/log.
array< string > TStringArray
Определения EnScript.c:685