8753{
8755 {
8756 return true;
8757 }
8758};
8759
8760
8761
8763{
8767
8769
8772
8773
8774
8775
8776
8785
8791
8796
8801
8822 protected bool m_IsResultOfSplit
8823
8825
8830
8831
8832
8834
8838
8839
8840
8842
8845
8846
8847
8853
8854
8862
8865
8866
8868
8869
8871
8872
8877
8878
8883
8884
8886
8887
8889 {
8894
8895 if (!
GetGame().IsDedicatedServer())
8896 {
8898 {
8900
8902 {
8904 }
8905 }
8906
8909 }
8910
8911 m_OldLocation = null;
8912
8914 {
8916 }
8917
8918 if (ConfigIsExisting("headSelectionsToHide"))
8919 {
8922 }
8923
8925 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8926 {
8928 }
8929
8931
8932 m_IsResultOfSplit = false;
8933
8935 }
8936
8938 {
8939 super.InitItemVariables();
8940
8946 m_Count = ConfigGetInt(
"count");
8947
8950
8955
8958
8963
8975
8979
8980
8983 if (ConfigIsExisting("canBeSplit"))
8984 {
8987 }
8988
8990 if (ConfigIsExisting("itemBehaviour"))
8992
8993
8996 RegisterNetSyncVariableInt("m_VarLiquidType");
8997 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8998
8999 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9000 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9001 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9002
9003 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9004 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9005 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9006 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9007
9008 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9009 RegisterNetSyncVariableBool("m_IsTakeable");
9010 RegisterNetSyncVariableBool("m_IsHologram");
9011
9014 {
9017 }
9018
9020
9022 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9024
9025 }
9026
9028 {
9030 }
9031
9033 {
9036 {
9041 }
9042 }
9043
9044 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9045 {
9047 {
9050 }
9051
9053 }
9054
9056 {
9062 }
9063
9065
9067 {
9069
9070 if (!action)
9071 {
9072 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9073 return;
9074 }
9075
9077 if (!ai)
9078 {
9080 return;
9081 }
9082
9084 if (!action_array)
9085 {
9086 action_array = new array<ActionBase_Basic>;
9088 }
9089 if (LogManager.IsActionLogEnable())
9090 {
9091 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9092 }
9093
9094 if (action_array.Find(action) != -1)
9095 {
9096 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9097 }
9098 else
9099 {
9100 action_array.Insert(action);
9101 }
9102 }
9103
9105 {
9107 ActionBase action = player.GetActionManager().GetAction(actionName);
9110
9111 if (action_array)
9112 {
9113 action_array.RemoveItem(action);
9114 }
9115 }
9116
9117
9118
9120 {
9121 ActionOverrideData overrideData = new ActionOverrideData();
9125
9127 if (!actionMap)
9128 {
9131 }
9132
9133 actionMap.Insert(this.
Type(), overrideData);
9134
9135 }
9136
9138
9140
9141
9143 {
9146
9149
9150 string config_to_search = "CfgVehicles";
9151 string muzzle_owner_config;
9152
9154 {
9155 if (IsInherited(Weapon))
9156 config_to_search = "CfgWeapons";
9157
9158 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9159
9160 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9161
9163
9164 if (config_OnFire_subclass_count > 0)
9165 {
9166 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9167
9168 for (int i = 0; i < config_OnFire_subclass_count; i++)
9169 {
9170 string particle_class = "";
9172 string config_OnFire_entry = config_OnFire_class + particle_class;
9173 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9174 WPOF_array.Insert(WPOF);
9175 }
9176
9177
9179 }
9180 }
9181
9183 {
9184 config_to_search = "CfgWeapons";
9185 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9186
9187 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9188
9190
9191 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9192 {
9193 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9194
9195 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9196 {
9197 string particle_class2 = "";
9199 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9200 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9201 WPOBE_array.Insert(WPOBE);
9202 }
9203
9204
9206 }
9207 }
9208 }
9209
9210
9212 {
9215
9217 {
9218 string config_to_search = "CfgVehicles";
9219
9220 if (IsInherited(Weapon))
9221 config_to_search = "CfgWeapons";
9222
9223 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9224 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9225
9226 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9227 {
9228
9230
9232 {
9234 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9236 return;
9237 }
9238
9241
9242
9243
9245 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9246
9247 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9248 {
9249 string particle_class = "";
9251 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9253
9254 if (entry_type == CT_CLASS)
9255 {
9256 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9257 WPOOH_array.Insert(WPOF);
9258 }
9259 }
9260
9261
9263 }
9264 }
9265 }
9266
9268 {
9270 }
9271
9273 {
9275 {
9277
9280
9283
9284 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9285 }
9286 }
9287
9289 {
9291 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9292
9294 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9295
9297 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9298
9300 {
9302 }
9303 }
9304
9306 {
9308 }
9309
9311 {
9314 else
9316
9318 {
9321 }
9322 else
9323 {
9326
9329 }
9330
9332 }
9333
9335 {
9337 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9338 }
9339
9341 {
9343 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9345 }
9346
9348 {
9350 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9351 }
9352
9354 {
9357
9358 OverheatingParticle OP = new OverheatingParticle();
9363
9365 }
9366
9368 {
9371
9372 return -1;
9373 }
9374
9376 {
9378 {
9381
9382 for (int i = count; i > 0; --i)
9383 {
9384 int id = i - 1;
9387
9390
9391 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9392 {
9393 if (p)
9394 {
9397 }
9398 }
9399 }
9400 }
9401 }
9402
9404 {
9406 {
9408 {
9409 int id = i - 1;
9411
9412 if (OP)
9413 {
9415
9416 if (p)
9417 {
9419 }
9420
9421 delete OP;
9422 }
9423 }
9424
9427 }
9428 }
9429
9432 {
9433 return 0.0;
9434 }
9435
9436
9438 {
9439 return 250;
9440 }
9441
9443 {
9444 return 0;
9445 }
9446
9449 {
9451 return true;
9452
9453 return false;
9454 }
9455
9458 {
9461
9463 {
9465 }
9466 else
9467 {
9468
9470 }
9471
9473 }
9474
9481 {
9482 return -1;
9483 }
9484
9485
9486
9487
9489 {
9491 {
9493 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9494
9495 if (r_index >= 0)
9496 {
9497 InventoryLocation r_il = new InventoryLocation;
9498 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9499
9500 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9503 {
9504 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9505 }
9507 {
9508 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9509 }
9510
9511 }
9512
9513 player.GetHumanInventory().ClearUserReservedLocation(this);
9514 }
9515
9518 }
9519
9520
9521
9522
9524 {
9525 return ItemBase.m_DebugActionsMask;
9526 }
9527
9529 {
9530 return ItemBase.m_DebugActionsMask & mask;
9531 }
9532
9534 {
9535 ItemBase.m_DebugActionsMask = mask;
9536 }
9537
9539 {
9540 ItemBase.m_DebugActionsMask |= mask;
9541 }
9542
9544 {
9545 ItemBase.m_DebugActionsMask &= ~mask;
9546 }
9547
9549 {
9551 {
9553 }
9554 else
9555 {
9557 }
9558 }
9559
9560
9562 {
9563 if (GetEconomyProfile())
9564 {
9565 float q_max = GetEconomyProfile().GetQuantityMax();
9566 if (q_max > 0)
9567 {
9568 float q_min = GetEconomyProfile().GetQuantityMin();
9569 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9570
9572 {
9573 ComponentEnergyManager comp = GetCompEM();
9575 {
9577 }
9578 }
9580 {
9582
9583 }
9584
9585 }
9586 }
9587 }
9588
9591 {
9592 EntityAI parent = GetHierarchyParent();
9593
9594 if (parent)
9595 {
9596 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9597 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9598 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9599 }
9600 }
9601
9604 {
9605 EntityAI parent = GetHierarchyParent();
9606
9607 if (parent)
9608 {
9609 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9610 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9611 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9612 }
9613 }
9614
9616 {
9617
9618
9619
9620
9622
9624 {
9625 if (ScriptInputUserData.CanStoreInputUserData())
9626 {
9627 ScriptInputUserData ctx = new ScriptInputUserData;
9633 ctx.
Write(use_stack_max);
9636
9638 {
9639 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9640 }
9641 }
9642 }
9643 else if (!
GetGame().IsMultiplayer())
9644 {
9646 }
9647 }
9648
9650 {
9652 }
9653
9655 {
9657 }
9658
9660 {
9662 }
9663
9665 {
9666
9667 return false;
9668 }
9669
9671 {
9672 return false;
9673 }
9674
9678 {
9679 return false;
9680 }
9681
9683 {
9684 return "";
9685 }
9686
9688
9690 {
9691 return false;
9692 }
9693
9695 {
9696 return true;
9697 }
9698
9699
9700
9702 {
9703 return true;
9704 }
9705
9707 {
9708 return true;
9709 }
9710
9712 {
9713 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9715 }
9716
9718 {
9720 }
9721
9723 {
9725 if (!is_being_placed)
9727 SetSynchDirty();
9728 }
9729
9730
9732
9734 {
9736 }
9737
9739 {
9741 }
9742
9744 {
9745 return 1;
9746 }
9747
9749 {
9750 return false;
9751 }
9752
9754 {
9756 SetSynchDirty();
9757 }
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9794 {
9795 super.OnMovedInsideCargo(container);
9796
9797 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9798 }
9799
9800 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9801 {
9802 super.EEItemLocationChanged(oldLoc,newLoc);
9803
9804 PlayerBase new_player = null;
9805 PlayerBase old_player = null;
9806
9807 if (newLoc.GetParent())
9808 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9809
9810 if (oldLoc.GetParent())
9811 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9812
9814 {
9815 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9816
9817 if (r_index >= 0)
9818 {
9819 InventoryLocation r_il = new InventoryLocation;
9820 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9821
9822 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9825 {
9826 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9827 }
9829 {
9830 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9831 }
9832
9833 }
9834 }
9835
9837 {
9838 if (new_player)
9839 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9840
9841 if (new_player == old_player)
9842 {
9843
9844 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9845 {
9847 {
9848 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9849 {
9850 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9851 }
9852 }
9853 else
9854 {
9855 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9856 }
9857 }
9858
9859 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9860 {
9861 int type = oldLoc.GetType();
9863 {
9864 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9865 }
9867 {
9868 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9869 }
9870 }
9871 if (!m_OldLocation)
9872 {
9873 m_OldLocation = new InventoryLocation;
9874 }
9875 m_OldLocation.Copy(oldLoc);
9876 }
9877 else
9878 {
9879 if (m_OldLocation)
9880 {
9881 m_OldLocation.Reset();
9882 }
9883 }
9884
9886 }
9887 else
9888 {
9889 if (new_player)
9890 {
9891 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9892 if (res_index >= 0)
9893 {
9894 InventoryLocation il = new InventoryLocation;
9895 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9897 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9900 {
9901 il.
GetParent().GetOnReleaseLock().Invoke(it);
9902 }
9904 {
9906 }
9907
9908 }
9909 }
9911 {
9912
9914 }
9915
9916 if (m_OldLocation)
9917 {
9918 m_OldLocation.Reset();
9919 }
9920 }
9921 }
9922
9923 override void EOnContact(IEntity other, Contact extra)
9924 {
9926 {
9927 int liquidType = -1;
9929 if (impactSpeed > 0.0)
9930 {
9932 #ifndef SERVER
9934 #else
9936 SetSynchDirty();
9937 #endif
9939 }
9940 }
9941
9942 #ifdef SERVER
9943 if (GetCompEM() && GetCompEM().IsPlugged())
9944 {
9945 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9946 GetCompEM().UnplugThis();
9947 }
9948 #endif
9949 }
9950
9952
9954 {
9956 }
9957
9959 {
9960
9961 }
9962
9964 {
9965 super.OnItemLocationChanged(old_owner, new_owner);
9966
9967 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9968 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9969
9970 if (!relatedPlayer && playerNew)
9971 relatedPlayer = playerNew;
9972
9973 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9974 {
9976 if (actionMgr)
9977 {
9978 ActionBase currentAction = actionMgr.GetRunningAction();
9979 if (currentAction)
9981 }
9982 }
9983
9984 Man ownerPlayerOld = null;
9985 Man ownerPlayerNew = null;
9986
9987 if (old_owner)
9988 {
9989 if (old_owner.
IsMan())
9990 {
9991 ownerPlayerOld = Man.Cast(old_owner);
9992 }
9993 else
9994 {
9995 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9996 }
9997 }
9998 else
9999 {
10001 {
10003
10004 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10005 {
10006 GetCompEM().UnplugThis();
10007 }
10008 }
10009 }
10010
10011 if (new_owner)
10012 {
10013 if (new_owner.
IsMan())
10014 {
10015 ownerPlayerNew = Man.Cast(new_owner);
10016 }
10017 else
10018 {
10019 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10020 }
10021 }
10022
10023 if (ownerPlayerOld != ownerPlayerNew)
10024 {
10025 if (ownerPlayerOld)
10026 {
10027 array<EntityAI> subItemsExit = new array<EntityAI>;
10029 for (int i = 0; i < subItemsExit.Count(); i++)
10030 {
10033 }
10034 }
10035
10036 if (ownerPlayerNew)
10037 {
10038 array<EntityAI> subItemsEnter = new array<EntityAI>;
10040 for (int j = 0; j < subItemsEnter.Count(); j++)
10041 {
10044 }
10045 }
10046 }
10047 else if (ownerPlayerNew != null)
10048 {
10049 PlayerBase nplayer;
10050 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10051 {
10052 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10054 for (int k = 0; k < subItemsUpdate.Count(); k++)
10055 {
10057 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10058 }
10059 }
10060 }
10061
10062 if (old_owner)
10063 old_owner.OnChildItemRemoved(this);
10064 if (new_owner)
10065 new_owner.OnChildItemReceived(this);
10066 }
10067
10068
10070 {
10071 super.EEDelete(parent);
10072 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10073 if (player)
10074 {
10076
10077 if (player.IsAlive())
10078 {
10079 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10080 if (r_index >= 0)
10081 {
10082 InventoryLocation r_il = new InventoryLocation;
10083 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10084
10085 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10088 {
10089 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10090 }
10092 {
10093 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10094 }
10095
10096 }
10097
10098 player.RemoveQuickBarEntityShortcut(this);
10099 }
10100 }
10101 }
10102
10104 {
10105 super.EEKilled(killer);
10106
10109 {
10110 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10111 {
10112 if (IsMagazine())
10113 {
10114 if (Magazine.Cast(this).GetAmmoCount() > 0)
10115 {
10117 }
10118 }
10119 else
10120 {
10122 }
10123 }
10124 }
10125 }
10126
10128 {
10129 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10130
10131 super.OnWasAttached(parent, slot_id);
10132
10135
10137 }
10138
10140 {
10141 super.OnWasDetached(parent, slot_id);
10142
10145 }
10146
10148 {
10149 int idx;
10152
10153 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10154 if (inventory_slots.Count() < 1)
10155 {
10156 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10157 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10158 }
10159 else
10160 {
10161 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10162 }
10163
10164 idx = inventory_slots.Find(slot);
10165 if (idx < 0)
10166 return "";
10167
10168 return attach_types.Get(idx);
10169 }
10170
10172 {
10173 int idx = -1;
10174 string slot;
10175
10178
10179 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10180 if (inventory_slots.Count() < 1)
10181 {
10182 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10183 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10184 }
10185 else
10186 {
10187 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10188 if (detach_types.Count() < 1)
10189 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10190 }
10191
10192 for (int i = 0; i < inventory_slots.Count(); i++)
10193 {
10194 slot = inventory_slots.Get(i);
10195 }
10196
10197 if (slot != "")
10198 {
10199 if (detach_types.Count() == 1)
10200 idx = 0;
10201 else
10202 idx = inventory_slots.Find(slot);
10203 }
10204 if (idx < 0)
10205 return "";
10206
10207 return detach_types.Get(idx);
10208 }
10209
10211 {
10212
10214
10215
10216 float min_time = 1;
10217 float max_time = 3;
10218 float delay = Math.RandomFloat(min_time, max_time);
10219
10220 explode_timer.Run(delay, this, "DoAmmoExplosion");
10221 }
10222
10224 {
10225 Magazine magazine = Magazine.Cast(this);
10226 int pop_sounds_count = 6;
10227 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10228
10229
10230 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10231 string sound_name = pop_sounds[ sound_idx ];
10233
10234
10235 magazine.ServerAddAmmoCount(-1);
10236
10237
10238 float min_temp_to_explode = 100;
10239
10240 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10241 {
10243 }
10244 }
10245
10246
10247 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10248 {
10249 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10250
10251 const int CHANCE_DAMAGE_CARGO = 4;
10252 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10253 const int CHANCE_DAMAGE_NOTHING = 2;
10254
10256 {
10257 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10258 int chances;
10259 int rnd;
10260
10261 if (GetInventory().GetCargo())
10262 {
10263 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10264 rnd = Math.RandomInt(0,chances);
10265
10266 if (rnd < CHANCE_DAMAGE_CARGO)
10267 {
10269 }
10270 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10271 {
10273 }
10274 }
10275 else
10276 {
10277 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10278 rnd = Math.RandomInt(0,chances);
10279
10280 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10281 {
10283 }
10284 }
10285 }
10286 }
10287
10289 {
10290 if (GetInventory().GetCargo())
10291 {
10292 int item_count = GetInventory().GetCargo().GetItemCount();
10293 if (item_count > 0)
10294 {
10295 int random_pick = Math.RandomInt(0, item_count);
10297 if (!item.IsExplosive())
10298 {
10299 item.AddHealth("","",damage);
10300 return true;
10301 }
10302 }
10303 }
10304 return false;
10305 }
10306
10308 {
10309 int attachment_count = GetInventory().AttachmentCount();
10310 if (attachment_count > 0)
10311 {
10312 int random_pick = Math.RandomInt(0, attachment_count);
10313 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10314 if (!attachment.IsExplosive())
10315 {
10316 attachment.AddHealth("","",damage);
10317 return true;
10318 }
10319 }
10320 return false;
10321 }
10322
10324 {
10326 }
10327
10329 {
10331 return GetInventory().CanRemoveEntity();
10332
10333 return false;
10334 }
10335
10337 {
10338
10340 return false;
10341
10342
10344 return false;
10345
10346
10347
10349 if (delta == 0)
10350 return false;
10351
10352
10353 return true;
10354 }
10355
10357 {
10359 {
10360 if (ScriptInputUserData.CanStoreInputUserData())
10361 {
10362 ScriptInputUserData ctx = new ScriptInputUserData;
10367 ctx.
Write(destination_entity);
10369 ctx.
Write(slot_id);
10371 }
10372 }
10373 else if (!
GetGame().IsMultiplayer())
10374 {
10376 }
10377 }
10378
10380 {
10381 float split_quantity_new;
10385 InventoryLocation loc = new InventoryLocation;
10386
10387 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10388 {
10390 split_quantity_new = stack_max;
10391 else
10393
10395 {
10396 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10397 if (new_item)
10398 {
10399 new_item.SetResultOfSplit(true);
10400 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10402 new_item.
SetQuantity(split_quantity_new,
false,
true);
10403 }
10404 }
10405 }
10406 else if (destination_entity && slot_id == -1)
10407 {
10408 if (quantity > stack_max)
10409 split_quantity_new = stack_max;
10410 else
10411 split_quantity_new = quantity;
10412
10414 {
10416 {
10419 }
10420
10421 if (new_item)
10422 {
10423 new_item.SetResultOfSplit(true);
10424 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10426 new_item.
SetQuantity(split_quantity_new,
false,
true);
10427 }
10428 }
10429 }
10430 else
10431 {
10432 if (stack_max != 0)
10433 {
10435 {
10437 }
10438
10439 if (split_quantity_new == 0)
10440 {
10441 if (!
GetGame().IsMultiplayer())
10442 player.PhysicalPredictiveDropItem(this);
10443 else
10444 player.ServerDropEntity(this);
10445 return;
10446 }
10447
10449 {
10451
10452 if (new_item)
10453 {
10454 new_item.SetResultOfSplit(true);
10455 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10458 new_item.PlaceOnSurface();
10459 }
10460 }
10461 }
10462 }
10463 }
10464
10466 {
10467 float split_quantity_new;
10471 InventoryLocation loc = new InventoryLocation;
10472
10473 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10474 {
10476 split_quantity_new = stack_max;
10477 else
10479
10481 {
10482 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10483 if (new_item)
10484 {
10485 new_item.SetResultOfSplit(true);
10486 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10488 new_item.
SetQuantity(split_quantity_new,
false,
true);
10489 }
10490 }
10491 }
10492 else if (destination_entity && slot_id == -1)
10493 {
10494 if (quantity > stack_max)
10495 split_quantity_new = stack_max;
10496 else
10497 split_quantity_new = quantity;
10498
10500 {
10502 {
10505 }
10506
10507 if (new_item)
10508 {
10509 new_item.SetResultOfSplit(true);
10510 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10512 new_item.
SetQuantity(split_quantity_new,
false,
true);
10513 }
10514 }
10515 }
10516 else
10517 {
10518 if (stack_max != 0)
10519 {
10521 {
10523 }
10524
10526 {
10528
10529 if (new_item)
10530 {
10531 new_item.SetResultOfSplit(true);
10532 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10535 new_item.PlaceOnSurface();
10536 }
10537 }
10538 }
10539 }
10540 }
10541
10543 {
10545 {
10546 if (ScriptInputUserData.CanStoreInputUserData())
10547 {
10548 ScriptInputUserData ctx = new ScriptInputUserData;
10553 dst.WriteToContext(ctx);
10555 }
10556 }
10557 else if (!
GetGame().IsMultiplayer())
10558 {
10560 }
10561 }
10562
10564 {
10566 {
10567 if (ScriptInputUserData.CanStoreInputUserData())
10568 {
10569 ScriptInputUserData ctx = new ScriptInputUserData;
10574 ctx.
Write(destination_entity);
10580 }
10581 }
10582 else if (!
GetGame().IsMultiplayer())
10583 {
10585 }
10586 }
10587
10589 {
10591 }
10592
10594 {
10596 float split_quantity_new;
10598 if (dst.IsValid())
10599 {
10600 int slot_id = dst.GetSlot();
10602
10603 if (quantity > stack_max)
10604 split_quantity_new = stack_max;
10605 else
10606 split_quantity_new = quantity;
10607
10609 {
10611
10612 if (new_item)
10613 {
10614 new_item.SetResultOfSplit(true);
10615 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10617 new_item.
SetQuantity(split_quantity_new,
false,
true);
10618 }
10619
10620 return new_item;
10621 }
10622 }
10623
10624 return null;
10625 }
10626
10628 {
10630 float split_quantity_new;
10632 if (destination_entity)
10633 {
10635 if (quantity > stackable)
10636 split_quantity_new = stackable;
10637 else
10638 split_quantity_new = quantity;
10639
10641 {
10642 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10643 if (new_item)
10644 {
10645 new_item.SetResultOfSplit(true);
10646 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10648 new_item.
SetQuantity(split_quantity_new,
false,
true);
10649 }
10650 }
10651 }
10652 }
10653
10655 {
10657 {
10658 if (ScriptInputUserData.CanStoreInputUserData())
10659 {
10660 ScriptInputUserData ctx = new ScriptInputUserData;
10665 ItemBase destination_entity =
this;
10666 ctx.
Write(destination_entity);
10670 }
10671 }
10672 else if (!
GetGame().IsMultiplayer())
10673 {
10675 }
10676 }
10677
10679 {
10681 float split_quantity_new;
10683 if (player)
10684 {
10686 if (quantity > stackable)
10687 split_quantity_new = stackable;
10688 else
10689 split_quantity_new = quantity;
10690
10692 {
10693 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10694 new_item =
ItemBase.Cast(in_hands);
10695 if (new_item)
10696 {
10697 new_item.SetResultOfSplit(true);
10698 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10700 new_item.SetQuantity(split_quantity_new, false, true);
10701 }
10702 }
10703 }
10704 }
10705
10707 {
10709 float split_quantity_new = Math.Floor(quantity * 0.5);
10710
10712 return;
10713
10715
10716 if (new_item)
10717 {
10718 if (new_item.GetQuantityMax() < split_quantity_new)
10719 {
10720 split_quantity_new = new_item.GetQuantityMax();
10721 }
10722
10723 new_item.SetResultOfSplit(true);
10724 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10725
10727 {
10730 }
10731 else
10732 {
10734 new_item.
SetQuantity(split_quantity_new,
false,
true);
10735 }
10736 }
10737 }
10738
10740 {
10742 float split_quantity_new = Math.Floor(quantity / 2);
10743
10745 return;
10746
10747 InventoryLocation invloc = new InventoryLocation;
10749
10751 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10752
10753 if (new_item)
10754 {
10755 if (new_item.GetQuantityMax() < split_quantity_new)
10756 {
10757 split_quantity_new = new_item.GetQuantityMax();
10758 }
10760 {
10763 }
10764 else if (split_quantity_new > 1)
10765 {
10767 new_item.
SetQuantity(split_quantity_new,
false,
true);
10768 }
10769 }
10770 }
10771
10774 {
10775 SetWeightDirty();
10777
10778 if (parent)
10779 parent.OnAttachmentQuantityChangedEx(this, delta);
10780
10782 {
10784 {
10786 }
10788 {
10789 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10791 }
10792 }
10793
10794 }
10795
10798 {
10799
10800 }
10801
10804 {
10806 }
10807
10809 {
10810 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10811
10813 {
10814 if (newLevel == GameConstants.STATE_RUINED)
10815 {
10817 EntityAI parent = GetHierarchyParent();
10818 if (parent && parent.IsFireplace())
10819 {
10820 CargoBase cargo = GetInventory().GetCargo();
10821 if (cargo)
10822 {
10824 {
10826 }
10827 }
10828 }
10829 }
10830
10832 {
10833
10835 return;
10836 }
10837
10838 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10839 {
10841 }
10842 }
10843 }
10844
10845
10847 {
10848 super.OnRightClick();
10849
10851 {
10853 {
10854 if (ScriptInputUserData.CanStoreInputUserData())
10855 {
10856 EntityAI root = GetHierarchyRoot();
10857 Man playerOwner = GetHierarchyRootPlayer();
10858 InventoryLocation dst = new InventoryLocation;
10859
10860
10861 if (!playerOwner && root && root == this)
10862 {
10864 }
10865 else
10866 {
10867
10868 GetInventory().GetCurrentInventoryLocation(dst);
10870 {
10873 {
10875 }
10876 else
10877 {
10879
10880
10881 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10882 {
10884 }
10885 else
10886 {
10887 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10888 }
10889 }
10890 }
10891 }
10892
10893 ScriptInputUserData ctx = new ScriptInputUserData;
10901 }
10902 }
10903 else if (!
GetGame().IsMultiplayer())
10904 {
10906 }
10907 }
10908 }
10909
10911 {
10912 if (root)
10913 {
10914 vector m4[4];
10915 root.GetTransform(m4);
10916 dst.SetGround(this, m4);
10917 }
10918 else
10919 {
10920 GetInventory().GetCurrentInventoryLocation(dst);
10921 }
10922 }
10923
10924 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10925 {
10926
10927 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10928 return false;
10929
10930 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10931 return false;
10932
10933
10935 return false;
10936
10937
10938 Magazine mag = Magazine.Cast(this);
10939 if (mag)
10940 {
10941 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10942 return false;
10943
10944 if (stack_max_limit)
10945 {
10946 Magazine other_mag = Magazine.Cast(other_item);
10947 if (other_item)
10948 {
10949 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10950 return false;
10951 }
10952
10953 }
10954 }
10955 else
10956 {
10957
10959 return false;
10960
10962 return false;
10963 }
10964
10965 PlayerBase player = null;
10966 if (CastTo(player, GetHierarchyRootPlayer()))
10967 {
10968 if (player.GetInventory().HasAttachment(this))
10969 return false;
10970
10971 if (player.IsItemsToDelete())
10972 return false;
10973 }
10974
10975 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10976 return false;
10977
10978 int slotID;
10980 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10981 return false;
10982
10983 return true;
10984 }
10985
10987 {
10989 }
10990
10992 {
10993 return m_IsResultOfSplit;
10994 }
10995
10997 {
10998 m_IsResultOfSplit = value;
10999 }
11000
11002 {
11004 }
11005
11007 {
11008 float other_item_quantity = other_item.GetQuantity();
11009 float this_free_space;
11010
11012
11014
11015 if (other_item_quantity > this_free_space)
11016 {
11017 return this_free_space;
11018 }
11019 else
11020 {
11021 return other_item_quantity;
11022 }
11023 }
11024
11026 {
11028 }
11029
11031 {
11033 return;
11034
11035 if (!IsMagazine() && other_item)
11036 {
11038 if (quantity_used != 0)
11039 {
11040 float hp1 = GetHealth01("","");
11041 float hp2 = other_item.GetHealth01("","");
11042 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11043 hpResult = hpResult / (
GetQuantity() + quantity_used);
11044
11045 hpResult *= GetMaxHealth();
11046 Math.Round(hpResult);
11047 SetHealth("", "Health", hpResult);
11048
11050 other_item.AddQuantity(-quantity_used);
11051 }
11052 }
11054 }
11055
11057 {
11058 #ifdef SERVER
11059 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11060 GetHierarchyParent().IncreaseLifetimeUp();
11061 #endif
11062 };
11063
11065 {
11066 PlayerBase p = PlayerBase.Cast(player);
11067
11068 array<int> recipesIds = p.m_Recipes;
11069 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11070 if (moduleRecipesManager)
11071 {
11072 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11073 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11074 }
11075
11076 for (int i = 0;i < recipesIds.Count(); i++)
11077 {
11078 int key = recipesIds.Get(i);
11079 string recipeName = moduleRecipesManager.GetRecipeName(key);
11081 }
11082 }
11083
11084
11085 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11086 {
11087 super.GetDebugActions(outputList);
11088
11089
11095
11096
11101
11106
11107
11111
11112
11114 {
11118 }
11119
11122
11123
11127
11129
11130 InventoryLocation loc = new InventoryLocation();
11131 GetInventory().GetCurrentInventoryLocation(loc);
11133 {
11134 if (Gizmo_IsSupported())
11137 }
11138
11140 }
11141
11142
11143
11144
11146 {
11147 super.OnAction(action_id, player, ctx);
11148
11150 {
11151 switch (action_id)
11152 {
11155 return true;
11158 return true;
11159 }
11160 }
11161
11163 {
11164 switch (action_id)
11165 {
11167 Delete();
11168 return true;
11169 }
11170 }
11171
11172 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11173 {
11174 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11175 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11176 PlayerBase p = PlayerBase.Cast(player);
11177 if (
EActions.RECIPES_RANGE_START < 1000)
11178 {
11179 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11180 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11181 }
11182 }
11183 #ifndef SERVER
11184 else if (action_id ==
EActions.WATCH_PLAYER)
11185 {
11186 PluginDeveloper.SetDeveloperItemClientEx(player);
11187 }
11188 #endif
11190 {
11191 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11192 {
11193 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11194 OnDebugButtonPressServer(id + 1);
11195 }
11196
11197 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11198 {
11199 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11201 }
11202
11203 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11204 {
11205 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11207 }
11208
11209 else if (action_id ==
EActions.ADD_QUANTITY)
11210 {
11211 if (IsMagazine())
11212 {
11213 Magazine mag = Magazine.Cast(this);
11214 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11215 }
11216 else
11217 {
11219 }
11220
11221 if (m_EM)
11222 {
11223 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11224 }
11225
11226 }
11227
11228 else if (action_id ==
EActions.REMOVE_QUANTITY)
11229 {
11230 if (IsMagazine())
11231 {
11232 Magazine mag2 = Magazine.Cast(this);
11233 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11234 }
11235 else
11236 {
11238 }
11239 if (m_EM)
11240 {
11241 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11242 }
11243
11244 }
11245
11246 else if (action_id ==
EActions.SET_QUANTITY_0)
11247 {
11249
11250 if (m_EM)
11251 {
11252 m_EM.SetEnergy(0);
11253 }
11254 }
11255
11256 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11257 {
11259
11260 if (m_EM)
11261 {
11262 m_EM.SetEnergy(m_EM.GetEnergyMax());
11263 }
11264 }
11265
11266 else if (action_id ==
EActions.ADD_HEALTH)
11267 {
11268 AddHealth("","",GetMaxHealth("","Health")/5);
11269 }
11270 else if (action_id ==
EActions.REMOVE_HEALTH)
11271 {
11272 AddHealth("","",-GetMaxHealth("","Health")/5);
11273 }
11274 else if (action_id ==
EActions.DESTROY_HEALTH)
11275 {
11276 SetHealth01("","",0);
11277 }
11278 else if (action_id ==
EActions.WATCH_ITEM)
11279 {
11281 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11282 #ifdef DEVELOPER
11283 SetDebugDeveloper_item(this);
11284 #endif
11285 }
11286
11287 else if (action_id ==
EActions.ADD_TEMPERATURE)
11288 {
11289 AddTemperature(20);
11290
11291 }
11292
11293 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11294 {
11295 AddTemperature(-20);
11296
11297 }
11298
11299 else if (action_id ==
EActions.FLIP_FROZEN)
11300 {
11301 SetFrozen(!GetIsFrozen());
11302
11303 }
11304
11305 else if (action_id ==
EActions.ADD_WETNESS)
11306 {
11308
11309 }
11310
11311 else if (action_id ==
EActions.REMOVE_WETNESS)
11312 {
11314
11315 }
11316
11317 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11318 {
11321
11322
11323 }
11324
11325 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11326 {
11329 }
11330
11331 else if (action_id ==
EActions.MAKE_SPECIAL)
11332 {
11333 auto debugParams = DebugSpawnParams.WithPlayer(player);
11334 OnDebugSpawnEx(debugParams);
11335 }
11336
11337 }
11338
11339
11340 return false;
11341 }
11342
11343
11344
11345
11349
11352
11353
11354
11356 {
11357 return false;
11358 }
11359
11360
11362 {
11363 return true;
11364 }
11365
11366
11368 {
11369 return true;
11370 }
11371
11372
11373
11375 {
11376 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11378 }
11379
11382 {
11383 return null;
11384 }
11385
11387 {
11388 return false;
11389 }
11390
11392 {
11393 return false;
11394 }
11395
11399
11400
11402 {
11403 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11404 return module_repairing.CanRepair(this, item_repair_kit);
11405 }
11406
11407
11408 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11409 {
11410 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11411 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11412 }
11413
11414
11416 {
11417
11418
11419
11420
11421
11422
11423
11424
11425 return 1;
11426 }
11427
11428
11429
11431 {
11433 }
11434
11435
11436
11438 {
11440 }
11441
11442
11451 {
11452 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11453
11454 if (player)
11455 {
11456 player.MessageStatus(text);
11457 }
11458 }
11459
11460
11469 {
11470 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11471
11472 if (player)
11473 {
11474 player.MessageAction(text);
11475 }
11476 }
11477
11478
11487 {
11488 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11489
11490 if (player)
11491 {
11492 player.MessageFriendly(text);
11493 }
11494 }
11495
11496
11505 {
11506 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11507
11508 if (player)
11509 {
11510 player.MessageImportant(text);
11511 }
11512 }
11513
11515 {
11516 return true;
11517 }
11518
11519
11520 override bool KindOf(
string tag)
11521 {
11522 bool found = false;
11523 string item_name = this.
GetType();
11526
11527 int array_size = item_tag_array.Count();
11528 for (int i = 0; i < array_size; i++)
11529 {
11530 if (item_tag_array.Get(i) == tag)
11531 {
11532 found = true;
11533 break;
11534 }
11535 }
11536 return found;
11537 }
11538
11539
11541 {
11542
11543 super.OnRPC(sender, rpc_type,ctx);
11544
11545
11546 switch (rpc_type)
11547 {
11548 #ifndef SERVER
11549 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11550 Param2<bool, string> p = new Param2<bool, string>(false, "");
11551
11553 return;
11554
11555 bool play = p.param1;
11556 string soundSet = p.param2;
11557
11558 if (play)
11559 {
11561 {
11563 {
11565 }
11566 }
11567 else
11568 {
11570 }
11571 }
11572 else
11573 {
11575 }
11576
11577 break;
11578 #endif
11579
11580 }
11581
11583 {
11585 }
11586 }
11587
11588
11589
11590
11592 {
11593 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11594 return plugin.GetID(
name);
11595 }
11596
11598 {
11599 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11600 return plugin.GetName(id);
11601 }
11602
11605 {
11606
11607
11608 int varFlags;
11609 if (!ctx.
Read(varFlags))
11610 return;
11611
11612 if (varFlags & ItemVariableFlags.FLOAT)
11613 {
11615 }
11616 }
11617
11619 {
11620
11621 super.SerializeNumericalVars(floats_out);
11622
11623
11624
11626 {
11628 }
11629
11631 {
11633 }
11634
11636 {
11638 }
11639
11641 {
11646 }
11647
11649 {
11651 }
11652 }
11653
11655 {
11656
11657 super.DeSerializeNumericalVars(floats);
11658
11659
11660 int index = 0;
11661 int mask = Math.Round(floats.Get(index));
11662
11663 index++;
11664
11666 {
11668 {
11670 }
11671 else
11672 {
11673 float quantity = floats.Get(index);
11674 SetQuantity(quantity,
true,
false,
false,
false);
11675 }
11676 index++;
11677 }
11678
11680 {
11681 float wet = floats.Get(index);
11683 index++;
11684 }
11685
11687 {
11688 int liquidtype = Math.Round(floats.Get(index));
11690 index++;
11691 }
11692
11694 {
11696 index++;
11698 index++;
11700 index++;
11702 index++;
11703 }
11704
11706 {
11707 int cleanness = Math.Round(floats.Get(index));
11709 index++;
11710 }
11711 }
11712
11714 {
11715 super.WriteVarsToCTX(ctx);
11716
11717
11719 {
11721 }
11722
11724 {
11726 }
11727
11729 {
11731 }
11732
11734 {
11735 int r,g,b,a;
11741 }
11742
11744 {
11746 }
11747 }
11748
11750 {
11751 if (!super.ReadVarsFromCTX(ctx,version))
11752 return false;
11753
11754 int intValue;
11755 float value;
11756
11757 if (version < 140)
11758 {
11759 if (!ctx.
Read(intValue))
11760 return false;
11761
11762 m_VariablesMask = intValue;
11763 }
11764
11766 {
11767 if (!ctx.
Read(value))
11768 return false;
11769
11771 {
11773 }
11774 else
11775 {
11777 }
11778 }
11779
11780 if (version < 140)
11781 {
11783 {
11784 if (!ctx.
Read(value))
11785 return false;
11786 SetTemperatureDirect(value);
11787 }
11788 }
11789
11791 {
11792 if (!ctx.
Read(value))
11793 return false;
11795 }
11796
11798 {
11799 if (!ctx.
Read(intValue))
11800 return false;
11802 }
11803
11805 {
11806 int r,g,b,a;
11808 return false;
11810 return false;
11812 return false;
11814 return false;
11815
11817 }
11818
11820 {
11821 if (!ctx.
Read(intValue))
11822 return false;
11824 }
11825
11826 if (version >= 138 && version < 140)
11827 {
11829 {
11830 if (!ctx.
Read(intValue))
11831 return false;
11832 SetFrozen(intValue);
11833 }
11834 }
11835
11836 return true;
11837 }
11838
11839
11841 {
11844 {
11846 }
11847
11848 if (!super.OnStoreLoad(ctx, version))
11849 {
11851 return false;
11852 }
11853
11854 if (version >= 114)
11855 {
11856 bool hasQuickBarIndexSaved;
11857
11858 if (!ctx.
Read(hasQuickBarIndexSaved))
11859 {
11861 return false;
11862 }
11863
11864 if (hasQuickBarIndexSaved)
11865 {
11866 int itmQBIndex;
11867
11868
11869 if (!ctx.
Read(itmQBIndex))
11870 {
11872 return false;
11873 }
11874
11875 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11876 if (itmQBIndex != -1 && parentPlayer)
11877 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11878 }
11879 }
11880 else
11881 {
11882
11883 PlayerBase player;
11884 int itemQBIndex;
11885 if (version ==
int.
MAX)
11886 {
11887 if (!ctx.
Read(itemQBIndex))
11888 {
11890 return false;
11891 }
11892 }
11893 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11894 {
11895
11896 if (!ctx.
Read(itemQBIndex))
11897 {
11899 return false;
11900 }
11901 if (itemQBIndex != -1 && player)
11902 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11903 }
11904 }
11905
11906 if (version < 140)
11907 {
11908
11909 if (!LoadVariables(ctx, version))
11910 {
11912 return false;
11913 }
11914 }
11915
11916
11918 {
11920 return false;
11921 }
11922 if (version >= 132)
11923 {
11925 if (raib)
11926 {
11928 {
11930 return false;
11931 }
11932 }
11933 }
11934
11936 return true;
11937 }
11938
11939
11940
11942 {
11943 super.OnStoreSave(ctx);
11944
11945 PlayerBase player;
11946 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11947 {
11949
11950 int itemQBIndex = -1;
11951 itemQBIndex = player.FindQuickBarEntityIndex(this);
11952 ctx.
Write(itemQBIndex);
11953 }
11954 else
11955 {
11957 }
11958
11960
11962 if (raib)
11963 {
11965 }
11966 }
11967
11968
11970 {
11971 super.AfterStoreLoad();
11972
11974 {
11976 }
11977
11979 {
11982 }
11983 }
11984
11986 {
11987 super.EEOnAfterLoad();
11988
11990 {
11992 }
11993
11996 }
11997
11999 {
12000 return false;
12001 }
12002
12003
12004
12006 {
12008 {
12009 #ifdef PLATFORM_CONSOLE
12010
12012 {
12014 if (menu)
12015 {
12017 }
12018 }
12019 #endif
12020 }
12021
12023 {
12026 }
12027
12029 {
12030 SetWeightDirty();
12032 }
12034 {
12037 }
12038
12040 {
12043 }
12045 {
12048 }
12049
12050 super.OnVariablesSynchronized();
12051 }
12052
12053
12054
12056 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12057 {
12058 if (!IsServerCheck(allow_client))
12059 return false;
12060
12062 return false;
12063
12066
12067 if (value <= (min + 0.001))
12068 value = min;
12069
12070 if (value == min)
12071 {
12072 if (destroy_config)
12073 {
12074 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12075 if (dstr)
12076 {
12078 this.Delete();
12079 return true;
12080 }
12081 }
12082 else if (destroy_forced)
12083 {
12085 this.Delete();
12086 return true;
12087 }
12088
12090 }
12091
12094
12096 {
12098
12099 if (delta)
12101 }
12102
12104
12105 return false;
12106 }
12107
12108
12110 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12111 {
12113 }
12114
12116 {
12119 }
12120
12122 {
12125 }
12126
12128 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12129 {
12130 float value_clamped = Math.Clamp(value, 0, 1);
12132 SetQuantity(result, destroy_config, destroy_forced);
12133 }
12134
12135
12138 {
12140 }
12141
12143 {
12145 }
12146
12147
12148
12149
12150
12151
12152
12153
12154
12155
12157 {
12158 int slot = -1;
12159 if (GetInventory())
12160 {
12161 InventoryLocation il = new InventoryLocation;
12162 GetInventory().GetCurrentInventoryLocation(il);
12164 }
12165
12167 }
12168
12170 {
12171 float quantity_max = 0;
12172
12174 {
12175 if (attSlotID != -1)
12176 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12177
12178 if (quantity_max <= 0)
12180 }
12181
12182 if (quantity_max <= 0)
12184
12185 return quantity_max;
12186 }
12187
12189 {
12191 }
12192
12194 {
12196 }
12197
12198
12200 {
12202 }
12203
12205 {
12207 }
12208
12210 {
12212 }
12213
12214
12216 {
12217
12218 float weightEx = GetWeightEx();
12219 float special = GetInventoryAndCargoWeight();
12220 return weightEx - special;
12221 }
12222
12223
12225 {
12227 }
12228
12230 {
12232 {
12233 #ifdef DEVELOPER
12234 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12235 {
12236 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12238 }
12239 #endif
12240
12241 return GetQuantity() * GetConfigWeightModified();
12242 }
12243 else if (HasEnergyManager())
12244 {
12245 #ifdef DEVELOPER
12246 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12247 {
12248 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12249 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12250 }
12251 #endif
12252 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12253 }
12254 else
12255 {
12256 #ifdef DEVELOPER
12257 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12258 {
12259 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12260 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12261 }
12262 #endif
12263 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12264 }
12265 }
12266
12269 {
12270 int item_count = 0;
12272
12273 if (GetInventory().GetCargo() != NULL)
12274 {
12275 item_count = GetInventory().GetCargo().GetItemCount();
12276 }
12277
12278 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12279 {
12280 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12281 if (item)
12282 item_count += item.GetNumberOfItems();
12283 }
12284 return item_count;
12285 }
12286
12289 {
12290 float weight = 0;
12291 float wetness = 1;
12292 if (include_wetness)
12295 {
12296 weight = wetness * m_ConfigWeight;
12297 }
12299 {
12300 weight = 1;
12301 }
12302 return weight;
12303 }
12304
12305
12306
12308 {
12309 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12310 {
12311 GameInventory inv = GetInventory();
12312 array<EntityAI> items = new array<EntityAI>;
12314 for (int i = 0; i < items.Count(); i++)
12315 {
12317 if (item)
12318 {
12320 }
12321 }
12322 }
12323 }
12324
12325
12326
12327
12329 {
12330 float energy = 0;
12331 if (HasEnergyManager())
12332 {
12333 energy = GetCompEM().GetEnergy();
12334 }
12335 return energy;
12336 }
12337
12338
12340 {
12341 super.OnEnergyConsumed();
12342
12344 }
12345
12347 {
12348 super.OnEnergyAdded();
12349
12351 }
12352
12353
12355 {
12356 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12357 {
12359 {
12360 float energy_0to1 = GetCompEM().GetEnergy0To1();
12362 }
12363 }
12364 }
12365
12366
12368 {
12369 return ConfigGetFloat("heatIsolation");
12370 }
12371
12373 {
12375 }
12376
12378 {
12379 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12380 if (
GetGame().ConfigIsExisting(paramPath))
12382
12383 return 0.0;
12384 }
12385
12387 {
12388 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12389 if (
GetGame().ConfigIsExisting(paramPath))
12391
12392 return 0.0;
12393 }
12394
12395 override void SetWet(
float value,
bool allow_client =
false)
12396 {
12397 if (!IsServerCheck(allow_client))
12398 return;
12399
12402
12404
12405 m_VarWet = Math.Clamp(value, min, max);
12406
12408 {
12411 }
12412 }
12413
12414 override void AddWet(
float value)
12415 {
12417 }
12418
12420 {
12422 }
12423
12425 {
12427 }
12428
12430 {
12432 }
12433
12435 {
12437 }
12438
12440 {
12442 }
12443
12444 override void OnWetChanged(
float newVal,
float oldVal)
12445 {
12448 if (newLevel != oldLevel)
12449 {
12451 }
12452 }
12453
12455 {
12456 SetWeightDirty();
12457 }
12458
12460 {
12461 return GetWetLevelInternal(
m_VarWet);
12462 }
12463
12464
12465
12467 {
12469 }
12470
12472 {
12474 }
12475
12477 {
12479 }
12480
12482 {
12484 }
12485
12486
12487
12489 {
12490 if (ConfigIsExisting("itemModelLength"))
12491 {
12492 return ConfigGetFloat("itemModelLength");
12493 }
12494 return 0;
12495 }
12496
12498 {
12499 if (ConfigIsExisting("itemAttachOffset"))
12500 {
12501 return ConfigGetFloat("itemAttachOffset");
12502 }
12503 return 0;
12504 }
12505
12506 override void SetCleanness(
int value,
bool allow_client =
false)
12507 {
12508 if (!IsServerCheck(allow_client))
12509 return;
12510
12512
12514
12517 }
12518
12520 {
12522 }
12523
12525 {
12526 return true;
12527 }
12528
12529
12530
12531
12533 {
12535 }
12536
12538 {
12540 }
12541
12542
12543
12544
12545 override void SetColor(
int r,
int g,
int b,
int a)
12546 {
12552 }
12554 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12555 {
12560 }
12561
12563 {
12565 }
12566
12569 {
12570 int r,g,b,a;
12572 r = r/255;
12573 g = g/255;
12574 b = b/255;
12575 a = a/255;
12576 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12577 }
12578
12579
12580
12581 override void SetLiquidType(
int value,
bool allow_client =
false)
12582 {
12583 if (!IsServerCheck(allow_client))
12584 return;
12585
12590 }
12591
12593 {
12594 return ConfigGetInt("varLiquidTypeInit");
12595 }
12596
12598 {
12600 }
12601
12603 {
12605 SetFrozen(false);
12606 }
12607
12610 {
12611 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12612 }
12613
12614
12617 {
12618 PlayerBase nplayer;
12619 if (PlayerBase.CastTo(nplayer, player))
12620 {
12622
12623 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12624 }
12625 }
12626
12627
12630 {
12631 PlayerBase nplayer;
12632 if (PlayerBase.CastTo(nplayer,player))
12633 {
12634
12635 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12636
12637 }
12638
12639
12640 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12641
12642
12643 if (HasEnergyManager())
12644 {
12645 GetCompEM().UpdatePlugState();
12646 }
12647 }
12648
12649
12651 {
12652 super.OnPlacementStarted(player);
12653
12655 }
12656
12657 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12658 {
12660 {
12661 m_AdminLog.OnPlacementComplete(player,
this);
12662 }
12663
12664 super.OnPlacementComplete(player, position, orientation);
12665 }
12666
12667
12668
12669
12670
12672 {
12674 {
12675 return true;
12676 }
12677 else
12678 {
12679 return false;
12680 }
12681 }
12682
12683
12685 {
12687 {
12689 }
12690 }
12691
12692
12694 {
12696 }
12697
12699 {
12701 }
12702
12703 override void InsertAgent(
int agent,
float count = 1)
12704 {
12705 if (count < 1)
12706 return;
12707
12709 }
12710
12713 {
12715 }
12716
12717
12719 {
12721 }
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12765 {
12767 return false;
12768 return true;
12769 }
12770
12772 {
12773
12775 }
12776
12777
12780 {
12781 super.CheckForRoofLimited(timeTresholdMS);
12782
12784 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12785 {
12786 m_PreviousRoofTestTime = time;
12787 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12788 }
12789 }
12790
12791
12793 {
12795 {
12796 return 0;
12797 }
12798
12799 if (GetInventory().GetAttachmentSlotsCount() != 0)
12800 {
12801 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12802 if (filter)
12803 return filter.GetProtectionLevel(type, false, system);
12804 else
12805 return 0;
12806 }
12807
12808 string subclassPath, entryName;
12809
12810 switch (type)
12811 {
12813 entryName = "biological";
12814 break;
12816 entryName = "chemical";
12817 break;
12818 default:
12819 entryName = "biological";
12820 break;
12821 }
12822
12823 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12824
12826 }
12827
12828
12829
12832 {
12833 if (!IsMagazine())
12835
12837 }
12838
12839
12840
12841
12842
12847 {
12848 return true;
12849 }
12850
12852 {
12854 }
12855
12856
12857
12858
12859
12861 {
12862 if (parent)
12863 {
12864 if (parent.IsInherited(DayZInfected))
12865 return true;
12866
12867 if (!parent.IsRuined())
12868 return true;
12869 }
12870
12871 return true;
12872 }
12873
12875 {
12876 if (!super.CanPutAsAttachment(parent))
12877 {
12878 return false;
12879 }
12880
12881 if (!IsRuined() && !parent.IsRuined())
12882 {
12883 return true;
12884 }
12885
12886 return false;
12887 }
12888
12890 {
12891
12892
12893
12894
12895 return super.CanReceiveItemIntoCargo(item);
12896 }
12897
12899 {
12900
12901
12902
12903
12904 GameInventory attachmentInv = attachment.GetInventory();
12906 {
12907 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12908 return false;
12909 }
12910
12911 InventoryLocation loc = new InventoryLocation();
12912 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12913 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12914 return false;
12915
12916 return super.CanReceiveAttachment(attachment, slotId);
12917 }
12918
12920 {
12921 if (!super.CanReleaseAttachment(attachment))
12922 return false;
12923
12924 return GetInventory().AreChildrenAccessible();
12925 }
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12948 {
12949 int id = muzzle_owner.GetMuzzleID();
12950 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12951
12952 if (WPOF_array)
12953 {
12954 for (int i = 0; i < WPOF_array.Count(); i++)
12955 {
12956 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12957
12958 if (WPOF)
12959 {
12960 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12961 }
12962 }
12963 }
12964 }
12965
12966
12968 {
12969 int id = muzzle_owner.GetMuzzleID();
12971
12972 if (WPOBE_array)
12973 {
12974 for (int i = 0; i < WPOBE_array.Count(); i++)
12975 {
12976 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12977
12978 if (WPOBE)
12979 {
12980 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12981 }
12982 }
12983 }
12984 }
12985
12986
12988 {
12989 int id = muzzle_owner.GetMuzzleID();
12990 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12991
12992 if (WPOOH_array)
12993 {
12994 for (int i = 0; i < WPOOH_array.Count(); i++)
12995 {
12996 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12997
12998 if (WPOOH)
12999 {
13000 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13001 }
13002 }
13003 }
13004 }
13005
13006
13008 {
13009 int id = muzzle_owner.GetMuzzleID();
13010 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13011
13012 if (WPOOH_array)
13013 {
13014 for (int i = 0; i < WPOOH_array.Count(); i++)
13015 {
13016 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13017
13018 if (WPOOH)
13019 {
13020 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13021 }
13022 }
13023 }
13024 }
13025
13026
13028 {
13029 int id = muzzle_owner.GetMuzzleID();
13030 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13031
13032 if (WPOOH_array)
13033 {
13034 for (int i = 0; i < WPOOH_array.Count(); i++)
13035 {
13036 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13037
13038 if (WPOOH)
13039 {
13040 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13041 }
13042 }
13043 }
13044 }
13045
13046
13047
13049 {
13051 {
13052 return true;
13053 }
13054
13055 return false;
13056 }
13057
13059 {
13061 {
13062 return true;
13063 }
13064
13065 return false;
13066 }
13067
13069 {
13071 {
13072 return true;
13073 }
13074
13075 return false;
13076 }
13077
13079 {
13080 return false;
13081 }
13082
13085 {
13086 return UATimeSpent.DEFAULT_DEPLOY;
13087 }
13088
13089
13090
13091
13093 {
13095 SetSynchDirty();
13096 }
13097
13099 {
13101 }
13102
13103
13105 {
13106 return false;
13107 }
13108
13111 {
13112 string att_type = "None";
13113
13114 if (ConfigIsExisting("soundAttType"))
13115 {
13116 att_type = ConfigGetString("soundAttType");
13117 }
13118
13120 }
13121
13123 {
13125 }
13126
13127
13128
13129
13130
13136
13138 {
13141
13143 }
13144
13145
13147 {
13149 return;
13150
13152
13155
13158
13159 SoundParameters params = new SoundParameters();
13163 }
13164
13165
13167 {
13169 return;
13170
13172 SetSynchDirty();
13173
13176 }
13177
13178
13180 {
13182 return;
13183
13185 SetSynchDirty();
13186
13189 }
13190
13192 {
13194 }
13195
13197 {
13199 }
13200
13203 {
13204 if (!
GetGame().IsDedicatedServer())
13205 {
13206 if (ConfigIsExisting("attachSoundSet"))
13207 {
13208 string cfg_path = "";
13209 string soundset = "";
13210 string type_name =
GetType();
13211
13214 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13215 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13216
13217 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13218 {
13219 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13220 {
13221 if (cfg_slot_array[i] == slot_type)
13222 {
13223 soundset = cfg_soundset_array[i];
13224 break;
13225 }
13226 }
13227 }
13228
13229 if (soundset != "")
13230 {
13231 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13233 }
13234 }
13235 }
13236 }
13237
13239 {
13240
13241 }
13242
13243 void OnApply(PlayerBase player);
13244
13246 {
13247 return 1.0;
13248 };
13249
13251 {
13253 }
13254
13256 {
13258 }
13259
13261
13263 {
13264 SetDynamicPhysicsLifeTime(0.01);
13266 }
13267
13269 {
13270 array<string> zone_names = new array<string>;
13271 GetDamageZones(zone_names);
13272 for (int i = 0; i < zone_names.Count(); i++)
13273 {
13274 SetHealthMax(zone_names.Get(i),"Health");
13275 }
13276 SetHealthMax("","Health");
13277 }
13278
13281 {
13282 float global_health = GetHealth01("","Health");
13283 array<string> zones = new array<string>;
13284 GetDamageZones(zones);
13285
13286 for (int i = 0; i < zones.Count(); i++)
13287 {
13288 SetHealth01(zones.Get(i),"Health",global_health);
13289 }
13290 }
13291
13294 {
13295 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13296 }
13297
13299 {
13300 if (!hasRootAsPlayer)
13301 {
13302 if (refParentIB)
13303 {
13304
13305 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13306 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13307
13308 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13309 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13310
13313 }
13314 else
13315 {
13316
13319 }
13320 }
13321 }
13322
13324 {
13326 {
13327 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13328 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13329 {
13330 float heatPermCoef = 1.0;
13332 while (ent)
13333 {
13334 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13335 ent = ent.GetHierarchyParent();
13336 }
13337
13338 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13339 }
13340 }
13341 }
13342
13344 {
13345
13346 EntityAI parent = GetHierarchyParent();
13347 if (!parent)
13348 {
13349 hasParent = false;
13350 hasRootAsPlayer = false;
13351 }
13352 else
13353 {
13354 hasParent = true;
13355 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13356 refParentIB =
ItemBase.Cast(parent);
13357 }
13358 }
13359
13360 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13361 {
13362
13363 }
13364
13366 {
13367
13368 return false;
13369 }
13370
13372 {
13373
13374
13375 return false;
13376 }
13377
13379 {
13380
13381 return false;
13382 }
13383
13386 {
13387 return !GetIsFrozen() &&
IsOpen();
13388 }
13389
13391 {
13392 bool hasParent = false, hasRootAsPlayer = false;
13394
13395 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13396 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13397
13398 if (wwtu || foodDecay)
13399 {
13403
13404 if (processWetness || processTemperature || processDecay)
13405 {
13407
13408 if (processWetness)
13409 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13410
13411 if (processTemperature)
13413
13414 if (processDecay)
13415 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13416 }
13417 }
13418 }
13419
13422 {
13424 }
13425
13427 {
13430
13431 return super.GetTemperatureFreezeThreshold();
13432 }
13433
13435 {
13438
13439 return super.GetTemperatureThawThreshold();
13440 }
13441
13443 {
13446
13447 return super.GetItemOverheatThreshold();
13448 }
13449
13451 {
13453 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13454
13455 return super.GetTemperatureFreezeTime();
13456 }
13457
13459 {
13461 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13462
13463 return super.GetTemperatureThawTime();
13464 }
13465
13470
13472 {
13473 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13474 }
13475
13477 {
13478 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13479 }
13480
13483 {
13485 }
13486
13488 {
13490 }
13491
13493 {
13495 }
13496
13499 {
13500 return null;
13501 }
13502
13505 {
13506 return false;
13507 }
13508
13510 {
13512 {
13515 if (!trg)
13516 {
13518 explosive = this;
13519 }
13520
13521 explosive.PairRemote(trg);
13523
13524 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13525 trg.SetPersistentPairID(persistentID);
13526 explosive.SetPersistentPairID(persistentID);
13527
13528 return true;
13529 }
13530 return false;
13531 }
13532
13535 {
13536 float ret = 1.0;
13539 ret *= GetHealth01();
13540
13541 return ret;
13542 }
13543
13544 #ifdef DEVELOPER
13545 override void SetDebugItem()
13546 {
13547 super.SetDebugItem();
13548 _itemBase = this;
13549 }
13550
13552 {
13553 string text = super.GetDebugText();
13554
13556 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13557
13558 return text;
13559 }
13560 #endif
13561
13563 {
13564 return true;
13565 }
13566
13568
13570
13572 {
13575 }
13576
13577
13585
13601}
13602
13604{
13606 if (entity)
13607 {
13608 bool is_item = entity.IsInherited(
ItemBase);
13609 if (is_item && full_quantity)
13610 {
13613 }
13614 }
13615 else
13616 {
13618 return NULL;
13619 }
13620 return entity;
13621}
13622
13624{
13625 if (item)
13626 {
13627 if (health > 0)
13628 item.SetHealth("", "", health);
13629
13630 if (item.CanHaveTemperature())
13631 {
13633 if (item.CanFreeze())
13634 item.SetFrozen(false);
13635 }
13636
13637 if (item.HasEnergyManager())
13638 {
13639 if (quantity >= 0)
13640 {
13641 item.GetCompEM().SetEnergy0To1(quantity);
13642 }
13643 else
13644 {
13646 }
13647 }
13648 else if (item.IsMagazine())
13649 {
13650 Magazine mag = Magazine.Cast(item);
13651 if (quantity >= 0)
13652 {
13653 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13654 }
13655 else
13656 {
13658 }
13659
13660 }
13661 else
13662 {
13663 if (quantity >= 0)
13664 {
13665 item.SetQuantityNormalized(quantity, false);
13666 }
13667 else
13668 {
13670 }
13671
13672 }
13673 }
13674}
13675
13676#ifdef DEVELOPER
13678#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.