3 const float PARAM_FULL_HEAT_RADIUS = 0.5;
4 const float PARAM_HEAT_RADIUS = 1.0;
5 const int TIMER_HEATING_UPDATE_INTERVAL = 1;
6 const float PARAM_MAX_TRANSFERED_TEMPERATURE = 5;
7 const float PARAM_DRY_MODIFIER = 1.125;
14 private SoundOnVehicle m_LoopSoundEntity;
16 bool m_CanReceiveUpgrade;
17 bool m_IsBeingDestructed =
false;
19 float m_BurnTimePerRagEx;
20 float m_BurnTimePerFullLardEx;
21 float m_BurnTimePerFullFuelDoseEx;
22 float m_MaxConsumableLardQuantityEx;
23 float m_MaxConsumableFuelQuantityEx;
24 float m_WaterEvaporationByFireIntensityEx = 0.001;
25 int m_StartFadeOutOfLightAtQuantityEx = 3;
27 int m_RagsUpgradedCount;
28 bool m_ConsumeRagFlipFlop;
31 string m_DecraftResult =
"WoodenStick";
41 if(m_RagsUpgradedCount)
49 if ( m_BurnTimePerRagEx == 0 || m_BurnTimePerFullLardEx == 0 || m_MaxConsumableLardQuantityEx == 0 || m_MaxConsumableFuelQuantityEx == 0 )
51 string cfg_path =
"CfgVehicles " +
GetType();
52 m_BurnTimePerRagEx =
g_Game.ConfigGetFloat( cfg_path +
" burnTimePerRag" );
53 m_BurnTimePerFullLardEx =
g_Game.ConfigGetFloat( cfg_path +
" burnTimePerFullLardDose" );
54 m_BurnTimePerFullFuelDoseEx =
g_Game.ConfigGetFloat( cfg_path +
" burnTimePerFullFuelDose" );
55 m_MaxConsumableLardQuantityEx =
g_Game.ConfigGetFloat( cfg_path +
" maxConsumableLardDose" );
56 m_MaxConsumableFuelQuantityEx =
g_Game.ConfigGetFloat( cfg_path +
" maxConsumableFuelDose" );
58 RegisterNetSyncVariableBool(
"m_CanReceiveUpgrade");
69 m_UTSSettings.m_UpdateInterval = TIMER_HEATING_UPDATE_INTERVAL;
71 m_UTSSettings.m_TemperatureCap = PARAM_MAX_TRANSFERED_TEMPERATURE;
84 if (GetHierarchyRoot())
86 return GetHierarchyRoot().GetPosition();
89 return super.GetPosition();
94 super.EEDelete(parent);
95 if ( m_LoopSoundEntity != NULL &&
g_Game != NULL )
97 g_Game.ObjectDelete( m_LoopSoundEntity );
106 if (att && att.IsFullQuantity())
114 if( !super.CanPutInCargo(parent) ) {
return false;}
120 if( !super.CanReleaseAttachment( attachment ) )
122 return !GetCompEM().IsWorking();
132 return !GetCompEM().IsWorking();
138 return !GetCompEM().IsWorking();
143 return GetCompEM().IsWorking();
148 return GetCompEM().IsWorking();
159 if ( !GetCompEM().CheckWetness() )
164 if (rag && GetCompEM().
GetEnergy() < GetCompEM().GetEnergyUsage() * GetCompEM().GetUpdateInterval() )
170 if ( !GetCompEM().CanWork() )
179 if (
this != player.GetItemInHands())
190 float wetness = rag.GetWet();
191 bool is_dry_enough = wetness <= 1-GetCompEM().GetWetnessExposure();
192 return is_dry_enough;
206 if ( !GetCompEM().HasEnoughStoredEnergy() )
211 GetCompEM().SwitchOn();
216 if (!GetCompEM().HasEnoughStoredEnergy())
218 GetCompEM().SwitchOff();
237 m_DecraftResult = type;
246 if (rag.GetQuantity() <= 1)
264 float lard_quant = lard.GetQuantity();
266 float available_lard_quant = lard_quant;
268 if ( available_lard_quant > m_MaxConsumableLardQuantityEx )
269 available_lard_quant = m_MaxConsumableLardQuantityEx;
271 float available_lard_coef = available_lard_quant / m_MaxConsumableLardQuantityEx;
273 float add_energy = m_BurnTimePerFullLardEx * available_lard_coef;
274 float add_energy_coef = 1;
276 float energy_limit = GetCompEM().GetEnergyMax() - GetCompEM().GetEnergy();
278 if (add_energy > energy_limit )
280 add_energy_coef = energy_limit / add_energy;
281 add_energy = energy_limit;
282 available_lard_quant = available_lard_quant * add_energy_coef;
285 GetCompEM().AddEnergy( add_energy );
286 lard.AddQuantity(-available_lard_quant);
302 float torchCurrentEnergy = GetCompEM().GetEnergy();
303 float sourceQuantity = 100000;
307 sourceQuantity = source.GetQuantity();
310 float maxOverallCapacity =
GetRagQuantity() * 2 * m_BurnTimePerRagEx;
312 float currentlyUpgraded =
Math.Max(0, torchCurrentEnergy - (
GetRagQuantity() * m_BurnTimePerRagEx));
314 float freeUpgradeCapacity = maxOverallCapacity - torchCurrentEnergy;
315 float upgradeQuantity =
Math.Min(freeUpgradeCapacity, sourceQuantity);
316 int upgradedRags =
Math.Ceil((upgradeQuantity + currentlyUpgraded) / m_BurnTimePerRagEx);
318 m_RagsUpgradedCount = upgradedRags;
319 GetCompEM().AddEnergy(upgradeQuantity);
320 m_ConsumeRagFlipFlop = 0;
323 source.AddQuantity(-upgradeQuantity);
335 float vessel_quant = vessel.GetQuantity();
337 float available_vessel_quant = vessel_quant;
339 if ( available_vessel_quant > m_MaxConsumableFuelQuantityEx )
340 available_vessel_quant = m_MaxConsumableFuelQuantityEx;
342 float available_vessel_coef = available_vessel_quant / m_MaxConsumableFuelQuantityEx;
344 float add_energy = m_BurnTimePerFullFuelDoseEx * available_vessel_coef;
345 float add_energy_coef = 1;
347 float energy_limit = GetCompEM().GetEnergyMax() - GetCompEM().GetEnergy();
349 if (add_energy > energy_limit )
351 add_energy_coef = energy_limit / add_energy;
352 add_energy = energy_limit;
353 available_vessel_quant = available_vessel_quant * add_energy_coef;
356 GetCompEM().AddEnergy( add_energy );
357 vessel.AddQuantity(-available_vessel_quant);
367 float add_energy = m_BurnTimePerFullFuelDoseEx;
368 float add_energy_coef = 1;
370 float energy_limit = GetCompEM().GetEnergyMax() - GetCompEM().GetEnergy();
372 if (add_energy > energy_limit )
374 add_energy_coef = energy_limit / add_energy;
375 add_energy = energy_limit;
378 GetCompEM().AddEnergy( add_energy );
396 super.OnInventoryExit(player);
406 g_Game.SurfaceGetType ( position[0], position[2], surface_type );
407 bool is_surface_soft =
g_Game.IsSurfaceDigable(surface_type);
409 if ( is_surface_soft && !IsRuined() )
411 vector ori_rotate =
"0 0 0";
412 ori_rotate[0] =
Math.RandomFloat(0, 360);
413 ori_rotate[1] =
Math.RandomFloat(0, 10);
414 SetOrientation(ori_rotate);
432 return m_CanReceiveUpgrade;
437 GetCompEM().SetEnergy(m_BurnTimePerRagEx * quantity);
438 m_CanReceiveUpgrade =
true;
445 super.EEItemAttached( item, slot_name );
453 super.EEItemDetached( item, slot_name );
455 if (m_IsBeingDestructed)
461 MiscGameplayFunctions.TransferItemProperties(item, rags);
482 if ( m_IsBeingDestructed || (player && player.IsPlayerDisconnected()) )
487 m_IsBeingDestructed =
true;
494 player.ServerReplaceItemInHandsWithNew(lambda);
502 if (
GetType() ==
"WoodenStick" )
503 ori = ori +
Vector(0,90,0);
507 stick.SetPosition(pos);
508 stick.PlaceOnSurface();
510 if ( stick.GetType() ==
"LongWoodenStick" )
512 pos = stick.GetPosition() +
Vector(0,-0.3,0);
513 stick.SetPosition(pos);
516 stick.SetOrientation(ori);
517 g_Game.ObjectDelete(
this);
534 m_FireParticle.Stop();
540 return Rag.Cast( GetAttachmentByType(Rag) );
552 else if (!m_RagsUpgradedCount)
554 rag.UnlockFromParent();
564 m_Light.AttachOnObject(
this, m_ParticleLocalPos +
Vector (0,0.2,0));
569 Object direct_particle = m_FireParticle.GetDirectParticleEffect();
571 if (direct_particle && direct_particle != m_Light.GetAttachmentParent())
573 m_Light.AttachOnObject(direct_particle,
Vector(0,0.2,0));
577 float update_interval = GetCompEM().GetUpdateInterval();
579 if (
GetQuantity() <= m_StartFadeOutOfLightAtQuantityEx)
581 float brightness_coef =
GetQuantity() / m_StartFadeOutOfLightAtQuantityEx;
582 float radius_coef =
GetQuantity() / m_StartFadeOutOfLightAtQuantityEx;
584 if (radius_coef < m_StartFadeOutOfLightAtQuantityEx/10)
585 radius_coef = m_StartFadeOutOfLightAtQuantityEx/10;
587 if (brightness_coef < m_StartFadeOutOfLightAtQuantityEx/10)
588 brightness_coef = m_StartFadeOutOfLightAtQuantityEx/10;
590 m_Light.FadeBrightnessTo(m_Light.m_TorchBrightness * brightness_coef, update_interval);
591 m_Light.FadeRadiusTo(m_Light.m_TorchRadius * radius_coef, update_interval);
595 m_Light.FadeBrightnessTo(m_Light.m_TorchBrightness, update_interval);
596 m_Light.FadeRadiusTo(m_Light.m_TorchRadius, update_interval);
602 GetCompEM().SwitchOff();
606 override void OnWork(
float consumed_energy )
613 if (m_RagsUpgradedCount==0)
617 else if (m_ConsumeRagFlipFlop)
620 m_ConsumeRagFlipFlop = !m_ConsumeRagFlipFlop;
624 m_RagsUpgradedCount--;
625 m_ConsumeRagFlipFlop = !m_ConsumeRagFlipFlop;
638 AddWet( -m_WaterEvaporationByFireIntensityEx * GetCompEM().GetUpdateInterval() );
644 rag.AddWet( -m_WaterEvaporationByFireIntensityEx * GetCompEM().GetUpdateInterval() );
648 if ( !m_LoopSoundEntity &&
g_Game && ( !
g_Game.IsDedicatedServer() ) )
654 if ( !
g_Game.IsDedicatedServer() )
682 m_FireParticle.ScaleParticleParamFromOriginal(
EmitorParam.SIZE, scale);
683 m_FireParticle.ScaleParticleParamFromOriginal(
EmitorParam.VELOCITY, scale);
684 m_FireParticle.ScaleParticleParamFromOriginal(
EmitorParam.VELOCITY_RND, scale);
688 if ( !m_FireParticle || m_FireParticle.GetParticleID() !=
ParticleList.TORCH_T2 )
693 m_FireParticle.Stop();
707 if ( m_LoopSoundEntity &&
g_Game && ( !
g_Game.IsDedicatedServer() ) )
709 g_Game.ObjectDelete( m_LoopSoundEntity );
710 m_LoopSoundEntity = NULL;
715 m_FireParticle.Stop();
716 m_FireParticle = NULL;
739 if ( GetCompEM().IsWorking() )
747 if ( GetCompEM().IsWorking() )
755 if ( GetCompEM().IsWorking() )
770 super.OnAttachmentQuantityChangedEx(item, delta);
773 if (delta > 0 || !GetCompEM().IsWorking())
774 GetCompEM().AddEnergy(m_BurnTimePerRagEx * delta);
789 GetInventory().CreateAttachment(
"Rag");
817 if (GetCompEM().IsWorking())
837 super.OnStoreSave(ctx);
844 if (!super.OnStoreLoad(ctx, version))
850 if (!ctx.Read( m_WasLit ))
861 result.SetQuantity(1);
868 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
873 super.GetDebugActions(outputList);
878 if (super.OnAction(action_id, player, ctx))
882 if (action_id ==
EActions.ACTIVATE_ENTITY)
895 debug_output = super.GetDebugText();
897 if(
g_Game.IsDedicatedServer())
899 debug_output+=
"m_RagsUpgradedCount:"+m_RagsUpgradedCount+
"\n";
900 debug_output+=
"m_ConsumeRagFlipFlop:"+m_ConsumeRagFlipFlop+
"\n";
903 debug_output+=
"Burning rag \n";
907 debug_output+=
"Burning lard/fuel \n";
924 static float m_BurnTimePerFullLard;
925 static float m_BurnTimePerFullFuelDose;
926 static float m_MaxConsumableLardQuantity;
927 static float m_MaxConsumableFuelQuantity;
928 static float m_WaterEvaporationByFireIntensity = 0.001;
929 static int m_StartFadeOutOfLightAtQuantity = 3;
938 m_BurnTimePerFullLard = m_BurnTimePerFullLardEx;
939 m_BurnTimePerFullFuelDose = m_BurnTimePerFullFuelDoseEx;
940 m_MaxConsumableLardQuantity = m_MaxConsumableLardQuantityEx;
941 m_MaxConsumableFuelQuantity = m_MaxConsumableFuelQuantityEx;
953 override void OnWasAttached(
EntityAI parent,
int slot_id )
955 super.OnWasAttached(parent, slot_id);
963 super.OnWasDetached(parent, slot_id);
971 super.OnStoreSave(ctx);
972 ctx.Write(m_ConsumeRagFlipFlop);
973 ctx.Write(m_RagsUpgradedCount);
979 if (!super.OnStoreLoad(ctx, version))
986 if (!ctx.Read( m_ConsumeRagFlipFlop ))
991 if (!ctx.Read( m_RagsUpgradedCount ))
996 UpdateCheckForReceivingUpgrade();
1003 override void CopyOldPropertiesToNew (notnull
EntityAI old_item,
EntityAI new_item)
1005 super.CopyOldPropertiesToNew(old_item, new_item);
1009 Class.CastTo(stick, new_item);
1010 if (stick && flammable)
Param4< int, int, string, int > TSelectableActionInfoWithColor
eBleedingSourceType GetType()
ActionLightItemOnFireCB ActionContinuousBaseCB ActionLightItemOnFire()
void AddAction(typename actionName)
const int ECE_PLACE_ON_SURFACE
Super root of all classes in Enforce script.
void ConsumeFuelFromGasStation()
override void OnDebugSpawn()
override bool CanPutInCargo(EntityAI parent)
void ApplyResultModifications(ItemBase result)
bool IsRagDryEnough(ItemBase rag)
override void OnInventoryExit(Man player)
override int GetMeleeMode()
void UpdateCheckForReceivingUpgrade()
void ConsumeLard(Lard lard)
override bool IsIgnited()
override bool CanReleaseAttachment(EntityAI attachment)
bool CanTransformIntoStick()
ref UniversalTemperatureSource m_UTSource
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnIgnitedThis(EntityAI fire_source)
override void SetActions()
void CraftingInit(float quantity)
override void OnWork(float consumed_energy)
override void OnStoreSave(ParamsWriteContext ctx)
override void OnWorkStop()
void TryTransformIntoStick()
override void DeferredInit()
override void EEDelete(EntityAI parent)
void Upgrade(ItemBase source)
override void EEItemDetached(EntityAI item, string slot_name)
void LockRags(bool do_lock)
override bool CanRemoveFromCargo(EntityAI parent)
override void OnSwitchOff()
string GetBurningMaterial()
override bool CanBeIgnitedBy(EntityAI igniter=NULL)
ref UniversalTemperatureSourceLambdaConstant m_UTSLConstant
void SetTorchDecraftResult(string type)
override void OnSwitchOn()
override void OnWorkStart()
override void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
ref UniversalTemperatureSourceSettings m_UTSSettings
override bool DisassembleOnLastDetach()
override vector GetUniversalTemperatureSourcePosition()
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override int GetMeleeSprintMode()
override bool CanIgniteItem(EntityAI ignite_target=NULL)
override int GetMeleeHeavyMode()
override bool CanPutAsAttachment(EntityAI parent)
override void EEItemAttached(EntityAI item, string slot_name)
void ConsumeFuelFromBottle(ItemBase vessel)
override bool HasFlammableMaterial()
override void OnItemInHandsPlayerSwimStart(PlayerBase player)
string GetBurntMaterial()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Legacy way of using particles in the game.
original Timer deletes m_params which is unwanted
Serializer ParamsReadContext
Serializer ParamsWriteContext
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
const int SAT_DEBUG_ACTION
vector GetPosition()
Get the world position of the Effect.
override float GetQuantity()
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
override void AddWet(float value)
void OnStoreSave(ParamsWriteContext ctx)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor).
override void OnWasDetached(EntityAI parent, int slot_id)
FlammableBase m_BurnTimePerRag