8555{
8557 {
8558 return true;
8559 }
8560};
8561
8562
8563
8565{
8569
8571
8574
8575
8576
8577
8578
8587
8593
8598
8603
8624 protected bool m_IsResultOfSplit
8625
8627
8632
8633
8634
8636
8640
8641
8642
8644
8647
8648
8649
8655
8656
8664
8667
8668
8670
8671
8673
8674
8679
8680
8685
8686
8688
8689
8691 {
8696
8697 if (!
GetGame().IsDedicatedServer())
8698 {
8700 {
8702
8704 {
8706 }
8707 }
8708
8711 }
8712
8713 m_OldLocation = null;
8714
8716 {
8718 }
8719
8720 if (ConfigIsExisting("headSelectionsToHide"))
8721 {
8724 }
8725
8727 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8728 {
8730 }
8731
8733
8734 m_IsResultOfSplit = false;
8735
8737 }
8738
8740 {
8741 super.InitItemVariables();
8742
8748 m_Count = ConfigGetInt(
"count");
8749
8752
8757
8760
8765
8777
8781
8782
8785 if (ConfigIsExisting("canBeSplit"))
8786 {
8789 }
8790
8792 if (ConfigIsExisting("itemBehaviour"))
8794
8795
8798 RegisterNetSyncVariableInt("m_VarLiquidType");
8799 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8800
8801 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8802 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8803 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8804
8805 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8806 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8807 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8808 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8809
8810 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8811 RegisterNetSyncVariableBool("m_IsTakeable");
8812 RegisterNetSyncVariableBool("m_IsHologram");
8813
8816 {
8819 }
8820
8822
8824 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8826
8827 }
8828
8830 {
8832 }
8833
8835 {
8838 {
8843 }
8844 }
8845
8846 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8847 {
8849 {
8852 }
8853
8855 }
8856
8858 {
8864 }
8865
8867
8869 {
8871
8872 if (!action)
8873 {
8874 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8875 return;
8876 }
8877
8879 if (!ai)
8880 {
8882 return;
8883 }
8884
8886 if (!action_array)
8887 {
8888 action_array = new array<ActionBase_Basic>;
8890 }
8891 if (LogManager.IsActionLogEnable())
8892 {
8893 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8894 }
8895
8896 if (action_array.Find(action) != -1)
8897 {
8898 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8899 }
8900 else
8901 {
8902 action_array.Insert(action);
8903 }
8904 }
8905
8907 {
8909 ActionBase action = player.GetActionManager().GetAction(actionName);
8912
8913 if (action_array)
8914 {
8915 action_array.RemoveItem(action);
8916 }
8917 }
8918
8919
8920
8922 {
8923 ActionOverrideData overrideData = new ActionOverrideData();
8927
8929 if (!actionMap)
8930 {
8933 }
8934
8935 actionMap.Insert(this.
Type(), overrideData);
8936
8937 }
8938
8940
8942
8943
8945 {
8948
8951
8952 string config_to_search = "CfgVehicles";
8953 string muzzle_owner_config;
8954
8956 {
8957 if (IsInherited(Weapon))
8958 config_to_search = "CfgWeapons";
8959
8960 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8961
8962 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8963
8965
8966 if (config_OnFire_subclass_count > 0)
8967 {
8968 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8969
8970 for (int i = 0; i < config_OnFire_subclass_count; i++)
8971 {
8972 string particle_class = "";
8974 string config_OnFire_entry = config_OnFire_class + particle_class;
8975 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8976 WPOF_array.Insert(WPOF);
8977 }
8978
8979
8981 }
8982 }
8983
8985 {
8986 config_to_search = "CfgWeapons";
8987 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8988
8989 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8990
8992
8993 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8994 {
8995 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8996
8997 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8998 {
8999 string particle_class2 = "";
9001 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9002 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9003 WPOBE_array.Insert(WPOBE);
9004 }
9005
9006
9008 }
9009 }
9010 }
9011
9012
9014 {
9017
9019 {
9020 string config_to_search = "CfgVehicles";
9021
9022 if (IsInherited(Weapon))
9023 config_to_search = "CfgWeapons";
9024
9025 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9026 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9027
9028 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9029 {
9030
9032
9034 {
9036 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9038 return;
9039 }
9040
9043
9044
9045
9047 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9048
9049 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9050 {
9051 string particle_class = "";
9053 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9055
9056 if (entry_type == CT_CLASS)
9057 {
9058 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9059 WPOOH_array.Insert(WPOF);
9060 }
9061 }
9062
9063
9065 }
9066 }
9067 }
9068
9070 {
9072 }
9073
9075 {
9077 {
9079
9082
9085
9086 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9087 }
9088 }
9089
9091 {
9093 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9094
9096 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9097
9099 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9100
9102 {
9104 }
9105 }
9106
9108 {
9110 }
9111
9113 {
9116 else
9118
9120 {
9123 }
9124 else
9125 {
9128
9131 }
9132
9134 }
9135
9137 {
9139 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9140 }
9141
9143 {
9145 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9147 }
9148
9150 {
9152 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9153 }
9154
9156 {
9159
9160 OverheatingParticle OP = new OverheatingParticle();
9165
9167 }
9168
9170 {
9173
9174 return -1;
9175 }
9176
9178 {
9180 {
9183
9184 for (int i = count; i > 0; --i)
9185 {
9186 int id = i - 1;
9189
9192
9193 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9194 {
9195 if (p)
9196 {
9199 }
9200 }
9201 }
9202 }
9203 }
9204
9206 {
9208 {
9210 {
9211 int id = i - 1;
9213
9214 if (OP)
9215 {
9217
9218 if (p)
9219 {
9221 }
9222
9223 delete OP;
9224 }
9225 }
9226
9229 }
9230 }
9231
9234 {
9235 return 0.0;
9236 }
9237
9238
9240 {
9241 return 250;
9242 }
9243
9245 {
9246 return 0;
9247 }
9248
9251 {
9253 return true;
9254
9255 return false;
9256 }
9257
9260 {
9263
9265 {
9267 }
9268 else
9269 {
9270
9272 }
9273
9275 }
9276
9283 {
9284 return -1;
9285 }
9286
9287
9288
9289
9291 {
9293 {
9295 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9296
9297 if (r_index >= 0)
9298 {
9299 InventoryLocation r_il = new InventoryLocation;
9300 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9301
9302 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9305 {
9306 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9307 }
9309 {
9310 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9311 }
9312
9313 }
9314
9315 player.GetHumanInventory().ClearUserReservedLocation(this);
9316 }
9317
9320 }
9321
9322
9323
9324
9326 {
9327 return ItemBase.m_DebugActionsMask;
9328 }
9329
9331 {
9332 return ItemBase.m_DebugActionsMask & mask;
9333 }
9334
9336 {
9337 ItemBase.m_DebugActionsMask = mask;
9338 }
9339
9341 {
9342 ItemBase.m_DebugActionsMask |= mask;
9343 }
9344
9346 {
9347 ItemBase.m_DebugActionsMask &= ~mask;
9348 }
9349
9351 {
9353 {
9355 }
9356 else
9357 {
9359 }
9360 }
9361
9362
9364 {
9365 if (GetEconomyProfile())
9366 {
9367 float q_max = GetEconomyProfile().GetQuantityMax();
9368 if (q_max > 0)
9369 {
9370 float q_min = GetEconomyProfile().GetQuantityMin();
9371 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9372
9374 {
9375 ComponentEnergyManager comp = GetCompEM();
9377 {
9379 }
9380 }
9382 {
9384
9385 }
9386
9387 }
9388 }
9389 }
9390
9393 {
9394 EntityAI parent = GetHierarchyParent();
9395
9396 if (parent)
9397 {
9398 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9399 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9400 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9401 }
9402 }
9403
9406 {
9407 EntityAI parent = GetHierarchyParent();
9408
9409 if (parent)
9410 {
9411 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9412 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9413 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9414 }
9415 }
9416
9418 {
9419
9420
9421
9422
9424
9426 {
9427 if (ScriptInputUserData.CanStoreInputUserData())
9428 {
9429 ScriptInputUserData ctx = new ScriptInputUserData;
9435 ctx.
Write(use_stack_max);
9438
9440 {
9441 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9442 }
9443 }
9444 }
9445 else if (!
GetGame().IsMultiplayer())
9446 {
9448 }
9449 }
9450
9452 {
9454 }
9455
9457 {
9459 }
9460
9462 {
9464 }
9465
9467 {
9468
9469 return false;
9470 }
9471
9473 {
9474 return false;
9475 }
9476
9480 {
9481 return false;
9482 }
9483
9485 {
9486 return "";
9487 }
9488
9490
9492 {
9493 return false;
9494 }
9495
9497 {
9498 return true;
9499 }
9500
9501
9502
9504 {
9505 return true;
9506 }
9507
9509 {
9510 return true;
9511 }
9512
9514 {
9515 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9517 }
9518
9520 {
9522 }
9523
9525 {
9527 if (!is_being_placed)
9529 SetSynchDirty();
9530 }
9531
9532
9534
9536 {
9538 }
9539
9541 {
9543 }
9544
9546 {
9547 return 1;
9548 }
9549
9551 {
9552 return false;
9553 }
9554
9556 {
9558 SetSynchDirty();
9559 }
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9596 {
9597 super.OnMovedInsideCargo(container);
9598
9599 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9600 }
9601
9602 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9603 {
9604 super.EEItemLocationChanged(oldLoc,newLoc);
9605
9606 PlayerBase new_player = null;
9607 PlayerBase old_player = null;
9608
9609 if (newLoc.GetParent())
9610 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9611
9612 if (oldLoc.GetParent())
9613 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9614
9616 {
9617 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9618
9619 if (r_index >= 0)
9620 {
9621 InventoryLocation r_il = new InventoryLocation;
9622 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9623
9624 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9627 {
9628 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9629 }
9631 {
9632 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9633 }
9634
9635 }
9636 }
9637
9639 {
9640 if (new_player)
9641 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9642
9643 if (new_player == old_player)
9644 {
9645
9646 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9647 {
9649 {
9650 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9651 {
9652 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9653 }
9654 }
9655 else
9656 {
9657 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9658 }
9659 }
9660
9661 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9662 {
9663 int type = oldLoc.GetType();
9665 {
9666 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9667 }
9669 {
9670 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9671 }
9672 }
9673 if (!m_OldLocation)
9674 {
9675 m_OldLocation = new InventoryLocation;
9676 }
9677 m_OldLocation.Copy(oldLoc);
9678 }
9679 else
9680 {
9681 if (m_OldLocation)
9682 {
9683 m_OldLocation.Reset();
9684 }
9685 }
9686
9688 }
9689 else
9690 {
9691 if (new_player)
9692 {
9693 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9694 if (res_index >= 0)
9695 {
9696 InventoryLocation il = new InventoryLocation;
9697 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9699 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9702 {
9703 il.
GetParent().GetOnReleaseLock().Invoke(it);
9704 }
9706 {
9708 }
9709
9710 }
9711 }
9713 {
9714
9716 }
9717
9718 if (m_OldLocation)
9719 {
9720 m_OldLocation.Reset();
9721 }
9722 }
9723 }
9724
9725 override void EOnContact(IEntity other, Contact extra)
9726 {
9728 {
9729 int liquidType = -1;
9731 if (impactSpeed > 0.0)
9732 {
9734 #ifndef SERVER
9736 #else
9738 SetSynchDirty();
9739 #endif
9741 }
9742 }
9743
9744 #ifdef SERVER
9745 if (GetCompEM() && GetCompEM().IsPlugged())
9746 {
9747 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9748 GetCompEM().UnplugThis();
9749 }
9750 #endif
9751 }
9752
9754
9756 {
9758 }
9759
9761 {
9762
9763 }
9764
9766 {
9767 super.OnItemLocationChanged(old_owner, new_owner);
9768
9769 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9770 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9771
9772 if (!relatedPlayer && playerNew)
9773 relatedPlayer = playerNew;
9774
9775 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9776 {
9778 if (actionMgr)
9779 {
9780 ActionBase currentAction = actionMgr.GetRunningAction();
9781 if (currentAction)
9783 }
9784 }
9785
9786 Man ownerPlayerOld = null;
9787 Man ownerPlayerNew = null;
9788
9789 if (old_owner)
9790 {
9791 if (old_owner.
IsMan())
9792 {
9793 ownerPlayerOld = Man.Cast(old_owner);
9794 }
9795 else
9796 {
9797 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9798 }
9799 }
9800 else
9801 {
9803 {
9805
9806 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9807 {
9808 GetCompEM().UnplugThis();
9809 }
9810 }
9811 }
9812
9813 if (new_owner)
9814 {
9815 if (new_owner.
IsMan())
9816 {
9817 ownerPlayerNew = Man.Cast(new_owner);
9818 }
9819 else
9820 {
9821 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9822 }
9823 }
9824
9825 if (ownerPlayerOld != ownerPlayerNew)
9826 {
9827 if (ownerPlayerOld)
9828 {
9829 array<EntityAI> subItemsExit = new array<EntityAI>;
9831 for (int i = 0; i < subItemsExit.Count(); i++)
9832 {
9835 }
9836 }
9837
9838 if (ownerPlayerNew)
9839 {
9840 array<EntityAI> subItemsEnter = new array<EntityAI>;
9842 for (int j = 0; j < subItemsEnter.Count(); j++)
9843 {
9846 }
9847 }
9848 }
9849 else if (ownerPlayerNew != null)
9850 {
9851 PlayerBase nplayer;
9852 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9853 {
9854 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9856 for (int k = 0; k < subItemsUpdate.Count(); k++)
9857 {
9859 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9860 }
9861 }
9862 }
9863
9864 if (old_owner)
9865 old_owner.OnChildItemRemoved(this);
9866 if (new_owner)
9867 new_owner.OnChildItemReceived(this);
9868 }
9869
9870
9872 {
9873 super.EEDelete(parent);
9874 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9875 if (player)
9876 {
9878
9879 if (player.IsAlive())
9880 {
9881 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9882 if (r_index >= 0)
9883 {
9884 InventoryLocation r_il = new InventoryLocation;
9885 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9886
9887 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9890 {
9891 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9892 }
9894 {
9895 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9896 }
9897
9898 }
9899
9900 player.RemoveQuickBarEntityShortcut(this);
9901 }
9902 }
9903 }
9904
9906 {
9907 super.EEKilled(killer);
9908
9911 {
9912 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9913 {
9914 if (IsMagazine())
9915 {
9916 if (Magazine.Cast(this).GetAmmoCount() > 0)
9917 {
9919 }
9920 }
9921 else
9922 {
9924 }
9925 }
9926 }
9927 }
9928
9930 {
9931 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9932
9933 super.OnWasAttached(parent, slot_id);
9934
9937
9939 }
9940
9942 {
9943 super.OnWasDetached(parent, slot_id);
9944
9947 }
9948
9950 {
9951 int idx;
9954
9955 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9956 if (inventory_slots.Count() < 1)
9957 {
9958 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9959 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9960 }
9961 else
9962 {
9963 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9964 }
9965
9966 idx = inventory_slots.Find(slot);
9967 if (idx < 0)
9968 return "";
9969
9970 return attach_types.Get(idx);
9971 }
9972
9974 {
9975 int idx = -1;
9976 string slot;
9977
9980
9981 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9982 if (inventory_slots.Count() < 1)
9983 {
9984 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9985 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9986 }
9987 else
9988 {
9989 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9990 if (detach_types.Count() < 1)
9991 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9992 }
9993
9994 for (int i = 0; i < inventory_slots.Count(); i++)
9995 {
9996 slot = inventory_slots.Get(i);
9997 }
9998
9999 if (slot != "")
10000 {
10001 if (detach_types.Count() == 1)
10002 idx = 0;
10003 else
10004 idx = inventory_slots.Find(slot);
10005 }
10006 if (idx < 0)
10007 return "";
10008
10009 return detach_types.Get(idx);
10010 }
10011
10013 {
10014
10016
10017
10018 float min_time = 1;
10019 float max_time = 3;
10020 float delay = Math.RandomFloat(min_time, max_time);
10021
10022 explode_timer.Run(delay, this, "DoAmmoExplosion");
10023 }
10024
10026 {
10027 Magazine magazine = Magazine.Cast(this);
10028 int pop_sounds_count = 6;
10029 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10030
10031
10032 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10033 string sound_name = pop_sounds[ sound_idx ];
10035
10036
10037 magazine.ServerAddAmmoCount(-1);
10038
10039
10040 float min_temp_to_explode = 100;
10041
10042 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10043 {
10045 }
10046 }
10047
10048
10049 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10050 {
10051 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10052
10053 const int CHANCE_DAMAGE_CARGO = 4;
10054 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10055 const int CHANCE_DAMAGE_NOTHING = 2;
10056
10058 {
10059 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10060 int chances;
10061 int rnd;
10062
10063 if (GetInventory().GetCargo())
10064 {
10065 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10066 rnd = Math.RandomInt(0,chances);
10067
10068 if (rnd < CHANCE_DAMAGE_CARGO)
10069 {
10071 }
10072 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10073 {
10075 }
10076 }
10077 else
10078 {
10079 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10080 rnd = Math.RandomInt(0,chances);
10081
10082 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10083 {
10085 }
10086 }
10087 }
10088 }
10089
10091 {
10092 if (GetInventory().GetCargo())
10093 {
10094 int item_count = GetInventory().GetCargo().GetItemCount();
10095 if (item_count > 0)
10096 {
10097 int random_pick = Math.RandomInt(0, item_count);
10099 if (!item.IsExplosive())
10100 {
10101 item.AddHealth("","",damage);
10102 return true;
10103 }
10104 }
10105 }
10106 return false;
10107 }
10108
10110 {
10111 int attachment_count = GetInventory().AttachmentCount();
10112 if (attachment_count > 0)
10113 {
10114 int random_pick = Math.RandomInt(0, attachment_count);
10115 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10116 if (!attachment.IsExplosive())
10117 {
10118 attachment.AddHealth("","",damage);
10119 return true;
10120 }
10121 }
10122 return false;
10123 }
10124
10126 {
10128 }
10129
10131 {
10133 return GetInventory().CanRemoveEntity();
10134
10135 return false;
10136 }
10137
10139 {
10140
10142 return false;
10143
10144
10146 return false;
10147
10148
10149
10151 if (delta == 0)
10152 return false;
10153
10154
10155 return true;
10156 }
10157
10159 {
10161 {
10162 if (ScriptInputUserData.CanStoreInputUserData())
10163 {
10164 ScriptInputUserData ctx = new ScriptInputUserData;
10169 ctx.
Write(destination_entity);
10171 ctx.
Write(slot_id);
10173 }
10174 }
10175 else if (!
GetGame().IsMultiplayer())
10176 {
10178 }
10179 }
10180
10182 {
10183 float split_quantity_new;
10187 InventoryLocation loc = new InventoryLocation;
10188
10189 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10190 {
10192 split_quantity_new = stack_max;
10193 else
10195
10197 {
10198 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10199 if (new_item)
10200 {
10201 new_item.SetResultOfSplit(true);
10202 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10204 new_item.
SetQuantity(split_quantity_new,
false,
true);
10205 }
10206 }
10207 }
10208 else if (destination_entity && slot_id == -1)
10209 {
10210 if (quantity > stack_max)
10211 split_quantity_new = stack_max;
10212 else
10213 split_quantity_new = quantity;
10214
10216 {
10218 {
10221 }
10222
10223 if (new_item)
10224 {
10225 new_item.SetResultOfSplit(true);
10226 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10228 new_item.
SetQuantity(split_quantity_new,
false,
true);
10229 }
10230 }
10231 }
10232 else
10233 {
10234 if (stack_max != 0)
10235 {
10237 {
10239 }
10240
10241 if (split_quantity_new == 0)
10242 {
10243 if (!
GetGame().IsMultiplayer())
10244 player.PhysicalPredictiveDropItem(this);
10245 else
10246 player.ServerDropEntity(this);
10247 return;
10248 }
10249
10251 {
10253
10254 if (new_item)
10255 {
10256 new_item.SetResultOfSplit(true);
10257 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10260 new_item.PlaceOnSurface();
10261 }
10262 }
10263 }
10264 }
10265 }
10266
10268 {
10269 float split_quantity_new;
10273 InventoryLocation loc = new InventoryLocation;
10274
10275 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10276 {
10278 split_quantity_new = stack_max;
10279 else
10281
10283 {
10284 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10285 if (new_item)
10286 {
10287 new_item.SetResultOfSplit(true);
10288 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10290 new_item.
SetQuantity(split_quantity_new,
false,
true);
10291 }
10292 }
10293 }
10294 else if (destination_entity && slot_id == -1)
10295 {
10296 if (quantity > stack_max)
10297 split_quantity_new = stack_max;
10298 else
10299 split_quantity_new = quantity;
10300
10302 {
10304 {
10307 }
10308
10309 if (new_item)
10310 {
10311 new_item.SetResultOfSplit(true);
10312 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10314 new_item.
SetQuantity(split_quantity_new,
false,
true);
10315 }
10316 }
10317 }
10318 else
10319 {
10320 if (stack_max != 0)
10321 {
10323 {
10325 }
10326
10328 {
10330
10331 if (new_item)
10332 {
10333 new_item.SetResultOfSplit(true);
10334 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10337 new_item.PlaceOnSurface();
10338 }
10339 }
10340 }
10341 }
10342 }
10343
10345 {
10347 {
10348 if (ScriptInputUserData.CanStoreInputUserData())
10349 {
10350 ScriptInputUserData ctx = new ScriptInputUserData;
10355 dst.WriteToContext(ctx);
10357 }
10358 }
10359 else if (!
GetGame().IsMultiplayer())
10360 {
10362 }
10363 }
10364
10366 {
10368 {
10369 if (ScriptInputUserData.CanStoreInputUserData())
10370 {
10371 ScriptInputUserData ctx = new ScriptInputUserData;
10376 ctx.
Write(destination_entity);
10382 }
10383 }
10384 else if (!
GetGame().IsMultiplayer())
10385 {
10387 }
10388 }
10389
10391 {
10393 }
10394
10396 {
10398 float split_quantity_new;
10400 if (dst.IsValid())
10401 {
10402 int slot_id = dst.GetSlot();
10404
10405 if (quantity > stack_max)
10406 split_quantity_new = stack_max;
10407 else
10408 split_quantity_new = quantity;
10409
10411 {
10413
10414 if (new_item)
10415 {
10416 new_item.SetResultOfSplit(true);
10417 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10419 new_item.
SetQuantity(split_quantity_new,
false,
true);
10420 }
10421
10422 return new_item;
10423 }
10424 }
10425
10426 return null;
10427 }
10428
10430 {
10432 float split_quantity_new;
10434 if (destination_entity)
10435 {
10437 if (quantity > stackable)
10438 split_quantity_new = stackable;
10439 else
10440 split_quantity_new = quantity;
10441
10443 {
10444 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10445 if (new_item)
10446 {
10447 new_item.SetResultOfSplit(true);
10448 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10450 new_item.
SetQuantity(split_quantity_new,
false,
true);
10451 }
10452 }
10453 }
10454 }
10455
10457 {
10459 {
10460 if (ScriptInputUserData.CanStoreInputUserData())
10461 {
10462 ScriptInputUserData ctx = new ScriptInputUserData;
10467 ItemBase destination_entity =
this;
10468 ctx.
Write(destination_entity);
10472 }
10473 }
10474 else if (!
GetGame().IsMultiplayer())
10475 {
10477 }
10478 }
10479
10481 {
10483 float split_quantity_new;
10485 if (player)
10486 {
10488 if (quantity > stackable)
10489 split_quantity_new = stackable;
10490 else
10491 split_quantity_new = quantity;
10492
10494 {
10495 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10496 new_item =
ItemBase.Cast(in_hands);
10497 if (new_item)
10498 {
10499 new_item.SetResultOfSplit(true);
10500 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10502 new_item.SetQuantity(split_quantity_new, false, true);
10503 }
10504 }
10505 }
10506 }
10507
10509 {
10511 float split_quantity_new = Math.Floor(quantity * 0.5);
10512
10514 return;
10515
10517
10518 if (new_item)
10519 {
10520 if (new_item.GetQuantityMax() < split_quantity_new)
10521 {
10522 split_quantity_new = new_item.GetQuantityMax();
10523 }
10524
10525 new_item.SetResultOfSplit(true);
10526 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10527
10529 {
10532 }
10533 else
10534 {
10536 new_item.
SetQuantity(split_quantity_new,
false,
true);
10537 }
10538 }
10539 }
10540
10542 {
10544 float split_quantity_new = Math.Floor(quantity / 2);
10545
10547 return;
10548
10549 InventoryLocation invloc = new InventoryLocation;
10551
10553 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10554
10555 if (new_item)
10556 {
10557 if (new_item.GetQuantityMax() < split_quantity_new)
10558 {
10559 split_quantity_new = new_item.GetQuantityMax();
10560 }
10562 {
10565 }
10566 else if (split_quantity_new > 1)
10567 {
10569 new_item.
SetQuantity(split_quantity_new,
false,
true);
10570 }
10571 }
10572 }
10573
10576 {
10577 SetWeightDirty();
10579
10580 if (parent)
10581 parent.OnAttachmentQuantityChangedEx(this, delta);
10582
10584 {
10586 {
10588 }
10590 {
10591 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10593 }
10594 }
10595
10596 }
10597
10600 {
10601
10602 }
10603
10606 {
10608 }
10609
10611 {
10612 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10613
10615 {
10616 if (newLevel == GameConstants.STATE_RUINED)
10617 {
10619 EntityAI parent = GetHierarchyParent();
10620 if (parent && parent.IsFireplace())
10621 {
10622 CargoBase cargo = GetInventory().GetCargo();
10623 if (cargo)
10624 {
10626 {
10628 }
10629 }
10630 }
10631 }
10632
10634 {
10635
10637 return;
10638 }
10639
10640 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10641 {
10643 }
10644 }
10645 }
10646
10647
10649 {
10650 super.OnRightClick();
10651
10653 {
10655 {
10656 if (ScriptInputUserData.CanStoreInputUserData())
10657 {
10658 EntityAI root = GetHierarchyRoot();
10659 Man playerOwner = GetHierarchyRootPlayer();
10660 InventoryLocation dst = new InventoryLocation;
10661
10662
10663 if (!playerOwner && root && root == this)
10664 {
10666 }
10667 else
10668 {
10669
10670 GetInventory().GetCurrentInventoryLocation(dst);
10672 {
10675 {
10677 }
10678 else
10679 {
10681
10682
10683 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10684 {
10686 }
10687 else
10688 {
10689 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10690 }
10691 }
10692 }
10693 }
10694
10695 ScriptInputUserData ctx = new ScriptInputUserData;
10703 }
10704 }
10705 else if (!
GetGame().IsMultiplayer())
10706 {
10708 }
10709 }
10710 }
10711
10713 {
10714 if (root)
10715 {
10716 vector m4[4];
10717 root.GetTransform(m4);
10718 dst.SetGround(this, m4);
10719 }
10720 else
10721 {
10722 GetInventory().GetCurrentInventoryLocation(dst);
10723 }
10724 }
10725
10726 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10727 {
10728
10729 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10730 return false;
10731
10732 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10733 return false;
10734
10735
10737 return false;
10738
10739
10740 Magazine mag = Magazine.Cast(this);
10741 if (mag)
10742 {
10743 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10744 return false;
10745
10746 if (stack_max_limit)
10747 {
10748 Magazine other_mag = Magazine.Cast(other_item);
10749 if (other_item)
10750 {
10751 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10752 return false;
10753 }
10754
10755 }
10756 }
10757 else
10758 {
10759
10761 return false;
10762
10764 return false;
10765 }
10766
10767 PlayerBase player = null;
10768 if (CastTo(player, GetHierarchyRootPlayer()))
10769 {
10770 if (player.GetInventory().HasAttachment(this))
10771 return false;
10772
10773 if (player.IsItemsToDelete())
10774 return false;
10775 }
10776
10777 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10778 return false;
10779
10780 int slotID;
10782 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10783 return false;
10784
10785 return true;
10786 }
10787
10789 {
10791 }
10792
10794 {
10795 return m_IsResultOfSplit;
10796 }
10797
10799 {
10800 m_IsResultOfSplit = value;
10801 }
10802
10804 {
10806 }
10807
10809 {
10810 float other_item_quantity = other_item.GetQuantity();
10811 float this_free_space;
10812
10814
10816
10817 if (other_item_quantity > this_free_space)
10818 {
10819 return this_free_space;
10820 }
10821 else
10822 {
10823 return other_item_quantity;
10824 }
10825 }
10826
10828 {
10830 }
10831
10833 {
10835 return;
10836
10837 if (!IsMagazine() && other_item)
10838 {
10840 if (quantity_used != 0)
10841 {
10842 float hp1 = GetHealth01("","");
10843 float hp2 = other_item.GetHealth01("","");
10844 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10845 hpResult = hpResult / (
GetQuantity() + quantity_used);
10846
10847 hpResult *= GetMaxHealth();
10848 Math.Round(hpResult);
10849 SetHealth("", "Health", hpResult);
10850
10852 other_item.AddQuantity(-quantity_used);
10853 }
10854 }
10856 }
10857
10859 {
10860 #ifdef SERVER
10861 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10862 GetHierarchyParent().IncreaseLifetimeUp();
10863 #endif
10864 };
10865
10867 {
10868 PlayerBase p = PlayerBase.Cast(player);
10869
10870 array<int> recipesIds = p.m_Recipes;
10871 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10872 if (moduleRecipesManager)
10873 {
10874 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10875 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10876 }
10877
10878 for (int i = 0;i < recipesIds.Count(); i++)
10879 {
10880 int key = recipesIds.Get(i);
10881 string recipeName = moduleRecipesManager.GetRecipeName(key);
10883 }
10884 }
10885
10886
10887 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10888 {
10889 super.GetDebugActions(outputList);
10890
10891
10897
10898
10903
10908
10909
10913
10914
10916 {
10920 }
10921
10924
10925
10929
10931
10932 InventoryLocation loc = new InventoryLocation();
10933 GetInventory().GetCurrentInventoryLocation(loc);
10935 {
10936 if (Gizmo_IsSupported())
10939 }
10940
10942 }
10943
10944
10945
10946
10948 {
10949 super.OnAction(action_id, player, ctx);
10950
10952 {
10953 switch (action_id)
10954 {
10957 return true;
10960 return true;
10961 }
10962 }
10963
10965 {
10966 switch (action_id)
10967 {
10969 Delete();
10970 return true;
10971 }
10972 }
10973
10974 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10975 {
10976 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10977 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10978 PlayerBase p = PlayerBase.Cast(player);
10979 if (
EActions.RECIPES_RANGE_START < 1000)
10980 {
10981 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10982 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10983 }
10984 }
10985 #ifndef SERVER
10986 else if (action_id ==
EActions.WATCH_PLAYER)
10987 {
10988 PluginDeveloper.SetDeveloperItemClientEx(player);
10989 }
10990 #endif
10992 {
10993 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10994 {
10995 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10996 OnDebugButtonPressServer(id + 1);
10997 }
10998
10999 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11000 {
11001 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11003 }
11004
11005 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11006 {
11007 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11009 }
11010
11011 else if (action_id ==
EActions.ADD_QUANTITY)
11012 {
11013 if (IsMagazine())
11014 {
11015 Magazine mag = Magazine.Cast(this);
11016 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11017 }
11018 else
11019 {
11021 }
11022
11023 if (m_EM)
11024 {
11025 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11026 }
11027
11028 }
11029
11030 else if (action_id ==
EActions.REMOVE_QUANTITY)
11031 {
11032 if (IsMagazine())
11033 {
11034 Magazine mag2 = Magazine.Cast(this);
11035 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11036 }
11037 else
11038 {
11040 }
11041 if (m_EM)
11042 {
11043 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11044 }
11045
11046 }
11047
11048 else if (action_id ==
EActions.SET_QUANTITY_0)
11049 {
11051
11052 if (m_EM)
11053 {
11054 m_EM.SetEnergy(0);
11055 }
11056 }
11057
11058 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11059 {
11061
11062 if (m_EM)
11063 {
11064 m_EM.SetEnergy(m_EM.GetEnergyMax());
11065 }
11066 }
11067
11068 else if (action_id ==
EActions.ADD_HEALTH)
11069 {
11070 AddHealth("","",GetMaxHealth("","Health")/5);
11071 }
11072 else if (action_id ==
EActions.REMOVE_HEALTH)
11073 {
11074 AddHealth("","",-GetMaxHealth("","Health")/5);
11075 }
11076 else if (action_id ==
EActions.DESTROY_HEALTH)
11077 {
11078 SetHealth01("","",0);
11079 }
11080 else if (action_id ==
EActions.WATCH_ITEM)
11081 {
11083 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11084 #ifdef DEVELOPER
11085 SetDebugDeveloper_item(this);
11086 #endif
11087 }
11088
11089 else if (action_id ==
EActions.ADD_TEMPERATURE)
11090 {
11091 AddTemperature(20);
11092
11093 }
11094
11095 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11096 {
11097 AddTemperature(-20);
11098
11099 }
11100
11101 else if (action_id ==
EActions.FLIP_FROZEN)
11102 {
11103 SetFrozen(!GetIsFrozen());
11104
11105 }
11106
11107 else if (action_id ==
EActions.ADD_WETNESS)
11108 {
11110
11111 }
11112
11113 else if (action_id ==
EActions.REMOVE_WETNESS)
11114 {
11116
11117 }
11118
11119 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11120 {
11123
11124
11125 }
11126
11127 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11128 {
11131 }
11132
11133 else if (action_id ==
EActions.MAKE_SPECIAL)
11134 {
11135 auto debugParams = DebugSpawnParams.WithPlayer(player);
11136 OnDebugSpawnEx(debugParams);
11137 }
11138
11139 }
11140
11141
11142 return false;
11143 }
11144
11145
11146
11147
11151
11154
11155
11156
11158 {
11159 return false;
11160 }
11161
11162
11164 {
11165 return true;
11166 }
11167
11168
11170 {
11171 return true;
11172 }
11173
11174
11175
11177 {
11178 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11180 }
11181
11184 {
11185 return null;
11186 }
11187
11189 {
11190 return false;
11191 }
11192
11194 {
11195 return false;
11196 }
11197
11201
11202
11204 {
11205 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11206 return module_repairing.CanRepair(this, item_repair_kit);
11207 }
11208
11209
11210 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11211 {
11212 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11213 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11214 }
11215
11216
11218 {
11219
11220
11221
11222
11223
11224
11225
11226
11227 return 1;
11228 }
11229
11230
11231
11233 {
11235 }
11236
11237
11238
11240 {
11242 }
11243
11244
11253 {
11254 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11255
11256 if (player)
11257 {
11258 player.MessageStatus(text);
11259 }
11260 }
11261
11262
11271 {
11272 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11273
11274 if (player)
11275 {
11276 player.MessageAction(text);
11277 }
11278 }
11279
11280
11289 {
11290 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11291
11292 if (player)
11293 {
11294 player.MessageFriendly(text);
11295 }
11296 }
11297
11298
11307 {
11308 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11309
11310 if (player)
11311 {
11312 player.MessageImportant(text);
11313 }
11314 }
11315
11317 {
11318 return true;
11319 }
11320
11321
11322 override bool KindOf(
string tag)
11323 {
11324 bool found = false;
11325 string item_name = this.
GetType();
11328
11329 int array_size = item_tag_array.Count();
11330 for (int i = 0; i < array_size; i++)
11331 {
11332 if (item_tag_array.Get(i) == tag)
11333 {
11334 found = true;
11335 break;
11336 }
11337 }
11338 return found;
11339 }
11340
11341
11343 {
11344
11345 super.OnRPC(sender, rpc_type,ctx);
11346
11347
11348 switch (rpc_type)
11349 {
11350 #ifndef SERVER
11351 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11352 Param2<bool, string> p = new Param2<bool, string>(false, "");
11353
11355 return;
11356
11357 bool play = p.param1;
11358 string soundSet = p.param2;
11359
11360 if (play)
11361 {
11363 {
11365 {
11367 }
11368 }
11369 else
11370 {
11372 }
11373 }
11374 else
11375 {
11377 }
11378
11379 break;
11380 #endif
11381
11382 }
11383
11385 {
11387 }
11388 }
11389
11390
11391
11392
11394 {
11395 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11396 return plugin.GetID(
name);
11397 }
11398
11400 {
11401 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11402 return plugin.GetName(id);
11403 }
11404
11407 {
11408
11409
11410 int varFlags;
11411 if (!ctx.
Read(varFlags))
11412 return;
11413
11414 if (varFlags & ItemVariableFlags.FLOAT)
11415 {
11417 }
11418 }
11419
11421 {
11422
11423 super.SerializeNumericalVars(floats_out);
11424
11425
11426
11428 {
11430 }
11431
11433 {
11435 }
11436
11438 {
11440 }
11441
11443 {
11448 }
11449
11451 {
11453 }
11454 }
11455
11457 {
11458
11459 super.DeSerializeNumericalVars(floats);
11460
11461
11462 int index = 0;
11463 int mask = Math.Round(floats.Get(index));
11464
11465 index++;
11466
11468 {
11470 {
11472 }
11473 else
11474 {
11475 float quantity = floats.Get(index);
11476 SetQuantity(quantity,
true,
false,
false,
false);
11477 }
11478 index++;
11479 }
11480
11482 {
11483 float wet = floats.Get(index);
11485 index++;
11486 }
11487
11489 {
11490 int liquidtype = Math.Round(floats.Get(index));
11492 index++;
11493 }
11494
11496 {
11498 index++;
11500 index++;
11502 index++;
11504 index++;
11505 }
11506
11508 {
11509 int cleanness = Math.Round(floats.Get(index));
11511 index++;
11512 }
11513 }
11514
11516 {
11517 super.WriteVarsToCTX(ctx);
11518
11519
11521 {
11523 }
11524
11526 {
11528 }
11529
11531 {
11533 }
11534
11536 {
11537 int r,g,b,a;
11543 }
11544
11546 {
11548 }
11549 }
11550
11552 {
11553 if (!super.ReadVarsFromCTX(ctx,version))
11554 return false;
11555
11556 int intValue;
11557 float value;
11558
11559 if (version < 140)
11560 {
11561 if (!ctx.
Read(intValue))
11562 return false;
11563
11564 m_VariablesMask = intValue;
11565 }
11566
11568 {
11569 if (!ctx.
Read(value))
11570 return false;
11571
11573 {
11575 }
11576 else
11577 {
11579 }
11580 }
11581
11582 if (version < 140)
11583 {
11585 {
11586 if (!ctx.
Read(value))
11587 return false;
11588 SetTemperatureDirect(value);
11589 }
11590 }
11591
11593 {
11594 if (!ctx.
Read(value))
11595 return false;
11597 }
11598
11600 {
11601 if (!ctx.
Read(intValue))
11602 return false;
11604 }
11605
11607 {
11608 int r,g,b,a;
11610 return false;
11612 return false;
11614 return false;
11616 return false;
11617
11619 }
11620
11622 {
11623 if (!ctx.
Read(intValue))
11624 return false;
11626 }
11627
11628 if (version >= 138 && version < 140)
11629 {
11631 {
11632 if (!ctx.
Read(intValue))
11633 return false;
11634 SetFrozen(intValue);
11635 }
11636 }
11637
11638 return true;
11639 }
11640
11641
11643 {
11646 {
11648 }
11649
11650 if (!super.OnStoreLoad(ctx, version))
11651 {
11653 return false;
11654 }
11655
11656 if (version >= 114)
11657 {
11658 bool hasQuickBarIndexSaved;
11659
11660 if (!ctx.
Read(hasQuickBarIndexSaved))
11661 {
11663 return false;
11664 }
11665
11666 if (hasQuickBarIndexSaved)
11667 {
11668 int itmQBIndex;
11669
11670
11671 if (!ctx.
Read(itmQBIndex))
11672 {
11674 return false;
11675 }
11676
11677 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11678 if (itmQBIndex != -1 && parentPlayer)
11679 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11680 }
11681 }
11682 else
11683 {
11684
11685 PlayerBase player;
11686 int itemQBIndex;
11687 if (version ==
int.
MAX)
11688 {
11689 if (!ctx.
Read(itemQBIndex))
11690 {
11692 return false;
11693 }
11694 }
11695 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11696 {
11697
11698 if (!ctx.
Read(itemQBIndex))
11699 {
11701 return false;
11702 }
11703 if (itemQBIndex != -1 && player)
11704 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11705 }
11706 }
11707
11708 if (version < 140)
11709 {
11710
11711 if (!LoadVariables(ctx, version))
11712 {
11714 return false;
11715 }
11716 }
11717
11718
11720 {
11722 return false;
11723 }
11724 if (version >= 132)
11725 {
11727 if (raib)
11728 {
11730 {
11732 return false;
11733 }
11734 }
11735 }
11736
11738 return true;
11739 }
11740
11741
11742
11744 {
11745 super.OnStoreSave(ctx);
11746
11747 PlayerBase player;
11748 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11749 {
11751
11752 int itemQBIndex = -1;
11753 itemQBIndex = player.FindQuickBarEntityIndex(this);
11754 ctx.
Write(itemQBIndex);
11755 }
11756 else
11757 {
11759 }
11760
11762
11764 if (raib)
11765 {
11767 }
11768 }
11769
11770
11772 {
11773 super.AfterStoreLoad();
11774
11776 {
11778 }
11779
11781 {
11784 }
11785 }
11786
11788 {
11789 super.EEOnAfterLoad();
11790
11792 {
11794 }
11795
11798 }
11799
11801 {
11802 return false;
11803 }
11804
11805
11806
11808 {
11810 {
11811 #ifdef PLATFORM_CONSOLE
11812
11814 {
11816 if (menu)
11817 {
11819 }
11820 }
11821 #endif
11822 }
11823
11825 {
11828 }
11829
11831 {
11832 SetWeightDirty();
11834 }
11836 {
11839 }
11840
11842 {
11845 }
11847 {
11850 }
11851
11852 super.OnVariablesSynchronized();
11853 }
11854
11855
11856
11858 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11859 {
11860 if (!IsServerCheck(allow_client))
11861 return false;
11862
11864 return false;
11865
11868
11869 if (value <= (min + 0.001))
11870 value = min;
11871
11872 if (value == min)
11873 {
11874 if (destroy_config)
11875 {
11876 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11877 if (dstr)
11878 {
11880 this.Delete();
11881 return true;
11882 }
11883 }
11884 else if (destroy_forced)
11885 {
11887 this.Delete();
11888 return true;
11889 }
11890
11892 }
11893
11896
11898 {
11900
11901 if (delta)
11903 }
11904
11906
11907 return false;
11908 }
11909
11910
11912 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11913 {
11915 }
11916
11918 {
11921 }
11922
11924 {
11927 }
11928
11930 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11931 {
11932 float value_clamped = Math.Clamp(value, 0, 1);
11934 SetQuantity(result, destroy_config, destroy_forced);
11935 }
11936
11937
11940 {
11942 }
11943
11945 {
11947 }
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11959 {
11960 int slot = -1;
11961 if (GetInventory())
11962 {
11963 InventoryLocation il = new InventoryLocation;
11964 GetInventory().GetCurrentInventoryLocation(il);
11966 }
11967
11969 }
11970
11972 {
11973 float quantity_max = 0;
11974
11976 {
11977 if (attSlotID != -1)
11978 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11979
11980 if (quantity_max <= 0)
11982 }
11983
11984 if (quantity_max <= 0)
11986
11987 return quantity_max;
11988 }
11989
11991 {
11993 }
11994
11996 {
11998 }
11999
12000
12002 {
12004 }
12005
12007 {
12009 }
12010
12012 {
12014 }
12015
12016
12018 {
12019
12020 float weightEx = GetWeightEx();
12021 float special = GetInventoryAndCargoWeight();
12022 return weightEx - special;
12023 }
12024
12025
12027 {
12029 }
12030
12032 {
12034 {
12035 #ifdef DEVELOPER
12036 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12037 {
12038 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12040 }
12041 #endif
12042
12043 return GetQuantity() * GetConfigWeightModified();
12044 }
12045 else if (HasEnergyManager())
12046 {
12047 #ifdef DEVELOPER
12048 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12049 {
12050 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12051 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12052 }
12053 #endif
12054 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12055 }
12056 else
12057 {
12058 #ifdef DEVELOPER
12059 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12060 {
12061 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12062 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12063 }
12064 #endif
12065 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12066 }
12067 }
12068
12071 {
12072 int item_count = 0;
12074
12075 if (GetInventory().GetCargo() != NULL)
12076 {
12077 item_count = GetInventory().GetCargo().GetItemCount();
12078 }
12079
12080 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12081 {
12082 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12083 if (item)
12084 item_count += item.GetNumberOfItems();
12085 }
12086 return item_count;
12087 }
12088
12091 {
12092 float weight = 0;
12093 float wetness = 1;
12094 if (include_wetness)
12097 {
12098 weight = wetness * m_ConfigWeight;
12099 }
12101 {
12102 weight = 1;
12103 }
12104 return weight;
12105 }
12106
12107
12108
12110 {
12111 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12112 {
12113 GameInventory inv = GetInventory();
12114 array<EntityAI> items = new array<EntityAI>;
12116 for (int i = 0; i < items.Count(); i++)
12117 {
12119 if (item)
12120 {
12122 }
12123 }
12124 }
12125 }
12126
12127
12128
12129
12131 {
12132 float energy = 0;
12133 if (HasEnergyManager())
12134 {
12135 energy = GetCompEM().GetEnergy();
12136 }
12137 return energy;
12138 }
12139
12140
12142 {
12143 super.OnEnergyConsumed();
12144
12146 }
12147
12149 {
12150 super.OnEnergyAdded();
12151
12153 }
12154
12155
12157 {
12158 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12159 {
12161 {
12162 float energy_0to1 = GetCompEM().GetEnergy0To1();
12164 }
12165 }
12166 }
12167
12168
12170 {
12171 return ConfigGetFloat("heatIsolation");
12172 }
12173
12175 {
12177 }
12178
12180 {
12181 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12182 if (
GetGame().ConfigIsExisting(paramPath))
12184
12185 return 0.0;
12186 }
12187
12189 {
12190 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12191 if (
GetGame().ConfigIsExisting(paramPath))
12193
12194 return 0.0;
12195 }
12196
12197 override void SetWet(
float value,
bool allow_client =
false)
12198 {
12199 if (!IsServerCheck(allow_client))
12200 return;
12201
12204
12206
12207 m_VarWet = Math.Clamp(value, min, max);
12208
12210 {
12213 }
12214 }
12215
12216 override void AddWet(
float value)
12217 {
12219 }
12220
12222 {
12224 }
12225
12227 {
12229 }
12230
12232 {
12234 }
12235
12237 {
12239 }
12240
12242 {
12244 }
12245
12246 override void OnWetChanged(
float newVal,
float oldVal)
12247 {
12250 if (newLevel != oldLevel)
12251 {
12253 }
12254 }
12255
12257 {
12258 SetWeightDirty();
12259 }
12260
12262 {
12263 return GetWetLevelInternal(
m_VarWet);
12264 }
12265
12266
12267
12269 {
12271 }
12272
12274 {
12276 }
12277
12279 {
12281 }
12282
12284 {
12286 }
12287
12288
12289
12291 {
12292 if (ConfigIsExisting("itemModelLength"))
12293 {
12294 return ConfigGetFloat("itemModelLength");
12295 }
12296 return 0;
12297 }
12298
12300 {
12301 if (ConfigIsExisting("itemAttachOffset"))
12302 {
12303 return ConfigGetFloat("itemAttachOffset");
12304 }
12305 return 0;
12306 }
12307
12308 override void SetCleanness(
int value,
bool allow_client =
false)
12309 {
12310 if (!IsServerCheck(allow_client))
12311 return;
12312
12314
12316
12319 }
12320
12322 {
12324 }
12325
12327 {
12328 return true;
12329 }
12330
12331
12332
12333
12335 {
12337 }
12338
12340 {
12342 }
12343
12344
12345
12346
12347 override void SetColor(
int r,
int g,
int b,
int a)
12348 {
12354 }
12356 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12357 {
12362 }
12363
12365 {
12367 }
12368
12371 {
12372 int r,g,b,a;
12374 r = r/255;
12375 g = g/255;
12376 b = b/255;
12377 a = a/255;
12378 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12379 }
12380
12381
12382
12383 override void SetLiquidType(
int value,
bool allow_client =
false)
12384 {
12385 if (!IsServerCheck(allow_client))
12386 return;
12387
12392 }
12393
12395 {
12396 return ConfigGetInt("varLiquidTypeInit");
12397 }
12398
12400 {
12402 }
12403
12405 {
12407 SetFrozen(false);
12408 }
12409
12412 {
12413 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12414 }
12415
12416
12419 {
12420 PlayerBase nplayer;
12421 if (PlayerBase.CastTo(nplayer, player))
12422 {
12424
12425 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12426 }
12427 }
12428
12429
12432 {
12433 PlayerBase nplayer;
12434 if (PlayerBase.CastTo(nplayer,player))
12435 {
12436
12437 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12438
12439 }
12440
12441
12442 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12443
12444
12445 if (HasEnergyManager())
12446 {
12447 GetCompEM().UpdatePlugState();
12448 }
12449 }
12450
12451
12453 {
12454 super.OnPlacementStarted(player);
12455
12457 }
12458
12459 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12460 {
12462 {
12463 m_AdminLog.OnPlacementComplete(player,
this);
12464 }
12465
12466 super.OnPlacementComplete(player, position, orientation);
12467 }
12468
12469
12470
12471
12472
12474 {
12476 {
12477 return true;
12478 }
12479 else
12480 {
12481 return false;
12482 }
12483 }
12484
12485
12487 {
12489 {
12491 }
12492 }
12493
12494
12496 {
12498 }
12499
12501 {
12503 }
12504
12505 override void InsertAgent(
int agent,
float count = 1)
12506 {
12507 if (count < 1)
12508 return;
12509
12511 }
12512
12515 {
12517 }
12518
12519
12521 {
12523 }
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12567 {
12569 return false;
12570 return true;
12571 }
12572
12574 {
12575
12577 }
12578
12579
12582 {
12583 super.CheckForRoofLimited(timeTresholdMS);
12584
12586 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12587 {
12588 m_PreviousRoofTestTime = time;
12589 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12590 }
12591 }
12592
12593
12595 {
12597 {
12598 return 0;
12599 }
12600
12601 if (GetInventory().GetAttachmentSlotsCount() != 0)
12602 {
12603 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12604 if (filter)
12605 return filter.GetProtectionLevel(type, false, system);
12606 else
12607 return 0;
12608 }
12609
12610 string subclassPath, entryName;
12611
12612 switch (type)
12613 {
12615 entryName = "biological";
12616 break;
12618 entryName = "chemical";
12619 break;
12620 default:
12621 entryName = "biological";
12622 break;
12623 }
12624
12625 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12626
12628 }
12629
12630
12631
12634 {
12635 if (!IsMagazine())
12637
12639 }
12640
12641
12642
12643
12644
12649 {
12650 return true;
12651 }
12652
12654 {
12656 }
12657
12658
12659
12660
12661
12663 {
12664 if (parent)
12665 {
12666 if (parent.IsInherited(DayZInfected))
12667 return true;
12668
12669 if (!parent.IsRuined())
12670 return true;
12671 }
12672
12673 return true;
12674 }
12675
12677 {
12678 if (!super.CanPutAsAttachment(parent))
12679 {
12680 return false;
12681 }
12682
12683 if (!IsRuined() && !parent.IsRuined())
12684 {
12685 return true;
12686 }
12687
12688 return false;
12689 }
12690
12692 {
12693
12694
12695
12696
12697 return super.CanReceiveItemIntoCargo(item);
12698 }
12699
12701 {
12702
12703
12704
12705
12706 GameInventory attachmentInv = attachment.GetInventory();
12708 {
12709 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12710 return false;
12711 }
12712
12713 InventoryLocation loc = new InventoryLocation();
12714 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12715 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12716 return false;
12717
12718 return super.CanReceiveAttachment(attachment, slotId);
12719 }
12720
12722 {
12723 if (!super.CanReleaseAttachment(attachment))
12724 return false;
12725
12726 return GetInventory().AreChildrenAccessible();
12727 }
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12750 {
12751 int id = muzzle_owner.GetMuzzleID();
12752 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12753
12754 if (WPOF_array)
12755 {
12756 for (int i = 0; i < WPOF_array.Count(); i++)
12757 {
12758 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12759
12760 if (WPOF)
12761 {
12762 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12763 }
12764 }
12765 }
12766 }
12767
12768
12770 {
12771 int id = muzzle_owner.GetMuzzleID();
12773
12774 if (WPOBE_array)
12775 {
12776 for (int i = 0; i < WPOBE_array.Count(); i++)
12777 {
12778 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12779
12780 if (WPOBE)
12781 {
12782 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12783 }
12784 }
12785 }
12786 }
12787
12788
12790 {
12791 int id = muzzle_owner.GetMuzzleID();
12792 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12793
12794 if (WPOOH_array)
12795 {
12796 for (int i = 0; i < WPOOH_array.Count(); i++)
12797 {
12798 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12799
12800 if (WPOOH)
12801 {
12802 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12803 }
12804 }
12805 }
12806 }
12807
12808
12810 {
12811 int id = muzzle_owner.GetMuzzleID();
12812 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12813
12814 if (WPOOH_array)
12815 {
12816 for (int i = 0; i < WPOOH_array.Count(); i++)
12817 {
12818 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12819
12820 if (WPOOH)
12821 {
12822 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12823 }
12824 }
12825 }
12826 }
12827
12828
12830 {
12831 int id = muzzle_owner.GetMuzzleID();
12832 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12833
12834 if (WPOOH_array)
12835 {
12836 for (int i = 0; i < WPOOH_array.Count(); i++)
12837 {
12838 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12839
12840 if (WPOOH)
12841 {
12842 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12843 }
12844 }
12845 }
12846 }
12847
12848
12849
12851 {
12853 {
12854 return true;
12855 }
12856
12857 return false;
12858 }
12859
12861 {
12863 {
12864 return true;
12865 }
12866
12867 return false;
12868 }
12869
12871 {
12873 {
12874 return true;
12875 }
12876
12877 return false;
12878 }
12879
12881 {
12882 return false;
12883 }
12884
12887 {
12888 return UATimeSpent.DEFAULT_DEPLOY;
12889 }
12890
12891
12892
12893
12895 {
12897 SetSynchDirty();
12898 }
12899
12901 {
12903 }
12904
12905
12907 {
12908 return false;
12909 }
12910
12913 {
12914 string att_type = "None";
12915
12916 if (ConfigIsExisting("soundAttType"))
12917 {
12918 att_type = ConfigGetString("soundAttType");
12919 }
12920
12922 }
12923
12925 {
12927 }
12928
12929
12930
12931
12932
12938
12940 {
12943
12945 }
12946
12947
12949 {
12951 return;
12952
12954
12957
12960
12961 SoundParameters params = new SoundParameters();
12965 }
12966
12967
12969 {
12971 return;
12972
12974 SetSynchDirty();
12975
12978 }
12979
12980
12982 {
12984 return;
12985
12987 SetSynchDirty();
12988
12991 }
12992
12994 {
12996 }
12997
12999 {
13001 }
13002
13005 {
13006 if (!
GetGame().IsDedicatedServer())
13007 {
13008 if (ConfigIsExisting("attachSoundSet"))
13009 {
13010 string cfg_path = "";
13011 string soundset = "";
13012 string type_name =
GetType();
13013
13016 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13017 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13018
13019 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13020 {
13021 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13022 {
13023 if (cfg_slot_array[i] == slot_type)
13024 {
13025 soundset = cfg_soundset_array[i];
13026 break;
13027 }
13028 }
13029 }
13030
13031 if (soundset != "")
13032 {
13033 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13035 }
13036 }
13037 }
13038 }
13039
13041 {
13042
13043 }
13044
13045 void OnApply(PlayerBase player);
13046
13048 {
13049 return 1.0;
13050 };
13051
13053 {
13055 }
13056
13058 {
13060 }
13061
13063
13065 {
13066 SetDynamicPhysicsLifeTime(0.01);
13068 }
13069
13071 {
13072 array<string> zone_names = new array<string>;
13073 GetDamageZones(zone_names);
13074 for (int i = 0; i < zone_names.Count(); i++)
13075 {
13076 SetHealthMax(zone_names.Get(i),"Health");
13077 }
13078 SetHealthMax("","Health");
13079 }
13080
13083 {
13084 float global_health = GetHealth01("","Health");
13085 array<string> zones = new array<string>;
13086 GetDamageZones(zones);
13087
13088 for (int i = 0; i < zones.Count(); i++)
13089 {
13090 SetHealth01(zones.Get(i),"Health",global_health);
13091 }
13092 }
13093
13096 {
13097 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13098 }
13099
13101 {
13102 if (!hasRootAsPlayer)
13103 {
13104 if (refParentIB)
13105 {
13106
13107 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13108 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13109
13110 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13111 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13112
13115 }
13116 else
13117 {
13118
13121 }
13122 }
13123 }
13124
13126 {
13128 {
13129 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13130 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13131 {
13132 float heatPermCoef = 1.0;
13134 while (ent)
13135 {
13136 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13137 ent = ent.GetHierarchyParent();
13138 }
13139
13140 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13141 }
13142 }
13143 }
13144
13146 {
13147
13148 EntityAI parent = GetHierarchyParent();
13149 if (!parent)
13150 {
13151 hasParent = false;
13152 hasRootAsPlayer = false;
13153 }
13154 else
13155 {
13156 hasParent = true;
13157 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13158 refParentIB =
ItemBase.Cast(parent);
13159 }
13160 }
13161
13162 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13163 {
13164
13165 }
13166
13168 {
13169
13170 return false;
13171 }
13172
13174 {
13175
13176
13177 return false;
13178 }
13179
13181 {
13182
13183 return false;
13184 }
13185
13188 {
13189 return !GetIsFrozen() &&
IsOpen();
13190 }
13191
13193 {
13194 bool hasParent = false, hasRootAsPlayer = false;
13196
13197 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13198 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13199
13200 if (wwtu || foodDecay)
13201 {
13205
13206 if (processWetness || processTemperature || processDecay)
13207 {
13209
13210 if (processWetness)
13211 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13212
13213 if (processTemperature)
13215
13216 if (processDecay)
13217 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13218 }
13219 }
13220 }
13221
13224 {
13226 }
13227
13229 {
13232
13233 return super.GetTemperatureFreezeThreshold();
13234 }
13235
13237 {
13240
13241 return super.GetTemperatureThawThreshold();
13242 }
13243
13245 {
13248
13249 return super.GetItemOverheatThreshold();
13250 }
13251
13253 {
13255 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13256
13257 return super.GetTemperatureFreezeTime();
13258 }
13259
13261 {
13263 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13264
13265 return super.GetTemperatureThawTime();
13266 }
13267
13272
13274 {
13275 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13276 }
13277
13279 {
13280 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13281 }
13282
13285 {
13287 }
13288
13290 {
13292 }
13293
13295 {
13297 }
13298
13301 {
13302 return null;
13303 }
13304
13307 {
13308 return false;
13309 }
13310
13312 {
13314 {
13317 if (!trg)
13318 {
13320 explosive = this;
13321 }
13322
13323 explosive.PairRemote(trg);
13325
13326 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13327 trg.SetPersistentPairID(persistentID);
13328 explosive.SetPersistentPairID(persistentID);
13329
13330 return true;
13331 }
13332 return false;
13333 }
13334
13337 {
13338 float ret = 1.0;
13341 ret *= GetHealth01();
13342
13343 return ret;
13344 }
13345
13346 #ifdef DEVELOPER
13347 override void SetDebugItem()
13348 {
13349 super.SetDebugItem();
13350 _itemBase = this;
13351 }
13352
13354 {
13355 string text = super.GetDebugText();
13356
13358 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13359
13360 return text;
13361 }
13362 #endif
13363
13365 {
13366 return true;
13367 }
13368
13370
13372
13374 {
13377 }
13378
13379
13387
13403}
13404
13406{
13408 if (entity)
13409 {
13410 bool is_item = entity.IsInherited(
ItemBase);
13411 if (is_item && full_quantity)
13412 {
13415 }
13416 }
13417 else
13418 {
13420 return NULL;
13421 }
13422 return entity;
13423}
13424
13426{
13427 if (item)
13428 {
13429 if (health > 0)
13430 item.SetHealth("", "", health);
13431
13432 if (item.CanHaveTemperature())
13433 {
13435 if (item.CanFreeze())
13436 item.SetFrozen(false);
13437 }
13438
13439 if (item.HasEnergyManager())
13440 {
13441 if (quantity >= 0)
13442 {
13443 item.GetCompEM().SetEnergy0To1(quantity);
13444 }
13445 else
13446 {
13448 }
13449 }
13450 else if (item.IsMagazine())
13451 {
13452 Magazine mag = Magazine.Cast(item);
13453 if (quantity >= 0)
13454 {
13455 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13456 }
13457 else
13458 {
13460 }
13461
13462 }
13463 else
13464 {
13465 if (quantity >= 0)
13466 {
13467 item.SetQuantityNormalized(quantity, false);
13468 }
13469 else
13470 {
13472 }
13473
13474 }
13475 }
13476}
13477
13478#ifdef DEVELOPER
13480#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.