8567{
8569 {
8570 return true;
8571 }
8572};
8573
8574
8575
8577{
8581
8583
8586
8587
8588
8589
8590
8599
8605
8610
8615
8636 protected bool m_IsResultOfSplit
8637
8639
8644
8645
8646
8648
8652
8653
8654
8656
8659
8660
8661
8667
8668
8676
8679
8680
8682
8683
8685
8686
8691
8692
8697
8698
8700
8701
8703 {
8708
8709 if (!
GetGame().IsDedicatedServer())
8710 {
8712 {
8714
8716 {
8718 }
8719 }
8720
8723 }
8724
8725 m_OldLocation = null;
8726
8728 {
8730 }
8731
8732 if (ConfigIsExisting("headSelectionsToHide"))
8733 {
8736 }
8737
8739 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8740 {
8742 }
8743
8745
8746 m_IsResultOfSplit = false;
8747
8749 }
8750
8752 {
8753 super.InitItemVariables();
8754
8760 m_Count = ConfigGetInt(
"count");
8761
8764
8769
8772
8777
8789
8793
8794
8797 if (ConfigIsExisting("canBeSplit"))
8798 {
8801 }
8802
8804 if (ConfigIsExisting("itemBehaviour"))
8806
8807
8810 RegisterNetSyncVariableInt("m_VarLiquidType");
8811 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8812
8813 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8814 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8815 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8816
8817 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8818 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8819 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8820 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8821
8822 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8823 RegisterNetSyncVariableBool("m_IsTakeable");
8824 RegisterNetSyncVariableBool("m_IsHologram");
8825
8828 {
8831 }
8832
8834
8836 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8838
8839 }
8840
8842 {
8844 }
8845
8847 {
8850 {
8855 }
8856 }
8857
8858 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8859 {
8861 {
8864 }
8865
8867 }
8868
8870 {
8876 }
8877
8879
8881 {
8883
8884 if (!action)
8885 {
8886 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8887 return;
8888 }
8889
8891 if (!ai)
8892 {
8894 return;
8895 }
8896
8898 if (!action_array)
8899 {
8900 action_array = new array<ActionBase_Basic>;
8902 }
8903 if (LogManager.IsActionLogEnable())
8904 {
8905 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8906 }
8907
8908 if (action_array.Find(action) != -1)
8909 {
8910 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8911 }
8912 else
8913 {
8914 action_array.Insert(action);
8915 }
8916 }
8917
8919 {
8921 ActionBase action = player.GetActionManager().GetAction(actionName);
8924
8925 if (action_array)
8926 {
8927 action_array.RemoveItem(action);
8928 }
8929 }
8930
8931
8932
8934 {
8935 ActionOverrideData overrideData = new ActionOverrideData();
8939
8941 if (!actionMap)
8942 {
8945 }
8946
8947 actionMap.Insert(this.
Type(), overrideData);
8948
8949 }
8950
8952
8954
8955
8957 {
8960
8963
8964 string config_to_search = "CfgVehicles";
8965 string muzzle_owner_config;
8966
8968 {
8969 if (IsInherited(Weapon))
8970 config_to_search = "CfgWeapons";
8971
8972 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8973
8974 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8975
8977
8978 if (config_OnFire_subclass_count > 0)
8979 {
8980 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8981
8982 for (int i = 0; i < config_OnFire_subclass_count; i++)
8983 {
8984 string particle_class = "";
8986 string config_OnFire_entry = config_OnFire_class + particle_class;
8987 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8988 WPOF_array.Insert(WPOF);
8989 }
8990
8991
8993 }
8994 }
8995
8997 {
8998 config_to_search = "CfgWeapons";
8999 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9000
9001 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9002
9004
9005 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9006 {
9007 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9008
9009 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9010 {
9011 string particle_class2 = "";
9013 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9014 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9015 WPOBE_array.Insert(WPOBE);
9016 }
9017
9018
9020 }
9021 }
9022 }
9023
9024
9026 {
9029
9031 {
9032 string config_to_search = "CfgVehicles";
9033
9034 if (IsInherited(Weapon))
9035 config_to_search = "CfgWeapons";
9036
9037 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9038 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9039
9040 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9041 {
9042
9044
9046 {
9048 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9050 return;
9051 }
9052
9055
9056
9057
9059 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9060
9061 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9062 {
9063 string particle_class = "";
9065 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9067
9068 if (entry_type == CT_CLASS)
9069 {
9070 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9071 WPOOH_array.Insert(WPOF);
9072 }
9073 }
9074
9075
9077 }
9078 }
9079 }
9080
9082 {
9084 }
9085
9087 {
9089 {
9091
9094
9097
9098 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9099 }
9100 }
9101
9103 {
9105 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9106
9108 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9109
9111 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9112
9114 {
9116 }
9117 }
9118
9120 {
9122 }
9123
9125 {
9128 else
9130
9132 {
9135 }
9136 else
9137 {
9140
9143 }
9144
9146 }
9147
9149 {
9151 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9152 }
9153
9155 {
9157 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9159 }
9160
9162 {
9164 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9165 }
9166
9168 {
9171
9172 OverheatingParticle OP = new OverheatingParticle();
9177
9179 }
9180
9182 {
9185
9186 return -1;
9187 }
9188
9190 {
9192 {
9195
9196 for (int i = count; i > 0; --i)
9197 {
9198 int id = i - 1;
9201
9204
9205 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9206 {
9207 if (p)
9208 {
9211 }
9212 }
9213 }
9214 }
9215 }
9216
9218 {
9220 {
9222 {
9223 int id = i - 1;
9225
9226 if (OP)
9227 {
9229
9230 if (p)
9231 {
9233 }
9234
9235 delete OP;
9236 }
9237 }
9238
9241 }
9242 }
9243
9246 {
9247 return 0.0;
9248 }
9249
9250
9252 {
9253 return 250;
9254 }
9255
9257 {
9258 return 0;
9259 }
9260
9263 {
9265 return true;
9266
9267 return false;
9268 }
9269
9272 {
9275
9277 {
9279 }
9280 else
9281 {
9282
9284 }
9285
9287 }
9288
9295 {
9296 return -1;
9297 }
9298
9299
9300
9301
9303 {
9305 {
9307 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9308
9309 if (r_index >= 0)
9310 {
9311 InventoryLocation r_il = new InventoryLocation;
9312 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9313
9314 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9317 {
9318 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9319 }
9321 {
9322 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9323 }
9324
9325 }
9326
9327 player.GetHumanInventory().ClearUserReservedLocation(this);
9328 }
9329
9332 }
9333
9334
9335
9336
9338 {
9339 return ItemBase.m_DebugActionsMask;
9340 }
9341
9343 {
9344 return ItemBase.m_DebugActionsMask & mask;
9345 }
9346
9348 {
9349 ItemBase.m_DebugActionsMask = mask;
9350 }
9351
9353 {
9354 ItemBase.m_DebugActionsMask |= mask;
9355 }
9356
9358 {
9359 ItemBase.m_DebugActionsMask &= ~mask;
9360 }
9361
9363 {
9365 {
9367 }
9368 else
9369 {
9371 }
9372 }
9373
9374
9376 {
9377 if (GetEconomyProfile())
9378 {
9379 float q_max = GetEconomyProfile().GetQuantityMax();
9380 if (q_max > 0)
9381 {
9382 float q_min = GetEconomyProfile().GetQuantityMin();
9383 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9384
9386 {
9387 ComponentEnergyManager comp = GetCompEM();
9389 {
9391 }
9392 }
9394 {
9396
9397 }
9398
9399 }
9400 }
9401 }
9402
9405 {
9406 EntityAI parent = GetHierarchyParent();
9407
9408 if (parent)
9409 {
9410 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9411 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9412 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9413 }
9414 }
9415
9418 {
9419 EntityAI parent = GetHierarchyParent();
9420
9421 if (parent)
9422 {
9423 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9424 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9425 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9426 }
9427 }
9428
9430 {
9431
9432
9433
9434
9436
9438 {
9439 if (ScriptInputUserData.CanStoreInputUserData())
9440 {
9441 ScriptInputUserData ctx = new ScriptInputUserData;
9447 ctx.
Write(use_stack_max);
9450
9452 {
9453 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9454 }
9455 }
9456 }
9457 else if (!
GetGame().IsMultiplayer())
9458 {
9460 }
9461 }
9462
9464 {
9466 }
9467
9469 {
9471 }
9472
9474 {
9476 }
9477
9479 {
9480
9481 return false;
9482 }
9483
9485 {
9486 return false;
9487 }
9488
9492 {
9493 return false;
9494 }
9495
9497 {
9498 return "";
9499 }
9500
9502
9504 {
9505 return false;
9506 }
9507
9509 {
9510 return true;
9511 }
9512
9513
9514
9516 {
9517 return true;
9518 }
9519
9521 {
9522 return true;
9523 }
9524
9526 {
9527 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9529 }
9530
9532 {
9534 }
9535
9537 {
9539 if (!is_being_placed)
9541 SetSynchDirty();
9542 }
9543
9544
9546
9548 {
9550 }
9551
9553 {
9555 }
9556
9558 {
9559 return 1;
9560 }
9561
9563 {
9564 return false;
9565 }
9566
9568 {
9570 SetSynchDirty();
9571 }
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9608 {
9609 super.OnMovedInsideCargo(container);
9610
9611 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9612 }
9613
9614 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9615 {
9616 super.EEItemLocationChanged(oldLoc,newLoc);
9617
9618 PlayerBase new_player = null;
9619 PlayerBase old_player = null;
9620
9621 if (newLoc.GetParent())
9622 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9623
9624 if (oldLoc.GetParent())
9625 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9626
9628 {
9629 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9630
9631 if (r_index >= 0)
9632 {
9633 InventoryLocation r_il = new InventoryLocation;
9634 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9635
9636 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9639 {
9640 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9641 }
9643 {
9644 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9645 }
9646
9647 }
9648 }
9649
9651 {
9652 if (new_player)
9653 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9654
9655 if (new_player == old_player)
9656 {
9657
9658 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9659 {
9661 {
9662 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9663 {
9664 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9665 }
9666 }
9667 else
9668 {
9669 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9670 }
9671 }
9672
9673 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9674 {
9675 int type = oldLoc.GetType();
9677 {
9678 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9679 }
9681 {
9682 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9683 }
9684 }
9685 if (!m_OldLocation)
9686 {
9687 m_OldLocation = new InventoryLocation;
9688 }
9689 m_OldLocation.Copy(oldLoc);
9690 }
9691 else
9692 {
9693 if (m_OldLocation)
9694 {
9695 m_OldLocation.Reset();
9696 }
9697 }
9698
9700 }
9701 else
9702 {
9703 if (new_player)
9704 {
9705 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9706 if (res_index >= 0)
9707 {
9708 InventoryLocation il = new InventoryLocation;
9709 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9711 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9714 {
9715 il.
GetParent().GetOnReleaseLock().Invoke(it);
9716 }
9718 {
9720 }
9721
9722 }
9723 }
9725 {
9726
9728 }
9729
9730 if (m_OldLocation)
9731 {
9732 m_OldLocation.Reset();
9733 }
9734 }
9735 }
9736
9737 override void EOnContact(IEntity other, Contact extra)
9738 {
9740 {
9741 int liquidType = -1;
9743 if (impactSpeed > 0.0)
9744 {
9746 #ifndef SERVER
9748 #else
9750 SetSynchDirty();
9751 #endif
9753 }
9754 }
9755
9756 #ifdef SERVER
9757 if (GetCompEM() && GetCompEM().IsPlugged())
9758 {
9759 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9760 GetCompEM().UnplugThis();
9761 }
9762 #endif
9763 }
9764
9766
9768 {
9770 }
9771
9773 {
9774
9775 }
9776
9778 {
9779 super.OnItemLocationChanged(old_owner, new_owner);
9780
9781 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9782 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9783
9784 if (!relatedPlayer && playerNew)
9785 relatedPlayer = playerNew;
9786
9787 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9788 {
9790 if (actionMgr)
9791 {
9792 ActionBase currentAction = actionMgr.GetRunningAction();
9793 if (currentAction)
9795 }
9796 }
9797
9798 Man ownerPlayerOld = null;
9799 Man ownerPlayerNew = null;
9800
9801 if (old_owner)
9802 {
9803 if (old_owner.
IsMan())
9804 {
9805 ownerPlayerOld = Man.Cast(old_owner);
9806 }
9807 else
9808 {
9809 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9810 }
9811 }
9812 else
9813 {
9815 {
9817
9818 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9819 {
9820 GetCompEM().UnplugThis();
9821 }
9822 }
9823 }
9824
9825 if (new_owner)
9826 {
9827 if (new_owner.
IsMan())
9828 {
9829 ownerPlayerNew = Man.Cast(new_owner);
9830 }
9831 else
9832 {
9833 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9834 }
9835 }
9836
9837 if (ownerPlayerOld != ownerPlayerNew)
9838 {
9839 if (ownerPlayerOld)
9840 {
9841 array<EntityAI> subItemsExit = new array<EntityAI>;
9843 for (int i = 0; i < subItemsExit.Count(); i++)
9844 {
9847 }
9848 }
9849
9850 if (ownerPlayerNew)
9851 {
9852 array<EntityAI> subItemsEnter = new array<EntityAI>;
9854 for (int j = 0; j < subItemsEnter.Count(); j++)
9855 {
9858 }
9859 }
9860 }
9861 else if (ownerPlayerNew != null)
9862 {
9863 PlayerBase nplayer;
9864 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9865 {
9866 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9868 for (int k = 0; k < subItemsUpdate.Count(); k++)
9869 {
9871 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9872 }
9873 }
9874 }
9875
9876 if (old_owner)
9877 old_owner.OnChildItemRemoved(this);
9878 if (new_owner)
9879 new_owner.OnChildItemReceived(this);
9880 }
9881
9882
9884 {
9885 super.EEDelete(parent);
9886 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9887 if (player)
9888 {
9890
9891 if (player.IsAlive())
9892 {
9893 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9894 if (r_index >= 0)
9895 {
9896 InventoryLocation r_il = new InventoryLocation;
9897 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9898
9899 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9902 {
9903 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9904 }
9906 {
9907 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9908 }
9909
9910 }
9911
9912 player.RemoveQuickBarEntityShortcut(this);
9913 }
9914 }
9915 }
9916
9918 {
9919 super.EEKilled(killer);
9920
9923 {
9924 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9925 {
9926 if (IsMagazine())
9927 {
9928 if (Magazine.Cast(this).GetAmmoCount() > 0)
9929 {
9931 }
9932 }
9933 else
9934 {
9936 }
9937 }
9938 }
9939 }
9940
9942 {
9943 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9944
9945 super.OnWasAttached(parent, slot_id);
9946
9949
9951 }
9952
9954 {
9955 super.OnWasDetached(parent, slot_id);
9956
9959 }
9960
9962 {
9963 int idx;
9966
9967 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9968 if (inventory_slots.Count() < 1)
9969 {
9970 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9971 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9972 }
9973 else
9974 {
9975 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9976 }
9977
9978 idx = inventory_slots.Find(slot);
9979 if (idx < 0)
9980 return "";
9981
9982 return attach_types.Get(idx);
9983 }
9984
9986 {
9987 int idx = -1;
9988 string slot;
9989
9992
9993 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9994 if (inventory_slots.Count() < 1)
9995 {
9996 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9997 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9998 }
9999 else
10000 {
10001 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10002 if (detach_types.Count() < 1)
10003 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10004 }
10005
10006 for (int i = 0; i < inventory_slots.Count(); i++)
10007 {
10008 slot = inventory_slots.Get(i);
10009 }
10010
10011 if (slot != "")
10012 {
10013 if (detach_types.Count() == 1)
10014 idx = 0;
10015 else
10016 idx = inventory_slots.Find(slot);
10017 }
10018 if (idx < 0)
10019 return "";
10020
10021 return detach_types.Get(idx);
10022 }
10023
10025 {
10026
10028
10029
10030 float min_time = 1;
10031 float max_time = 3;
10032 float delay = Math.RandomFloat(min_time, max_time);
10033
10034 explode_timer.Run(delay, this, "DoAmmoExplosion");
10035 }
10036
10038 {
10039 Magazine magazine = Magazine.Cast(this);
10040 int pop_sounds_count = 6;
10041 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10042
10043
10044 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10045 string sound_name = pop_sounds[ sound_idx ];
10047
10048
10049 magazine.ServerAddAmmoCount(-1);
10050
10051
10052 float min_temp_to_explode = 100;
10053
10054 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10055 {
10057 }
10058 }
10059
10060
10061 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10062 {
10063 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10064
10065 const int CHANCE_DAMAGE_CARGO = 4;
10066 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10067 const int CHANCE_DAMAGE_NOTHING = 2;
10068
10070 {
10071 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10072 int chances;
10073 int rnd;
10074
10075 if (GetInventory().GetCargo())
10076 {
10077 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10078 rnd = Math.RandomInt(0,chances);
10079
10080 if (rnd < CHANCE_DAMAGE_CARGO)
10081 {
10083 }
10084 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10085 {
10087 }
10088 }
10089 else
10090 {
10091 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10092 rnd = Math.RandomInt(0,chances);
10093
10094 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10095 {
10097 }
10098 }
10099 }
10100 }
10101
10103 {
10104 if (GetInventory().GetCargo())
10105 {
10106 int item_count = GetInventory().GetCargo().GetItemCount();
10107 if (item_count > 0)
10108 {
10109 int random_pick = Math.RandomInt(0, item_count);
10111 if (!item.IsExplosive())
10112 {
10113 item.AddHealth("","",damage);
10114 return true;
10115 }
10116 }
10117 }
10118 return false;
10119 }
10120
10122 {
10123 int attachment_count = GetInventory().AttachmentCount();
10124 if (attachment_count > 0)
10125 {
10126 int random_pick = Math.RandomInt(0, attachment_count);
10127 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10128 if (!attachment.IsExplosive())
10129 {
10130 attachment.AddHealth("","",damage);
10131 return true;
10132 }
10133 }
10134 return false;
10135 }
10136
10138 {
10140 }
10141
10143 {
10145 return GetInventory().CanRemoveEntity();
10146
10147 return false;
10148 }
10149
10151 {
10152
10154 return false;
10155
10156
10158 return false;
10159
10160
10161
10163 if (delta == 0)
10164 return false;
10165
10166
10167 return true;
10168 }
10169
10171 {
10173 {
10174 if (ScriptInputUserData.CanStoreInputUserData())
10175 {
10176 ScriptInputUserData ctx = new ScriptInputUserData;
10181 ctx.
Write(destination_entity);
10183 ctx.
Write(slot_id);
10185 }
10186 }
10187 else if (!
GetGame().IsMultiplayer())
10188 {
10190 }
10191 }
10192
10194 {
10195 float split_quantity_new;
10199 InventoryLocation loc = new InventoryLocation;
10200
10201 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10202 {
10204 split_quantity_new = stack_max;
10205 else
10207
10209 {
10210 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10211 if (new_item)
10212 {
10213 new_item.SetResultOfSplit(true);
10214 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10216 new_item.
SetQuantity(split_quantity_new,
false,
true);
10217 }
10218 }
10219 }
10220 else if (destination_entity && slot_id == -1)
10221 {
10222 if (quantity > stack_max)
10223 split_quantity_new = stack_max;
10224 else
10225 split_quantity_new = quantity;
10226
10228 {
10230 {
10233 }
10234
10235 if (new_item)
10236 {
10237 new_item.SetResultOfSplit(true);
10238 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10240 new_item.
SetQuantity(split_quantity_new,
false,
true);
10241 }
10242 }
10243 }
10244 else
10245 {
10246 if (stack_max != 0)
10247 {
10249 {
10251 }
10252
10253 if (split_quantity_new == 0)
10254 {
10255 if (!
GetGame().IsMultiplayer())
10256 player.PhysicalPredictiveDropItem(this);
10257 else
10258 player.ServerDropEntity(this);
10259 return;
10260 }
10261
10263 {
10265
10266 if (new_item)
10267 {
10268 new_item.SetResultOfSplit(true);
10269 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10272 new_item.PlaceOnSurface();
10273 }
10274 }
10275 }
10276 }
10277 }
10278
10280 {
10281 float split_quantity_new;
10285 InventoryLocation loc = new InventoryLocation;
10286
10287 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10288 {
10290 split_quantity_new = stack_max;
10291 else
10293
10295 {
10296 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10297 if (new_item)
10298 {
10299 new_item.SetResultOfSplit(true);
10300 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10302 new_item.
SetQuantity(split_quantity_new,
false,
true);
10303 }
10304 }
10305 }
10306 else if (destination_entity && slot_id == -1)
10307 {
10308 if (quantity > stack_max)
10309 split_quantity_new = stack_max;
10310 else
10311 split_quantity_new = quantity;
10312
10314 {
10316 {
10319 }
10320
10321 if (new_item)
10322 {
10323 new_item.SetResultOfSplit(true);
10324 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10326 new_item.
SetQuantity(split_quantity_new,
false,
true);
10327 }
10328 }
10329 }
10330 else
10331 {
10332 if (stack_max != 0)
10333 {
10335 {
10337 }
10338
10340 {
10342
10343 if (new_item)
10344 {
10345 new_item.SetResultOfSplit(true);
10346 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10349 new_item.PlaceOnSurface();
10350 }
10351 }
10352 }
10353 }
10354 }
10355
10357 {
10359 {
10360 if (ScriptInputUserData.CanStoreInputUserData())
10361 {
10362 ScriptInputUserData ctx = new ScriptInputUserData;
10367 dst.WriteToContext(ctx);
10369 }
10370 }
10371 else if (!
GetGame().IsMultiplayer())
10372 {
10374 }
10375 }
10376
10378 {
10380 {
10381 if (ScriptInputUserData.CanStoreInputUserData())
10382 {
10383 ScriptInputUserData ctx = new ScriptInputUserData;
10388 ctx.
Write(destination_entity);
10394 }
10395 }
10396 else if (!
GetGame().IsMultiplayer())
10397 {
10399 }
10400 }
10401
10403 {
10405 }
10406
10408 {
10410 float split_quantity_new;
10412 if (dst.IsValid())
10413 {
10414 int slot_id = dst.GetSlot();
10416
10417 if (quantity > stack_max)
10418 split_quantity_new = stack_max;
10419 else
10420 split_quantity_new = quantity;
10421
10423 {
10425
10426 if (new_item)
10427 {
10428 new_item.SetResultOfSplit(true);
10429 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10431 new_item.
SetQuantity(split_quantity_new,
false,
true);
10432 }
10433
10434 return new_item;
10435 }
10436 }
10437
10438 return null;
10439 }
10440
10442 {
10444 float split_quantity_new;
10446 if (destination_entity)
10447 {
10449 if (quantity > stackable)
10450 split_quantity_new = stackable;
10451 else
10452 split_quantity_new = quantity;
10453
10455 {
10456 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10457 if (new_item)
10458 {
10459 new_item.SetResultOfSplit(true);
10460 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10462 new_item.
SetQuantity(split_quantity_new,
false,
true);
10463 }
10464 }
10465 }
10466 }
10467
10469 {
10471 {
10472 if (ScriptInputUserData.CanStoreInputUserData())
10473 {
10474 ScriptInputUserData ctx = new ScriptInputUserData;
10479 ItemBase destination_entity =
this;
10480 ctx.
Write(destination_entity);
10484 }
10485 }
10486 else if (!
GetGame().IsMultiplayer())
10487 {
10489 }
10490 }
10491
10493 {
10495 float split_quantity_new;
10497 if (player)
10498 {
10500 if (quantity > stackable)
10501 split_quantity_new = stackable;
10502 else
10503 split_quantity_new = quantity;
10504
10506 {
10507 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10508 new_item =
ItemBase.Cast(in_hands);
10509 if (new_item)
10510 {
10511 new_item.SetResultOfSplit(true);
10512 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10514 new_item.SetQuantity(split_quantity_new, false, true);
10515 }
10516 }
10517 }
10518 }
10519
10521 {
10523 float split_quantity_new = Math.Floor(quantity * 0.5);
10524
10526 return;
10527
10529
10530 if (new_item)
10531 {
10532 if (new_item.GetQuantityMax() < split_quantity_new)
10533 {
10534 split_quantity_new = new_item.GetQuantityMax();
10535 }
10536
10537 new_item.SetResultOfSplit(true);
10538 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10539
10541 {
10544 }
10545 else
10546 {
10548 new_item.
SetQuantity(split_quantity_new,
false,
true);
10549 }
10550 }
10551 }
10552
10554 {
10556 float split_quantity_new = Math.Floor(quantity / 2);
10557
10559 return;
10560
10561 InventoryLocation invloc = new InventoryLocation;
10563
10565 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10566
10567 if (new_item)
10568 {
10569 if (new_item.GetQuantityMax() < split_quantity_new)
10570 {
10571 split_quantity_new = new_item.GetQuantityMax();
10572 }
10574 {
10577 }
10578 else if (split_quantity_new > 1)
10579 {
10581 new_item.
SetQuantity(split_quantity_new,
false,
true);
10582 }
10583 }
10584 }
10585
10588 {
10589 SetWeightDirty();
10591
10592 if (parent)
10593 parent.OnAttachmentQuantityChangedEx(this, delta);
10594
10596 {
10598 {
10600 }
10602 {
10603 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10605 }
10606 }
10607
10608 }
10609
10612 {
10613
10614 }
10615
10618 {
10620 }
10621
10623 {
10624 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10625
10627 {
10628 if (newLevel == GameConstants.STATE_RUINED)
10629 {
10631 EntityAI parent = GetHierarchyParent();
10632 if (parent && parent.IsFireplace())
10633 {
10634 CargoBase cargo = GetInventory().GetCargo();
10635 if (cargo)
10636 {
10638 {
10640 }
10641 }
10642 }
10643 }
10644
10646 {
10647
10649 return;
10650 }
10651
10652 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10653 {
10655 }
10656 }
10657 }
10658
10659
10661 {
10662 super.OnRightClick();
10663
10665 {
10667 {
10668 if (ScriptInputUserData.CanStoreInputUserData())
10669 {
10670 EntityAI root = GetHierarchyRoot();
10671 Man playerOwner = GetHierarchyRootPlayer();
10672 InventoryLocation dst = new InventoryLocation;
10673
10674
10675 if (!playerOwner && root && root == this)
10676 {
10678 }
10679 else
10680 {
10681
10682 GetInventory().GetCurrentInventoryLocation(dst);
10684 {
10687 {
10689 }
10690 else
10691 {
10693
10694
10695 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10696 {
10698 }
10699 else
10700 {
10701 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10702 }
10703 }
10704 }
10705 }
10706
10707 ScriptInputUserData ctx = new ScriptInputUserData;
10715 }
10716 }
10717 else if (!
GetGame().IsMultiplayer())
10718 {
10720 }
10721 }
10722 }
10723
10725 {
10726 if (root)
10727 {
10728 vector m4[4];
10729 root.GetTransform(m4);
10730 dst.SetGround(this, m4);
10731 }
10732 else
10733 {
10734 GetInventory().GetCurrentInventoryLocation(dst);
10735 }
10736 }
10737
10738 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10739 {
10740
10741 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10742 return false;
10743
10744 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10745 return false;
10746
10747
10749 return false;
10750
10751
10752 Magazine mag = Magazine.Cast(this);
10753 if (mag)
10754 {
10755 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10756 return false;
10757
10758 if (stack_max_limit)
10759 {
10760 Magazine other_mag = Magazine.Cast(other_item);
10761 if (other_item)
10762 {
10763 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10764 return false;
10765 }
10766
10767 }
10768 }
10769 else
10770 {
10771
10773 return false;
10774
10776 return false;
10777 }
10778
10779 PlayerBase player = null;
10780 if (CastTo(player, GetHierarchyRootPlayer()))
10781 {
10782 if (player.GetInventory().HasAttachment(this))
10783 return false;
10784
10785 if (player.IsItemsToDelete())
10786 return false;
10787 }
10788
10789 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10790 return false;
10791
10792 int slotID;
10794 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10795 return false;
10796
10797 return true;
10798 }
10799
10801 {
10803 }
10804
10806 {
10807 return m_IsResultOfSplit;
10808 }
10809
10811 {
10812 m_IsResultOfSplit = value;
10813 }
10814
10816 {
10818 }
10819
10821 {
10822 float other_item_quantity = other_item.GetQuantity();
10823 float this_free_space;
10824
10826
10828
10829 if (other_item_quantity > this_free_space)
10830 {
10831 return this_free_space;
10832 }
10833 else
10834 {
10835 return other_item_quantity;
10836 }
10837 }
10838
10840 {
10842 }
10843
10845 {
10847 return;
10848
10849 if (!IsMagazine() && other_item)
10850 {
10852 if (quantity_used != 0)
10853 {
10854 float hp1 = GetHealth01("","");
10855 float hp2 = other_item.GetHealth01("","");
10856 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10857 hpResult = hpResult / (
GetQuantity() + quantity_used);
10858
10859 hpResult *= GetMaxHealth();
10860 Math.Round(hpResult);
10861 SetHealth("", "Health", hpResult);
10862
10864 other_item.AddQuantity(-quantity_used);
10865 }
10866 }
10868 }
10869
10871 {
10872 #ifdef SERVER
10873 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10874 GetHierarchyParent().IncreaseLifetimeUp();
10875 #endif
10876 };
10877
10879 {
10880 PlayerBase p = PlayerBase.Cast(player);
10881
10882 array<int> recipesIds = p.m_Recipes;
10883 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10884 if (moduleRecipesManager)
10885 {
10886 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10887 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10888 }
10889
10890 for (int i = 0;i < recipesIds.Count(); i++)
10891 {
10892 int key = recipesIds.Get(i);
10893 string recipeName = moduleRecipesManager.GetRecipeName(key);
10895 }
10896 }
10897
10898
10899 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10900 {
10901 super.GetDebugActions(outputList);
10902
10903
10909
10910
10915
10920
10921
10925
10926
10928 {
10932 }
10933
10936
10937
10941
10943
10944 InventoryLocation loc = new InventoryLocation();
10945 GetInventory().GetCurrentInventoryLocation(loc);
10947 {
10948 if (Gizmo_IsSupported())
10951 }
10952
10954 }
10955
10956
10957
10958
10960 {
10961 super.OnAction(action_id, player, ctx);
10962
10964 {
10965 switch (action_id)
10966 {
10969 return true;
10972 return true;
10973 }
10974 }
10975
10977 {
10978 switch (action_id)
10979 {
10981 Delete();
10982 return true;
10983 }
10984 }
10985
10986 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10987 {
10988 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10989 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10990 PlayerBase p = PlayerBase.Cast(player);
10991 if (
EActions.RECIPES_RANGE_START < 1000)
10992 {
10993 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10994 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10995 }
10996 }
10997 #ifndef SERVER
10998 else if (action_id ==
EActions.WATCH_PLAYER)
10999 {
11000 PluginDeveloper.SetDeveloperItemClientEx(player);
11001 }
11002 #endif
11004 {
11005 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11006 {
11007 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11008 OnDebugButtonPressServer(id + 1);
11009 }
11010
11011 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11012 {
11013 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11015 }
11016
11017 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11018 {
11019 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11021 }
11022
11023 else if (action_id ==
EActions.ADD_QUANTITY)
11024 {
11025 if (IsMagazine())
11026 {
11027 Magazine mag = Magazine.Cast(this);
11028 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11029 }
11030 else
11031 {
11033 }
11034
11035 if (m_EM)
11036 {
11037 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11038 }
11039
11040 }
11041
11042 else if (action_id ==
EActions.REMOVE_QUANTITY)
11043 {
11044 if (IsMagazine())
11045 {
11046 Magazine mag2 = Magazine.Cast(this);
11047 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11048 }
11049 else
11050 {
11052 }
11053 if (m_EM)
11054 {
11055 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11056 }
11057
11058 }
11059
11060 else if (action_id ==
EActions.SET_QUANTITY_0)
11061 {
11063
11064 if (m_EM)
11065 {
11066 m_EM.SetEnergy(0);
11067 }
11068 }
11069
11070 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11071 {
11073
11074 if (m_EM)
11075 {
11076 m_EM.SetEnergy(m_EM.GetEnergyMax());
11077 }
11078 }
11079
11080 else if (action_id ==
EActions.ADD_HEALTH)
11081 {
11082 AddHealth("","",GetMaxHealth("","Health")/5);
11083 }
11084 else if (action_id ==
EActions.REMOVE_HEALTH)
11085 {
11086 AddHealth("","",-GetMaxHealth("","Health")/5);
11087 }
11088 else if (action_id ==
EActions.DESTROY_HEALTH)
11089 {
11090 SetHealth01("","",0);
11091 }
11092 else if (action_id ==
EActions.WATCH_ITEM)
11093 {
11095 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11096 #ifdef DEVELOPER
11097 SetDebugDeveloper_item(this);
11098 #endif
11099 }
11100
11101 else if (action_id ==
EActions.ADD_TEMPERATURE)
11102 {
11103 AddTemperature(20);
11104
11105 }
11106
11107 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11108 {
11109 AddTemperature(-20);
11110
11111 }
11112
11113 else if (action_id ==
EActions.FLIP_FROZEN)
11114 {
11115 SetFrozen(!GetIsFrozen());
11116
11117 }
11118
11119 else if (action_id ==
EActions.ADD_WETNESS)
11120 {
11122
11123 }
11124
11125 else if (action_id ==
EActions.REMOVE_WETNESS)
11126 {
11128
11129 }
11130
11131 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11132 {
11135
11136
11137 }
11138
11139 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11140 {
11143 }
11144
11145 else if (action_id ==
EActions.MAKE_SPECIAL)
11146 {
11147 auto debugParams = DebugSpawnParams.WithPlayer(player);
11148 OnDebugSpawnEx(debugParams);
11149 }
11150
11151 }
11152
11153
11154 return false;
11155 }
11156
11157
11158
11159
11163
11166
11167
11168
11170 {
11171 return false;
11172 }
11173
11174
11176 {
11177 return true;
11178 }
11179
11180
11182 {
11183 return true;
11184 }
11185
11186
11187
11189 {
11190 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11192 }
11193
11196 {
11197 return null;
11198 }
11199
11201 {
11202 return false;
11203 }
11204
11206 {
11207 return false;
11208 }
11209
11213
11214
11216 {
11217 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11218 return module_repairing.CanRepair(this, item_repair_kit);
11219 }
11220
11221
11222 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11223 {
11224 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11225 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11226 }
11227
11228
11230 {
11231
11232
11233
11234
11235
11236
11237
11238
11239 return 1;
11240 }
11241
11242
11243
11245 {
11247 }
11248
11249
11250
11252 {
11254 }
11255
11256
11265 {
11266 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11267
11268 if (player)
11269 {
11270 player.MessageStatus(text);
11271 }
11272 }
11273
11274
11283 {
11284 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11285
11286 if (player)
11287 {
11288 player.MessageAction(text);
11289 }
11290 }
11291
11292
11301 {
11302 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11303
11304 if (player)
11305 {
11306 player.MessageFriendly(text);
11307 }
11308 }
11309
11310
11319 {
11320 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11321
11322 if (player)
11323 {
11324 player.MessageImportant(text);
11325 }
11326 }
11327
11329 {
11330 return true;
11331 }
11332
11333
11334 override bool KindOf(
string tag)
11335 {
11336 bool found = false;
11337 string item_name = this.
GetType();
11340
11341 int array_size = item_tag_array.Count();
11342 for (int i = 0; i < array_size; i++)
11343 {
11344 if (item_tag_array.Get(i) == tag)
11345 {
11346 found = true;
11347 break;
11348 }
11349 }
11350 return found;
11351 }
11352
11353
11355 {
11356
11357 super.OnRPC(sender, rpc_type,ctx);
11358
11359
11360 switch (rpc_type)
11361 {
11362 #ifndef SERVER
11363 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11364 Param2<bool, string> p = new Param2<bool, string>(false, "");
11365
11367 return;
11368
11369 bool play = p.param1;
11370 string soundSet = p.param2;
11371
11372 if (play)
11373 {
11375 {
11377 {
11379 }
11380 }
11381 else
11382 {
11384 }
11385 }
11386 else
11387 {
11389 }
11390
11391 break;
11392 #endif
11393
11394 }
11395
11397 {
11399 }
11400 }
11401
11402
11403
11404
11406 {
11407 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11408 return plugin.GetID(
name);
11409 }
11410
11412 {
11413 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11414 return plugin.GetName(id);
11415 }
11416
11419 {
11420
11421
11422 int varFlags;
11423 if (!ctx.
Read(varFlags))
11424 return;
11425
11426 if (varFlags & ItemVariableFlags.FLOAT)
11427 {
11429 }
11430 }
11431
11433 {
11434
11435 super.SerializeNumericalVars(floats_out);
11436
11437
11438
11440 {
11442 }
11443
11445 {
11447 }
11448
11450 {
11452 }
11453
11455 {
11460 }
11461
11463 {
11465 }
11466 }
11467
11469 {
11470
11471 super.DeSerializeNumericalVars(floats);
11472
11473
11474 int index = 0;
11475 int mask = Math.Round(floats.Get(index));
11476
11477 index++;
11478
11480 {
11482 {
11484 }
11485 else
11486 {
11487 float quantity = floats.Get(index);
11488 SetQuantity(quantity,
true,
false,
false,
false);
11489 }
11490 index++;
11491 }
11492
11494 {
11495 float wet = floats.Get(index);
11497 index++;
11498 }
11499
11501 {
11502 int liquidtype = Math.Round(floats.Get(index));
11504 index++;
11505 }
11506
11508 {
11510 index++;
11512 index++;
11514 index++;
11516 index++;
11517 }
11518
11520 {
11521 int cleanness = Math.Round(floats.Get(index));
11523 index++;
11524 }
11525 }
11526
11528 {
11529 super.WriteVarsToCTX(ctx);
11530
11531
11533 {
11535 }
11536
11538 {
11540 }
11541
11543 {
11545 }
11546
11548 {
11549 int r,g,b,a;
11555 }
11556
11558 {
11560 }
11561 }
11562
11564 {
11565 if (!super.ReadVarsFromCTX(ctx,version))
11566 return false;
11567
11568 int intValue;
11569 float value;
11570
11571 if (version < 140)
11572 {
11573 if (!ctx.
Read(intValue))
11574 return false;
11575
11576 m_VariablesMask = intValue;
11577 }
11578
11580 {
11581 if (!ctx.
Read(value))
11582 return false;
11583
11585 {
11587 }
11588 else
11589 {
11591 }
11592 }
11593
11594 if (version < 140)
11595 {
11597 {
11598 if (!ctx.
Read(value))
11599 return false;
11600 SetTemperatureDirect(value);
11601 }
11602 }
11603
11605 {
11606 if (!ctx.
Read(value))
11607 return false;
11609 }
11610
11612 {
11613 if (!ctx.
Read(intValue))
11614 return false;
11616 }
11617
11619 {
11620 int r,g,b,a;
11622 return false;
11624 return false;
11626 return false;
11628 return false;
11629
11631 }
11632
11634 {
11635 if (!ctx.
Read(intValue))
11636 return false;
11638 }
11639
11640 if (version >= 138 && version < 140)
11641 {
11643 {
11644 if (!ctx.
Read(intValue))
11645 return false;
11646 SetFrozen(intValue);
11647 }
11648 }
11649
11650 return true;
11651 }
11652
11653
11655 {
11658 {
11660 }
11661
11662 if (!super.OnStoreLoad(ctx, version))
11663 {
11665 return false;
11666 }
11667
11668 if (version >= 114)
11669 {
11670 bool hasQuickBarIndexSaved;
11671
11672 if (!ctx.
Read(hasQuickBarIndexSaved))
11673 {
11675 return false;
11676 }
11677
11678 if (hasQuickBarIndexSaved)
11679 {
11680 int itmQBIndex;
11681
11682
11683 if (!ctx.
Read(itmQBIndex))
11684 {
11686 return false;
11687 }
11688
11689 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11690 if (itmQBIndex != -1 && parentPlayer)
11691 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11692 }
11693 }
11694 else
11695 {
11696
11697 PlayerBase player;
11698 int itemQBIndex;
11699 if (version ==
int.
MAX)
11700 {
11701 if (!ctx.
Read(itemQBIndex))
11702 {
11704 return false;
11705 }
11706 }
11707 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11708 {
11709
11710 if (!ctx.
Read(itemQBIndex))
11711 {
11713 return false;
11714 }
11715 if (itemQBIndex != -1 && player)
11716 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11717 }
11718 }
11719
11720 if (version < 140)
11721 {
11722
11723 if (!LoadVariables(ctx, version))
11724 {
11726 return false;
11727 }
11728 }
11729
11730
11732 {
11734 return false;
11735 }
11736 if (version >= 132)
11737 {
11739 if (raib)
11740 {
11742 {
11744 return false;
11745 }
11746 }
11747 }
11748
11750 return true;
11751 }
11752
11753
11754
11756 {
11757 super.OnStoreSave(ctx);
11758
11759 PlayerBase player;
11760 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11761 {
11763
11764 int itemQBIndex = -1;
11765 itemQBIndex = player.FindQuickBarEntityIndex(this);
11766 ctx.
Write(itemQBIndex);
11767 }
11768 else
11769 {
11771 }
11772
11774
11776 if (raib)
11777 {
11779 }
11780 }
11781
11782
11784 {
11785 super.AfterStoreLoad();
11786
11788 {
11790 }
11791
11793 {
11796 }
11797 }
11798
11800 {
11801 super.EEOnAfterLoad();
11802
11804 {
11806 }
11807
11810 }
11811
11813 {
11814 return false;
11815 }
11816
11817
11818
11820 {
11822 {
11823 #ifdef PLATFORM_CONSOLE
11824
11826 {
11828 if (menu)
11829 {
11831 }
11832 }
11833 #endif
11834 }
11835
11837 {
11840 }
11841
11843 {
11844 SetWeightDirty();
11846 }
11848 {
11851 }
11852
11854 {
11857 }
11859 {
11862 }
11863
11864 super.OnVariablesSynchronized();
11865 }
11866
11867
11868
11870 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11871 {
11872 if (!IsServerCheck(allow_client))
11873 return false;
11874
11876 return false;
11877
11880
11881 if (value <= (min + 0.001))
11882 value = min;
11883
11884 if (value == min)
11885 {
11886 if (destroy_config)
11887 {
11888 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11889 if (dstr)
11890 {
11892 this.Delete();
11893 return true;
11894 }
11895 }
11896 else if (destroy_forced)
11897 {
11899 this.Delete();
11900 return true;
11901 }
11902
11904 }
11905
11908
11910 {
11912
11913 if (delta)
11915 }
11916
11918
11919 return false;
11920 }
11921
11922
11924 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11925 {
11927 }
11928
11930 {
11933 }
11934
11936 {
11939 }
11940
11942 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11943 {
11944 float value_clamped = Math.Clamp(value, 0, 1);
11946 SetQuantity(result, destroy_config, destroy_forced);
11947 }
11948
11949
11952 {
11954 }
11955
11957 {
11959 }
11960
11961
11962
11963
11964
11965
11966
11967
11968
11969
11971 {
11972 int slot = -1;
11973 if (GetInventory())
11974 {
11975 InventoryLocation il = new InventoryLocation;
11976 GetInventory().GetCurrentInventoryLocation(il);
11978 }
11979
11981 }
11982
11984 {
11985 float quantity_max = 0;
11986
11988 {
11989 if (attSlotID != -1)
11990 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11991
11992 if (quantity_max <= 0)
11994 }
11995
11996 if (quantity_max <= 0)
11998
11999 return quantity_max;
12000 }
12001
12003 {
12005 }
12006
12008 {
12010 }
12011
12012
12014 {
12016 }
12017
12019 {
12021 }
12022
12024 {
12026 }
12027
12028
12030 {
12031
12032 float weightEx = GetWeightEx();
12033 float special = GetInventoryAndCargoWeight();
12034 return weightEx - special;
12035 }
12036
12037
12039 {
12041 }
12042
12044 {
12046 {
12047 #ifdef DEVELOPER
12048 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12049 {
12050 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12052 }
12053 #endif
12054
12055 return GetQuantity() * GetConfigWeightModified();
12056 }
12057 else if (HasEnergyManager())
12058 {
12059 #ifdef DEVELOPER
12060 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12061 {
12062 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12063 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12064 }
12065 #endif
12066 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12067 }
12068 else
12069 {
12070 #ifdef DEVELOPER
12071 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12072 {
12073 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12074 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12075 }
12076 #endif
12077 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12078 }
12079 }
12080
12083 {
12084 int item_count = 0;
12086
12087 if (GetInventory().GetCargo() != NULL)
12088 {
12089 item_count = GetInventory().GetCargo().GetItemCount();
12090 }
12091
12092 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12093 {
12094 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12095 if (item)
12096 item_count += item.GetNumberOfItems();
12097 }
12098 return item_count;
12099 }
12100
12103 {
12104 float weight = 0;
12105 float wetness = 1;
12106 if (include_wetness)
12109 {
12110 weight = wetness * m_ConfigWeight;
12111 }
12113 {
12114 weight = 1;
12115 }
12116 return weight;
12117 }
12118
12119
12120
12122 {
12123 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12124 {
12125 GameInventory inv = GetInventory();
12126 array<EntityAI> items = new array<EntityAI>;
12128 for (int i = 0; i < items.Count(); i++)
12129 {
12131 if (item)
12132 {
12134 }
12135 }
12136 }
12137 }
12138
12139
12140
12141
12143 {
12144 float energy = 0;
12145 if (HasEnergyManager())
12146 {
12147 energy = GetCompEM().GetEnergy();
12148 }
12149 return energy;
12150 }
12151
12152
12154 {
12155 super.OnEnergyConsumed();
12156
12158 }
12159
12161 {
12162 super.OnEnergyAdded();
12163
12165 }
12166
12167
12169 {
12170 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12171 {
12173 {
12174 float energy_0to1 = GetCompEM().GetEnergy0To1();
12176 }
12177 }
12178 }
12179
12180
12182 {
12183 return ConfigGetFloat("heatIsolation");
12184 }
12185
12187 {
12189 }
12190
12192 {
12193 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12194 if (
GetGame().ConfigIsExisting(paramPath))
12196
12197 return 0.0;
12198 }
12199
12201 {
12202 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12203 if (
GetGame().ConfigIsExisting(paramPath))
12205
12206 return 0.0;
12207 }
12208
12209 override void SetWet(
float value,
bool allow_client =
false)
12210 {
12211 if (!IsServerCheck(allow_client))
12212 return;
12213
12216
12218
12219 m_VarWet = Math.Clamp(value, min, max);
12220
12222 {
12225 }
12226 }
12227
12228 override void AddWet(
float value)
12229 {
12231 }
12232
12234 {
12236 }
12237
12239 {
12241 }
12242
12244 {
12246 }
12247
12249 {
12251 }
12252
12254 {
12256 }
12257
12258 override void OnWetChanged(
float newVal,
float oldVal)
12259 {
12262 if (newLevel != oldLevel)
12263 {
12265 }
12266 }
12267
12269 {
12270 SetWeightDirty();
12271 }
12272
12274 {
12275 return GetWetLevelInternal(
m_VarWet);
12276 }
12277
12278
12279
12281 {
12283 }
12284
12286 {
12288 }
12289
12291 {
12293 }
12294
12296 {
12298 }
12299
12300
12301
12303 {
12304 if (ConfigIsExisting("itemModelLength"))
12305 {
12306 return ConfigGetFloat("itemModelLength");
12307 }
12308 return 0;
12309 }
12310
12312 {
12313 if (ConfigIsExisting("itemAttachOffset"))
12314 {
12315 return ConfigGetFloat("itemAttachOffset");
12316 }
12317 return 0;
12318 }
12319
12320 override void SetCleanness(
int value,
bool allow_client =
false)
12321 {
12322 if (!IsServerCheck(allow_client))
12323 return;
12324
12326
12328
12331 }
12332
12334 {
12336 }
12337
12339 {
12340 return true;
12341 }
12342
12343
12344
12345
12347 {
12349 }
12350
12352 {
12354 }
12355
12356
12357
12358
12359 override void SetColor(
int r,
int g,
int b,
int a)
12360 {
12366 }
12368 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12369 {
12374 }
12375
12377 {
12379 }
12380
12383 {
12384 int r,g,b,a;
12386 r = r/255;
12387 g = g/255;
12388 b = b/255;
12389 a = a/255;
12390 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12391 }
12392
12393
12394
12395 override void SetLiquidType(
int value,
bool allow_client =
false)
12396 {
12397 if (!IsServerCheck(allow_client))
12398 return;
12399
12404 }
12405
12407 {
12408 return ConfigGetInt("varLiquidTypeInit");
12409 }
12410
12412 {
12414 }
12415
12417 {
12419 SetFrozen(false);
12420 }
12421
12424 {
12425 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12426 }
12427
12428
12431 {
12432 PlayerBase nplayer;
12433 if (PlayerBase.CastTo(nplayer, player))
12434 {
12436
12437 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12438 }
12439 }
12440
12441
12444 {
12445 PlayerBase nplayer;
12446 if (PlayerBase.CastTo(nplayer,player))
12447 {
12448
12449 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12450
12451 }
12452
12453
12454 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12455
12456
12457 if (HasEnergyManager())
12458 {
12459 GetCompEM().UpdatePlugState();
12460 }
12461 }
12462
12463
12465 {
12466 super.OnPlacementStarted(player);
12467
12469 }
12470
12471 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12472 {
12474 {
12475 m_AdminLog.OnPlacementComplete(player,
this);
12476 }
12477
12478 super.OnPlacementComplete(player, position, orientation);
12479 }
12480
12481
12482
12483
12484
12486 {
12488 {
12489 return true;
12490 }
12491 else
12492 {
12493 return false;
12494 }
12495 }
12496
12497
12499 {
12501 {
12503 }
12504 }
12505
12506
12508 {
12510 }
12511
12513 {
12515 }
12516
12517 override void InsertAgent(
int agent,
float count = 1)
12518 {
12519 if (count < 1)
12520 return;
12521
12523 }
12524
12527 {
12529 }
12530
12531
12533 {
12535 }
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12579 {
12581 return false;
12582 return true;
12583 }
12584
12586 {
12587
12589 }
12590
12591
12594 {
12595 super.CheckForRoofLimited(timeTresholdMS);
12596
12598 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12599 {
12600 m_PreviousRoofTestTime = time;
12601 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12602 }
12603 }
12604
12605
12607 {
12609 {
12610 return 0;
12611 }
12612
12613 if (GetInventory().GetAttachmentSlotsCount() != 0)
12614 {
12615 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12616 if (filter)
12617 return filter.GetProtectionLevel(type, false, system);
12618 else
12619 return 0;
12620 }
12621
12622 string subclassPath, entryName;
12623
12624 switch (type)
12625 {
12627 entryName = "biological";
12628 break;
12630 entryName = "chemical";
12631 break;
12632 default:
12633 entryName = "biological";
12634 break;
12635 }
12636
12637 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12638
12640 }
12641
12642
12643
12646 {
12647 if (!IsMagazine())
12649
12651 }
12652
12653
12654
12655
12656
12661 {
12662 return true;
12663 }
12664
12666 {
12668 }
12669
12670
12671
12672
12673
12675 {
12676 if (parent)
12677 {
12678 if (parent.IsInherited(DayZInfected))
12679 return true;
12680
12681 if (!parent.IsRuined())
12682 return true;
12683 }
12684
12685 return true;
12686 }
12687
12689 {
12690 if (!super.CanPutAsAttachment(parent))
12691 {
12692 return false;
12693 }
12694
12695 if (!IsRuined() && !parent.IsRuined())
12696 {
12697 return true;
12698 }
12699
12700 return false;
12701 }
12702
12704 {
12705
12706
12707
12708
12709 return super.CanReceiveItemIntoCargo(item);
12710 }
12711
12713 {
12714
12715
12716
12717
12718 GameInventory attachmentInv = attachment.GetInventory();
12720 {
12721 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12722 return false;
12723 }
12724
12725 InventoryLocation loc = new InventoryLocation();
12726 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12727 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12728 return false;
12729
12730 return super.CanReceiveAttachment(attachment, slotId);
12731 }
12732
12734 {
12735 if (!super.CanReleaseAttachment(attachment))
12736 return false;
12737
12738 return GetInventory().AreChildrenAccessible();
12739 }
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12762 {
12763 int id = muzzle_owner.GetMuzzleID();
12764 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12765
12766 if (WPOF_array)
12767 {
12768 for (int i = 0; i < WPOF_array.Count(); i++)
12769 {
12770 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12771
12772 if (WPOF)
12773 {
12774 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12775 }
12776 }
12777 }
12778 }
12779
12780
12782 {
12783 int id = muzzle_owner.GetMuzzleID();
12785
12786 if (WPOBE_array)
12787 {
12788 for (int i = 0; i < WPOBE_array.Count(); i++)
12789 {
12790 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12791
12792 if (WPOBE)
12793 {
12794 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12795 }
12796 }
12797 }
12798 }
12799
12800
12802 {
12803 int id = muzzle_owner.GetMuzzleID();
12804 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12805
12806 if (WPOOH_array)
12807 {
12808 for (int i = 0; i < WPOOH_array.Count(); i++)
12809 {
12810 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12811
12812 if (WPOOH)
12813 {
12814 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12815 }
12816 }
12817 }
12818 }
12819
12820
12822 {
12823 int id = muzzle_owner.GetMuzzleID();
12824 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12825
12826 if (WPOOH_array)
12827 {
12828 for (int i = 0; i < WPOOH_array.Count(); i++)
12829 {
12830 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12831
12832 if (WPOOH)
12833 {
12834 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12835 }
12836 }
12837 }
12838 }
12839
12840
12842 {
12843 int id = muzzle_owner.GetMuzzleID();
12844 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12845
12846 if (WPOOH_array)
12847 {
12848 for (int i = 0; i < WPOOH_array.Count(); i++)
12849 {
12850 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12851
12852 if (WPOOH)
12853 {
12854 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12855 }
12856 }
12857 }
12858 }
12859
12860
12861
12863 {
12865 {
12866 return true;
12867 }
12868
12869 return false;
12870 }
12871
12873 {
12875 {
12876 return true;
12877 }
12878
12879 return false;
12880 }
12881
12883 {
12885 {
12886 return true;
12887 }
12888
12889 return false;
12890 }
12891
12893 {
12894 return false;
12895 }
12896
12899 {
12900 return UATimeSpent.DEFAULT_DEPLOY;
12901 }
12902
12903
12904
12905
12907 {
12909 SetSynchDirty();
12910 }
12911
12913 {
12915 }
12916
12917
12919 {
12920 return false;
12921 }
12922
12925 {
12926 string att_type = "None";
12927
12928 if (ConfigIsExisting("soundAttType"))
12929 {
12930 att_type = ConfigGetString("soundAttType");
12931 }
12932
12934 }
12935
12937 {
12939 }
12940
12941
12942
12943
12944
12950
12952 {
12955
12957 }
12958
12959
12961 {
12963 return;
12964
12966
12969
12972
12973 SoundParameters params = new SoundParameters();
12977 }
12978
12979
12981 {
12983 return;
12984
12986 SetSynchDirty();
12987
12990 }
12991
12992
12994 {
12996 return;
12997
12999 SetSynchDirty();
13000
13003 }
13004
13006 {
13008 }
13009
13011 {
13013 }
13014
13017 {
13018 if (!
GetGame().IsDedicatedServer())
13019 {
13020 if (ConfigIsExisting("attachSoundSet"))
13021 {
13022 string cfg_path = "";
13023 string soundset = "";
13024 string type_name =
GetType();
13025
13028 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13029 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13030
13031 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13032 {
13033 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13034 {
13035 if (cfg_slot_array[i] == slot_type)
13036 {
13037 soundset = cfg_soundset_array[i];
13038 break;
13039 }
13040 }
13041 }
13042
13043 if (soundset != "")
13044 {
13045 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13047 }
13048 }
13049 }
13050 }
13051
13053 {
13054
13055 }
13056
13057 void OnApply(PlayerBase player);
13058
13060 {
13061 return 1.0;
13062 };
13063
13065 {
13067 }
13068
13070 {
13072 }
13073
13075
13077 {
13078 SetDynamicPhysicsLifeTime(0.01);
13080 }
13081
13083 {
13084 array<string> zone_names = new array<string>;
13085 GetDamageZones(zone_names);
13086 for (int i = 0; i < zone_names.Count(); i++)
13087 {
13088 SetHealthMax(zone_names.Get(i),"Health");
13089 }
13090 SetHealthMax("","Health");
13091 }
13092
13095 {
13096 float global_health = GetHealth01("","Health");
13097 array<string> zones = new array<string>;
13098 GetDamageZones(zones);
13099
13100 for (int i = 0; i < zones.Count(); i++)
13101 {
13102 SetHealth01(zones.Get(i),"Health",global_health);
13103 }
13104 }
13105
13108 {
13109 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13110 }
13111
13113 {
13114 if (!hasRootAsPlayer)
13115 {
13116 if (refParentIB)
13117 {
13118
13119 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13120 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13121
13122 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13123 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13124
13127 }
13128 else
13129 {
13130
13133 }
13134 }
13135 }
13136
13138 {
13140 {
13141 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13142 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13143 {
13144 float heatPermCoef = 1.0;
13146 while (ent)
13147 {
13148 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13149 ent = ent.GetHierarchyParent();
13150 }
13151
13152 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13153 }
13154 }
13155 }
13156
13158 {
13159
13160 EntityAI parent = GetHierarchyParent();
13161 if (!parent)
13162 {
13163 hasParent = false;
13164 hasRootAsPlayer = false;
13165 }
13166 else
13167 {
13168 hasParent = true;
13169 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13170 refParentIB =
ItemBase.Cast(parent);
13171 }
13172 }
13173
13174 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13175 {
13176
13177 }
13178
13180 {
13181
13182 return false;
13183 }
13184
13186 {
13187
13188
13189 return false;
13190 }
13191
13193 {
13194
13195 return false;
13196 }
13197
13200 {
13201 return !GetIsFrozen() &&
IsOpen();
13202 }
13203
13205 {
13206 bool hasParent = false, hasRootAsPlayer = false;
13208
13209 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13210 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13211
13212 if (wwtu || foodDecay)
13213 {
13217
13218 if (processWetness || processTemperature || processDecay)
13219 {
13221
13222 if (processWetness)
13223 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13224
13225 if (processTemperature)
13227
13228 if (processDecay)
13229 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13230 }
13231 }
13232 }
13233
13236 {
13238 }
13239
13241 {
13244
13245 return super.GetTemperatureFreezeThreshold();
13246 }
13247
13249 {
13252
13253 return super.GetTemperatureThawThreshold();
13254 }
13255
13257 {
13260
13261 return super.GetItemOverheatThreshold();
13262 }
13263
13265 {
13267 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13268
13269 return super.GetTemperatureFreezeTime();
13270 }
13271
13273 {
13275 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13276
13277 return super.GetTemperatureThawTime();
13278 }
13279
13284
13286 {
13287 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13288 }
13289
13291 {
13292 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13293 }
13294
13297 {
13299 }
13300
13302 {
13304 }
13305
13307 {
13309 }
13310
13313 {
13314 return null;
13315 }
13316
13319 {
13320 return false;
13321 }
13322
13324 {
13326 {
13329 if (!trg)
13330 {
13332 explosive = this;
13333 }
13334
13335 explosive.PairRemote(trg);
13337
13338 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13339 trg.SetPersistentPairID(persistentID);
13340 explosive.SetPersistentPairID(persistentID);
13341
13342 return true;
13343 }
13344 return false;
13345 }
13346
13349 {
13350 float ret = 1.0;
13353 ret *= GetHealth01();
13354
13355 return ret;
13356 }
13357
13358 #ifdef DEVELOPER
13359 override void SetDebugItem()
13360 {
13361 super.SetDebugItem();
13362 _itemBase = this;
13363 }
13364
13366 {
13367 string text = super.GetDebugText();
13368
13370 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13371
13372 return text;
13373 }
13374 #endif
13375
13377 {
13378 return true;
13379 }
13380
13382
13384
13386 {
13389 }
13390
13391
13399
13415}
13416
13418{
13420 if (entity)
13421 {
13422 bool is_item = entity.IsInherited(
ItemBase);
13423 if (is_item && full_quantity)
13424 {
13427 }
13428 }
13429 else
13430 {
13432 return NULL;
13433 }
13434 return entity;
13435}
13436
13438{
13439 if (item)
13440 {
13441 if (health > 0)
13442 item.SetHealth("", "", health);
13443
13444 if (item.CanHaveTemperature())
13445 {
13447 if (item.CanFreeze())
13448 item.SetFrozen(false);
13449 }
13450
13451 if (item.HasEnergyManager())
13452 {
13453 if (quantity >= 0)
13454 {
13455 item.GetCompEM().SetEnergy0To1(quantity);
13456 }
13457 else
13458 {
13460 }
13461 }
13462 else if (item.IsMagazine())
13463 {
13464 Magazine mag = Magazine.Cast(item);
13465 if (quantity >= 0)
13466 {
13467 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13468 }
13469 else
13470 {
13472 }
13473
13474 }
13475 else
13476 {
13477 if (quantity >= 0)
13478 {
13479 item.SetQuantityNormalized(quantity, false);
13480 }
13481 else
13482 {
13484 }
13485
13486 }
13487 }
13488}
13489
13490#ifdef DEVELOPER
13492#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
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 CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
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
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)
void StartItemSoundServer(int id)
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()
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)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
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 bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
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
proto native CGame GetGame()
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
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
class JsonUndergroundAreaTriggerData GetPosition
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.