8650{
8652 {
8653 return true;
8654 }
8655};
8656
8657
8658
8660{
8664
8666
8669
8670
8671
8672
8673
8682
8688
8693
8698
8719 protected bool m_IsResultOfSplit
8720
8722
8727
8728
8729
8731
8735
8736
8737
8739
8742
8743
8744
8750
8751
8759
8762
8763
8765
8766
8768
8769
8774
8775
8780
8781
8783
8784
8786 {
8791
8792 if (!
GetGame().IsDedicatedServer())
8793 {
8795 {
8797
8799 {
8801 }
8802 }
8803
8806 }
8807
8808 m_OldLocation = null;
8809
8811 {
8813 }
8814
8815 if (ConfigIsExisting("headSelectionsToHide"))
8816 {
8819 }
8820
8822 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8823 {
8825 }
8826
8828
8829 m_IsResultOfSplit = false;
8830
8832 }
8833
8835 {
8836 super.InitItemVariables();
8837
8843 m_Count = ConfigGetInt(
"count");
8844
8847
8852
8855
8860
8872
8876
8877
8880 if (ConfigIsExisting("canBeSplit"))
8881 {
8884 }
8885
8887 if (ConfigIsExisting("itemBehaviour"))
8889
8890
8893 RegisterNetSyncVariableInt("m_VarLiquidType");
8894 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8895
8896 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8897 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8898 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8899
8900 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8901 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8902 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8903 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8904
8905 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8906 RegisterNetSyncVariableBool("m_IsTakeable");
8907 RegisterNetSyncVariableBool("m_IsHologram");
8908
8911 {
8914 }
8915
8917
8919 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8921
8922 }
8923
8925 {
8927 }
8928
8930 {
8933 {
8938 }
8939 }
8940
8941 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8942 {
8944 {
8947 }
8948
8950 }
8951
8953 {
8959 }
8960
8962
8964 {
8966
8967 if (!action)
8968 {
8969 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8970 return;
8971 }
8972
8974 if (!ai)
8975 {
8977 return;
8978 }
8979
8981 if (!action_array)
8982 {
8983 action_array = new array<ActionBase_Basic>;
8985 }
8986 if (LogManager.IsActionLogEnable())
8987 {
8988 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8989 }
8990
8991 if (action_array.Find(action) != -1)
8992 {
8993 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8994 }
8995 else
8996 {
8997 action_array.Insert(action);
8998 }
8999 }
9000
9002 {
9004 ActionBase action = player.GetActionManager().GetAction(actionName);
9007
9008 if (action_array)
9009 {
9010 action_array.RemoveItem(action);
9011 }
9012 }
9013
9014
9015
9017 {
9018 ActionOverrideData overrideData = new ActionOverrideData();
9022
9024 if (!actionMap)
9025 {
9028 }
9029
9030 actionMap.Insert(this.
Type(), overrideData);
9031
9032 }
9033
9035
9037
9038
9040 {
9043
9046
9047 string config_to_search = "CfgVehicles";
9048 string muzzle_owner_config;
9049
9051 {
9052 if (IsInherited(Weapon))
9053 config_to_search = "CfgWeapons";
9054
9055 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9056
9057 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9058
9060
9061 if (config_OnFire_subclass_count > 0)
9062 {
9063 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9064
9065 for (int i = 0; i < config_OnFire_subclass_count; i++)
9066 {
9067 string particle_class = "";
9069 string config_OnFire_entry = config_OnFire_class + particle_class;
9070 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9071 WPOF_array.Insert(WPOF);
9072 }
9073
9074
9076 }
9077 }
9078
9080 {
9081 config_to_search = "CfgWeapons";
9082 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9083
9084 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9085
9087
9088 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9089 {
9090 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9091
9092 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9093 {
9094 string particle_class2 = "";
9096 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9097 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9098 WPOBE_array.Insert(WPOBE);
9099 }
9100
9101
9103 }
9104 }
9105 }
9106
9107
9109 {
9112
9114 {
9115 string config_to_search = "CfgVehicles";
9116
9117 if (IsInherited(Weapon))
9118 config_to_search = "CfgWeapons";
9119
9120 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9121 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9122
9123 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9124 {
9125
9127
9129 {
9131 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9133 return;
9134 }
9135
9138
9139
9140
9142 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9143
9144 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9145 {
9146 string particle_class = "";
9148 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9150
9151 if (entry_type == CT_CLASS)
9152 {
9153 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9154 WPOOH_array.Insert(WPOF);
9155 }
9156 }
9157
9158
9160 }
9161 }
9162 }
9163
9165 {
9167 }
9168
9170 {
9172 {
9174
9177
9180
9181 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9182 }
9183 }
9184
9186 {
9188 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9189
9191 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9192
9194 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9195
9197 {
9199 }
9200 }
9201
9203 {
9205 }
9206
9208 {
9211 else
9213
9215 {
9218 }
9219 else
9220 {
9223
9226 }
9227
9229 }
9230
9232 {
9234 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9235 }
9236
9238 {
9240 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9242 }
9243
9245 {
9247 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9248 }
9249
9251 {
9254
9255 OverheatingParticle OP = new OverheatingParticle();
9260
9262 }
9263
9265 {
9268
9269 return -1;
9270 }
9271
9273 {
9275 {
9278
9279 for (int i = count; i > 0; --i)
9280 {
9281 int id = i - 1;
9284
9287
9288 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9289 {
9290 if (p)
9291 {
9294 }
9295 }
9296 }
9297 }
9298 }
9299
9301 {
9303 {
9305 {
9306 int id = i - 1;
9308
9309 if (OP)
9310 {
9312
9313 if (p)
9314 {
9316 }
9317
9318 delete OP;
9319 }
9320 }
9321
9324 }
9325 }
9326
9329 {
9330 return 0.0;
9331 }
9332
9333
9335 {
9336 return 250;
9337 }
9338
9340 {
9341 return 0;
9342 }
9343
9346 {
9348 return true;
9349
9350 return false;
9351 }
9352
9355 {
9358
9360 {
9362 }
9363 else
9364 {
9365
9367 }
9368
9370 }
9371
9378 {
9379 return -1;
9380 }
9381
9382
9383
9384
9386 {
9388 {
9390 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9391
9392 if (r_index >= 0)
9393 {
9394 InventoryLocation r_il = new InventoryLocation;
9395 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9396
9397 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9400 {
9401 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9402 }
9404 {
9405 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9406 }
9407
9408 }
9409
9410 player.GetHumanInventory().ClearUserReservedLocation(this);
9411 }
9412
9415 }
9416
9417
9418
9419
9421 {
9422 return ItemBase.m_DebugActionsMask;
9423 }
9424
9426 {
9427 return ItemBase.m_DebugActionsMask & mask;
9428 }
9429
9431 {
9432 ItemBase.m_DebugActionsMask = mask;
9433 }
9434
9436 {
9437 ItemBase.m_DebugActionsMask |= mask;
9438 }
9439
9441 {
9442 ItemBase.m_DebugActionsMask &= ~mask;
9443 }
9444
9446 {
9448 {
9450 }
9451 else
9452 {
9454 }
9455 }
9456
9457
9459 {
9460 if (GetEconomyProfile())
9461 {
9462 float q_max = GetEconomyProfile().GetQuantityMax();
9463 if (q_max > 0)
9464 {
9465 float q_min = GetEconomyProfile().GetQuantityMin();
9466 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9467
9469 {
9470 ComponentEnergyManager comp = GetCompEM();
9472 {
9474 }
9475 }
9477 {
9479
9480 }
9481
9482 }
9483 }
9484 }
9485
9488 {
9489 EntityAI parent = GetHierarchyParent();
9490
9491 if (parent)
9492 {
9493 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9494 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9495 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9496 }
9497 }
9498
9501 {
9502 EntityAI parent = GetHierarchyParent();
9503
9504 if (parent)
9505 {
9506 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9507 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9508 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9509 }
9510 }
9511
9513 {
9514
9515
9516
9517
9519
9521 {
9522 if (ScriptInputUserData.CanStoreInputUserData())
9523 {
9524 ScriptInputUserData ctx = new ScriptInputUserData;
9530 ctx.
Write(use_stack_max);
9533
9535 {
9536 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9537 }
9538 }
9539 }
9540 else if (!
GetGame().IsMultiplayer())
9541 {
9543 }
9544 }
9545
9547 {
9549 }
9550
9552 {
9554 }
9555
9557 {
9559 }
9560
9562 {
9563
9564 return false;
9565 }
9566
9568 {
9569 return false;
9570 }
9571
9575 {
9576 return false;
9577 }
9578
9580 {
9581 return "";
9582 }
9583
9585
9587 {
9588 return false;
9589 }
9590
9592 {
9593 return true;
9594 }
9595
9596
9597
9599 {
9600 return true;
9601 }
9602
9604 {
9605 return true;
9606 }
9607
9609 {
9610 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9612 }
9613
9615 {
9617 }
9618
9620 {
9622 if (!is_being_placed)
9624 SetSynchDirty();
9625 }
9626
9627
9629
9631 {
9633 }
9634
9636 {
9638 }
9639
9641 {
9642 return 1;
9643 }
9644
9646 {
9647 return false;
9648 }
9649
9651 {
9653 SetSynchDirty();
9654 }
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9691 {
9692 super.OnMovedInsideCargo(container);
9693
9694 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9695 }
9696
9697 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9698 {
9699 super.EEItemLocationChanged(oldLoc,newLoc);
9700
9701 PlayerBase new_player = null;
9702 PlayerBase old_player = null;
9703
9704 if (newLoc.GetParent())
9705 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9706
9707 if (oldLoc.GetParent())
9708 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9709
9711 {
9712 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9713
9714 if (r_index >= 0)
9715 {
9716 InventoryLocation r_il = new InventoryLocation;
9717 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9718
9719 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9722 {
9723 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9724 }
9726 {
9727 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9728 }
9729
9730 }
9731 }
9732
9734 {
9735 if (new_player)
9736 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9737
9738 if (new_player == old_player)
9739 {
9740
9741 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9742 {
9744 {
9745 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9746 {
9747 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9748 }
9749 }
9750 else
9751 {
9752 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9753 }
9754 }
9755
9756 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9757 {
9758 int type = oldLoc.GetType();
9760 {
9761 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9762 }
9764 {
9765 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9766 }
9767 }
9768 if (!m_OldLocation)
9769 {
9770 m_OldLocation = new InventoryLocation;
9771 }
9772 m_OldLocation.Copy(oldLoc);
9773 }
9774 else
9775 {
9776 if (m_OldLocation)
9777 {
9778 m_OldLocation.Reset();
9779 }
9780 }
9781
9783 }
9784 else
9785 {
9786 if (new_player)
9787 {
9788 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9789 if (res_index >= 0)
9790 {
9791 InventoryLocation il = new InventoryLocation;
9792 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9794 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9797 {
9798 il.
GetParent().GetOnReleaseLock().Invoke(it);
9799 }
9801 {
9803 }
9804
9805 }
9806 }
9808 {
9809
9811 }
9812
9813 if (m_OldLocation)
9814 {
9815 m_OldLocation.Reset();
9816 }
9817 }
9818 }
9819
9820 override void EOnContact(IEntity other, Contact extra)
9821 {
9823 {
9824 int liquidType = -1;
9826 if (impactSpeed > 0.0)
9827 {
9829 #ifndef SERVER
9831 #else
9833 SetSynchDirty();
9834 #endif
9836 }
9837 }
9838
9839 #ifdef SERVER
9840 if (GetCompEM() && GetCompEM().IsPlugged())
9841 {
9842 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9843 GetCompEM().UnplugThis();
9844 }
9845 #endif
9846 }
9847
9849
9851 {
9853 }
9854
9856 {
9857
9858 }
9859
9861 {
9862 super.OnItemLocationChanged(old_owner, new_owner);
9863
9864 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9865 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9866
9867 if (!relatedPlayer && playerNew)
9868 relatedPlayer = playerNew;
9869
9870 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9871 {
9873 if (actionMgr)
9874 {
9875 ActionBase currentAction = actionMgr.GetRunningAction();
9876 if (currentAction)
9878 }
9879 }
9880
9881 Man ownerPlayerOld = null;
9882 Man ownerPlayerNew = null;
9883
9884 if (old_owner)
9885 {
9886 if (old_owner.
IsMan())
9887 {
9888 ownerPlayerOld = Man.Cast(old_owner);
9889 }
9890 else
9891 {
9892 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9893 }
9894 }
9895 else
9896 {
9898 {
9900
9901 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9902 {
9903 GetCompEM().UnplugThis();
9904 }
9905 }
9906 }
9907
9908 if (new_owner)
9909 {
9910 if (new_owner.
IsMan())
9911 {
9912 ownerPlayerNew = Man.Cast(new_owner);
9913 }
9914 else
9915 {
9916 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9917 }
9918 }
9919
9920 if (ownerPlayerOld != ownerPlayerNew)
9921 {
9922 if (ownerPlayerOld)
9923 {
9924 array<EntityAI> subItemsExit = new array<EntityAI>;
9926 for (int i = 0; i < subItemsExit.Count(); i++)
9927 {
9930 }
9931 }
9932
9933 if (ownerPlayerNew)
9934 {
9935 array<EntityAI> subItemsEnter = new array<EntityAI>;
9937 for (int j = 0; j < subItemsEnter.Count(); j++)
9938 {
9941 }
9942 }
9943 }
9944 else if (ownerPlayerNew != null)
9945 {
9946 PlayerBase nplayer;
9947 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9948 {
9949 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9951 for (int k = 0; k < subItemsUpdate.Count(); k++)
9952 {
9954 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9955 }
9956 }
9957 }
9958
9959 if (old_owner)
9960 old_owner.OnChildItemRemoved(this);
9961 if (new_owner)
9962 new_owner.OnChildItemReceived(this);
9963 }
9964
9965
9967 {
9968 super.EEDelete(parent);
9969 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9970 if (player)
9971 {
9973
9974 if (player.IsAlive())
9975 {
9976 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9977 if (r_index >= 0)
9978 {
9979 InventoryLocation r_il = new InventoryLocation;
9980 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9981
9982 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9985 {
9986 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9987 }
9989 {
9990 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9991 }
9992
9993 }
9994
9995 player.RemoveQuickBarEntityShortcut(this);
9996 }
9997 }
9998 }
9999
10001 {
10002 super.EEKilled(killer);
10003
10006 {
10007 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10008 {
10009 if (IsMagazine())
10010 {
10011 if (Magazine.Cast(this).GetAmmoCount() > 0)
10012 {
10014 }
10015 }
10016 else
10017 {
10019 }
10020 }
10021 }
10022 }
10023
10025 {
10026 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10027
10028 super.OnWasAttached(parent, slot_id);
10029
10032
10034 }
10035
10037 {
10038 super.OnWasDetached(parent, slot_id);
10039
10042 }
10043
10045 {
10046 int idx;
10049
10050 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10051 if (inventory_slots.Count() < 1)
10052 {
10053 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10054 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10055 }
10056 else
10057 {
10058 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10059 }
10060
10061 idx = inventory_slots.Find(slot);
10062 if (idx < 0)
10063 return "";
10064
10065 return attach_types.Get(idx);
10066 }
10067
10069 {
10070 int idx = -1;
10071 string slot;
10072
10075
10076 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10077 if (inventory_slots.Count() < 1)
10078 {
10079 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10080 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10081 }
10082 else
10083 {
10084 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10085 if (detach_types.Count() < 1)
10086 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10087 }
10088
10089 for (int i = 0; i < inventory_slots.Count(); i++)
10090 {
10091 slot = inventory_slots.Get(i);
10092 }
10093
10094 if (slot != "")
10095 {
10096 if (detach_types.Count() == 1)
10097 idx = 0;
10098 else
10099 idx = inventory_slots.Find(slot);
10100 }
10101 if (idx < 0)
10102 return "";
10103
10104 return detach_types.Get(idx);
10105 }
10106
10108 {
10109
10111
10112
10113 float min_time = 1;
10114 float max_time = 3;
10115 float delay = Math.RandomFloat(min_time, max_time);
10116
10117 explode_timer.Run(delay, this, "DoAmmoExplosion");
10118 }
10119
10121 {
10122 Magazine magazine = Magazine.Cast(this);
10123 int pop_sounds_count = 6;
10124 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10125
10126
10127 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10128 string sound_name = pop_sounds[ sound_idx ];
10130
10131
10132 magazine.ServerAddAmmoCount(-1);
10133
10134
10135 float min_temp_to_explode = 100;
10136
10137 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10138 {
10140 }
10141 }
10142
10143
10144 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10145 {
10146 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10147
10148 const int CHANCE_DAMAGE_CARGO = 4;
10149 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10150 const int CHANCE_DAMAGE_NOTHING = 2;
10151
10153 {
10154 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10155 int chances;
10156 int rnd;
10157
10158 if (GetInventory().GetCargo())
10159 {
10160 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10161 rnd = Math.RandomInt(0,chances);
10162
10163 if (rnd < CHANCE_DAMAGE_CARGO)
10164 {
10166 }
10167 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10168 {
10170 }
10171 }
10172 else
10173 {
10174 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10175 rnd = Math.RandomInt(0,chances);
10176
10177 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10178 {
10180 }
10181 }
10182 }
10183 }
10184
10186 {
10187 if (GetInventory().GetCargo())
10188 {
10189 int item_count = GetInventory().GetCargo().GetItemCount();
10190 if (item_count > 0)
10191 {
10192 int random_pick = Math.RandomInt(0, item_count);
10194 if (!item.IsExplosive())
10195 {
10196 item.AddHealth("","",damage);
10197 return true;
10198 }
10199 }
10200 }
10201 return false;
10202 }
10203
10205 {
10206 int attachment_count = GetInventory().AttachmentCount();
10207 if (attachment_count > 0)
10208 {
10209 int random_pick = Math.RandomInt(0, attachment_count);
10210 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10211 if (!attachment.IsExplosive())
10212 {
10213 attachment.AddHealth("","",damage);
10214 return true;
10215 }
10216 }
10217 return false;
10218 }
10219
10221 {
10223 }
10224
10226 {
10228 return GetInventory().CanRemoveEntity();
10229
10230 return false;
10231 }
10232
10234 {
10235
10237 return false;
10238
10239
10241 return false;
10242
10243
10244
10246 if (delta == 0)
10247 return false;
10248
10249
10250 return true;
10251 }
10252
10254 {
10256 {
10257 if (ScriptInputUserData.CanStoreInputUserData())
10258 {
10259 ScriptInputUserData ctx = new ScriptInputUserData;
10264 ctx.
Write(destination_entity);
10266 ctx.
Write(slot_id);
10268 }
10269 }
10270 else if (!
GetGame().IsMultiplayer())
10271 {
10273 }
10274 }
10275
10277 {
10278 float split_quantity_new;
10282 InventoryLocation loc = new InventoryLocation;
10283
10284 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10285 {
10287 split_quantity_new = stack_max;
10288 else
10290
10292 {
10293 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10294 if (new_item)
10295 {
10296 new_item.SetResultOfSplit(true);
10297 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10299 new_item.
SetQuantity(split_quantity_new,
false,
true);
10300 }
10301 }
10302 }
10303 else if (destination_entity && slot_id == -1)
10304 {
10305 if (quantity > stack_max)
10306 split_quantity_new = stack_max;
10307 else
10308 split_quantity_new = quantity;
10309
10311 {
10313 {
10316 }
10317
10318 if (new_item)
10319 {
10320 new_item.SetResultOfSplit(true);
10321 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10323 new_item.
SetQuantity(split_quantity_new,
false,
true);
10324 }
10325 }
10326 }
10327 else
10328 {
10329 if (stack_max != 0)
10330 {
10332 {
10334 }
10335
10336 if (split_quantity_new == 0)
10337 {
10338 if (!
GetGame().IsMultiplayer())
10339 player.PhysicalPredictiveDropItem(this);
10340 else
10341 player.ServerDropEntity(this);
10342 return;
10343 }
10344
10346 {
10348
10349 if (new_item)
10350 {
10351 new_item.SetResultOfSplit(true);
10352 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10355 new_item.PlaceOnSurface();
10356 }
10357 }
10358 }
10359 }
10360 }
10361
10363 {
10364 float split_quantity_new;
10368 InventoryLocation loc = new InventoryLocation;
10369
10370 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10371 {
10373 split_quantity_new = stack_max;
10374 else
10376
10378 {
10379 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10380 if (new_item)
10381 {
10382 new_item.SetResultOfSplit(true);
10383 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10385 new_item.
SetQuantity(split_quantity_new,
false,
true);
10386 }
10387 }
10388 }
10389 else if (destination_entity && slot_id == -1)
10390 {
10391 if (quantity > stack_max)
10392 split_quantity_new = stack_max;
10393 else
10394 split_quantity_new = quantity;
10395
10397 {
10399 {
10402 }
10403
10404 if (new_item)
10405 {
10406 new_item.SetResultOfSplit(true);
10407 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10409 new_item.
SetQuantity(split_quantity_new,
false,
true);
10410 }
10411 }
10412 }
10413 else
10414 {
10415 if (stack_max != 0)
10416 {
10418 {
10420 }
10421
10423 {
10425
10426 if (new_item)
10427 {
10428 new_item.SetResultOfSplit(true);
10429 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10432 new_item.PlaceOnSurface();
10433 }
10434 }
10435 }
10436 }
10437 }
10438
10440 {
10442 {
10443 if (ScriptInputUserData.CanStoreInputUserData())
10444 {
10445 ScriptInputUserData ctx = new ScriptInputUserData;
10450 dst.WriteToContext(ctx);
10452 }
10453 }
10454 else if (!
GetGame().IsMultiplayer())
10455 {
10457 }
10458 }
10459
10461 {
10463 {
10464 if (ScriptInputUserData.CanStoreInputUserData())
10465 {
10466 ScriptInputUserData ctx = new ScriptInputUserData;
10471 ctx.
Write(destination_entity);
10477 }
10478 }
10479 else if (!
GetGame().IsMultiplayer())
10480 {
10482 }
10483 }
10484
10486 {
10488 }
10489
10491 {
10493 float split_quantity_new;
10495 if (dst.IsValid())
10496 {
10497 int slot_id = dst.GetSlot();
10499
10500 if (quantity > stack_max)
10501 split_quantity_new = stack_max;
10502 else
10503 split_quantity_new = quantity;
10504
10506 {
10508
10509 if (new_item)
10510 {
10511 new_item.SetResultOfSplit(true);
10512 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10514 new_item.
SetQuantity(split_quantity_new,
false,
true);
10515 }
10516
10517 return new_item;
10518 }
10519 }
10520
10521 return null;
10522 }
10523
10525 {
10527 float split_quantity_new;
10529 if (destination_entity)
10530 {
10532 if (quantity > stackable)
10533 split_quantity_new = stackable;
10534 else
10535 split_quantity_new = quantity;
10536
10538 {
10539 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10540 if (new_item)
10541 {
10542 new_item.SetResultOfSplit(true);
10543 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10545 new_item.
SetQuantity(split_quantity_new,
false,
true);
10546 }
10547 }
10548 }
10549 }
10550
10552 {
10554 {
10555 if (ScriptInputUserData.CanStoreInputUserData())
10556 {
10557 ScriptInputUserData ctx = new ScriptInputUserData;
10562 ItemBase destination_entity =
this;
10563 ctx.
Write(destination_entity);
10567 }
10568 }
10569 else if (!
GetGame().IsMultiplayer())
10570 {
10572 }
10573 }
10574
10576 {
10578 float split_quantity_new;
10580 if (player)
10581 {
10583 if (quantity > stackable)
10584 split_quantity_new = stackable;
10585 else
10586 split_quantity_new = quantity;
10587
10589 {
10590 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10591 new_item =
ItemBase.Cast(in_hands);
10592 if (new_item)
10593 {
10594 new_item.SetResultOfSplit(true);
10595 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10597 new_item.SetQuantity(split_quantity_new, false, true);
10598 }
10599 }
10600 }
10601 }
10602
10604 {
10606 float split_quantity_new = Math.Floor(quantity * 0.5);
10607
10609 return;
10610
10612
10613 if (new_item)
10614 {
10615 if (new_item.GetQuantityMax() < split_quantity_new)
10616 {
10617 split_quantity_new = new_item.GetQuantityMax();
10618 }
10619
10620 new_item.SetResultOfSplit(true);
10621 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10622
10624 {
10627 }
10628 else
10629 {
10631 new_item.
SetQuantity(split_quantity_new,
false,
true);
10632 }
10633 }
10634 }
10635
10637 {
10639 float split_quantity_new = Math.Floor(quantity / 2);
10640
10642 return;
10643
10644 InventoryLocation invloc = new InventoryLocation;
10646
10648 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10649
10650 if (new_item)
10651 {
10652 if (new_item.GetQuantityMax() < split_quantity_new)
10653 {
10654 split_quantity_new = new_item.GetQuantityMax();
10655 }
10657 {
10660 }
10661 else if (split_quantity_new > 1)
10662 {
10664 new_item.
SetQuantity(split_quantity_new,
false,
true);
10665 }
10666 }
10667 }
10668
10671 {
10672 SetWeightDirty();
10674
10675 if (parent)
10676 parent.OnAttachmentQuantityChangedEx(this, delta);
10677
10679 {
10681 {
10683 }
10685 {
10686 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10688 }
10689 }
10690
10691 }
10692
10695 {
10696
10697 }
10698
10701 {
10703 }
10704
10706 {
10707 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10708
10710 {
10711 if (newLevel == GameConstants.STATE_RUINED)
10712 {
10714 EntityAI parent = GetHierarchyParent();
10715 if (parent && parent.IsFireplace())
10716 {
10717 CargoBase cargo = GetInventory().GetCargo();
10718 if (cargo)
10719 {
10721 {
10723 }
10724 }
10725 }
10726 }
10727
10729 {
10730
10732 return;
10733 }
10734
10735 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10736 {
10738 }
10739 }
10740 }
10741
10742
10744 {
10745 super.OnRightClick();
10746
10748 {
10750 {
10751 if (ScriptInputUserData.CanStoreInputUserData())
10752 {
10753 EntityAI root = GetHierarchyRoot();
10754 Man playerOwner = GetHierarchyRootPlayer();
10755 InventoryLocation dst = new InventoryLocation;
10756
10757
10758 if (!playerOwner && root && root == this)
10759 {
10761 }
10762 else
10763 {
10764
10765 GetInventory().GetCurrentInventoryLocation(dst);
10767 {
10770 {
10772 }
10773 else
10774 {
10776
10777
10778 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10779 {
10781 }
10782 else
10783 {
10784 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10785 }
10786 }
10787 }
10788 }
10789
10790 ScriptInputUserData ctx = new ScriptInputUserData;
10798 }
10799 }
10800 else if (!
GetGame().IsMultiplayer())
10801 {
10803 }
10804 }
10805 }
10806
10808 {
10809 if (root)
10810 {
10811 vector m4[4];
10812 root.GetTransform(m4);
10813 dst.SetGround(this, m4);
10814 }
10815 else
10816 {
10817 GetInventory().GetCurrentInventoryLocation(dst);
10818 }
10819 }
10820
10821 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10822 {
10823
10824 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10825 return false;
10826
10827 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10828 return false;
10829
10830
10832 return false;
10833
10834
10835 Magazine mag = Magazine.Cast(this);
10836 if (mag)
10837 {
10838 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10839 return false;
10840
10841 if (stack_max_limit)
10842 {
10843 Magazine other_mag = Magazine.Cast(other_item);
10844 if (other_item)
10845 {
10846 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10847 return false;
10848 }
10849
10850 }
10851 }
10852 else
10853 {
10854
10856 return false;
10857
10859 return false;
10860 }
10861
10862 PlayerBase player = null;
10863 if (CastTo(player, GetHierarchyRootPlayer()))
10864 {
10865 if (player.GetInventory().HasAttachment(this))
10866 return false;
10867
10868 if (player.IsItemsToDelete())
10869 return false;
10870 }
10871
10872 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10873 return false;
10874
10875 int slotID;
10877 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10878 return false;
10879
10880 return true;
10881 }
10882
10884 {
10886 }
10887
10889 {
10890 return m_IsResultOfSplit;
10891 }
10892
10894 {
10895 m_IsResultOfSplit = value;
10896 }
10897
10899 {
10901 }
10902
10904 {
10905 float other_item_quantity = other_item.GetQuantity();
10906 float this_free_space;
10907
10909
10911
10912 if (other_item_quantity > this_free_space)
10913 {
10914 return this_free_space;
10915 }
10916 else
10917 {
10918 return other_item_quantity;
10919 }
10920 }
10921
10923 {
10925 }
10926
10928 {
10930 return;
10931
10932 if (!IsMagazine() && other_item)
10933 {
10935 if (quantity_used != 0)
10936 {
10937 float hp1 = GetHealth01("","");
10938 float hp2 = other_item.GetHealth01("","");
10939 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10940 hpResult = hpResult / (
GetQuantity() + quantity_used);
10941
10942 hpResult *= GetMaxHealth();
10943 Math.Round(hpResult);
10944 SetHealth("", "Health", hpResult);
10945
10947 other_item.AddQuantity(-quantity_used);
10948 }
10949 }
10951 }
10952
10954 {
10955 #ifdef SERVER
10956 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10957 GetHierarchyParent().IncreaseLifetimeUp();
10958 #endif
10959 };
10960
10962 {
10963 PlayerBase p = PlayerBase.Cast(player);
10964
10965 array<int> recipesIds = p.m_Recipes;
10966 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10967 if (moduleRecipesManager)
10968 {
10969 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10970 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10971 }
10972
10973 for (int i = 0;i < recipesIds.Count(); i++)
10974 {
10975 int key = recipesIds.Get(i);
10976 string recipeName = moduleRecipesManager.GetRecipeName(key);
10978 }
10979 }
10980
10981
10982 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10983 {
10984 super.GetDebugActions(outputList);
10985
10986
10992
10993
10998
11003
11004
11008
11009
11011 {
11015 }
11016
11019
11020
11024
11026
11027 InventoryLocation loc = new InventoryLocation();
11028 GetInventory().GetCurrentInventoryLocation(loc);
11030 {
11031 if (Gizmo_IsSupported())
11034 }
11035
11037 }
11038
11039
11040
11041
11043 {
11044 super.OnAction(action_id, player, ctx);
11045
11047 {
11048 switch (action_id)
11049 {
11052 return true;
11055 return true;
11056 }
11057 }
11058
11060 {
11061 switch (action_id)
11062 {
11064 Delete();
11065 return true;
11066 }
11067 }
11068
11069 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11070 {
11071 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11072 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11073 PlayerBase p = PlayerBase.Cast(player);
11074 if (
EActions.RECIPES_RANGE_START < 1000)
11075 {
11076 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11077 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11078 }
11079 }
11080 #ifndef SERVER
11081 else if (action_id ==
EActions.WATCH_PLAYER)
11082 {
11083 PluginDeveloper.SetDeveloperItemClientEx(player);
11084 }
11085 #endif
11087 {
11088 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11089 {
11090 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11091 OnDebugButtonPressServer(id + 1);
11092 }
11093
11094 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11095 {
11096 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11098 }
11099
11100 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11101 {
11102 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11104 }
11105
11106 else if (action_id ==
EActions.ADD_QUANTITY)
11107 {
11108 if (IsMagazine())
11109 {
11110 Magazine mag = Magazine.Cast(this);
11111 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11112 }
11113 else
11114 {
11116 }
11117
11118 if (m_EM)
11119 {
11120 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11121 }
11122
11123 }
11124
11125 else if (action_id ==
EActions.REMOVE_QUANTITY)
11126 {
11127 if (IsMagazine())
11128 {
11129 Magazine mag2 = Magazine.Cast(this);
11130 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11131 }
11132 else
11133 {
11135 }
11136 if (m_EM)
11137 {
11138 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11139 }
11140
11141 }
11142
11143 else if (action_id ==
EActions.SET_QUANTITY_0)
11144 {
11146
11147 if (m_EM)
11148 {
11149 m_EM.SetEnergy(0);
11150 }
11151 }
11152
11153 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11154 {
11156
11157 if (m_EM)
11158 {
11159 m_EM.SetEnergy(m_EM.GetEnergyMax());
11160 }
11161 }
11162
11163 else if (action_id ==
EActions.ADD_HEALTH)
11164 {
11165 AddHealth("","",GetMaxHealth("","Health")/5);
11166 }
11167 else if (action_id ==
EActions.REMOVE_HEALTH)
11168 {
11169 AddHealth("","",-GetMaxHealth("","Health")/5);
11170 }
11171 else if (action_id ==
EActions.DESTROY_HEALTH)
11172 {
11173 SetHealth01("","",0);
11174 }
11175 else if (action_id ==
EActions.WATCH_ITEM)
11176 {
11178 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11179 #ifdef DEVELOPER
11180 SetDebugDeveloper_item(this);
11181 #endif
11182 }
11183
11184 else if (action_id ==
EActions.ADD_TEMPERATURE)
11185 {
11186 AddTemperature(20);
11187
11188 }
11189
11190 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11191 {
11192 AddTemperature(-20);
11193
11194 }
11195
11196 else if (action_id ==
EActions.FLIP_FROZEN)
11197 {
11198 SetFrozen(!GetIsFrozen());
11199
11200 }
11201
11202 else if (action_id ==
EActions.ADD_WETNESS)
11203 {
11205
11206 }
11207
11208 else if (action_id ==
EActions.REMOVE_WETNESS)
11209 {
11211
11212 }
11213
11214 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11215 {
11218
11219
11220 }
11221
11222 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11223 {
11226 }
11227
11228 else if (action_id ==
EActions.MAKE_SPECIAL)
11229 {
11230 auto debugParams = DebugSpawnParams.WithPlayer(player);
11231 OnDebugSpawnEx(debugParams);
11232 }
11233
11234 }
11235
11236
11237 return false;
11238 }
11239
11240
11241
11242
11246
11249
11250
11251
11253 {
11254 return false;
11255 }
11256
11257
11259 {
11260 return true;
11261 }
11262
11263
11265 {
11266 return true;
11267 }
11268
11269
11270
11272 {
11273 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11275 }
11276
11279 {
11280 return null;
11281 }
11282
11284 {
11285 return false;
11286 }
11287
11289 {
11290 return false;
11291 }
11292
11296
11297
11299 {
11300 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11301 return module_repairing.CanRepair(this, item_repair_kit);
11302 }
11303
11304
11305 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11306 {
11307 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11308 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11309 }
11310
11311
11313 {
11314
11315
11316
11317
11318
11319
11320
11321
11322 return 1;
11323 }
11324
11325
11326
11328 {
11330 }
11331
11332
11333
11335 {
11337 }
11338
11339
11348 {
11349 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11350
11351 if (player)
11352 {
11353 player.MessageStatus(text);
11354 }
11355 }
11356
11357
11366 {
11367 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11368
11369 if (player)
11370 {
11371 player.MessageAction(text);
11372 }
11373 }
11374
11375
11384 {
11385 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11386
11387 if (player)
11388 {
11389 player.MessageFriendly(text);
11390 }
11391 }
11392
11393
11402 {
11403 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11404
11405 if (player)
11406 {
11407 player.MessageImportant(text);
11408 }
11409 }
11410
11412 {
11413 return true;
11414 }
11415
11416
11417 override bool KindOf(
string tag)
11418 {
11419 bool found = false;
11420 string item_name = this.
GetType();
11423
11424 int array_size = item_tag_array.Count();
11425 for (int i = 0; i < array_size; i++)
11426 {
11427 if (item_tag_array.Get(i) == tag)
11428 {
11429 found = true;
11430 break;
11431 }
11432 }
11433 return found;
11434 }
11435
11436
11438 {
11439
11440 super.OnRPC(sender, rpc_type,ctx);
11441
11442
11443 switch (rpc_type)
11444 {
11445 #ifndef SERVER
11446 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11447 Param2<bool, string> p = new Param2<bool, string>(false, "");
11448
11450 return;
11451
11452 bool play = p.param1;
11453 string soundSet = p.param2;
11454
11455 if (play)
11456 {
11458 {
11460 {
11462 }
11463 }
11464 else
11465 {
11467 }
11468 }
11469 else
11470 {
11472 }
11473
11474 break;
11475 #endif
11476
11477 }
11478
11480 {
11482 }
11483 }
11484
11485
11486
11487
11489 {
11490 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11491 return plugin.GetID(
name);
11492 }
11493
11495 {
11496 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11497 return plugin.GetName(id);
11498 }
11499
11502 {
11503
11504
11505 int varFlags;
11506 if (!ctx.
Read(varFlags))
11507 return;
11508
11509 if (varFlags & ItemVariableFlags.FLOAT)
11510 {
11512 }
11513 }
11514
11516 {
11517
11518 super.SerializeNumericalVars(floats_out);
11519
11520
11521
11523 {
11525 }
11526
11528 {
11530 }
11531
11533 {
11535 }
11536
11538 {
11543 }
11544
11546 {
11548 }
11549 }
11550
11552 {
11553
11554 super.DeSerializeNumericalVars(floats);
11555
11556
11557 int index = 0;
11558 int mask = Math.Round(floats.Get(index));
11559
11560 index++;
11561
11563 {
11565 {
11567 }
11568 else
11569 {
11570 float quantity = floats.Get(index);
11571 SetQuantity(quantity,
true,
false,
false,
false);
11572 }
11573 index++;
11574 }
11575
11577 {
11578 float wet = floats.Get(index);
11580 index++;
11581 }
11582
11584 {
11585 int liquidtype = Math.Round(floats.Get(index));
11587 index++;
11588 }
11589
11591 {
11593 index++;
11595 index++;
11597 index++;
11599 index++;
11600 }
11601
11603 {
11604 int cleanness = Math.Round(floats.Get(index));
11606 index++;
11607 }
11608 }
11609
11611 {
11612 super.WriteVarsToCTX(ctx);
11613
11614
11616 {
11618 }
11619
11621 {
11623 }
11624
11626 {
11628 }
11629
11631 {
11632 int r,g,b,a;
11638 }
11639
11641 {
11643 }
11644 }
11645
11647 {
11648 if (!super.ReadVarsFromCTX(ctx,version))
11649 return false;
11650
11651 int intValue;
11652 float value;
11653
11654 if (version < 140)
11655 {
11656 if (!ctx.
Read(intValue))
11657 return false;
11658
11659 m_VariablesMask = intValue;
11660 }
11661
11663 {
11664 if (!ctx.
Read(value))
11665 return false;
11666
11668 {
11670 }
11671 else
11672 {
11674 }
11675 }
11676
11677 if (version < 140)
11678 {
11680 {
11681 if (!ctx.
Read(value))
11682 return false;
11683 SetTemperatureDirect(value);
11684 }
11685 }
11686
11688 {
11689 if (!ctx.
Read(value))
11690 return false;
11692 }
11693
11695 {
11696 if (!ctx.
Read(intValue))
11697 return false;
11699 }
11700
11702 {
11703 int r,g,b,a;
11705 return false;
11707 return false;
11709 return false;
11711 return false;
11712
11714 }
11715
11717 {
11718 if (!ctx.
Read(intValue))
11719 return false;
11721 }
11722
11723 if (version >= 138 && version < 140)
11724 {
11726 {
11727 if (!ctx.
Read(intValue))
11728 return false;
11729 SetFrozen(intValue);
11730 }
11731 }
11732
11733 return true;
11734 }
11735
11736
11738 {
11741 {
11743 }
11744
11745 if (!super.OnStoreLoad(ctx, version))
11746 {
11748 return false;
11749 }
11750
11751 if (version >= 114)
11752 {
11753 bool hasQuickBarIndexSaved;
11754
11755 if (!ctx.
Read(hasQuickBarIndexSaved))
11756 {
11758 return false;
11759 }
11760
11761 if (hasQuickBarIndexSaved)
11762 {
11763 int itmQBIndex;
11764
11765
11766 if (!ctx.
Read(itmQBIndex))
11767 {
11769 return false;
11770 }
11771
11772 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11773 if (itmQBIndex != -1 && parentPlayer)
11774 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11775 }
11776 }
11777 else
11778 {
11779
11780 PlayerBase player;
11781 int itemQBIndex;
11782 if (version ==
int.
MAX)
11783 {
11784 if (!ctx.
Read(itemQBIndex))
11785 {
11787 return false;
11788 }
11789 }
11790 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11791 {
11792
11793 if (!ctx.
Read(itemQBIndex))
11794 {
11796 return false;
11797 }
11798 if (itemQBIndex != -1 && player)
11799 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11800 }
11801 }
11802
11803 if (version < 140)
11804 {
11805
11806 if (!LoadVariables(ctx, version))
11807 {
11809 return false;
11810 }
11811 }
11812
11813
11815 {
11817 return false;
11818 }
11819 if (version >= 132)
11820 {
11822 if (raib)
11823 {
11825 {
11827 return false;
11828 }
11829 }
11830 }
11831
11833 return true;
11834 }
11835
11836
11837
11839 {
11840 super.OnStoreSave(ctx);
11841
11842 PlayerBase player;
11843 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11844 {
11846
11847 int itemQBIndex = -1;
11848 itemQBIndex = player.FindQuickBarEntityIndex(this);
11849 ctx.
Write(itemQBIndex);
11850 }
11851 else
11852 {
11854 }
11855
11857
11859 if (raib)
11860 {
11862 }
11863 }
11864
11865
11867 {
11868 super.AfterStoreLoad();
11869
11871 {
11873 }
11874
11876 {
11879 }
11880 }
11881
11883 {
11884 super.EEOnAfterLoad();
11885
11887 {
11889 }
11890
11893 }
11894
11896 {
11897 return false;
11898 }
11899
11900
11901
11903 {
11905 {
11906 #ifdef PLATFORM_CONSOLE
11907
11909 {
11911 if (menu)
11912 {
11914 }
11915 }
11916 #endif
11917 }
11918
11920 {
11923 }
11924
11926 {
11927 SetWeightDirty();
11929 }
11931 {
11934 }
11935
11937 {
11940 }
11942 {
11945 }
11946
11947 super.OnVariablesSynchronized();
11948 }
11949
11950
11951
11953 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11954 {
11955 if (!IsServerCheck(allow_client))
11956 return false;
11957
11959 return false;
11960
11963
11964 if (value <= (min + 0.001))
11965 value = min;
11966
11967 if (value == min)
11968 {
11969 if (destroy_config)
11970 {
11971 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11972 if (dstr)
11973 {
11975 this.Delete();
11976 return true;
11977 }
11978 }
11979 else if (destroy_forced)
11980 {
11982 this.Delete();
11983 return true;
11984 }
11985
11987 }
11988
11991
11993 {
11995
11996 if (delta)
11998 }
11999
12001
12002 return false;
12003 }
12004
12005
12007 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12008 {
12010 }
12011
12013 {
12016 }
12017
12019 {
12022 }
12023
12025 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12026 {
12027 float value_clamped = Math.Clamp(value, 0, 1);
12029 SetQuantity(result, destroy_config, destroy_forced);
12030 }
12031
12032
12035 {
12037 }
12038
12040 {
12042 }
12043
12044
12045
12046
12047
12048
12049
12050
12051
12052
12054 {
12055 int slot = -1;
12056 if (GetInventory())
12057 {
12058 InventoryLocation il = new InventoryLocation;
12059 GetInventory().GetCurrentInventoryLocation(il);
12061 }
12062
12064 }
12065
12067 {
12068 float quantity_max = 0;
12069
12071 {
12072 if (attSlotID != -1)
12073 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12074
12075 if (quantity_max <= 0)
12077 }
12078
12079 if (quantity_max <= 0)
12081
12082 return quantity_max;
12083 }
12084
12086 {
12088 }
12089
12091 {
12093 }
12094
12095
12097 {
12099 }
12100
12102 {
12104 }
12105
12107 {
12109 }
12110
12111
12113 {
12114
12115 float weightEx = GetWeightEx();
12116 float special = GetInventoryAndCargoWeight();
12117 return weightEx - special;
12118 }
12119
12120
12122 {
12124 }
12125
12127 {
12129 {
12130 #ifdef DEVELOPER
12131 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12132 {
12133 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12135 }
12136 #endif
12137
12138 return GetQuantity() * GetConfigWeightModified();
12139 }
12140 else if (HasEnergyManager())
12141 {
12142 #ifdef DEVELOPER
12143 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12144 {
12145 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12146 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12147 }
12148 #endif
12149 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12150 }
12151 else
12152 {
12153 #ifdef DEVELOPER
12154 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12155 {
12156 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12157 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12158 }
12159 #endif
12160 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12161 }
12162 }
12163
12166 {
12167 int item_count = 0;
12169
12170 if (GetInventory().GetCargo() != NULL)
12171 {
12172 item_count = GetInventory().GetCargo().GetItemCount();
12173 }
12174
12175 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12176 {
12177 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12178 if (item)
12179 item_count += item.GetNumberOfItems();
12180 }
12181 return item_count;
12182 }
12183
12186 {
12187 float weight = 0;
12188 float wetness = 1;
12189 if (include_wetness)
12192 {
12193 weight = wetness * m_ConfigWeight;
12194 }
12196 {
12197 weight = 1;
12198 }
12199 return weight;
12200 }
12201
12202
12203
12205 {
12206 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12207 {
12208 GameInventory inv = GetInventory();
12209 array<EntityAI> items = new array<EntityAI>;
12211 for (int i = 0; i < items.Count(); i++)
12212 {
12214 if (item)
12215 {
12217 }
12218 }
12219 }
12220 }
12221
12222
12223
12224
12226 {
12227 float energy = 0;
12228 if (HasEnergyManager())
12229 {
12230 energy = GetCompEM().GetEnergy();
12231 }
12232 return energy;
12233 }
12234
12235
12237 {
12238 super.OnEnergyConsumed();
12239
12241 }
12242
12244 {
12245 super.OnEnergyAdded();
12246
12248 }
12249
12250
12252 {
12253 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12254 {
12256 {
12257 float energy_0to1 = GetCompEM().GetEnergy0To1();
12259 }
12260 }
12261 }
12262
12263
12265 {
12266 return ConfigGetFloat("heatIsolation");
12267 }
12268
12270 {
12272 }
12273
12275 {
12276 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12277 if (
GetGame().ConfigIsExisting(paramPath))
12279
12280 return 0.0;
12281 }
12282
12284 {
12285 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12286 if (
GetGame().ConfigIsExisting(paramPath))
12288
12289 return 0.0;
12290 }
12291
12292 override void SetWet(
float value,
bool allow_client =
false)
12293 {
12294 if (!IsServerCheck(allow_client))
12295 return;
12296
12299
12301
12302 m_VarWet = Math.Clamp(value, min, max);
12303
12305 {
12308 }
12309 }
12310
12311 override void AddWet(
float value)
12312 {
12314 }
12315
12317 {
12319 }
12320
12322 {
12324 }
12325
12327 {
12329 }
12330
12332 {
12334 }
12335
12337 {
12339 }
12340
12341 override void OnWetChanged(
float newVal,
float oldVal)
12342 {
12345 if (newLevel != oldLevel)
12346 {
12348 }
12349 }
12350
12352 {
12353 SetWeightDirty();
12354 }
12355
12357 {
12358 return GetWetLevelInternal(
m_VarWet);
12359 }
12360
12361
12362
12364 {
12366 }
12367
12369 {
12371 }
12372
12374 {
12376 }
12377
12379 {
12381 }
12382
12383
12384
12386 {
12387 if (ConfigIsExisting("itemModelLength"))
12388 {
12389 return ConfigGetFloat("itemModelLength");
12390 }
12391 return 0;
12392 }
12393
12395 {
12396 if (ConfigIsExisting("itemAttachOffset"))
12397 {
12398 return ConfigGetFloat("itemAttachOffset");
12399 }
12400 return 0;
12401 }
12402
12403 override void SetCleanness(
int value,
bool allow_client =
false)
12404 {
12405 if (!IsServerCheck(allow_client))
12406 return;
12407
12409
12411
12414 }
12415
12417 {
12419 }
12420
12422 {
12423 return true;
12424 }
12425
12426
12427
12428
12430 {
12432 }
12433
12435 {
12437 }
12438
12439
12440
12441
12442 override void SetColor(
int r,
int g,
int b,
int a)
12443 {
12449 }
12451 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12452 {
12457 }
12458
12460 {
12462 }
12463
12466 {
12467 int r,g,b,a;
12469 r = r/255;
12470 g = g/255;
12471 b = b/255;
12472 a = a/255;
12473 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12474 }
12475
12476
12477
12478 override void SetLiquidType(
int value,
bool allow_client =
false)
12479 {
12480 if (!IsServerCheck(allow_client))
12481 return;
12482
12487 }
12488
12490 {
12491 return ConfigGetInt("varLiquidTypeInit");
12492 }
12493
12495 {
12497 }
12498
12500 {
12502 SetFrozen(false);
12503 }
12504
12507 {
12508 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12509 }
12510
12511
12514 {
12515 PlayerBase nplayer;
12516 if (PlayerBase.CastTo(nplayer, player))
12517 {
12519
12520 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12521 }
12522 }
12523
12524
12527 {
12528 PlayerBase nplayer;
12529 if (PlayerBase.CastTo(nplayer,player))
12530 {
12531
12532 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12533
12534 }
12535
12536
12537 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12538
12539
12540 if (HasEnergyManager())
12541 {
12542 GetCompEM().UpdatePlugState();
12543 }
12544 }
12545
12546
12548 {
12549 super.OnPlacementStarted(player);
12550
12552 }
12553
12554 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12555 {
12557 {
12558 m_AdminLog.OnPlacementComplete(player,
this);
12559 }
12560
12561 super.OnPlacementComplete(player, position, orientation);
12562 }
12563
12564
12565
12566
12567
12569 {
12571 {
12572 return true;
12573 }
12574 else
12575 {
12576 return false;
12577 }
12578 }
12579
12580
12582 {
12584 {
12586 }
12587 }
12588
12589
12591 {
12593 }
12594
12596 {
12598 }
12599
12600 override void InsertAgent(
int agent,
float count = 1)
12601 {
12602 if (count < 1)
12603 return;
12604
12606 }
12607
12610 {
12612 }
12613
12614
12616 {
12618 }
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656
12657
12658
12659
12660
12662 {
12664 return false;
12665 return true;
12666 }
12667
12669 {
12670
12672 }
12673
12674
12677 {
12678 super.CheckForRoofLimited(timeTresholdMS);
12679
12681 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12682 {
12683 m_PreviousRoofTestTime = time;
12684 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12685 }
12686 }
12687
12688
12690 {
12692 {
12693 return 0;
12694 }
12695
12696 if (GetInventory().GetAttachmentSlotsCount() != 0)
12697 {
12698 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12699 if (filter)
12700 return filter.GetProtectionLevel(type, false, system);
12701 else
12702 return 0;
12703 }
12704
12705 string subclassPath, entryName;
12706
12707 switch (type)
12708 {
12710 entryName = "biological";
12711 break;
12713 entryName = "chemical";
12714 break;
12715 default:
12716 entryName = "biological";
12717 break;
12718 }
12719
12720 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12721
12723 }
12724
12725
12726
12729 {
12730 if (!IsMagazine())
12732
12734 }
12735
12736
12737
12738
12739
12744 {
12745 return true;
12746 }
12747
12749 {
12751 }
12752
12753
12754
12755
12756
12758 {
12759 if (parent)
12760 {
12761 if (parent.IsInherited(DayZInfected))
12762 return true;
12763
12764 if (!parent.IsRuined())
12765 return true;
12766 }
12767
12768 return true;
12769 }
12770
12772 {
12773 if (!super.CanPutAsAttachment(parent))
12774 {
12775 return false;
12776 }
12777
12778 if (!IsRuined() && !parent.IsRuined())
12779 {
12780 return true;
12781 }
12782
12783 return false;
12784 }
12785
12787 {
12788
12789
12790
12791
12792 return super.CanReceiveItemIntoCargo(item);
12793 }
12794
12796 {
12797
12798
12799
12800
12801 GameInventory attachmentInv = attachment.GetInventory();
12803 {
12804 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12805 return false;
12806 }
12807
12808 InventoryLocation loc = new InventoryLocation();
12809 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12810 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12811 return false;
12812
12813 return super.CanReceiveAttachment(attachment, slotId);
12814 }
12815
12817 {
12818 if (!super.CanReleaseAttachment(attachment))
12819 return false;
12820
12821 return GetInventory().AreChildrenAccessible();
12822 }
12823
12824
12825
12826
12827
12828
12829
12830
12831
12832
12833
12834
12835
12836
12837
12838
12839
12840
12841
12842
12843
12845 {
12846 int id = muzzle_owner.GetMuzzleID();
12847 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12848
12849 if (WPOF_array)
12850 {
12851 for (int i = 0; i < WPOF_array.Count(); i++)
12852 {
12853 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12854
12855 if (WPOF)
12856 {
12857 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12858 }
12859 }
12860 }
12861 }
12862
12863
12865 {
12866 int id = muzzle_owner.GetMuzzleID();
12868
12869 if (WPOBE_array)
12870 {
12871 for (int i = 0; i < WPOBE_array.Count(); i++)
12872 {
12873 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12874
12875 if (WPOBE)
12876 {
12877 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12878 }
12879 }
12880 }
12881 }
12882
12883
12885 {
12886 int id = muzzle_owner.GetMuzzleID();
12887 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12888
12889 if (WPOOH_array)
12890 {
12891 for (int i = 0; i < WPOOH_array.Count(); i++)
12892 {
12893 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12894
12895 if (WPOOH)
12896 {
12897 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12898 }
12899 }
12900 }
12901 }
12902
12903
12905 {
12906 int id = muzzle_owner.GetMuzzleID();
12907 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12908
12909 if (WPOOH_array)
12910 {
12911 for (int i = 0; i < WPOOH_array.Count(); i++)
12912 {
12913 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12914
12915 if (WPOOH)
12916 {
12917 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12918 }
12919 }
12920 }
12921 }
12922
12923
12925 {
12926 int id = muzzle_owner.GetMuzzleID();
12927 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12928
12929 if (WPOOH_array)
12930 {
12931 for (int i = 0; i < WPOOH_array.Count(); i++)
12932 {
12933 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12934
12935 if (WPOOH)
12936 {
12937 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12938 }
12939 }
12940 }
12941 }
12942
12943
12944
12946 {
12948 {
12949 return true;
12950 }
12951
12952 return false;
12953 }
12954
12956 {
12958 {
12959 return true;
12960 }
12961
12962 return false;
12963 }
12964
12966 {
12968 {
12969 return true;
12970 }
12971
12972 return false;
12973 }
12974
12976 {
12977 return false;
12978 }
12979
12982 {
12983 return UATimeSpent.DEFAULT_DEPLOY;
12984 }
12985
12986
12987
12988
12990 {
12992 SetSynchDirty();
12993 }
12994
12996 {
12998 }
12999
13000
13002 {
13003 return false;
13004 }
13005
13008 {
13009 string att_type = "None";
13010
13011 if (ConfigIsExisting("soundAttType"))
13012 {
13013 att_type = ConfigGetString("soundAttType");
13014 }
13015
13017 }
13018
13020 {
13022 }
13023
13024
13025
13026
13027
13033
13035 {
13038
13040 }
13041
13042
13044 {
13046 return;
13047
13049
13052
13055
13056 SoundParameters params = new SoundParameters();
13060 }
13061
13062
13064 {
13066 return;
13067
13069 SetSynchDirty();
13070
13073 }
13074
13075
13077 {
13079 return;
13080
13082 SetSynchDirty();
13083
13086 }
13087
13089 {
13091 }
13092
13094 {
13096 }
13097
13100 {
13101 if (!
GetGame().IsDedicatedServer())
13102 {
13103 if (ConfigIsExisting("attachSoundSet"))
13104 {
13105 string cfg_path = "";
13106 string soundset = "";
13107 string type_name =
GetType();
13108
13111 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13112 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13113
13114 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13115 {
13116 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13117 {
13118 if (cfg_slot_array[i] == slot_type)
13119 {
13120 soundset = cfg_soundset_array[i];
13121 break;
13122 }
13123 }
13124 }
13125
13126 if (soundset != "")
13127 {
13128 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13130 }
13131 }
13132 }
13133 }
13134
13136 {
13137
13138 }
13139
13140 void OnApply(PlayerBase player);
13141
13143 {
13144 return 1.0;
13145 };
13146
13148 {
13150 }
13151
13153 {
13155 }
13156
13158
13160 {
13161 SetDynamicPhysicsLifeTime(0.01);
13163 }
13164
13166 {
13167 array<string> zone_names = new array<string>;
13168 GetDamageZones(zone_names);
13169 for (int i = 0; i < zone_names.Count(); i++)
13170 {
13171 SetHealthMax(zone_names.Get(i),"Health");
13172 }
13173 SetHealthMax("","Health");
13174 }
13175
13178 {
13179 float global_health = GetHealth01("","Health");
13180 array<string> zones = new array<string>;
13181 GetDamageZones(zones);
13182
13183 for (int i = 0; i < zones.Count(); i++)
13184 {
13185 SetHealth01(zones.Get(i),"Health",global_health);
13186 }
13187 }
13188
13191 {
13192 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13193 }
13194
13196 {
13197 if (!hasRootAsPlayer)
13198 {
13199 if (refParentIB)
13200 {
13201
13202 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13203 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13204
13205 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13206 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13207
13210 }
13211 else
13212 {
13213
13216 }
13217 }
13218 }
13219
13221 {
13223 {
13224 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13225 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13226 {
13227 float heatPermCoef = 1.0;
13229 while (ent)
13230 {
13231 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13232 ent = ent.GetHierarchyParent();
13233 }
13234
13235 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13236 }
13237 }
13238 }
13239
13241 {
13242
13243 EntityAI parent = GetHierarchyParent();
13244 if (!parent)
13245 {
13246 hasParent = false;
13247 hasRootAsPlayer = false;
13248 }
13249 else
13250 {
13251 hasParent = true;
13252 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13253 refParentIB =
ItemBase.Cast(parent);
13254 }
13255 }
13256
13257 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13258 {
13259
13260 }
13261
13263 {
13264
13265 return false;
13266 }
13267
13269 {
13270
13271
13272 return false;
13273 }
13274
13276 {
13277
13278 return false;
13279 }
13280
13283 {
13284 return !GetIsFrozen() &&
IsOpen();
13285 }
13286
13288 {
13289 bool hasParent = false, hasRootAsPlayer = false;
13291
13292 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13293 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13294
13295 if (wwtu || foodDecay)
13296 {
13300
13301 if (processWetness || processTemperature || processDecay)
13302 {
13304
13305 if (processWetness)
13306 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13307
13308 if (processTemperature)
13310
13311 if (processDecay)
13312 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13313 }
13314 }
13315 }
13316
13319 {
13321 }
13322
13324 {
13327
13328 return super.GetTemperatureFreezeThreshold();
13329 }
13330
13332 {
13335
13336 return super.GetTemperatureThawThreshold();
13337 }
13338
13340 {
13343
13344 return super.GetItemOverheatThreshold();
13345 }
13346
13348 {
13350 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13351
13352 return super.GetTemperatureFreezeTime();
13353 }
13354
13356 {
13358 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13359
13360 return super.GetTemperatureThawTime();
13361 }
13362
13367
13369 {
13370 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13371 }
13372
13374 {
13375 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13376 }
13377
13380 {
13382 }
13383
13385 {
13387 }
13388
13390 {
13392 }
13393
13396 {
13397 return null;
13398 }
13399
13402 {
13403 return false;
13404 }
13405
13407 {
13409 {
13412 if (!trg)
13413 {
13415 explosive = this;
13416 }
13417
13418 explosive.PairRemote(trg);
13420
13421 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13422 trg.SetPersistentPairID(persistentID);
13423 explosive.SetPersistentPairID(persistentID);
13424
13425 return true;
13426 }
13427 return false;
13428 }
13429
13432 {
13433 float ret = 1.0;
13436 ret *= GetHealth01();
13437
13438 return ret;
13439 }
13440
13441 #ifdef DEVELOPER
13442 override void SetDebugItem()
13443 {
13444 super.SetDebugItem();
13445 _itemBase = this;
13446 }
13447
13449 {
13450 string text = super.GetDebugText();
13451
13453 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13454
13455 return text;
13456 }
13457 #endif
13458
13460 {
13461 return true;
13462 }
13463
13465
13467
13469 {
13472 }
13473
13474
13482
13498}
13499
13501{
13503 if (entity)
13504 {
13505 bool is_item = entity.IsInherited(
ItemBase);
13506 if (is_item && full_quantity)
13507 {
13510 }
13511 }
13512 else
13513 {
13515 return NULL;
13516 }
13517 return entity;
13518}
13519
13521{
13522 if (item)
13523 {
13524 if (health > 0)
13525 item.SetHealth("", "", health);
13526
13527 if (item.CanHaveTemperature())
13528 {
13530 if (item.CanFreeze())
13531 item.SetFrozen(false);
13532 }
13533
13534 if (item.HasEnergyManager())
13535 {
13536 if (quantity >= 0)
13537 {
13538 item.GetCompEM().SetEnergy0To1(quantity);
13539 }
13540 else
13541 {
13543 }
13544 }
13545 else if (item.IsMagazine())
13546 {
13547 Magazine mag = Magazine.Cast(item);
13548 if (quantity >= 0)
13549 {
13550 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13551 }
13552 else
13553 {
13555 }
13556
13557 }
13558 else
13559 {
13560 if (quantity >= 0)
13561 {
13562 item.SetQuantityNormalized(quantity, false);
13563 }
13564 else
13565 {
13567 }
13568
13569 }
13570 }
13571}
13572
13573#ifdef DEVELOPER
13575#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.