Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
8467{
8469 {
8470 return true;
8471 }
8472};
8473
8475{
8476
8477};
8478
8479
8480
8482{
8486
8488
8491
8492
8493
8494
8495
8504
8510
8515
8520
8541 protected bool m_IsResultOfSplit
8542
8544
8549
8550
8551
8553
8557
8558
8559
8561
8564
8565
8566
8572
8573
8581
8584
8585
8587
8588
8590
8591
8596
8597
8602
8604
8605
8607
8608
8610 {
8615
8616 if (!
g_Game.IsDedicatedServer())
8617 {
8619 {
8621
8623 {
8625 }
8626 }
8627
8630 }
8631
8632 m_OldLocation = null;
8633
8635 {
8637 }
8638
8639 if (ConfigIsExisting("headSelectionsToHide"))
8640 {
8643 }
8644
8646 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8647 {
8649 }
8650
8652
8653 m_IsResultOfSplit = false;
8654
8656 }
8657
8659 {
8660 super.InitItemVariables();
8661
8667 m_Count = ConfigGetInt(
"count");
8668
8671
8676
8679
8684
8696
8700
8701
8704 if (ConfigIsExisting("canBeSplit"))
8705 {
8708 }
8709
8711 if (ConfigIsExisting("itemBehaviour"))
8713
8714
8717 RegisterNetSyncVariableInt("m_VarLiquidType");
8718 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8719
8720 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8721 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8722 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8723
8724 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8725 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8726 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8727 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8728
8729 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8730 RegisterNetSyncVariableBool("m_IsTakeable");
8731 RegisterNetSyncVariableBool("m_IsHologram");
8732
8735 {
8738 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8739 }
8740
8742
8744 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8746
8748 }
8749
8751 {
8753 }
8754
8756 {
8759 {
8764 }
8765 }
8766
8767 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8768 {
8770 {
8773 }
8774
8776 }
8777
8779 {
8785 }
8786
8788
8790 {
8792
8793 if (!action)
8794 {
8795 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8796 return;
8797 }
8798
8800 if (!ai)
8801 {
8803 return;
8804 }
8805
8807 if (!action_array)
8808 {
8809 action_array = new array<ActionBase_Basic>;
8811 }
8812 if (LogManager.IsActionLogEnable())
8813 {
8814 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8815 }
8816
8817 if (action_array.Find(action) != -1)
8818 {
8819 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8820 }
8821 else
8822 {
8823 action_array.Insert(action);
8824 }
8825 }
8826
8828 {
8829 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8830 ActionBase action = player.GetActionManager().GetAction(actionName);
8833
8834 if (action_array)
8835 {
8836 action_array.RemoveItem(action);
8837 }
8838 }
8839
8840
8841
8843 {
8844 ActionOverrideData overrideData = new ActionOverrideData();
8848
8850 if (!actionMap)
8851 {
8854 }
8855
8856 actionMap.Insert(this.
Type(), overrideData);
8857
8858 }
8859
8861
8863
8864
8866 {
8869
8872
8873 string config_to_search = "CfgVehicles";
8874 string muzzle_owner_config;
8875
8877 {
8878 if (IsInherited(Weapon))
8879 config_to_search = "CfgWeapons";
8880
8881 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8882
8883 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8884
8885 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8886
8887 if (config_OnFire_subclass_count > 0)
8888 {
8889 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8890
8891 for (int i = 0; i < config_OnFire_subclass_count; i++)
8892 {
8893 string particle_class = "";
8894 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8895 string config_OnFire_entry = config_OnFire_class + particle_class;
8896 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8897 WPOF_array.Insert(WPOF);
8898 }
8899
8900
8902 }
8903 }
8904
8906 {
8907 config_to_search = "CfgWeapons";
8908 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8909
8910 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8911
8912 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8913
8914 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8915 {
8916 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8917
8918 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8919 {
8920 string particle_class2 = "";
8921 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8922 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8923 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8924 WPOBE_array.Insert(WPOBE);
8925 }
8926
8927
8929 }
8930 }
8931 }
8932
8933
8935 {
8938
8940 {
8941 string config_to_search = "CfgVehicles";
8942
8943 if (IsInherited(Weapon))
8944 config_to_search = "CfgWeapons";
8945
8946 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8947 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8948
8949 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8950 {
8951
8953
8955 {
8957 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8959 return;
8960 }
8961
8964
8965
8966
8967 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8968 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8969
8970 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8971 {
8972 string particle_class = "";
8973 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8974 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8975 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8976
8977 if (entry_type == CT_CLASS)
8978 {
8979 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8980 WPOOH_array.Insert(WPOF);
8981 }
8982 }
8983
8984
8986 }
8987 }
8988 }
8989
8991 {
8993 }
8994
8996 {
8998 {
9000
9003
9006
9007 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9008 }
9009 }
9010
9012 {
9014 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9015
9017 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9018
9020 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9021
9023 {
9025 }
9026 }
9027
9029 {
9031 }
9032
9034 {
9037 else
9039
9041 {
9044 }
9045 else
9046 {
9049
9052 }
9053
9055 }
9056
9058 {
9060 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9061 }
9062
9064 {
9066 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9068 }
9069
9071 {
9073 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9074 }
9075
9077 {
9080
9081 OverheatingParticle OP = new OverheatingParticle();
9086
9088 }
9089
9091 {
9094
9095 return -1;
9096 }
9097
9099 {
9101 {
9104
9105 for (int i = count; i > 0; --i)
9106 {
9107 int id = i - 1;
9110
9113
9114 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9115 {
9116 if (p)
9117 {
9120 }
9121 }
9122 }
9123 }
9124 }
9125
9127 {
9129 {
9131 {
9132 int id = i - 1;
9134
9135 if (OP)
9136 {
9138
9139 if (p)
9140 {
9142 }
9143
9144 delete OP;
9145 }
9146 }
9147
9150 }
9151 }
9152
9155 {
9156 return 0.0;
9157 }
9158
9159
9161 {
9162 return 250;
9163 }
9164
9166 {
9167 return 0;
9168 }
9169
9172 {
9174 return true;
9175
9176 return false;
9177 }
9178
9181 {
9184
9186 {
9188 }
9189 else
9190 {
9191
9193 }
9194
9196 }
9197
9204 {
9205 return -1;
9206 }
9207
9208
9209
9210
9212 {
9214 {
9215 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9216 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9217
9218 if (r_index >= 0)
9219 {
9220 InventoryLocation r_il = new InventoryLocation;
9221 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9222
9223 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9226 {
9227 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9228 }
9230 {
9231 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9232 }
9233
9234 }
9235
9236 player.GetHumanInventory().ClearUserReservedLocation(this);
9237 }
9238
9241 }
9242
9243
9244
9245
9247 {
9248 return ItemBase.m_DebugActionsMask;
9249 }
9250
9252 {
9253 return ItemBase.m_DebugActionsMask & mask;
9254 }
9255
9257 {
9258 ItemBase.m_DebugActionsMask = mask;
9259 }
9260
9262 {
9263 ItemBase.m_DebugActionsMask |= mask;
9264 }
9265
9267 {
9268 ItemBase.m_DebugActionsMask &= ~mask;
9269 }
9270
9272 {
9274 {
9276 }
9277 else
9278 {
9280 }
9281 }
9282
9283
9285 {
9286 if (GetEconomyProfile())
9287 {
9288 float q_max = GetEconomyProfile().GetQuantityMax();
9289 if (q_max > 0)
9290 {
9291 float q_min = GetEconomyProfile().GetQuantityMin();
9292 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9293
9295 {
9296 ComponentEnergyManager comp = GetCompEM();
9298 {
9300 }
9301 }
9303 {
9305
9306 }
9307
9308 }
9309 }
9310 }
9311
9314 {
9315 EntityAI parent = GetHierarchyParent();
9316
9317 if (parent)
9318 {
9319 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9320 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9321 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9322 }
9323 }
9324
9327 {
9328 EntityAI parent = GetHierarchyParent();
9329
9330 if (parent)
9331 {
9332 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9333 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9334 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9335 }
9336 }
9337
9339 {
9340
9341
9342
9343
9345
9347 {
9348 if (ScriptInputUserData.CanStoreInputUserData())
9349 {
9350 ScriptInputUserData ctx = new ScriptInputUserData;
9356 ctx.
Write(use_stack_max);
9359
9361 {
9362 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9363 }
9364 }
9365 }
9366 else if (!
g_Game.IsMultiplayer())
9367 {
9369 }
9370 }
9371
9373 {
9375 }
9376
9378 {
9380 }
9381
9383 {
9385 }
9386
9388 {
9389
9390 return false;
9391 }
9392
9394 {
9395 return false;
9396 }
9397
9401 {
9402 return false;
9403 }
9404
9406 {
9407 return "";
9408 }
9409
9411
9413 {
9414 return false;
9415 }
9416
9418 {
9419 return true;
9420 }
9421
9422
9423
9425 {
9426 return true;
9427 }
9428
9430 {
9431 return true;
9432 }
9433
9435 {
9436 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9438 }
9439
9441 {
9443 }
9444
9446 {
9448 if (!is_being_placed)
9450 SetSynchDirty();
9451 }
9452
9453
9455
9457 {
9459 }
9460
9462 {
9464 }
9465
9467 {
9468 return 1;
9469 }
9470
9472 {
9473 return false;
9474 }
9475
9477 {
9479 SetSynchDirty();
9480 }
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9517 {
9518 super.OnMovedInsideCargo(container);
9519
9520 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9521 }
9522
9523 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9524 {
9525 super.EEItemLocationChanged(oldLoc, newLoc);
9526
9527 PlayerBase newPlayer = null;
9528 PlayerBase oldPlayer = null;
9529
9530 if (newLoc.GetParent())
9531 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9532
9533 if (oldLoc.GetParent())
9534 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9535
9537 {
9538 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9539
9540 if (rIndex >= 0)
9541 {
9542 InventoryLocation rIl = new InventoryLocation;
9543 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9544
9545 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9548 {
9549 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9550 }
9552 {
9554 }
9555
9556 }
9557 }
9558
9560 {
9561 if (newPlayer)
9562 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9563
9564 if (newPlayer == oldPlayer)
9565 {
9566 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9567 {
9569 {
9570 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9571 {
9572 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9573 }
9574 }
9575 else
9576 {
9577 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9578 }
9579 }
9580
9581 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9582 {
9583 int type = oldLoc.GetType();
9585 {
9586 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9587 }
9589 {
9590 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9591 }
9592 }
9593 if (!m_OldLocation)
9594 {
9595 m_OldLocation = new InventoryLocation;
9596 }
9597 m_OldLocation.Copy(oldLoc);
9598 }
9599 else
9600 {
9601 if (m_OldLocation)
9602 {
9603 m_OldLocation.Reset();
9604 }
9605 }
9606
9607 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9608 }
9609 else
9610 {
9611 if (newPlayer)
9612 {
9613 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9614 if (resIndex >= 0)
9615 {
9616 InventoryLocation il = new InventoryLocation;
9617 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9619 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9622 {
9623 il.
GetParent().GetOnReleaseLock().Invoke(it);
9624 }
9626 {
9628 }
9629
9630 }
9631 }
9633 {
9634
9636 }
9637
9638 if (m_OldLocation)
9639 {
9640 m_OldLocation.Reset();
9641 }
9642 }
9643
9645 {
9646 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9647 }
9648
9650 {
9651 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9652 }
9653 }
9654
9655 override void EOnContact(IEntity other, Contact extra)
9656 {
9658 {
9659 int liquidType = -1;
9661 if (impactSpeed > 0.0)
9662 {
9664 #ifndef SERVER
9666 #else
9668 SetSynchDirty();
9669 #endif
9671 }
9672 }
9673
9674 #ifdef SERVER
9675 if (GetCompEM() && GetCompEM().IsPlugged())
9676 {
9677 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9678 GetCompEM().UnplugThis();
9679 }
9680 #endif
9681 }
9682
9684
9686 {
9688 }
9689
9691 {
9692
9693 }
9694
9696 {
9697 super.OnItemLocationChanged(old_owner, new_owner);
9698
9699 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9700 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9701
9702 if (!relatedPlayer && playerNew)
9703 relatedPlayer = playerNew;
9704
9705 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9706 {
9708 if (actionMgr)
9709 {
9710 ActionBase currentAction = actionMgr.GetRunningAction();
9711 if (currentAction)
9713 }
9714 }
9715
9716 Man ownerPlayerOld = null;
9717 Man ownerPlayerNew = null;
9718
9719 if (old_owner)
9720 {
9721 if (old_owner.
IsMan())
9722 {
9723 ownerPlayerOld = Man.Cast(old_owner);
9724 }
9725 else
9726 {
9727 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9728 }
9729 }
9730 else
9731 {
9733 {
9735
9736 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9737 {
9738 GetCompEM().UnplugThis();
9739 }
9740 }
9741 }
9742
9743 if (new_owner)
9744 {
9745 if (new_owner.
IsMan())
9746 {
9747 ownerPlayerNew = Man.Cast(new_owner);
9748 }
9749 else
9750 {
9751 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9752 }
9753 }
9754
9755 if (ownerPlayerOld != ownerPlayerNew)
9756 {
9757 if (ownerPlayerOld)
9758 {
9759 array<EntityAI> subItemsExit = new array<EntityAI>;
9761 for (int i = 0; i < subItemsExit.Count(); i++)
9762 {
9765 }
9766 }
9767
9768 if (ownerPlayerNew)
9769 {
9770 array<EntityAI> subItemsEnter = new array<EntityAI>;
9772 for (int j = 0; j < subItemsEnter.Count(); j++)
9773 {
9776 }
9777 }
9778 }
9779 else if (ownerPlayerNew != null)
9780 {
9781 PlayerBase nplayer;
9782 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9783 {
9784 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9786 for (int k = 0; k < subItemsUpdate.Count(); k++)
9787 {
9789 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9790 }
9791 }
9792 }
9793
9794 if (old_owner)
9795 old_owner.OnChildItemRemoved(this);
9796 if (new_owner)
9797 new_owner.OnChildItemReceived(this);
9798 }
9799
9800
9802 {
9803 super.EEDelete(parent);
9804 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9805 if (player)
9806 {
9808
9809 if (player.IsAlive())
9810 {
9811 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9812 if (r_index >= 0)
9813 {
9814 InventoryLocation r_il = new InventoryLocation;
9815 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9816
9817 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9820 {
9821 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9822 }
9824 {
9825 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9826 }
9827
9828 }
9829
9830 player.RemoveQuickBarEntityShortcut(this);
9831 }
9832 }
9833 }
9834
9836 {
9837 super.EEKilled(killer);
9838
9841 {
9842 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9843 {
9844 if (IsMagazine())
9845 {
9846 if (Magazine.Cast(this).GetAmmoCount() > 0)
9847 {
9849 }
9850 }
9851 else
9852 {
9854 }
9855 }
9856 }
9857 }
9858
9860 {
9861 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9862
9863 super.OnWasAttached(parent, slot_id);
9864
9867
9870 }
9871
9873 {
9874 super.OnWasDetached(parent, slot_id);
9875
9878
9881 }
9882
9884 {
9885 int idx;
9888
9889 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9890 if (inventory_slots.Count() < 1)
9891 {
9892 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9893 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9894 }
9895 else
9896 {
9897 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9898 }
9899
9900 idx = inventory_slots.Find(slot);
9901 if (idx < 0)
9902 return "";
9903
9904 return attach_types.Get(idx);
9905 }
9906
9908 {
9909 int idx = -1;
9910 string slot;
9911
9914
9915 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9916 if (inventory_slots.Count() < 1)
9917 {
9918 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9919 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9920 }
9921 else
9922 {
9923 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9924 if (detach_types.Count() < 1)
9925 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9926 }
9927
9928 for (int i = 0; i < inventory_slots.Count(); i++)
9929 {
9930 slot = inventory_slots.Get(i);
9931 }
9932
9933 if (slot != "")
9934 {
9935 if (detach_types.Count() == 1)
9936 idx = 0;
9937 else
9938 idx = inventory_slots.Find(slot);
9939 }
9940 if (idx < 0)
9941 return "";
9942
9943 return detach_types.Get(idx);
9944 }
9945
9947 {
9948
9950
9951
9952 float min_time = 1;
9953 float max_time = 3;
9954 float delay = Math.RandomFloat(min_time, max_time);
9955
9956 explode_timer.Run(delay, this, "DoAmmoExplosion");
9957 }
9958
9960 {
9961 Magazine magazine = Magazine.Cast(this);
9962 int pop_sounds_count = 6;
9963 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9964
9965
9966 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9967 string sound_name = pop_sounds[ sound_idx ];
9968 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9969
9970
9971 magazine.ServerAddAmmoCount(-1);
9972
9973
9974 float min_temp_to_explode = 100;
9975
9976 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9977 {
9979 }
9980 }
9981
9982
9983 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9984 {
9985 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9986
9987 const int CHANCE_DAMAGE_CARGO = 4;
9988 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9989 const int CHANCE_DAMAGE_NOTHING = 2;
9990
9992 {
9993 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9994 int chances;
9995 int rnd;
9996
9997 if (GetInventory().GetCargo())
9998 {
9999 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10000 rnd = Math.RandomInt(0,chances);
10001
10002 if (rnd < CHANCE_DAMAGE_CARGO)
10003 {
10005 }
10006 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10007 {
10009 }
10010 }
10011 else
10012 {
10013 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10014 rnd = Math.RandomInt(0,chances);
10015
10016 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10017 {
10019 }
10020 }
10021 }
10022 }
10023
10025 {
10026 CargoBase cargo = GetInventory().GetCargo();
10027 if (cargo)
10028 {
10030 if (item_count > 0)
10031 {
10032 int random_pick = Math.RandomInt(0, item_count);
10034 if (!item.IsExplosive())
10035 {
10036 item.AddHealth("","",damage);
10037 return true;
10038 }
10039 }
10040 }
10041 return false;
10042 }
10043
10045 {
10046 GameInventory inventory = GetInventory();
10048 if (attachment_count > 0)
10049 {
10050 int random_pick = Math.RandomInt(0, attachment_count);
10052 if (!attachment.IsExplosive())
10053 {
10054 attachment.AddHealth("","",damage);
10055 return true;
10056 }
10057 }
10058 return false;
10059 }
10060
10062 {
10064 }
10065
10067 {
10069 return GetInventory().CanRemoveEntity();
10070
10071 return false;
10072 }
10073
10075 {
10076
10078 return false;
10079
10080
10082 return false;
10083
10084
10085
10087 if (delta == 0)
10088 return false;
10089
10090
10091 return true;
10092 }
10093
10095 {
10097 {
10098 if (ScriptInputUserData.CanStoreInputUserData())
10099 {
10100 ScriptInputUserData ctx = new ScriptInputUserData;
10105 ctx.
Write(destination_entity);
10107 ctx.
Write(slot_id);
10109 }
10110 }
10111 else if (!
g_Game.IsMultiplayer())
10112 {
10114 }
10115 }
10116
10118 {
10119 float split_quantity_new;
10123 InventoryLocation loc = new InventoryLocation;
10124
10125 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10126 {
10128 split_quantity_new = stack_max;
10129 else
10131
10133 {
10134 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10135 if (new_item)
10136 {
10137 new_item.SetResultOfSplit(true);
10138 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10140 new_item.
SetQuantity(split_quantity_new,
false,
true);
10141 }
10142 }
10143 }
10144 else if (destination_entity && slot_id == -1)
10145 {
10146 if (quantity > stack_max)
10147 split_quantity_new = stack_max;
10148 else
10149 split_quantity_new = quantity;
10150
10152 {
10153 GameInventory destinationInventory = destination_entity.GetInventory();
10155 {
10158 }
10159
10160 if (new_item)
10161 {
10162 new_item.SetResultOfSplit(true);
10163 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10165 new_item.
SetQuantity(split_quantity_new,
false,
true);
10166 }
10167 }
10168 }
10169 else
10170 {
10171 if (stack_max != 0)
10172 {
10174 {
10176 }
10177
10178 if (split_quantity_new == 0)
10179 {
10180 if (!
g_Game.IsMultiplayer())
10181 player.PhysicalPredictiveDropItem(this);
10182 else
10183 player.ServerDropEntity(this);
10184 return;
10185 }
10186
10188 {
10190
10191 if (new_item)
10192 {
10193 new_item.SetResultOfSplit(true);
10194 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10197 new_item.PlaceOnSurface();
10198 }
10199 }
10200 }
10201 }
10202 }
10203
10205 {
10206 float split_quantity_new;
10210 InventoryLocation loc = new InventoryLocation;
10211
10212 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10213 {
10215 split_quantity_new = stack_max;
10216 else
10218
10220 {
10221 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10222 if (new_item)
10223 {
10224 new_item.SetResultOfSplit(true);
10225 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10227 new_item.
SetQuantity(split_quantity_new,
false,
true);
10228 }
10229 }
10230 }
10231 else if (destination_entity && slot_id == -1)
10232 {
10233 if (quantity > stack_max)
10234 split_quantity_new = stack_max;
10235 else
10236 split_quantity_new = quantity;
10237
10239 {
10240 GameInventory destinationInventory = destination_entity.GetInventory();
10242 {
10245 }
10246
10247 if (new_item)
10248 {
10249 new_item.SetResultOfSplit(true);
10250 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10252 new_item.
SetQuantity(split_quantity_new,
false,
true);
10253 }
10254 }
10255 }
10256 else
10257 {
10258 if (stack_max != 0)
10259 {
10261 {
10263 }
10264
10266 {
10268
10269 if (new_item)
10270 {
10271 new_item.SetResultOfSplit(true);
10272 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10275 new_item.PlaceOnSurface();
10276 }
10277 }
10278 }
10279 }
10280 }
10281
10283 {
10285 {
10286 if (ScriptInputUserData.CanStoreInputUserData())
10287 {
10288 ScriptInputUserData ctx = new ScriptInputUserData;
10293 dst.WriteToContext(ctx);
10295 }
10296 }
10297 else if (!
g_Game.IsMultiplayer())
10298 {
10300 }
10301 }
10302
10304 {
10306 {
10307 if (ScriptInputUserData.CanStoreInputUserData())
10308 {
10309 ScriptInputUserData ctx = new ScriptInputUserData;
10314 ctx.
Write(destination_entity);
10320 }
10321 }
10322 else if (!
g_Game.IsMultiplayer())
10323 {
10325 }
10326 }
10327
10329 {
10331 }
10332
10334 {
10336 float split_quantity_new;
10338 if (dst.IsValid())
10339 {
10340 int slot_id = dst.GetSlot();
10342
10343 if (quantity > stack_max)
10344 split_quantity_new = stack_max;
10345 else
10346 split_quantity_new = quantity;
10347
10349 {
10351
10352 if (new_item)
10353 {
10354 new_item.SetResultOfSplit(true);
10355 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10357 new_item.
SetQuantity(split_quantity_new,
false,
true);
10358 }
10359
10360 return new_item;
10361 }
10362 }
10363
10364 return null;
10365 }
10366
10368 {
10370 float split_quantity_new;
10372 if (destination_entity)
10373 {
10375 if (quantity > stackable)
10376 split_quantity_new = stackable;
10377 else
10378 split_quantity_new = quantity;
10379
10381 {
10382 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10383 if (new_item)
10384 {
10385 new_item.SetResultOfSplit(true);
10386 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10388 new_item.
SetQuantity(split_quantity_new,
false,
true);
10389 }
10390 }
10391 }
10392 }
10393
10395 {
10397 {
10398 if (ScriptInputUserData.CanStoreInputUserData())
10399 {
10400 ScriptInputUserData ctx = new ScriptInputUserData;
10405 ItemBase destination_entity =
this;
10406 ctx.
Write(destination_entity);
10410 }
10411 }
10412 else if (!
g_Game.IsMultiplayer())
10413 {
10415 }
10416 }
10417
10419 {
10421 float split_quantity_new;
10423 if (player)
10424 {
10426 if (quantity > stackable)
10427 split_quantity_new = stackable;
10428 else
10429 split_quantity_new = quantity;
10430
10432 {
10433 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10434 new_item =
ItemBase.Cast(in_hands);
10435 if (new_item)
10436 {
10437 new_item.SetResultOfSplit(true);
10438 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10440 new_item.SetQuantity(split_quantity_new, false, true);
10441 }
10442 }
10443 }
10444 }
10445
10447 {
10449 float split_quantity_new = Math.Floor(quantity * 0.5);
10450
10452 return;
10453
10455
10456 if (new_item)
10457 {
10458 if (new_item.GetQuantityMax() < split_quantity_new)
10459 {
10460 split_quantity_new = new_item.GetQuantityMax();
10461 }
10462
10463 new_item.SetResultOfSplit(true);
10464 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10465
10467 {
10470 }
10471 else
10472 {
10474 new_item.
SetQuantity(split_quantity_new,
false,
true);
10475 }
10476 }
10477 }
10478
10480 {
10482 float split_quantity_new = Math.Floor(quantity / 2);
10483
10485 return;
10486
10487 InventoryLocation invloc = new InventoryLocation;
10489
10491 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10492
10493 if (new_item)
10494 {
10495 if (new_item.GetQuantityMax() < split_quantity_new)
10496 {
10497 split_quantity_new = new_item.GetQuantityMax();
10498 }
10500 {
10503 }
10504 else if (split_quantity_new > 1)
10505 {
10507 new_item.
SetQuantity(split_quantity_new,
false,
true);
10508 }
10509 }
10510 }
10511
10514 {
10515 SetWeightDirty();
10517
10518 if (parent)
10519 parent.OnAttachmentQuantityChangedEx(this, delta);
10520
10522 {
10524 {
10526 }
10528 {
10529 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10531 }
10532 }
10533 }
10534
10537 {
10538
10539 }
10540
10543 {
10545 }
10546
10548 {
10549 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10550
10552 {
10553 if (newLevel == GameConstants.STATE_RUINED)
10554 {
10556 EntityAI parent = GetHierarchyParent();
10557 if (parent && parent.IsFireplace())
10558 {
10559 CargoBase cargo = GetInventory().GetCargo();
10560 if (cargo)
10561 {
10563 {
10565 }
10566 }
10567 }
10568 }
10569
10571 {
10572
10574 return;
10575 }
10576
10577 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10578 {
10580 }
10581 }
10582 }
10583
10584
10586 {
10587 super.OnRightClick();
10588
10590 {
10592 {
10593 if (ScriptInputUserData.CanStoreInputUserData())
10594 {
10595 EntityAI root = GetHierarchyRoot();
10596 Man playerOwner = GetHierarchyRootPlayer();
10597 InventoryLocation dst = new InventoryLocation;
10598
10599
10600 if (!playerOwner && root && root == this)
10601 {
10603 }
10604 else
10605 {
10606
10607 GetInventory().GetCurrentInventoryLocation(dst);
10609 {
10610 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10612 {
10614 }
10615 else
10616 {
10618
10619
10620 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10621 {
10623 }
10624 else
10625 {
10626 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10627 }
10628 }
10629 }
10630 }
10631
10632 ScriptInputUserData ctx = new ScriptInputUserData;
10640 }
10641 }
10642 else if (!
g_Game.IsMultiplayer())
10643 {
10645 }
10646 }
10647 }
10648
10650 {
10651 if (root)
10652 {
10653 vector m4[4];
10654 root.GetTransform(m4);
10655 dst.SetGround(this, m4);
10656 }
10657 else
10658 {
10659 GetInventory().GetCurrentInventoryLocation(dst);
10660 }
10661 }
10662
10663 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10664 {
10665
10666 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10667 return false;
10668
10669 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10670 return false;
10671
10672
10674 return false;
10675
10676
10677 Magazine mag = Magazine.Cast(this);
10678 if (mag)
10679 {
10680 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10681 return false;
10682
10683 if (stack_max_limit)
10684 {
10685 Magazine other_mag = Magazine.Cast(other_item);
10686 if (other_item)
10687 {
10688 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10689 return false;
10690 }
10691
10692 }
10693 }
10694 else
10695 {
10696
10698 return false;
10699
10701 return false;
10702 }
10703
10704 PlayerBase player = null;
10705 if (CastTo(player, GetHierarchyRootPlayer()))
10706 {
10707 if (player.GetInventory().HasAttachment(this))
10708 return false;
10709
10710 if (player.IsItemsToDelete())
10711 return false;
10712 }
10713
10714 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10715 return false;
10716
10717 int slotID;
10719 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10720 return false;
10721
10722 return true;
10723 }
10724
10726 {
10728 }
10729
10731 {
10732 return m_IsResultOfSplit;
10733 }
10734
10736 {
10737 m_IsResultOfSplit = value;
10738 }
10739
10741 {
10743 }
10744
10746 {
10747 float other_item_quantity = other_item.GetQuantity();
10748 float this_free_space;
10749
10751
10753
10754 if (other_item_quantity > this_free_space)
10755 {
10756 return this_free_space;
10757 }
10758 else
10759 {
10760 return other_item_quantity;
10761 }
10762 }
10763
10765 {
10767 }
10768
10770 {
10772 return;
10773
10774 if (!IsMagazine() && other_item)
10775 {
10777 if (quantity_used != 0)
10778 {
10779 float hp1 = GetHealth01("","");
10780 float hp2 = other_item.GetHealth01("","");
10781 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10782 hpResult = hpResult / (
GetQuantity() + quantity_used);
10783
10784 hpResult *= GetMaxHealth();
10785 Math.Round(hpResult);
10786 SetHealth("", "Health", hpResult);
10787
10789 other_item.AddQuantity(-quantity_used);
10790 }
10791 }
10793 }
10794
10796 {
10797 #ifdef SERVER
10798 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10799 GetHierarchyParent().IncreaseLifetimeUp();
10800 #endif
10801 };
10802
10804 {
10805 PlayerBase p = PlayerBase.Cast(player);
10806
10807 array<int> recipesIds = p.m_Recipes;
10808 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10809 if (moduleRecipesManager)
10810 {
10811 EntityAI itemInHands = player.GetEntityInHands();
10812 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10813 }
10814
10815 for (int i = 0;i < recipesIds.Count(); i++)
10816 {
10817 int key = recipesIds.Get(i);
10818 string recipeName = moduleRecipesManager.GetRecipeName(key);
10820 }
10821 }
10822
10823
10824 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10825 {
10826 super.GetDebugActions(outputList);
10827
10828
10834
10835
10840
10845
10846
10850
10851
10853 {
10857 }
10858
10861
10862
10866
10868
10869 InventoryLocation loc = new InventoryLocation();
10870 GetInventory().GetCurrentInventoryLocation(loc);
10872 {
10873 if (Gizmo_IsSupported())
10876 }
10877
10879 }
10880
10881
10882
10883
10885 {
10886 super.OnAction(action_id, player, ctx);
10887
10889 {
10890 switch (action_id)
10891 {
10895 return true;
10899 return true;
10900 }
10901 }
10902
10904 {
10905 switch (action_id)
10906 {
10908 Delete();
10909 return true;
10910 }
10911 }
10912
10913 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10914 {
10915 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10916 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10917 PlayerBase p = PlayerBase.Cast(player);
10918 if (
EActions.RECIPES_RANGE_START < 1000)
10919 {
10920 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10921 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10922 }
10923 }
10924 #ifndef SERVER
10925 else if (action_id ==
EActions.WATCH_PLAYER)
10926 {
10927 PluginDeveloper.SetDeveloperItemClientEx(player);
10928 }
10929 #endif
10931 {
10932 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10933 {
10934 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10935 OnDebugButtonPressServer(id + 1);
10936 }
10937
10938 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10939 {
10940 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10942 }
10943
10944 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10945 {
10946 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10948 }
10949
10950 else if (action_id ==
EActions.ADD_QUANTITY)
10951 {
10952 if (IsMagazine())
10953 {
10954 Magazine mag = Magazine.Cast(this);
10955 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10956 }
10957 else
10958 {
10960 }
10961
10962 if (m_EM)
10963 {
10964 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10965 }
10966
10967 }
10968
10969 else if (action_id ==
EActions.REMOVE_QUANTITY)
10970 {
10971 if (IsMagazine())
10972 {
10973 Magazine mag2 = Magazine.Cast(this);
10974 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10975 }
10976 else
10977 {
10979 }
10980 if (m_EM)
10981 {
10982 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10983 }
10984
10985 }
10986
10987 else if (action_id ==
EActions.SET_QUANTITY_0)
10988 {
10990
10991 if (m_EM)
10992 {
10993 m_EM.SetEnergy(0);
10994 }
10995 }
10996
10997 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10998 {
11000
11001 if (m_EM)
11002 {
11003 m_EM.SetEnergy(m_EM.GetEnergyMax());
11004 }
11005 }
11006
11007 else if (action_id ==
EActions.ADD_HEALTH)
11008 {
11009 AddHealth("","",GetMaxHealth("","Health")/5);
11010 }
11011 else if (action_id ==
EActions.REMOVE_HEALTH)
11012 {
11013 AddHealth("","",-GetMaxHealth("","Health")/5);
11014 }
11015 else if (action_id ==
EActions.DESTROY_HEALTH)
11016 {
11017 SetHealth01("","",0);
11018 }
11019 else if (action_id ==
EActions.WATCH_ITEM)
11020 {
11022 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11023 #ifdef DEVELOPER
11024 SetDebugDeveloper_item(this);
11025 #endif
11026 }
11027
11028 else if (action_id ==
EActions.ADD_TEMPERATURE)
11029 {
11030 AddTemperature(20);
11031
11032 }
11033
11034 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11035 {
11036 AddTemperature(-20);
11037
11038 }
11039
11040 else if (action_id ==
EActions.FLIP_FROZEN)
11041 {
11042 SetFrozen(!GetIsFrozen());
11043
11044 }
11045
11046 else if (action_id ==
EActions.ADD_WETNESS)
11047 {
11049
11050 }
11051
11052 else if (action_id ==
EActions.REMOVE_WETNESS)
11053 {
11055
11056 }
11057
11058 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11059 {
11062
11063
11064 }
11065
11066 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11067 {
11070 }
11071
11072 else if (action_id ==
EActions.MAKE_SPECIAL)
11073 {
11074 auto debugParams = DebugSpawnParams.WithPlayer(player);
11075 OnDebugSpawnEx(debugParams);
11076 }
11077
11078 }
11079
11080
11081 return false;
11082 }
11083
11084
11085
11086
11090
11093
11094
11095
11097 {
11098 return false;
11099 }
11100
11101
11103 {
11104 return true;
11105 }
11106
11107
11109 {
11110 return true;
11111 }
11112
11113
11114
11116 {
11117 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11118 return g_Game.ConfigIsExisting(config_path);
11119 }
11120
11123 {
11124 return null;
11125 }
11126
11128 {
11129 return false;
11130 }
11131
11133 {
11134 return false;
11135 }
11136
11140
11141
11143 {
11144 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11145 return module_repairing.CanRepair(this, item_repair_kit);
11146 }
11147
11148
11149 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11150 {
11151 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11152 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11153 }
11154
11155
11157 {
11158
11159
11160
11161
11162
11163
11164
11165
11166 return 1;
11167 }
11168
11169
11170
11172 {
11174 }
11175
11176
11177
11179 {
11181 }
11182
11183
11192 {
11193 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11194
11195 if (player)
11196 {
11197 player.MessageStatus(text);
11198 }
11199 }
11200
11201
11210 {
11211 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11212
11213 if (player)
11214 {
11215 player.MessageAction(text);
11216 }
11217 }
11218
11219
11228 {
11229 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11230
11231 if (player)
11232 {
11233 player.MessageFriendly(text);
11234 }
11235 }
11236
11237
11246 {
11247 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11248
11249 if (player)
11250 {
11251 player.MessageImportant(text);
11252 }
11253 }
11254
11256 {
11257 return true;
11258 }
11259
11260
11261 override bool KindOf(
string tag)
11262 {
11263 bool found = false;
11264 string item_name = this.
GetType();
11266 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11267
11268 int array_size = item_tag_array.Count();
11269 for (int i = 0; i < array_size; i++)
11270 {
11271 if (item_tag_array.Get(i) == tag)
11272 {
11273 found = true;
11274 break;
11275 }
11276 }
11277 return found;
11278 }
11279
11280
11282 {
11283
11284 super.OnRPC(sender, rpc_type,ctx);
11285
11286
11287 switch (rpc_type)
11288 {
11289 #ifndef SERVER
11290 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11291 Param2<bool, string> p = new Param2<bool, string>(false, "");
11292
11294 return;
11295
11296 bool play = p.param1;
11297 string soundSet = p.param2;
11298
11299 if (play)
11300 {
11302 {
11304 {
11306 }
11307 }
11308 else
11309 {
11311 }
11312 }
11313 else
11314 {
11316 }
11317
11318 break;
11319 #endif
11320
11321 }
11322
11324 {
11326 }
11327 }
11328
11329
11330
11331
11333 {
11334 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11335 return plugin.GetID(
name);
11336 }
11337
11339 {
11340 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11341 return plugin.GetName(id);
11342 }
11343
11346 {
11347
11348
11349 int varFlags;
11350 if (!ctx.
Read(varFlags))
11351 return;
11352
11353 if (varFlags & ItemVariableFlags.FLOAT)
11354 {
11356 }
11357 }
11358
11360 {
11361
11362 super.SerializeNumericalVars(floats_out);
11363
11364
11365
11367 {
11369 }
11370
11372 {
11374 }
11375
11377 {
11379 }
11380
11382 {
11387 }
11388
11390 {
11392 }
11393 }
11394
11396 {
11397
11398 super.DeSerializeNumericalVars(floats);
11399
11400
11401 int index = 0;
11402 int mask = Math.Round(floats.Get(index));
11403
11404 index++;
11405
11407 {
11409 {
11411 }
11412 else
11413 {
11414 float quantity = floats.Get(index);
11415 SetQuantity(quantity,
true,
false,
false,
false);
11416 }
11417 index++;
11418 }
11419
11421 {
11422 float wet = floats.Get(index);
11424 index++;
11425 }
11426
11428 {
11429 int liquidtype = Math.Round(floats.Get(index));
11431 index++;
11432 }
11433
11435 {
11437 index++;
11439 index++;
11441 index++;
11443 index++;
11444 }
11445
11447 {
11448 int cleanness = Math.Round(floats.Get(index));
11450 index++;
11451 }
11452 }
11453
11455 {
11456 super.WriteVarsToCTX(ctx);
11457
11458
11460 {
11462 }
11463
11465 {
11467 }
11468
11470 {
11472 }
11473
11475 {
11476 int r,g,b,a;
11482 }
11483
11485 {
11487 }
11488 }
11489
11491 {
11492 if (!super.ReadVarsFromCTX(ctx,version))
11493 return false;
11494
11495 int intValue;
11496 float value;
11497
11498 if (version < 140)
11499 {
11500 if (!ctx.
Read(intValue))
11501 return false;
11502
11503 m_VariablesMask = intValue;
11504 }
11505
11507 {
11508 if (!ctx.
Read(value))
11509 return false;
11510
11512 {
11514 }
11515 else
11516 {
11518 }
11519 }
11520
11521 if (version < 140)
11522 {
11524 {
11525 if (!ctx.
Read(value))
11526 return false;
11527 SetTemperatureDirect(value);
11528 }
11529 }
11530
11532 {
11533 if (!ctx.
Read(value))
11534 return false;
11536 }
11537
11539 {
11540 if (!ctx.
Read(intValue))
11541 return false;
11543 }
11544
11546 {
11547 int r,g,b,a;
11549 return false;
11551 return false;
11553 return false;
11555 return false;
11556
11558 }
11559
11561 {
11562 if (!ctx.
Read(intValue))
11563 return false;
11565 }
11566
11567 if (version >= 138 && version < 140)
11568 {
11570 {
11571 if (!ctx.
Read(intValue))
11572 return false;
11573 SetFrozen(intValue);
11574 }
11575 }
11576
11577 return true;
11578 }
11579
11580
11582 {
11585 {
11587 }
11588
11589 if (!super.OnStoreLoad(ctx, version))
11590 {
11592 return false;
11593 }
11594
11595 if (version >= 114)
11596 {
11597 bool hasQuickBarIndexSaved;
11598
11599 if (!ctx.
Read(hasQuickBarIndexSaved))
11600 {
11602 return false;
11603 }
11604
11605 if (hasQuickBarIndexSaved)
11606 {
11607 int itmQBIndex;
11608
11609
11610 if (!ctx.
Read(itmQBIndex))
11611 {
11613 return false;
11614 }
11615
11616 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11617 if (itmQBIndex != -1 && parentPlayer)
11618 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11619 }
11620 }
11621 else
11622 {
11623
11624 PlayerBase player;
11625 int itemQBIndex;
11626 if (version ==
int.
MAX)
11627 {
11628 if (!ctx.
Read(itemQBIndex))
11629 {
11631 return false;
11632 }
11633 }
11634 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11635 {
11636
11637 if (!ctx.
Read(itemQBIndex))
11638 {
11640 return false;
11641 }
11642 if (itemQBIndex != -1 && player)
11643 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11644 }
11645 }
11646
11647 if (version < 140)
11648 {
11649
11650 if (!LoadVariables(ctx, version))
11651 {
11653 return false;
11654 }
11655 }
11656
11657
11659 {
11661 return false;
11662 }
11663 if (version >= 132)
11664 {
11666 if (raib)
11667 {
11669 {
11671 return false;
11672 }
11673 }
11674 }
11675
11677 return true;
11678 }
11679
11680
11681
11683 {
11684 super.OnStoreSave(ctx);
11685
11686 PlayerBase player;
11687 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11688 {
11690
11691 int itemQBIndex = -1;
11692 itemQBIndex = player.FindQuickBarEntityIndex(this);
11693 ctx.
Write(itemQBIndex);
11694 }
11695 else
11696 {
11698 }
11699
11701
11703 if (raib)
11704 {
11706 }
11707 }
11708
11709
11711 {
11712 super.AfterStoreLoad();
11713
11715 {
11717 }
11718
11720 {
11723 }
11724 }
11725
11727 {
11728 super.EEOnAfterLoad();
11729
11731 {
11733 }
11734
11737 }
11738
11740 {
11741 return false;
11742 }
11743
11744
11745
11747 {
11749 {
11750 #ifdef PLATFORM_CONSOLE
11751
11753 {
11755 if (menu)
11756 {
11758 }
11759 }
11760 #endif
11761 }
11762
11764 {
11767 }
11768
11770 {
11771 SetWeightDirty();
11773 }
11775 {
11778 }
11779
11781 {
11784
11787 }
11789 {
11793 }
11794
11795 super.OnVariablesSynchronized();
11796 }
11797
11798
11799
11801 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11802 {
11803 if (!IsServerCheck(allow_client))
11804 return false;
11805
11807 return false;
11808
11811
11812 if (value <= (min + 0.001))
11813 value = min;
11814
11815 if (value == min)
11816 {
11817 if (destroy_config)
11818 {
11819 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11820 if (dstr)
11821 {
11823 this.Delete();
11824 return true;
11825 }
11826 }
11827 else if (destroy_forced)
11828 {
11830 this.Delete();
11831 return true;
11832 }
11833
11835 }
11836
11839
11841 {
11842 EntityAI parent = GetHierarchyRoot();
11843 InventoryLocation iLoc = new InventoryLocation();
11844 GetInventory().GetCurrentInventoryLocation(iLoc);
11846 {
11847 int iLocSlot = iLoc.
GetSlot();
11849 {
11851 }
11853 {
11855 }
11856 }
11857 }
11858
11860 {
11862
11863 if (delta)
11865 }
11866
11868
11869 return false;
11870 }
11871
11872
11874 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11875 {
11877 }
11878
11880 {
11883 }
11884
11886 {
11889 }
11890
11892 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11893 {
11894 float value_clamped = Math.Clamp(value, 0, 1);
11896 SetQuantity(result, destroy_config, destroy_forced);
11897 }
11898
11899
11902 {
11904 }
11905
11907 {
11909 }
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11921 {
11922 int slot = -1;
11923 GameInventory inventory = GetInventory();
11924 if (inventory)
11925 {
11926 InventoryLocation il = new InventoryLocation;
11929 }
11930
11932 }
11933
11935 {
11936 float quantity_max = 0;
11937
11939 {
11940 if (attSlotID != -1)
11941 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11942
11943 if (quantity_max <= 0)
11945 }
11946
11947 if (quantity_max <= 0)
11949
11950 return quantity_max;
11951 }
11952
11954 {
11956 }
11957
11959 {
11961 }
11962
11963
11965 {
11967 }
11968
11970 {
11972 }
11973
11975 {
11977 }
11978
11979
11981 {
11982
11983 float weightEx = GetWeightEx();
11984 float special = GetInventoryAndCargoWeight();
11985 return weightEx - special;
11986 }
11987
11988
11990 {
11992 }
11993
11995 {
11997 {
11998 #ifdef DEVELOPER
11999 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12000 {
12001 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12003 }
12004 #endif
12005
12006 return GetQuantity() * GetConfigWeightModified();
12007 }
12008 else if (HasEnergyManager())
12009 {
12010 #ifdef DEVELOPER
12011 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12012 {
12013 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12014 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12015 }
12016 #endif
12017 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12018 }
12019 else
12020 {
12021 #ifdef DEVELOPER
12022 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12023 {
12024 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12025 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12026 }
12027 #endif
12028 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12029 }
12030 }
12031
12034 {
12035 int item_count = 0;
12037
12038 GameInventory inventory = GetInventory();
12039 CargoBase cargo = inventory.
GetCargo();
12040 if (cargo != NULL)
12041 {
12043 }
12044
12046 for (int i = 0; i < nAttachments; ++i)
12047 {
12049 if (item)
12050 item_count += item.GetNumberOfItems();
12051 }
12052 return item_count;
12053 }
12054
12057 {
12058 float weight = 0;
12059 float wetness = 1;
12060 if (include_wetness)
12063 {
12064 weight = wetness * m_ConfigWeight;
12065 }
12067 {
12068 weight = 1;
12069 }
12070 return weight;
12071 }
12072
12073
12074
12076 {
12077 GameInventory inventory = GetInventory();
12078 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12079 {
12080 array<EntityAI> items = new array<EntityAI>;
12082 for (int i = 0; i < items.Count(); ++i)
12083 {
12085 if (item)
12086 {
12087 g_Game.ObjectDelete(item);
12088 }
12089 }
12090 }
12091 }
12092
12093
12094
12095
12097 {
12098 float energy = 0;
12099 if (HasEnergyManager())
12100 {
12101 energy = GetCompEM().GetEnergy();
12102 }
12103 return energy;
12104 }
12105
12106
12108 {
12109 super.OnEnergyConsumed();
12110
12112 }
12113
12115 {
12116 super.OnEnergyAdded();
12117
12119 }
12120
12121
12123 {
12124 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12125 {
12127 {
12128 float energy_0to1 = GetCompEM().GetEnergy0To1();
12130 }
12131 }
12132 }
12133
12134
12136 {
12137 return ConfigGetFloat("heatIsolation");
12138 }
12139
12141 {
12143 }
12144
12146 {
12147 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12148 if (
g_Game.ConfigIsExisting(paramPath))
12149 return g_Game.ConfigGetFloat(paramPath);
12150
12151 return 0.0;
12152 }
12153
12155 {
12156 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12157 if (
g_Game.ConfigIsExisting(paramPath))
12158 return g_Game.ConfigGetFloat(paramPath);
12159
12160 return 0.0;
12161 }
12162
12163 override void SetWet(
float value,
bool allow_client =
false)
12164 {
12165 if (!IsServerCheck(allow_client))
12166 return;
12167
12170
12172
12173 m_VarWet = Math.Clamp(value, min, max);
12174
12176 {
12179 }
12180 }
12181
12182 override void AddWet(
float value)
12183 {
12185 }
12186
12188 {
12190 }
12191
12193 {
12195 }
12196
12198 {
12200 }
12201
12203 {
12205 }
12206
12208 {
12210 }
12211
12212 override void OnWetChanged(
float newVal,
float oldVal)
12213 {
12216 if (newLevel != oldLevel)
12217 {
12219 }
12220 }
12221
12223 {
12224 SetWeightDirty();
12225 }
12226
12228 {
12229 return GetWetLevelInternal(
m_VarWet);
12230 }
12231
12232
12233
12235 {
12237 }
12238
12240 {
12242 }
12243
12245 {
12247 }
12248
12250 {
12252 }
12253
12254
12255
12257 {
12258 if (ConfigIsExisting("itemModelLength"))
12259 {
12260 return ConfigGetFloat("itemModelLength");
12261 }
12262 return 0;
12263 }
12264
12266 {
12267 if (ConfigIsExisting("itemAttachOffset"))
12268 {
12269 return ConfigGetFloat("itemAttachOffset");
12270 }
12271 return 0;
12272 }
12273
12274 override void SetCleanness(
int value,
bool allow_client =
false)
12275 {
12276 if (!IsServerCheck(allow_client))
12277 return;
12278
12280
12282
12285 }
12286
12288 {
12290 }
12291
12293 {
12294 return true;
12295 }
12296
12297
12298
12299
12301 {
12303 }
12304
12306 {
12308 }
12309
12310
12311
12312
12313 override void SetColor(
int r,
int g,
int b,
int a)
12314 {
12320 }
12322 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12323 {
12328 }
12329
12331 {
12333 }
12334
12337 {
12338 int r,g,b,a;
12340 r = r/255;
12341 g = g/255;
12342 b = b/255;
12343 a = a/255;
12344 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12345 }
12346
12347
12348
12349 override void SetLiquidType(
int value,
bool allow_client =
false)
12350 {
12351 if (!IsServerCheck(allow_client))
12352 return;
12353
12358 }
12359
12361 {
12362 return ConfigGetInt("varLiquidTypeInit");
12363 }
12364
12366 {
12368 }
12369
12371 {
12373 SetFrozen(false);
12374 }
12375
12378 {
12379 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12380 }
12381
12382
12385 {
12386 PlayerBase nplayer;
12387 if (PlayerBase.CastTo(nplayer, player))
12388 {
12390 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12391 }
12392 }
12393
12394
12397 {
12398 PlayerBase nplayer;
12399 if (PlayerBase.CastTo(nplayer,player))
12400 {
12401 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12402 }
12403
12404 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12405
12406 if (HasEnergyManager())
12407 {
12408 GetCompEM().UpdatePlugState();
12409 }
12410 }
12411
12412
12414 {
12415 super.OnPlacementStarted(player);
12416
12418 }
12419
12420 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12421 {
12423 {
12424 m_AdminLog.OnPlacementComplete(player,
this);
12425 }
12426
12427 super.OnPlacementComplete(player, position, orientation);
12428 }
12429
12430
12431
12432
12433
12435 {
12437 {
12438 return true;
12439 }
12440 else
12441 {
12442 return false;
12443 }
12444 }
12445
12446
12448 {
12450 {
12452 }
12453 }
12454
12455
12457 {
12459 }
12460
12462 {
12464 }
12465
12466 override void InsertAgent(
int agent,
float count = 1)
12467 {
12468 if (count < 1)
12469 return;
12470
12472 }
12473
12476 {
12478 }
12479
12480
12482 {
12484 }
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12528 {
12530 return false;
12531 return true;
12532 }
12533
12535 {
12536
12538 }
12539
12540
12543 {
12544 super.CheckForRoofLimited(timeTresholdMS);
12545
12546 float time =
g_Game.GetTime();
12547 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12548 {
12549 m_PreviousRoofTestTime = time;
12550 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12551 }
12552 }
12553
12554
12556 {
12558 {
12559 return 0;
12560 }
12561
12562 if (GetInventory().GetAttachmentSlotsCount() != 0)
12563 {
12564 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12565 if (filter)
12566 return filter.GetProtectionLevel(type, false, system);
12567 else
12568 return 0;
12569 }
12570
12571 string subclassPath, entryName;
12572
12573 switch (type)
12574 {
12576 entryName = "biological";
12577 break;
12579 entryName = "chemical";
12580 break;
12581 default:
12582 entryName = "biological";
12583 break;
12584 }
12585
12586 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12587
12588 return g_Game.ConfigGetFloat(subclassPath + entryName);
12589 }
12590
12591
12592
12595 {
12596 if (!IsMagazine())
12598
12600 }
12601
12602
12603
12604
12605
12610 {
12611 return true;
12612 }
12613
12615 {
12617 }
12618
12619
12620
12621
12622
12624 {
12625 if (parent)
12626 {
12627 if (parent.IsInherited(DayZInfected))
12628 return true;
12629
12630 if (!parent.IsRuined())
12631 return true;
12632 }
12633
12634 return true;
12635 }
12636
12638 {
12639 if (!super.CanPutAsAttachment(parent))
12640 {
12641 return false;
12642 }
12643
12644 if (!IsRuined() && !parent.IsRuined())
12645 {
12646 return true;
12647 }
12648
12649 return false;
12650 }
12651
12653 {
12654
12655
12656
12657
12658 return super.CanReceiveItemIntoCargo(item);
12659 }
12660
12662 {
12663
12664
12665
12666
12667 GameInventory attachmentInv = attachment.GetInventory();
12669 {
12670 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12671 return false;
12672 }
12673
12674 InventoryLocation loc = new InventoryLocation();
12675 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12676 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12677 return false;
12678
12679 return super.CanReceiveAttachment(attachment, slotId);
12680 }
12681
12683 {
12684 if (!super.CanReleaseAttachment(attachment))
12685 return false;
12686
12687 return GetInventory().AreChildrenAccessible();
12688 }
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12711 {
12712 int id = muzzle_owner.GetMuzzleID();
12713 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12714
12715 if (WPOF_array)
12716 {
12717 for (int i = 0; i < WPOF_array.Count(); i++)
12718 {
12719 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12720
12721 if (WPOF)
12722 {
12723 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12724 }
12725 }
12726 }
12727 }
12728
12729
12731 {
12732 int id = muzzle_owner.GetMuzzleID();
12734
12735 if (WPOBE_array)
12736 {
12737 for (int i = 0; i < WPOBE_array.Count(); i++)
12738 {
12739 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12740
12741 if (WPOBE)
12742 {
12743 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12744 }
12745 }
12746 }
12747 }
12748
12749
12751 {
12752 int id = muzzle_owner.GetMuzzleID();
12753 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12754
12755 if (WPOOH_array)
12756 {
12757 for (int i = 0; i < WPOOH_array.Count(); i++)
12758 {
12759 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12760
12761 if (WPOOH)
12762 {
12763 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12764 }
12765 }
12766 }
12767 }
12768
12769
12771 {
12772 int id = muzzle_owner.GetMuzzleID();
12773 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12774
12775 if (WPOOH_array)
12776 {
12777 for (int i = 0; i < WPOOH_array.Count(); i++)
12778 {
12779 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12780
12781 if (WPOOH)
12782 {
12783 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12784 }
12785 }
12786 }
12787 }
12788
12789
12791 {
12792 int id = muzzle_owner.GetMuzzleID();
12793 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12794
12795 if (WPOOH_array)
12796 {
12797 for (int i = 0; i < WPOOH_array.Count(); i++)
12798 {
12799 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12800
12801 if (WPOOH)
12802 {
12803 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12804 }
12805 }
12806 }
12807 }
12808
12809
12810
12812 {
12814 {
12815 return true;
12816 }
12817
12818 return false;
12819 }
12820
12822 {
12824 {
12825 return true;
12826 }
12827
12828 return false;
12829 }
12830
12832 {
12834 {
12835 return true;
12836 }
12837
12838 return false;
12839 }
12840
12842 {
12843 return false;
12844 }
12845
12848 {
12849 return UATimeSpent.DEFAULT_DEPLOY;
12850 }
12851
12852
12853
12854
12856 {
12858 SetSynchDirty();
12859 }
12860
12862 {
12864 }
12865
12866
12868 {
12869 return false;
12870 }
12871
12874 {
12875 string att_type = "None";
12876
12877 if (ConfigIsExisting("soundAttType"))
12878 {
12879 att_type = ConfigGetString("soundAttType");
12880 }
12881
12883 }
12884
12886 {
12888 }
12889
12890
12891
12892
12893
12899
12901 {
12904
12906 }
12907
12908
12910 {
12912 return;
12913
12915
12918
12921
12922 SoundParameters params = new SoundParameters();
12926 }
12927
12928
12930 {
12932 {
12935
12936 SetSynchDirty();
12937
12940 }
12941 }
12942
12944 {
12946 }
12947
12948
12950 {
12952 return;
12953
12955 SetSynchDirty();
12956
12959 }
12960
12962 {
12965 }
12966
12968 {
12970 }
12971
12972 void OnApply(PlayerBase player);
12973
12975 {
12976 return 1.0;
12977 };
12978
12980 {
12982 }
12983
12985 {
12987 }
12988
12990
12992 {
12993 SetDynamicPhysicsLifeTime(0.01);
12995 }
12996
12998 {
12999 array<string> zone_names = new array<string>;
13000 GetDamageZones(zone_names);
13001 for (int i = 0; i < zone_names.Count(); i++)
13002 {
13003 SetHealthMax(zone_names.Get(i),"Health");
13004 }
13005 SetHealthMax("","Health");
13006 }
13007
13010 {
13011 float global_health = GetHealth01("","Health");
13012 array<string> zones = new array<string>;
13013 GetDamageZones(zones);
13014
13015 for (int i = 0; i < zones.Count(); i++)
13016 {
13017 SetHealth01(zones.Get(i),"Health",global_health);
13018 }
13019 }
13020
13023 {
13024 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13025 }
13026
13028 {
13029 if (!hasRootAsPlayer)
13030 {
13031 if (refParentIB)
13032 {
13033
13034 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13035 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13036
13037 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13038 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13039
13042 }
13043 else
13044 {
13045
13048 }
13049 }
13050 }
13051
13053 {
13055 {
13056 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13057 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13058 {
13059 float heatPermCoef = 1.0;
13061 while (ent)
13062 {
13063 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13064 ent = ent.GetHierarchyParent();
13065 }
13066
13067 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13068 }
13069 }
13070 }
13071
13073 {
13074
13075 EntityAI parent = GetHierarchyParent();
13076 if (!parent)
13077 {
13078 hasParent = false;
13079 hasRootAsPlayer = false;
13080 }
13081 else
13082 {
13083 hasParent = true;
13084 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13085 refParentIB =
ItemBase.Cast(parent);
13086 }
13087 }
13088
13089 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13090 {
13091
13092 }
13093
13095 {
13096
13097 return false;
13098 }
13099
13101 {
13102
13103
13104 return false;
13105 }
13106
13108 {
13109
13110 return false;
13111 }
13112
13115 {
13116 return !GetIsFrozen() &&
IsOpen();
13117 }
13118
13120 {
13121 bool hasParent = false, hasRootAsPlayer = false;
13123
13124 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13125 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13126
13127 if (wwtu || foodDecay)
13128 {
13132
13133 if (processWetness || processTemperature || processDecay)
13134 {
13136
13137 if (processWetness)
13138 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13139
13140 if (processTemperature)
13142
13143 if (processDecay)
13144 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13145 }
13146 }
13147 }
13148
13151 {
13153 }
13154
13156 {
13159
13160 return super.GetTemperatureFreezeThreshold();
13161 }
13162
13164 {
13167
13168 return super.GetTemperatureThawThreshold();
13169 }
13170
13172 {
13175
13176 return super.GetItemOverheatThreshold();
13177 }
13178
13180 {
13182 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13183
13184 return super.GetTemperatureFreezeTime();
13185 }
13186
13188 {
13190 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13191
13192 return super.GetTemperatureThawTime();
13193 }
13194
13199
13201 {
13202 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13203 }
13204
13206 {
13207 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13208 }
13209
13212 {
13214 }
13215
13217 {
13219 }
13220
13222 {
13224 }
13225
13228 {
13229 return null;
13230 }
13231
13234 {
13235 return false;
13236 }
13237
13239 {
13241 {
13244 if (!trg)
13245 {
13247 explosive = this;
13248 }
13249
13250 explosive.PairRemote(trg);
13252
13253 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13254 trg.SetPersistentPairID(persistentID);
13255 explosive.SetPersistentPairID(persistentID);
13256
13257 return true;
13258 }
13259 return false;
13260 }
13261
13264 {
13265 float ret = 1.0;
13268 ret *= GetHealth01();
13269
13270 return ret;
13271 }
13272
13273 #ifdef DEVELOPER
13274 override void SetDebugItem()
13275 {
13276 super.SetDebugItem();
13277 _itemBase = this;
13278 }
13279
13281 {
13282 string text = super.GetDebugText();
13283
13285 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13286
13287 return text;
13288 }
13289 #endif
13290
13292 {
13293 return true;
13294 }
13295
13297
13299
13301 {
13304 }
13305
13306
13314
13330
13331 [
Obsolete(
"Use ItemSoundHandler instead")]
13334 {
13335 if (!
g_Game.IsDedicatedServer())
13336 {
13337 if (ConfigIsExisting("attachSoundSet"))
13338 {
13339 string cfg_path = "";
13340 string soundset = "";
13341 string type_name =
GetType();
13342
13345 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13346 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13347
13348 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13349 {
13350 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13351 {
13352 if (cfg_slot_array[i] == slot_type)
13353 {
13354 soundset = cfg_soundset_array[i];
13355 break;
13356 }
13357 }
13358 }
13359
13360 if (soundset != "")
13361 {
13362 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13364 }
13365 }
13366 }
13367 }
13368
13370}
13371
13373{
13375 if (entity)
13376 {
13377 bool is_item = entity.IsInherited(
ItemBase);
13378 if (is_item && full_quantity)
13379 {
13382 }
13383 }
13384 else
13385 {
13387 return NULL;
13388 }
13389 return entity;
13390}
13391
13393{
13394 if (item)
13395 {
13396 if (health > 0)
13397 item.SetHealth("", "", health);
13398
13399 if (item.CanHaveTemperature())
13400 {
13402 if (item.CanFreeze())
13403 item.SetFrozen(false);
13404 }
13405
13406 if (item.HasEnergyManager())
13407 {
13408 if (quantity >= 0)
13409 {
13410 item.GetCompEM().SetEnergy0To1(quantity);
13411 }
13412 else
13413 {
13415 }
13416 }
13417 else if (item.IsMagazine())
13418 {
13419 Magazine mag = Magazine.Cast(item);
13420 if (quantity >= 0)
13421 {
13422 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13423 }
13424 else
13425 {
13427 }
13428
13429 }
13430 else
13431 {
13432 if (quantity >= 0)
13433 {
13434 item.SetQuantityNormalized(quantity, false);
13435 }
13436 else
13437 {
13439 }
13440
13441 }
13442 }
13443}
13444
13445#ifdef DEVELOPER
13447#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
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...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
void Obsolete(string msg="")
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
vector GetPosition()
Get the world position of the Effect.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.