8657{
8659 {
8660 return true;
8661 }
8662};
8663
8664
8665
8667{
8671
8673
8676
8677
8678
8679
8680
8689
8695
8700
8705
8726 protected bool m_IsResultOfSplit
8727
8729
8734
8735
8736
8738
8742
8743
8744
8746
8749
8750
8751
8757
8758
8766
8769
8770
8772
8773
8775
8776
8781
8782
8787
8788
8790
8791
8793 {
8798
8799 if (!
GetGame().IsDedicatedServer())
8800 {
8802 {
8804
8806 {
8808 }
8809 }
8810
8813 }
8814
8815 m_OldLocation = null;
8816
8818 {
8820 }
8821
8822 if (ConfigIsExisting("headSelectionsToHide"))
8823 {
8826 }
8827
8829 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8830 {
8832 }
8833
8835
8836 m_IsResultOfSplit = false;
8837
8839 }
8840
8842 {
8843 super.InitItemVariables();
8844
8850 m_Count = ConfigGetInt(
"count");
8851
8854
8859
8862
8867
8879
8883
8884
8887 if (ConfigIsExisting("canBeSplit"))
8888 {
8891 }
8892
8894 if (ConfigIsExisting("itemBehaviour"))
8896
8897
8900 RegisterNetSyncVariableInt("m_VarLiquidType");
8901 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8902
8903 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8904 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8905 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8906
8907 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8908 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8909 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8910 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8911
8912 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8913 RegisterNetSyncVariableBool("m_IsTakeable");
8914 RegisterNetSyncVariableBool("m_IsHologram");
8915
8918 {
8921 }
8922
8924
8926 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8928
8929 }
8930
8932 {
8934 }
8935
8937 {
8940 {
8945 }
8946 }
8947
8948 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8949 {
8951 {
8954 }
8955
8957 }
8958
8960 {
8966 }
8967
8969
8971 {
8973
8974 if (!action)
8975 {
8976 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8977 return;
8978 }
8979
8981 if (!ai)
8982 {
8984 return;
8985 }
8986
8988 if (!action_array)
8989 {
8990 action_array = new array<ActionBase_Basic>;
8992 }
8993 if (LogManager.IsActionLogEnable())
8994 {
8995 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8996 }
8997
8998 if (action_array.Find(action) != -1)
8999 {
9000 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9001 }
9002 else
9003 {
9004 action_array.Insert(action);
9005 }
9006 }
9007
9009 {
9011 ActionBase action = player.GetActionManager().GetAction(actionName);
9014
9015 if (action_array)
9016 {
9017 action_array.RemoveItem(action);
9018 }
9019 }
9020
9021
9022
9024 {
9025 ActionOverrideData overrideData = new ActionOverrideData();
9029
9031 if (!actionMap)
9032 {
9035 }
9036
9037 actionMap.Insert(this.
Type(), overrideData);
9038
9039 }
9040
9042
9044
9045
9047 {
9050
9053
9054 string config_to_search = "CfgVehicles";
9055 string muzzle_owner_config;
9056
9058 {
9059 if (IsInherited(Weapon))
9060 config_to_search = "CfgWeapons";
9061
9062 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9063
9064 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9065
9067
9068 if (config_OnFire_subclass_count > 0)
9069 {
9070 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9071
9072 for (int i = 0; i < config_OnFire_subclass_count; i++)
9073 {
9074 string particle_class = "";
9076 string config_OnFire_entry = config_OnFire_class + particle_class;
9077 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9078 WPOF_array.Insert(WPOF);
9079 }
9080
9081
9083 }
9084 }
9085
9087 {
9088 config_to_search = "CfgWeapons";
9089 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9090
9091 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9092
9094
9095 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9096 {
9097 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9098
9099 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9100 {
9101 string particle_class2 = "";
9103 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9104 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9105 WPOBE_array.Insert(WPOBE);
9106 }
9107
9108
9110 }
9111 }
9112 }
9113
9114
9116 {
9119
9121 {
9122 string config_to_search = "CfgVehicles";
9123
9124 if (IsInherited(Weapon))
9125 config_to_search = "CfgWeapons";
9126
9127 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9128 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9129
9130 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9131 {
9132
9134
9136 {
9138 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9140 return;
9141 }
9142
9145
9146
9147
9149 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9150
9151 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9152 {
9153 string particle_class = "";
9155 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9157
9158 if (entry_type == CT_CLASS)
9159 {
9160 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9161 WPOOH_array.Insert(WPOF);
9162 }
9163 }
9164
9165
9167 }
9168 }
9169 }
9170
9172 {
9174 }
9175
9177 {
9179 {
9181
9184
9187
9188 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9189 }
9190 }
9191
9193 {
9195 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9196
9198 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9199
9201 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9202
9204 {
9206 }
9207 }
9208
9210 {
9212 }
9213
9215 {
9218 else
9220
9222 {
9225 }
9226 else
9227 {
9230
9233 }
9234
9236 }
9237
9239 {
9241 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9242 }
9243
9245 {
9247 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9249 }
9250
9252 {
9254 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9255 }
9256
9258 {
9261
9262 OverheatingParticle OP = new OverheatingParticle();
9267
9269 }
9270
9272 {
9275
9276 return -1;
9277 }
9278
9280 {
9282 {
9285
9286 for (int i = count; i > 0; --i)
9287 {
9288 int id = i - 1;
9291
9294
9295 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9296 {
9297 if (p)
9298 {
9301 }
9302 }
9303 }
9304 }
9305 }
9306
9308 {
9310 {
9312 {
9313 int id = i - 1;
9315
9316 if (OP)
9317 {
9319
9320 if (p)
9321 {
9323 }
9324
9325 delete OP;
9326 }
9327 }
9328
9331 }
9332 }
9333
9336 {
9337 return 0.0;
9338 }
9339
9340
9342 {
9343 return 250;
9344 }
9345
9347 {
9348 return 0;
9349 }
9350
9353 {
9355 return true;
9356
9357 return false;
9358 }
9359
9362 {
9365
9367 {
9369 }
9370 else
9371 {
9372
9374 }
9375
9377 }
9378
9385 {
9386 return -1;
9387 }
9388
9389
9390
9391
9393 {
9395 {
9397 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9398
9399 if (r_index >= 0)
9400 {
9401 InventoryLocation r_il = new InventoryLocation;
9402 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9403
9404 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9407 {
9408 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9409 }
9411 {
9412 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9413 }
9414
9415 }
9416
9417 player.GetHumanInventory().ClearUserReservedLocation(this);
9418 }
9419
9422 }
9423
9424
9425
9426
9428 {
9429 return ItemBase.m_DebugActionsMask;
9430 }
9431
9433 {
9434 return ItemBase.m_DebugActionsMask & mask;
9435 }
9436
9438 {
9439 ItemBase.m_DebugActionsMask = mask;
9440 }
9441
9443 {
9444 ItemBase.m_DebugActionsMask |= mask;
9445 }
9446
9448 {
9449 ItemBase.m_DebugActionsMask &= ~mask;
9450 }
9451
9453 {
9455 {
9457 }
9458 else
9459 {
9461 }
9462 }
9463
9464
9466 {
9467 if (GetEconomyProfile())
9468 {
9469 float q_max = GetEconomyProfile().GetQuantityMax();
9470 if (q_max > 0)
9471 {
9472 float q_min = GetEconomyProfile().GetQuantityMin();
9473 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9474
9476 {
9477 ComponentEnergyManager comp = GetCompEM();
9479 {
9481 }
9482 }
9484 {
9486
9487 }
9488
9489 }
9490 }
9491 }
9492
9495 {
9496 EntityAI parent = GetHierarchyParent();
9497
9498 if (parent)
9499 {
9500 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9501 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9502 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9503 }
9504 }
9505
9508 {
9509 EntityAI parent = GetHierarchyParent();
9510
9511 if (parent)
9512 {
9513 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9514 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9515 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9516 }
9517 }
9518
9520 {
9521
9522
9523
9524
9526
9528 {
9529 if (ScriptInputUserData.CanStoreInputUserData())
9530 {
9531 ScriptInputUserData ctx = new ScriptInputUserData;
9537 ctx.
Write(use_stack_max);
9540
9542 {
9543 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9544 }
9545 }
9546 }
9547 else if (!
GetGame().IsMultiplayer())
9548 {
9550 }
9551 }
9552
9554 {
9556 }
9557
9559 {
9561 }
9562
9564 {
9566 }
9567
9569 {
9570
9571 return false;
9572 }
9573
9575 {
9576 return false;
9577 }
9578
9582 {
9583 return false;
9584 }
9585
9587 {
9588 return "";
9589 }
9590
9592
9594 {
9595 return false;
9596 }
9597
9599 {
9600 return true;
9601 }
9602
9603
9604
9606 {
9607 return true;
9608 }
9609
9611 {
9612 return true;
9613 }
9614
9616 {
9617 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9619 }
9620
9622 {
9624 }
9625
9627 {
9629 if (!is_being_placed)
9631 SetSynchDirty();
9632 }
9633
9634
9636
9638 {
9640 }
9641
9643 {
9645 }
9646
9648 {
9649 return 1;
9650 }
9651
9653 {
9654 return false;
9655 }
9656
9658 {
9660 SetSynchDirty();
9661 }
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9698 {
9699 super.OnMovedInsideCargo(container);
9700
9701 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9702 }
9703
9704 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9705 {
9706 super.EEItemLocationChanged(oldLoc,newLoc);
9707
9708 PlayerBase new_player = null;
9709 PlayerBase old_player = null;
9710
9711 if (newLoc.GetParent())
9712 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9713
9714 if (oldLoc.GetParent())
9715 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9716
9718 {
9719 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9720
9721 if (r_index >= 0)
9722 {
9723 InventoryLocation r_il = new InventoryLocation;
9724 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9725
9726 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9729 {
9730 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9731 }
9733 {
9734 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9735 }
9736
9737 }
9738 }
9739
9741 {
9742 if (new_player)
9743 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9744
9745 if (new_player == old_player)
9746 {
9747
9748 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9749 {
9751 {
9752 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9753 {
9754 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9755 }
9756 }
9757 else
9758 {
9759 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9760 }
9761 }
9762
9763 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9764 {
9765 int type = oldLoc.GetType();
9767 {
9768 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9769 }
9771 {
9772 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9773 }
9774 }
9775 if (!m_OldLocation)
9776 {
9777 m_OldLocation = new InventoryLocation;
9778 }
9779 m_OldLocation.Copy(oldLoc);
9780 }
9781 else
9782 {
9783 if (m_OldLocation)
9784 {
9785 m_OldLocation.Reset();
9786 }
9787 }
9788
9790 }
9791 else
9792 {
9793 if (new_player)
9794 {
9795 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9796 if (res_index >= 0)
9797 {
9798 InventoryLocation il = new InventoryLocation;
9799 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9801 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9804 {
9805 il.
GetParent().GetOnReleaseLock().Invoke(it);
9806 }
9808 {
9810 }
9811
9812 }
9813 }
9815 {
9816
9818 }
9819
9820 if (m_OldLocation)
9821 {
9822 m_OldLocation.Reset();
9823 }
9824 }
9825 }
9826
9827 override void EOnContact(IEntity other, Contact extra)
9828 {
9830 {
9831 int liquidType = -1;
9833 if (impactSpeed > 0.0)
9834 {
9836 #ifndef SERVER
9838 #else
9840 SetSynchDirty();
9841 #endif
9843 }
9844 }
9845
9846 #ifdef SERVER
9847 if (GetCompEM() && GetCompEM().IsPlugged())
9848 {
9849 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9850 GetCompEM().UnplugThis();
9851 }
9852 #endif
9853 }
9854
9856
9858 {
9860 }
9861
9863 {
9864
9865 }
9866
9868 {
9869 super.OnItemLocationChanged(old_owner, new_owner);
9870
9871 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9872 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9873
9874 if (!relatedPlayer && playerNew)
9875 relatedPlayer = playerNew;
9876
9877 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9878 {
9880 if (actionMgr)
9881 {
9882 ActionBase currentAction = actionMgr.GetRunningAction();
9883 if (currentAction)
9885 }
9886 }
9887
9888 Man ownerPlayerOld = null;
9889 Man ownerPlayerNew = null;
9890
9891 if (old_owner)
9892 {
9893 if (old_owner.
IsMan())
9894 {
9895 ownerPlayerOld = Man.Cast(old_owner);
9896 }
9897 else
9898 {
9899 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9900 }
9901 }
9902 else
9903 {
9905 {
9907
9908 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9909 {
9910 GetCompEM().UnplugThis();
9911 }
9912 }
9913 }
9914
9915 if (new_owner)
9916 {
9917 if (new_owner.
IsMan())
9918 {
9919 ownerPlayerNew = Man.Cast(new_owner);
9920 }
9921 else
9922 {
9923 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9924 }
9925 }
9926
9927 if (ownerPlayerOld != ownerPlayerNew)
9928 {
9929 if (ownerPlayerOld)
9930 {
9931 array<EntityAI> subItemsExit = new array<EntityAI>;
9933 for (int i = 0; i < subItemsExit.Count(); i++)
9934 {
9937 }
9938 }
9939
9940 if (ownerPlayerNew)
9941 {
9942 array<EntityAI> subItemsEnter = new array<EntityAI>;
9944 for (int j = 0; j < subItemsEnter.Count(); j++)
9945 {
9948 }
9949 }
9950 }
9951 else if (ownerPlayerNew != null)
9952 {
9953 PlayerBase nplayer;
9954 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9955 {
9956 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9958 for (int k = 0; k < subItemsUpdate.Count(); k++)
9959 {
9961 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9962 }
9963 }
9964 }
9965
9966 if (old_owner)
9967 old_owner.OnChildItemRemoved(this);
9968 if (new_owner)
9969 new_owner.OnChildItemReceived(this);
9970 }
9971
9972
9974 {
9975 super.EEDelete(parent);
9976 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9977 if (player)
9978 {
9980
9981 if (player.IsAlive())
9982 {
9983 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9984 if (r_index >= 0)
9985 {
9986 InventoryLocation r_il = new InventoryLocation;
9987 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9988
9989 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9992 {
9993 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9994 }
9996 {
9997 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9998 }
9999
10000 }
10001
10002 player.RemoveQuickBarEntityShortcut(this);
10003 }
10004 }
10005 }
10006
10008 {
10009 super.EEKilled(killer);
10010
10013 {
10014 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10015 {
10016 if (IsMagazine())
10017 {
10018 if (Magazine.Cast(this).GetAmmoCount() > 0)
10019 {
10021 }
10022 }
10023 else
10024 {
10026 }
10027 }
10028 }
10029 }
10030
10032 {
10033 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10034
10035 super.OnWasAttached(parent, slot_id);
10036
10039
10041 }
10042
10044 {
10045 super.OnWasDetached(parent, slot_id);
10046
10049 }
10050
10052 {
10053 int idx;
10056
10057 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10058 if (inventory_slots.Count() < 1)
10059 {
10060 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10061 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10062 }
10063 else
10064 {
10065 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10066 }
10067
10068 idx = inventory_slots.Find(slot);
10069 if (idx < 0)
10070 return "";
10071
10072 return attach_types.Get(idx);
10073 }
10074
10076 {
10077 int idx = -1;
10078 string slot;
10079
10082
10083 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10084 if (inventory_slots.Count() < 1)
10085 {
10086 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10087 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10088 }
10089 else
10090 {
10091 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10092 if (detach_types.Count() < 1)
10093 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10094 }
10095
10096 for (int i = 0; i < inventory_slots.Count(); i++)
10097 {
10098 slot = inventory_slots.Get(i);
10099 }
10100
10101 if (slot != "")
10102 {
10103 if (detach_types.Count() == 1)
10104 idx = 0;
10105 else
10106 idx = inventory_slots.Find(slot);
10107 }
10108 if (idx < 0)
10109 return "";
10110
10111 return detach_types.Get(idx);
10112 }
10113
10115 {
10116
10118
10119
10120 float min_time = 1;
10121 float max_time = 3;
10122 float delay = Math.RandomFloat(min_time, max_time);
10123
10124 explode_timer.Run(delay, this, "DoAmmoExplosion");
10125 }
10126
10128 {
10129 Magazine magazine = Magazine.Cast(this);
10130 int pop_sounds_count = 6;
10131 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10132
10133
10134 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10135 string sound_name = pop_sounds[ sound_idx ];
10137
10138
10139 magazine.ServerAddAmmoCount(-1);
10140
10141
10142 float min_temp_to_explode = 100;
10143
10144 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10145 {
10147 }
10148 }
10149
10150
10151 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10152 {
10153 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10154
10155 const int CHANCE_DAMAGE_CARGO = 4;
10156 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10157 const int CHANCE_DAMAGE_NOTHING = 2;
10158
10160 {
10161 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10162 int chances;
10163 int rnd;
10164
10165 if (GetInventory().GetCargo())
10166 {
10167 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10168 rnd = Math.RandomInt(0,chances);
10169
10170 if (rnd < CHANCE_DAMAGE_CARGO)
10171 {
10173 }
10174 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10175 {
10177 }
10178 }
10179 else
10180 {
10181 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10182 rnd = Math.RandomInt(0,chances);
10183
10184 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10185 {
10187 }
10188 }
10189 }
10190 }
10191
10193 {
10194 if (GetInventory().GetCargo())
10195 {
10196 int item_count = GetInventory().GetCargo().GetItemCount();
10197 if (item_count > 0)
10198 {
10199 int random_pick = Math.RandomInt(0, item_count);
10201 if (!item.IsExplosive())
10202 {
10203 item.AddHealth("","",damage);
10204 return true;
10205 }
10206 }
10207 }
10208 return false;
10209 }
10210
10212 {
10213 int attachment_count = GetInventory().AttachmentCount();
10214 if (attachment_count > 0)
10215 {
10216 int random_pick = Math.RandomInt(0, attachment_count);
10217 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10218 if (!attachment.IsExplosive())
10219 {
10220 attachment.AddHealth("","",damage);
10221 return true;
10222 }
10223 }
10224 return false;
10225 }
10226
10228 {
10230 }
10231
10233 {
10235 return GetInventory().CanRemoveEntity();
10236
10237 return false;
10238 }
10239
10241 {
10243 return;
10244
10246 {
10247 if (ScriptInputUserData.CanStoreInputUserData())
10248 {
10249 ScriptInputUserData ctx = new ScriptInputUserData;
10254 ctx.
Write(destination_entity);
10256 ctx.
Write(slot_id);
10258 }
10259 }
10260 else if (!
GetGame().IsMultiplayer())
10261 {
10263 }
10264 }
10265
10267 {
10269 return;
10270
10271 float split_quantity_new;
10275 InventoryLocation loc = new InventoryLocation;
10276
10277 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10278 {
10280 split_quantity_new = stack_max;
10281 else
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);
10291 }
10292 }
10293 else if (destination_entity && slot_id == -1)
10294 {
10295 if (quantity > stack_max)
10296 split_quantity_new = stack_max;
10297 else
10298 split_quantity_new = quantity;
10299
10301 {
10304 }
10305
10306 if (new_item)
10307 {
10308 new_item.SetResultOfSplit(true);
10309 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10311 new_item.SetQuantity(split_quantity_new);
10312 }
10313 }
10314 else
10315 {
10316 if (stack_max != 0)
10317 {
10319 {
10321 }
10322
10323 if (split_quantity_new == 0)
10324 {
10325 if (!
GetGame().IsMultiplayer())
10326 player.PhysicalPredictiveDropItem(this);
10327 else
10328 player.ServerDropEntity(this);
10329 return;
10330 }
10331
10333
10334 if (new_item)
10335 {
10336 new_item.SetResultOfSplit(true);
10337 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10339 new_item.SetQuantity(stack_max);
10340 new_item.PlaceOnSurface();
10341 }
10342 }
10343 }
10344 }
10345
10347 {
10349 return;
10350
10351 float split_quantity_new;
10355 InventoryLocation loc = new InventoryLocation;
10356
10357 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10358 {
10360 split_quantity_new = stack_max;
10361 else
10363
10364 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10365 if (new_item)
10366 {
10367 new_item.SetResultOfSplit(true);
10368 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10370 new_item.SetQuantity(split_quantity_new);
10371 }
10372 }
10373 else if (destination_entity && slot_id == -1)
10374 {
10375 if (quantity > stack_max)
10376 split_quantity_new = stack_max;
10377 else
10378 split_quantity_new = quantity;
10379
10381 {
10384 }
10385
10386 if (new_item)
10387 {
10388 new_item.SetResultOfSplit(true);
10389 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10391 new_item.SetQuantity(split_quantity_new);
10392 }
10393 }
10394 else
10395 {
10396 if (stack_max != 0)
10397 {
10399 {
10401 }
10402
10404
10405 if (new_item)
10406 {
10407 new_item.SetResultOfSplit(true);
10408 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10410 new_item.SetQuantity(stack_max);
10411 new_item.PlaceOnSurface();
10412 }
10413 }
10414 }
10415 }
10416
10418 {
10420 return;
10421
10423 {
10424 if (ScriptInputUserData.CanStoreInputUserData())
10425 {
10426 ScriptInputUserData ctx = new ScriptInputUserData;
10431 dst.WriteToContext(ctx);
10433 }
10434 }
10435 else if (!
GetGame().IsMultiplayer())
10436 {
10438 }
10439 }
10440
10442 {
10444 return;
10445
10447 {
10448 if (ScriptInputUserData.CanStoreInputUserData())
10449 {
10450 ScriptInputUserData ctx = new ScriptInputUserData;
10455 ctx.
Write(destination_entity);
10461 }
10462 }
10463 else if (!
GetGame().IsMultiplayer())
10464 {
10466 }
10467 }
10468
10470 {
10472 }
10473
10475 {
10477 return this;
10478
10480 float split_quantity_new;
10482 if (dst.IsValid())
10483 {
10484 int slot_id = dst.GetSlot();
10486
10487 if (quantity > stack_max)
10488 split_quantity_new = stack_max;
10489 else
10490 split_quantity_new = quantity;
10491
10493
10494 if (new_item)
10495 {
10496 new_item.SetResultOfSplit(true);
10497 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10500 }
10501
10502 return new_item;
10503 }
10504
10505 return null;
10506 }
10507
10509 {
10511 return;
10512
10514 float split_quantity_new;
10516 if (destination_entity)
10517 {
10519 if (quantity > stackable)
10520 split_quantity_new = stackable;
10521 else
10522 split_quantity_new = quantity;
10523
10524 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10525 if (new_item)
10526 {
10527 new_item.SetResultOfSplit(true);
10528 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10530 new_item.SetQuantity(split_quantity_new);
10531 }
10532 }
10533 }
10534
10536 {
10538 return;
10539
10541 {
10542 if (ScriptInputUserData.CanStoreInputUserData())
10543 {
10544 ScriptInputUserData ctx = new ScriptInputUserData;
10549 ItemBase destination_entity =
this;
10550 ctx.
Write(destination_entity);
10554 }
10555 }
10556 else if (!
GetGame().IsMultiplayer())
10557 {
10559 }
10560 }
10561
10563 {
10565 return;
10566
10568 float split_quantity_new;
10570 if (player)
10571 {
10573 if (quantity > stackable)
10574 split_quantity_new = stackable;
10575 else
10576 split_quantity_new = quantity;
10577
10578 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10579 new_item =
ItemBase.Cast(in_hands);
10580 if (new_item)
10581 {
10582 new_item.SetResultOfSplit(true);
10583 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10585 new_item.SetQuantity(split_quantity_new);
10586 }
10587 }
10588 }
10589
10591 {
10593 return;
10594
10596 float split_quantity_new = Math.Floor(quantity * 0.5);
10597
10599
10600 if (new_item)
10601 {
10602 if (new_item.GetQuantityMax() < split_quantity_new)
10603 {
10604 split_quantity_new = new_item.GetQuantityMax();
10605 }
10606
10607 new_item.SetResultOfSplit(true);
10608 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10609
10611 {
10614 }
10615 else
10616 {
10619 }
10620 }
10621 }
10622
10624 {
10626 return;
10627
10629 float split_quantity_new = Math.Floor(quantity / 2);
10630
10631 InventoryLocation invloc = new InventoryLocation;
10633
10635 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10636
10637 if (new_item)
10638 {
10639 if (new_item.GetQuantityMax() < split_quantity_new)
10640 {
10641 split_quantity_new = new_item.GetQuantityMax();
10642 }
10644 {
10647 }
10648 else
10649 {
10652 }
10653 }
10654 }
10655
10658 {
10659 SetWeightDirty();
10661
10662 if (parent)
10663 parent.OnAttachmentQuantityChangedEx(this, delta);
10664
10666 {
10668 {
10670 }
10672 {
10673 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10675 }
10676 }
10677
10678 }
10679
10682 {
10683
10684 }
10685
10688 {
10690 }
10691
10693 {
10694 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10695
10697 {
10698 if (newLevel == GameConstants.STATE_RUINED)
10699 {
10701 EntityAI parent = GetHierarchyParent();
10702 if (parent && parent.IsFireplace())
10703 {
10704 CargoBase cargo = GetInventory().GetCargo();
10705 if (cargo)
10706 {
10708 {
10710 }
10711 }
10712 }
10713 }
10714
10716 {
10717
10719 return;
10720 }
10721
10722 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10723 {
10725 }
10726 }
10727 }
10728
10729
10731 {
10732 super.OnRightClick();
10733
10735 {
10737 {
10738 if (ScriptInputUserData.CanStoreInputUserData())
10739 {
10740 vector m4[4];
10742
10743 EntityAI root = GetHierarchyRoot();
10744
10745 InventoryLocation dst = new InventoryLocation;
10747 {
10748 if (root)
10749 {
10750 root.GetTransform(m4);
10752 }
10753 else
10754 GetInventory().GetCurrentInventoryLocation(dst);
10755 }
10756 else
10757 {
10759
10760
10761 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10762 {
10763 if (root)
10764 {
10765 root.GetTransform(m4);
10767 }
10768 else
10769 GetInventory().GetCurrentInventoryLocation(dst);
10770 }
10771 else
10772 {
10773 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10774 }
10775 }
10776
10777 ScriptInputUserData ctx = new ScriptInputUserData;
10785 }
10786 }
10787 else if (!
GetGame().IsMultiplayer())
10788 {
10790 }
10791 }
10792 }
10793
10794 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10795 {
10796
10797 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10798 return false;
10799
10800 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10801 return false;
10802
10803
10805 return false;
10806
10807
10808 Magazine mag = Magazine.Cast(this);
10809 if (mag)
10810 {
10811 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10812 return false;
10813
10814 if (stack_max_limit)
10815 {
10816 Magazine other_mag = Magazine.Cast(other_item);
10817 if (other_item)
10818 {
10819 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10820 return false;
10821 }
10822
10823 }
10824 }
10825 else
10826 {
10827
10829 return false;
10830
10832 return false;
10833 }
10834
10835 PlayerBase player = null;
10836 if (CastTo(player, GetHierarchyRootPlayer()))
10837 {
10838 if (player.GetInventory().HasAttachment(this))
10839 return false;
10840
10841 if (player.IsItemsToDelete())
10842 return false;
10843 }
10844
10845 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10846 return false;
10847
10848 int slotID;
10850 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10851 return false;
10852
10853 return true;
10854 }
10855
10857 {
10859 }
10860
10862 {
10863 return m_IsResultOfSplit;
10864 }
10865
10867 {
10868 m_IsResultOfSplit = value;
10869 }
10870
10872 {
10874 }
10875
10877 {
10878 float other_item_quantity = other_item.GetQuantity();
10879 float this_free_space;
10880
10882
10884
10885 if (other_item_quantity > this_free_space)
10886 {
10887 return this_free_space;
10888 }
10889 else
10890 {
10891 return other_item_quantity;
10892 }
10893 }
10894
10896 {
10898 }
10899
10901 {
10903 return;
10904
10905 if (!IsMagazine() && other_item)
10906 {
10908 if (quantity_used != 0)
10909 {
10910 float hp1 = GetHealth01("","");
10911 float hp2 = other_item.GetHealth01("","");
10912 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10913 hpResult = hpResult / (
GetQuantity() + quantity_used);
10914
10915 hpResult *= GetMaxHealth();
10916 Math.Round(hpResult);
10917 SetHealth("", "Health", hpResult);
10918
10920 other_item.AddQuantity(-quantity_used);
10921 }
10922 }
10924 }
10925
10927 {
10928 #ifdef SERVER
10929 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10930 GetHierarchyParent().IncreaseLifetimeUp();
10931 #endif
10932 };
10933
10935 {
10936 PlayerBase p = PlayerBase.Cast(player);
10937
10938 array<int> recipesIds = p.m_Recipes;
10939 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10940 if (moduleRecipesManager)
10941 {
10942 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10943 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10944 }
10945
10946 for (int i = 0;i < recipesIds.Count(); i++)
10947 {
10948 int key = recipesIds.Get(i);
10949 string recipeName = moduleRecipesManager.GetRecipeName(key);
10951 }
10952 }
10953
10954
10955 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10956 {
10957 super.GetDebugActions(outputList);
10958
10959
10964
10965
10969
10973
10974
10977
10978
10980 {
10983 }
10984
10986
10989
10993 }
10994
10995
10996
10997
10999 {
11000 super.OnAction(action_id, player, ctx);
11001 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11002 {
11003 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11004 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11005 PlayerBase p = PlayerBase.Cast(player);
11006 if (
EActions.RECIPES_RANGE_START < 1000)
11007 {
11008 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11009 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11010 }
11011 }
11012 #ifndef SERVER
11013 else if (action_id ==
EActions.WATCH_PLAYER)
11014 {
11015 PluginDeveloper.SetDeveloperItemClientEx(player);
11016 }
11017 #endif
11019 {
11020 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11021 {
11022 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11023 OnDebugButtonPressServer(id + 1);
11024 }
11025
11026 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11027 {
11028 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11030 }
11031
11032 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11033 {
11034 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11036 }
11037
11038 else if (action_id ==
EActions.ADD_QUANTITY)
11039 {
11040 if (IsMagazine())
11041 {
11042 Magazine mag = Magazine.Cast(this);
11043 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11044 }
11045 else
11046 {
11048 }
11049
11050 if (m_EM)
11051 {
11052 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11053 }
11054
11055 }
11056
11057 else if (action_id ==
EActions.REMOVE_QUANTITY)
11058 {
11059 if (IsMagazine())
11060 {
11061 Magazine mag2 = Magazine.Cast(this);
11062 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11063 }
11064 else
11065 {
11067 }
11068 if (m_EM)
11069 {
11070 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11071 }
11072
11073 }
11074
11075 else if (action_id ==
EActions.SET_QUANTITY_0)
11076 {
11078
11079 if (m_EM)
11080 {
11081 m_EM.SetEnergy(0);
11082 }
11083 }
11084
11085 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11086 {
11088
11089 if (m_EM)
11090 {
11091 m_EM.SetEnergy(m_EM.GetEnergyMax());
11092 }
11093 }
11094
11095 else if (action_id ==
EActions.ADD_HEALTH)
11096 {
11097 AddHealth("","",GetMaxHealth("","Health")/5);
11098 }
11099 else if (action_id ==
EActions.REMOVE_HEALTH)
11100 {
11101 AddHealth("","",-GetMaxHealth("","Health")/5);
11102 }
11103 else if (action_id ==
EActions.DESTROY_HEALTH)
11104 {
11105 SetHealth01("","",0);
11106 }
11107 else if (action_id ==
EActions.WATCH_ITEM)
11108 {
11110 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11111 #ifdef DEVELOPER
11112 SetDebugDeveloper_item(this);
11113 #endif
11114 }
11115
11116 else if (action_id ==
EActions.ADD_TEMPERATURE)
11117 {
11118 AddTemperature(20);
11119
11120 }
11121
11122 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11123 {
11124 AddTemperature(-20);
11125
11126 }
11127
11128 else if (action_id ==
EActions.FLIP_FROZEN)
11129 {
11130 SetFrozen(!GetIsFrozen());
11131
11132 }
11133
11134 else if (action_id ==
EActions.ADD_WETNESS)
11135 {
11137
11138 }
11139
11140 else if (action_id ==
EActions.REMOVE_WETNESS)
11141 {
11143
11144 }
11145
11146 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11147 {
11150
11151
11152 }
11153
11154 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11155 {
11158 }
11159
11160 else if (action_id ==
EActions.MAKE_SPECIAL)
11161 {
11162 auto debugParams = DebugSpawnParams.WithPlayer(player);
11163 OnDebugSpawnEx(debugParams);
11164 }
11165
11166 else if (action_id ==
EActions.DELETE)
11167 {
11168 Delete();
11169 }
11170
11171 }
11172
11173
11174 return false;
11175 }
11176
11177
11178
11179
11183
11186
11187
11188
11190 {
11191 return false;
11192 }
11193
11194
11196 {
11197 return true;
11198 }
11199
11200
11202 {
11203 return true;
11204 }
11205
11206
11207
11209 {
11210 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11212 }
11213
11216 {
11217 return null;
11218 }
11219
11221 {
11222 return false;
11223 }
11224
11226 {
11227 return false;
11228 }
11229
11233
11234
11236 {
11237 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11238 return module_repairing.CanRepair(this, item_repair_kit);
11239 }
11240
11241
11242 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11243 {
11244 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11245 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11246 }
11247
11248
11250 {
11251
11252
11253
11254
11255
11256
11257
11258
11259 return 1;
11260 }
11261
11262
11263
11265 {
11267 }
11268
11269
11270
11272 {
11274 }
11275
11276
11285 {
11286 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11287
11288 if (player)
11289 {
11290 player.MessageStatus(text);
11291 }
11292 }
11293
11294
11303 {
11304 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11305
11306 if (player)
11307 {
11308 player.MessageAction(text);
11309 }
11310 }
11311
11312
11321 {
11322 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11323
11324 if (player)
11325 {
11326 player.MessageFriendly(text);
11327 }
11328 }
11329
11330
11339 {
11340 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11341
11342 if (player)
11343 {
11344 player.MessageImportant(text);
11345 }
11346 }
11347
11349 {
11350 return true;
11351 }
11352
11353
11354 override bool KindOf(
string tag)
11355 {
11356 bool found = false;
11357 string item_name = this.
GetType();
11360
11361 int array_size = item_tag_array.Count();
11362 for (int i = 0; i < array_size; i++)
11363 {
11364 if (item_tag_array.Get(i) == tag)
11365 {
11366 found = true;
11367 break;
11368 }
11369 }
11370 return found;
11371 }
11372
11373
11375 {
11376
11377 super.OnRPC(sender, rpc_type,ctx);
11378
11379
11380 switch (rpc_type)
11381 {
11382 #ifndef SERVER
11383 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11384 Param2<bool, string> p = new Param2<bool, string>(false, "");
11385
11387 return;
11388
11389 bool play = p.param1;
11390 string soundSet = p.param2;
11391
11392 if (play)
11393 {
11395 {
11397 {
11399 }
11400 }
11401 else
11402 {
11404 }
11405 }
11406 else
11407 {
11409 }
11410
11411 break;
11412 #endif
11413
11414 }
11415
11417 {
11419 }
11420 }
11421
11422
11423
11424
11426 {
11427 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11428 return plugin.GetID(
name);
11429 }
11430
11432 {
11433 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11434 return plugin.GetName(id);
11435 }
11436
11439 {
11440
11441
11442 int varFlags;
11443 if (!ctx.
Read(varFlags))
11444 return;
11445
11446 if (varFlags & ItemVariableFlags.FLOAT)
11447 {
11449 }
11450 }
11451
11453 {
11454
11455 super.SerializeNumericalVars(floats_out);
11456
11457
11458
11460 {
11462 }
11463
11465 {
11467 }
11468
11470 {
11472 }
11473
11475 {
11480 }
11481
11483 {
11485 }
11486 }
11487
11489 {
11490
11491 super.DeSerializeNumericalVars(floats);
11492
11493
11494 int index = 0;
11495 int mask = Math.Round(floats.Get(index));
11496
11497 index++;
11498
11500 {
11502 {
11504 }
11505 else
11506 {
11507 float quantity = floats.Get(index);
11508 SetQuantity(quantity,
true,
false,
false,
false);
11509 }
11510 index++;
11511 }
11512
11514 {
11515 float wet = floats.Get(index);
11517 index++;
11518 }
11519
11521 {
11522 int liquidtype = Math.Round(floats.Get(index));
11524 index++;
11525 }
11526
11528 {
11530 index++;
11532 index++;
11534 index++;
11536 index++;
11537 }
11538
11540 {
11541 int cleanness = Math.Round(floats.Get(index));
11543 index++;
11544 }
11545 }
11546
11548 {
11549 super.WriteVarsToCTX(ctx);
11550
11551
11553 {
11555 }
11556
11558 {
11560 }
11561
11563 {
11565 }
11566
11568 {
11569 int r,g,b,a;
11575 }
11576
11578 {
11580 }
11581 }
11582
11584 {
11585 if (!super.ReadVarsFromCTX(ctx,version))
11586 return false;
11587
11588 int intValue;
11589 float value;
11590
11591 if (version < 140)
11592 {
11593 if (!ctx.
Read(intValue))
11594 return false;
11595
11596 m_VariablesMask = intValue;
11597 }
11598
11600 {
11601 if (!ctx.
Read(value))
11602 return false;
11603
11605 {
11607 }
11608 else
11609 {
11611 }
11612 }
11613
11614 if (version < 140)
11615 {
11617 {
11618 if (!ctx.
Read(value))
11619 return false;
11620 SetTemperatureDirect(value);
11621 }
11622 }
11623
11625 {
11626 if (!ctx.
Read(value))
11627 return false;
11629 }
11630
11632 {
11633 if (!ctx.
Read(intValue))
11634 return false;
11636 }
11637
11639 {
11640 int r,g,b,a;
11642 return false;
11644 return false;
11646 return false;
11648 return false;
11649
11651 }
11652
11654 {
11655 if (!ctx.
Read(intValue))
11656 return false;
11658 }
11659
11660 if (version >= 138 && version < 140)
11661 {
11663 {
11664 if (!ctx.
Read(intValue))
11665 return false;
11666 SetFrozen(intValue);
11667 }
11668 }
11669
11670 return true;
11671 }
11672
11673
11675 {
11678 {
11680 }
11681
11682 if (!super.OnStoreLoad(ctx, version))
11683 {
11685 return false;
11686 }
11687
11688 if (version >= 114)
11689 {
11690 bool hasQuickBarIndexSaved;
11691
11692 if (!ctx.
Read(hasQuickBarIndexSaved))
11693 {
11695 return false;
11696 }
11697
11698 if (hasQuickBarIndexSaved)
11699 {
11700 int itmQBIndex;
11701
11702
11703 if (!ctx.
Read(itmQBIndex))
11704 {
11706 return false;
11707 }
11708
11709 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11710 if (itmQBIndex != -1 && parentPlayer)
11711 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11712 }
11713 }
11714 else
11715 {
11716
11717 PlayerBase player;
11718 int itemQBIndex;
11719 if (version ==
int.
MAX)
11720 {
11721 if (!ctx.
Read(itemQBIndex))
11722 {
11724 return false;
11725 }
11726 }
11727 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11728 {
11729
11730 if (!ctx.
Read(itemQBIndex))
11731 {
11733 return false;
11734 }
11735 if (itemQBIndex != -1 && player)
11736 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11737 }
11738 }
11739
11740 if (version < 140)
11741 {
11742
11743 if (!LoadVariables(ctx, version))
11744 {
11746 return false;
11747 }
11748 }
11749
11750
11752 {
11754 return false;
11755 }
11756 if (version >= 132)
11757 {
11759 if (raib)
11760 {
11762 {
11764 return false;
11765 }
11766 }
11767 }
11768
11770 return true;
11771 }
11772
11773
11774
11776 {
11777 super.OnStoreSave(ctx);
11778
11779 PlayerBase player;
11780 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11781 {
11783
11784 int itemQBIndex = -1;
11785 itemQBIndex = player.FindQuickBarEntityIndex(this);
11786 ctx.
Write(itemQBIndex);
11787 }
11788 else
11789 {
11791 }
11792
11794
11796 if (raib)
11797 {
11799 }
11800 }
11801
11802
11804 {
11805 super.AfterStoreLoad();
11806
11808 {
11810 }
11811
11813 {
11816 }
11817 }
11818
11820 {
11821 super.EEOnAfterLoad();
11822
11824 {
11826 }
11827
11830 }
11831
11833 {
11834 return false;
11835 }
11836
11837
11838
11840 {
11842 {
11843 #ifdef PLATFORM_CONSOLE
11844
11846 {
11848 if (menu)
11849 {
11851 }
11852 }
11853 #endif
11854 }
11855
11857 {
11860 }
11861
11863 {
11864 SetWeightDirty();
11866 }
11868 {
11871 }
11872
11874 {
11877 }
11879 {
11882 }
11883
11884 super.OnVariablesSynchronized();
11885 }
11886
11887
11888
11890 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11891 {
11892 if (!IsServerCheck(allow_client))
11893 return false;
11894
11896 return false;
11897
11900
11901 if (value <= (min + 0.001))
11902 value = min;
11903
11904 if (value == min)
11905 {
11906 if (destroy_config)
11907 {
11908 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11909 if (dstr)
11910 {
11912 this.Delete();
11913 return true;
11914 }
11915 }
11916 else if (destroy_forced)
11917 {
11919 this.Delete();
11920 return true;
11921 }
11922
11924 }
11925
11928
11930 {
11932
11933 if (delta)
11935 }
11936
11938
11939 return false;
11940 }
11941
11942
11944 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11945 {
11947 }
11948
11950 {
11953 }
11954
11956 {
11959 }
11960
11963 {
11964 float value_clamped = Math.Clamp(value, 0, 1);
11966 SetQuantity(result, destroy_config, destroy_forced);
11967 }
11968
11969
11972 {
11974 }
11975
11977 {
11979 }
11980
11981
11982
11983
11984
11985
11986
11987
11988
11989
11991 {
11992 int slot = -1;
11993 if (GetInventory())
11994 {
11995 InventoryLocation il = new InventoryLocation;
11996 GetInventory().GetCurrentInventoryLocation(il);
11998 }
11999
12001 }
12002
12004 {
12005 float quantity_max = 0;
12006
12008 {
12009 if (attSlotID != -1)
12010 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12011
12012 if (quantity_max <= 0)
12014 }
12015
12016 if (quantity_max <= 0)
12018
12019 return quantity_max;
12020 }
12021
12023 {
12025 }
12026
12028 {
12030 }
12031
12032
12034 {
12036 }
12037
12039 {
12041 }
12042
12044 {
12046 }
12047
12048
12050 {
12051
12052 float weightEx = GetWeightEx();
12053 float special = GetInventoryAndCargoWeight();
12054 return weightEx - special;
12055 }
12056
12057
12059 {
12061 }
12062
12064 {
12066 {
12067 #ifdef DEVELOPER
12068 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12069 {
12070 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12072 }
12073 #endif
12074
12075 return GetQuantity() * GetConfigWeightModified();
12076 }
12077 else if (HasEnergyManager())
12078 {
12079 #ifdef DEVELOPER
12080 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12081 {
12082 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12083 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12084 }
12085 #endif
12086 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12087 }
12088 else
12089 {
12090 #ifdef DEVELOPER
12091 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12092 {
12093 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12094 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12095 }
12096 #endif
12097 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12098 }
12099 }
12100
12103 {
12104 int item_count = 0;
12106
12107 if (GetInventory().GetCargo() != NULL)
12108 {
12109 item_count = GetInventory().GetCargo().GetItemCount();
12110 }
12111
12112 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12113 {
12114 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12115 if (item)
12116 item_count += item.GetNumberOfItems();
12117 }
12118 return item_count;
12119 }
12120
12123 {
12124 float weight = 0;
12125 float wetness = 1;
12126 if (include_wetness)
12129 {
12130 weight = wetness * m_ConfigWeight;
12131 }
12133 {
12134 weight = 1;
12135 }
12136 return weight;
12137 }
12138
12139
12140
12142 {
12143 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12144 {
12145 GameInventory inv = GetInventory();
12146 array<EntityAI> items = new array<EntityAI>;
12148 for (int i = 0; i < items.Count(); i++)
12149 {
12151 if (item)
12152 {
12154 }
12155 }
12156 }
12157 }
12158
12159
12160
12161
12163 {
12164 float energy = 0;
12165 if (HasEnergyManager())
12166 {
12167 energy = GetCompEM().GetEnergy();
12168 }
12169 return energy;
12170 }
12171
12172
12174 {
12175 super.OnEnergyConsumed();
12176
12178 }
12179
12181 {
12182 super.OnEnergyAdded();
12183
12185 }
12186
12187
12189 {
12190 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12191 {
12193 {
12194 float energy_0to1 = GetCompEM().GetEnergy0To1();
12196 }
12197 }
12198 }
12199
12200
12202 {
12203 return ConfigGetFloat("heatIsolation");
12204 }
12205
12207 {
12209 }
12210
12212 {
12213 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12214 if (
GetGame().ConfigIsExisting(paramPath))
12216
12217 return 0.0;
12218 }
12219
12221 {
12222 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12223 if (
GetGame().ConfigIsExisting(paramPath))
12225
12226 return 0.0;
12227 }
12228
12229 override void SetWet(
float value,
bool allow_client =
false)
12230 {
12231 if (!IsServerCheck(allow_client))
12232 return;
12233
12236
12238
12239 m_VarWet = Math.Clamp(value, min, max);
12240
12242 {
12245 }
12246 }
12247
12248 override void AddWet(
float value)
12249 {
12251 }
12252
12254 {
12256 }
12257
12259 {
12261 }
12262
12264 {
12266 }
12267
12269 {
12271 }
12272
12274 {
12276 }
12277
12278 override void OnWetChanged(
float newVal,
float oldVal)
12279 {
12282 if (newLevel != oldLevel)
12283 {
12285 }
12286 }
12287
12289 {
12290 SetWeightDirty();
12291 }
12292
12294 {
12295 return GetWetLevelInternal(
m_VarWet);
12296 }
12297
12298
12299
12301 {
12303 }
12304
12306 {
12308 }
12309
12311 {
12313 }
12314
12316 {
12318 }
12319
12320
12321
12323 {
12324 if (ConfigIsExisting("itemModelLength"))
12325 {
12326 return ConfigGetFloat("itemModelLength");
12327 }
12328 return 0;
12329 }
12330
12332 {
12333 if (ConfigIsExisting("itemAttachOffset"))
12334 {
12335 return ConfigGetFloat("itemAttachOffset");
12336 }
12337 return 0;
12338 }
12339
12340 override void SetCleanness(
int value,
bool allow_client =
false)
12341 {
12342 if (!IsServerCheck(allow_client))
12343 return;
12344
12346
12348
12351 }
12352
12354 {
12356 }
12357
12359 {
12360 return true;
12361 }
12362
12363
12364
12365
12367 {
12369 }
12370
12372 {
12374 }
12375
12376
12377
12378
12379 override void SetColor(
int r,
int g,
int b,
int a)
12380 {
12386 }
12388 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12389 {
12394 }
12395
12397 {
12399 }
12400
12403 {
12404 int r,g,b,a;
12406 r = r/255;
12407 g = g/255;
12408 b = b/255;
12409 a = a/255;
12410 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12411 }
12412
12413
12414
12415 override void SetLiquidType(
int value,
bool allow_client =
false)
12416 {
12417 if (!IsServerCheck(allow_client))
12418 return;
12419
12424 }
12425
12427 {
12428 return ConfigGetInt("varLiquidTypeInit");
12429 }
12430
12432 {
12434 }
12435
12437 {
12439 SetFrozen(false);
12440 }
12441
12444 {
12445 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12446 }
12447
12448
12451 {
12452 PlayerBase nplayer;
12453 if (PlayerBase.CastTo(nplayer, player))
12454 {
12456
12457 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12458 }
12459 }
12460
12461
12464 {
12465 PlayerBase nplayer;
12466 if (PlayerBase.CastTo(nplayer,player))
12467 {
12468
12469 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12470
12471 }
12472
12473
12474 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12475
12476
12477 if (HasEnergyManager())
12478 {
12479 GetCompEM().UpdatePlugState();
12480 }
12481 }
12482
12483
12485 {
12486 super.OnPlacementStarted(player);
12487
12489 }
12490
12491 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12492 {
12494 {
12495 m_AdminLog.OnPlacementComplete(player,
this);
12496 }
12497
12498 super.OnPlacementComplete(player, position, orientation);
12499 }
12500
12501
12502
12503
12504
12506 {
12508 {
12509 return true;
12510 }
12511 else
12512 {
12513 return false;
12514 }
12515 }
12516
12517
12519 {
12521 {
12523 }
12524 }
12525
12526
12528 {
12530 }
12531
12533 {
12535 }
12536
12537 override void InsertAgent(
int agent,
float count = 1)
12538 {
12539 if (count < 1)
12540 return;
12541
12543 }
12544
12547 {
12549 }
12550
12551
12553 {
12555 }
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12599 {
12601 return false;
12602 return true;
12603 }
12604
12606 {
12607
12609 }
12610
12611
12614 {
12615 super.CheckForRoofLimited(timeTresholdMS);
12616
12618 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12619 {
12620 m_PreviousRoofTestTime = time;
12621 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12622 }
12623 }
12624
12625
12627 {
12629 {
12630 return 0;
12631 }
12632
12633 if (GetInventory().GetAttachmentSlotsCount() != 0)
12634 {
12635 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12636 if (filter)
12637 return filter.GetProtectionLevel(type, false, system);
12638 else
12639 return 0;
12640 }
12641
12642 string subclassPath, entryName;
12643
12644 switch (type)
12645 {
12647 entryName = "biological";
12648 break;
12650 entryName = "chemical";
12651 break;
12652 default:
12653 entryName = "biological";
12654 break;
12655 }
12656
12657 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12658
12660 }
12661
12662
12663
12666 {
12667 if (!IsMagazine())
12669
12671 }
12672
12673
12674
12675
12676
12681 {
12682 return true;
12683 }
12684
12686 {
12688 }
12689
12690
12691
12692
12693
12695 {
12696 if (parent)
12697 {
12698 if (parent.IsInherited(DayZInfected))
12699 return true;
12700
12701 if (!parent.IsRuined())
12702 return true;
12703 }
12704
12705 return true;
12706 }
12707
12709 {
12710 if (!super.CanPutAsAttachment(parent))
12711 {
12712 return false;
12713 }
12714
12715 if (!IsRuined() && !parent.IsRuined())
12716 {
12717 return true;
12718 }
12719
12720 return false;
12721 }
12722
12724 {
12725
12726
12727
12728
12729 return super.CanReceiveItemIntoCargo(item);
12730 }
12731
12733 {
12734
12735
12736
12737
12738 GameInventory attachmentInv = attachment.GetInventory();
12740 {
12741 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12742 return false;
12743 }
12744
12745 InventoryLocation loc = new InventoryLocation();
12746 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12747 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12748 return false;
12749
12750 return super.CanReceiveAttachment(attachment, slotId);
12751 }
12752
12754 {
12755 if (!super.CanReleaseAttachment(attachment))
12756 return false;
12757
12758 return GetInventory().AreChildrenAccessible();
12759 }
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12782 {
12783 int id = muzzle_owner.GetMuzzleID();
12784 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12785
12786 if (WPOF_array)
12787 {
12788 for (int i = 0; i < WPOF_array.Count(); i++)
12789 {
12790 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12791
12792 if (WPOF)
12793 {
12794 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12795 }
12796 }
12797 }
12798 }
12799
12800
12802 {
12803 int id = muzzle_owner.GetMuzzleID();
12805
12806 if (WPOBE_array)
12807 {
12808 for (int i = 0; i < WPOBE_array.Count(); i++)
12809 {
12810 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12811
12812 if (WPOBE)
12813 {
12814 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12815 }
12816 }
12817 }
12818 }
12819
12820
12822 {
12823 int id = muzzle_owner.GetMuzzleID();
12824 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12825
12826 if (WPOOH_array)
12827 {
12828 for (int i = 0; i < WPOOH_array.Count(); i++)
12829 {
12830 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12831
12832 if (WPOOH)
12833 {
12834 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12835 }
12836 }
12837 }
12838 }
12839
12840
12842 {
12843 int id = muzzle_owner.GetMuzzleID();
12844 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12845
12846 if (WPOOH_array)
12847 {
12848 for (int i = 0; i < WPOOH_array.Count(); i++)
12849 {
12850 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12851
12852 if (WPOOH)
12853 {
12854 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12855 }
12856 }
12857 }
12858 }
12859
12860
12862 {
12863 int id = muzzle_owner.GetMuzzleID();
12864 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12865
12866 if (WPOOH_array)
12867 {
12868 for (int i = 0; i < WPOOH_array.Count(); i++)
12869 {
12870 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12871
12872 if (WPOOH)
12873 {
12874 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12875 }
12876 }
12877 }
12878 }
12879
12880
12881
12883 {
12885 {
12886 return true;
12887 }
12888
12889 return false;
12890 }
12891
12893 {
12895 {
12896 return true;
12897 }
12898
12899 return false;
12900 }
12901
12903 {
12905 {
12906 return true;
12907 }
12908
12909 return false;
12910 }
12911
12913 {
12914 return false;
12915 }
12916
12919 {
12920 return UATimeSpent.DEFAULT_DEPLOY;
12921 }
12922
12923
12924
12925
12927 {
12929 SetSynchDirty();
12930 }
12931
12933 {
12935 }
12936
12937
12939 {
12940 return false;
12941 }
12942
12945 {
12946 string att_type = "None";
12947
12948 if (ConfigIsExisting("soundAttType"))
12949 {
12950 att_type = ConfigGetString("soundAttType");
12951 }
12952
12954 }
12955
12957 {
12959 }
12960
12961
12962
12963
12964
12968
12970 {
12973
12975 }
12976
12977
12979 {
12981 return;
12982
12984
12987
12990
12991 SoundParameters params = new SoundParameters();
12995 }
12996
12997
12999 {
13001 return;
13002
13004 SetSynchDirty();
13005
13008 }
13009
13010
13012 {
13014 return;
13015
13017 SetSynchDirty();
13018
13021 }
13022
13024 {
13026 }
13027
13029 {
13031 }
13032
13035 {
13036 if (!
GetGame().IsDedicatedServer())
13037 {
13038 if (ConfigIsExisting("attachSoundSet"))
13039 {
13040 string cfg_path = "";
13041 string soundset = "";
13042 string type_name =
GetType();
13043
13046 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13047 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13048
13049 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13050 {
13051 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13052 {
13053 if (cfg_slot_array[i] == slot_type)
13054 {
13055 soundset = cfg_soundset_array[i];
13056 break;
13057 }
13058 }
13059 }
13060
13061 if (soundset != "")
13062 {
13063 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13065 }
13066 }
13067 }
13068 }
13069
13071 {
13072
13073 }
13074
13075 void OnApply(PlayerBase player);
13076
13078 {
13079 return 1.0;
13080 };
13081
13083 {
13085 }
13086
13088 {
13090 }
13091
13093
13095 {
13096 SetDynamicPhysicsLifeTime(0.01);
13098 }
13099
13101 {
13102 array<string> zone_names = new array<string>;
13103 GetDamageZones(zone_names);
13104 for (int i = 0; i < zone_names.Count(); i++)
13105 {
13106 SetHealthMax(zone_names.Get(i),"Health");
13107 }
13108 SetHealthMax("","Health");
13109 }
13110
13113 {
13114 float global_health = GetHealth01("","Health");
13115 array<string> zones = new array<string>;
13116 GetDamageZones(zones);
13117
13118 for (int i = 0; i < zones.Count(); i++)
13119 {
13120 SetHealth01(zones.Get(i),"Health",global_health);
13121 }
13122 }
13123
13126 {
13127 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13128 }
13129
13131 {
13132 if (!hasRootAsPlayer)
13133 {
13134 if (refParentIB)
13135 {
13136
13137 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13138 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13139
13140 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13141 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13142
13145 }
13146 else
13147 {
13148
13151 }
13152 }
13153 }
13154
13156 {
13158 {
13159 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13160 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13161 {
13162 float heatPermCoef = 1.0;
13164 while (ent)
13165 {
13166 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13167 ent = ent.GetHierarchyParent();
13168 }
13169
13170 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13171 }
13172 }
13173 }
13174
13176 {
13177
13178 EntityAI parent = GetHierarchyParent();
13179 if (!parent)
13180 {
13181 hasParent = false;
13182 hasRootAsPlayer = false;
13183 }
13184 else
13185 {
13186 hasParent = true;
13187 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13188 refParentIB =
ItemBase.Cast(parent);
13189 }
13190 }
13191
13192 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13193 {
13194
13195 }
13196
13198 {
13199
13200 return false;
13201 }
13202
13204 {
13205
13206
13207 return false;
13208 }
13209
13211 {
13212
13213 return false;
13214 }
13215
13218 {
13219 return !GetIsFrozen() &&
IsOpen();
13220 }
13221
13223 {
13224 bool hasParent = false, hasRootAsPlayer = false;
13226
13227 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13228 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13229
13230 if (wwtu || foodDecay)
13231 {
13235
13236 if (processWetness || processTemperature || processDecay)
13237 {
13239
13240 if (processWetness)
13241 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13242
13243 if (processTemperature)
13245
13246 if (processDecay)
13247 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13248 }
13249 }
13250 }
13251
13254 {
13256 }
13257
13259 {
13262
13263 return super.GetTemperatureFreezeThreshold();
13264 }
13265
13267 {
13270
13271 return super.GetTemperatureThawThreshold();
13272 }
13273
13275 {
13278
13279 return super.GetItemOverheatThreshold();
13280 }
13281
13283 {
13285 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13286
13287 return super.GetTemperatureFreezeTime();
13288 }
13289
13291 {
13293 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13294
13295 return super.GetTemperatureThawTime();
13296 }
13297
13302
13304 {
13305 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13306 }
13307
13309 {
13310 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13311 }
13312
13315 {
13317 }
13318
13320 {
13322 }
13323
13325 {
13327 }
13328
13331 {
13332 return null;
13333 }
13334
13337 {
13338 return false;
13339 }
13340
13342 {
13344 {
13347 if (!trg)
13348 {
13350 explosive = this;
13351 }
13352
13353 explosive.PairRemote(trg);
13355
13356 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13357 trg.SetPersistentPairID(persistentID);
13358 explosive.SetPersistentPairID(persistentID);
13359
13360 return true;
13361 }
13362 return false;
13363 }
13364
13367 {
13368 float ret = 1.0;
13371 ret *= GetHealth01();
13372
13373 return ret;
13374 }
13375
13376 #ifdef DEVELOPER
13377 override void SetDebugItem()
13378 {
13379 super.SetDebugItem();
13380 _itemBase = this;
13381 }
13382
13384 {
13385 string text = super.GetDebugText();
13386
13388 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13389
13390 return text;
13391 }
13392 #endif
13393
13395 {
13396 return true;
13397 }
13398
13400
13402
13404 {
13407 }
13408
13409
13417
13433}
13434
13436{
13438 if (entity)
13439 {
13440 bool is_item = entity.IsInherited(
ItemBase);
13441 if (is_item && full_quantity)
13442 {
13445 }
13446 }
13447 else
13448 {
13450 return NULL;
13451 }
13452 return entity;
13453}
13454
13456{
13457 if (item)
13458 {
13459 if (health > 0)
13460 item.SetHealth("", "", health);
13461
13462 if (item.CanHaveTemperature())
13463 {
13465 if (item.CanFreeze())
13466 item.SetFrozen(false);
13467 }
13468
13469 if (item.HasEnergyManager())
13470 {
13471 if (quantity >= 0)
13472 {
13473 item.GetCompEM().SetEnergy0To1(quantity);
13474 }
13475 else
13476 {
13478 }
13479 }
13480 else if (item.IsMagazine())
13481 {
13482 Magazine mag = Magazine.Cast(item);
13483 if (quantity >= 0)
13484 {
13485 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13486 }
13487 else
13488 {
13490 }
13491
13492 }
13493 else
13494 {
13495 if (quantity >= 0)
13496 {
13497 item.SetQuantityNormalized(quantity, false);
13498 }
13499 else
13500 {
13502 }
13503
13504 }
13505 }
13506}
13507
13508#ifdef DEVELOPER
13510#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.