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