DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
FireplaceBase.c
См. документацию.
14
15enum FirePlaceFailure
16{
17 WIND = 0,
18 WET = 1,
19}
20
22{
23 //State params
24 protected bool m_IsBurning = false;
25 protected bool m_HasAshes = false;
26 protected bool m_IsOven = false;
27 protected bool m_HasStoneCircle = false;
28 protected bool m_NoIgnite = false;
29 protected int m_OvenAttachmentsLockState = -1;
31 protected FireplaceFireState m_LastFireState = FireplaceFireState.NO_FIRE; //for synchronization purposes
33
34 //Fireplace params
35 protected float m_FuelBurnRateMP = 1.0;
36
37 //cooking
38 protected ref Cooking m_CookingProcess;
39
40 //temperature simulation constants
41 const float PARAM_SMALL_FIRE_TEMPERATURE = 150;
42 const float PARAM_NORMAL_FIRE_TEMPERATURE = 1000;
44 const float PARAM_MIN_FIRE_TEMPERATURE = 30;
45 const float PARAM_TEMPERATURE_INCREASE = 10;
47 const float PARAM_MAX_WET_TO_IGNITE = 0.2;
48 const float PARAM_MIN_TEMP_TO_REIGNITE = 30;
49 const float PARAM_IGNITE_RAIN_THRESHOLD = 0.1;
50 const float PARAM_BURN_WET_THRESHOLD = 0.40;
52 const float PARAM_WET_COOLING_DECREASE_COEF = 0.002;
54 const float PARAM_BURN_DAMAGE_COEF = 5.0;
55 const float PARAM_FULL_HEAT_RADIUS = 2.0;
56 const float PARAM_HEAT_RADIUS = 4.0;
58
59 //staging constants
61 const int MIN_STONES_TO_BUILD_OVEN = 16;
63 const float MIN_CEILING_HEIGHT = 5;
64
65 //fuel constants
66 const float FUEL_BURN_RATE_DEFAULT = 1.0;
67 const float FUEL_BURN_RATE_STONES = 0.92;
68 const float FUEL_BURN_RATE_OVEN = 0.85;
69
71 const float PARAM_COOKING_TEMP_THRESHOLD = 100;
77 const int SMOKING_SLOT_COUNT = 4;
78 const float SMOKING_SPEED = 1; // per second
79
80 // stage lifetimes
83
84 const float IGNITE_WIND_THRESHOLD = 0.8; //fireplace can not be ignited above this multiple of max wind
85
86 protected const float RAIN_EFFECT_LIMIT = 0.4;
87 protected const float SNOWFALL_EFFECT_LIMIT = 1.3;
88 protected const float RAIN_WETNESS_INCREASE = 0.02;
89 protected const float SNOWFALL_WETNESS_INCREASE = 0.01;
90
91 //Timers
92 protected ref Timer m_HeatingTimer;
93 protected ref Timer m_CoolingTimer;
94
95 // Light entity
96 protected FireplaceLight m_Light;
97 protected float m_LightDistance = 2000;
98
99 //Attachments
104
105 //Particles - default for FireplaceBase
118 //
127
128 //Sounds
129 const string SOUND_FIRE_HEAVY = "HeavyFire_SoundSet";
130 const string SOUND_FIRE_LIGHT = "LightFire_SoundSet";
131 const string SOUND_FIRE_NO_FIRE = "NoFuelFire_SoundSet";
132 const string SOUND_FIRE_EXTINGUISHING = "ExtinguishByWater_SoundSet";
133 const string SOUND_FIRE_EXTINGUISHED = "ExtinguishByWaterEnd_SoundSet";
134
135 //
138 //
139
140 //Fuel
141 //Kindling / Fuel item types
144
145 //Player action / status messages
146 const string MESSAGE_IGNITE_IGNIT_ITEM_DAMAGED = "You cannot start fire. Fireplace is ruined.";
147 const string MESSAGE_IGNITE_NO_KINDLING = "There needs to be some kindling to start a fire.";
148 const string MESSAGE_IGNITE_TOO_WET = "The fireplace is too wet to be ignited.";
149 const string MESSAGE_IGNITE_RAIN = "The fire went out because of the rain.";
150 const string MESSAGE_IGNITE_WIND = "The fire went out because of the wind.";
151 const string MESSAGE_IGNITE_IN_WATER = "I cannot ignite the fireplace in the water.";
152 const string MESSAGE_IGNITE_UNDER_LOW_ROOF = "I cannot ignite the fireplace here, the is not enough room.";
153 const string MESSAGE_REIGNITE_NO_KINDLING = "There needs to be some kindling to start a fire.";
154 const string MESSAGE_REIGNITE_RAIN = "Cannot reignite fireplace in rain.";
155 const string MESSAGE_REIGNITE_TOO_WET = "The fireplace is too wet to be reignited.";
156 const string MESSAGE_BURY_ASHES_FAILED_NOT_EMPTY = "Cannot bury ashes. There are sill items in it.";
157 const string MESSAGE_BURY_ASHES_FAILED_SURFACE = "Cannot bury ashes on hard surface.";
158 const string MESSAGE_BURY_ASHES_FAILED_BURNING = "Cannot bury ashes, the fireplace is still burning.";
159 const string MESSAGE_BURY_ASHES_FAILED_TOO_HOT = "Cannot bury ashes, the fireplace is too hot.";
160 const string MESSAGE_CANNOT_BUILD_OVEN = "Cannot build oven.";
161 const string MESSAGE_CANNOT_DISMANTLE_OVEN = "Cannot dismantle oven.";
162
163 //Visual animations
164 const string ANIMATION_ASHES = "Ashes";
165 const string ANIMATION_KINDLING = "Kindling";
166 const string ANIMATION_STICKS = "Sticks";
167 const string ANIMATION_WOOD = "Wood";
168 const string ANIMATION_BURNT_WOOD = "BurntWood";
169 const string ANIMATION_STONE = "Stone";
170 const string ANIMATION_STONES = "StonesCircle";
171 const string ANIMATION_TRIPOD = "Tripod";
172 const string ANIMATION_OVEN = "Oven";
173 const string ANIMATION_INVENTORY = "Inventory";
174 const string ANIMATION_COOKWARE_HANDLE = "handleRotate";
175 const string ANIMATION_CAULDRON_HANDLE = "handle1Rotate";
176
177
178 //Visual textures and materials
179 const string MATERIAL_FIREPLACE_GLOW = "dz\\gear\\cooking\\data\\stoneground.rvmat";
180 const string MATERIAL_FIREPLACE_NOGLOW = "dz\\gear\\cooking\\data\\stonegroundnoemit.rvmat";
181
182 //Attachment types
183 //Fuel
185 typename ATTACHMENT_FIREWOOD = Firewood;
186 //Kindling
187 typename ATTACHMENT_RAGS = Rag;
188 typename ATTACHMENT_BANDAGE = BandageDressing;
189 typename ATTACHMENT_BOOK = ItemBook;
190 typename ATTACHMENT_BARK_OAK = Bark_Oak;
191 typename ATTACHMENT_BARK_BIRCH = Bark_Birch;
192 typename ATTACHMENT_PAPER = Paper;
193 typename ATTACHMENT_GIFTWRAP = GiftWrapPaper;
196 //Other
197 typename ATTACHMENT_TRIPOD = Tripod;
198 typename ATTACHMENT_COOKINGSTAND = CookingStand;
199 typename ATTACHMENT_STONES = Stone;
200 typename ATTACHMENT_COOKING_POT = Pot; //'IsCookware' used instead
201 typename ATTACHMENT_FRYING_PAN = FryingPan; //'IsCookware' used instead
202 typename ATTACHMENT_CAULDRON = Cauldron; //'IsCookware' used instead
203 //
204 protected const float PLACEMENT_HEIGHT_LIMIT = 0.1; // Y coord placement limit - this is important when server has collision checks disabled
205 const string OBJECT_CLUTTER_CUTTER = "ClutterCutterFireplace";
207
208 //area damage
210
211 //quantity
212 protected float m_TotalEnergy;
213
214 // Noise
216 private bool m_CanNoise = true; // Flip every fireplace update to limit amount of noise generation
217
218 // UniversalTemperatureSource
222
223 // surface wetness on heat modification
224 protected const float WET_SURFACE_INCREMENT = 0.06;
225 protected float m_SurfaceUnderWetnessModifier
226
230
231 //================================================================
232 // INIT / STORE LOAD-SAVE
233 //================================================================
234 //Constructor
235 protected void FireplaceBase()
236 {
237 //STATIC: define kindling types
239 {
242 m_FireConsumableTypes.Insert(ATTACHMENT_BANDAGE, new FireConsumableType(ATTACHMENT_BANDAGE, 8, true, "MedicalBandage"));
250
251 //define fuel types
252 m_FireConsumableTypes.Insert(ATTACHMENT_STICKS, new FireConsumableType(ATTACHMENT_STICKS, 30, false, "WoodenStick"));
254 }
255
256 //calculate total energy
258
259 //define fuel / kindling items (fire consumables)
261
262 //default burning parameters
264
265 //synchronized variables
266 RegisterNetSyncVariableBool("m_IsBurning");
267 RegisterNetSyncVariableBool("m_HasAshes");
268 RegisterNetSyncVariableBool("m_IsOven");
269 RegisterNetSyncVariableBool("m_HasStoneCircle");
270 RegisterNetSyncVariableBool("m_RoofAbove");
271 RegisterNetSyncVariableInt("m_FireState", FireplaceFireState.NO_FIRE, FireplaceFireState.COUNT);
272 RegisterNetSyncVariableBool("m_NoIgnite");
273
275
276 m_SurfaceUnderWetnessModifier = 0.0;
277
279 m_UTSSettings.m_ManualUpdate = true;
283 m_UTSSettings.m_RangeMax = PARAM_HEAT_RADIUS;
284
285 m_UTSSettings.m_EnableOnTemperatureControl = true;
286 m_UTSSettings.m_ActiveTemperatureThreshold = 250.0;
287 m_UTSSettings.m_InactiveTemperatureThreshold = 475.0;
288
290 m_UnderObjectDecalSpawnSettings.m_RandomizeRotation = true;
291 m_UnderObjectDecalSpawnSettings.m_PositionOffset = "0 0.05 0";
292 m_UnderObjectDecalSpawnSettings.m_ScaleMax = 1.0;
293 }
294
295 protected void ~FireplaceBase()
296 {
298
299 if (GetLightEntity())
300 GetLightEntity().FadeOut();
301
303 {
306 }
307 }
308
309 override void EEInit()
310 {
311 super.EEInit();
312
313 //refresh visual on init
315 if (m_CookingProcess == null)
316 m_CookingProcess = new Cooking();
317
318 if (GetGame().IsServer() || !GetGame().IsMultiplayer())
319 {
321 }
322
324 {
327 }
328 }
329
330 override void EEItemAttached(EntityAI item, string slot_name)
331 {
332 super.EEItemAttached(item, slot_name);
333
334 //cookware
335 if (item.IsCookware())
336 SetCookingEquipment(ItemBase.Cast(item));
337 }
338
339 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
340 {
341 super.OnItemLocationChanged(old_owner, new_owner);
342
343 //refresh physics after location change (with delay)
345
347 GetInventory().GetCurrentInventoryLocation(loc);
348 if (loc.GetType() == InventoryLocationType.GROUND)
349 {
350 if (IsOpen() && !IsOven())
351 CheckForRoofLimited(0); //roof check when moved to ground
352
354 {
357 }
358 }
359 else
360 {
362 {
365 }
366 }
367
368 m_SurfaceUnderWetnessModifier = GetSurfaceWetnessOnHeatModifier(this);
369 }
370
371 override void OnAttachmentRuined(EntityAI attachment)
372 {
373 switch (attachment.Type())
374 {
377 int slot = InventorySlots.GetSlotIdFromString("CookingEquipment");
378 EntityAI ent = GetInventory().FindAttachment(slot);
379 if (ent && ent.IsCookware())
380 {
381 vector direction = ent.GetDirection();
382 float dot = vector.Dot(direction, vector.Forward);
383
384 float angle = Math.Acos(dot);
385 if (direction[0] < 0)
386 {
387 angle = -angle;
388 }
389
390 float cos = Math.Cos(angle);
391 float sin = Math.Sin(angle);
392 GetInventory().DropEntityInBounds(InventoryMode.SERVER, this, ent, "2 0 2", angle, cos, sin);
393 }
394
395 attachment.Delete();
396 break;
397 }
398 }
399
400 override void EEDelete(EntityAI parent)
401 {
402 super.EEDelete(parent);
403
405
406 // cleanup particles (for cases of leaving burning fplace and going back outside of network bubble)
407 #ifndef SERVER
409 #endif
410 }
411
412 //on store save/load
414 {
415 super.OnStoreSave(ctx);
416
417 //Save ashes state
418 ctx.Write(m_HasAshes);
419
420 //Save fuel burn rate MP
422
423 //Save burning state
424 ctx.Write(m_IsBurning);
425 }
426
427 override bool OnStoreLoad(ParamsReadContext ctx, int version)
428 {
429 if (!super.OnStoreLoad(ctx, version))
430 return false;
431
432 //--- Fireplace data ---
433 //Load ashes state
434 if (!ctx.Read(m_HasAshes))
435 {
436 m_HasAshes = false; //set default
437 return false;
438 }
439
440 //Load temperature loss MP
441 if (version < 139 && !ctx.Read(m_TemperatureLossMP))
442 {
443 m_TemperatureLossMP = 1.0; //set default
444 return false;
445 }
446
447 //Load fuel burn rate MP
448 if (!ctx.Read(m_FuelBurnRateMP))
449 {
450 m_FuelBurnRateMP = 1.0; //set default
451 return false;
452 }
453
454 //Load burning state, if true start fire
455 if (!ctx.Read(m_IsBurning))
456 {
457 m_IsBurning = false; //set default
458 return false;
459 }
460 //---
461
462 return true;
463 }
464
465 override void AfterStoreLoad()
466 {
467 super.AfterStoreLoad();
468
469 Synchronize();
470
471 //start fire
472 if (IsBurning())
473 {
474 if (GetGame() && GetGame().IsServer())
475 {
476 StartFire(true); //will be auto-synchronized when starting fire
477 }
478 }
479 }
480
481 //================================================================
482 // SYNCHRONIZATION
483 //================================================================
485 {
486 if (GetGame() && GetGame().IsServer())
487 {
488 SetSynchDirty();
489
490 if (GetGame().IsMultiplayer() && GetGame().IsServer())
491 {
492 //Refresh visuals (on server)
494 }
495 }
496 }
497
499 {
500 super.OnVariablesSynchronized();
501
504
505 if (IsBaseFireplace() && !IsOven())
506 {
508 {
510 }
511 else if (!m_IsBurning && m_AreaDamage)
512 {
514 }
515 }
516
518 m_UnderObjectDecalSpawnComponent.UpdateSize(Math.InverseLerp(0.0, GetTemperatureMax() * 0.6, GetTemperature()));
519 }
520
521 //================================================================
522 // BASE
523 //================================================================
524
525 //States
526 //check fireplace types
527 override bool IsFireplace()
528 {
529 return true;
530 }
531
533 {
534 return false;
535 }
536
538 {
539 return false;
540 }
541
543 {
544 return false;
545 }
546
548 {
549 return false;
550 }
551
552 override bool CanHaveWetness()
553 {
554 return true;
555 }
556
557 override bool CanHaveTemperature()
558 {
559 return true;
560 }
561
562 override bool GetCookingTargetTemperature(out float temperature)
563 {
564 temperature = GetTemperature();
565 return true;
566 }
567
569 {
570 return m_IsBurning || (m_CoolingTimer && m_CoolingTimer.IsRunning())); //FireplaceFireState.NO_FIRE?
571 }
572
581
582 //cooking equipment
587
589 {
590 m_CookingEquipment = equipment;
591 }
592
594 {
596 {
597 m_CookingProcess.TerminateCookingSounds(pItem);
598 }
599
601 }
602
605 {
607 }
608
610 {
611 for (int i = 0; i < DIRECT_COOKING_SLOT_COUNT; i++)
612 {
614 {
615 return true;
616 }
617 }
618 return false;
619 }
620
622 {
623 for (int i = 0; i < SMOKING_SLOT_COUNT; i++)
624 {
625 if (m_SmokingSlots[i])
626 {
627 return true;
628 }
629 }
630 return false;
631 }
632
635 {
636 DeleteSafe();
637 }
638
639 override bool IsPrepareToDelete()
640 {
641 return IsEmpty() && !IsBurning() && !HasAshes();
642 }
643
645 {
646 super.OnChildItemRemoved(item);
648 }
649
650 override void CheckForDestroy()
651 {
652 if (IsPrepareToDelete())
653 {
654 MiscGameplayFunctions.DropAllItemsInInventoryInBounds(this, m_HalfExtents);
655 super.CheckForDestroy();
656 }
657 }
658
659 //================================================================
660 // VISUAL
661 //================================================================
662 //Fireplace visual
664 {
665 if (IsHologram())
666 {
667 return;
668 }
669
670 // Light
671 #ifndef SERVER
672 if (IsBurning())
673 {
674 //turn light on
675 if (!GetLightEntity())
676 {
677 SetLightEntity(FireplaceLight.Cast(ScriptedLightBase.CreateLight(FireplaceLight, GetPosition(), 20)));
678 GetLightEntity().AttachOnMemoryPoint(this, "light");
679 }
680
681 if (GetLightEntity() && GetLightEntity().GetBrightness() > 0)
682 {
683 // change brightness based on the distance of player to the fireplace
684 Object player = GetGame().GetPlayer();
685 float lightDist = m_LightDistance;
686
687 if (IsOven())
688 {
689 lightDist = 50;
690 }
691
692 if (player)
693 {
694 if (vector.DistanceSq(player.GetPosition(), this.GetPosition()) > lightDist * lightDist)
695 {
696 GetLightEntity().FadeBrightnessTo(0, 5);
697 }
698 else
699 {
700 GetLightEntity().FadeBrightnessTo(FireplaceLight.m_FireplaceBrightness, 5);
701 }
702 }
703
704 // The following solves an issue with the light point clipping through narrow geometry
706 {
707 GetLightEntity().SetInteriorMode();
708 }
709 else
710 {
711 GetLightEntity().SetExteriorMode();
712 }
713 }
714 }
715 else
716 {
717 //turn light off
718 if (GetLightEntity())
719 {
720 GetLightEntity().FadeOut();
721 }
722 }
723 #endif
724
725 //set default burn parameters based on fireplace type
727 {
729 }
730 else if (HasStoneCircle())
731 {
733 }
734 else
735 {
737 }
738
739 // Oven attachments
740 if (IsOven())
741 {
742 //lock attachment slots
744 {
746 }
747 }
748 else
749 {
750 //unlock attachment slots
752 {
753 LockOvenAttachments(false);
754 }
755 }
756
757 //VISUAL STATES
758 //Fuel state
759 if (GetGame().IsServer())
760 {
761 // Sticks state
763 SetAnimationPhase(ANIMATION_STICKS, 0);
764 else
765 SetAnimationPhase(ANIMATION_STICKS, 1);
766
767 // Firewood state
769 {
770 if (IsBurning() && HasAshes())
771 {
772 SetAnimationPhase(ANIMATION_BURNT_WOOD, 0); // Because this might not be set under certain circumstances
773 SetAnimationPhase(ANIMATION_WOOD, 1);
774 }
775 else if (IsWet() || !IsBurning())
776 {
777 SetAnimationPhase(ANIMATION_BURNT_WOOD, 1);
778 SetAnimationPhase(ANIMATION_WOOD, 0);
779 }
780 else
781 {
782 SetAnimationPhase(ANIMATION_BURNT_WOOD, 1);
783 SetAnimationPhase(ANIMATION_WOOD, 0);
784 }
785 }
786 else
787 {
788 SetAnimationPhase(ANIMATION_WOOD, 1);
789 SetAnimationPhase(ANIMATION_BURNT_WOOD, 1);
790 }
791
792 // Kindling state
793 if (GetKindlingCount() != 0)
794 SetAnimationPhase(ANIMATION_KINDLING, 0);
795 else
796 SetAnimationPhase(ANIMATION_KINDLING, 1);
797
798 // Ashes state
799 if (HasAshes())
800 SetAnimationPhase(ANIMATION_ASHES, 0);
801 else
802 SetAnimationPhase(ANIMATION_ASHES, 1);
803
804 // Stone variations
805 if (HasStones())
806 {
807 if (HasStoneCircle())
808 {
809 SetAnimationPhase(ANIMATION_STONES, 0);
810 SetAnimationPhase(ANIMATION_STONE, 1);
811 }
812 else if (IsOven())
813 {
814 SetAnimationPhase(ANIMATION_OVEN, 0);
815 SetAnimationPhase(ANIMATION_STONE, 1);
816 }
817 else
818 {
820 SetAnimationPhase(ANIMATION_STONES, 1);
821 SetAnimationPhase(ANIMATION_OVEN, 1);
822 SetAnimationPhase(ANIMATION_STONE, 0);
823 }
824 }
825 else
826 {
827 SetAnimationPhase(ANIMATION_STONE, 1);
828 }
829 }
830
831 //refresh physics (with delay)
833 }
834
836 protected void SetBurntFirewood()
837 {
838 if (GetGame().IsServer() && IsInAnimPhase(ANIMATION_WOOD))
839 {
840 SetAnimationPhase(ANIMATION_WOOD, 1);
841 SetAnimationPhase(ANIMATION_BURNT_WOOD, 0);
842 }
843 }
844
845 //Refresh fireplace object physics
847
848 protected void RefreshFireParticlesAndSounds(bool force_refresh)
849 {
850 FireplaceFireState fire_state = GetFireState();
851
852 if (m_LastFireState != fire_state || force_refresh)
853 {
854 switch (fire_state)
855 {
856 case FireplaceFireState.START_FIRE:
857 {
858 //particles
860
861 //sounds
864 break;
865 }
866 case FireplaceFireState.SMALL_FIRE:
867 {
868 //particles
870
872
873 if (CanShowSmoke())
875 else
877
880
882
883 //sounds
886 break;
887 }
888 case FireplaceFireState.NORMAL_FIRE:
889 {
890 //particles
892
895
897
898 if (CanShowSmoke())
900 else
902
904
905 //sounds
908 break;
909 }
910 case FireplaceFireState.END_FIRE:
911 {
912 //particles
914
917
920
922
923 //sounds
926 break;
927 }
928 case FireplaceFireState.EXTINGUISHING_FIRE: //TODO add steam particles when extinguishing
929 {
930 //particles
932
935
938
940
942
943 //sounds
946 break;
947 }
948 case FireplaceFireState.EXTINGUISHED_FIRE: //TODO add steam particles when fireplace is extinguished
949 {
950 //particles
952
955
958
960
962
963 if (CanShowSmoke())
965 else
967
968 //sounds
972 break;
973 }
974 case FireplaceFireState.REIGNITED_FIRE:
975 {
976 //particles
978
981
984
986
988
989 //sounds
991 break;
992 }
993 case FireplaceFireState.NO_FIRE:
994 {
995 //particles
997
1000
1003
1005
1008
1009 //sounds
1010 SoundFireStop();
1011 break;
1012 }
1013 }
1014
1015 m_LastFireState = fire_state;
1016 }
1017 }
1018
1020 {
1021 // go through all fireplace particles
1038
1039 // go through all fireplace sounds
1040 if (m_SoundFireLoop)
1041 StopSoundSet(m_SoundFireLoop);
1042 if (m_SoundFire)
1043 StopSoundSet(m_SoundFire);
1044 }
1045
1047 {
1048 return true;
1049 }
1050
1051 //Fireplace fire intensity
1053 {
1054 float temperature = GetTemperature();
1055
1056 //if it's burning
1057 if (IsBurning())
1058 {
1059 //Start fire
1060 if (temperature <= PARAM_MIN_FIRE_TEMPERATURE)
1061 {
1062 if (GetFireState() != FireplaceFireState.START_FIRE)
1063 {
1064 SetFireState(FireplaceFireState.START_FIRE);
1065 }
1066 }
1067 //Small fire
1068 else if (temperature <= PARAM_SMALL_FIRE_TEMPERATURE)
1069 {
1070 if (GetFireState() != FireplaceFireState.SMALL_FIRE)
1071 {
1072 SetFireState(FireplaceFireState.SMALL_FIRE);
1073 }
1074 }
1075 //Normal fire
1076 else if (temperature > PARAM_SMALL_FIRE_TEMPERATURE)
1077 {
1078 if (GetFireState() != FireplaceFireState.NORMAL_FIRE)
1079 {
1080 SetFireState(FireplaceFireState.NORMAL_FIRE);
1081 }
1082 }
1083 }
1084 }
1085
1086 //================================================================
1087 // PARTICLES & SOUNDS
1088 //================================================================
1089 //returns true if particle started, false if not
1090 protected bool PlayParticle(out Particle particle, int particle_type, vector pos, bool worldpos = false)
1091 {
1092 if (!particle && GetGame() && (!GetGame().IsDedicatedServer()))
1093 {
1094 if (!worldpos)
1095 {
1096 particle = ParticleManager.GetInstance().PlayOnObject(particle_type, this, pos);
1097 }
1098 else
1099 {
1100 particle = ParticleManager.GetInstance().PlayInWorld(particle_type, pos);
1101 }
1102
1103 return true;
1104 }
1105
1106 return false;
1107 }
1108
1109 //returns true if particle stopped, false if not
1110 protected bool StopParticle(out Particle particle)
1111 {
1112 if (particle && GetGame() && (!GetGame().IsDedicatedServer()))
1113 {
1114 particle.Stop();
1115 particle = NULL;
1116
1117 return true;
1118 }
1119
1120 return false;
1121 }
1122
1123 //start fire
1135
1136 protected void ParticleFireStartStop()
1137 {
1139 }
1140
1141 //small fire
1153
1154 protected void ParticleSmallFireStop()
1155 {
1157 }
1158
1159 //normal fire
1171
1172 protected void ParticleNormalFireStop()
1173 {
1175 }
1176
1177 //small smoke
1179 {
1181
1182 //calculate air resistance
1183 float actual_height;
1184 if (GetCeilingHeight(actual_height))
1185 {
1186 float air_resistance = GetAirResistanceForSmokeParticles(actual_height);
1187
1188 //alter smoke height
1189 m_ParticleSmallSmoke.SetParameter(-1, EmitorParam.AIR_RESISTANCE, air_resistance);
1190 }
1191
1192 if (IsRoofAbove() || !IsOpen() || IsOven())
1193 {
1194 m_ParticleSmallSmoke.SetParameter(-1, EmitorParam.WIND, false);
1195 }
1196 }
1197
1198 protected void ParticleSmallSmokeStop()
1199 {
1201 }
1202
1203 //normal smoke
1205 {
1207
1208 //calculate air resistance
1209 float actual_height;
1210 if (GetCeilingHeight(actual_height))
1211 {
1212 float air_resistance = GetAirResistanceForSmokeParticles(actual_height);
1213
1214 //alter smoke height
1215 m_ParticleNormalSmoke.SetParameter(-1, EmitorParam.AIR_RESISTANCE, air_resistance);
1216 }
1217
1218 if (IsRoofAbove() || !IsOpen() || IsOven())
1219 {
1220 m_ParticleNormalSmoke.SetParameter(-1, EmitorParam.WIND, false);
1221 }
1222 }
1223
1225 {
1227 }
1228
1229 //fire end
1230 protected void ParticleFireEndStart()
1231 {
1232 if (IsOven())
1233 {
1235 }
1236 else
1237 {
1239 }
1240 }
1241
1242 protected void ParticleFireEndStop()
1243 {
1245 }
1246
1258
1259 //steam extinguishing
1264
1269
1270 //steam end
1275
1276 protected void ParticleSteamEndStop()
1277 {
1279 }
1280
1285
1287 {
1289 }
1290
1291 bool GetCeilingHeight(out float actual_height)
1292 {
1293 vector from = this.GetPosition();
1294 vector to = this.GetPosition();
1295 from[1] = from[1] + 1.0;
1296 to[1] = to[1] + MIN_CEILING_HEIGHT;
1297 vector contactPos;
1298 vector contactDir;
1299 int contactComponent;
1300
1301 bool hit = DayZPhysics.RaycastRV(from, to, contactPos, contactDir, contactComponent, NULL, NULL, this);
1302 actual_height = vector.Distance(from, contactPos) + 1.0;
1303
1304 return hit;
1305 }
1306
1307 float GetAirResistanceForSmokeParticles(float actual_height)
1308 {
1309 float air_res;
1310 actual_height = Math.Clamp(actual_height, 0, 36);
1311
1312 air_res = (6 - actual_height) * 0.33;
1313 air_res = Math.Clamp(air_res, 0, 2);
1314
1315 return air_res;
1316 }
1317
1318 //Particle Positions
1319 //Get local fire and smoke effect position
1321 {
1322 return Vector(0, 0.05, 0);
1323 }
1324
1326 {
1327 return Vector(0, 0.05, 0);
1328 }
1329
1330 //================================================================
1331 // SOUNDS
1332 //================================================================
1333 //Burning
1334 //Start
1335 protected void SoundFireLightStart()
1336 {
1337 PlaySoundSetLoop(m_SoundFireLoop, SOUND_FIRE_LIGHT, 1.0, 1.0);
1338 }
1339
1340 protected void SoundFireHeavyStart()
1341 {
1342 PlaySoundSetLoop(m_SoundFireLoop, SOUND_FIRE_HEAVY, 1.0, 2.0);
1343 }
1344
1345 protected void SoundFireNoFireStart()
1346 {
1347 PlaySoundSetLoop(m_SoundFireLoop, SOUND_FIRE_NO_FIRE, 2.0, 2.0);
1348 }
1349
1351 {
1352 PlaySoundSet(m_SoundFire, SOUND_FIRE_EXTINGUISHED, 0.1, 0.1);
1353 }
1354
1356 {
1357 PlaySoundSet(m_SoundFire, SOUND_FIRE_EXTINGUISHED, 0.1, 0.1);
1358 }
1359
1361 {
1362 PlaySoundSetLoop(m_SoundFireLoop, SOUND_FIRE_EXTINGUISHING, 1.0, 0.5);
1363 }
1364
1366 {
1367 PlaySoundSet(m_SoundFire, "ExtinguishByWind_SoundSet", 0, 0);
1368 }
1369
1370 //Stop
1371 protected void SoundFireStop()
1372 {
1373 StopSoundSet(m_SoundFireLoop);
1374 }
1375
1376 //================================================================
1377 // FUEL / KINDLING
1378 //================================================================
1379 //Add to fire consumables
1380 protected void AddToFireConsumables(ItemBase item)
1381 {
1382 m_FireConsumables.Insert(item, new FireConsumable(item, GetFireConsumableTypeEnergy(item)));
1384 }
1385
1387 {
1388 FireConsumableType fireConsumableType = m_FireConsumableTypes.Get(item.Type());
1389 if (!fireConsumableType)
1390 {
1392 int count = m_FireConsumableTypes.Count();
1393 for (int i = 0; i < count; ++i)
1394 {
1395 if (item.IsInherited(m_FireConsumableTypes.GetKey(i)))
1396 fireConsumableType = m_FireConsumableTypes.GetElement(i);
1397 }
1398 }
1399
1400 if (fireConsumableType)
1401 return fireConsumableType.GetEnergy();
1402
1403 return 0;
1404 }
1405
1406 //Remove from fire consumables
1407 protected void RemoveFromFireConsumables(FireConsumable fire_consumable)
1408 {
1409 if (fire_consumable)
1410 {
1411 m_FireConsumables.Remove(fire_consumable.GetItem());
1412 delete fire_consumable;
1413 }
1414
1416 }
1417
1419 {
1420 return m_FireConsumables.Get(item);
1421 }
1422
1423 //Set fuel / kindling to consume
1424 //Sets the item with the lowest energy value as item that will be consumed next
1425 //Returns reference to set fire consumable
1427 {
1428 if (m_FireConsumables.Count() == 0)
1429 {
1430 m_ItemToConsume = null;
1431 }
1432 else
1433 {
1434 for (int i = 0; i < m_FireConsumables.Count(); ++i)
1435 {
1436 ItemBase key = m_FireConsumables.GetKey(i);
1437 FireConsumable fireConsumable = m_FireConsumables.Get(key);
1438
1439 if (i == 0)
1440 {
1441 m_ItemToConsume = fireConsumable;
1442 }
1443 else
1444 {
1445 if (fireConsumable.GetEnergy() < m_ItemToConsume.GetEnergy())
1446 {
1447 m_ItemToConsume = fireConsumable;
1448 }
1449 }
1450 }
1451 }
1452
1453 //refresh visual
1455
1456 return m_ItemToConsume;
1457 }
1458
1460 {
1461 return m_ItemToConsume;
1462 }
1463
1464 //Spend item that is used as consumable for fire (fuel, kindling)
1465 //if 'amount == 0', the whole quantity will be consumed (quantity -= 1)
1466 //debug
1467 //int m_debug_fire_consume_time = 0;
1468 protected void SpendFireConsumable(float amount)
1469 {
1470 //spend item
1471 FireConsumable fireConsumable = GetItemToConsume();
1472
1473 if (!fireConsumable)
1474 {
1475 //Set new item to consume
1476 fireConsumable = SetItemToConsume();
1477 }
1478
1479 if (fireConsumable)
1480 {
1481 ItemBase item = fireConsumable.GetItem();
1482 fireConsumable.SetRemainingEnergy(fireConsumable.GetRemainingEnergy() - amount);
1483
1484 if (fireConsumable.GetRemainingEnergy() <= 0 || amount == 0)
1485 {
1486 //set ashes
1487 if (!HasAshes())
1488 {
1489 SetAshesState(true);
1490 }
1491
1492 if (item.IsAnyInherited({ItemBook, Paper, GiftWrapPaper, EyeMask_ColorBase}))
1493 {
1494 RemoveFromFireConsumables(fireConsumable);
1495 item.Delete();
1496 }
1497 else
1498 {
1499 //if there is nothing left, delete and remove old consumable, set new fire consumable
1500 if (item.GetQuantity() <= 1)
1501 {
1502 //remove item from fuel items
1503 RemoveFromFireConsumables(fireConsumable);
1504 }
1505 else
1506 {
1507 fireConsumable.SetRemainingEnergy(fireConsumable.GetEnergy());
1508 }
1509
1510 item.AddQuantity(-1);
1512 }
1513 }
1514 }
1515
1517 }
1518
1520 protected int GetKindlingCount()
1521 {
1522 int attachmentsCount = GetInventory().AttachmentCount();
1523 int kindlingCount = 0;
1524
1525 for (int i = 0; i < attachmentsCount; ++i)
1526 {
1527 ItemBase item = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(i));
1528
1529 if (IsKindling(item))
1530 kindlingCount++;
1531 }
1532
1533 return kindlingCount;
1534 }
1535
1537 protected int GetFuelCount()
1538 {
1539 int attachmentsCount = GetInventory().AttachmentCount();
1540 int fuelCount = 0;
1541
1542 for (int i = 0; i < attachmentsCount; ++i)
1543 {
1544 ItemBase item = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(i));
1545 if (IsFuel(item))
1546 fuelCount++;
1547 }
1548
1549 return fuelCount;
1550 }
1551
1553 protected bool IsKindling(ItemBase item)
1554 {
1555 FireConsumableType fireConsumableType = m_FireConsumableTypes.Get(item.Type());
1556 if (!fireConsumableType)
1557 {
1559 int count = m_FireConsumableTypes.Count();
1560 for (int i = 0; i < count; ++i)
1561 {
1562 if (item.IsInherited(m_FireConsumableTypes.GetKey(i)))
1563 fireConsumableType = m_FireConsumableTypes.GetElement(i);
1564 }
1565 }
1566
1567 return fireConsumableType && fireConsumableType.IsKindling();
1568 }
1569
1571 protected bool IsFuel(ItemBase item)
1572 {
1573 FireConsumableType fireConsumableType = m_FireConsumableTypes.Get(item.Type());
1574 if (!fireConsumableType)
1575 {
1577 int count = m_FireConsumableTypes.Count();
1578 for (int i = 0; i < count; ++i)
1579 {
1580 if (item.IsInherited(m_FireConsumableTypes.GetKey(i)))
1581 fireConsumableType = m_FireConsumableTypes.GetElement(i);
1582 }
1583 }
1584
1585 return fireConsumableType && !fireConsumableType.IsKindling();
1586 }
1587
1588 //Has attachments of given type
1589 bool IsItemTypeAttached(typename item_type)
1590 {
1591 return GetAttachmentByType(item_type) != null;
1592 }
1593
1594 //Has attachments of required quantity
1595 bool IsItemAttachedQuantity(typename item_type, float quantity)
1596 {
1597 ItemBase item = ItemBase.Cast(GetAttachmentByType(item_type));
1598
1599 return item.GetQuantity() >= quantity;
1600 }
1601
1602 //Has last attached item
1604 {
1605 return GetInventory().AttachmentCount() == 1;
1606 }
1607
1608 //Has last fuel/kindling attached
1610 {
1611 return (GetFuelCount() + GetKindlingCount()) == 1;
1612 }
1613
1614
1615 //================================================================
1616 // FIRE STATE
1617 //================================================================
1618 //Is fireplace burning?
1620 {
1621 return m_IsBurning;
1622 }
1623
1624 //Set burning state
1625 protected void SetBurningState(bool is_burning)
1626 {
1627 m_IsBurning = is_burning;
1628 }
1629
1630 //Are ashes present in fireplace?
1632 {
1633 return m_HasAshes;
1634 }
1635
1636 //Set ashes state
1637 protected void SetAshesState(bool has_ashes)
1638 {
1639 m_HasAshes = has_ashes;
1640 }
1641
1642 //Is in oven state
1643 bool IsOven()
1644 {
1645 return m_IsOven;
1646 }
1648 {
1649 return m_HasStoneCircle;
1650 }
1651
1653 {
1654 EntityAI attached_item = GetAttachmentByType(ATTACHMENT_STONES);
1655
1656 return attached_item && attached_item.GetQuantity() > 0;
1657 }
1658
1660 {
1661 if (HasStones())
1662 {
1663 return GetAttachmentByType(ATTACHMENT_STONES).GetQuantity();
1664 }
1665
1666 return 0;
1667 }
1668
1669 void SetOvenState(bool is_oven)
1670 {
1671 if (m_IsOven != is_oven)
1672 {
1673 m_IsOven = is_oven;
1674
1675 GetInventory().SetSlotLock(InventorySlots.GetSlotIdFromString("Stones") , is_oven);
1676
1677 Synchronize();
1678 }
1679 }
1680
1681 void SetStoneCircleState(bool has_stonecircle)
1682 {
1683 if (m_HasStoneCircle != has_stonecircle)
1684 {
1685 m_HasStoneCircle = has_stonecircle;
1686
1687 GetInventory().SetSlotLock(InventorySlots.GetSlotIdFromString("Stones") , has_stonecircle);
1688
1689 Synchronize();
1690 }
1691 }
1692
1693 //Fuel burn rate MP
1694 protected float GetFuelBurnRateMP()
1695 {
1696 return m_FuelBurnRateMP;
1697 }
1698
1699 protected void SetFuelBurnRateMP(float value)
1700 {
1701 m_FuelBurnRateMP = value;
1702 }
1703
1704 //Get fire state
1705 protected int GetFireState()
1706 {
1707 return m_FireState;
1708 }
1709
1710 //Sets fire state
1711 protected void SetFireState(FireplaceFireState state)
1712 {
1713 if (m_FireState != state)
1714 {
1715 m_FireState = state;
1716
1717 Synchronize();
1718 }
1719 }
1720
1722 {
1723 SetFireState(FireplaceFireState.EXTINGUISHING_FIRE);
1724 }
1725
1726 //================================================================
1727 // FIRE PROCESS
1728 //================================================================
1729
1730 //Start the fire process
1731 // 1. start heating
1732 // 2. heating
1733 // 3. stop heating
1734 void StartFire(bool force_start = false)
1735 {
1736 //stop cooling process if active
1737 if (m_CoolingTimer)
1738 {
1739 m_CoolingTimer.Stop();
1740 m_CoolingTimer = null;
1741 }
1742
1743 //start fire
1744 if (!IsBurning() || force_start)
1745 {
1746 //roof check
1748
1750 SetBurningState(true);
1751 StartHeating();
1752
1753 //Update navmesh
1754 if (!IsFireplaceIndoor())
1755 {
1756 SetAffectPathgraph(false, true);
1757 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GetGame().UpdatePathgraphRegionByObject, 100, false, this);
1758 }
1759 }
1760
1761 Synchronize();
1762 }
1763
1764 //Start heating
1765 protected void StartHeating()
1766 {
1767 //visual
1768 SetObjectMaterial(0, MATERIAL_FIREPLACE_GLOW);
1769
1770 if (IsWindy() && !IsRoofAbove() && IsOpen() && !IsOven() && !IsBarrelWithHoles())
1771 {
1772 StopFire();
1773 return;
1774 }
1775
1777 {
1778 StopFire(FireplaceFireState.EXTINGUISHED_FIRE);
1779 return;
1780 }
1781
1782 //create area damage
1783 if (IsBaseFireplace() && !IsOven())
1785
1787 m_HeatingTimer.Run(TIMER_HEATING_UPDATE_INTERVAL, this, "Heating", null, true);
1788 m_CookingProcess.SetCookingUpdateTime(TIMER_HEATING_UPDATE_INTERVAL);
1789
1790 //Setup the noise parameters on fire start
1791 m_NoisePar = new NoiseParams();
1792 if (IsRoofAbove() || IsOven() || IsFireplaceIndoor()) //If we have a roof, we are probably inside
1793 m_NoisePar.LoadFromPath("CfgVehicles FireplaceBase NoiseFireplaceSpecial");
1794 else
1795 m_NoisePar.LoadFromPath("CfgVehicles FireplaceBase NoiseFireplaceBase");
1796 }
1797
1798 //Do heating
1799 protected void Heating()
1800 {
1801 float temperature;
1802 float temperatureModifier = 0;
1803
1804 if (IsOpen() && !IsOven())
1806
1807 //check burning conditions
1809 {
1810 StopFire(FireplaceFireState.EXTINGUISHED_FIRE);
1811 return;
1812 }
1813 else
1814 {
1815 if (m_FireConsumables.Count() == 0)
1816 {
1817 StopFire();
1818 return;
1819 }
1820 }
1821
1822 //spend actual fire consumable
1824 SpendFireConsumable(amount);
1825
1826 //set wetness and alter temperature modifier (which will lower temperature increase because of soaking)
1827 float rain = GetGame().GetWeather().GetRain().GetActual();
1828 float combinedWindAndSnowfall = MiscGameplayFunctions.GetCombinedSnowfallWindValue();
1829
1830 if ((rain >= RAIN_EFFECT_LIMIT || combinedWindAndSnowfall >= SNOWFALL_EFFECT_LIMIT) && !IsRoofAbove() && IsOpen() && !IsOven())
1831 {
1832 if (rain > combinedWindAndSnowfall)
1833 {
1835 temperatureModifier = PARAM_TEMPERATURE_DECREASE * rain;
1836 }
1837 else
1838 {
1839 AddWetnessToFireplace(SNOWFALL_WETNESS_INCREASE * combinedWindAndSnowfall);
1840 temperatureModifier = PARAM_TEMPERATURE_DECREASE * combinedWindAndSnowfall;
1841 }
1842 }
1843 //subtract wetness when heating and not raining above
1844 else
1845 {
1847 }
1848
1849 if (m_SurfaceUnderWetnessModifier > 0.0)
1850 AddWetnessToFireplace(m_SurfaceUnderWetnessModifier * WET_SURFACE_INCREMENT);
1851
1852 // FLAT temperature increase
1853 temperature = GetTemperature() + (PARAM_TEMPERATURE_INCREASE * TIMER_HEATING_UPDATE_INTERVAL) - temperatureModifier;
1854 temperature = Math.Clamp(temperature, g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this), m_UTSLFireplace.m_NormalFireplaceTemperatureMax);
1855 SetTemperatureDirect(temperature); //direct heating (non-systematic approach), freezing, overheating, and other stuff inside 'SetTemperatureEx' are therefore UNHANDLED here!
1856 m_UTSLFireplace.SetFuelCount(GetFuelCount()); //legacy reasons
1857 m_UTSLFireplace.SetCurrentTemperature(temperature); //legacy reasons
1859
1860 //get newly changed temperature
1861 temperature = GetTemperature();
1862
1863 //check fire state
1864 if (GetFireState() != FireplaceFireState.EXTINGUISHING_FIRE)
1865 {
1867 }
1868
1869 //damage cargo items
1871
1872 //manage cooking equipment (this applies only for case of cooking pot on a tripod)
1874 {
1876 }
1877
1878 float cookingItemTemperature;
1879 int i;
1880 // manage cooking on direct cooking slots
1882 {
1883 for (i = 0; i < DIRECT_COOKING_SLOT_COUNT; i++)
1884 {
1885 if (m_DirectCookingSlots[i])
1886 {
1887 cookingItemTemperature = m_DirectCookingSlots[i].GetTemperature();
1888 CookOnDirectSlot(m_DirectCookingSlots[i], cookingItemTemperature, temperature);
1889 }
1890 }
1891 }
1892
1893 // manage smoking slots
1894 if (SmokingSlotsInUse())
1895 {
1896 for (i = 0; i < SMOKING_SLOT_COUNT; i++)
1897 {
1898 if (m_SmokingSlots[i])
1899 {
1900 SmokeOnSmokingSlot(m_SmokingSlots[i], cookingItemTemperature, temperature);
1901 }
1902 }
1903 }
1904
1905 //Make noise for AI, only at night
1906 if (GetGame().GetWorld().IsNight() && m_CanNoise)
1907 {
1909 if (noise && m_NoisePar)
1910 {
1912 }
1913 m_CanNoise = false;
1914 }
1915 else
1916 m_CanNoise = true;
1917
1918 Synchronize();
1919 }
1920
1921 //Stop the fire process
1922 // 1. start cooling
1923 // 2. cooling
1924 // 3. stop cooling
1926 {
1927 //roof check
1928 if (IsBurning())
1930
1931 StopHeating();
1933 SetBurningState(false);
1934 StartCooling();
1935 SetFireState(fire_state);
1936
1937 //Update navmesh
1938 if (!IsFireplaceIndoor())
1939 {
1940 SetAffectPathgraph(false, false);
1941 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GetGame().UpdatePathgraphRegionByObject, 100, false, this);
1942 }
1943
1944 Synchronize();
1945 }
1946
1947 protected void StopHeating()
1948 {
1949 if (!m_HeatingTimer)
1950 return;
1951
1952 m_HeatingTimer.Stop();
1953 m_HeatingTimer = null;
1954 }
1955
1956 protected void StartCooling()
1957 {
1958 if (m_HeatingTimer)
1959 {
1960 m_HeatingTimer.Stop();
1961 m_HeatingTimer = null;
1962 }
1963
1964 //Start cooling
1966 m_CoolingTimer.Run(TIMER_COOLING_UPDATE_INTERVAL, this, "Cooling", null, true);
1967 m_CookingProcess.SetCookingUpdateTime(TIMER_COOLING_UPDATE_INTERVAL);
1968 }
1969
1970 protected void Cooling()
1971 {
1972 float temperature = GetTemperature();
1973 float temperatureModifier = 0;
1974
1975 if (IsOpen() && !IsOven())
1977
1978 //should never be true!
1979 if (IsBurning())
1980 {
1981 StopCooling();
1982 return;
1983 }
1984
1985 //float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
1986 float target = 10;
1987
1988 if (temperature > target)
1989 {
1990 //set wetness and alter temperature modifier (which will lower temperature increase because of soaking)
1991 float rain = GetGame().GetWeather().GetRain().GetActual();
1992 float combinedWindAndSnowfall = MiscGameplayFunctions.GetCombinedSnowfallWindValue();
1993
1994 if ((rain >= RAIN_EFFECT_LIMIT || combinedWindAndSnowfall >= SNOWFALL_EFFECT_LIMIT) && !IsRoofAbove() && IsOpen() && !IsOven())
1995 {
1996 if (rain > combinedWindAndSnowfall)
1997 {
1999 temperatureModifier = PARAM_TEMPERATURE_DECREASE * rain;
2000 }
2001 else
2002 {
2003 AddWetnessToFireplace(SNOWFALL_WETNESS_INCREASE * combinedWindAndSnowfall);
2004 temperatureModifier = PARAM_TEMPERATURE_DECREASE * combinedWindAndSnowfall;
2005 }
2006 }
2007 else //subtract wetness
2008 {
2010 }
2011
2012 //calculate already obtained wetness (e.g. extinguished by water)
2013 float wetness = GetWet();
2014 temperatureModifier = temperatureModifier + (PARAM_TEMPERATURE_DECREASE * wetness);
2015
2016 // COMBINED temperature decrease
2017 target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
2018 //FLAT for wetness
2019 float flatWetTarget = GetTemperature() - temperatureModifier;
2020 flatWetTarget = Math.Clamp(flatWetTarget,target,GetTemperatureMax());
2021 SetTemperatureDirect(flatWetTarget);
2022 //INTERPOLATED for regular cooling
2023 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_FIREPLACE,TIMER_COOLING_UPDATE_INTERVAL,GameConstants.TEMP_COEF_FIREPLACE_COOLING));
2024 m_UTSLFireplace.SetFuelCount(GetFuelCount());
2025 m_UTSLFireplace.UpdateFireplaceTemperature(m_UTSSettings);
2027
2028 //get newly changed temperature
2029 temperature = GetTemperature();
2030
2031 //damage cargo items
2033
2034 //cook with equipment if temperature of equipment is still high
2036 {
2037 float cookEquipTemp = m_CookingEquipment.GetTemperature();
2038
2039 if (cookEquipTemp >= PARAM_COOKING_TEMP_THRESHOLD)
2040 {
2041 //cook
2043 }
2044 }
2045
2046 float cookingItemTemperature;
2047 int i;
2048
2049 // manage cooking on direct cooking slots
2051 {
2052 for (i = 0; i < DIRECT_COOKING_SLOT_COUNT; i++)
2053 {
2054 if (m_DirectCookingSlots[i])
2055 CookOnDirectSlot(m_DirectCookingSlots[i], cookingItemTemperature, temperature);
2056 }
2057 }
2058
2059 // manage smoking slots
2060 if (SmokingSlotsInUse())
2061 {
2062 for (i = 0; i < SMOKING_SLOT_COUNT; i++)
2063 {
2064 if (m_SmokingSlots[i])
2065 SmokeOnSmokingSlot(m_SmokingSlots[i], cookingItemTemperature, temperature);
2066 }
2067 }
2068 }
2069 else
2070 {
2071 StopCooling();
2072 }
2073 }
2074
2075 protected void StopCooling()
2076 {
2077 //stop all fire visuals
2079 SetObjectMaterial(0, MATERIAL_FIREPLACE_NOGLOW);
2080
2081 //Stop cooling
2082 m_CoolingTimer.Stop();
2083 m_CoolingTimer = NULL;
2084
2085 //destroy area damage
2087
2088 //remove cookware audio visuals
2089 ItemBase cookware;
2090 if (Class.CastTo(cookware,GetCookingEquipment()) && (cookware.IsCookware() || cookware.IsLiquidContainer())) //also stops boiling effects on bottles
2091 cookware.RemoveAudioVisualsOnClient();
2092
2094 {
2095 for (int i = 0; i < DIRECT_COOKING_SLOT_COUNT; i++)
2096 {
2097 if (m_DirectCookingSlots[i])
2098 {
2099 if (Class.CastTo(cookware,m_DirectCookingSlots[i]) && (cookware.IsCookware() || cookware.IsLiquidContainer())) //also stops boiling effects on bottles
2100 cookware.RemoveAudioVisualsOnClient();
2101
2102 Edible_Base itsfood = Edible_Base.Cast(m_DirectCookingSlots[i]);
2103 if (itsfood)
2104 itsfood.MakeSoundsOnClient(false);
2105
2106 GameInventory inv = m_DirectCookingSlots[i].GetInventory();
2107 if (!inv)
2108 return;
2109
2110 CargoBase cargo = inv.GetCargo();
2111 if (!cargo) // cookware
2112 return;
2113
2114 for (int j = 0; j < cargo.GetItemCount(); j++)
2115 {
2116 Edible_Base edible = Edible_Base.Cast(cargo.GetItem(j));
2117 if (edible)
2118 edible.MakeSoundsOnClient(false);
2119 }
2120 }
2121 }
2122 }
2123 }
2124
2125 //================================================================
2126 // COOKING
2127 //================================================================
2128 protected void CookWithEquipment()
2129 {
2130 if (m_CookingProcess == null)
2131 m_CookingProcess = new Cooking();
2132
2133 m_CookingProcess.CookWithEquipment(m_CookingEquipment);
2134 }
2135
2137 {
2138 if (m_CookingProcess == null)
2139 m_CookingProcess = new Cooking();
2140
2141 return m_CookingProcess;
2142 }
2143
2144 protected void CookOnDirectSlot(ItemBase slot_item, float temp_equip, float temp_ext)
2145 {
2146 if (m_CookingProcess == null)
2147 m_CookingProcess = new Cooking();
2148
2149 m_CookingProcess.CookWithEquipment(slot_item);
2150 }
2151
2152 protected void SmokeOnSmokingSlot(ItemBase slot_item, float temp_equip, float temp_ext)
2153 {
2154 if (m_CookingProcess == NULL)
2155 m_CookingProcess = new Cooking();
2156
2157 // smoking slots accept only individual meat/fruit/veg items
2158 Edible_Base ingr = Edible_Base.Cast(slot_item);
2159 if (ingr)
2160 m_CookingProcess.SmokeItem(ingr, FireplaceBase.TIMER_HEATING_UPDATE_INTERVAL * FireplaceBase.SMOKING_SPEED);
2161 }
2162
2163 //================================================================
2164 // FIRE VICINITY
2165 //================================================================
2166 //apply damage to all items, raise temperature to only specific items
2167 protected void BurnItemsInFireplace()
2168 {
2170 CargoBase cargo = GetInventory().GetCargo();
2171 for (int i = 0; i < cargo.GetItemCount(); i++)
2172 {
2173 ItemBase item = ItemBase.Cast(cargo.GetItem(i));
2174
2175 //add temperature
2177
2178 //set damage
2179 AddDamageToItemByFireEx(item, false, false);
2180
2181 //remove wetness
2183 }
2184
2186 for (int j = 0; j < GetInventory().AttachmentCount(); ++j)
2187 {
2188 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(j));
2189
2190 //add temperature
2191 AddTemperatureToItemByFire(attachment);
2192
2193 //set damage
2194 AddDamageToItemByFireEx(attachment, false, true);
2195
2196 //remove wetness
2198 }
2199 }
2200
2201 //moves temperature of the item to the fire temperature (can cool down item!)
2203 {
2204 if (item.CanHaveTemperature())
2205 {
2206 float fireplaceTemp = GetTemperature();
2207 float itemTemp = item.GetTemperature();
2208 float heatPermCoef = item.GetHeatPermeabilityCoef();
2209 float tempCoef;
2210 float deltaTime;
2211
2212 if (m_HeatingTimer && m_HeatingTimer.IsRunning())
2213 {
2216 }
2217 else if (m_CoolingTimer && m_CoolingTimer.IsRunning())
2218 {
2221 }
2222 else
2223 {
2224 return;
2225 }
2226
2227 item.SetTemperatureEx(new TemperatureDataInterpolated(fireplaceTemp,ETemperatureAccessTypes.ACCESS_FIREPLACE,deltaTime,tempCoef,heatPermCoef));
2228 }
2229 }
2230
2232 protected void AddTemperatureToFireplace(float amount) {};
2233
2234 //add damage to item by fire
2235 protected void AddDamageToItemByFireEx(ItemBase item, bool can_be_ruined, bool pAttachment)
2236 {
2237 if (!item)
2238 return;
2239
2241 if (!pAttachment)
2242 {
2244 GameInventory itemInventory = item.GetInventory();
2245 if (itemInventory)
2246 {
2247 array<EntityAI> entities = new array<EntityAI>();
2248 itemInventory.EnumerateInventory(InventoryTraversalType.INORDER, entities);
2249 foreach (EntityAI ent : entities)
2250 {
2251 if (ent != this)
2252 {
2253 ent.DecreaseHealth(PARAM_BURN_DAMAGE_COEF,!ent.IsKindOf("Grenade_Base"));
2254 }
2255 }
2256 }
2257 }
2258 else //direct attachments
2259 {
2260 float timerCoef = 1.0;
2261 if (m_HeatingTimer && m_HeatingTimer.IsRunning())
2263 else if (m_CoolingTimer && m_CoolingTimer.IsRunning())
2265
2266 switch (item.Type())
2267 {
2268 case ATTACHMENT_TRIPOD:
2270 item.DecreaseHealth(GameConstants.FIRE_ATTACHMENT_DAMAGE_PER_SECOND * timerCoef, false);
2271 break;
2272 }
2273
2274 if (item.IsCookware())
2275 {
2276 item.DecreaseHealth(GameConstants.FIRE_ATTACHMENT_DAMAGE_PER_SECOND * timerCoef, false);
2277 }
2278
2280 if (IsFuel(item) || IsKindling(item))
2281 {
2282 if (item.GetHealthLevel() < GameConstants.STATE_BADLY_DAMAGED)
2283 item.DecreaseHealth(PARAM_BURN_DAMAGE_COEF, false);
2284 }
2285 }
2286 }
2287
2288 //add wetness on item
2289 protected void AddWetnessToItem(ItemBase item, float amount)
2290 {
2291 float wetness = item.GetWet();
2292 wetness = wetness + amount;
2293 wetness = Math.Clamp(wetness, 0, 1); //wetness <0-1>
2294 item.SetWet(wetness);
2295 }
2296
2297 //add wetness on fireplace
2298 void AddWetnessToFireplace(float amount)
2299 {
2300 //add wetness
2301 float wetness = GetWet();
2302 wetness = wetness + amount;
2303 wetness = Math.Clamp(wetness, 0, 1); //wetness <0-1>
2304 SetWet(wetness);
2305
2306 //decrease temperature
2307 if (amount > 0)
2308 {
2309 float temperature = GetTemperature();
2310 temperature = temperature * (1 - (wetness * 0.5));
2312 SetTemperatureDirect(temperature);
2313 m_UTSLFireplace.SetFuelCount(GetFuelCount()); //legacy reasons
2314 m_UTSLFireplace.SetCurrentTemperature(temperature); //legacy reasons
2315 }
2316 }
2317
2319 protected void TransferHeatToNearPlayers() {}
2320
2321 //Create and Destroy damage radius around the fireplace when starting/stopping burning process
2323 {
2324 //destroy area damage if some already exists
2326
2327 //create new area damage
2329 m_AreaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
2330 m_AreaDamage.SetExtents("-0.30 0 -0.30", "0.30 0.75 0.30");
2331 m_AreaDamage.SetLoopInterval(0.5);
2332 m_AreaDamage.SetDeferDuration(0.5);
2333 m_AreaDamage.SetHitZones({ "Head","Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" });
2334 m_AreaDamage.SetAmmoName("FireDamage");
2335 m_AreaDamage.Spawn();
2336 }
2337
2339 {
2340 if (m_AreaDamage)
2341 {
2342 m_AreaDamage.Destroy();
2343 }
2344 }
2345
2348 {
2349 ErrorEx("Deprecated method", ErrorExSeverity.INFO);
2350
2351 return false;
2352 }
2353
2354 //================================================================
2355 // ACTIONS
2356 //================================================================
2357 // --- Actions / Action conditions
2358 //Check if there is some kindling attached
2360 {
2361 return GetKindlingCount() > 0;
2362 }
2363
2364 //Check if the weather is too windy
2365 static bool IsWindy()
2366 {
2367 //check wind
2368 float wind_speed = GetGame().GetWeather().GetWindSpeed();
2369 float wind_speed_threshold = GetGame().GetWeather().GetWindMaximumSpeed() * FireplaceBase.IGNITE_WIND_THRESHOLD;
2370
2371 return (wind_speed >= wind_speed_threshold);
2372 }
2373
2375 {
2376 return m_NoIgnite;
2377 }
2378
2379 void SetIgniteFailure(bool failure)
2380 {
2381 m_NoIgnite = failure;
2382 }
2383
2384 //Check if the fireplace is too wet to be ignited
2385 static bool IsEntityWet(notnull EntityAI entity_ai)
2386 {
2387 return (entity_ai.GetWet() >= FireplaceBase.PARAM_MAX_WET_TO_IGNITE);
2388 }
2389
2390 bool IsWet()
2391 {
2392 return FireplaceBase.IsEntityWet(this);
2393 }
2394
2395 //check if fireplace is opened
2396 override bool IsOpen()
2397 {
2398 return true;
2399 }
2400
2401 //Check if there is enough space for smoke
2403 {
2404 return !MiscGameplayFunctions.IsUnderRoof(this, FireplaceBase.MIN_CEILING_HEIGHT);
2405 }
2406
2407 //Check if it's raining and there is only sky above fireplace
2408 static bool IsRainingAboveEntity(notnull EntityAI entity_ai)
2409 {
2410 return (GetGame() && (GetGame().GetWeather().GetRain().GetActual() >= FireplaceBase.PARAM_IGNITE_RAIN_THRESHOLD));
2411 }
2412
2414 {
2415 return FireplaceBase.IsRainingAboveEntity(this);
2416 }
2417
2418 //Check there is water surface bellow fireplace
2419 static bool IsEntityOnWaterSurface(notnull EntityAI entity_ai)
2420 {
2421 vector fireplacePosition = entity_ai.GetPosition();
2422 string surfaceType;
2423 g_Game.SurfaceGetType3D(fireplacePosition[0], fireplacePosition[1] + g_Game.SurfaceGetSeaLevel(), fireplacePosition[2], surfaceType);
2424 if (!surfaceType)
2425 {
2426 float waterLevelDiff = fireplacePosition[1] - g_Game.SurfaceGetSeaLevel();
2427 return waterLevelDiff < 0.5;
2428 }
2429 else if (surfaceType.Contains("water"))
2430 {
2431 return true;
2432 }
2433
2434 return false;
2435 }
2436
2437 protected float GetSurfaceWetnessOnHeatModifier(notnull EntityAI entity)
2438 {
2439 string surfaceType
2440 int liquidType;
2441 g_Game.SurfaceUnderObjectCorrectedLiquid(entity, surfaceType, liquidType);
2442
2443 return Surface.GetParamFloat(surfaceType, "wetnessOnHeatModifier");
2444 }
2445
2447 {
2448 return FireplaceBase.IsEntityOnWaterSurface(this);
2449 }
2450
2451 //check if the surface is interior
2452 static bool IsEntityOnInteriorSurface(notnull EntityAI entity_ai)
2453 {
2454 string surfaceType;
2455 vector fireplacePosition = entity_ai.GetPosition();
2456 GetGame().SurfaceGetType3D(fireplacePosition[0], fireplacePosition[1] + 1.0, fireplacePosition[2], surfaceType);
2457 return (GetGame().ConfigGetInt("CfgSurfaces " + surfaceType + " interior") == 1);
2458 }
2460 {
2461 return FireplaceBase.IsEntityOnInteriorSurface(this);
2462 }
2463
2464 //Checks if has not additional items in it
2465 override bool IsEmpty()
2466 {
2467 return (GetInventory().GetCargo().GetItemCount() == 0 && GetInventory().AttachmentCount() == 0);
2468 }
2469
2470 //Checks if it has no items in cargo
2472 {
2473 return (GetInventory().GetCargo().GetItemCount() == 0);
2474 }
2475
2477 {
2478 return GetInventory().FindAttachment(InventorySlots.GetSlotIdFromString("CookingTripod")) != null;
2479 }
2480
2481 //Check if object is in animation phase
2482 bool IsInAnimPhase(string anim_phase)
2483 {
2484 return GetAnimationPhase(anim_phase) == 0;
2485 }
2486
2488 {
2489 array<Object> objs = {};
2490 if (GetGame().IsBoxCollidingGeometry(GetWorldPosition() + Vector(0, size[1] * 0.5 + 0.1, 0), GetDirection().VectorToAngles(), size, ObjIntersect.View, ObjIntersect.Geom, {this}, objs))
2491 {
2492 foreach (Object obj : objs)
2493 {
2494 if (dBodyGetInteractionLayer(obj) == PhxInteractionLayers.ITEM_LARGE)
2495 return false;
2496 }
2497 }
2498 return true;
2499 }
2500
2501
2502 override bool CanSwapEntities(EntityAI otherItem, InventoryLocation otherDestination, InventoryLocation destination)
2503 {
2504 if (!otherDestination || otherDestination.GetParent() == this)
2505 {
2506 return false;
2507 }
2508 return true;
2509 }
2510
2511 //Action condition for building oven
2513 {
2514 return !IsOven() && !IsBurning() && (GetAttachedStonesCount() >= MIN_STONES_TO_BUILD_OVEN) && !FindAttachmentBySlotName("CookingTripod") && !HasStoneCircle() && IsSpaceForOven();
2515 }
2516
2518 {
2519 const float size = 0.6;
2520 return IsSpaceFor(Vector(size, size, size));
2521 }
2522
2523 //Action condition for stone circle
2528
2530 {
2531 return IsSpaceFor(Vector(0.9, 0.1, 0.9));
2532 }
2533
2534 //Action condition for dismantling oven
2536 {
2537 return (IsOven() && !IsBurning() && !DirectCookingSlotsInUse() && !SmokingSlotsInUse() && GetTemperature() <= MAX_TEMPERATURE_TO_DISMANTLE_OVEN);
2538 }
2539 //Action condition for dismantling stone circle
2541 {
2542 return (HasStoneCircle() && !IsOven() && !IsBurning());
2543 }
2544
2546 {
2547 return (GetTemperature() >= PARAM_COOKING_TEMP_THRESHOLD);
2548 }
2549
2550 //Can extinguish fire
2552 {
2553 return IsBurning();
2554 }
2555
2556 FireplaceLight GetLightEntity()
2557 {
2558 return m_Light;
2559 }
2560
2561 void SetLightEntity(FireplaceLight light)
2562 {
2563 m_Light = light;
2564 }
2565
2566 //================================================================
2567 // ADVANCED PLACEMENT
2568 //================================================================
2569 override bool CanBePlaced( Man player, vector position )
2570 {
2571 string surfaceType;
2572 float surfaceHeight = GetGame().SurfaceGetType3D( position[0], position[1], position[2], surfaceType );
2573 if ((position[1] - surfaceHeight) > PLACEMENT_HEIGHT_LIMIT)
2574 return false;
2575
2576 return true;
2577 }
2578
2579 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
2580 {
2581 super.OnPlacementComplete(player, position, orientation);
2582
2583 if (GetGame().IsServer())
2584 {
2585 //remove grass
2587 cc_object.SetOrientation(orientation);
2588 GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(GetGame().ObjectDelete, 1000, false, cc_object);
2589 }
2590 }
2591
2592 override string GetDeploySoundset()
2593 {
2594 return "placeFireplace_SoundSet";
2595 }
2596
2597 //================================================================
2598 // QUANITTY
2599 //================================================================
2600 // calculates and sets total energy based on possible (fuel/kinidling) item attachments
2601 protected void CalcAndSetTotalEnergy()
2602 {
2603 if (GetGame() && GetGame().IsServer())
2604 {
2605 m_TotalEnergy = 0;
2606
2607 foreach (FireConsumableType fireConsumableType : m_FireConsumableTypes)
2608 {
2609 string quantityConfigPath = string.Format("CfgVehicles %1 varQuantityMax", fireConsumableType.GetItemType().ToString());
2610 string stackMaxConfigPath = string.Format("CfgSlots Slot_%1 stackMax", fireConsumableType.GetAttSlot());
2611 if (GetGame().ConfigIsExisting(quantityConfigPath))
2612 {
2613 float quantityMax = GetGame().ConfigGetFloat(quantityConfigPath);
2614 }
2615
2616 if (GetGame().ConfigIsExisting(stackMaxConfigPath))
2617 {
2618 float stackMax = GetGame().ConfigGetFloat(stackMaxConfigPath);
2619 }
2620
2621 //debug
2622 //Print(fireConsumableType.GetItemType().ToString() + " quantityMax = " + quantityMax.ToString() + " [" + (quantity_max*fire_consumable_type.GetEnergy()).ToString() + "] | stack_max = " + stack_max.ToString() + " [" + (stack_max*fire_consumable_type.GetEnergy()).ToString() + "]");
2623
2624 if (stackMax > 0)
2625 {
2626 m_TotalEnergy += stackMax * fireConsumableType.GetEnergy();
2627 }
2628 else
2629 {
2630 m_TotalEnergy += quantityMax * fireConsumableType.GetEnergy();
2631 }
2632 }
2633
2634 //debug
2635 //Print("Total energy = " + m_TotalEnergy.ToString());
2636 }
2637 }
2638
2639 // calculates and sets current quantity based on actual (fuel/kinidling) item attachments
2640 protected void CalcAndSetQuantity()
2641 {
2642 if (GetGame() && GetGame().IsServer())
2643 {
2644 float remainingEnergy;
2645
2646 foreach (FireConsumable fireConsumable : m_FireConsumables)
2647 {
2648 float quantity = fireConsumable.GetItem().GetQuantity();
2649 if (quantity > 0)
2650 {
2651 remainingEnergy += ((quantity - 1) * fireConsumable.GetEnergy()) + fireConsumable.GetRemainingEnergy();
2652 //Print(fireConsumable.GetItem().GetType() + " remaining energy = " + (((quantity - 1) * fire_consumable.GetEnergy()) + fire_consumable.GetRemainingEnergy()).ToString());
2653 }
2654 else
2655 {
2656 remainingEnergy += fireConsumable.GetRemainingEnergy();
2657 //Print(fireConsumable.GetItem().GetType() + " remaining energy = " + (fireConsumable.GetRemainingEnergy().ToString()));
2658 }
2659 }
2660
2661 SetQuantity(remainingEnergy / m_TotalEnergy * GetQuantityMax());
2662 }
2663 }
2664
2666 {
2667 super.OnAttachmentQuantityChanged(item);
2668
2670 }
2671
2672 override bool CanReleaseAttachment(EntityAI attachment)
2673 {
2674 if (!super.CanReleaseAttachment(attachment))
2675 return false;
2676
2677 ItemBase item = ItemBase.Cast(attachment);
2678 if (IsKindling(item) || IsFuel(item))
2679 {
2680 return !IsBurning();
2681 }
2682
2683 return true;
2684 }
2685
2686 void LockOvenAttachments(bool lock)
2687 {
2688 //Print("LockOvenAttachments");
2689 //string path_cooking_equipment = "" + CFG_VEHICLESPATH + " " + GetType() + " GUIInventoryAttachmentsProps CookingEquipment attachmentSlots";
2690 string path_cooking_equipment = string.Format("%1 %2 GUIInventoryAttachmentsProps CookingEquipment attachmentSlots", CFG_VEHICLESPATH, GetType());
2691 //string path_direct_cooking = "" + CFG_VEHICLESPATH + " " + GetType() + " GUIInventoryAttachmentsProps DirectCooking attachmentSlots";
2692 string path_direct_cooking = string.Format("%1 %2 GUIInventoryAttachmentsProps DirectCooking attachmentSlots", CFG_VEHICLESPATH, GetType());
2693 if (GetGame().ConfigIsExisting(path_cooking_equipment) && GetGame().ConfigIsExisting(path_direct_cooking))
2694 {
2695 array<string> arr_cooking_equipment = new array<string>;
2696 array<string> arr_direct_cooking = new array<string>;
2697 GetGame().ConfigGetTextArray(path_cooking_equipment,arr_cooking_equipment);
2698 GetGame().ConfigGetTextArray(path_direct_cooking,arr_direct_cooking);
2699 for (int i = 0; i < arr_cooking_equipment.Count(); i++)
2700 {
2701 if (lock != GetInventory().GetSlotLock(InventorySlots.GetSlotIdFromString(arr_cooking_equipment[i])))
2702 {
2703 GetInventory().SetSlotLock(InventorySlots.GetSlotIdFromString(arr_cooking_equipment[i]),lock);
2704 //Print("attachment lock: " + arr_cooking_equipment[i] + " " + lock);
2705 }
2706 }
2707
2708 for (i = 0; i < arr_direct_cooking.Count(); i++)
2709 {
2710 if (lock == GetInventory().GetSlotLock(InventorySlots.GetSlotIdFromString(arr_direct_cooking[i])))
2711 {
2712 GetInventory().SetSlotLock(InventorySlots.GetSlotIdFromString(arr_direct_cooking[i]),!lock);
2713 //Print("attachment lock: " + arr_direct_cooking[i] + " " + !lock);
2714 }
2715 }
2716 }
2718 }
2720 {
2721 return true;
2722 }
2723
2724 override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
2725 {
2726 super.OnRPC(sender, rpc_type, ctx);
2727
2728 ref Param1<bool> p = new Param1<bool>(false);
2729
2730 if (ctx.Read(p))
2731 {
2732 bool failure = p.param1;
2733 }
2734
2735 switch (rpc_type)
2736 {
2737 case FirePlaceFailure.WIND:
2738
2739 if (failure)
2740 {
2742 SoundFireStop();
2744 }
2745
2746 break;
2747
2748 case FirePlaceFailure.WET:
2749
2750 if (failure)
2751 {
2753 SoundFireStop();
2755 }
2756
2757 break;
2758 }
2759 }
2760
2761 //================================================================
2762 // DEBUG
2763 //================================================================
2764
2765 //Debug menu Spawn Ground Special
2766 override void OnDebugSpawn()
2767 {
2768 ItemBase firewood = ItemBase.Cast(GetInventory().CreateInInventory("Firewood"));
2769 firewood.SetQuantity(firewood.GetQuantityMax());
2770
2771 ItemBase sticks = ItemBase.Cast(GetInventory().CreateInInventory("WoodenStick"));
2772 sticks.SetQuantity(sticks.GetQuantityMax());
2773
2774 ItemBase stone = ItemBase.Cast(GetInventory().CreateInInventory("Stone"));
2775 stone.SetQuantity(stone.GetQuantityMax());
2776
2777 GetInventory().CreateInInventory("Rag");
2778
2779 SpawnEntityOnGroundPos("PetrolLighter", GetPosition());
2780 }
2781
2782 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
2783 {
2784 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ACTIVATE_ENTITY, "Ignite", FadeColors.LIGHT_GREY));
2785 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DEACTIVATE_ENTITY, "Extinguish", FadeColors.LIGHT_GREY));
2786 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.LIGHT_GREY));
2787
2788 super.GetDebugActions(outputList);
2789 }
2790
2791 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
2792 {
2793 if (super.OnAction(action_id, player, ctx))
2794 return true;
2795 if (GetGame().IsServer() || !GetGame().IsMultiplayer())
2796 {
2797 if (action_id == EActions.ACTIVATE_ENTITY)
2798 {
2799 OnIgnitedThis(null);
2800 }
2801 else if (action_id == EActions.DEACTIVATE_ENTITY)
2802 {
2803 StopFire();
2804 }
2805 }
2806 return false;
2807 }
2808
2810 //DEPRECATED STUFF BELOW//
2818 const float TEMPERATURE_LOSS_MP_STONES = 0.90; //10% boost
2819 const float TEMPERATURE_LOSS_MP_OVEN = 0.75; //25% boost
2822 const float DIRECT_COOKING_SPEED = 1.5; // per second
2823 const float PARAM_WET_INCREASE_COEF = 0.02;
2824
2825 protected float m_TemperatureLossMP = 1.0;
2826
2827 //Temperature loss MP
2828 protected float GetTemperatureLossMP()
2829 {
2830 return m_TemperatureLossMP;
2831 }
2832
2833 protected void SetTemperatureLossMP(float value)
2834 {
2835 m_TemperatureLossMP = value;
2836 }
2837
2838 // DEPRECATED
2839 protected void AddDamageToItemByFire(ItemBase item, bool can_be_ruined)
2840 {
2841 AddDamageToItemByFireEx(item,can_be_ruined,false);
2842 }
2843
2847}
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
@ WET
Определения EntityAI.c:5
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ref NoiseParams m_NoisePar
Определения ActionOpenDoors.c:94
override bool IsSelfAdjustingTemperature()
Определения AnimalBase.c:59
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
float quantityMax
Определения CfgPlayerSpawnDataJson.c:209
void Synchronize()
Определения CombinationLock.c:151
Container_Base m_HalfExtents
override void EEInit()
Определения ContaminatedArea.c:42
override void EEDelete(EntityAI parent)
Определения ContaminatedArea.c:57
map
Определения ControlsXboxNew.c:4
static const float PARAM_BURN_DAMAGE_COEF
Определения Cooking.c:24
DayZGame g_Game
Определения DayZGame.c:3868
PhxInteractionLayers
Определения DayZPhysics.c:2
EActions
Определения EActions.c:2
@ COUNT
Определения EGameStateIcons.c:7
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения ExplosivesBase.c:140
float GetAirResistanceForSmokeParticles(float actual_height)
Определения FireplaceBase.c:1307
void TransferHeatToNearPlayers()
DEPRECATED.
Определения FireplaceBase.c:2319
const int MAX_TEMPERATURE_TO_DISMANTLE_OVEN
minimum amount of stones for oven
Определения FireplaceBase.c:62
void RefreshFireplaceVisuals()
Определения FireplaceBase.c:663
float GetFuelBurnRateMP()
Определения FireplaceBase.c:1694
void RemoveFromFireConsumables(FireConsumable fire_consumable)
Определения FireplaceBase.c:1407
ATTACHMENT_FIREWOOD
Определения FireplaceBase.c:185
override void OnChildItemRemoved(InventoryItem item)
Определения FireplaceBase.c:644
ref UniversalTemperatureSourceSettings m_UTSSettings
Определения FireplaceBase.c:220
float m_FuelBurnRateMP
Определения FireplaceBase.c:35
const string MESSAGE_BURY_ASHES_FAILED_BURNING
Определения FireplaceBase.c:158
int m_OvenAttachmentsLockState
Определения FireplaceBase.c:29
ItemBase GetCookingEquipment()
Определения FireplaceBase.c:583
const string SOUND_FIRE_EXTINGUISHING
Определения FireplaceBase.c:132
static bool IsEntityOnInteriorSurface(notnull EntityAI entity_ai)
Определения FireplaceBase.c:2452
bool m_NoIgnite
Определения FireplaceBase.c:28
bool CanBuildStoneCircle()
Определения FireplaceBase.c:2524
Particle m_ParticleSmallFire
Определения FireplaceBase.c:120
bool HasAnyKindling()
Определения FireplaceBase.c:2359
const float TEMPERATURE_LOSS_MP_OVEN
Определения FireplaceBase.c:2819
void AddDamageToItemByFire(ItemBase item, bool can_be_ruined)
Определения FireplaceBase.c:2839
void ParticleSteamExtinguishingStop()
Определения FireplaceBase.c:1265
bool SmokingSlotsInUse()
Определения FireplaceBase.c:621
void ParticleWetNoIgniteStart()
Определения FireplaceBase.c:1281
const float WET_SURFACE_INCREMENT
Определения FireplaceBase.c:224
const float PARAM_HEAT_THROUGH_AIR_COEF
maximum value of temperature of items in fireplace when heating (degree Celsius)
Определения FireplaceBase.c:2816
bool DirectCookingSlotsInUse()
Определения FireplaceBase.c:609
static ref map< typename, ref FireConsumableType > m_FireConsumableTypes
Определения FireplaceBase.c:142
FireConsumable GetItemToConsume()
Определения FireplaceBase.c:1459
override void CheckForDestroy()
Определения FireplaceBase.c:650
ATTACHMENT_BARK_OAK
Определения FireplaceBase.c:190
const string ANIMATION_OVEN
Определения FireplaceBase.c:172
const int DIRECT_COOKING_SLOT_COUNT
direct cooking slots
Определения FireplaceBase.c:76
const int TIMER_HEATING_UPDATE_INTERVAL
timer constants
Определения FireplaceBase.c:73
Object m_ClutterCutter
Определения FireplaceBase.c:206
Particle m_ParticleFireStart
Определения FireplaceBase.c:119
void ParticleSmallFireStart()
Определения FireplaceBase.c:1142
void SoundFireLightStart()
Определения FireplaceBase.c:1335
void LockOvenAttachments(bool lock)
Определения FireplaceBase.c:2686
void AddTemperatureToItemByFire(ItemBase item)
Определения FireplaceBase.c:2202
void ParticleNormalFireStop()
Определения FireplaceBase.c:1172
void ParticleSteamEndStart()
Определения FireplaceBase.c:1271
Particle m_ParticleSmallSmoke
Определения FireplaceBase.c:122
ATTACHMENT_FRYING_PAN
Определения FireplaceBase.c:201
const string MESSAGE_IGNITE_NO_KINDLING
Определения FireplaceBase.c:147
const int TIMER_COOLING_UPDATE_INTERVAL
update interval duration of heating process (seconds)
Определения FireplaceBase.c:74
const float PARAM_ITEM_HEAT_TEMP_HEATING_COEF
value for calculating temperature increase on each heat update interval (degree Celsius)
Определения FireplaceBase.c:2814
ATTACHMENT_CAULDRON
Определения FireplaceBase.c:202
const string MESSAGE_IGNITE_IN_WATER
Определения FireplaceBase.c:151
ATTACHMENT_STICKS
Определения FireplaceBase.c:184
float m_LightDistance
Определения FireplaceBase.c:97
ref UnderObjectDecalSpawnSettings m_UnderObjectDecalSpawnSettings
Определения FireplaceBase.c:228
const float PARAM_TEMPERATURE_DECREASE
how much will temperature increase when fireplace is burning (degree Celsius per second)
Определения FireplaceBase.c:46
const float PARAM_TEMPERATURE_INCREASE
minimum fireplace temperature under which the fireplace is inactive (degree Celsius)
Определения FireplaceBase.c:45
const float PARAM_FIRE_CONSUM_RATE_AMOUNT
value for calculating wetness loss during cooling process
Определения FireplaceBase.c:53
const string MESSAGE_REIGNITE_RAIN
Определения FireplaceBase.c:154
const int LIFETIME_FIREPLACE_STONE_CIRCLE
Определения FireplaceBase.c:81
int PARTICLE_STEAM_EXTINGUISHING
Определения FireplaceBase.c:116
const string SOUND_FIRE_HEAVY
Определения FireplaceBase.c:129
const string MESSAGE_BURY_ASHES_FAILED_NOT_EMPTY
Определения FireplaceBase.c:156
Particle m_ParticleNormalFire
Определения FireplaceBase.c:121
bool IsSpaceForOven()
Определения FireplaceBase.c:2517
static bool IsEntityOnWaterSurface(notnull EntityAI entity_ai)
Определения FireplaceBase.c:2419
const float TEMPERATURE_LOSS_MP_DEFAULT
DEPRECATED value for calculation of heat transfered from fireplace through air to player (environment...
Определения FireplaceBase.c:2817
const string SOUND_FIRE_LIGHT
Определения FireplaceBase.c:130
void SoundFireExtinguishedStart()
Определения FireplaceBase.c:1350
enum FireplaceFireState m_IsBurning
bool IsCeilingHighEnoughForSmoke()
Определения FireplaceBase.c:2402
override bool IsFireplace()
Определения FireplaceBase.c:527
const string MESSAGE_IGNITE_IGNIT_ITEM_DAMAGED
Определения FireplaceBase.c:146
void AddToFireConsumables(ItemBase item)
Определения FireplaceBase.c:1380
const string MESSAGE_IGNITE_RAIN
Определения FireplaceBase.c:149
void StartCooling()
Определения FireplaceBase.c:1956
void ParticleSteamExtinguishingStart()
Определения FireplaceBase.c:1260
EffectSound m_SoundFireLoop
Определения FireplaceBase.c:136
int PARTICLE_STEAM_END
Определения FireplaceBase.c:115
const float PARAM_ITEM_HEAT_MIN_TEMP
Определения FireplaceBase.c:2812
void ~FireplaceBase()
Определения FireplaceBase.c:295
bool m_HasStoneCircle
Определения FireplaceBase.c:27
const float PLACEMENT_HEIGHT_LIMIT
Определения FireplaceBase.c:204
bool m_CanNoise
Определения FireplaceBase.c:216
FireplaceFireState m_FireState
Определения FireplaceBase.c:30
const float PARAM_MIN_TEMP_TO_REIGNITE
maximum wetness value when the fireplace can be ignited
Определения FireplaceBase.c:48
void SoundFireStop()
Определения FireplaceBase.c:1371
ATTACHMENT_PUNCHEDCARD
Определения FireplaceBase.c:194
void DestroyFireplace()
[DEPRECATED]
Определения FireplaceBase.c:634
void SetFuelBurnRateMP(float value)
Определения FireplaceBase.c:1699
ATTACHMENT_EYEMASK_COLORBASE
Определения FireplaceBase.c:195
bool HasCookingStand()
Определения FireplaceBase.c:2476
bool CanBuildOven()
Определения FireplaceBase.c:2512
int PARTICLE_NORMAL_FIRE
Определения FireplaceBase.c:109
void SetAshesState(bool has_ashes)
Определения FireplaceBase.c:1637
ATTACHMENT_BANDAGE
Определения FireplaceBase.c:188
void Heating()
Определения FireplaceBase.c:1799
void StopCooling()
Определения FireplaceBase.c:2075
bool IsOnWaterSurface()
Определения FireplaceBase.c:2446
const string MESSAGE_CANNOT_DISMANTLE_OVEN
Определения FireplaceBase.c:161
void StopFire(FireplaceFireState fire_state=FireplaceFireState.END_FIRE)
Определения FireplaceBase.c:1925
ref Cooking m_CookingProcess
determines how fast will the fuel item burn before spending (lower is better)
Определения FireplaceBase.c:38
const string OBJECT_CLUTTER_CUTTER
Определения FireplaceBase.c:205
const string ANIMATION_CAULDRON_HANDLE
Определения FireplaceBase.c:175
bool HasAshes()
Определения FireplaceBase.c:1631
ATTACHMENT_BOOK
Определения FireplaceBase.c:189
void BurnItemsInFireplace()
Определения FireplaceBase.c:2167
bool IsRainingAbove()
Определения FireplaceBase.c:2413
void Cooling()
Определения FireplaceBase.c:1970
Particle m_ParticleSteamExtinguishing
Определения FireplaceBase.c:126
void SoundFireHeavyStart()
Определения FireplaceBase.c:1340
const float DIRECT_COOKING_SPEED
how much will temperature increase when attached on burning fireplace (degree Celsius)
Определения FireplaceBase.c:2822
const int LIFETIME_FIREPLACE_STONE_OVEN
Определения FireplaceBase.c:82
ATTACHMENT_GIFTWRAP
Определения FireplaceBase.c:193
ATTACHMENT_RAGS
Определения FireplaceBase.c:187
const float PARAM_MAX_TRANSFERED_TEMPERATURE
radius in which objects are heated by fire
Определения FireplaceBase.c:57
override void OnAttachmentRuined(EntityAI attachment)
Определения FireplaceBase.c:371
int PARTICLE_NO_IGNITE_WIND
Определения FireplaceBase.c:117
FireplaceFireState m_LastFireState
Определения FireplaceBase.c:31
override bool CanBePlaced(Man player, vector position)
Определения FireplaceBase.c:2569
const string ANIMATION_TRIPOD
Определения FireplaceBase.c:171
ref UnderObjectDecalSpawnComponent m_UnderObjectDecalSpawnComponent
Определения FireplaceBase.c:229
void SetFireState(FireplaceFireState state)
Определения FireplaceBase.c:1711
const int MIN_STONES_TO_BUILD_OVEN
minimum amount of stones for circle
Определения FireplaceBase.c:61
const float PARAM_HEAT_RADIUS
radius in which objects are fully heated by fire
Определения FireplaceBase.c:56
FireplaceLight GetLightEntity()
Определения FireplaceBase.c:2556
void CalcAndSetQuantity()
Определения FireplaceBase.c:2640
const string MESSAGE_IGNITE_WIND
Определения FireplaceBase.c:150
const float TEMPERATURE_LOSS_MP_STONES
Определения FireplaceBase.c:2818
const string MATERIAL_FIREPLACE_GLOW
Определения FireplaceBase.c:179
static bool IsWindy()
Определения FireplaceBase.c:2365
static bool IsEntityWet(notnull EntityAI entity_ai)
Определения FireplaceBase.c:2385
const string SOUND_FIRE_EXTINGUISHED
Определения FireplaceBase.c:133
bool HasStones()
Определения FireplaceBase.c:1652
void StartHeating()
Определения FireplaceBase.c:1765
const string ANIMATION_ASHES
Определения FireplaceBase.c:164
const float PARAM_NORMAL_FIRE_TEMPERATURE
maximum fireplace temperature of a small fire (degree Celsius)
Определения FireplaceBase.c:42
bool CanDismantleStoneCircle()
Определения FireplaceBase.c:2540
void CookOnDirectSlot(ItemBase slot_item, float temp_equip, float temp_ext)
Определения FireplaceBase.c:2144
int PARTICLE_FIRE_START
Определения FireplaceBase.c:106
void SetBurntFirewood()
DEPRECATED.
Определения FireplaceBase.c:836
const string MESSAGE_IGNITE_UNDER_LOW_ROOF
Определения FireplaceBase.c:152
const float PARAM_MIN_FIRE_TEMPERATURE
maximum fireplace temperature of an outdoor fire (degree Celsius)
Определения FireplaceBase.c:44
void CookWithEquipment()
Определения FireplaceBase.c:2128
bool IsInAnimPhase(string anim_phase)
Определения FireplaceBase.c:2482
const float MIN_CEILING_HEIGHT
maximum temperature for dismantling oven
Определения FireplaceBase.c:63
const float PARAM_MAX_ITEM_HEAT_TEMP_INCREASE
multiplies temperature change on heating
Определения FireplaceBase.c:2815
const string MATERIAL_FIREPLACE_NOGLOW
Определения FireplaceBase.c:180
void StopHeating()
Определения FireplaceBase.c:1947
void SpendFireConsumable(float amount)
Определения FireplaceBase.c:1468
bool IsSpaceForCircle()
Определения FireplaceBase.c:2529
void ParticleNormalSmokeStop()
Определения FireplaceBase.c:1224
ref Timer m_CoolingTimer
Определения FireplaceBase.c:93
bool IsCargoEmpty()
Определения FireplaceBase.c:2471
const string ANIMATION_INVENTORY
Определения FireplaceBase.c:173
bool IsFuel(ItemBase item)
Returns if item attached to fireplace is fuel.
Определения FireplaceBase.c:1571
float GetTemperatureLossMP()
determines how fast will the fireplace loose its temperature when cooling (lower is better)
Определения FireplaceBase.c:2828
void RefreshFireplacePhysics()
const string ANIMATION_STONES
Определения FireplaceBase.c:170
bool GetIgniteFailure()
Определения FireplaceBase.c:2374
void RefreshFireParticlesAndSounds(bool force_refresh)
Определения FireplaceBase.c:848
bool IsOnInteriorSurface()
Определения FireplaceBase.c:2459
const float SNOWFALL_EFFECT_LIMIT
rain level that triggers fireplace to start soaking
Определения FireplaceBase.c:87
void RefreshFireState()
Определения FireplaceBase.c:1052
ref AreaDamageManager m_AreaDamage
Определения FireplaceBase.c:209
const float PARAM_SMALL_FIRE_TEMPERATURE
Определения FireplaceBase.c:41
Cooking GetCookingProcess()
Определения FireplaceBase.c:2136
int PARTICLE_NORMAL_SMOKE
Определения FireplaceBase.c:112
const float PARAM_WET_COOLING_DECREASE_COEF
value for calculating wetness loss during heating process
Определения FireplaceBase.c:52
ATTACHMENT_STONES
Определения FireplaceBase.c:199
const string MESSAGE_REIGNITE_TOO_WET
Определения FireplaceBase.c:155
void ParticleFireStartStart()
Определения FireplaceBase.c:1124
const int SMOKING_SLOT_COUNT
Определения FireplaceBase.c:77
void DestroyAreaDamage()
Определения FireplaceBase.c:2338
void SoundFireWetNoIgniteStart()
Определения FireplaceBase.c:1355
ATTACHMENT_COOKING_POT
Определения FireplaceBase.c:200
const float FUEL_BURN_RATE_OVEN
Определения FireplaceBase.c:68
const string MESSAGE_BURY_ASHES_FAILED_TOO_HOT
Определения FireplaceBase.c:159
bool IsBurning()
Определения FireplaceBase.c:1619
void SmokeOnSmokingSlot(ItemBase slot_item, float temp_equip, float temp_ext)
Определения FireplaceBase.c:2152
bool IsWet()
Определения FireplaceBase.c:2390
const float SNOWFALL_WETNESS_INCREASE
value for calculating of wetness that fireplace gain when raining
Определения FireplaceBase.c:89
const string MESSAGE_CANNOT_BUILD_OVEN
Определения FireplaceBase.c:160
void SoundFireExtinguishingStart()
Определения FireplaceBase.c:1360
float GetSurfaceWetnessOnHeatModifier(notnull EntityAI entity)
Определения FireplaceBase.c:2437
void StartFire(bool force_start=false)
Определения FireplaceBase.c:1734
override bool GetCookingTargetTemperature(out float temperature)
Определения FireplaceBase.c:562
ItemBase m_DirectCookingSlots[DIRECT_COOKING_SLOT_COUNT]
Определения FireplaceBase.c:101
const string ANIMATION_WOOD
Определения FireplaceBase.c:167
int PARTICLE_FIRE_END
Определения FireplaceBase.c:113
ATTACHMENT_PAPER
Определения FireplaceBase.c:192
int GetFireState()
Определения FireplaceBase.c:1705
void SetIgniteFailure(bool failure)
Определения FireplaceBase.c:2379
void SoundFireWindyNoIgniteStart()
Определения FireplaceBase.c:1365
void AddTemperatureToFireplace(float amount)
DEPRECATED.
Определения FireplaceBase.c:2232
bool m_IsOven
Определения FireplaceBase.c:26
const float FUEL_BURN_RATE_DEFAULT
min height of ceiling for fire to be ignited
Определения FireplaceBase.c:66
const float PARAM_BURN_WET_THRESHOLD
maximum rain value when the fireplace can be ignited
Определения FireplaceBase.c:50
ATTACHMENT_BARK_BIRCH
Определения FireplaceBase.c:191
ATTACHMENT_TRIPOD
Определения FireplaceBase.c:197
ref Timer m_HeatingTimer
value for calculating of wetness that fireplace gain when raining
Определения FireplaceBase.c:92
override bool DisassembleOnLastDetach()
Определения FireplaceBase.c:2719
void ParticleNormalFireStart()
Определения FireplaceBase.c:1160
const float FUEL_BURN_RATE_STONES
Определения FireplaceBase.c:67
bool HasStoneCircle()
Определения FireplaceBase.c:1647
ATTACHMENT_COOKINGSTAND
Определения FireplaceBase.c:198
void SetStoneCircleState(bool has_stonecircle)
Определения FireplaceBase.c:1681
ref UniversalTemperatureSourceLambdaFireplace m_UTSLFireplace
Определения FireplaceBase.c:221
static bool IsRainingAboveEntity(notnull EntityAI entity_ai)
Определения FireplaceBase.c:2408
void SetExtinguishingState()
Определения FireplaceBase.c:1721
void StopAllParticlesAndSounds()
Определения FireplaceBase.c:1019
vector GetFireEffectPosition()
Определения FireplaceBase.c:1320
const string ANIMATION_KINDLING
Определения FireplaceBase.c:165
ref UniversalTemperatureSource m_UTSource
Определения FireplaceBase.c:219
const string MESSAGE_IGNITE_TOO_WET
Определения FireplaceBase.c:148
const float PARAM_IGNITE_RAIN_THRESHOLD
minimum fireplace temperature under which the fireplace can be reignited using air only (degree Celsi...
Определения FireplaceBase.c:49
float GetFireConsumableTypeEnergy(ItemBase item)
Определения FireplaceBase.c:1386
void SetTemperatureLossMP(float value)
Определения FireplaceBase.c:2833
void ParticleFireWindyNoIgniteStart()
Определения FireplaceBase.c:1247
bool IsFacingFireplace(PlayerBase player)
DEPRECATED.
Определения FireplaceBase.c:2347
ref map< ItemBase, ref FireConsumable > m_FireConsumables
Определения FireplaceBase.c:143
bool GetCeilingHeight(out float actual_height)
Определения FireplaceBase.c:1291
const float PARAM_COOKING_EQUIP_MAX_TEMP
Определения FireplaceBase.c:2820
int PARTICLE_SMALL_SMOKE
Определения FireplaceBase.c:111
const float PARAM_ITEM_HEAT_TEMP_INCREASE_COEF
DEPRECATED.
Определения FireplaceBase.c:2813
float m_TemperatureLossMP
value for calculating of wetness that fireplace gain when raining
Определения FireplaceBase.c:2825
FireplaceFireState
Определения FireplaceBase.c:2
@ NO_FIRE
Определения FireplaceBase.c:3
@ SMALL_FIRE
Определения FireplaceBase.c:5
@ EXTINGUISHED_FIRE
Определения FireplaceBase.c:9
@ EXTINGUISHING_FIRE
Определения FireplaceBase.c:8
@ REIGNITED_FIRE
Определения FireplaceBase.c:10
@ END_FIRE
Определения FireplaceBase.c:7
@ NORMAL_FIRE
Определения FireplaceBase.c:6
@ START_FIRE
Определения FireplaceBase.c:4
int GetAttachedStonesCount()
Определения FireplaceBase.c:1659
bool IsOven()
Определения FireplaceBase.c:1643
const float PARAM_WET_INCREASE_COEF
Определения FireplaceBase.c:2823
const string ANIMATION_COOKWARE_HANDLE
Определения FireplaceBase.c:174
ref FireConsumable m_ItemToConsume
Определения FireplaceBase.c:103
const float PARAM_MAX_WET_TO_IGNITE
how much will temperature decrease when fireplace is cooling (degree Celsius per second)
Определения FireplaceBase.c:47
ItemBase m_CookingEquipment
Определения FireplaceBase.c:100
const float IGNITE_WIND_THRESHOLD
Определения FireplaceBase.c:84
float m_TotalEnergy
Определения FireplaceBase.c:212
bool IsSpaceFor(vector size)
Определения FireplaceBase.c:2487
Particle m_ParticleFireEnd
Определения FireplaceBase.c:124
void ClearCookingEquipment()
DEPRECATED.
Определения FireplaceBase.c:604
FireConsumable GetFireConsumableByItem(ItemBase item)
Определения FireplaceBase.c:1418
ItemBase m_SmokingSlots[SMOKING_SLOT_COUNT]
Определения FireplaceBase.c:102
const string ANIMATION_STICKS
Определения FireplaceBase.c:166
void CalcAndSetTotalEnergy()
Определения FireplaceBase.c:2601
const float PARAM_FULL_HEAT_RADIUS
value for calculating damage on items located in fireplace cargo
Определения FireplaceBase.c:55
const string ANIMATION_STONE
Определения FireplaceBase.c:169
void FireplaceBase()
Определения FireplaceBase.c:235
bool IsKindling(ItemBase item)
Returns if item attached to fireplace is kindling.
Определения FireplaceBase.c:1553
FireConsumable SetItemToConsume()
Определения FireplaceBase.c:1426
void SetBurningState(bool is_burning)
Определения FireplaceBase.c:1625
void ParticleWetNoIgniteStop()
Определения FireplaceBase.c:1286
bool IsItemAttachedQuantity(typename item_type, float quantity)
Определения FireplaceBase.c:1595
void SoundFireNoFireStart()
Определения FireplaceBase.c:1345
const float PARAM_COOKING_EQUIP_TEMP_INCREASE
maximum temperature of attached cooking equipment (degree Celsius)
Определения FireplaceBase.c:2821
void ParticleSmallSmokeStop()
Определения FireplaceBase.c:1198
void ParticleFireEndStart()
Определения FireplaceBase.c:1230
bool m_ThawnSurfaceUnderSupport
size of wetness increment (per FP heating tick) added to overall FP wetness when ignited on wet surfa...
Определения FireplaceBase.c:227
bool IsFireplaceIndoor()
Определения FireplaceBase.c:542
bool IsItemTypeAttached(typename item_type)
Определения FireplaceBase.c:1589
void ParticleFireEndStop()
Определения FireplaceBase.c:1242
bool HasLastFuelKindlingAttached()
Определения FireplaceBase.c:1609
override bool IsEmpty()
Определения FireplaceBase.c:2465
int GetFuelCount()
Returns count of all fuel type items (define in 'm_FuelTypes') attached to fireplace.
Определения FireplaceBase.c:1537
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
void ParticleFireStartStop()
Определения FireplaceBase.c:1136
void ParticleSteamEndStop()
Определения FireplaceBase.c:1276
void SetOvenState(bool is_oven)
Определения FireplaceBase.c:1669
const string MESSAGE_BURY_ASHES_FAILED_SURFACE
Определения FireplaceBase.c:157
const float PARAM_WET_HEATING_DECREASE_COEF
maximum wetness value when the fireplace is able to burn
Определения FireplaceBase.c:51
const int MIN_STONES_TO_BUILD_CIRCLE
maximum value for temperature that will be transfered to player (environment)
Определения FireplaceBase.c:60
bool HasLastAttachment()
Определения FireplaceBase.c:1603
const string ANIMATION_BURNT_WOOD
Определения FireplaceBase.c:168
Particle m_ParticleSteamEnd
Определения FireplaceBase.c:125
const string MESSAGE_REIGNITE_NO_KINDLING
Определения FireplaceBase.c:153
const float RAIN_WETNESS_INCREASE
snowfall level that triggers fireplace to start soaking
Определения FireplaceBase.c:88
void SetLightEntity(FireplaceLight light)
Определения FireplaceBase.c:2561
void ParticleSmallFireStop()
Определения FireplaceBase.c:1154
bool CanDismantleOven()
Определения FireplaceBase.c:2535
int PARTICLE_OVEN_FIRE
Определения FireplaceBase.c:110
const float PARAM_COOKING_TEMP_THRESHOLD
cooking
Определения FireplaceBase.c:71
const string SOUND_FIRE_NO_FIRE
Определения FireplaceBase.c:131
int PARTICLE_OVEN_FIRE_END
Определения FireplaceBase.c:114
const float SMOKING_SPEED
Определения FireplaceBase.c:78
void AddDamageToItemByFireEx(ItemBase item, bool can_be_ruined, bool pAttachment)
Определения FireplaceBase.c:2235
int PARTICLE_SMALL_FIRE
Определения FireplaceBase.c:108
const float PARAM_OUTDOOR_FIRE_TEMPERATURE
maximum fireplace temperature of a normal fire (degree Celsius)
Определения FireplaceBase.c:43
const float RAIN_EFFECT_LIMIT
Определения FireplaceBase.c:86
EffectSound m_SoundFire
Определения FireplaceBase.c:137
override bool CanSwapEntities(EntityAI otherItem, InventoryLocation otherDestination, InventoryLocation destination)
Определения FireplaceBase.c:2502
int GetKindlingCount()
Returns count of all kindling type items (define in 'm_KindlingTypes') attached to fireplace.
Определения FireplaceBase.c:1520
int PARTICLE_OVEN_FIRE_START
Определения FireplaceBase.c:107
bool m_HasAshes
Определения FireplaceBase.c:25
void AddWetnessToItem(ItemBase item, float amount)
Определения FireplaceBase.c:2289
Particle m_ParticleNormalSmoke
Определения FireplaceBase.c:123
void AddWetnessToFireplace(float amount)
Определения FireplaceBase.c:2298
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения ItemBase.c:7114
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Set item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
Определения ItemBase.c:8006
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
bool CanHaveWetness()
Определения ItemBase.c:9326
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения ItemBase.c:5983
override bool IsHologram()
Определения ItemBase.c:5753
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения ItemBase.c:7071
override int GetQuantityMax()
Определения ItemBase.c:8106
override float GetWet()
Определения ItemBase.c:8374
class Land_Buoy extends House m_Light
class NoiseSystem NoiseParams()
Определения Noise.c:15
void PlayParticle(int particle_id=-1)
Method to tell the particle to start playing.
Определения ParticleBase.c:96
bool StopParticle(int flags=0)
Method to tell the particle to stop playing.
Определения ParticleBase.c:118
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor)
Определения ParticleManager.c:88
override void OnRPC(ParamsReadContext ctx)
Определения PlayerStatBase.c:69
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
void UnderObjectDecalSpawnComponent(notnull UnderObjectDecalSpawnSettings pSettings, notnull Object pParent)
const int HITZONE
Определения AreaDamageManager.c:4
Deferred version of AreaDamageLooped.
Определения AreaDamageLoopedDeferred.c:3
proto native NoiseSystem GetNoiseSystem()
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto float SurfaceGetType3D(float x, float y, float z, out string type)
Y input: Maximum Y to trace down from; Returns: Y position the surface was found.
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native Object CreateObjectEx(string type, vector pos, int iFlags, int iRotation=RF_DEFAULT)
Creates object of certain type.
proto native Weather GetWeather()
Returns weather controller object.
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
represents base for cargo storage for entities
Определения Cargo.c:7
Определения Cauldron.c:2
Super root of all classes in Enforce script.
Определения EnScript.c:11
static proto bool RaycastRV(vector begPos, vector endPos, out vector contactPos, out vector contactDir, out int contactComponent, set< Object > results=NULL, Object with=NULL, Object ignore=NULL, bool sorted=false, bool ground_only=false, int iType=ObjIntersectView, float radius=0.0, CollisionFlags flags=CollisionFlags.NEARESTCONTACT)
Raycasts world by given parameters.
Определения DayZPhysics.c:124
void MakeSoundsOnClient(bool soundstate, CookingMethodType cookingMethod=CookingMethodType.NONE)
Определения Edible_Base.c:215
Определения Edible_Base.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
Определения Building.c:6
float GetRemainingEnergy()
Определения FireConsumable.c:27
ItemBase GetItem()
Определения FireConsumable.c:15
float GetEnergy()
Определения FireConsumable.c:21
void SetRemainingEnergy(float energy)
Определения FireConsumable.c:32
Определения FireConsumable.c:2
bool IsKindling()
Определения FireConsumableType.c:29
float GetEnergy()
Определения FireConsumableType.c:23
override bool IsOpen()
Определения BarrelHoles_ColorBase.c:428
override bool CanExtinguishFire()
Определения BarrelHoles_ColorBase.c:448
void InitializeTemperatureSources()
Определения BarrelHoles_ColorBase.c:40
override bool CanCookOnStick()
Определения BarrelHoles_ColorBase.c:49
override bool IsBaseFireplace()
Определения BarrelHoles_ColorBase.c:54
override void RefreshFireplacePhysics()
Определения Fireplace.c:487
vector GetSmokeEffectPosition()
Определения OvenIndoor.c:139
override void EEItemAttached(EntityAI item, string slot_name)
Определения BarrelHoles_ColorBase.c:188
override void ParticleSmallSmokeStart()
Определения OvenIndoor.c:145
override bool IsPrepareToDelete()
Определения BarrelHoles_ColorBase.c:237
override void SetCookingEquipment(ItemBase equipment)
Определения Fireplace.c:332
override bool CanShowSmoke()
Определения BarrelHoles_ColorBase.c:459
override void ParticleNormalSmokeStart()
Определения OvenIndoor.c:151
override bool IsIndoorOven()
Определения OvenIndoor.c:159
override void OnDebugSpawn()
Определения BarrelHoles_ColorBase.c:571
override void OnIgnitedThis(EntityAI fire_source)
Определения BarrelHoles_ColorBase.c:499
override void CreateAreaDamage()
Определения BarrelHoles_ColorBase.c:59
override void OnVariablesSynchronized()
Определения BarrelHoles_ColorBase.c:138
override void AfterStoreLoad()
Определения Fireplace.c:530
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BarrelHoles_ColorBase.c:110
override void OnStoreSave(ParamsWriteContext ctx)
Определения BarrelHoles_ColorBase.c:103
override string GetDeploySoundset()
Определения BarrelHoles_ColorBase.c:542
override bool IsBarrelWithHoles()
Определения BarrelHoles_ColorBase.c:133
override bool CanReleaseAttachment(EntityAI attachment)
Определения Fireplace.c:175
Определения FryingPan.c:2
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
script counterpart to engine's class Inventory
Определения Inventory.c:79
Определения ItemBase.c:15
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetType()
returns type of InventoryLocation
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
provides access to slot configuration
Определения InventorySlots.c:6
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
Определения InventoryItem.c:731
Определения EnMath.c:7
static float GetNoiseReduction(Weather weather)
Определения SensesAIEvaluate.c:18
proto void AddNoisePos(EntityAI source_entity, vector pos, NoiseParams noise_params, float external_strenght_multiplier=1.0)
Определения Noise.c:2
Определения ObjectTyped.c:2
Legacy way of using particles in the game.
Определения Particle.c:7
static const int CAMP_NO_IGNITE_WIND
Определения ParticleList.c:38
static const int CAMP_STOVE_FIRE_START
Определения ParticleList.c:36
static const int CAMP_SMALL_SMOKE
Определения ParticleList.c:30
static const int CAMP_STEAM_EXTINGUISH_START
Определения ParticleList.c:34
static const int CAMP_FIRE_START
Определения ParticleList.c:27
static const int CAMP_NORMAL_SMOKE
Определения ParticleList.c:31
static const int CAMP_STOVE_FIRE
Определения ParticleList.c:35
static const int CAMP_STEAM_2END
Определения ParticleList.c:33
static const int CAMP_SMALL_FIRE
Определения ParticleList.c:28
static const int CAMP_FIRE_END
Определения ParticleList.c:32
static const int CAMP_NORMAL_FIRE
Определения ParticleList.c:29
static const int CAMP_STOVE_FIRE_END
Определения ParticleList.c:37
Определения ParticleList.c:12
Определения PlayerBaseClient.c:2
The class that will be instanced (moddable)
Определения gameplay.c:389
Определения Pot.c:2
Определения PunchedCard.c:2
proto void Call(func fn, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
static float GetParamFloat(string surface_name, string param_name)
Определения Surface.c:18
Определения Surface.c:2
Определения DayZPlayerImplement.c:63
original Timer deletes m_params which is unwanted
Определения UniversalTemperatureSource.c:38
proto native float GetWindSpeed()
Returns actual wind speed in metre per second.
proto native float GetWindMaximumSpeed()
Returns maximal wind speed in metre per second.
proto native Rain GetRain()
Returns a rain phenomenon object.
proto native float GetActual()
Определения WoodenStick.c:2
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Определения EnConvert.c:271
static const vector Forward
Определения EnConvert.c:109
static const vector Zero
Определения EnConvert.c:110
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
Определения EnConvert.c:106
Serializer ParamsReadContext
Определения gameplay.c:15
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
ErrorExSeverity
Определения EnDebug.c:62
enum ShapeType ErrorEx
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const float TEMP_COEF_FIREPLACE_COOLING
Определения constants.c:942
const float TEMP_COEF_FIREPLACE_HEATING
Определения constants.c:943
const float FIRE_ATTACHMENT_DAMAGE_PER_SECOND
various damage per second constants
Определения constants.c:799
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int STATE_BADLY_DAMAGED
Определения constants.c:847
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto float Acos(float c)
Returns angle in radians from cosinus.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static proto float InverseLerp(float a, float b, float value)
Calculates the linear value that produces the interpolant value within the range [a,...
const string CFG_VEHICLESPATH
Определения constants.c:220
EmitorParam
Определения EnVisual.c:114
@ WIND
Bool R/W.
Определения EnVisual.c:191
proto native int dBodyGetInteractionLayer(notnull IEntity ent)
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8