8658{
8660 {
8661 return true;
8662 }
8663};
8664
8665
8666
8668{
8672
8674
8677
8678
8679
8680
8681
8690
8696
8701
8706
8727 protected bool m_IsResultOfSplit
8728
8730
8735
8736
8737
8739
8743
8744
8745
8747
8750
8751
8752
8758
8759
8767
8770
8771
8773
8774
8776
8777
8782
8783
8788
8789
8791
8792
8794 {
8799
8800 if (!
GetGame().IsDedicatedServer())
8801 {
8803 {
8805
8807 {
8809 }
8810 }
8811
8814 }
8815
8816 m_OldLocation = null;
8817
8819 {
8821 }
8822
8823 if (ConfigIsExisting("headSelectionsToHide"))
8824 {
8827 }
8828
8830 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8831 {
8833 }
8834
8836
8837 m_IsResultOfSplit = false;
8838
8840 }
8841
8843 {
8844 super.InitItemVariables();
8845
8851 m_Count = ConfigGetInt(
"count");
8852
8855
8860
8863
8868
8880
8884
8885
8888 if (ConfigIsExisting("canBeSplit"))
8889 {
8892 }
8893
8895 if (ConfigIsExisting("itemBehaviour"))
8897
8898
8901 RegisterNetSyncVariableInt("m_VarLiquidType");
8902 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8903
8904 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8905 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8906 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8907
8908 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8909 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8910 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8911 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8912
8913 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8914 RegisterNetSyncVariableBool("m_IsTakeable");
8915 RegisterNetSyncVariableBool("m_IsHologram");
8916
8919 {
8922 }
8923
8925
8927 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8929
8930 }
8931
8933 {
8935 }
8936
8938 {
8941 {
8946 }
8947 }
8948
8949 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8950 {
8952 {
8955 }
8956
8958 }
8959
8961 {
8967 }
8968
8970
8972 {
8974
8975 if (!action)
8976 {
8977 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8978 return;
8979 }
8980
8982 if (!ai)
8983 {
8985 return;
8986 }
8987
8989 if (!action_array)
8990 {
8991 action_array = new array<ActionBase_Basic>;
8993 }
8994 if (LogManager.IsActionLogEnable())
8995 {
8996 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8997 }
8998
8999 if (action_array.Find(action) != -1)
9000 {
9001 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9002 }
9003 else
9004 {
9005 action_array.Insert(action);
9006 }
9007 }
9008
9010 {
9012 ActionBase action = player.GetActionManager().GetAction(actionName);
9015
9016 if (action_array)
9017 {
9018 action_array.RemoveItem(action);
9019 }
9020 }
9021
9022
9023
9025 {
9026 ActionOverrideData overrideData = new ActionOverrideData();
9030
9032 if (!actionMap)
9033 {
9036 }
9037
9038 actionMap.Insert(this.
Type(), overrideData);
9039
9040 }
9041
9043
9045
9046
9048 {
9051
9054
9055 string config_to_search = "CfgVehicles";
9056 string muzzle_owner_config;
9057
9059 {
9060 if (IsInherited(Weapon))
9061 config_to_search = "CfgWeapons";
9062
9063 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9064
9065 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9066
9068
9069 if (config_OnFire_subclass_count > 0)
9070 {
9071 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9072
9073 for (int i = 0; i < config_OnFire_subclass_count; i++)
9074 {
9075 string particle_class = "";
9077 string config_OnFire_entry = config_OnFire_class + particle_class;
9078 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9079 WPOF_array.Insert(WPOF);
9080 }
9081
9082
9084 }
9085 }
9086
9088 {
9089 config_to_search = "CfgWeapons";
9090 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9091
9092 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9093
9095
9096 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9097 {
9098 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9099
9100 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9101 {
9102 string particle_class2 = "";
9104 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9105 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9106 WPOBE_array.Insert(WPOBE);
9107 }
9108
9109
9111 }
9112 }
9113 }
9114
9115
9117 {
9120
9122 {
9123 string config_to_search = "CfgVehicles";
9124
9125 if (IsInherited(Weapon))
9126 config_to_search = "CfgWeapons";
9127
9128 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9129 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9130
9131 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9132 {
9133
9135
9137 {
9139 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9141 return;
9142 }
9143
9146
9147
9148
9150 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9151
9152 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9153 {
9154 string particle_class = "";
9156 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9158
9159 if (entry_type == CT_CLASS)
9160 {
9161 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9162 WPOOH_array.Insert(WPOF);
9163 }
9164 }
9165
9166
9168 }
9169 }
9170 }
9171
9173 {
9175 }
9176
9178 {
9180 {
9182
9185
9188
9189 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9190 }
9191 }
9192
9194 {
9196 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9197
9199 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9200
9202 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9203
9205 {
9207 }
9208 }
9209
9211 {
9213 }
9214
9216 {
9219 else
9221
9223 {
9226 }
9227 else
9228 {
9231
9234 }
9235
9237 }
9238
9240 {
9242 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9243 }
9244
9246 {
9248 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9250 }
9251
9253 {
9255 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9256 }
9257
9259 {
9262
9263 OverheatingParticle OP = new OverheatingParticle();
9268
9270 }
9271
9273 {
9276
9277 return -1;
9278 }
9279
9281 {
9283 {
9286
9287 for (int i = count; i > 0; --i)
9288 {
9289 int id = i - 1;
9292
9295
9296 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9297 {
9298 if (p)
9299 {
9302 }
9303 }
9304 }
9305 }
9306 }
9307
9309 {
9311 {
9313 {
9314 int id = i - 1;
9316
9317 if (OP)
9318 {
9320
9321 if (p)
9322 {
9324 }
9325
9326 delete OP;
9327 }
9328 }
9329
9332 }
9333 }
9334
9337 {
9338 return 0.0;
9339 }
9340
9341
9343 {
9344 return 250;
9345 }
9346
9348 {
9349 return 0;
9350 }
9351
9354 {
9356 return true;
9357
9358 return false;
9359 }
9360
9363 {
9366
9368 {
9370 }
9371 else
9372 {
9373
9375 }
9376
9378 }
9379
9386 {
9387 return -1;
9388 }
9389
9390
9391
9392
9394 {
9396 {
9398 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9399
9400 if (r_index >= 0)
9401 {
9402 InventoryLocation r_il = new InventoryLocation;
9403 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9404
9405 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9408 {
9409 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9410 }
9412 {
9413 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9414 }
9415
9416 }
9417
9418 player.GetHumanInventory().ClearUserReservedLocation(this);
9419 }
9420
9423 }
9424
9425
9426
9427
9429 {
9430 return ItemBase.m_DebugActionsMask;
9431 }
9432
9434 {
9435 return ItemBase.m_DebugActionsMask & mask;
9436 }
9437
9439 {
9440 ItemBase.m_DebugActionsMask = mask;
9441 }
9442
9444 {
9445 ItemBase.m_DebugActionsMask |= mask;
9446 }
9447
9449 {
9450 ItemBase.m_DebugActionsMask &= ~mask;
9451 }
9452
9454 {
9456 {
9458 }
9459 else
9460 {
9462 }
9463 }
9464
9465
9467 {
9468 if (GetEconomyProfile())
9469 {
9470 float q_max = GetEconomyProfile().GetQuantityMax();
9471 if (q_max > 0)
9472 {
9473 float q_min = GetEconomyProfile().GetQuantityMin();
9474 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9475
9477 {
9478 ComponentEnergyManager comp = GetCompEM();
9480 {
9482 }
9483 }
9485 {
9487
9488 }
9489
9490 }
9491 }
9492 }
9493
9496 {
9497 EntityAI parent = GetHierarchyParent();
9498
9499 if (parent)
9500 {
9501 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9502 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9503 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9504 }
9505 }
9506
9509 {
9510 EntityAI parent = GetHierarchyParent();
9511
9512 if (parent)
9513 {
9514 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9515 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9516 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9517 }
9518 }
9519
9521 {
9522
9523
9524
9525
9527
9529 {
9530 if (ScriptInputUserData.CanStoreInputUserData())
9531 {
9532 ScriptInputUserData ctx = new ScriptInputUserData;
9538 ctx.
Write(use_stack_max);
9541
9543 {
9544 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9545 }
9546 }
9547 }
9548 else if (!
GetGame().IsMultiplayer())
9549 {
9551 }
9552 }
9553
9555 {
9557 }
9558
9560 {
9562 }
9563
9565 {
9567 }
9568
9570 {
9571
9572 return false;
9573 }
9574
9576 {
9577 return false;
9578 }
9579
9583 {
9584 return false;
9585 }
9586
9588 {
9589 return "";
9590 }
9591
9593
9595 {
9596 return false;
9597 }
9598
9600 {
9601 return true;
9602 }
9603
9604
9605
9607 {
9608 return true;
9609 }
9610
9612 {
9613 return true;
9614 }
9615
9617 {
9618 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9620 }
9621
9623 {
9625 }
9626
9628 {
9630 if (!is_being_placed)
9632 SetSynchDirty();
9633 }
9634
9635
9637
9639 {
9641 }
9642
9644 {
9646 }
9647
9649 {
9650 return 1;
9651 }
9652
9654 {
9655 return false;
9656 }
9657
9659 {
9661 SetSynchDirty();
9662 }
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9699 {
9700 super.OnMovedInsideCargo(container);
9701
9702 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9703 }
9704
9705 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9706 {
9707 super.EEItemLocationChanged(oldLoc,newLoc);
9708
9709 PlayerBase new_player = null;
9710 PlayerBase old_player = null;
9711
9712 if (newLoc.GetParent())
9713 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9714
9715 if (oldLoc.GetParent())
9716 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9717
9719 {
9720 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9721
9722 if (r_index >= 0)
9723 {
9724 InventoryLocation r_il = new InventoryLocation;
9725 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9726
9727 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9730 {
9731 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9732 }
9734 {
9735 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9736 }
9737
9738 }
9739 }
9740
9742 {
9743 if (new_player)
9744 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9745
9746 if (new_player == old_player)
9747 {
9748
9749 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9750 {
9752 {
9753 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9754 {
9755 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9756 }
9757 }
9758 else
9759 {
9760 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9761 }
9762 }
9763
9764 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9765 {
9766 int type = oldLoc.GetType();
9768 {
9769 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9770 }
9772 {
9773 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9774 }
9775 }
9776 if (!m_OldLocation)
9777 {
9778 m_OldLocation = new InventoryLocation;
9779 }
9780 m_OldLocation.Copy(oldLoc);
9781 }
9782 else
9783 {
9784 if (m_OldLocation)
9785 {
9786 m_OldLocation.Reset();
9787 }
9788 }
9789
9791 }
9792 else
9793 {
9794 if (new_player)
9795 {
9796 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9797 if (res_index >= 0)
9798 {
9799 InventoryLocation il = new InventoryLocation;
9800 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9802 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9805 {
9806 il.
GetParent().GetOnReleaseLock().Invoke(it);
9807 }
9809 {
9811 }
9812
9813 }
9814 }
9816 {
9817
9819 }
9820
9821 if (m_OldLocation)
9822 {
9823 m_OldLocation.Reset();
9824 }
9825 }
9826 }
9827
9828 override void EOnContact(IEntity other, Contact extra)
9829 {
9831 {
9832 int liquidType = -1;
9834 if (impactSpeed > 0.0)
9835 {
9837 #ifndef SERVER
9839 #else
9841 SetSynchDirty();
9842 #endif
9844 }
9845 }
9846
9847 #ifdef SERVER
9848 if (GetCompEM() && GetCompEM().IsPlugged())
9849 {
9850 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9851 GetCompEM().UnplugThis();
9852 }
9853 #endif
9854 }
9855
9857
9859 {
9861 }
9862
9864 {
9865
9866 }
9867
9869 {
9870 super.OnItemLocationChanged(old_owner, new_owner);
9871
9872 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9873 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9874
9875 if (!relatedPlayer && playerNew)
9876 relatedPlayer = playerNew;
9877
9878 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9879 {
9881 if (actionMgr)
9882 {
9883 ActionBase currentAction = actionMgr.GetRunningAction();
9884 if (currentAction)
9886 }
9887 }
9888
9889 Man ownerPlayerOld = null;
9890 Man ownerPlayerNew = null;
9891
9892 if (old_owner)
9893 {
9894 if (old_owner.
IsMan())
9895 {
9896 ownerPlayerOld = Man.Cast(old_owner);
9897 }
9898 else
9899 {
9900 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9901 }
9902 }
9903 else
9904 {
9906 {
9908
9909 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9910 {
9911 GetCompEM().UnplugThis();
9912 }
9913 }
9914 }
9915
9916 if (new_owner)
9917 {
9918 if (new_owner.
IsMan())
9919 {
9920 ownerPlayerNew = Man.Cast(new_owner);
9921 }
9922 else
9923 {
9924 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9925 }
9926 }
9927
9928 if (ownerPlayerOld != ownerPlayerNew)
9929 {
9930 if (ownerPlayerOld)
9931 {
9932 array<EntityAI> subItemsExit = new array<EntityAI>;
9934 for (int i = 0; i < subItemsExit.Count(); i++)
9935 {
9938 }
9939 }
9940
9941 if (ownerPlayerNew)
9942 {
9943 array<EntityAI> subItemsEnter = new array<EntityAI>;
9945 for (int j = 0; j < subItemsEnter.Count(); j++)
9946 {
9949 }
9950 }
9951 }
9952 else if (ownerPlayerNew != null)
9953 {
9954 PlayerBase nplayer;
9955 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9956 {
9957 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9959 for (int k = 0; k < subItemsUpdate.Count(); k++)
9960 {
9962 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9963 }
9964 }
9965 }
9966
9967 if (old_owner)
9968 old_owner.OnChildItemRemoved(this);
9969 if (new_owner)
9970 new_owner.OnChildItemReceived(this);
9971 }
9972
9973
9975 {
9976 super.EEDelete(parent);
9977 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9978 if (player)
9979 {
9981
9982 if (player.IsAlive())
9983 {
9984 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9985 if (r_index >= 0)
9986 {
9987 InventoryLocation r_il = new InventoryLocation;
9988 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9989
9990 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9993 {
9994 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9995 }
9997 {
9998 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9999 }
10000
10001 }
10002
10003 player.RemoveQuickBarEntityShortcut(this);
10004 }
10005 }
10006 }
10007
10009 {
10010 super.EEKilled(killer);
10011
10014 {
10015 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10016 {
10017 if (IsMagazine())
10018 {
10019 if (Magazine.Cast(this).GetAmmoCount() > 0)
10020 {
10022 }
10023 }
10024 else
10025 {
10027 }
10028 }
10029 }
10030 }
10031
10033 {
10034 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10035
10036 super.OnWasAttached(parent, slot_id);
10037
10040
10042 }
10043
10045 {
10046 super.OnWasDetached(parent, slot_id);
10047
10050 }
10051
10053 {
10054 int idx;
10057
10058 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10059 if (inventory_slots.Count() < 1)
10060 {
10061 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10062 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10063 }
10064 else
10065 {
10066 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10067 }
10068
10069 idx = inventory_slots.Find(slot);
10070 if (idx < 0)
10071 return "";
10072
10073 return attach_types.Get(idx);
10074 }
10075
10077 {
10078 int idx = -1;
10079 string slot;
10080
10083
10084 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10085 if (inventory_slots.Count() < 1)
10086 {
10087 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10088 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10089 }
10090 else
10091 {
10092 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10093 if (detach_types.Count() < 1)
10094 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10095 }
10096
10097 for (int i = 0; i < inventory_slots.Count(); i++)
10098 {
10099 slot = inventory_slots.Get(i);
10100 }
10101
10102 if (slot != "")
10103 {
10104 if (detach_types.Count() == 1)
10105 idx = 0;
10106 else
10107 idx = inventory_slots.Find(slot);
10108 }
10109 if (idx < 0)
10110 return "";
10111
10112 return detach_types.Get(idx);
10113 }
10114
10116 {
10117
10119
10120
10121 float min_time = 1;
10122 float max_time = 3;
10123 float delay = Math.RandomFloat(min_time, max_time);
10124
10125 explode_timer.Run(delay, this, "DoAmmoExplosion");
10126 }
10127
10129 {
10130 Magazine magazine = Magazine.Cast(this);
10131 int pop_sounds_count = 6;
10132 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10133
10134
10135 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10136 string sound_name = pop_sounds[ sound_idx ];
10138
10139
10140 magazine.ServerAddAmmoCount(-1);
10141
10142
10143 float min_temp_to_explode = 100;
10144
10145 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10146 {
10148 }
10149 }
10150
10151
10152 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10153 {
10154 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10155
10156 const int CHANCE_DAMAGE_CARGO = 4;
10157 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10158 const int CHANCE_DAMAGE_NOTHING = 2;
10159
10161 {
10162 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10163 int chances;
10164 int rnd;
10165
10166 if (GetInventory().GetCargo())
10167 {
10168 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10169 rnd = Math.RandomInt(0,chances);
10170
10171 if (rnd < CHANCE_DAMAGE_CARGO)
10172 {
10174 }
10175 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10176 {
10178 }
10179 }
10180 else
10181 {
10182 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10183 rnd = Math.RandomInt(0,chances);
10184
10185 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10186 {
10188 }
10189 }
10190 }
10191 }
10192
10194 {
10195 if (GetInventory().GetCargo())
10196 {
10197 int item_count = GetInventory().GetCargo().GetItemCount();
10198 if (item_count > 0)
10199 {
10200 int random_pick = Math.RandomInt(0, item_count);
10202 if (!item.IsExplosive())
10203 {
10204 item.AddHealth("","",damage);
10205 return true;
10206 }
10207 }
10208 }
10209 return false;
10210 }
10211
10213 {
10214 int attachment_count = GetInventory().AttachmentCount();
10215 if (attachment_count > 0)
10216 {
10217 int random_pick = Math.RandomInt(0, attachment_count);
10218 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10219 if (!attachment.IsExplosive())
10220 {
10221 attachment.AddHealth("","",damage);
10222 return true;
10223 }
10224 }
10225 return false;
10226 }
10227
10229 {
10231 }
10232
10234 {
10236 return GetInventory().CanRemoveEntity();
10237
10238 return false;
10239 }
10240
10242 {
10243
10245 return false;
10246
10247
10249 return false;
10250
10251
10252
10254 if (delta == 0)
10255 return false;
10256
10257
10258 return true;
10259 }
10260
10262 {
10264 {
10265 if (ScriptInputUserData.CanStoreInputUserData())
10266 {
10267 ScriptInputUserData ctx = new ScriptInputUserData;
10272 ctx.
Write(destination_entity);
10274 ctx.
Write(slot_id);
10276 }
10277 }
10278 else if (!
GetGame().IsMultiplayer())
10279 {
10281 }
10282 }
10283
10285 {
10286 float split_quantity_new;
10290 InventoryLocation loc = new InventoryLocation;
10291
10292 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10293 {
10295 split_quantity_new = stack_max;
10296 else
10298
10300 {
10301 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10302 if (new_item)
10303 {
10304 new_item.SetResultOfSplit(true);
10305 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10307 new_item.
SetQuantity(split_quantity_new,
false,
true);
10308 }
10309 }
10310 }
10311 else if (destination_entity && slot_id == -1)
10312 {
10313 if (quantity > stack_max)
10314 split_quantity_new = stack_max;
10315 else
10316 split_quantity_new = quantity;
10317
10319 {
10321 {
10324 }
10325
10326 if (new_item)
10327 {
10328 new_item.SetResultOfSplit(true);
10329 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10331 new_item.
SetQuantity(split_quantity_new,
false,
true);
10332 }
10333 }
10334 }
10335 else
10336 {
10337 if (stack_max != 0)
10338 {
10340 {
10342 }
10343
10344 if (split_quantity_new == 0)
10345 {
10346 if (!
GetGame().IsMultiplayer())
10347 player.PhysicalPredictiveDropItem(this);
10348 else
10349 player.ServerDropEntity(this);
10350 return;
10351 }
10352
10354 {
10356
10357 if (new_item)
10358 {
10359 new_item.SetResultOfSplit(true);
10360 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10363 new_item.PlaceOnSurface();
10364 }
10365 }
10366 }
10367 }
10368 }
10369
10371 {
10372 float split_quantity_new;
10376 InventoryLocation loc = new InventoryLocation;
10377
10378 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10379 {
10381 split_quantity_new = stack_max;
10382 else
10384
10386 {
10387 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10388 if (new_item)
10389 {
10390 new_item.SetResultOfSplit(true);
10391 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10393 new_item.
SetQuantity(split_quantity_new,
false,
true);
10394 }
10395 }
10396 }
10397 else if (destination_entity && slot_id == -1)
10398 {
10399 if (quantity > stack_max)
10400 split_quantity_new = stack_max;
10401 else
10402 split_quantity_new = quantity;
10403
10405 {
10407 {
10410 }
10411
10412 if (new_item)
10413 {
10414 new_item.SetResultOfSplit(true);
10415 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10417 new_item.
SetQuantity(split_quantity_new,
false,
true);
10418 }
10419 }
10420 }
10421 else
10422 {
10423 if (stack_max != 0)
10424 {
10426 {
10428 }
10429
10431 {
10433
10434 if (new_item)
10435 {
10436 new_item.SetResultOfSplit(true);
10437 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10440 new_item.PlaceOnSurface();
10441 }
10442 }
10443 }
10444 }
10445 }
10446
10448 {
10450 {
10451 if (ScriptInputUserData.CanStoreInputUserData())
10452 {
10453 ScriptInputUserData ctx = new ScriptInputUserData;
10458 dst.WriteToContext(ctx);
10460 }
10461 }
10462 else if (!
GetGame().IsMultiplayer())
10463 {
10465 }
10466 }
10467
10469 {
10471 {
10472 if (ScriptInputUserData.CanStoreInputUserData())
10473 {
10474 ScriptInputUserData ctx = new ScriptInputUserData;
10479 ctx.
Write(destination_entity);
10485 }
10486 }
10487 else if (!
GetGame().IsMultiplayer())
10488 {
10490 }
10491 }
10492
10494 {
10496 }
10497
10499 {
10501 float split_quantity_new;
10503 if (dst.IsValid())
10504 {
10505 int slot_id = dst.GetSlot();
10507
10508 if (quantity > stack_max)
10509 split_quantity_new = stack_max;
10510 else
10511 split_quantity_new = quantity;
10512
10514 {
10516
10517 if (new_item)
10518 {
10519 new_item.SetResultOfSplit(true);
10520 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10522 new_item.
SetQuantity(split_quantity_new,
false,
true);
10523 }
10524
10525 return new_item;
10526 }
10527 }
10528
10529 return null;
10530 }
10531
10533 {
10535 float split_quantity_new;
10537 if (destination_entity)
10538 {
10540 if (quantity > stackable)
10541 split_quantity_new = stackable;
10542 else
10543 split_quantity_new = quantity;
10544
10546 {
10547 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10548 if (new_item)
10549 {
10550 new_item.SetResultOfSplit(true);
10551 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10553 new_item.
SetQuantity(split_quantity_new,
false,
true);
10554 }
10555 }
10556 }
10557 }
10558
10560 {
10562 {
10563 if (ScriptInputUserData.CanStoreInputUserData())
10564 {
10565 ScriptInputUserData ctx = new ScriptInputUserData;
10570 ItemBase destination_entity =
this;
10571 ctx.
Write(destination_entity);
10575 }
10576 }
10577 else if (!
GetGame().IsMultiplayer())
10578 {
10580 }
10581 }
10582
10584 {
10586 float split_quantity_new;
10588 if (player)
10589 {
10591 if (quantity > stackable)
10592 split_quantity_new = stackable;
10593 else
10594 split_quantity_new = quantity;
10595
10597 {
10598 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10599 new_item =
ItemBase.Cast(in_hands);
10600 if (new_item)
10601 {
10602 new_item.SetResultOfSplit(true);
10603 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10605 new_item.SetQuantity(split_quantity_new, false, true);
10606 }
10607 }
10608 }
10609 }
10610
10612 {
10614 float split_quantity_new = Math.Floor(quantity * 0.5);
10615
10617 return;
10618
10620
10621 if (new_item)
10622 {
10623 if (new_item.GetQuantityMax() < split_quantity_new)
10624 {
10625 split_quantity_new = new_item.GetQuantityMax();
10626 }
10627
10628 new_item.SetResultOfSplit(true);
10629 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10630
10632 {
10635 }
10636 else
10637 {
10639 new_item.
SetQuantity(split_quantity_new,
false,
true);
10640 }
10641 }
10642 }
10643
10645 {
10647 float split_quantity_new = Math.Floor(quantity / 2);
10648
10650 return;
10651
10652 InventoryLocation invloc = new InventoryLocation;
10654
10656 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10657
10658 if (new_item)
10659 {
10660 if (new_item.GetQuantityMax() < split_quantity_new)
10661 {
10662 split_quantity_new = new_item.GetQuantityMax();
10663 }
10665 {
10668 }
10669 else if (split_quantity_new > 1)
10670 {
10672 new_item.
SetQuantity(split_quantity_new,
false,
true);
10673 }
10674 }
10675 }
10676
10679 {
10680 SetWeightDirty();
10682
10683 if (parent)
10684 parent.OnAttachmentQuantityChangedEx(this, delta);
10685
10687 {
10689 {
10691 }
10693 {
10694 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10696 }
10697 }
10698
10699 }
10700
10703 {
10704
10705 }
10706
10709 {
10711 }
10712
10714 {
10715 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10716
10718 {
10719 if (newLevel == GameConstants.STATE_RUINED)
10720 {
10722 EntityAI parent = GetHierarchyParent();
10723 if (parent && parent.IsFireplace())
10724 {
10725 CargoBase cargo = GetInventory().GetCargo();
10726 if (cargo)
10727 {
10729 {
10731 }
10732 }
10733 }
10734 }
10735
10737 {
10738
10740 return;
10741 }
10742
10743 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10744 {
10746 }
10747 }
10748 }
10749
10750
10752 {
10753 super.OnRightClick();
10754
10756 {
10758 {
10759 if (ScriptInputUserData.CanStoreInputUserData())
10760 {
10761 EntityAI root = GetHierarchyRoot();
10762 Man playerOwner = GetHierarchyRootPlayer();
10763 InventoryLocation dst = new InventoryLocation;
10764
10765
10766 if (!playerOwner && root && root == this)
10767 {
10769 }
10770 else
10771 {
10772
10773 GetInventory().GetCurrentInventoryLocation(dst);
10775 {
10778 {
10780 }
10781 else
10782 {
10784
10785
10786 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10787 {
10789 }
10790 else
10791 {
10792 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10793 }
10794 }
10795 }
10796 }
10797
10798 ScriptInputUserData ctx = new ScriptInputUserData;
10806 }
10807 }
10808 else if (!
GetGame().IsMultiplayer())
10809 {
10811 }
10812 }
10813 }
10814
10816 {
10817 if (root)
10818 {
10819 vector m4[4];
10820 root.GetTransform(m4);
10821 dst.SetGround(this, m4);
10822 }
10823 else
10824 {
10825 GetInventory().GetCurrentInventoryLocation(dst);
10826 }
10827 }
10828
10829 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10830 {
10831
10832 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10833 return false;
10834
10835 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10836 return false;
10837
10838
10840 return false;
10841
10842
10843 Magazine mag = Magazine.Cast(this);
10844 if (mag)
10845 {
10846 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10847 return false;
10848
10849 if (stack_max_limit)
10850 {
10851 Magazine other_mag = Magazine.Cast(other_item);
10852 if (other_item)
10853 {
10854 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10855 return false;
10856 }
10857
10858 }
10859 }
10860 else
10861 {
10862
10864 return false;
10865
10867 return false;
10868 }
10869
10870 PlayerBase player = null;
10871 if (CastTo(player, GetHierarchyRootPlayer()))
10872 {
10873 if (player.GetInventory().HasAttachment(this))
10874 return false;
10875
10876 if (player.IsItemsToDelete())
10877 return false;
10878 }
10879
10880 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10881 return false;
10882
10883 int slotID;
10885 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10886 return false;
10887
10888 return true;
10889 }
10890
10892 {
10894 }
10895
10897 {
10898 return m_IsResultOfSplit;
10899 }
10900
10902 {
10903 m_IsResultOfSplit = value;
10904 }
10905
10907 {
10909 }
10910
10912 {
10913 float other_item_quantity = other_item.GetQuantity();
10914 float this_free_space;
10915
10917
10919
10920 if (other_item_quantity > this_free_space)
10921 {
10922 return this_free_space;
10923 }
10924 else
10925 {
10926 return other_item_quantity;
10927 }
10928 }
10929
10931 {
10933 }
10934
10936 {
10938 return;
10939
10940 if (!IsMagazine() && other_item)
10941 {
10943 if (quantity_used != 0)
10944 {
10945 float hp1 = GetHealth01("","");
10946 float hp2 = other_item.GetHealth01("","");
10947 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10948 hpResult = hpResult / (
GetQuantity() + quantity_used);
10949
10950 hpResult *= GetMaxHealth();
10951 Math.Round(hpResult);
10952 SetHealth("", "Health", hpResult);
10953
10955 other_item.AddQuantity(-quantity_used);
10956 }
10957 }
10959 }
10960
10962 {
10963 #ifdef SERVER
10964 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10965 GetHierarchyParent().IncreaseLifetimeUp();
10966 #endif
10967 };
10968
10970 {
10971 PlayerBase p = PlayerBase.Cast(player);
10972
10973 array<int> recipesIds = p.m_Recipes;
10974 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10975 if (moduleRecipesManager)
10976 {
10977 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10978 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10979 }
10980
10981 for (int i = 0;i < recipesIds.Count(); i++)
10982 {
10983 int key = recipesIds.Get(i);
10984 string recipeName = moduleRecipesManager.GetRecipeName(key);
10986 }
10987 }
10988
10989
10990 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10991 {
10992 super.GetDebugActions(outputList);
10993
10994
11000
11001
11006
11011
11012
11016
11017
11019 {
11023 }
11024
11027
11028
11032
11034
11035 InventoryLocation loc = new InventoryLocation();
11036 GetInventory().GetCurrentInventoryLocation(loc);
11038 {
11039 if (Gizmo_IsSupported())
11042 }
11043
11045 }
11046
11047
11048
11049
11051 {
11052 super.OnAction(action_id, player, ctx);
11053
11055 {
11056 switch (action_id)
11057 {
11060 return true;
11063 return true;
11064 }
11065 }
11066
11068 {
11069 switch (action_id)
11070 {
11072 Delete();
11073 return true;
11074 }
11075 }
11076
11077 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11078 {
11079 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11080 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11081 PlayerBase p = PlayerBase.Cast(player);
11082 if (
EActions.RECIPES_RANGE_START < 1000)
11083 {
11084 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11085 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11086 }
11087 }
11088 #ifndef SERVER
11089 else if (action_id ==
EActions.WATCH_PLAYER)
11090 {
11091 PluginDeveloper.SetDeveloperItemClientEx(player);
11092 }
11093 #endif
11095 {
11096 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11097 {
11098 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11099 OnDebugButtonPressServer(id + 1);
11100 }
11101
11102 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11103 {
11104 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11106 }
11107
11108 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11109 {
11110 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11112 }
11113
11114 else if (action_id ==
EActions.ADD_QUANTITY)
11115 {
11116 if (IsMagazine())
11117 {
11118 Magazine mag = Magazine.Cast(this);
11119 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11120 }
11121 else
11122 {
11124 }
11125
11126 if (m_EM)
11127 {
11128 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11129 }
11130
11131 }
11132
11133 else if (action_id ==
EActions.REMOVE_QUANTITY)
11134 {
11135 if (IsMagazine())
11136 {
11137 Magazine mag2 = Magazine.Cast(this);
11138 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11139 }
11140 else
11141 {
11143 }
11144 if (m_EM)
11145 {
11146 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11147 }
11148
11149 }
11150
11151 else if (action_id ==
EActions.SET_QUANTITY_0)
11152 {
11154
11155 if (m_EM)
11156 {
11157 m_EM.SetEnergy(0);
11158 }
11159 }
11160
11161 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11162 {
11164
11165 if (m_EM)
11166 {
11167 m_EM.SetEnergy(m_EM.GetEnergyMax());
11168 }
11169 }
11170
11171 else if (action_id ==
EActions.ADD_HEALTH)
11172 {
11173 AddHealth("","",GetMaxHealth("","Health")/5);
11174 }
11175 else if (action_id ==
EActions.REMOVE_HEALTH)
11176 {
11177 AddHealth("","",-GetMaxHealth("","Health")/5);
11178 }
11179 else if (action_id ==
EActions.DESTROY_HEALTH)
11180 {
11181 SetHealth01("","",0);
11182 }
11183 else if (action_id ==
EActions.WATCH_ITEM)
11184 {
11186 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11187 #ifdef DEVELOPER
11188 SetDebugDeveloper_item(this);
11189 #endif
11190 }
11191
11192 else if (action_id ==
EActions.ADD_TEMPERATURE)
11193 {
11194 AddTemperature(20);
11195
11196 }
11197
11198 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11199 {
11200 AddTemperature(-20);
11201
11202 }
11203
11204 else if (action_id ==
EActions.FLIP_FROZEN)
11205 {
11206 SetFrozen(!GetIsFrozen());
11207
11208 }
11209
11210 else if (action_id ==
EActions.ADD_WETNESS)
11211 {
11213
11214 }
11215
11216 else if (action_id ==
EActions.REMOVE_WETNESS)
11217 {
11219
11220 }
11221
11222 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11223 {
11226
11227
11228 }
11229
11230 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11231 {
11234 }
11235
11236 else if (action_id ==
EActions.MAKE_SPECIAL)
11237 {
11238 auto debugParams = DebugSpawnParams.WithPlayer(player);
11239 OnDebugSpawnEx(debugParams);
11240 }
11241
11242 }
11243
11244
11245 return false;
11246 }
11247
11248
11249
11250
11254
11257
11258
11259
11261 {
11262 return false;
11263 }
11264
11265
11267 {
11268 return true;
11269 }
11270
11271
11273 {
11274 return true;
11275 }
11276
11277
11278
11280 {
11281 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11283 }
11284
11287 {
11288 return null;
11289 }
11290
11292 {
11293 return false;
11294 }
11295
11297 {
11298 return false;
11299 }
11300
11304
11305
11307 {
11308 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11309 return module_repairing.CanRepair(this, item_repair_kit);
11310 }
11311
11312
11313 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11314 {
11315 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11316 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11317 }
11318
11319
11321 {
11322
11323
11324
11325
11326
11327
11328
11329
11330 return 1;
11331 }
11332
11333
11334
11336 {
11338 }
11339
11340
11341
11343 {
11345 }
11346
11347
11356 {
11357 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11358
11359 if (player)
11360 {
11361 player.MessageStatus(text);
11362 }
11363 }
11364
11365
11374 {
11375 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11376
11377 if (player)
11378 {
11379 player.MessageAction(text);
11380 }
11381 }
11382
11383
11392 {
11393 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11394
11395 if (player)
11396 {
11397 player.MessageFriendly(text);
11398 }
11399 }
11400
11401
11410 {
11411 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11412
11413 if (player)
11414 {
11415 player.MessageImportant(text);
11416 }
11417 }
11418
11420 {
11421 return true;
11422 }
11423
11424
11425 override bool KindOf(
string tag)
11426 {
11427 bool found = false;
11428 string item_name = this.
GetType();
11431
11432 int array_size = item_tag_array.Count();
11433 for (int i = 0; i < array_size; i++)
11434 {
11435 if (item_tag_array.Get(i) == tag)
11436 {
11437 found = true;
11438 break;
11439 }
11440 }
11441 return found;
11442 }
11443
11444
11446 {
11447
11448 super.OnRPC(sender, rpc_type,ctx);
11449
11450
11451 switch (rpc_type)
11452 {
11453 #ifndef SERVER
11454 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11455 Param2<bool, string> p = new Param2<bool, string>(false, "");
11456
11458 return;
11459
11460 bool play = p.param1;
11461 string soundSet = p.param2;
11462
11463 if (play)
11464 {
11466 {
11468 {
11470 }
11471 }
11472 else
11473 {
11475 }
11476 }
11477 else
11478 {
11480 }
11481
11482 break;
11483 #endif
11484
11485 }
11486
11488 {
11490 }
11491 }
11492
11493
11494
11495
11497 {
11498 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11499 return plugin.GetID(
name);
11500 }
11501
11503 {
11504 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11505 return plugin.GetName(id);
11506 }
11507
11510 {
11511
11512
11513 int varFlags;
11514 if (!ctx.
Read(varFlags))
11515 return;
11516
11517 if (varFlags & ItemVariableFlags.FLOAT)
11518 {
11520 }
11521 }
11522
11524 {
11525
11526 super.SerializeNumericalVars(floats_out);
11527
11528
11529
11531 {
11533 }
11534
11536 {
11538 }
11539
11541 {
11543 }
11544
11546 {
11551 }
11552
11554 {
11556 }
11557 }
11558
11560 {
11561
11562 super.DeSerializeNumericalVars(floats);
11563
11564
11565 int index = 0;
11566 int mask = Math.Round(floats.Get(index));
11567
11568 index++;
11569
11571 {
11573 {
11575 }
11576 else
11577 {
11578 float quantity = floats.Get(index);
11579 SetQuantity(quantity,
true,
false,
false,
false);
11580 }
11581 index++;
11582 }
11583
11585 {
11586 float wet = floats.Get(index);
11588 index++;
11589 }
11590
11592 {
11593 int liquidtype = Math.Round(floats.Get(index));
11595 index++;
11596 }
11597
11599 {
11601 index++;
11603 index++;
11605 index++;
11607 index++;
11608 }
11609
11611 {
11612 int cleanness = Math.Round(floats.Get(index));
11614 index++;
11615 }
11616 }
11617
11619 {
11620 super.WriteVarsToCTX(ctx);
11621
11622
11624 {
11626 }
11627
11629 {
11631 }
11632
11634 {
11636 }
11637
11639 {
11640 int r,g,b,a;
11646 }
11647
11649 {
11651 }
11652 }
11653
11655 {
11656 if (!super.ReadVarsFromCTX(ctx,version))
11657 return false;
11658
11659 int intValue;
11660 float value;
11661
11662 if (version < 140)
11663 {
11664 if (!ctx.
Read(intValue))
11665 return false;
11666
11667 m_VariablesMask = intValue;
11668 }
11669
11671 {
11672 if (!ctx.
Read(value))
11673 return false;
11674
11676 {
11678 }
11679 else
11680 {
11682 }
11683 }
11684
11685 if (version < 140)
11686 {
11688 {
11689 if (!ctx.
Read(value))
11690 return false;
11691 SetTemperatureDirect(value);
11692 }
11693 }
11694
11696 {
11697 if (!ctx.
Read(value))
11698 return false;
11700 }
11701
11703 {
11704 if (!ctx.
Read(intValue))
11705 return false;
11707 }
11708
11710 {
11711 int r,g,b,a;
11713 return false;
11715 return false;
11717 return false;
11719 return false;
11720
11722 }
11723
11725 {
11726 if (!ctx.
Read(intValue))
11727 return false;
11729 }
11730
11731 if (version >= 138 && version < 140)
11732 {
11734 {
11735 if (!ctx.
Read(intValue))
11736 return false;
11737 SetFrozen(intValue);
11738 }
11739 }
11740
11741 return true;
11742 }
11743
11744
11746 {
11749 {
11751 }
11752
11753 if (!super.OnStoreLoad(ctx, version))
11754 {
11756 return false;
11757 }
11758
11759 if (version >= 114)
11760 {
11761 bool hasQuickBarIndexSaved;
11762
11763 if (!ctx.
Read(hasQuickBarIndexSaved))
11764 {
11766 return false;
11767 }
11768
11769 if (hasQuickBarIndexSaved)
11770 {
11771 int itmQBIndex;
11772
11773
11774 if (!ctx.
Read(itmQBIndex))
11775 {
11777 return false;
11778 }
11779
11780 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11781 if (itmQBIndex != -1 && parentPlayer)
11782 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11783 }
11784 }
11785 else
11786 {
11787
11788 PlayerBase player;
11789 int itemQBIndex;
11790 if (version ==
int.
MAX)
11791 {
11792 if (!ctx.
Read(itemQBIndex))
11793 {
11795 return false;
11796 }
11797 }
11798 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11799 {
11800
11801 if (!ctx.
Read(itemQBIndex))
11802 {
11804 return false;
11805 }
11806 if (itemQBIndex != -1 && player)
11807 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11808 }
11809 }
11810
11811 if (version < 140)
11812 {
11813
11814 if (!LoadVariables(ctx, version))
11815 {
11817 return false;
11818 }
11819 }
11820
11821
11823 {
11825 return false;
11826 }
11827 if (version >= 132)
11828 {
11830 if (raib)
11831 {
11833 {
11835 return false;
11836 }
11837 }
11838 }
11839
11841 return true;
11842 }
11843
11844
11845
11847 {
11848 super.OnStoreSave(ctx);
11849
11850 PlayerBase player;
11851 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11852 {
11854
11855 int itemQBIndex = -1;
11856 itemQBIndex = player.FindQuickBarEntityIndex(this);
11857 ctx.
Write(itemQBIndex);
11858 }
11859 else
11860 {
11862 }
11863
11865
11867 if (raib)
11868 {
11870 }
11871 }
11872
11873
11875 {
11876 super.AfterStoreLoad();
11877
11879 {
11881 }
11882
11884 {
11887 }
11888 }
11889
11891 {
11892 super.EEOnAfterLoad();
11893
11895 {
11897 }
11898
11901 }
11902
11904 {
11905 return false;
11906 }
11907
11908
11909
11911 {
11913 {
11914 #ifdef PLATFORM_CONSOLE
11915
11917 {
11919 if (menu)
11920 {
11922 }
11923 }
11924 #endif
11925 }
11926
11928 {
11931 }
11932
11934 {
11935 SetWeightDirty();
11937 }
11939 {
11942 }
11943
11945 {
11948 }
11950 {
11953 }
11954
11955 super.OnVariablesSynchronized();
11956 }
11957
11958
11959
11961 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11962 {
11963 if (!IsServerCheck(allow_client))
11964 return false;
11965
11967 return false;
11968
11971
11972 if (value <= (min + 0.001))
11973 value = min;
11974
11975 if (value == min)
11976 {
11977 if (destroy_config)
11978 {
11979 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11980 if (dstr)
11981 {
11983 this.Delete();
11984 return true;
11985 }
11986 }
11987 else if (destroy_forced)
11988 {
11990 this.Delete();
11991 return true;
11992 }
11993
11995 }
11996
11999
12001 {
12003
12004 if (delta)
12006 }
12007
12009
12010 return false;
12011 }
12012
12013
12015 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12016 {
12018 }
12019
12021 {
12024 }
12025
12027 {
12030 }
12031
12033 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12034 {
12035 float value_clamped = Math.Clamp(value, 0, 1);
12037 SetQuantity(result, destroy_config, destroy_forced);
12038 }
12039
12040
12043 {
12045 }
12046
12048 {
12050 }
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12062 {
12063 int slot = -1;
12064 if (GetInventory())
12065 {
12066 InventoryLocation il = new InventoryLocation;
12067 GetInventory().GetCurrentInventoryLocation(il);
12069 }
12070
12072 }
12073
12075 {
12076 float quantity_max = 0;
12077
12079 {
12080 if (attSlotID != -1)
12081 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12082
12083 if (quantity_max <= 0)
12085 }
12086
12087 if (quantity_max <= 0)
12089
12090 return quantity_max;
12091 }
12092
12094 {
12096 }
12097
12099 {
12101 }
12102
12103
12105 {
12107 }
12108
12110 {
12112 }
12113
12115 {
12117 }
12118
12119
12121 {
12122
12123 float weightEx = GetWeightEx();
12124 float special = GetInventoryAndCargoWeight();
12125 return weightEx - special;
12126 }
12127
12128
12130 {
12132 }
12133
12135 {
12137 {
12138 #ifdef DEVELOPER
12139 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12140 {
12141 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12143 }
12144 #endif
12145
12146 return GetQuantity() * GetConfigWeightModified();
12147 }
12148 else if (HasEnergyManager())
12149 {
12150 #ifdef DEVELOPER
12151 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12152 {
12153 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12154 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12155 }
12156 #endif
12157 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12158 }
12159 else
12160 {
12161 #ifdef DEVELOPER
12162 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12163 {
12164 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12165 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12166 }
12167 #endif
12168 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12169 }
12170 }
12171
12174 {
12175 int item_count = 0;
12177
12178 if (GetInventory().GetCargo() != NULL)
12179 {
12180 item_count = GetInventory().GetCargo().GetItemCount();
12181 }
12182
12183 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12184 {
12185 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12186 if (item)
12187 item_count += item.GetNumberOfItems();
12188 }
12189 return item_count;
12190 }
12191
12194 {
12195 float weight = 0;
12196 float wetness = 1;
12197 if (include_wetness)
12200 {
12201 weight = wetness * m_ConfigWeight;
12202 }
12204 {
12205 weight = 1;
12206 }
12207 return weight;
12208 }
12209
12210
12211
12213 {
12214 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12215 {
12216 GameInventory inv = GetInventory();
12217 array<EntityAI> items = new array<EntityAI>;
12219 for (int i = 0; i < items.Count(); i++)
12220 {
12222 if (item)
12223 {
12225 }
12226 }
12227 }
12228 }
12229
12230
12231
12232
12234 {
12235 float energy = 0;
12236 if (HasEnergyManager())
12237 {
12238 energy = GetCompEM().GetEnergy();
12239 }
12240 return energy;
12241 }
12242
12243
12245 {
12246 super.OnEnergyConsumed();
12247
12249 }
12250
12252 {
12253 super.OnEnergyAdded();
12254
12256 }
12257
12258
12260 {
12261 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12262 {
12264 {
12265 float energy_0to1 = GetCompEM().GetEnergy0To1();
12267 }
12268 }
12269 }
12270
12271
12273 {
12274 return ConfigGetFloat("heatIsolation");
12275 }
12276
12278 {
12280 }
12281
12283 {
12284 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12285 if (
GetGame().ConfigIsExisting(paramPath))
12287
12288 return 0.0;
12289 }
12290
12292 {
12293 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12294 if (
GetGame().ConfigIsExisting(paramPath))
12296
12297 return 0.0;
12298 }
12299
12300 override void SetWet(
float value,
bool allow_client =
false)
12301 {
12302 if (!IsServerCheck(allow_client))
12303 return;
12304
12307
12309
12310 m_VarWet = Math.Clamp(value, min, max);
12311
12313 {
12316 }
12317 }
12318
12319 override void AddWet(
float value)
12320 {
12322 }
12323
12325 {
12327 }
12328
12330 {
12332 }
12333
12335 {
12337 }
12338
12340 {
12342 }
12343
12345 {
12347 }
12348
12349 override void OnWetChanged(
float newVal,
float oldVal)
12350 {
12353 if (newLevel != oldLevel)
12354 {
12356 }
12357 }
12358
12360 {
12361 SetWeightDirty();
12362 }
12363
12365 {
12366 return GetWetLevelInternal(
m_VarWet);
12367 }
12368
12369
12370
12372 {
12374 }
12375
12377 {
12379 }
12380
12382 {
12384 }
12385
12387 {
12389 }
12390
12391
12392
12394 {
12395 if (ConfigIsExisting("itemModelLength"))
12396 {
12397 return ConfigGetFloat("itemModelLength");
12398 }
12399 return 0;
12400 }
12401
12403 {
12404 if (ConfigIsExisting("itemAttachOffset"))
12405 {
12406 return ConfigGetFloat("itemAttachOffset");
12407 }
12408 return 0;
12409 }
12410
12411 override void SetCleanness(
int value,
bool allow_client =
false)
12412 {
12413 if (!IsServerCheck(allow_client))
12414 return;
12415
12417
12419
12422 }
12423
12425 {
12427 }
12428
12430 {
12431 return true;
12432 }
12433
12434
12435
12436
12438 {
12440 }
12441
12443 {
12445 }
12446
12447
12448
12449
12450 override void SetColor(
int r,
int g,
int b,
int a)
12451 {
12457 }
12459 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12460 {
12465 }
12466
12468 {
12470 }
12471
12474 {
12475 int r,g,b,a;
12477 r = r/255;
12478 g = g/255;
12479 b = b/255;
12480 a = a/255;
12481 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12482 }
12483
12484
12485
12486 override void SetLiquidType(
int value,
bool allow_client =
false)
12487 {
12488 if (!IsServerCheck(allow_client))
12489 return;
12490
12495 }
12496
12498 {
12499 return ConfigGetInt("varLiquidTypeInit");
12500 }
12501
12503 {
12505 }
12506
12508 {
12510 SetFrozen(false);
12511 }
12512
12515 {
12516 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12517 }
12518
12519
12522 {
12523 PlayerBase nplayer;
12524 if (PlayerBase.CastTo(nplayer, player))
12525 {
12527
12528 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12529 }
12530 }
12531
12532
12535 {
12536 PlayerBase nplayer;
12537 if (PlayerBase.CastTo(nplayer,player))
12538 {
12539
12540 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12541
12542 }
12543
12544
12545 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12546
12547
12548 if (HasEnergyManager())
12549 {
12550 GetCompEM().UpdatePlugState();
12551 }
12552 }
12553
12554
12556 {
12557 super.OnPlacementStarted(player);
12558
12560 }
12561
12562 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12563 {
12565 {
12566 m_AdminLog.OnPlacementComplete(player,
this);
12567 }
12568
12569 super.OnPlacementComplete(player, position, orientation);
12570 }
12571
12572
12573
12574
12575
12577 {
12579 {
12580 return true;
12581 }
12582 else
12583 {
12584 return false;
12585 }
12586 }
12587
12588
12590 {
12592 {
12594 }
12595 }
12596
12597
12599 {
12601 }
12602
12604 {
12606 }
12607
12608 override void InsertAgent(
int agent,
float count = 1)
12609 {
12610 if (count < 1)
12611 return;
12612
12614 }
12615
12618 {
12620 }
12621
12622
12624 {
12626 }
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656
12657
12658
12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12670 {
12672 return false;
12673 return true;
12674 }
12675
12677 {
12678
12680 }
12681
12682
12685 {
12686 super.CheckForRoofLimited(timeTresholdMS);
12687
12689 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12690 {
12691 m_PreviousRoofTestTime = time;
12692 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12693 }
12694 }
12695
12696
12698 {
12700 {
12701 return 0;
12702 }
12703
12704 if (GetInventory().GetAttachmentSlotsCount() != 0)
12705 {
12706 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12707 if (filter)
12708 return filter.GetProtectionLevel(type, false, system);
12709 else
12710 return 0;
12711 }
12712
12713 string subclassPath, entryName;
12714
12715 switch (type)
12716 {
12718 entryName = "biological";
12719 break;
12721 entryName = "chemical";
12722 break;
12723 default:
12724 entryName = "biological";
12725 break;
12726 }
12727
12728 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12729
12731 }
12732
12733
12734
12737 {
12738 if (!IsMagazine())
12740
12742 }
12743
12744
12745
12746
12747
12752 {
12753 return true;
12754 }
12755
12757 {
12759 }
12760
12761
12762
12763
12764
12766 {
12767 if (parent)
12768 {
12769 if (parent.IsInherited(DayZInfected))
12770 return true;
12771
12772 if (!parent.IsRuined())
12773 return true;
12774 }
12775
12776 return true;
12777 }
12778
12780 {
12781 if (!super.CanPutAsAttachment(parent))
12782 {
12783 return false;
12784 }
12785
12786 if (!IsRuined() && !parent.IsRuined())
12787 {
12788 return true;
12789 }
12790
12791 return false;
12792 }
12793
12795 {
12796
12797
12798
12799
12800 return super.CanReceiveItemIntoCargo(item);
12801 }
12802
12804 {
12805
12806
12807
12808
12809 GameInventory attachmentInv = attachment.GetInventory();
12811 {
12812 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12813 return false;
12814 }
12815
12816 InventoryLocation loc = new InventoryLocation();
12817 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12818 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12819 return false;
12820
12821 return super.CanReceiveAttachment(attachment, slotId);
12822 }
12823
12825 {
12826 if (!super.CanReleaseAttachment(attachment))
12827 return false;
12828
12829 return GetInventory().AreChildrenAccessible();
12830 }
12831
12832
12833
12834
12835
12836
12837
12838
12839
12840
12841
12842
12843
12844
12845
12846
12847
12848
12849
12850
12851
12853 {
12854 int id = muzzle_owner.GetMuzzleID();
12855 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12856
12857 if (WPOF_array)
12858 {
12859 for (int i = 0; i < WPOF_array.Count(); i++)
12860 {
12861 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12862
12863 if (WPOF)
12864 {
12865 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12866 }
12867 }
12868 }
12869 }
12870
12871
12873 {
12874 int id = muzzle_owner.GetMuzzleID();
12876
12877 if (WPOBE_array)
12878 {
12879 for (int i = 0; i < WPOBE_array.Count(); i++)
12880 {
12881 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12882
12883 if (WPOBE)
12884 {
12885 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12886 }
12887 }
12888 }
12889 }
12890
12891
12893 {
12894 int id = muzzle_owner.GetMuzzleID();
12895 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12896
12897 if (WPOOH_array)
12898 {
12899 for (int i = 0; i < WPOOH_array.Count(); i++)
12900 {
12901 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12902
12903 if (WPOOH)
12904 {
12905 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12906 }
12907 }
12908 }
12909 }
12910
12911
12913 {
12914 int id = muzzle_owner.GetMuzzleID();
12915 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12916
12917 if (WPOOH_array)
12918 {
12919 for (int i = 0; i < WPOOH_array.Count(); i++)
12920 {
12921 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12922
12923 if (WPOOH)
12924 {
12925 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12926 }
12927 }
12928 }
12929 }
12930
12931
12933 {
12934 int id = muzzle_owner.GetMuzzleID();
12935 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12936
12937 if (WPOOH_array)
12938 {
12939 for (int i = 0; i < WPOOH_array.Count(); i++)
12940 {
12941 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12942
12943 if (WPOOH)
12944 {
12945 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12946 }
12947 }
12948 }
12949 }
12950
12951
12952
12954 {
12956 {
12957 return true;
12958 }
12959
12960 return false;
12961 }
12962
12964 {
12966 {
12967 return true;
12968 }
12969
12970 return false;
12971 }
12972
12974 {
12976 {
12977 return true;
12978 }
12979
12980 return false;
12981 }
12982
12984 {
12985 return false;
12986 }
12987
12990 {
12991 return UATimeSpent.DEFAULT_DEPLOY;
12992 }
12993
12994
12995
12996
12998 {
13000 SetSynchDirty();
13001 }
13002
13004 {
13006 }
13007
13008
13010 {
13011 return false;
13012 }
13013
13016 {
13017 string att_type = "None";
13018
13019 if (ConfigIsExisting("soundAttType"))
13020 {
13021 att_type = ConfigGetString("soundAttType");
13022 }
13023
13025 }
13026
13028 {
13030 }
13031
13032
13033
13034
13035
13041
13043 {
13046
13048 }
13049
13050
13052 {
13054 return;
13055
13057
13060
13063
13064 SoundParameters params = new SoundParameters();
13068 }
13069
13070
13072 {
13074 return;
13075
13077 SetSynchDirty();
13078
13081 }
13082
13083
13085 {
13087 return;
13088
13090 SetSynchDirty();
13091
13094 }
13095
13097 {
13099 }
13100
13102 {
13104 }
13105
13108 {
13109 if (!
GetGame().IsDedicatedServer())
13110 {
13111 if (ConfigIsExisting("attachSoundSet"))
13112 {
13113 string cfg_path = "";
13114 string soundset = "";
13115 string type_name =
GetType();
13116
13119 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13120 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13121
13122 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13123 {
13124 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13125 {
13126 if (cfg_slot_array[i] == slot_type)
13127 {
13128 soundset = cfg_soundset_array[i];
13129 break;
13130 }
13131 }
13132 }
13133
13134 if (soundset != "")
13135 {
13136 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13138 }
13139 }
13140 }
13141 }
13142
13144 {
13145
13146 }
13147
13148 void OnApply(PlayerBase player);
13149
13151 {
13152 return 1.0;
13153 };
13154
13156 {
13158 }
13159
13161 {
13163 }
13164
13166
13168 {
13169 SetDynamicPhysicsLifeTime(0.01);
13171 }
13172
13174 {
13175 array<string> zone_names = new array<string>;
13176 GetDamageZones(zone_names);
13177 for (int i = 0; i < zone_names.Count(); i++)
13178 {
13179 SetHealthMax(zone_names.Get(i),"Health");
13180 }
13181 SetHealthMax("","Health");
13182 }
13183
13186 {
13187 float global_health = GetHealth01("","Health");
13188 array<string> zones = new array<string>;
13189 GetDamageZones(zones);
13190
13191 for (int i = 0; i < zones.Count(); i++)
13192 {
13193 SetHealth01(zones.Get(i),"Health",global_health);
13194 }
13195 }
13196
13199 {
13200 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13201 }
13202
13204 {
13205 if (!hasRootAsPlayer)
13206 {
13207 if (refParentIB)
13208 {
13209
13210 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13211 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13212
13213 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13214 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13215
13218 }
13219 else
13220 {
13221
13224 }
13225 }
13226 }
13227
13229 {
13231 {
13232 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13233 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13234 {
13235 float heatPermCoef = 1.0;
13237 while (ent)
13238 {
13239 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13240 ent = ent.GetHierarchyParent();
13241 }
13242
13243 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13244 }
13245 }
13246 }
13247
13249 {
13250
13251 EntityAI parent = GetHierarchyParent();
13252 if (!parent)
13253 {
13254 hasParent = false;
13255 hasRootAsPlayer = false;
13256 }
13257 else
13258 {
13259 hasParent = true;
13260 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13261 refParentIB =
ItemBase.Cast(parent);
13262 }
13263 }
13264
13265 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13266 {
13267
13268 }
13269
13271 {
13272
13273 return false;
13274 }
13275
13277 {
13278
13279
13280 return false;
13281 }
13282
13284 {
13285
13286 return false;
13287 }
13288
13291 {
13292 return !GetIsFrozen() &&
IsOpen();
13293 }
13294
13296 {
13297 bool hasParent = false, hasRootAsPlayer = false;
13299
13300 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13301 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13302
13303 if (wwtu || foodDecay)
13304 {
13308
13309 if (processWetness || processTemperature || processDecay)
13310 {
13312
13313 if (processWetness)
13314 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13315
13316 if (processTemperature)
13318
13319 if (processDecay)
13320 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13321 }
13322 }
13323 }
13324
13327 {
13329 }
13330
13332 {
13335
13336 return super.GetTemperatureFreezeThreshold();
13337 }
13338
13340 {
13343
13344 return super.GetTemperatureThawThreshold();
13345 }
13346
13348 {
13351
13352 return super.GetItemOverheatThreshold();
13353 }
13354
13356 {
13358 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13359
13360 return super.GetTemperatureFreezeTime();
13361 }
13362
13364 {
13366 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13367
13368 return super.GetTemperatureThawTime();
13369 }
13370
13375
13377 {
13378 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13379 }
13380
13382 {
13383 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13384 }
13385
13388 {
13390 }
13391
13393 {
13395 }
13396
13398 {
13400 }
13401
13404 {
13405 return null;
13406 }
13407
13410 {
13411 return false;
13412 }
13413
13415 {
13417 {
13420 if (!trg)
13421 {
13423 explosive = this;
13424 }
13425
13426 explosive.PairRemote(trg);
13428
13429 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13430 trg.SetPersistentPairID(persistentID);
13431 explosive.SetPersistentPairID(persistentID);
13432
13433 return true;
13434 }
13435 return false;
13436 }
13437
13440 {
13441 float ret = 1.0;
13444 ret *= GetHealth01();
13445
13446 return ret;
13447 }
13448
13449 #ifdef DEVELOPER
13450 override void SetDebugItem()
13451 {
13452 super.SetDebugItem();
13453 _itemBase = this;
13454 }
13455
13457 {
13458 string text = super.GetDebugText();
13459
13461 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13462
13463 return text;
13464 }
13465 #endif
13466
13468 {
13469 return true;
13470 }
13471
13473
13475
13477 {
13480 }
13481
13482
13490
13506}
13507
13509{
13511 if (entity)
13512 {
13513 bool is_item = entity.IsInherited(
ItemBase);
13514 if (is_item && full_quantity)
13515 {
13518 }
13519 }
13520 else
13521 {
13523 return NULL;
13524 }
13525 return entity;
13526}
13527
13529{
13530 if (item)
13531 {
13532 if (health > 0)
13533 item.SetHealth("", "", health);
13534
13535 if (item.CanHaveTemperature())
13536 {
13538 if (item.CanFreeze())
13539 item.SetFrozen(false);
13540 }
13541
13542 if (item.HasEnergyManager())
13543 {
13544 if (quantity >= 0)
13545 {
13546 item.GetCompEM().SetEnergy0To1(quantity);
13547 }
13548 else
13549 {
13551 }
13552 }
13553 else if (item.IsMagazine())
13554 {
13555 Magazine mag = Magazine.Cast(item);
13556 if (quantity >= 0)
13557 {
13558 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13559 }
13560 else
13561 {
13563 }
13564
13565 }
13566 else
13567 {
13568 if (quantity >= 0)
13569 {
13570 item.SetQuantityNormalized(quantity, false);
13571 }
13572 else
13573 {
13575 }
13576
13577 }
13578 }
13579}
13580
13581#ifdef DEVELOPER
13583#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.