8562{
8564 {
8565 return true;
8566 }
8567};
8568
8569
8570
8572{
8576
8578
8581
8582
8583
8584
8585
8594
8600
8605
8610
8631 protected bool m_IsResultOfSplit
8632
8634
8639
8640
8641
8643
8647
8648
8649
8651
8654
8655
8656
8662
8663
8671
8674
8675
8677
8678
8680
8681
8686
8687
8692
8693
8695
8696
8698 {
8703
8704 if (!
GetGame().IsDedicatedServer())
8705 {
8707 {
8709
8711 {
8713 }
8714 }
8715
8718 }
8719
8720 m_OldLocation = null;
8721
8723 {
8725 }
8726
8727 if (ConfigIsExisting("headSelectionsToHide"))
8728 {
8731 }
8732
8734 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8735 {
8737 }
8738
8740
8741 m_IsResultOfSplit = false;
8742
8744 }
8745
8747 {
8748 super.InitItemVariables();
8749
8755 m_Count = ConfigGetInt(
"count");
8756
8759
8764
8767
8772
8784
8788
8789
8792 if (ConfigIsExisting("canBeSplit"))
8793 {
8796 }
8797
8799 if (ConfigIsExisting("itemBehaviour"))
8801
8802
8805 RegisterNetSyncVariableInt("m_VarLiquidType");
8806 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8807
8808 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8809 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8810 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8811
8812 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8813 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8814 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8815 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8816
8817 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8818 RegisterNetSyncVariableBool("m_IsTakeable");
8819 RegisterNetSyncVariableBool("m_IsHologram");
8820
8823 {
8826 }
8827
8829
8831 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8833
8834 }
8835
8837 {
8839 }
8840
8842 {
8845 {
8850 }
8851 }
8852
8853 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8854 {
8856 {
8859 }
8860
8862 }
8863
8865 {
8871 }
8872
8874
8876 {
8878
8879 if (!action)
8880 {
8881 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8882 return;
8883 }
8884
8886 if (!ai)
8887 {
8889 return;
8890 }
8891
8893 if (!action_array)
8894 {
8895 action_array = new array<ActionBase_Basic>;
8897 }
8898 if (LogManager.IsActionLogEnable())
8899 {
8900 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8901 }
8902
8903 if (action_array.Find(action) != -1)
8904 {
8905 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8906 }
8907 else
8908 {
8909 action_array.Insert(action);
8910 }
8911 }
8912
8914 {
8916 ActionBase action = player.GetActionManager().GetAction(actionName);
8919
8920 if (action_array)
8921 {
8922 action_array.RemoveItem(action);
8923 }
8924 }
8925
8926
8927
8929 {
8930 ActionOverrideData overrideData = new ActionOverrideData();
8934
8936 if (!actionMap)
8937 {
8940 }
8941
8942 actionMap.Insert(this.
Type(), overrideData);
8943
8944 }
8945
8947
8949
8950
8952 {
8955
8958
8959 string config_to_search = "CfgVehicles";
8960 string muzzle_owner_config;
8961
8963 {
8964 if (IsInherited(Weapon))
8965 config_to_search = "CfgWeapons";
8966
8967 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8968
8969 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8970
8972
8973 if (config_OnFire_subclass_count > 0)
8974 {
8975 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8976
8977 for (int i = 0; i < config_OnFire_subclass_count; i++)
8978 {
8979 string particle_class = "";
8981 string config_OnFire_entry = config_OnFire_class + particle_class;
8982 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8983 WPOF_array.Insert(WPOF);
8984 }
8985
8986
8988 }
8989 }
8990
8992 {
8993 config_to_search = "CfgWeapons";
8994 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8995
8996 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8997
8999
9000 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9001 {
9002 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9003
9004 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9005 {
9006 string particle_class2 = "";
9008 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9009 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9010 WPOBE_array.Insert(WPOBE);
9011 }
9012
9013
9015 }
9016 }
9017 }
9018
9019
9021 {
9024
9026 {
9027 string config_to_search = "CfgVehicles";
9028
9029 if (IsInherited(Weapon))
9030 config_to_search = "CfgWeapons";
9031
9032 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9033 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9034
9035 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9036 {
9037
9039
9041 {
9043 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9045 return;
9046 }
9047
9050
9051
9052
9054 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9055
9056 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9057 {
9058 string particle_class = "";
9060 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9062
9063 if (entry_type == CT_CLASS)
9064 {
9065 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9066 WPOOH_array.Insert(WPOF);
9067 }
9068 }
9069
9070
9072 }
9073 }
9074 }
9075
9077 {
9079 }
9080
9082 {
9084 {
9086
9089
9092
9093 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9094 }
9095 }
9096
9098 {
9100 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9101
9103 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9104
9106 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9107
9109 {
9111 }
9112 }
9113
9115 {
9117 }
9118
9120 {
9123 else
9125
9127 {
9130 }
9131 else
9132 {
9135
9138 }
9139
9141 }
9142
9144 {
9146 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9147 }
9148
9150 {
9152 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9154 }
9155
9157 {
9159 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9160 }
9161
9163 {
9166
9167 OverheatingParticle OP = new OverheatingParticle();
9172
9174 }
9175
9177 {
9180
9181 return -1;
9182 }
9183
9185 {
9187 {
9190
9191 for (int i = count; i > 0; --i)
9192 {
9193 int id = i - 1;
9196
9199
9200 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9201 {
9202 if (p)
9203 {
9206 }
9207 }
9208 }
9209 }
9210 }
9211
9213 {
9215 {
9217 {
9218 int id = i - 1;
9220
9221 if (OP)
9222 {
9224
9225 if (p)
9226 {
9228 }
9229
9230 delete OP;
9231 }
9232 }
9233
9236 }
9237 }
9238
9241 {
9242 return 0.0;
9243 }
9244
9245
9247 {
9248 return 250;
9249 }
9250
9252 {
9253 return 0;
9254 }
9255
9258 {
9260 return true;
9261
9262 return false;
9263 }
9264
9267 {
9270
9272 {
9274 }
9275 else
9276 {
9277
9279 }
9280
9282 }
9283
9290 {
9291 return -1;
9292 }
9293
9294
9295
9296
9298 {
9300 {
9302 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9303
9304 if (r_index >= 0)
9305 {
9306 InventoryLocation r_il = new InventoryLocation;
9307 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9308
9309 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9312 {
9313 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9314 }
9316 {
9317 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9318 }
9319
9320 }
9321
9322 player.GetHumanInventory().ClearUserReservedLocation(this);
9323 }
9324
9327 }
9328
9329
9330
9331
9333 {
9334 return ItemBase.m_DebugActionsMask;
9335 }
9336
9338 {
9339 return ItemBase.m_DebugActionsMask & mask;
9340 }
9341
9343 {
9344 ItemBase.m_DebugActionsMask = mask;
9345 }
9346
9348 {
9349 ItemBase.m_DebugActionsMask |= mask;
9350 }
9351
9353 {
9354 ItemBase.m_DebugActionsMask &= ~mask;
9355 }
9356
9358 {
9360 {
9362 }
9363 else
9364 {
9366 }
9367 }
9368
9369
9371 {
9372 if (GetEconomyProfile())
9373 {
9374 float q_max = GetEconomyProfile().GetQuantityMax();
9375 if (q_max > 0)
9376 {
9377 float q_min = GetEconomyProfile().GetQuantityMin();
9378 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9379
9381 {
9382 ComponentEnergyManager comp = GetCompEM();
9384 {
9386 }
9387 }
9389 {
9391
9392 }
9393
9394 }
9395 }
9396 }
9397
9400 {
9401 EntityAI parent = GetHierarchyParent();
9402
9403 if (parent)
9404 {
9405 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9406 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9407 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9408 }
9409 }
9410
9413 {
9414 EntityAI parent = GetHierarchyParent();
9415
9416 if (parent)
9417 {
9418 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9419 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9420 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9421 }
9422 }
9423
9425 {
9426
9427
9428
9429
9431
9433 {
9434 if (ScriptInputUserData.CanStoreInputUserData())
9435 {
9436 ScriptInputUserData ctx = new ScriptInputUserData;
9442 ctx.
Write(use_stack_max);
9445
9447 {
9448 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9449 }
9450 }
9451 }
9452 else if (!
GetGame().IsMultiplayer())
9453 {
9455 }
9456 }
9457
9459 {
9461 }
9462
9464 {
9466 }
9467
9469 {
9471 }
9472
9474 {
9475
9476 return false;
9477 }
9478
9480 {
9481 return false;
9482 }
9483
9487 {
9488 return false;
9489 }
9490
9492 {
9493 return "";
9494 }
9495
9497
9499 {
9500 return false;
9501 }
9502
9504 {
9505 return true;
9506 }
9507
9508
9509
9511 {
9512 return true;
9513 }
9514
9516 {
9517 return true;
9518 }
9519
9521 {
9522 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9524 }
9525
9527 {
9529 }
9530
9532 {
9534 if (!is_being_placed)
9536 SetSynchDirty();
9537 }
9538
9539
9541
9543 {
9545 }
9546
9548 {
9550 }
9551
9553 {
9554 return 1;
9555 }
9556
9558 {
9559 return false;
9560 }
9561
9563 {
9565 SetSynchDirty();
9566 }
9567
9568
9569
9570
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
9603 {
9604 super.OnMovedInsideCargo(container);
9605
9606 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9607 }
9608
9609 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9610 {
9611 super.EEItemLocationChanged(oldLoc,newLoc);
9612
9613 PlayerBase new_player = null;
9614 PlayerBase old_player = null;
9615
9616 if (newLoc.GetParent())
9617 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9618
9619 if (oldLoc.GetParent())
9620 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9621
9623 {
9624 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9625
9626 if (r_index >= 0)
9627 {
9628 InventoryLocation r_il = new InventoryLocation;
9629 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9630
9631 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9634 {
9635 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9636 }
9638 {
9639 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9640 }
9641
9642 }
9643 }
9644
9646 {
9647 if (new_player)
9648 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9649
9650 if (new_player == old_player)
9651 {
9652
9653 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9654 {
9656 {
9657 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9658 {
9659 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9660 }
9661 }
9662 else
9663 {
9664 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9665 }
9666 }
9667
9668 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9669 {
9670 int type = oldLoc.GetType();
9672 {
9673 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9674 }
9676 {
9677 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9678 }
9679 }
9680 if (!m_OldLocation)
9681 {
9682 m_OldLocation = new InventoryLocation;
9683 }
9684 m_OldLocation.Copy(oldLoc);
9685 }
9686 else
9687 {
9688 if (m_OldLocation)
9689 {
9690 m_OldLocation.Reset();
9691 }
9692 }
9693
9695 }
9696 else
9697 {
9698 if (new_player)
9699 {
9700 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9701 if (res_index >= 0)
9702 {
9703 InventoryLocation il = new InventoryLocation;
9704 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9706 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9709 {
9710 il.
GetParent().GetOnReleaseLock().Invoke(it);
9711 }
9713 {
9715 }
9716
9717 }
9718 }
9720 {
9721
9723 }
9724
9725 if (m_OldLocation)
9726 {
9727 m_OldLocation.Reset();
9728 }
9729 }
9730 }
9731
9732 override void EOnContact(IEntity other, Contact extra)
9733 {
9735 {
9736 int liquidType = -1;
9738 if (impactSpeed > 0.0)
9739 {
9741 #ifndef SERVER
9743 #else
9745 SetSynchDirty();
9746 #endif
9748 }
9749 }
9750
9751 #ifdef SERVER
9752 if (GetCompEM() && GetCompEM().IsPlugged())
9753 {
9754 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9755 GetCompEM().UnplugThis();
9756 }
9757 #endif
9758 }
9759
9761
9763 {
9765 }
9766
9768 {
9769
9770 }
9771
9773 {
9774 super.OnItemLocationChanged(old_owner, new_owner);
9775
9776 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9777 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9778
9779 if (!relatedPlayer && playerNew)
9780 relatedPlayer = playerNew;
9781
9782 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9783 {
9785 if (actionMgr)
9786 {
9787 ActionBase currentAction = actionMgr.GetRunningAction();
9788 if (currentAction)
9790 }
9791 }
9792
9793 Man ownerPlayerOld = null;
9794 Man ownerPlayerNew = null;
9795
9796 if (old_owner)
9797 {
9798 if (old_owner.
IsMan())
9799 {
9800 ownerPlayerOld = Man.Cast(old_owner);
9801 }
9802 else
9803 {
9804 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9805 }
9806 }
9807 else
9808 {
9810 {
9812
9813 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9814 {
9815 GetCompEM().UnplugThis();
9816 }
9817 }
9818 }
9819
9820 if (new_owner)
9821 {
9822 if (new_owner.
IsMan())
9823 {
9824 ownerPlayerNew = Man.Cast(new_owner);
9825 }
9826 else
9827 {
9828 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9829 }
9830 }
9831
9832 if (ownerPlayerOld != ownerPlayerNew)
9833 {
9834 if (ownerPlayerOld)
9835 {
9836 array<EntityAI> subItemsExit = new array<EntityAI>;
9838 for (int i = 0; i < subItemsExit.Count(); i++)
9839 {
9842 }
9843 }
9844
9845 if (ownerPlayerNew)
9846 {
9847 array<EntityAI> subItemsEnter = new array<EntityAI>;
9849 for (int j = 0; j < subItemsEnter.Count(); j++)
9850 {
9853 }
9854 }
9855 }
9856 else if (ownerPlayerNew != null)
9857 {
9858 PlayerBase nplayer;
9859 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9860 {
9861 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9863 for (int k = 0; k < subItemsUpdate.Count(); k++)
9864 {
9866 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9867 }
9868 }
9869 }
9870
9871 if (old_owner)
9872 old_owner.OnChildItemRemoved(this);
9873 if (new_owner)
9874 new_owner.OnChildItemReceived(this);
9875 }
9876
9877
9879 {
9880 super.EEDelete(parent);
9881 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9882 if (player)
9883 {
9885
9886 if (player.IsAlive())
9887 {
9888 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9889 if (r_index >= 0)
9890 {
9891 InventoryLocation r_il = new InventoryLocation;
9892 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9893
9894 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9897 {
9898 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9899 }
9901 {
9902 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9903 }
9904
9905 }
9906
9907 player.RemoveQuickBarEntityShortcut(this);
9908 }
9909 }
9910 }
9911
9913 {
9914 super.EEKilled(killer);
9915
9918 {
9919 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9920 {
9921 if (IsMagazine())
9922 {
9923 if (Magazine.Cast(this).GetAmmoCount() > 0)
9924 {
9926 }
9927 }
9928 else
9929 {
9931 }
9932 }
9933 }
9934 }
9935
9937 {
9938 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9939
9940 super.OnWasAttached(parent, slot_id);
9941
9944
9946 }
9947
9949 {
9950 super.OnWasDetached(parent, slot_id);
9951
9954 }
9955
9957 {
9958 int idx;
9961
9962 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9963 if (inventory_slots.Count() < 1)
9964 {
9965 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9966 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9967 }
9968 else
9969 {
9970 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9971 }
9972
9973 idx = inventory_slots.Find(slot);
9974 if (idx < 0)
9975 return "";
9976
9977 return attach_types.Get(idx);
9978 }
9979
9981 {
9982 int idx = -1;
9983 string slot;
9984
9987
9988 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9989 if (inventory_slots.Count() < 1)
9990 {
9991 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9992 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9993 }
9994 else
9995 {
9996 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9997 if (detach_types.Count() < 1)
9998 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9999 }
10000
10001 for (int i = 0; i < inventory_slots.Count(); i++)
10002 {
10003 slot = inventory_slots.Get(i);
10004 }
10005
10006 if (slot != "")
10007 {
10008 if (detach_types.Count() == 1)
10009 idx = 0;
10010 else
10011 idx = inventory_slots.Find(slot);
10012 }
10013 if (idx < 0)
10014 return "";
10015
10016 return detach_types.Get(idx);
10017 }
10018
10020 {
10021
10023
10024
10025 float min_time = 1;
10026 float max_time = 3;
10027 float delay = Math.RandomFloat(min_time, max_time);
10028
10029 explode_timer.Run(delay, this, "DoAmmoExplosion");
10030 }
10031
10033 {
10034 Magazine magazine = Magazine.Cast(this);
10035 int pop_sounds_count = 6;
10036 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10037
10038
10039 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10040 string sound_name = pop_sounds[ sound_idx ];
10042
10043
10044 magazine.ServerAddAmmoCount(-1);
10045
10046
10047 float min_temp_to_explode = 100;
10048
10049 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10050 {
10052 }
10053 }
10054
10055
10056 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10057 {
10058 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10059
10060 const int CHANCE_DAMAGE_CARGO = 4;
10061 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10062 const int CHANCE_DAMAGE_NOTHING = 2;
10063
10065 {
10066 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10067 int chances;
10068 int rnd;
10069
10070 if (GetInventory().GetCargo())
10071 {
10072 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10073 rnd = Math.RandomInt(0,chances);
10074
10075 if (rnd < CHANCE_DAMAGE_CARGO)
10076 {
10078 }
10079 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10080 {
10082 }
10083 }
10084 else
10085 {
10086 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10087 rnd = Math.RandomInt(0,chances);
10088
10089 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10090 {
10092 }
10093 }
10094 }
10095 }
10096
10098 {
10099 if (GetInventory().GetCargo())
10100 {
10101 int item_count = GetInventory().GetCargo().GetItemCount();
10102 if (item_count > 0)
10103 {
10104 int random_pick = Math.RandomInt(0, item_count);
10106 if (!item.IsExplosive())
10107 {
10108 item.AddHealth("","",damage);
10109 return true;
10110 }
10111 }
10112 }
10113 return false;
10114 }
10115
10117 {
10118 int attachment_count = GetInventory().AttachmentCount();
10119 if (attachment_count > 0)
10120 {
10121 int random_pick = Math.RandomInt(0, attachment_count);
10122 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10123 if (!attachment.IsExplosive())
10124 {
10125 attachment.AddHealth("","",damage);
10126 return true;
10127 }
10128 }
10129 return false;
10130 }
10131
10133 {
10135 }
10136
10138 {
10140 return GetInventory().CanRemoveEntity();
10141
10142 return false;
10143 }
10144
10146 {
10147
10149 return false;
10150
10151
10153 return false;
10154
10155
10156
10158 if (delta == 0)
10159 return false;
10160
10161
10162 return true;
10163 }
10164
10166 {
10168 {
10169 if (ScriptInputUserData.CanStoreInputUserData())
10170 {
10171 ScriptInputUserData ctx = new ScriptInputUserData;
10176 ctx.
Write(destination_entity);
10178 ctx.
Write(slot_id);
10180 }
10181 }
10182 else if (!
GetGame().IsMultiplayer())
10183 {
10185 }
10186 }
10187
10189 {
10190 float split_quantity_new;
10194 InventoryLocation loc = new InventoryLocation;
10195
10196 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10197 {
10199 split_quantity_new = stack_max;
10200 else
10202
10204 {
10205 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10206 if (new_item)
10207 {
10208 new_item.SetResultOfSplit(true);
10209 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10211 new_item.
SetQuantity(split_quantity_new,
false,
true);
10212 }
10213 }
10214 }
10215 else if (destination_entity && slot_id == -1)
10216 {
10217 if (quantity > stack_max)
10218 split_quantity_new = stack_max;
10219 else
10220 split_quantity_new = quantity;
10221
10223 {
10225 {
10228 }
10229
10230 if (new_item)
10231 {
10232 new_item.SetResultOfSplit(true);
10233 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10235 new_item.
SetQuantity(split_quantity_new,
false,
true);
10236 }
10237 }
10238 }
10239 else
10240 {
10241 if (stack_max != 0)
10242 {
10244 {
10246 }
10247
10248 if (split_quantity_new == 0)
10249 {
10250 if (!
GetGame().IsMultiplayer())
10251 player.PhysicalPredictiveDropItem(this);
10252 else
10253 player.ServerDropEntity(this);
10254 return;
10255 }
10256
10258 {
10260
10261 if (new_item)
10262 {
10263 new_item.SetResultOfSplit(true);
10264 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10267 new_item.PlaceOnSurface();
10268 }
10269 }
10270 }
10271 }
10272 }
10273
10275 {
10276 float split_quantity_new;
10280 InventoryLocation loc = new InventoryLocation;
10281
10282 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10283 {
10285 split_quantity_new = stack_max;
10286 else
10288
10290 {
10291 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10292 if (new_item)
10293 {
10294 new_item.SetResultOfSplit(true);
10295 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10297 new_item.
SetQuantity(split_quantity_new,
false,
true);
10298 }
10299 }
10300 }
10301 else if (destination_entity && slot_id == -1)
10302 {
10303 if (quantity > stack_max)
10304 split_quantity_new = stack_max;
10305 else
10306 split_quantity_new = quantity;
10307
10309 {
10311 {
10314 }
10315
10316 if (new_item)
10317 {
10318 new_item.SetResultOfSplit(true);
10319 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10321 new_item.
SetQuantity(split_quantity_new,
false,
true);
10322 }
10323 }
10324 }
10325 else
10326 {
10327 if (stack_max != 0)
10328 {
10330 {
10332 }
10333
10335 {
10337
10338 if (new_item)
10339 {
10340 new_item.SetResultOfSplit(true);
10341 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10344 new_item.PlaceOnSurface();
10345 }
10346 }
10347 }
10348 }
10349 }
10350
10352 {
10354 {
10355 if (ScriptInputUserData.CanStoreInputUserData())
10356 {
10357 ScriptInputUserData ctx = new ScriptInputUserData;
10362 dst.WriteToContext(ctx);
10364 }
10365 }
10366 else if (!
GetGame().IsMultiplayer())
10367 {
10369 }
10370 }
10371
10373 {
10375 {
10376 if (ScriptInputUserData.CanStoreInputUserData())
10377 {
10378 ScriptInputUserData ctx = new ScriptInputUserData;
10383 ctx.
Write(destination_entity);
10389 }
10390 }
10391 else if (!
GetGame().IsMultiplayer())
10392 {
10394 }
10395 }
10396
10398 {
10400 }
10401
10403 {
10405 float split_quantity_new;
10407 if (dst.IsValid())
10408 {
10409 int slot_id = dst.GetSlot();
10411
10412 if (quantity > stack_max)
10413 split_quantity_new = stack_max;
10414 else
10415 split_quantity_new = quantity;
10416
10418 {
10420
10421 if (new_item)
10422 {
10423 new_item.SetResultOfSplit(true);
10424 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10426 new_item.
SetQuantity(split_quantity_new,
false,
true);
10427 }
10428
10429 return new_item;
10430 }
10431 }
10432
10433 return null;
10434 }
10435
10437 {
10439 float split_quantity_new;
10441 if (destination_entity)
10442 {
10444 if (quantity > stackable)
10445 split_quantity_new = stackable;
10446 else
10447 split_quantity_new = quantity;
10448
10450 {
10451 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10452 if (new_item)
10453 {
10454 new_item.SetResultOfSplit(true);
10455 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10457 new_item.
SetQuantity(split_quantity_new,
false,
true);
10458 }
10459 }
10460 }
10461 }
10462
10464 {
10466 {
10467 if (ScriptInputUserData.CanStoreInputUserData())
10468 {
10469 ScriptInputUserData ctx = new ScriptInputUserData;
10474 ItemBase destination_entity =
this;
10475 ctx.
Write(destination_entity);
10479 }
10480 }
10481 else if (!
GetGame().IsMultiplayer())
10482 {
10484 }
10485 }
10486
10488 {
10490 float split_quantity_new;
10492 if (player)
10493 {
10495 if (quantity > stackable)
10496 split_quantity_new = stackable;
10497 else
10498 split_quantity_new = quantity;
10499
10501 {
10502 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10503 new_item =
ItemBase.Cast(in_hands);
10504 if (new_item)
10505 {
10506 new_item.SetResultOfSplit(true);
10507 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10509 new_item.SetQuantity(split_quantity_new, false, true);
10510 }
10511 }
10512 }
10513 }
10514
10516 {
10518 float split_quantity_new = Math.Floor(quantity * 0.5);
10519
10521 return;
10522
10524
10525 if (new_item)
10526 {
10527 if (new_item.GetQuantityMax() < split_quantity_new)
10528 {
10529 split_quantity_new = new_item.GetQuantityMax();
10530 }
10531
10532 new_item.SetResultOfSplit(true);
10533 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10534
10536 {
10539 }
10540 else
10541 {
10543 new_item.
SetQuantity(split_quantity_new,
false,
true);
10544 }
10545 }
10546 }
10547
10549 {
10551 float split_quantity_new = Math.Floor(quantity / 2);
10552
10554 return;
10555
10556 InventoryLocation invloc = new InventoryLocation;
10558
10560 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10561
10562 if (new_item)
10563 {
10564 if (new_item.GetQuantityMax() < split_quantity_new)
10565 {
10566 split_quantity_new = new_item.GetQuantityMax();
10567 }
10569 {
10572 }
10573 else if (split_quantity_new > 1)
10574 {
10576 new_item.
SetQuantity(split_quantity_new,
false,
true);
10577 }
10578 }
10579 }
10580
10583 {
10584 SetWeightDirty();
10586
10587 if (parent)
10588 parent.OnAttachmentQuantityChangedEx(this, delta);
10589
10591 {
10593 {
10595 }
10597 {
10598 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10600 }
10601 }
10602
10603 }
10604
10607 {
10608
10609 }
10610
10613 {
10615 }
10616
10618 {
10619 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10620
10622 {
10623 if (newLevel == GameConstants.STATE_RUINED)
10624 {
10626 EntityAI parent = GetHierarchyParent();
10627 if (parent && parent.IsFireplace())
10628 {
10629 CargoBase cargo = GetInventory().GetCargo();
10630 if (cargo)
10631 {
10633 {
10635 }
10636 }
10637 }
10638 }
10639
10641 {
10642
10644 return;
10645 }
10646
10647 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10648 {
10650 }
10651 }
10652 }
10653
10654
10656 {
10657 super.OnRightClick();
10658
10660 {
10662 {
10663 if (ScriptInputUserData.CanStoreInputUserData())
10664 {
10665 EntityAI root = GetHierarchyRoot();
10666 Man playerOwner = GetHierarchyRootPlayer();
10667 InventoryLocation dst = new InventoryLocation;
10668
10669
10670 if (!playerOwner && root && root == this)
10671 {
10673 }
10674 else
10675 {
10676
10677 GetInventory().GetCurrentInventoryLocation(dst);
10679 {
10682 {
10684 }
10685 else
10686 {
10688
10689
10690 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10691 {
10693 }
10694 else
10695 {
10696 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10697 }
10698 }
10699 }
10700 }
10701
10702 ScriptInputUserData ctx = new ScriptInputUserData;
10710 }
10711 }
10712 else if (!
GetGame().IsMultiplayer())
10713 {
10715 }
10716 }
10717 }
10718
10720 {
10721 if (root)
10722 {
10723 vector m4[4];
10724 root.GetTransform(m4);
10725 dst.SetGround(this, m4);
10726 }
10727 else
10728 {
10729 GetInventory().GetCurrentInventoryLocation(dst);
10730 }
10731 }
10732
10733 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10734 {
10735
10736 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10737 return false;
10738
10739 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10740 return false;
10741
10742
10744 return false;
10745
10746
10747 Magazine mag = Magazine.Cast(this);
10748 if (mag)
10749 {
10750 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10751 return false;
10752
10753 if (stack_max_limit)
10754 {
10755 Magazine other_mag = Magazine.Cast(other_item);
10756 if (other_item)
10757 {
10758 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10759 return false;
10760 }
10761
10762 }
10763 }
10764 else
10765 {
10766
10768 return false;
10769
10771 return false;
10772 }
10773
10774 PlayerBase player = null;
10775 if (CastTo(player, GetHierarchyRootPlayer()))
10776 {
10777 if (player.GetInventory().HasAttachment(this))
10778 return false;
10779
10780 if (player.IsItemsToDelete())
10781 return false;
10782 }
10783
10784 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10785 return false;
10786
10787 int slotID;
10789 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10790 return false;
10791
10792 return true;
10793 }
10794
10796 {
10798 }
10799
10801 {
10802 return m_IsResultOfSplit;
10803 }
10804
10806 {
10807 m_IsResultOfSplit = value;
10808 }
10809
10811 {
10813 }
10814
10816 {
10817 float other_item_quantity = other_item.GetQuantity();
10818 float this_free_space;
10819
10821
10823
10824 if (other_item_quantity > this_free_space)
10825 {
10826 return this_free_space;
10827 }
10828 else
10829 {
10830 return other_item_quantity;
10831 }
10832 }
10833
10835 {
10837 }
10838
10840 {
10842 return;
10843
10844 if (!IsMagazine() && other_item)
10845 {
10847 if (quantity_used != 0)
10848 {
10849 float hp1 = GetHealth01("","");
10850 float hp2 = other_item.GetHealth01("","");
10851 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10852 hpResult = hpResult / (
GetQuantity() + quantity_used);
10853
10854 hpResult *= GetMaxHealth();
10855 Math.Round(hpResult);
10856 SetHealth("", "Health", hpResult);
10857
10859 other_item.AddQuantity(-quantity_used);
10860 }
10861 }
10863 }
10864
10866 {
10867 #ifdef SERVER
10868 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10869 GetHierarchyParent().IncreaseLifetimeUp();
10870 #endif
10871 };
10872
10874 {
10875 PlayerBase p = PlayerBase.Cast(player);
10876
10877 array<int> recipesIds = p.m_Recipes;
10878 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10879 if (moduleRecipesManager)
10880 {
10881 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10882 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10883 }
10884
10885 for (int i = 0;i < recipesIds.Count(); i++)
10886 {
10887 int key = recipesIds.Get(i);
10888 string recipeName = moduleRecipesManager.GetRecipeName(key);
10890 }
10891 }
10892
10893
10894 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10895 {
10896 super.GetDebugActions(outputList);
10897
10898
10904
10905
10910
10915
10916
10920
10921
10923 {
10927 }
10928
10931
10932
10936
10938
10939 InventoryLocation loc = new InventoryLocation();
10940 GetInventory().GetCurrentInventoryLocation(loc);
10942 {
10943 if (Gizmo_IsSupported())
10946 }
10947
10949 }
10950
10951
10952
10953
10955 {
10956 super.OnAction(action_id, player, ctx);
10957
10959 {
10960 switch (action_id)
10961 {
10964 return true;
10967 return true;
10968 }
10969 }
10970
10972 {
10973 switch (action_id)
10974 {
10976 Delete();
10977 return true;
10978 }
10979 }
10980
10981 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10982 {
10983 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10984 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10985 PlayerBase p = PlayerBase.Cast(player);
10986 if (
EActions.RECIPES_RANGE_START < 1000)
10987 {
10988 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10989 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10990 }
10991 }
10992 #ifndef SERVER
10993 else if (action_id ==
EActions.WATCH_PLAYER)
10994 {
10995 PluginDeveloper.SetDeveloperItemClientEx(player);
10996 }
10997 #endif
10999 {
11000 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11001 {
11002 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11003 OnDebugButtonPressServer(id + 1);
11004 }
11005
11006 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11007 {
11008 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11010 }
11011
11012 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11013 {
11014 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11016 }
11017
11018 else if (action_id ==
EActions.ADD_QUANTITY)
11019 {
11020 if (IsMagazine())
11021 {
11022 Magazine mag = Magazine.Cast(this);
11023 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11024 }
11025 else
11026 {
11028 }
11029
11030 if (m_EM)
11031 {
11032 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11033 }
11034
11035 }
11036
11037 else if (action_id ==
EActions.REMOVE_QUANTITY)
11038 {
11039 if (IsMagazine())
11040 {
11041 Magazine mag2 = Magazine.Cast(this);
11042 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11043 }
11044 else
11045 {
11047 }
11048 if (m_EM)
11049 {
11050 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11051 }
11052
11053 }
11054
11055 else if (action_id ==
EActions.SET_QUANTITY_0)
11056 {
11058
11059 if (m_EM)
11060 {
11061 m_EM.SetEnergy(0);
11062 }
11063 }
11064
11065 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11066 {
11068
11069 if (m_EM)
11070 {
11071 m_EM.SetEnergy(m_EM.GetEnergyMax());
11072 }
11073 }
11074
11075 else if (action_id ==
EActions.ADD_HEALTH)
11076 {
11077 AddHealth("","",GetMaxHealth("","Health")/5);
11078 }
11079 else if (action_id ==
EActions.REMOVE_HEALTH)
11080 {
11081 AddHealth("","",-GetMaxHealth("","Health")/5);
11082 }
11083 else if (action_id ==
EActions.DESTROY_HEALTH)
11084 {
11085 SetHealth01("","",0);
11086 }
11087 else if (action_id ==
EActions.WATCH_ITEM)
11088 {
11090 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11091 #ifdef DEVELOPER
11092 SetDebugDeveloper_item(this);
11093 #endif
11094 }
11095
11096 else if (action_id ==
EActions.ADD_TEMPERATURE)
11097 {
11098 AddTemperature(20);
11099
11100 }
11101
11102 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11103 {
11104 AddTemperature(-20);
11105
11106 }
11107
11108 else if (action_id ==
EActions.FLIP_FROZEN)
11109 {
11110 SetFrozen(!GetIsFrozen());
11111
11112 }
11113
11114 else if (action_id ==
EActions.ADD_WETNESS)
11115 {
11117
11118 }
11119
11120 else if (action_id ==
EActions.REMOVE_WETNESS)
11121 {
11123
11124 }
11125
11126 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11127 {
11130
11131
11132 }
11133
11134 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11135 {
11138 }
11139
11140 else if (action_id ==
EActions.MAKE_SPECIAL)
11141 {
11142 auto debugParams = DebugSpawnParams.WithPlayer(player);
11143 OnDebugSpawnEx(debugParams);
11144 }
11145
11146 }
11147
11148
11149 return false;
11150 }
11151
11152
11153
11154
11158
11161
11162
11163
11165 {
11166 return false;
11167 }
11168
11169
11171 {
11172 return true;
11173 }
11174
11175
11177 {
11178 return true;
11179 }
11180
11181
11182
11184 {
11185 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11187 }
11188
11191 {
11192 return null;
11193 }
11194
11196 {
11197 return false;
11198 }
11199
11201 {
11202 return false;
11203 }
11204
11208
11209
11211 {
11212 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11213 return module_repairing.CanRepair(this, item_repair_kit);
11214 }
11215
11216
11217 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11218 {
11219 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11220 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11221 }
11222
11223
11225 {
11226
11227
11228
11229
11230
11231
11232
11233
11234 return 1;
11235 }
11236
11237
11238
11240 {
11242 }
11243
11244
11245
11247 {
11249 }
11250
11251
11260 {
11261 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11262
11263 if (player)
11264 {
11265 player.MessageStatus(text);
11266 }
11267 }
11268
11269
11278 {
11279 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11280
11281 if (player)
11282 {
11283 player.MessageAction(text);
11284 }
11285 }
11286
11287
11296 {
11297 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11298
11299 if (player)
11300 {
11301 player.MessageFriendly(text);
11302 }
11303 }
11304
11305
11314 {
11315 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11316
11317 if (player)
11318 {
11319 player.MessageImportant(text);
11320 }
11321 }
11322
11324 {
11325 return true;
11326 }
11327
11328
11329 override bool KindOf(
string tag)
11330 {
11331 bool found = false;
11332 string item_name = this.
GetType();
11335
11336 int array_size = item_tag_array.Count();
11337 for (int i = 0; i < array_size; i++)
11338 {
11339 if (item_tag_array.Get(i) == tag)
11340 {
11341 found = true;
11342 break;
11343 }
11344 }
11345 return found;
11346 }
11347
11348
11350 {
11351
11352 super.OnRPC(sender, rpc_type,ctx);
11353
11354
11355 switch (rpc_type)
11356 {
11357 #ifndef SERVER
11358 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11359 Param2<bool, string> p = new Param2<bool, string>(false, "");
11360
11362 return;
11363
11364 bool play = p.param1;
11365 string soundSet = p.param2;
11366
11367 if (play)
11368 {
11370 {
11372 {
11374 }
11375 }
11376 else
11377 {
11379 }
11380 }
11381 else
11382 {
11384 }
11385
11386 break;
11387 #endif
11388
11389 }
11390
11392 {
11394 }
11395 }
11396
11397
11398
11399
11401 {
11402 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11403 return plugin.GetID(
name);
11404 }
11405
11407 {
11408 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11409 return plugin.GetName(id);
11410 }
11411
11414 {
11415
11416
11417 int varFlags;
11418 if (!ctx.
Read(varFlags))
11419 return;
11420
11421 if (varFlags & ItemVariableFlags.FLOAT)
11422 {
11424 }
11425 }
11426
11428 {
11429
11430 super.SerializeNumericalVars(floats_out);
11431
11432
11433
11435 {
11437 }
11438
11440 {
11442 }
11443
11445 {
11447 }
11448
11450 {
11455 }
11456
11458 {
11460 }
11461 }
11462
11464 {
11465
11466 super.DeSerializeNumericalVars(floats);
11467
11468
11469 int index = 0;
11470 int mask = Math.Round(floats.Get(index));
11471
11472 index++;
11473
11475 {
11477 {
11479 }
11480 else
11481 {
11482 float quantity = floats.Get(index);
11483 SetQuantity(quantity,
true,
false,
false,
false);
11484 }
11485 index++;
11486 }
11487
11489 {
11490 float wet = floats.Get(index);
11492 index++;
11493 }
11494
11496 {
11497 int liquidtype = Math.Round(floats.Get(index));
11499 index++;
11500 }
11501
11503 {
11505 index++;
11507 index++;
11509 index++;
11511 index++;
11512 }
11513
11515 {
11516 int cleanness = Math.Round(floats.Get(index));
11518 index++;
11519 }
11520 }
11521
11523 {
11524 super.WriteVarsToCTX(ctx);
11525
11526
11528 {
11530 }
11531
11533 {
11535 }
11536
11538 {
11540 }
11541
11543 {
11544 int r,g,b,a;
11550 }
11551
11553 {
11555 }
11556 }
11557
11559 {
11560 if (!super.ReadVarsFromCTX(ctx,version))
11561 return false;
11562
11563 int intValue;
11564 float value;
11565
11566 if (version < 140)
11567 {
11568 if (!ctx.
Read(intValue))
11569 return false;
11570
11571 m_VariablesMask = intValue;
11572 }
11573
11575 {
11576 if (!ctx.
Read(value))
11577 return false;
11578
11580 {
11582 }
11583 else
11584 {
11586 }
11587 }
11588
11589 if (version < 140)
11590 {
11592 {
11593 if (!ctx.
Read(value))
11594 return false;
11595 SetTemperatureDirect(value);
11596 }
11597 }
11598
11600 {
11601 if (!ctx.
Read(value))
11602 return false;
11604 }
11605
11607 {
11608 if (!ctx.
Read(intValue))
11609 return false;
11611 }
11612
11614 {
11615 int r,g,b,a;
11617 return false;
11619 return false;
11621 return false;
11623 return false;
11624
11626 }
11627
11629 {
11630 if (!ctx.
Read(intValue))
11631 return false;
11633 }
11634
11635 if (version >= 138 && version < 140)
11636 {
11638 {
11639 if (!ctx.
Read(intValue))
11640 return false;
11641 SetFrozen(intValue);
11642 }
11643 }
11644
11645 return true;
11646 }
11647
11648
11650 {
11653 {
11655 }
11656
11657 if (!super.OnStoreLoad(ctx, version))
11658 {
11660 return false;
11661 }
11662
11663 if (version >= 114)
11664 {
11665 bool hasQuickBarIndexSaved;
11666
11667 if (!ctx.
Read(hasQuickBarIndexSaved))
11668 {
11670 return false;
11671 }
11672
11673 if (hasQuickBarIndexSaved)
11674 {
11675 int itmQBIndex;
11676
11677
11678 if (!ctx.
Read(itmQBIndex))
11679 {
11681 return false;
11682 }
11683
11684 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11685 if (itmQBIndex != -1 && parentPlayer)
11686 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11687 }
11688 }
11689 else
11690 {
11691
11692 PlayerBase player;
11693 int itemQBIndex;
11694 if (version ==
int.
MAX)
11695 {
11696 if (!ctx.
Read(itemQBIndex))
11697 {
11699 return false;
11700 }
11701 }
11702 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11703 {
11704
11705 if (!ctx.
Read(itemQBIndex))
11706 {
11708 return false;
11709 }
11710 if (itemQBIndex != -1 && player)
11711 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11712 }
11713 }
11714
11715 if (version < 140)
11716 {
11717
11718 if (!LoadVariables(ctx, version))
11719 {
11721 return false;
11722 }
11723 }
11724
11725
11727 {
11729 return false;
11730 }
11731 if (version >= 132)
11732 {
11734 if (raib)
11735 {
11737 {
11739 return false;
11740 }
11741 }
11742 }
11743
11745 return true;
11746 }
11747
11748
11749
11751 {
11752 super.OnStoreSave(ctx);
11753
11754 PlayerBase player;
11755 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11756 {
11758
11759 int itemQBIndex = -1;
11760 itemQBIndex = player.FindQuickBarEntityIndex(this);
11761 ctx.
Write(itemQBIndex);
11762 }
11763 else
11764 {
11766 }
11767
11769
11771 if (raib)
11772 {
11774 }
11775 }
11776
11777
11779 {
11780 super.AfterStoreLoad();
11781
11783 {
11785 }
11786
11788 {
11791 }
11792 }
11793
11795 {
11796 super.EEOnAfterLoad();
11797
11799 {
11801 }
11802
11805 }
11806
11808 {
11809 return false;
11810 }
11811
11812
11813
11815 {
11817 {
11818 #ifdef PLATFORM_CONSOLE
11819
11821 {
11823 if (menu)
11824 {
11826 }
11827 }
11828 #endif
11829 }
11830
11832 {
11835 }
11836
11838 {
11839 SetWeightDirty();
11841 }
11843 {
11846 }
11847
11849 {
11852 }
11854 {
11857 }
11858
11859 super.OnVariablesSynchronized();
11860 }
11861
11862
11863
11865 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11866 {
11867 if (!IsServerCheck(allow_client))
11868 return false;
11869
11871 return false;
11872
11875
11876 if (value <= (min + 0.001))
11877 value = min;
11878
11879 if (value == min)
11880 {
11881 if (destroy_config)
11882 {
11883 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11884 if (dstr)
11885 {
11887 this.Delete();
11888 return true;
11889 }
11890 }
11891 else if (destroy_forced)
11892 {
11894 this.Delete();
11895 return true;
11896 }
11897
11899 }
11900
11903
11905 {
11907
11908 if (delta)
11910 }
11911
11913
11914 return false;
11915 }
11916
11917
11919 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11920 {
11922 }
11923
11925 {
11928 }
11929
11931 {
11934 }
11935
11937 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11938 {
11939 float value_clamped = Math.Clamp(value, 0, 1);
11941 SetQuantity(result, destroy_config, destroy_forced);
11942 }
11943
11944
11947 {
11949 }
11950
11952 {
11954 }
11955
11956
11957
11958
11959
11960
11961
11962
11963
11964
11966 {
11967 int slot = -1;
11968 if (GetInventory())
11969 {
11970 InventoryLocation il = new InventoryLocation;
11971 GetInventory().GetCurrentInventoryLocation(il);
11973 }
11974
11976 }
11977
11979 {
11980 float quantity_max = 0;
11981
11983 {
11984 if (attSlotID != -1)
11985 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11986
11987 if (quantity_max <= 0)
11989 }
11990
11991 if (quantity_max <= 0)
11993
11994 return quantity_max;
11995 }
11996
11998 {
12000 }
12001
12003 {
12005 }
12006
12007
12009 {
12011 }
12012
12014 {
12016 }
12017
12019 {
12021 }
12022
12023
12025 {
12026
12027 float weightEx = GetWeightEx();
12028 float special = GetInventoryAndCargoWeight();
12029 return weightEx - special;
12030 }
12031
12032
12034 {
12036 }
12037
12039 {
12041 {
12042 #ifdef DEVELOPER
12043 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12044 {
12045 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12047 }
12048 #endif
12049
12050 return GetQuantity() * GetConfigWeightModified();
12051 }
12052 else if (HasEnergyManager())
12053 {
12054 #ifdef DEVELOPER
12055 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12056 {
12057 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12058 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12059 }
12060 #endif
12061 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12062 }
12063 else
12064 {
12065 #ifdef DEVELOPER
12066 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12067 {
12068 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12069 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12070 }
12071 #endif
12072 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12073 }
12074 }
12075
12078 {
12079 int item_count = 0;
12081
12082 if (GetInventory().GetCargo() != NULL)
12083 {
12084 item_count = GetInventory().GetCargo().GetItemCount();
12085 }
12086
12087 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12088 {
12089 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12090 if (item)
12091 item_count += item.GetNumberOfItems();
12092 }
12093 return item_count;
12094 }
12095
12098 {
12099 float weight = 0;
12100 float wetness = 1;
12101 if (include_wetness)
12104 {
12105 weight = wetness * m_ConfigWeight;
12106 }
12108 {
12109 weight = 1;
12110 }
12111 return weight;
12112 }
12113
12114
12115
12117 {
12118 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12119 {
12120 GameInventory inv = GetInventory();
12121 array<EntityAI> items = new array<EntityAI>;
12123 for (int i = 0; i < items.Count(); i++)
12124 {
12126 if (item)
12127 {
12129 }
12130 }
12131 }
12132 }
12133
12134
12135
12136
12138 {
12139 float energy = 0;
12140 if (HasEnergyManager())
12141 {
12142 energy = GetCompEM().GetEnergy();
12143 }
12144 return energy;
12145 }
12146
12147
12149 {
12150 super.OnEnergyConsumed();
12151
12153 }
12154
12156 {
12157 super.OnEnergyAdded();
12158
12160 }
12161
12162
12164 {
12165 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12166 {
12168 {
12169 float energy_0to1 = GetCompEM().GetEnergy0To1();
12171 }
12172 }
12173 }
12174
12175
12177 {
12178 return ConfigGetFloat("heatIsolation");
12179 }
12180
12182 {
12184 }
12185
12187 {
12188 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12189 if (
GetGame().ConfigIsExisting(paramPath))
12191
12192 return 0.0;
12193 }
12194
12196 {
12197 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12198 if (
GetGame().ConfigIsExisting(paramPath))
12200
12201 return 0.0;
12202 }
12203
12204 override void SetWet(
float value,
bool allow_client =
false)
12205 {
12206 if (!IsServerCheck(allow_client))
12207 return;
12208
12211
12213
12214 m_VarWet = Math.Clamp(value, min, max);
12215
12217 {
12220 }
12221 }
12222
12223 override void AddWet(
float value)
12224 {
12226 }
12227
12229 {
12231 }
12232
12234 {
12236 }
12237
12239 {
12241 }
12242
12244 {
12246 }
12247
12249 {
12251 }
12252
12253 override void OnWetChanged(
float newVal,
float oldVal)
12254 {
12257 if (newLevel != oldLevel)
12258 {
12260 }
12261 }
12262
12264 {
12265 SetWeightDirty();
12266 }
12267
12269 {
12270 return GetWetLevelInternal(
m_VarWet);
12271 }
12272
12273
12274
12276 {
12278 }
12279
12281 {
12283 }
12284
12286 {
12288 }
12289
12291 {
12293 }
12294
12295
12296
12298 {
12299 if (ConfigIsExisting("itemModelLength"))
12300 {
12301 return ConfigGetFloat("itemModelLength");
12302 }
12303 return 0;
12304 }
12305
12307 {
12308 if (ConfigIsExisting("itemAttachOffset"))
12309 {
12310 return ConfigGetFloat("itemAttachOffset");
12311 }
12312 return 0;
12313 }
12314
12315 override void SetCleanness(
int value,
bool allow_client =
false)
12316 {
12317 if (!IsServerCheck(allow_client))
12318 return;
12319
12321
12323
12326 }
12327
12329 {
12331 }
12332
12334 {
12335 return true;
12336 }
12337
12338
12339
12340
12342 {
12344 }
12345
12347 {
12349 }
12350
12351
12352
12353
12354 override void SetColor(
int r,
int g,
int b,
int a)
12355 {
12361 }
12363 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12364 {
12369 }
12370
12372 {
12374 }
12375
12378 {
12379 int r,g,b,a;
12381 r = r/255;
12382 g = g/255;
12383 b = b/255;
12384 a = a/255;
12385 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12386 }
12387
12388
12389
12390 override void SetLiquidType(
int value,
bool allow_client =
false)
12391 {
12392 if (!IsServerCheck(allow_client))
12393 return;
12394
12399 }
12400
12402 {
12403 return ConfigGetInt("varLiquidTypeInit");
12404 }
12405
12407 {
12409 }
12410
12412 {
12414 SetFrozen(false);
12415 }
12416
12419 {
12420 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12421 }
12422
12423
12426 {
12427 PlayerBase nplayer;
12428 if (PlayerBase.CastTo(nplayer, player))
12429 {
12431
12432 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12433 }
12434 }
12435
12436
12439 {
12440 PlayerBase nplayer;
12441 if (PlayerBase.CastTo(nplayer,player))
12442 {
12443
12444 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12445
12446 }
12447
12448
12449 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12450
12451
12452 if (HasEnergyManager())
12453 {
12454 GetCompEM().UpdatePlugState();
12455 }
12456 }
12457
12458
12460 {
12461 super.OnPlacementStarted(player);
12462
12464 }
12465
12466 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12467 {
12469 {
12470 m_AdminLog.OnPlacementComplete(player,
this);
12471 }
12472
12473 super.OnPlacementComplete(player, position, orientation);
12474 }
12475
12476
12477
12478
12479
12481 {
12483 {
12484 return true;
12485 }
12486 else
12487 {
12488 return false;
12489 }
12490 }
12491
12492
12494 {
12496 {
12498 }
12499 }
12500
12501
12503 {
12505 }
12506
12508 {
12510 }
12511
12512 override void InsertAgent(
int agent,
float count = 1)
12513 {
12514 if (count < 1)
12515 return;
12516
12518 }
12519
12522 {
12524 }
12525
12526
12528 {
12530 }
12531
12532
12533
12534
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
12574 {
12576 return false;
12577 return true;
12578 }
12579
12581 {
12582
12584 }
12585
12586
12589 {
12590 super.CheckForRoofLimited(timeTresholdMS);
12591
12593 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12594 {
12595 m_PreviousRoofTestTime = time;
12596 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12597 }
12598 }
12599
12600
12602 {
12604 {
12605 return 0;
12606 }
12607
12608 if (GetInventory().GetAttachmentSlotsCount() != 0)
12609 {
12610 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12611 if (filter)
12612 return filter.GetProtectionLevel(type, false, system);
12613 else
12614 return 0;
12615 }
12616
12617 string subclassPath, entryName;
12618
12619 switch (type)
12620 {
12622 entryName = "biological";
12623 break;
12625 entryName = "chemical";
12626 break;
12627 default:
12628 entryName = "biological";
12629 break;
12630 }
12631
12632 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12633
12635 }
12636
12637
12638
12641 {
12642 if (!IsMagazine())
12644
12646 }
12647
12648
12649
12650
12651
12656 {
12657 return true;
12658 }
12659
12661 {
12663 }
12664
12665
12666
12667
12668
12670 {
12671 if (parent)
12672 {
12673 if (parent.IsInherited(DayZInfected))
12674 return true;
12675
12676 if (!parent.IsRuined())
12677 return true;
12678 }
12679
12680 return true;
12681 }
12682
12684 {
12685 if (!super.CanPutAsAttachment(parent))
12686 {
12687 return false;
12688 }
12689
12690 if (!IsRuined() && !parent.IsRuined())
12691 {
12692 return true;
12693 }
12694
12695 return false;
12696 }
12697
12699 {
12700
12701
12702
12703
12704 return super.CanReceiveItemIntoCargo(item);
12705 }
12706
12708 {
12709
12710
12711
12712
12713 GameInventory attachmentInv = attachment.GetInventory();
12715 {
12716 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12717 return false;
12718 }
12719
12720 InventoryLocation loc = new InventoryLocation();
12721 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12722 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12723 return false;
12724
12725 return super.CanReceiveAttachment(attachment, slotId);
12726 }
12727
12729 {
12730 if (!super.CanReleaseAttachment(attachment))
12731 return false;
12732
12733 return GetInventory().AreChildrenAccessible();
12734 }
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12757 {
12758 int id = muzzle_owner.GetMuzzleID();
12759 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12760
12761 if (WPOF_array)
12762 {
12763 for (int i = 0; i < WPOF_array.Count(); i++)
12764 {
12765 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12766
12767 if (WPOF)
12768 {
12769 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12770 }
12771 }
12772 }
12773 }
12774
12775
12777 {
12778 int id = muzzle_owner.GetMuzzleID();
12780
12781 if (WPOBE_array)
12782 {
12783 for (int i = 0; i < WPOBE_array.Count(); i++)
12784 {
12785 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12786
12787 if (WPOBE)
12788 {
12789 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12790 }
12791 }
12792 }
12793 }
12794
12795
12797 {
12798 int id = muzzle_owner.GetMuzzleID();
12799 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12800
12801 if (WPOOH_array)
12802 {
12803 for (int i = 0; i < WPOOH_array.Count(); i++)
12804 {
12805 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12806
12807 if (WPOOH)
12808 {
12809 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12810 }
12811 }
12812 }
12813 }
12814
12815
12817 {
12818 int id = muzzle_owner.GetMuzzleID();
12819 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12820
12821 if (WPOOH_array)
12822 {
12823 for (int i = 0; i < WPOOH_array.Count(); i++)
12824 {
12825 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12826
12827 if (WPOOH)
12828 {
12829 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12830 }
12831 }
12832 }
12833 }
12834
12835
12837 {
12838 int id = muzzle_owner.GetMuzzleID();
12839 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12840
12841 if (WPOOH_array)
12842 {
12843 for (int i = 0; i < WPOOH_array.Count(); i++)
12844 {
12845 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12846
12847 if (WPOOH)
12848 {
12849 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12850 }
12851 }
12852 }
12853 }
12854
12855
12856
12858 {
12860 {
12861 return true;
12862 }
12863
12864 return false;
12865 }
12866
12868 {
12870 {
12871 return true;
12872 }
12873
12874 return false;
12875 }
12876
12878 {
12880 {
12881 return true;
12882 }
12883
12884 return false;
12885 }
12886
12888 {
12889 return false;
12890 }
12891
12894 {
12895 return UATimeSpent.DEFAULT_DEPLOY;
12896 }
12897
12898
12899
12900
12902 {
12904 SetSynchDirty();
12905 }
12906
12908 {
12910 }
12911
12912
12914 {
12915 return false;
12916 }
12917
12920 {
12921 string att_type = "None";
12922
12923 if (ConfigIsExisting("soundAttType"))
12924 {
12925 att_type = ConfigGetString("soundAttType");
12926 }
12927
12929 }
12930
12932 {
12934 }
12935
12936
12937
12938
12939
12945
12947 {
12950
12952 }
12953
12954
12956 {
12958 return;
12959
12961
12964
12967
12968 SoundParameters params = new SoundParameters();
12972 }
12973
12974
12976 {
12978 return;
12979
12981 SetSynchDirty();
12982
12985 }
12986
12987
12989 {
12991 return;
12992
12994 SetSynchDirty();
12995
12998 }
12999
13001 {
13003 }
13004
13006 {
13008 }
13009
13012 {
13013 if (!
GetGame().IsDedicatedServer())
13014 {
13015 if (ConfigIsExisting("attachSoundSet"))
13016 {
13017 string cfg_path = "";
13018 string soundset = "";
13019 string type_name =
GetType();
13020
13023 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13024 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13025
13026 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13027 {
13028 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13029 {
13030 if (cfg_slot_array[i] == slot_type)
13031 {
13032 soundset = cfg_soundset_array[i];
13033 break;
13034 }
13035 }
13036 }
13037
13038 if (soundset != "")
13039 {
13040 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13042 }
13043 }
13044 }
13045 }
13046
13048 {
13049
13050 }
13051
13052 void OnApply(PlayerBase player);
13053
13055 {
13056 return 1.0;
13057 };
13058
13060 {
13062 }
13063
13065 {
13067 }
13068
13070
13072 {
13073 SetDynamicPhysicsLifeTime(0.01);
13075 }
13076
13078 {
13079 array<string> zone_names = new array<string>;
13080 GetDamageZones(zone_names);
13081 for (int i = 0; i < zone_names.Count(); i++)
13082 {
13083 SetHealthMax(zone_names.Get(i),"Health");
13084 }
13085 SetHealthMax("","Health");
13086 }
13087
13090 {
13091 float global_health = GetHealth01("","Health");
13092 array<string> zones = new array<string>;
13093 GetDamageZones(zones);
13094
13095 for (int i = 0; i < zones.Count(); i++)
13096 {
13097 SetHealth01(zones.Get(i),"Health",global_health);
13098 }
13099 }
13100
13103 {
13104 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13105 }
13106
13108 {
13109 if (!hasRootAsPlayer)
13110 {
13111 if (refParentIB)
13112 {
13113
13114 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13115 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13116
13117 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13118 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13119
13122 }
13123 else
13124 {
13125
13128 }
13129 }
13130 }
13131
13133 {
13135 {
13136 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13137 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13138 {
13139 float heatPermCoef = 1.0;
13141 while (ent)
13142 {
13143 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13144 ent = ent.GetHierarchyParent();
13145 }
13146
13147 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13148 }
13149 }
13150 }
13151
13153 {
13154
13155 EntityAI parent = GetHierarchyParent();
13156 if (!parent)
13157 {
13158 hasParent = false;
13159 hasRootAsPlayer = false;
13160 }
13161 else
13162 {
13163 hasParent = true;
13164 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13165 refParentIB =
ItemBase.Cast(parent);
13166 }
13167 }
13168
13169 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13170 {
13171
13172 }
13173
13175 {
13176
13177 return false;
13178 }
13179
13181 {
13182
13183
13184 return false;
13185 }
13186
13188 {
13189
13190 return false;
13191 }
13192
13195 {
13196 return !GetIsFrozen() &&
IsOpen();
13197 }
13198
13200 {
13201 bool hasParent = false, hasRootAsPlayer = false;
13203
13204 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13205 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13206
13207 if (wwtu || foodDecay)
13208 {
13212
13213 if (processWetness || processTemperature || processDecay)
13214 {
13216
13217 if (processWetness)
13218 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13219
13220 if (processTemperature)
13222
13223 if (processDecay)
13224 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13225 }
13226 }
13227 }
13228
13231 {
13233 }
13234
13236 {
13239
13240 return super.GetTemperatureFreezeThreshold();
13241 }
13242
13244 {
13247
13248 return super.GetTemperatureThawThreshold();
13249 }
13250
13252 {
13255
13256 return super.GetItemOverheatThreshold();
13257 }
13258
13260 {
13262 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13263
13264 return super.GetTemperatureFreezeTime();
13265 }
13266
13268 {
13270 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13271
13272 return super.GetTemperatureThawTime();
13273 }
13274
13279
13281 {
13282 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13283 }
13284
13286 {
13287 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13288 }
13289
13292 {
13294 }
13295
13297 {
13299 }
13300
13302 {
13304 }
13305
13308 {
13309 return null;
13310 }
13311
13314 {
13315 return false;
13316 }
13317
13319 {
13321 {
13324 if (!trg)
13325 {
13327 explosive = this;
13328 }
13329
13330 explosive.PairRemote(trg);
13332
13333 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13334 trg.SetPersistentPairID(persistentID);
13335 explosive.SetPersistentPairID(persistentID);
13336
13337 return true;
13338 }
13339 return false;
13340 }
13341
13344 {
13345 float ret = 1.0;
13348 ret *= GetHealth01();
13349
13350 return ret;
13351 }
13352
13353 #ifdef DEVELOPER
13354 override void SetDebugItem()
13355 {
13356 super.SetDebugItem();
13357 _itemBase = this;
13358 }
13359
13361 {
13362 string text = super.GetDebugText();
13363
13365 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13366
13367 return text;
13368 }
13369 #endif
13370
13372 {
13373 return true;
13374 }
13375
13377
13379
13381 {
13384 }
13385
13386
13394
13410}
13411
13413{
13415 if (entity)
13416 {
13417 bool is_item = entity.IsInherited(
ItemBase);
13418 if (is_item && full_quantity)
13419 {
13422 }
13423 }
13424 else
13425 {
13427 return NULL;
13428 }
13429 return entity;
13430}
13431
13433{
13434 if (item)
13435 {
13436 if (health > 0)
13437 item.SetHealth("", "", health);
13438
13439 if (item.CanHaveTemperature())
13440 {
13442 if (item.CanFreeze())
13443 item.SetFrozen(false);
13444 }
13445
13446 if (item.HasEnergyManager())
13447 {
13448 if (quantity >= 0)
13449 {
13450 item.GetCompEM().SetEnergy0To1(quantity);
13451 }
13452 else
13453 {
13455 }
13456 }
13457 else if (item.IsMagazine())
13458 {
13459 Magazine mag = Magazine.Cast(item);
13460 if (quantity >= 0)
13461 {
13462 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13463 }
13464 else
13465 {
13467 }
13468
13469 }
13470 else
13471 {
13472 if (quantity >= 0)
13473 {
13474 item.SetQuantityNormalized(quantity, false);
13475 }
13476 else
13477 {
13479 }
13480
13481 }
13482 }
13483}
13484
13485#ifdef DEVELOPER
13487#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.