8551{
8553 {
8554 return true;
8555 }
8556};
8557
8558
8559
8561{
8565
8567
8570
8571
8572
8573
8574
8583
8589
8594
8599
8620 protected bool m_IsResultOfSplit
8621
8623
8628
8629
8630
8632
8636
8637
8638
8640
8643
8644
8645
8651
8652
8660
8663
8664
8666
8667
8669
8670
8675
8676
8681
8682
8684
8685
8687 {
8692
8693 if (!
GetGame().IsDedicatedServer())
8694 {
8696 {
8698
8700 {
8702 }
8703 }
8704
8707 }
8708
8709 m_OldLocation = null;
8710
8712 {
8714 }
8715
8716 if (ConfigIsExisting("headSelectionsToHide"))
8717 {
8720 }
8721
8723 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8724 {
8726 }
8727
8729
8730 m_IsResultOfSplit = false;
8731
8733 }
8734
8736 {
8737 super.InitItemVariables();
8738
8744 m_Count = ConfigGetInt(
"count");
8745
8748
8753
8756
8761
8773
8777
8778
8781 if (ConfigIsExisting("canBeSplit"))
8782 {
8785 }
8786
8788 if (ConfigIsExisting("itemBehaviour"))
8790
8791
8794 RegisterNetSyncVariableInt("m_VarLiquidType");
8795 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8796
8797 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8798 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8799 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8800
8801 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8802 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8803 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8804 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8805
8806 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8807 RegisterNetSyncVariableBool("m_IsTakeable");
8808 RegisterNetSyncVariableBool("m_IsHologram");
8809
8812 {
8815 }
8816
8818
8820 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8822
8823 }
8824
8826 {
8828 }
8829
8831 {
8834 {
8839 }
8840 }
8841
8842 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8843 {
8845 {
8848 }
8849
8851 }
8852
8854 {
8860 }
8861
8863
8865 {
8867
8868 if (!action)
8869 {
8870 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8871 return;
8872 }
8873
8875 if (!ai)
8876 {
8878 return;
8879 }
8880
8882 if (!action_array)
8883 {
8884 action_array = new array<ActionBase_Basic>;
8886 }
8887 if (LogManager.IsActionLogEnable())
8888 {
8889 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8890 }
8891
8892 if (action_array.Find(action) != -1)
8893 {
8894 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8895 }
8896 else
8897 {
8898 action_array.Insert(action);
8899 }
8900 }
8901
8903 {
8905 ActionBase action = player.GetActionManager().GetAction(actionName);
8908
8909 if (action_array)
8910 {
8911 action_array.RemoveItem(action);
8912 }
8913 }
8914
8915
8916
8918 {
8919 ActionOverrideData overrideData = new ActionOverrideData();
8923
8925 if (!actionMap)
8926 {
8929 }
8930
8931 actionMap.Insert(this.
Type(), overrideData);
8932
8933 }
8934
8936
8938
8939
8941 {
8944
8947
8948 string config_to_search = "CfgVehicles";
8949 string muzzle_owner_config;
8950
8952 {
8953 if (IsInherited(Weapon))
8954 config_to_search = "CfgWeapons";
8955
8956 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8957
8958 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8959
8961
8962 if (config_OnFire_subclass_count > 0)
8963 {
8964 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8965
8966 for (int i = 0; i < config_OnFire_subclass_count; i++)
8967 {
8968 string particle_class = "";
8970 string config_OnFire_entry = config_OnFire_class + particle_class;
8971 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8972 WPOF_array.Insert(WPOF);
8973 }
8974
8975
8977 }
8978 }
8979
8981 {
8982 config_to_search = "CfgWeapons";
8983 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8984
8985 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8986
8988
8989 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8990 {
8991 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8992
8993 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8994 {
8995 string particle_class2 = "";
8997 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8998 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8999 WPOBE_array.Insert(WPOBE);
9000 }
9001
9002
9004 }
9005 }
9006 }
9007
9008
9010 {
9013
9015 {
9016 string config_to_search = "CfgVehicles";
9017
9018 if (IsInherited(Weapon))
9019 config_to_search = "CfgWeapons";
9020
9021 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9022 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9023
9024 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9025 {
9026
9028
9030 {
9032 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9034 return;
9035 }
9036
9039
9040
9041
9043 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9044
9045 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9046 {
9047 string particle_class = "";
9049 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9051
9052 if (entry_type == CT_CLASS)
9053 {
9054 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9055 WPOOH_array.Insert(WPOF);
9056 }
9057 }
9058
9059
9061 }
9062 }
9063 }
9064
9066 {
9068 }
9069
9071 {
9073 {
9075
9078
9081
9082 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9083 }
9084 }
9085
9087 {
9089 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9090
9092 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9093
9095 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9096
9098 {
9100 }
9101 }
9102
9104 {
9106 }
9107
9109 {
9112 else
9114
9116 {
9119 }
9120 else
9121 {
9124
9127 }
9128
9130 }
9131
9133 {
9135 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9136 }
9137
9139 {
9141 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9143 }
9144
9146 {
9148 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9149 }
9150
9152 {
9155
9156 OverheatingParticle OP = new OverheatingParticle();
9161
9163 }
9164
9166 {
9169
9170 return -1;
9171 }
9172
9174 {
9176 {
9179
9180 for (int i = count; i > 0; --i)
9181 {
9182 int id = i - 1;
9185
9188
9189 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9190 {
9191 if (p)
9192 {
9195 }
9196 }
9197 }
9198 }
9199 }
9200
9202 {
9204 {
9206 {
9207 int id = i - 1;
9209
9210 if (OP)
9211 {
9213
9214 if (p)
9215 {
9217 }
9218
9219 delete OP;
9220 }
9221 }
9222
9225 }
9226 }
9227
9230 {
9231 return 0.0;
9232 }
9233
9234
9236 {
9237 return 250;
9238 }
9239
9241 {
9242 return 0;
9243 }
9244
9247 {
9249 return true;
9250
9251 return false;
9252 }
9253
9256 {
9259
9261 {
9263 }
9264 else
9265 {
9266
9268 }
9269
9271 }
9272
9279 {
9280 return -1;
9281 }
9282
9283
9284
9285
9287 {
9289 {
9291 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9292
9293 if (r_index >= 0)
9294 {
9295 InventoryLocation r_il = new InventoryLocation;
9296 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9297
9298 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9301 {
9302 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9303 }
9305 {
9306 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9307 }
9308
9309 }
9310
9311 player.GetHumanInventory().ClearUserReservedLocation(this);
9312 }
9313
9316 }
9317
9318
9319
9320
9322 {
9323 return ItemBase.m_DebugActionsMask;
9324 }
9325
9327 {
9328 return ItemBase.m_DebugActionsMask & mask;
9329 }
9330
9332 {
9333 ItemBase.m_DebugActionsMask = mask;
9334 }
9335
9337 {
9338 ItemBase.m_DebugActionsMask |= mask;
9339 }
9340
9342 {
9343 ItemBase.m_DebugActionsMask &= ~mask;
9344 }
9345
9347 {
9349 {
9351 }
9352 else
9353 {
9355 }
9356 }
9357
9358
9360 {
9361 if (GetEconomyProfile())
9362 {
9363 float q_max = GetEconomyProfile().GetQuantityMax();
9364 if (q_max > 0)
9365 {
9366 float q_min = GetEconomyProfile().GetQuantityMin();
9367 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9368
9370 {
9371 ComponentEnergyManager comp = GetCompEM();
9373 {
9375 }
9376 }
9378 {
9380
9381 }
9382
9383 }
9384 }
9385 }
9386
9389 {
9390 EntityAI parent = GetHierarchyParent();
9391
9392 if (parent)
9393 {
9394 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9395 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9396 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9397 }
9398 }
9399
9402 {
9403 EntityAI parent = GetHierarchyParent();
9404
9405 if (parent)
9406 {
9407 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9408 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9409 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9410 }
9411 }
9412
9414 {
9415
9416
9417
9418
9420
9422 {
9423 if (ScriptInputUserData.CanStoreInputUserData())
9424 {
9425 ScriptInputUserData ctx = new ScriptInputUserData;
9431 ctx.
Write(use_stack_max);
9434
9436 {
9437 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9438 }
9439 }
9440 }
9441 else if (!
GetGame().IsMultiplayer())
9442 {
9444 }
9445 }
9446
9448 {
9450 }
9451
9453 {
9455 }
9456
9458 {
9460 }
9461
9463 {
9464
9465 return false;
9466 }
9467
9469 {
9470 return false;
9471 }
9472
9476 {
9477 return false;
9478 }
9479
9481 {
9482 return "";
9483 }
9484
9486
9488 {
9489 return false;
9490 }
9491
9493 {
9494 return true;
9495 }
9496
9497
9498
9500 {
9501 return true;
9502 }
9503
9505 {
9506 return true;
9507 }
9508
9510 {
9511 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9513 }
9514
9516 {
9518 }
9519
9521 {
9523 if (!is_being_placed)
9525 SetSynchDirty();
9526 }
9527
9528
9530
9532 {
9534 }
9535
9537 {
9539 }
9540
9542 {
9543 return 1;
9544 }
9545
9547 {
9548 return false;
9549 }
9550
9552 {
9554 SetSynchDirty();
9555 }
9556
9557
9558
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
9592 {
9593 super.OnMovedInsideCargo(container);
9594
9595 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9596 }
9597
9598 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9599 {
9600 super.EEItemLocationChanged(oldLoc,newLoc);
9601
9602 PlayerBase new_player = null;
9603 PlayerBase old_player = null;
9604
9605 if (newLoc.GetParent())
9606 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9607
9608 if (oldLoc.GetParent())
9609 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9610
9612 {
9613 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9614
9615 if (r_index >= 0)
9616 {
9617 InventoryLocation r_il = new InventoryLocation;
9618 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9619
9620 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9623 {
9624 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9625 }
9627 {
9628 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9629 }
9630
9631 }
9632 }
9633
9635 {
9636 if (new_player)
9637 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9638
9639 if (new_player == old_player)
9640 {
9641
9642 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9643 {
9645 {
9646 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9647 {
9648 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9649 }
9650 }
9651 else
9652 {
9653 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9654 }
9655 }
9656
9657 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9658 {
9659 int type = oldLoc.GetType();
9661 {
9662 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9663 }
9665 {
9666 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9667 }
9668 }
9669 if (!m_OldLocation)
9670 {
9671 m_OldLocation = new InventoryLocation;
9672 }
9673 m_OldLocation.Copy(oldLoc);
9674 }
9675 else
9676 {
9677 if (m_OldLocation)
9678 {
9679 m_OldLocation.Reset();
9680 }
9681 }
9682
9684 }
9685 else
9686 {
9687 if (new_player)
9688 {
9689 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9690 if (res_index >= 0)
9691 {
9692 InventoryLocation il = new InventoryLocation;
9693 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9695 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9698 {
9699 il.
GetParent().GetOnReleaseLock().Invoke(it);
9700 }
9702 {
9704 }
9705
9706 }
9707 }
9709 {
9710
9712 }
9713
9714 if (m_OldLocation)
9715 {
9716 m_OldLocation.Reset();
9717 }
9718 }
9719 }
9720
9721 override void EOnContact(IEntity other, Contact extra)
9722 {
9724 {
9725 int liquidType = -1;
9727 if (impactSpeed > 0.0)
9728 {
9730 #ifndef SERVER
9732 #else
9734 SetSynchDirty();
9735 #endif
9737 }
9738 }
9739
9740 #ifdef SERVER
9741 if (GetCompEM() && GetCompEM().IsPlugged())
9742 {
9743 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9744 GetCompEM().UnplugThis();
9745 }
9746 #endif
9747 }
9748
9750
9752 {
9754 }
9755
9757 {
9758
9759 }
9760
9762 {
9763 super.OnItemLocationChanged(old_owner, new_owner);
9764
9765 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9766 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9767
9768 if (!relatedPlayer && playerNew)
9769 relatedPlayer = playerNew;
9770
9771 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9772 {
9774 if (actionMgr)
9775 {
9776 ActionBase currentAction = actionMgr.GetRunningAction();
9777 if (currentAction)
9779 }
9780 }
9781
9782 Man ownerPlayerOld = null;
9783 Man ownerPlayerNew = null;
9784
9785 if (old_owner)
9786 {
9787 if (old_owner.
IsMan())
9788 {
9789 ownerPlayerOld = Man.Cast(old_owner);
9790 }
9791 else
9792 {
9793 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9794 }
9795 }
9796 else
9797 {
9799 {
9801
9802 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9803 {
9804 GetCompEM().UnplugThis();
9805 }
9806 }
9807 }
9808
9809 if (new_owner)
9810 {
9811 if (new_owner.
IsMan())
9812 {
9813 ownerPlayerNew = Man.Cast(new_owner);
9814 }
9815 else
9816 {
9817 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9818 }
9819 }
9820
9821 if (ownerPlayerOld != ownerPlayerNew)
9822 {
9823 if (ownerPlayerOld)
9824 {
9825 array<EntityAI> subItemsExit = new array<EntityAI>;
9827 for (int i = 0; i < subItemsExit.Count(); i++)
9828 {
9831 }
9832 }
9833
9834 if (ownerPlayerNew)
9835 {
9836 array<EntityAI> subItemsEnter = new array<EntityAI>;
9838 for (int j = 0; j < subItemsEnter.Count(); j++)
9839 {
9842 }
9843 }
9844 }
9845 else if (ownerPlayerNew != null)
9846 {
9847 PlayerBase nplayer;
9848 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9849 {
9850 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9852 for (int k = 0; k < subItemsUpdate.Count(); k++)
9853 {
9855 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9856 }
9857 }
9858 }
9859
9860 if (old_owner)
9861 old_owner.OnChildItemRemoved(this);
9862 if (new_owner)
9863 new_owner.OnChildItemReceived(this);
9864 }
9865
9866
9868 {
9869 super.EEDelete(parent);
9870 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9871 if (player)
9872 {
9874
9875 if (player.IsAlive())
9876 {
9877 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9878 if (r_index >= 0)
9879 {
9880 InventoryLocation r_il = new InventoryLocation;
9881 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9882
9883 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9886 {
9887 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9888 }
9890 {
9891 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9892 }
9893
9894 }
9895
9896 player.RemoveQuickBarEntityShortcut(this);
9897 }
9898 }
9899 }
9900
9902 {
9903 super.EEKilled(killer);
9904
9907 {
9908 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9909 {
9910 if (IsMagazine())
9911 {
9912 if (Magazine.Cast(this).GetAmmoCount() > 0)
9913 {
9915 }
9916 }
9917 else
9918 {
9920 }
9921 }
9922 }
9923 }
9924
9926 {
9927 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9928
9929 super.OnWasAttached(parent, slot_id);
9930
9933
9935 }
9936
9938 {
9939 super.OnWasDetached(parent, slot_id);
9940
9943 }
9944
9946 {
9947 int idx;
9950
9951 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9952 if (inventory_slots.Count() < 1)
9953 {
9954 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9955 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9956 }
9957 else
9958 {
9959 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9960 }
9961
9962 idx = inventory_slots.Find(slot);
9963 if (idx < 0)
9964 return "";
9965
9966 return attach_types.Get(idx);
9967 }
9968
9970 {
9971 int idx = -1;
9972 string slot;
9973
9976
9977 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9978 if (inventory_slots.Count() < 1)
9979 {
9980 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9981 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9982 }
9983 else
9984 {
9985 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9986 if (detach_types.Count() < 1)
9987 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9988 }
9989
9990 for (int i = 0; i < inventory_slots.Count(); i++)
9991 {
9992 slot = inventory_slots.Get(i);
9993 }
9994
9995 if (slot != "")
9996 {
9997 if (detach_types.Count() == 1)
9998 idx = 0;
9999 else
10000 idx = inventory_slots.Find(slot);
10001 }
10002 if (idx < 0)
10003 return "";
10004
10005 return detach_types.Get(idx);
10006 }
10007
10009 {
10010
10012
10013
10014 float min_time = 1;
10015 float max_time = 3;
10016 float delay = Math.RandomFloat(min_time, max_time);
10017
10018 explode_timer.Run(delay, this, "DoAmmoExplosion");
10019 }
10020
10022 {
10023 Magazine magazine = Magazine.Cast(this);
10024 int pop_sounds_count = 6;
10025 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10026
10027
10028 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10029 string sound_name = pop_sounds[ sound_idx ];
10031
10032
10033 magazine.ServerAddAmmoCount(-1);
10034
10035
10036 float min_temp_to_explode = 100;
10037
10038 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10039 {
10041 }
10042 }
10043
10044
10045 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10046 {
10047 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10048
10049 const int CHANCE_DAMAGE_CARGO = 4;
10050 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10051 const int CHANCE_DAMAGE_NOTHING = 2;
10052
10054 {
10055 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10056 int chances;
10057 int rnd;
10058
10059 if (GetInventory().GetCargo())
10060 {
10061 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10062 rnd = Math.RandomInt(0,chances);
10063
10064 if (rnd < CHANCE_DAMAGE_CARGO)
10065 {
10067 }
10068 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10069 {
10071 }
10072 }
10073 else
10074 {
10075 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10076 rnd = Math.RandomInt(0,chances);
10077
10078 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10079 {
10081 }
10082 }
10083 }
10084 }
10085
10087 {
10088 if (GetInventory().GetCargo())
10089 {
10090 int item_count = GetInventory().GetCargo().GetItemCount();
10091 if (item_count > 0)
10092 {
10093 int random_pick = Math.RandomInt(0, item_count);
10095 if (!item.IsExplosive())
10096 {
10097 item.AddHealth("","",damage);
10098 return true;
10099 }
10100 }
10101 }
10102 return false;
10103 }
10104
10106 {
10107 int attachment_count = GetInventory().AttachmentCount();
10108 if (attachment_count > 0)
10109 {
10110 int random_pick = Math.RandomInt(0, attachment_count);
10111 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10112 if (!attachment.IsExplosive())
10113 {
10114 attachment.AddHealth("","",damage);
10115 return true;
10116 }
10117 }
10118 return false;
10119 }
10120
10122 {
10124 }
10125
10127 {
10129 return GetInventory().CanRemoveEntity();
10130
10131 return false;
10132 }
10133
10135 {
10137 return;
10138
10140 {
10141 if (ScriptInputUserData.CanStoreInputUserData())
10142 {
10143 ScriptInputUserData ctx = new ScriptInputUserData;
10148 ctx.
Write(destination_entity);
10150 ctx.
Write(slot_id);
10152 }
10153 }
10154 else if (!
GetGame().IsMultiplayer())
10155 {
10157 }
10158 }
10159
10161 {
10163 return;
10164
10165 float split_quantity_new;
10169 InventoryLocation loc = new InventoryLocation;
10170
10171 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10172 {
10174 split_quantity_new = stack_max;
10175 else
10177
10178 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10179 if (new_item)
10180 {
10181 new_item.SetResultOfSplit(true);
10182 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10184 new_item.SetQuantity(split_quantity_new);
10185 }
10186 }
10187 else if (destination_entity && slot_id == -1)
10188 {
10189 if (quantity > stack_max)
10190 split_quantity_new = stack_max;
10191 else
10192 split_quantity_new = quantity;
10193
10195 {
10198 }
10199
10200 if (new_item)
10201 {
10202 new_item.SetResultOfSplit(true);
10203 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10205 new_item.SetQuantity(split_quantity_new);
10206 }
10207 }
10208 else
10209 {
10210 if (stack_max != 0)
10211 {
10213 {
10215 }
10216
10217 if (split_quantity_new == 0)
10218 {
10219 if (!
GetGame().IsMultiplayer())
10220 player.PhysicalPredictiveDropItem(this);
10221 else
10222 player.ServerDropEntity(this);
10223 return;
10224 }
10225
10227
10228 if (new_item)
10229 {
10230 new_item.SetResultOfSplit(true);
10231 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10233 new_item.SetQuantity(stack_max);
10234 new_item.PlaceOnSurface();
10235 }
10236 }
10237 }
10238 }
10239
10241 {
10243 return;
10244
10245 float split_quantity_new;
10249 InventoryLocation loc = new InventoryLocation;
10250
10251 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10252 {
10254 split_quantity_new = stack_max;
10255 else
10257
10258 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10259 if (new_item)
10260 {
10261 new_item.SetResultOfSplit(true);
10262 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10264 new_item.SetQuantity(split_quantity_new);
10265 }
10266 }
10267 else if (destination_entity && slot_id == -1)
10268 {
10269 if (quantity > stack_max)
10270 split_quantity_new = stack_max;
10271 else
10272 split_quantity_new = quantity;
10273
10275 {
10278 }
10279
10280 if (new_item)
10281 {
10282 new_item.SetResultOfSplit(true);
10283 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10285 new_item.SetQuantity(split_quantity_new);
10286 }
10287 }
10288 else
10289 {
10290 if (stack_max != 0)
10291 {
10293 {
10295 }
10296
10298
10299 if (new_item)
10300 {
10301 new_item.SetResultOfSplit(true);
10302 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10304 new_item.SetQuantity(stack_max);
10305 new_item.PlaceOnSurface();
10306 }
10307 }
10308 }
10309 }
10310
10312 {
10314 return;
10315
10317 {
10318 if (ScriptInputUserData.CanStoreInputUserData())
10319 {
10320 ScriptInputUserData ctx = new ScriptInputUserData;
10325 dst.WriteToContext(ctx);
10327 }
10328 }
10329 else if (!
GetGame().IsMultiplayer())
10330 {
10332 }
10333 }
10334
10336 {
10338 return;
10339
10341 {
10342 if (ScriptInputUserData.CanStoreInputUserData())
10343 {
10344 ScriptInputUserData ctx = new ScriptInputUserData;
10349 ctx.
Write(destination_entity);
10355 }
10356 }
10357 else if (!
GetGame().IsMultiplayer())
10358 {
10360 }
10361 }
10362
10364 {
10366 }
10367
10369 {
10371 return this;
10372
10374 float split_quantity_new;
10376 if (dst.IsValid())
10377 {
10378 int slot_id = dst.GetSlot();
10380
10381 if (quantity > stack_max)
10382 split_quantity_new = stack_max;
10383 else
10384 split_quantity_new = quantity;
10385
10387
10388 if (new_item)
10389 {
10390 new_item.SetResultOfSplit(true);
10391 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10394 }
10395
10396 return new_item;
10397 }
10398
10399 return null;
10400 }
10401
10403 {
10405 return;
10406
10408 float split_quantity_new;
10410 if (destination_entity)
10411 {
10413 if (quantity > stackable)
10414 split_quantity_new = stackable;
10415 else
10416 split_quantity_new = quantity;
10417
10418 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10419 if (new_item)
10420 {
10421 new_item.SetResultOfSplit(true);
10422 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10424 new_item.SetQuantity(split_quantity_new);
10425 }
10426 }
10427 }
10428
10430 {
10432 return;
10433
10435 {
10436 if (ScriptInputUserData.CanStoreInputUserData())
10437 {
10438 ScriptInputUserData ctx = new ScriptInputUserData;
10443 ItemBase destination_entity =
this;
10444 ctx.
Write(destination_entity);
10448 }
10449 }
10450 else if (!
GetGame().IsMultiplayer())
10451 {
10453 }
10454 }
10455
10457 {
10459 return;
10460
10462 float split_quantity_new;
10464 if (player)
10465 {
10467 if (quantity > stackable)
10468 split_quantity_new = stackable;
10469 else
10470 split_quantity_new = quantity;
10471
10472 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10473 new_item =
ItemBase.Cast(in_hands);
10474 if (new_item)
10475 {
10476 new_item.SetResultOfSplit(true);
10477 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10479 new_item.SetQuantity(split_quantity_new);
10480 }
10481 }
10482 }
10483
10485 {
10487 return;
10488
10490 float split_quantity_new = Math.Floor(quantity * 0.5);
10491
10493
10494 if (new_item)
10495 {
10496 if (new_item.GetQuantityMax() < split_quantity_new)
10497 {
10498 split_quantity_new = new_item.GetQuantityMax();
10499 }
10500
10501 new_item.SetResultOfSplit(true);
10502 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10503
10505 {
10508 }
10509 else
10510 {
10513 }
10514 }
10515 }
10516
10518 {
10520 return;
10521
10523 float split_quantity_new = Math.Floor(quantity / 2);
10524
10525 InventoryLocation invloc = new InventoryLocation;
10527
10529 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10530
10531 if (new_item)
10532 {
10533 if (new_item.GetQuantityMax() < split_quantity_new)
10534 {
10535 split_quantity_new = new_item.GetQuantityMax();
10536 }
10538 {
10541 }
10542 else
10543 {
10546 }
10547 }
10548 }
10549
10552 {
10553 SetWeightDirty();
10555
10556 if (parent)
10557 parent.OnAttachmentQuantityChangedEx(this, delta);
10558
10560 {
10562 {
10564 }
10566 {
10567 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10569 }
10570 }
10571
10572 }
10573
10576 {
10577
10578 }
10579
10582 {
10584 }
10585
10587 {
10588 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10589
10591 {
10592 if (newLevel == GameConstants.STATE_RUINED)
10593 {
10595 EntityAI parent = GetHierarchyParent();
10596 if (parent && parent.IsFireplace())
10597 {
10598 CargoBase cargo = GetInventory().GetCargo();
10599 if (cargo)
10600 {
10602 {
10604 }
10605 }
10606 }
10607 }
10608
10610 {
10611
10613 return;
10614 }
10615
10616 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10617 {
10619 }
10620 }
10621 }
10622
10623
10625 {
10626 super.OnRightClick();
10627
10629 {
10631 {
10632 if (ScriptInputUserData.CanStoreInputUserData())
10633 {
10634 vector m4[4];
10636
10637 EntityAI root = GetHierarchyRoot();
10638
10639 InventoryLocation dst = new InventoryLocation;
10641 {
10642 if (root)
10643 {
10644 root.GetTransform(m4);
10646 }
10647 else
10648 GetInventory().GetCurrentInventoryLocation(dst);
10649 }
10650 else
10651 {
10653
10654
10655 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10656 {
10657 if (root)
10658 {
10659 root.GetTransform(m4);
10661 }
10662 else
10663 GetInventory().GetCurrentInventoryLocation(dst);
10664 }
10665 else
10666 {
10667 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10668 }
10669 }
10670
10671 ScriptInputUserData ctx = new ScriptInputUserData;
10679 }
10680 }
10681 else if (!
GetGame().IsMultiplayer())
10682 {
10684 }
10685 }
10686 }
10687
10688 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10689 {
10690
10691 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10692 return false;
10693
10694 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10695 return false;
10696
10697
10699 return false;
10700
10701
10702 Magazine mag = Magazine.Cast(this);
10703 if (mag)
10704 {
10705 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10706 return false;
10707
10708 if (stack_max_limit)
10709 {
10710 Magazine other_mag = Magazine.Cast(other_item);
10711 if (other_item)
10712 {
10713 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10714 return false;
10715 }
10716
10717 }
10718 }
10719 else
10720 {
10721
10723 return false;
10724
10726 return false;
10727 }
10728
10729 PlayerBase player = null;
10730 if (CastTo(player, GetHierarchyRootPlayer()))
10731 {
10732 if (player.GetInventory().HasAttachment(this))
10733 return false;
10734
10735 if (player.IsItemsToDelete())
10736 return false;
10737 }
10738
10739 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10740 return false;
10741
10742 int slotID;
10744 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10745 return false;
10746
10747 return true;
10748 }
10749
10751 {
10753 }
10754
10756 {
10757 return m_IsResultOfSplit;
10758 }
10759
10761 {
10762 m_IsResultOfSplit = value;
10763 }
10764
10766 {
10768 }
10769
10771 {
10772 float other_item_quantity = other_item.GetQuantity();
10773 float this_free_space;
10774
10776
10778
10779 if (other_item_quantity > this_free_space)
10780 {
10781 return this_free_space;
10782 }
10783 else
10784 {
10785 return other_item_quantity;
10786 }
10787 }
10788
10790 {
10792 }
10793
10795 {
10797 return;
10798
10799 if (!IsMagazine() && other_item)
10800 {
10802 if (quantity_used != 0)
10803 {
10804 float hp1 = GetHealth01("","");
10805 float hp2 = other_item.GetHealth01("","");
10806 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10807 hpResult = hpResult / (
GetQuantity() + quantity_used);
10808
10809 hpResult *= GetMaxHealth();
10810 Math.Round(hpResult);
10811 SetHealth("", "Health", hpResult);
10812
10814 other_item.AddQuantity(-quantity_used);
10815 }
10816 }
10818 }
10819
10821 {
10822 #ifdef SERVER
10823 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10824 GetHierarchyParent().IncreaseLifetimeUp();
10825 #endif
10826 };
10827
10829 {
10830 PlayerBase p = PlayerBase.Cast(player);
10831
10832 array<int> recipesIds = p.m_Recipes;
10833 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10834 if (moduleRecipesManager)
10835 {
10836 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10837 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10838 }
10839
10840 for (int i = 0;i < recipesIds.Count(); i++)
10841 {
10842 int key = recipesIds.Get(i);
10843 string recipeName = moduleRecipesManager.GetRecipeName(key);
10845 }
10846 }
10847
10848
10849 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10850 {
10851 super.GetDebugActions(outputList);
10852
10853
10858
10859
10863
10867
10868
10871
10872
10874 {
10877 }
10878
10880
10883
10887 }
10888
10889
10890
10891
10893 {
10894 super.OnAction(action_id, player, ctx);
10895 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10896 {
10897 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10898 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10899 PlayerBase p = PlayerBase.Cast(player);
10900 if (
EActions.RECIPES_RANGE_START < 1000)
10901 {
10902 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10903 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10904 }
10905 }
10906 #ifndef SERVER
10907 else if (action_id ==
EActions.WATCH_PLAYER)
10908 {
10909 PluginDeveloper.SetDeveloperItemClientEx(player);
10910 }
10911 #endif
10913 {
10914 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10915 {
10916 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10917 OnDebugButtonPressServer(id + 1);
10918 }
10919
10920 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10921 {
10922 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10924 }
10925
10926 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10927 {
10928 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10930 }
10931
10932 else if (action_id ==
EActions.ADD_QUANTITY)
10933 {
10934 if (IsMagazine())
10935 {
10936 Magazine mag = Magazine.Cast(this);
10937 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10938 }
10939 else
10940 {
10942 }
10943
10944 if (m_EM)
10945 {
10946 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10947 }
10948
10949 }
10950
10951 else if (action_id ==
EActions.REMOVE_QUANTITY)
10952 {
10953 if (IsMagazine())
10954 {
10955 Magazine mag2 = Magazine.Cast(this);
10956 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10957 }
10958 else
10959 {
10961 }
10962 if (m_EM)
10963 {
10964 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10965 }
10966
10967 }
10968
10969 else if (action_id ==
EActions.SET_QUANTITY_0)
10970 {
10972
10973 if (m_EM)
10974 {
10975 m_EM.SetEnergy(0);
10976 }
10977 }
10978
10979 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10980 {
10982
10983 if (m_EM)
10984 {
10985 m_EM.SetEnergy(m_EM.GetEnergyMax());
10986 }
10987 }
10988
10989 else if (action_id ==
EActions.ADD_HEALTH)
10990 {
10991 AddHealth("","",GetMaxHealth("","Health")/5);
10992 }
10993 else if (action_id ==
EActions.REMOVE_HEALTH)
10994 {
10995 AddHealth("","",-GetMaxHealth("","Health")/5);
10996 }
10997 else if (action_id ==
EActions.DESTROY_HEALTH)
10998 {
10999 SetHealth01("","",0);
11000 }
11001 else if (action_id ==
EActions.WATCH_ITEM)
11002 {
11004 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11005 #ifdef DEVELOPER
11006 SetDebugDeveloper_item(this);
11007 #endif
11008 }
11009
11010 else if (action_id ==
EActions.ADD_TEMPERATURE)
11011 {
11012 AddTemperature(20);
11013
11014 }
11015
11016 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11017 {
11018 AddTemperature(-20);
11019
11020 }
11021
11022 else if (action_id ==
EActions.FLIP_FROZEN)
11023 {
11024 SetFrozen(!GetIsFrozen());
11025
11026 }
11027
11028 else if (action_id ==
EActions.ADD_WETNESS)
11029 {
11031
11032 }
11033
11034 else if (action_id ==
EActions.REMOVE_WETNESS)
11035 {
11037
11038 }
11039
11040 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11041 {
11044
11045
11046 }
11047
11048 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11049 {
11052 }
11053
11054 else if (action_id ==
EActions.MAKE_SPECIAL)
11055 {
11056 auto debugParams = DebugSpawnParams.WithPlayer(player);
11057 OnDebugSpawnEx(debugParams);
11058 }
11059
11060 else if (action_id ==
EActions.DELETE)
11061 {
11062 Delete();
11063 }
11064
11065 }
11066
11067
11068 return false;
11069 }
11070
11071
11072
11073
11077
11080
11081
11082
11084 {
11085 return false;
11086 }
11087
11088
11090 {
11091 return true;
11092 }
11093
11094
11096 {
11097 return true;
11098 }
11099
11100
11101
11103 {
11104 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11106 }
11107
11110 {
11111 return null;
11112 }
11113
11115 {
11116 return false;
11117 }
11118
11120 {
11121 return false;
11122 }
11123
11127
11128
11130 {
11131 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11132 return module_repairing.CanRepair(this, item_repair_kit);
11133 }
11134
11135
11136 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11137 {
11138 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11139 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11140 }
11141
11142
11144 {
11145
11146
11147
11148
11149
11150
11151
11152
11153 return 1;
11154 }
11155
11156
11157
11159 {
11161 }
11162
11163
11164
11166 {
11168 }
11169
11170
11179 {
11180 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11181
11182 if (player)
11183 {
11184 player.MessageStatus(text);
11185 }
11186 }
11187
11188
11197 {
11198 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11199
11200 if (player)
11201 {
11202 player.MessageAction(text);
11203 }
11204 }
11205
11206
11215 {
11216 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11217
11218 if (player)
11219 {
11220 player.MessageFriendly(text);
11221 }
11222 }
11223
11224
11233 {
11234 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11235
11236 if (player)
11237 {
11238 player.MessageImportant(text);
11239 }
11240 }
11241
11243 {
11244 return true;
11245 }
11246
11247
11248 override bool KindOf(
string tag)
11249 {
11250 bool found = false;
11251 string item_name = this.
GetType();
11254
11255 int array_size = item_tag_array.Count();
11256 for (int i = 0; i < array_size; i++)
11257 {
11258 if (item_tag_array.Get(i) == tag)
11259 {
11260 found = true;
11261 break;
11262 }
11263 }
11264 return found;
11265 }
11266
11267
11269 {
11270
11271 super.OnRPC(sender, rpc_type,ctx);
11272
11273
11274 switch (rpc_type)
11275 {
11276 #ifndef SERVER
11277 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11278 Param2<bool, string> p = new Param2<bool, string>(false, "");
11279
11281 return;
11282
11283 bool play = p.param1;
11284 string soundSet = p.param2;
11285
11286 if (play)
11287 {
11289 {
11291 {
11293 }
11294 }
11295 else
11296 {
11298 }
11299 }
11300 else
11301 {
11303 }
11304
11305 break;
11306 #endif
11307
11308 }
11309
11311 {
11313 }
11314 }
11315
11316
11317
11318
11320 {
11321 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11322 return plugin.GetID(
name);
11323 }
11324
11326 {
11327 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11328 return plugin.GetName(id);
11329 }
11330
11333 {
11334
11335
11336 int varFlags;
11337 if (!ctx.
Read(varFlags))
11338 return;
11339
11340 if (varFlags & ItemVariableFlags.FLOAT)
11341 {
11343 }
11344 }
11345
11347 {
11348
11349 super.SerializeNumericalVars(floats_out);
11350
11351
11352
11354 {
11356 }
11357
11359 {
11361 }
11362
11364 {
11366 }
11367
11369 {
11374 }
11375
11377 {
11379 }
11380 }
11381
11383 {
11384
11385 super.DeSerializeNumericalVars(floats);
11386
11387
11388 int index = 0;
11389 int mask = Math.Round(floats.Get(index));
11390
11391 index++;
11392
11394 {
11396 {
11398 }
11399 else
11400 {
11401 float quantity = floats.Get(index);
11402 SetQuantity(quantity,
true,
false,
false,
false);
11403 }
11404 index++;
11405 }
11406
11408 {
11409 float wet = floats.Get(index);
11411 index++;
11412 }
11413
11415 {
11416 int liquidtype = Math.Round(floats.Get(index));
11418 index++;
11419 }
11420
11422 {
11424 index++;
11426 index++;
11428 index++;
11430 index++;
11431 }
11432
11434 {
11435 int cleanness = Math.Round(floats.Get(index));
11437 index++;
11438 }
11439 }
11440
11442 {
11443 super.WriteVarsToCTX(ctx);
11444
11445
11447 {
11449 }
11450
11452 {
11454 }
11455
11457 {
11459 }
11460
11462 {
11463 int r,g,b,a;
11469 }
11470
11472 {
11474 }
11475 }
11476
11478 {
11479 if (!super.ReadVarsFromCTX(ctx,version))
11480 return false;
11481
11482 int intValue;
11483 float value;
11484
11485 if (version < 140)
11486 {
11487 if (!ctx.
Read(intValue))
11488 return false;
11489
11490 m_VariablesMask = intValue;
11491 }
11492
11494 {
11495 if (!ctx.
Read(value))
11496 return false;
11497
11499 {
11501 }
11502 else
11503 {
11505 }
11506 }
11507
11508 if (version < 140)
11509 {
11511 {
11512 if (!ctx.
Read(value))
11513 return false;
11514 SetTemperatureDirect(value);
11515 }
11516 }
11517
11519 {
11520 if (!ctx.
Read(value))
11521 return false;
11523 }
11524
11526 {
11527 if (!ctx.
Read(intValue))
11528 return false;
11530 }
11531
11533 {
11534 int r,g,b,a;
11536 return false;
11538 return false;
11540 return false;
11542 return false;
11543
11545 }
11546
11548 {
11549 if (!ctx.
Read(intValue))
11550 return false;
11552 }
11553
11554 if (version >= 138 && version < 140)
11555 {
11557 {
11558 if (!ctx.
Read(intValue))
11559 return false;
11560 SetFrozen(intValue);
11561 }
11562 }
11563
11564 return true;
11565 }
11566
11567
11569 {
11572 {
11574 }
11575
11576 if (!super.OnStoreLoad(ctx, version))
11577 {
11579 return false;
11580 }
11581
11582 if (version >= 114)
11583 {
11584 bool hasQuickBarIndexSaved;
11585
11586 if (!ctx.
Read(hasQuickBarIndexSaved))
11587 {
11589 return false;
11590 }
11591
11592 if (hasQuickBarIndexSaved)
11593 {
11594 int itmQBIndex;
11595
11596
11597 if (!ctx.
Read(itmQBIndex))
11598 {
11600 return false;
11601 }
11602
11603 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11604 if (itmQBIndex != -1 && parentPlayer)
11605 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11606 }
11607 }
11608 else
11609 {
11610
11611 PlayerBase player;
11612 int itemQBIndex;
11613 if (version ==
int.
MAX)
11614 {
11615 if (!ctx.
Read(itemQBIndex))
11616 {
11618 return false;
11619 }
11620 }
11621 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11622 {
11623
11624 if (!ctx.
Read(itemQBIndex))
11625 {
11627 return false;
11628 }
11629 if (itemQBIndex != -1 && player)
11630 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11631 }
11632 }
11633
11634 if (version < 140)
11635 {
11636
11637 if (!LoadVariables(ctx, version))
11638 {
11640 return false;
11641 }
11642 }
11643
11644
11646 {
11648 return false;
11649 }
11650 if (version >= 132)
11651 {
11653 if (raib)
11654 {
11656 {
11658 return false;
11659 }
11660 }
11661 }
11662
11664 return true;
11665 }
11666
11667
11668
11670 {
11671 super.OnStoreSave(ctx);
11672
11673 PlayerBase player;
11674 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11675 {
11677
11678 int itemQBIndex = -1;
11679 itemQBIndex = player.FindQuickBarEntityIndex(this);
11680 ctx.
Write(itemQBIndex);
11681 }
11682 else
11683 {
11685 }
11686
11688
11690 if (raib)
11691 {
11693 }
11694 }
11695
11696
11698 {
11699 super.AfterStoreLoad();
11700
11702 {
11704 }
11705
11707 {
11710 }
11711 }
11712
11714 {
11715 super.EEOnAfterLoad();
11716
11718 {
11720 }
11721
11724 }
11725
11727 {
11728 return false;
11729 }
11730
11731
11732
11734 {
11736 {
11737 #ifdef PLATFORM_CONSOLE
11738
11740 {
11742 if (menu)
11743 {
11745 }
11746 }
11747 #endif
11748 }
11749
11751 {
11754 }
11755
11757 {
11758 SetWeightDirty();
11760 }
11762 {
11765 }
11766
11768 {
11771 }
11773 {
11776 }
11777
11778 super.OnVariablesSynchronized();
11779 }
11780
11781
11782
11784 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11785 {
11786 if (!IsServerCheck(allow_client))
11787 return false;
11788
11790 return false;
11791
11794
11795 if (value <= (min + 0.001))
11796 value = min;
11797
11798 if (value == min)
11799 {
11800 if (destroy_config)
11801 {
11802 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11803 if (dstr)
11804 {
11806 this.Delete();
11807 return true;
11808 }
11809 }
11810 else if (destroy_forced)
11811 {
11813 this.Delete();
11814 return true;
11815 }
11816
11818 }
11819
11822
11824 {
11826
11827 if (delta)
11829 }
11830
11832
11833 return false;
11834 }
11835
11836
11838 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11839 {
11841 }
11842
11844 {
11847 }
11848
11850 {
11853 }
11854
11857 {
11858 float value_clamped = Math.Clamp(value, 0, 1);
11860 SetQuantity(result, destroy_config, destroy_forced);
11861 }
11862
11863
11866 {
11868 }
11869
11871 {
11873 }
11874
11875
11876
11877
11878
11879
11880
11881
11882
11883
11885 {
11886 int slot = -1;
11887 if (GetInventory())
11888 {
11889 InventoryLocation il = new InventoryLocation;
11890 GetInventory().GetCurrentInventoryLocation(il);
11892 }
11893
11895 }
11896
11898 {
11899 float quantity_max = 0;
11900
11902 {
11903 if (attSlotID != -1)
11904 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11905
11906 if (quantity_max <= 0)
11908 }
11909
11910 if (quantity_max <= 0)
11912
11913 return quantity_max;
11914 }
11915
11917 {
11919 }
11920
11922 {
11924 }
11925
11926
11928 {
11930 }
11931
11933 {
11935 }
11936
11938 {
11940 }
11941
11942
11944 {
11945
11946 float weightEx = GetWeightEx();
11947 float special = GetInventoryAndCargoWeight();
11948 return weightEx - special;
11949 }
11950
11951
11953 {
11955 }
11956
11958 {
11960 {
11961 #ifdef DEVELOPER
11962 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11963 {
11964 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11966 }
11967 #endif
11968
11969 return GetQuantity() * GetConfigWeightModified();
11970 }
11971 else if (HasEnergyManager())
11972 {
11973 #ifdef DEVELOPER
11974 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11975 {
11976 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11977 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11978 }
11979 #endif
11980 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11981 }
11982 else
11983 {
11984 #ifdef DEVELOPER
11985 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11986 {
11987 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11988 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11989 }
11990 #endif
11991 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11992 }
11993 }
11994
11997 {
11998 int item_count = 0;
12000
12001 if (GetInventory().GetCargo() != NULL)
12002 {
12003 item_count = GetInventory().GetCargo().GetItemCount();
12004 }
12005
12006 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12007 {
12008 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12009 if (item)
12010 item_count += item.GetNumberOfItems();
12011 }
12012 return item_count;
12013 }
12014
12017 {
12018 float weight = 0;
12019 float wetness = 1;
12020 if (include_wetness)
12023 {
12024 weight = wetness * m_ConfigWeight;
12025 }
12027 {
12028 weight = 1;
12029 }
12030 return weight;
12031 }
12032
12033
12034
12036 {
12037 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12038 {
12039 GameInventory inv = GetInventory();
12040 array<EntityAI> items = new array<EntityAI>;
12042 for (int i = 0; i < items.Count(); i++)
12043 {
12045 if (item)
12046 {
12048 }
12049 }
12050 }
12051 }
12052
12053
12054
12055
12057 {
12058 float energy = 0;
12059 if (HasEnergyManager())
12060 {
12061 energy = GetCompEM().GetEnergy();
12062 }
12063 return energy;
12064 }
12065
12066
12068 {
12069 super.OnEnergyConsumed();
12070
12072 }
12073
12075 {
12076 super.OnEnergyAdded();
12077
12079 }
12080
12081
12083 {
12084 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12085 {
12087 {
12088 float energy_0to1 = GetCompEM().GetEnergy0To1();
12090 }
12091 }
12092 }
12093
12094
12096 {
12097 return ConfigGetFloat("heatIsolation");
12098 }
12099
12101 {
12103 }
12104
12106 {
12107 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12108 if (
GetGame().ConfigIsExisting(paramPath))
12110
12111 return 0.0;
12112 }
12113
12115 {
12116 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12117 if (
GetGame().ConfigIsExisting(paramPath))
12119
12120 return 0.0;
12121 }
12122
12123 override void SetWet(
float value,
bool allow_client =
false)
12124 {
12125 if (!IsServerCheck(allow_client))
12126 return;
12127
12130
12132
12133 m_VarWet = Math.Clamp(value, min, max);
12134
12136 {
12139 }
12140 }
12141
12142 override void AddWet(
float value)
12143 {
12145 }
12146
12148 {
12150 }
12151
12153 {
12155 }
12156
12158 {
12160 }
12161
12163 {
12165 }
12166
12168 {
12170 }
12171
12172 override void OnWetChanged(
float newVal,
float oldVal)
12173 {
12176 if (newLevel != oldLevel)
12177 {
12179 }
12180 }
12181
12183 {
12184 SetWeightDirty();
12185 }
12186
12188 {
12189 return GetWetLevelInternal(
m_VarWet);
12190 }
12191
12192
12193
12195 {
12197 }
12198
12200 {
12202 }
12203
12205 {
12207 }
12208
12210 {
12212 }
12213
12214
12215
12217 {
12218 if (ConfigIsExisting("itemModelLength"))
12219 {
12220 return ConfigGetFloat("itemModelLength");
12221 }
12222 return 0;
12223 }
12224
12226 {
12227 if (ConfigIsExisting("itemAttachOffset"))
12228 {
12229 return ConfigGetFloat("itemAttachOffset");
12230 }
12231 return 0;
12232 }
12233
12234 override void SetCleanness(
int value,
bool allow_client =
false)
12235 {
12236 if (!IsServerCheck(allow_client))
12237 return;
12238
12240
12242
12245 }
12246
12248 {
12250 }
12251
12253 {
12254 return true;
12255 }
12256
12257
12258
12259
12261 {
12263 }
12264
12266 {
12268 }
12269
12270
12271
12272
12273 override void SetColor(
int r,
int g,
int b,
int a)
12274 {
12280 }
12282 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12283 {
12288 }
12289
12291 {
12293 }
12294
12297 {
12298 int r,g,b,a;
12300 r = r/255;
12301 g = g/255;
12302 b = b/255;
12303 a = a/255;
12304 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12305 }
12306
12307
12308
12309 override void SetLiquidType(
int value,
bool allow_client =
false)
12310 {
12311 if (!IsServerCheck(allow_client))
12312 return;
12313
12318 }
12319
12321 {
12322 return ConfigGetInt("varLiquidTypeInit");
12323 }
12324
12326 {
12328 }
12329
12331 {
12333 SetFrozen(false);
12334 }
12335
12338 {
12339 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12340 }
12341
12342
12345 {
12346 PlayerBase nplayer;
12347 if (PlayerBase.CastTo(nplayer, player))
12348 {
12350
12351 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12352 }
12353 }
12354
12355
12358 {
12359 PlayerBase nplayer;
12360 if (PlayerBase.CastTo(nplayer,player))
12361 {
12362
12363 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12364
12365 }
12366
12367
12368 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12369
12370
12371 if (HasEnergyManager())
12372 {
12373 GetCompEM().UpdatePlugState();
12374 }
12375 }
12376
12377
12379 {
12380 super.OnPlacementStarted(player);
12381
12383 }
12384
12385 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12386 {
12388 {
12389 m_AdminLog.OnPlacementComplete(player,
this);
12390 }
12391
12392 super.OnPlacementComplete(player, position, orientation);
12393 }
12394
12395
12396
12397
12398
12400 {
12402 {
12403 return true;
12404 }
12405 else
12406 {
12407 return false;
12408 }
12409 }
12410
12411
12413 {
12415 {
12417 }
12418 }
12419
12420
12422 {
12424 }
12425
12427 {
12429 }
12430
12431 override void InsertAgent(
int agent,
float count = 1)
12432 {
12433 if (count < 1)
12434 return;
12435
12437 }
12438
12441 {
12443 }
12444
12445
12447 {
12449 }
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12493 {
12495 return false;
12496 return true;
12497 }
12498
12500 {
12501
12503 }
12504
12505
12508 {
12509 super.CheckForRoofLimited(timeTresholdMS);
12510
12512 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12513 {
12514 m_PreviousRoofTestTime = time;
12515 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12516 }
12517 }
12518
12519
12521 {
12523 {
12524 return 0;
12525 }
12526
12527 if (GetInventory().GetAttachmentSlotsCount() != 0)
12528 {
12529 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12530 if (filter)
12531 return filter.GetProtectionLevel(type, false, system);
12532 else
12533 return 0;
12534 }
12535
12536 string subclassPath, entryName;
12537
12538 switch (type)
12539 {
12541 entryName = "biological";
12542 break;
12544 entryName = "chemical";
12545 break;
12546 default:
12547 entryName = "biological";
12548 break;
12549 }
12550
12551 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12552
12554 }
12555
12556
12557
12560 {
12561 if (!IsMagazine())
12563
12565 }
12566
12567
12568
12569
12570
12575 {
12576 return true;
12577 }
12578
12580 {
12582 }
12583
12584
12585
12586
12587
12589 {
12590 if (parent)
12591 {
12592 if (parent.IsInherited(DayZInfected))
12593 return true;
12594
12595 if (!parent.IsRuined())
12596 return true;
12597 }
12598
12599 return true;
12600 }
12601
12603 {
12604 if (!super.CanPutAsAttachment(parent))
12605 {
12606 return false;
12607 }
12608
12609 if (!IsRuined() && !parent.IsRuined())
12610 {
12611 return true;
12612 }
12613
12614 return false;
12615 }
12616
12618 {
12619
12620
12621
12622
12623 return super.CanReceiveItemIntoCargo(item);
12624 }
12625
12627 {
12628
12629
12630
12631
12632 GameInventory attachmentInv = attachment.GetInventory();
12634 {
12635 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12636 return false;
12637 }
12638
12639 InventoryLocation loc = new InventoryLocation();
12640 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12641 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12642 return false;
12643
12644 return super.CanReceiveAttachment(attachment, slotId);
12645 }
12646
12648 {
12649 if (!super.CanReleaseAttachment(attachment))
12650 return false;
12651
12652 return GetInventory().AreChildrenAccessible();
12653 }
12654
12655
12656
12657
12658
12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12676 {
12677 int id = muzzle_owner.GetMuzzleID();
12678 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12679
12680 if (WPOF_array)
12681 {
12682 for (int i = 0; i < WPOF_array.Count(); i++)
12683 {
12684 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12685
12686 if (WPOF)
12687 {
12688 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12689 }
12690 }
12691 }
12692 }
12693
12694
12696 {
12697 int id = muzzle_owner.GetMuzzleID();
12699
12700 if (WPOBE_array)
12701 {
12702 for (int i = 0; i < WPOBE_array.Count(); i++)
12703 {
12704 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12705
12706 if (WPOBE)
12707 {
12708 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12709 }
12710 }
12711 }
12712 }
12713
12714
12716 {
12717 int id = muzzle_owner.GetMuzzleID();
12718 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12719
12720 if (WPOOH_array)
12721 {
12722 for (int i = 0; i < WPOOH_array.Count(); i++)
12723 {
12724 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12725
12726 if (WPOOH)
12727 {
12728 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12729 }
12730 }
12731 }
12732 }
12733
12734
12736 {
12737 int id = muzzle_owner.GetMuzzleID();
12738 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12739
12740 if (WPOOH_array)
12741 {
12742 for (int i = 0; i < WPOOH_array.Count(); i++)
12743 {
12744 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12745
12746 if (WPOOH)
12747 {
12748 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12749 }
12750 }
12751 }
12752 }
12753
12754
12756 {
12757 int id = muzzle_owner.GetMuzzleID();
12758 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12759
12760 if (WPOOH_array)
12761 {
12762 for (int i = 0; i < WPOOH_array.Count(); i++)
12763 {
12764 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12765
12766 if (WPOOH)
12767 {
12768 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12769 }
12770 }
12771 }
12772 }
12773
12774
12775
12777 {
12779 {
12780 return true;
12781 }
12782
12783 return false;
12784 }
12785
12787 {
12789 {
12790 return true;
12791 }
12792
12793 return false;
12794 }
12795
12797 {
12799 {
12800 return true;
12801 }
12802
12803 return false;
12804 }
12805
12807 {
12808 return false;
12809 }
12810
12813 {
12814 return UATimeSpent.DEFAULT_DEPLOY;
12815 }
12816
12817
12818
12819
12821 {
12823 SetSynchDirty();
12824 }
12825
12827 {
12829 }
12830
12831
12833 {
12834 return false;
12835 }
12836
12839 {
12840 string att_type = "None";
12841
12842 if (ConfigIsExisting("soundAttType"))
12843 {
12844 att_type = ConfigGetString("soundAttType");
12845 }
12846
12848 }
12849
12851 {
12853 }
12854
12855
12856
12857
12858
12862
12864 {
12867
12869 }
12870
12871
12873 {
12875 return;
12876
12878
12881
12884
12885 SoundParameters params = new SoundParameters();
12889 }
12890
12891
12893 {
12895 return;
12896
12898 SetSynchDirty();
12899
12902 }
12903
12904
12906 {
12908 return;
12909
12911 SetSynchDirty();
12912
12915 }
12916
12918 {
12920 }
12921
12923 {
12925 }
12926
12929 {
12930 if (!
GetGame().IsDedicatedServer())
12931 {
12932 if (ConfigIsExisting("attachSoundSet"))
12933 {
12934 string cfg_path = "";
12935 string soundset = "";
12936 string type_name =
GetType();
12937
12940 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12941 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12942
12943 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12944 {
12945 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12946 {
12947 if (cfg_slot_array[i] == slot_type)
12948 {
12949 soundset = cfg_soundset_array[i];
12950 break;
12951 }
12952 }
12953 }
12954
12955 if (soundset != "")
12956 {
12957 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12959 }
12960 }
12961 }
12962 }
12963
12965 {
12966
12967 }
12968
12969 void OnApply(PlayerBase player);
12970
12972 {
12973 return 1.0;
12974 };
12975
12977 {
12979 }
12980
12982 {
12984 }
12985
12987
12989 {
12990 SetDynamicPhysicsLifeTime(0.01);
12992 }
12993
12995 {
12996 array<string> zone_names = new array<string>;
12997 GetDamageZones(zone_names);
12998 for (int i = 0; i < zone_names.Count(); i++)
12999 {
13000 SetHealthMax(zone_names.Get(i),"Health");
13001 }
13002 SetHealthMax("","Health");
13003 }
13004
13007 {
13008 float global_health = GetHealth01("","Health");
13009 array<string> zones = new array<string>;
13010 GetDamageZones(zones);
13011
13012 for (int i = 0; i < zones.Count(); i++)
13013 {
13014 SetHealth01(zones.Get(i),"Health",global_health);
13015 }
13016 }
13017
13020 {
13021 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13022 }
13023
13025 {
13026 if (!hasRootAsPlayer)
13027 {
13028 if (refParentIB)
13029 {
13030
13031 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13032 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13033
13034 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13035 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13036
13039 }
13040 else
13041 {
13042
13045 }
13046 }
13047 }
13048
13050 {
13052 {
13053 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13054 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13055 {
13056 float heatPermCoef = 1.0;
13058 while (ent)
13059 {
13060 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13061 ent = ent.GetHierarchyParent();
13062 }
13063
13064 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13065 }
13066 }
13067 }
13068
13070 {
13071
13072 EntityAI parent = GetHierarchyParent();
13073 if (!parent)
13074 {
13075 hasParent = false;
13076 hasRootAsPlayer = false;
13077 }
13078 else
13079 {
13080 hasParent = true;
13081 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13082 refParentIB =
ItemBase.Cast(parent);
13083 }
13084 }
13085
13086 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13087 {
13088
13089 }
13090
13092 {
13093
13094 return false;
13095 }
13096
13098 {
13099
13100
13101 return false;
13102 }
13103
13105 {
13106
13107 return false;
13108 }
13109
13112 {
13113 return !GetIsFrozen() &&
IsOpen();
13114 }
13115
13117 {
13118 bool hasParent = false, hasRootAsPlayer = false;
13120
13121 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13122 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13123
13124 if (wwtu || foodDecay)
13125 {
13129
13130 if (processWetness || processTemperature || processDecay)
13131 {
13133
13134 if (processWetness)
13135 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13136
13137 if (processTemperature)
13139
13140 if (processDecay)
13141 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13142 }
13143 }
13144 }
13145
13148 {
13150 }
13151
13153 {
13156
13157 return super.GetTemperatureFreezeThreshold();
13158 }
13159
13161 {
13164
13165 return super.GetTemperatureThawThreshold();
13166 }
13167
13169 {
13172
13173 return super.GetItemOverheatThreshold();
13174 }
13175
13177 {
13179 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13180
13181 return super.GetTemperatureFreezeTime();
13182 }
13183
13185 {
13187 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13188
13189 return super.GetTemperatureThawTime();
13190 }
13191
13196
13198 {
13199 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13200 }
13201
13203 {
13204 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13205 }
13206
13209 {
13211 }
13212
13214 {
13216 }
13217
13219 {
13221 }
13222
13225 {
13226 return null;
13227 }
13228
13231 {
13232 return false;
13233 }
13234
13236 {
13238 {
13241 if (!trg)
13242 {
13244 explosive = this;
13245 }
13246
13247 explosive.PairRemote(trg);
13249
13250 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13251 trg.SetPersistentPairID(persistentID);
13252 explosive.SetPersistentPairID(persistentID);
13253
13254 return true;
13255 }
13256 return false;
13257 }
13258
13261 {
13262 float ret = 1.0;
13265 ret *= GetHealth01();
13266
13267 return ret;
13268 }
13269
13270 #ifdef DEVELOPER
13271 override void SetDebugItem()
13272 {
13273 super.SetDebugItem();
13274 _itemBase = this;
13275 }
13276
13278 {
13279 string text = super.GetDebugText();
13280
13282 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13283
13284 return text;
13285 }
13286 #endif
13287
13289 {
13290 return true;
13291 }
13292
13294
13296
13298 {
13301 }
13302
13303
13311
13327}
13328
13330{
13332 if (entity)
13333 {
13334 bool is_item = entity.IsInherited(
ItemBase);
13335 if (is_item && full_quantity)
13336 {
13339 }
13340 }
13341 else
13342 {
13344 return NULL;
13345 }
13346 return entity;
13347}
13348
13350{
13351 if (item)
13352 {
13353 if (health > 0)
13354 item.SetHealth("", "", health);
13355
13356 if (item.CanHaveTemperature())
13357 {
13359 if (item.CanFreeze())
13360 item.SetFrozen(false);
13361 }
13362
13363 if (item.HasEnergyManager())
13364 {
13365 if (quantity >= 0)
13366 {
13367 item.GetCompEM().SetEnergy0To1(quantity);
13368 }
13369 else
13370 {
13372 }
13373 }
13374 else if (item.IsMagazine())
13375 {
13376 Magazine mag = Magazine.Cast(item);
13377 if (quantity >= 0)
13378 {
13379 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13380 }
13381 else
13382 {
13384 }
13385
13386 }
13387 else
13388 {
13389 if (quantity >= 0)
13390 {
13391 item.SetQuantityNormalized(quantity, false);
13392 }
13393 else
13394 {
13396 }
13397
13398 }
13399 }
13400}
13401
13402#ifdef DEVELOPER
13404#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
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 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...
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)
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)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
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()
override int GetLiquidType()
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)
void Open()
Implementations only.
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 EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
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 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 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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
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 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 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.