8574{
8576 {
8577 return true;
8578 }
8579};
8580
8582{
8583
8584};
8585
8586
8587
8589{
8593
8595
8598
8599
8600
8601
8602
8611
8617
8622
8627
8648 protected bool m_IsResultOfSplit
8649
8651
8656
8657
8658
8660
8664
8665
8666
8668
8671
8672
8673
8679
8680
8688
8691
8692
8694
8695
8697
8698
8703
8704
8709
8711
8712
8714
8715
8717 {
8722
8723 if (!
g_Game.IsDedicatedServer())
8724 {
8726 {
8728
8730 {
8732 }
8733 }
8734
8737 }
8738
8739 m_OldLocation = null;
8740
8742 {
8744 }
8745
8746 if (ConfigIsExisting("headSelectionsToHide"))
8747 {
8750 }
8751
8753 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8754 {
8756 }
8757
8759
8760 m_IsResultOfSplit = false;
8761
8763 }
8764
8766 {
8767 super.InitItemVariables();
8768
8774 m_Count = ConfigGetInt(
"count");
8775
8778
8783
8786
8791
8803
8807
8808
8811 if (ConfigIsExisting("canBeSplit"))
8812 {
8815 }
8816
8818 if (ConfigIsExisting("itemBehaviour"))
8820
8821
8824 RegisterNetSyncVariableInt("m_VarLiquidType");
8825 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8826
8827 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8828 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8829 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8830
8831 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8832 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8833 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8834 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8835
8836 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8837 RegisterNetSyncVariableBool("m_IsTakeable");
8838 RegisterNetSyncVariableBool("m_IsHologram");
8839
8842 {
8845 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8846 }
8847
8849
8851 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8853
8855 }
8856
8858 {
8860 }
8861
8863 {
8866 {
8871 }
8872 }
8873
8874 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8875 {
8877 {
8880 }
8881
8883 }
8884
8886 {
8892 }
8893
8895
8897 {
8899
8900 if (!action)
8901 {
8902 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8903 return;
8904 }
8905
8907 if (!ai)
8908 {
8910 return;
8911 }
8912
8914 if (!action_array)
8915 {
8916 action_array = new array<ActionBase_Basic>;
8918 }
8919 if (LogManager.IsActionLogEnable())
8920 {
8921 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8922 }
8923
8924 if (action_array.Find(action) != -1)
8925 {
8926 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8927 }
8928 else
8929 {
8930 action_array.Insert(action);
8931 }
8932 }
8933
8935 {
8936 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8937 ActionBase action = player.GetActionManager().GetAction(actionName);
8940
8941 if (action_array)
8942 {
8943 action_array.RemoveItem(action);
8944 }
8945 }
8946
8947
8948
8950 {
8951 ActionOverrideData overrideData = new ActionOverrideData();
8955
8957 if (!actionMap)
8958 {
8961 }
8962
8963 actionMap.Insert(this.
Type(), overrideData);
8964
8965 }
8966
8968
8970
8971
8973 {
8976
8979
8980 string config_to_search = "CfgVehicles";
8981 string muzzle_owner_config;
8982
8984 {
8985 if (IsInherited(Weapon))
8986 config_to_search = "CfgWeapons";
8987
8988 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8989
8990 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8991
8992 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8993
8994 if (config_OnFire_subclass_count > 0)
8995 {
8996 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8997
8998 for (int i = 0; i < config_OnFire_subclass_count; i++)
8999 {
9000 string particle_class = "";
9001 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9002 string config_OnFire_entry = config_OnFire_class + particle_class;
9003 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9004 WPOF_array.Insert(WPOF);
9005 }
9006
9007
9009 }
9010 }
9011
9013 {
9014 config_to_search = "CfgWeapons";
9015 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9016
9017 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9018
9019 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9020
9021 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9022 {
9023 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9024
9025 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9026 {
9027 string particle_class2 = "";
9028 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9029 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9030 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9031 WPOBE_array.Insert(WPOBE);
9032 }
9033
9034
9036 }
9037 }
9038 }
9039
9040
9042 {
9045
9047 {
9048 string config_to_search = "CfgVehicles";
9049
9050 if (IsInherited(Weapon))
9051 config_to_search = "CfgWeapons";
9052
9053 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9054 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9055
9056 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9057 {
9058
9060
9062 {
9064 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9066 return;
9067 }
9068
9071
9072
9073
9074 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9075 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9076
9077 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9078 {
9079 string particle_class = "";
9080 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9081 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9082 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9083
9084 if (entry_type == CT_CLASS)
9085 {
9086 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9087 WPOOH_array.Insert(WPOF);
9088 }
9089 }
9090
9091
9093 }
9094 }
9095 }
9096
9098 {
9100 }
9101
9103 {
9105 {
9107
9110
9113
9114 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9115 }
9116 }
9117
9119 {
9121 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9122
9124 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9125
9127 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9128
9130 {
9132 }
9133 }
9134
9136 {
9138 }
9139
9141 {
9144 else
9146
9148 {
9151 }
9152 else
9153 {
9156
9159 }
9160
9162 }
9163
9165 {
9167 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9168 }
9169
9171 {
9173 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9175 }
9176
9178 {
9180 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9181 }
9182
9184 {
9187
9188 OverheatingParticle OP = new OverheatingParticle();
9193
9195 }
9196
9198 {
9201
9202 return -1;
9203 }
9204
9206 {
9208 {
9211
9212 for (int i = count; i > 0; --i)
9213 {
9214 int id = i - 1;
9217
9220
9221 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9222 {
9223 if (p)
9224 {
9227 }
9228 }
9229 }
9230 }
9231 }
9232
9234 {
9236 {
9238 {
9239 int id = i - 1;
9241
9242 if (OP)
9243 {
9245
9246 if (p)
9247 {
9249 }
9250
9251 delete OP;
9252 }
9253 }
9254
9257 }
9258 }
9259
9262 {
9263 return 0.0;
9264 }
9265
9266
9268 {
9269 return 250;
9270 }
9271
9273 {
9274 return 0;
9275 }
9276
9279 {
9281 return true;
9282
9283 return false;
9284 }
9285
9288 {
9291
9293 {
9295 }
9296 else
9297 {
9298
9300 }
9301
9303 }
9304
9311 {
9312 return -1;
9313 }
9314
9315
9316
9317
9319 {
9321 {
9322 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9323 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9324
9325 if (r_index >= 0)
9326 {
9327 InventoryLocation r_il = new InventoryLocation;
9328 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9329
9330 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9333 {
9334 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9335 }
9337 {
9338 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9339 }
9340
9341 }
9342
9343 player.GetHumanInventory().ClearUserReservedLocation(this);
9344 }
9345
9348 }
9349
9350
9351
9352
9354 {
9355 return ItemBase.m_DebugActionsMask;
9356 }
9357
9359 {
9360 return ItemBase.m_DebugActionsMask & mask;
9361 }
9362
9364 {
9365 ItemBase.m_DebugActionsMask = mask;
9366 }
9367
9369 {
9370 ItemBase.m_DebugActionsMask |= mask;
9371 }
9372
9374 {
9375 ItemBase.m_DebugActionsMask &= ~mask;
9376 }
9377
9379 {
9381 {
9383 }
9384 else
9385 {
9387 }
9388 }
9389
9390
9392 {
9393 if (GetEconomyProfile())
9394 {
9395 float q_max = GetEconomyProfile().GetQuantityMax();
9396 if (q_max > 0)
9397 {
9398 float q_min = GetEconomyProfile().GetQuantityMin();
9399 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9400
9402 {
9403 ComponentEnergyManager comp = GetCompEM();
9405 {
9407 }
9408 }
9410 {
9412
9413 }
9414
9415 }
9416 }
9417 }
9418
9421 {
9422 EntityAI parent = GetHierarchyParent();
9423
9424 if (parent)
9425 {
9426 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9427 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9428 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9429 }
9430 }
9431
9434 {
9435 EntityAI parent = GetHierarchyParent();
9436
9437 if (parent)
9438 {
9439 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9440 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9441 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9442 }
9443 }
9444
9446 {
9447
9448
9449
9450
9452
9454 {
9455 if (ScriptInputUserData.CanStoreInputUserData())
9456 {
9457 ScriptInputUserData ctx = new ScriptInputUserData;
9463 ctx.
Write(use_stack_max);
9466
9468 {
9469 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9470 }
9471 }
9472 }
9473 else if (!
g_Game.IsMultiplayer())
9474 {
9476 }
9477 }
9478
9480 {
9482 }
9483
9485 {
9487 }
9488
9490 {
9492 }
9493
9495 {
9496
9497 return false;
9498 }
9499
9501 {
9502 return false;
9503 }
9504
9508 {
9509 return false;
9510 }
9511
9513 {
9514 return "";
9515 }
9516
9518
9520 {
9521 return false;
9522 }
9523
9525 {
9526 return true;
9527 }
9528
9529
9530
9532 {
9533 return true;
9534 }
9535
9537 {
9538 return true;
9539 }
9540
9542 {
9543 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9545 }
9546
9548 {
9550 }
9551
9553 {
9555 if (!is_being_placed)
9557 SetSynchDirty();
9558 }
9559
9560
9562
9564 {
9566 }
9567
9569 {
9571 }
9572
9574 {
9575 return 1;
9576 }
9577
9579 {
9580 return false;
9581 }
9582
9584 {
9586 SetSynchDirty();
9587 }
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9624 {
9625 super.OnMovedInsideCargo(container);
9626
9627 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9628 }
9629
9630 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9631 {
9632 super.EEItemLocationChanged(oldLoc, newLoc);
9633
9634 PlayerBase newPlayer = null;
9635 PlayerBase oldPlayer = null;
9636
9637 if (newLoc.GetParent())
9638 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9639
9640 if (oldLoc.GetParent())
9641 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9642
9644 {
9645 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9646
9647 if (rIndex >= 0)
9648 {
9649 InventoryLocation rIl = new InventoryLocation;
9650 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9651
9652 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9655 {
9656 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9657 }
9659 {
9661 }
9662
9663 }
9664 }
9665
9667 {
9668 if (newPlayer)
9669 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9670
9671 if (newPlayer == oldPlayer)
9672 {
9673 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9674 {
9676 {
9677 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9678 {
9679 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9680 }
9681 }
9682 else
9683 {
9684 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9685 }
9686 }
9687
9688 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9689 {
9690 int type = oldLoc.GetType();
9692 {
9693 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9694 }
9696 {
9697 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9698 }
9699 }
9700 if (!m_OldLocation)
9701 {
9702 m_OldLocation = new InventoryLocation;
9703 }
9704 m_OldLocation.Copy(oldLoc);
9705 }
9706 else
9707 {
9708 if (m_OldLocation)
9709 {
9710 m_OldLocation.Reset();
9711 }
9712 }
9713
9714 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9715 }
9716 else
9717 {
9718 if (newPlayer)
9719 {
9720 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9721 if (resIndex >= 0)
9722 {
9723 InventoryLocation il = new InventoryLocation;
9724 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9726 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9729 {
9730 il.
GetParent().GetOnReleaseLock().Invoke(it);
9731 }
9733 {
9735 }
9736
9737 }
9738 }
9740 {
9741
9743 }
9744
9745 if (m_OldLocation)
9746 {
9747 m_OldLocation.Reset();
9748 }
9749 }
9750
9752 {
9753 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9754 }
9755
9757 {
9758 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9759 }
9760 }
9761
9762 override void EOnContact(IEntity other, Contact extra)
9763 {
9765 {
9766 int liquidType = -1;
9768 if (impactSpeed > 0.0)
9769 {
9771 #ifndef SERVER
9773 #else
9775 SetSynchDirty();
9776 #endif
9778 }
9779 }
9780
9781 #ifdef SERVER
9782 if (GetCompEM() && GetCompEM().IsPlugged())
9783 {
9784 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9785 GetCompEM().UnplugThis();
9786 }
9787 #endif
9788 }
9789
9791
9793 {
9795 }
9796
9798 {
9799
9800 }
9801
9803 {
9804 super.OnItemLocationChanged(old_owner, new_owner);
9805
9806 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9807 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9808
9809 if (!relatedPlayer && playerNew)
9810 relatedPlayer = playerNew;
9811
9812 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9813 {
9815 if (actionMgr)
9816 {
9817 ActionBase currentAction = actionMgr.GetRunningAction();
9818 if (currentAction)
9820 }
9821 }
9822
9823 Man ownerPlayerOld = null;
9824 Man ownerPlayerNew = null;
9825
9826 if (old_owner)
9827 {
9828 if (old_owner.
IsMan())
9829 {
9830 ownerPlayerOld = Man.Cast(old_owner);
9831 }
9832 else
9833 {
9834 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9835 }
9836 }
9837 else
9838 {
9840 {
9842
9843 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9844 {
9845 GetCompEM().UnplugThis();
9846 }
9847 }
9848 }
9849
9850 if (new_owner)
9851 {
9852 if (new_owner.
IsMan())
9853 {
9854 ownerPlayerNew = Man.Cast(new_owner);
9855 }
9856 else
9857 {
9858 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9859 }
9860 }
9861
9862 if (ownerPlayerOld != ownerPlayerNew)
9863 {
9864 if (ownerPlayerOld)
9865 {
9866 array<EntityAI> subItemsExit = new array<EntityAI>;
9868 for (int i = 0; i < subItemsExit.Count(); i++)
9869 {
9872 }
9873 }
9874
9875 if (ownerPlayerNew)
9876 {
9877 array<EntityAI> subItemsEnter = new array<EntityAI>;
9879 for (int j = 0; j < subItemsEnter.Count(); j++)
9880 {
9883 }
9884 }
9885 }
9886 else if (ownerPlayerNew != null)
9887 {
9888 PlayerBase nplayer;
9889 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9890 {
9891 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9893 for (int k = 0; k < subItemsUpdate.Count(); k++)
9894 {
9896 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9897 }
9898 }
9899 }
9900
9901 if (old_owner)
9902 old_owner.OnChildItemRemoved(this);
9903 if (new_owner)
9904 new_owner.OnChildItemReceived(this);
9905 }
9906
9907
9909 {
9910 super.EEDelete(parent);
9911 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9912 if (player)
9913 {
9915
9916 if (player.IsAlive())
9917 {
9918 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9919 if (r_index >= 0)
9920 {
9921 InventoryLocation r_il = new InventoryLocation;
9922 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9923
9924 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9927 {
9928 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9929 }
9931 {
9932 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9933 }
9934
9935 }
9936
9937 player.RemoveQuickBarEntityShortcut(this);
9938 }
9939 }
9940 }
9941
9943 {
9944 super.EEKilled(killer);
9945
9948 {
9949 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9950 {
9951 if (IsMagazine())
9952 {
9953 if (Magazine.Cast(this).GetAmmoCount() > 0)
9954 {
9956 }
9957 }
9958 else
9959 {
9961 }
9962 }
9963 }
9964 }
9965
9967 {
9968 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9969
9970 super.OnWasAttached(parent, slot_id);
9971
9974
9977 }
9978
9980 {
9981 super.OnWasDetached(parent, slot_id);
9982
9985
9988 }
9989
9991 {
9992 int idx;
9995
9996 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9997 if (inventory_slots.Count() < 1)
9998 {
9999 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10000 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10001 }
10002 else
10003 {
10004 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10005 }
10006
10007 idx = inventory_slots.Find(slot);
10008 if (idx < 0)
10009 return "";
10010
10011 return attach_types.Get(idx);
10012 }
10013
10015 {
10016 int idx = -1;
10017 string slot;
10018
10021
10022 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10023 if (inventory_slots.Count() < 1)
10024 {
10025 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10026 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10027 }
10028 else
10029 {
10030 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10031 if (detach_types.Count() < 1)
10032 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10033 }
10034
10035 for (int i = 0; i < inventory_slots.Count(); i++)
10036 {
10037 slot = inventory_slots.Get(i);
10038 }
10039
10040 if (slot != "")
10041 {
10042 if (detach_types.Count() == 1)
10043 idx = 0;
10044 else
10045 idx = inventory_slots.Find(slot);
10046 }
10047 if (idx < 0)
10048 return "";
10049
10050 return detach_types.Get(idx);
10051 }
10052
10054 {
10055
10057
10058
10059 float min_time = 1;
10060 float max_time = 3;
10061 float delay = Math.RandomFloat(min_time, max_time);
10062
10063 explode_timer.Run(delay, this, "DoAmmoExplosion");
10064 }
10065
10067 {
10068 Magazine magazine = Magazine.Cast(this);
10069 int pop_sounds_count = 6;
10070 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10071
10072
10073 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10074 string sound_name = pop_sounds[ sound_idx ];
10075 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10076
10077
10078 magazine.ServerAddAmmoCount(-1);
10079
10080
10081 float min_temp_to_explode = 100;
10082
10083 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10084 {
10086 }
10087 }
10088
10089
10090 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10091 {
10092 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10093
10094 const int CHANCE_DAMAGE_CARGO = 4;
10095 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10096 const int CHANCE_DAMAGE_NOTHING = 2;
10097
10099 {
10100 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10101 int chances;
10102 int rnd;
10103
10104 if (GetInventory().GetCargo())
10105 {
10106 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10107 rnd = Math.RandomInt(0,chances);
10108
10109 if (rnd < CHANCE_DAMAGE_CARGO)
10110 {
10112 }
10113 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10114 {
10116 }
10117 }
10118 else
10119 {
10120 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10121 rnd = Math.RandomInt(0,chances);
10122
10123 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10124 {
10126 }
10127 }
10128 }
10129 }
10130
10132 {
10133 CargoBase cargo = GetInventory().GetCargo();
10134 if (cargo)
10135 {
10137 if (item_count > 0)
10138 {
10139 int random_pick = Math.RandomInt(0, item_count);
10141 if (!item.IsExplosive())
10142 {
10143 item.AddHealth("","",damage);
10144 return true;
10145 }
10146 }
10147 }
10148 return false;
10149 }
10150
10152 {
10153 GameInventory inventory = GetInventory();
10155 if (attachment_count > 0)
10156 {
10157 int random_pick = Math.RandomInt(0, attachment_count);
10159 if (!attachment.IsExplosive())
10160 {
10161 attachment.AddHealth("","",damage);
10162 return true;
10163 }
10164 }
10165 return false;
10166 }
10167
10169 {
10171 }
10172
10174 {
10176 return GetInventory().CanRemoveEntity();
10177
10178 return false;
10179 }
10180
10182 {
10183
10185 return false;
10186
10187
10189 return false;
10190
10191
10192
10194 if (delta == 0)
10195 return false;
10196
10197
10198 return true;
10199 }
10200
10202 {
10204 {
10205 if (ScriptInputUserData.CanStoreInputUserData())
10206 {
10207 ScriptInputUserData ctx = new ScriptInputUserData;
10212 ctx.
Write(destination_entity);
10214 ctx.
Write(slot_id);
10216 }
10217 }
10218 else if (!
g_Game.IsMultiplayer())
10219 {
10221 }
10222 }
10223
10225 {
10226 float split_quantity_new;
10230 InventoryLocation loc = new InventoryLocation;
10231
10232 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10233 {
10235 split_quantity_new = stack_max;
10236 else
10238
10240 {
10241 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10242 if (new_item)
10243 {
10244 new_item.SetResultOfSplit(true);
10245 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10247 new_item.
SetQuantity(split_quantity_new,
false,
true);
10248 }
10249 }
10250 }
10251 else if (destination_entity && slot_id == -1)
10252 {
10253 if (quantity > stack_max)
10254 split_quantity_new = stack_max;
10255 else
10256 split_quantity_new = quantity;
10257
10259 {
10260 GameInventory destinationInventory = destination_entity.GetInventory();
10262 {
10265 }
10266
10267 if (new_item)
10268 {
10269 new_item.SetResultOfSplit(true);
10270 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10272 new_item.
SetQuantity(split_quantity_new,
false,
true);
10273 }
10274 }
10275 }
10276 else
10277 {
10278 if (stack_max != 0)
10279 {
10281 {
10283 }
10284
10285 if (split_quantity_new == 0)
10286 {
10287 if (!
g_Game.IsMultiplayer())
10288 player.PhysicalPredictiveDropItem(this);
10289 else
10290 player.ServerDropEntity(this);
10291 return;
10292 }
10293
10295 {
10297
10298 if (new_item)
10299 {
10300 new_item.SetResultOfSplit(true);
10301 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10304 new_item.PlaceOnSurface();
10305 }
10306 }
10307 }
10308 }
10309 }
10310
10312 {
10313 float split_quantity_new;
10317 InventoryLocation loc = new InventoryLocation;
10318
10319 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10320 {
10322 split_quantity_new = stack_max;
10323 else
10325
10327 {
10328 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10329 if (new_item)
10330 {
10331 new_item.SetResultOfSplit(true);
10332 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10334 new_item.
SetQuantity(split_quantity_new,
false,
true);
10335 }
10336 }
10337 }
10338 else if (destination_entity && slot_id == -1)
10339 {
10340 if (quantity > stack_max)
10341 split_quantity_new = stack_max;
10342 else
10343 split_quantity_new = quantity;
10344
10346 {
10347 GameInventory destinationInventory = destination_entity.GetInventory();
10349 {
10352 }
10353
10354 if (new_item)
10355 {
10356 new_item.SetResultOfSplit(true);
10357 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10359 new_item.
SetQuantity(split_quantity_new,
false,
true);
10360 }
10361 }
10362 }
10363 else
10364 {
10365 if (stack_max != 0)
10366 {
10368 {
10370 }
10371
10373 {
10375
10376 if (new_item)
10377 {
10378 new_item.SetResultOfSplit(true);
10379 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10382 new_item.PlaceOnSurface();
10383 }
10384 }
10385 }
10386 }
10387 }
10388
10390 {
10392 {
10393 if (ScriptInputUserData.CanStoreInputUserData())
10394 {
10395 ScriptInputUserData ctx = new ScriptInputUserData;
10400 dst.WriteToContext(ctx);
10402 }
10403 }
10404 else if (!
g_Game.IsMultiplayer())
10405 {
10407 }
10408 }
10409
10411 {
10413 {
10414 if (ScriptInputUserData.CanStoreInputUserData())
10415 {
10416 ScriptInputUserData ctx = new ScriptInputUserData;
10421 ctx.
Write(destination_entity);
10427 }
10428 }
10429 else if (!
g_Game.IsMultiplayer())
10430 {
10432 }
10433 }
10434
10436 {
10438 }
10439
10441 {
10443 float split_quantity_new;
10445 if (dst.IsValid())
10446 {
10447 int slot_id = dst.GetSlot();
10449
10450 if (quantity > stack_max)
10451 split_quantity_new = stack_max;
10452 else
10453 split_quantity_new = quantity;
10454
10456 {
10458
10459 if (new_item)
10460 {
10461 new_item.SetResultOfSplit(true);
10462 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10464 new_item.
SetQuantity(split_quantity_new,
false,
true);
10465 }
10466
10467 return new_item;
10468 }
10469 }
10470
10471 return null;
10472 }
10473
10475 {
10477 float split_quantity_new;
10479 if (destination_entity)
10480 {
10482 if (quantity > stackable)
10483 split_quantity_new = stackable;
10484 else
10485 split_quantity_new = quantity;
10486
10488 {
10489 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10490 if (new_item)
10491 {
10492 new_item.SetResultOfSplit(true);
10493 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10495 new_item.
SetQuantity(split_quantity_new,
false,
true);
10496 }
10497 }
10498 }
10499 }
10500
10502 {
10504 {
10505 if (ScriptInputUserData.CanStoreInputUserData())
10506 {
10507 ScriptInputUserData ctx = new ScriptInputUserData;
10512 ItemBase destination_entity =
this;
10513 ctx.
Write(destination_entity);
10517 }
10518 }
10519 else if (!
g_Game.IsMultiplayer())
10520 {
10522 }
10523 }
10524
10526 {
10528 float split_quantity_new;
10530 if (player)
10531 {
10533 if (quantity > stackable)
10534 split_quantity_new = stackable;
10535 else
10536 split_quantity_new = quantity;
10537
10539 {
10540 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10541 new_item =
ItemBase.Cast(in_hands);
10542 if (new_item)
10543 {
10544 new_item.SetResultOfSplit(true);
10545 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10547 new_item.SetQuantity(split_quantity_new, false, true);
10548 }
10549 }
10550 }
10551 }
10552
10554 {
10556 float split_quantity_new = Math.Floor(quantity * 0.5);
10557
10559 return;
10560
10562
10563 if (new_item)
10564 {
10565 if (new_item.GetQuantityMax() < split_quantity_new)
10566 {
10567 split_quantity_new = new_item.GetQuantityMax();
10568 }
10569
10570 new_item.SetResultOfSplit(true);
10571 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10572
10574 {
10577 }
10578 else
10579 {
10581 new_item.
SetQuantity(split_quantity_new,
false,
true);
10582 }
10583 }
10584 }
10585
10587 {
10589 float split_quantity_new = Math.Floor(quantity / 2);
10590
10592 return;
10593
10594 InventoryLocation invloc = new InventoryLocation;
10596
10598 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10599
10600 if (new_item)
10601 {
10602 if (new_item.GetQuantityMax() < split_quantity_new)
10603 {
10604 split_quantity_new = new_item.GetQuantityMax();
10605 }
10607 {
10610 }
10611 else if (split_quantity_new > 1)
10612 {
10614 new_item.
SetQuantity(split_quantity_new,
false,
true);
10615 }
10616 }
10617 }
10618
10621 {
10622 SetWeightDirty();
10624
10625 if (parent)
10626 parent.OnAttachmentQuantityChangedEx(this, delta);
10627
10629 {
10631 {
10633 }
10635 {
10636 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10638 }
10639 }
10640 }
10641
10644 {
10645
10646 }
10647
10650 {
10652 }
10653
10655 {
10656 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10657
10659 {
10660 if (newLevel == GameConstants.STATE_RUINED)
10661 {
10663 EntityAI parent = GetHierarchyParent();
10664 if (parent && parent.IsFireplace())
10665 {
10666 CargoBase cargo = GetInventory().GetCargo();
10667 if (cargo)
10668 {
10670 {
10672 }
10673 }
10674 }
10675 }
10676
10678 {
10679
10681 return;
10682 }
10683
10684 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10685 {
10687 }
10688 }
10689 }
10690
10691
10693 {
10694 super.OnRightClick();
10695
10697 {
10699 {
10700 if (ScriptInputUserData.CanStoreInputUserData())
10701 {
10702 EntityAI root = GetHierarchyRoot();
10703 Man playerOwner = GetHierarchyRootPlayer();
10704 InventoryLocation dst = new InventoryLocation;
10705
10706
10707 if (!playerOwner && root && root == this)
10708 {
10710 }
10711 else
10712 {
10713
10714 GetInventory().GetCurrentInventoryLocation(dst);
10716 {
10717 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10719 {
10721 }
10722 else
10723 {
10725
10726
10727 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10728 {
10730 }
10731 else
10732 {
10733 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10734 }
10735 }
10736 }
10737 }
10738
10739 ScriptInputUserData ctx = new ScriptInputUserData;
10747 }
10748 }
10749 else if (!
g_Game.IsMultiplayer())
10750 {
10752 }
10753 }
10754 }
10755
10757 {
10758 if (root)
10759 {
10760 vector m4[4];
10761 root.GetTransform(m4);
10762 dst.SetGround(this, m4);
10763 }
10764 else
10765 {
10766 GetInventory().GetCurrentInventoryLocation(dst);
10767 }
10768 }
10769
10770 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10771 {
10772
10773 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10774 return false;
10775
10776 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10777 return false;
10778
10779
10781 return false;
10782
10783
10784 Magazine mag = Magazine.Cast(this);
10785 if (mag)
10786 {
10787 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10788 return false;
10789
10790 if (stack_max_limit)
10791 {
10792 Magazine other_mag = Magazine.Cast(other_item);
10793 if (other_item)
10794 {
10795 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10796 return false;
10797 }
10798
10799 }
10800 }
10801 else
10802 {
10803
10805 return false;
10806
10808 return false;
10809 }
10810
10811 PlayerBase player = null;
10812 if (CastTo(player, GetHierarchyRootPlayer()))
10813 {
10814 if (player.GetInventory().HasAttachment(this))
10815 return false;
10816
10817 if (player.IsItemsToDelete())
10818 return false;
10819 }
10820
10821 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10822 return false;
10823
10824 int slotID;
10826 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10827 return false;
10828
10829 return true;
10830 }
10831
10833 {
10835 }
10836
10838 {
10839 return m_IsResultOfSplit;
10840 }
10841
10843 {
10844 m_IsResultOfSplit = value;
10845 }
10846
10848 {
10850 }
10851
10853 {
10854 float other_item_quantity = other_item.GetQuantity();
10855 float this_free_space;
10856
10858
10860
10861 if (other_item_quantity > this_free_space)
10862 {
10863 return this_free_space;
10864 }
10865 else
10866 {
10867 return other_item_quantity;
10868 }
10869 }
10870
10872 {
10874 }
10875
10877 {
10879 return;
10880
10881 if (!IsMagazine() && other_item)
10882 {
10884 if (quantity_used != 0)
10885 {
10886 float hp1 = GetHealth01("","");
10887 float hp2 = other_item.GetHealth01("","");
10888 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10889 hpResult = hpResult / (
GetQuantity() + quantity_used);
10890
10891 hpResult *= GetMaxHealth();
10892 Math.Round(hpResult);
10893 SetHealth("", "Health", hpResult);
10894
10896 other_item.AddQuantity(-quantity_used);
10897 }
10898 }
10900 }
10901
10903 {
10904 #ifdef SERVER
10905 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10906 GetHierarchyParent().IncreaseLifetimeUp();
10907 #endif
10908 };
10909
10911 {
10912 PlayerBase p = PlayerBase.Cast(player);
10913
10914 array<int> recipesIds = p.m_Recipes;
10915 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10916 if (moduleRecipesManager)
10917 {
10918 EntityAI itemInHands = player.GetEntityInHands();
10919 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10920 }
10921
10922 for (int i = 0;i < recipesIds.Count(); i++)
10923 {
10924 int key = recipesIds.Get(i);
10925 string recipeName = moduleRecipesManager.GetRecipeName(key);
10927 }
10928 }
10929
10930
10931 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10932 {
10933 super.GetDebugActions(outputList);
10934
10935
10941
10942
10947
10952
10953
10957
10958
10960 {
10964 }
10965
10968
10969
10973
10975
10976 InventoryLocation loc = new InventoryLocation();
10977 GetInventory().GetCurrentInventoryLocation(loc);
10979 {
10980 if (Gizmo_IsSupported())
10983 }
10984
10986 }
10987
10988
10989
10990
10992 {
10993 super.OnAction(action_id, player, ctx);
10994
10996 {
10997 switch (action_id)
10998 {
11002 return true;
11006 return true;
11007 }
11008 }
11009
11011 {
11012 switch (action_id)
11013 {
11015 Delete();
11016 return true;
11017 }
11018 }
11019
11020 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11021 {
11022 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11023 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11024 PlayerBase p = PlayerBase.Cast(player);
11025 if (
EActions.RECIPES_RANGE_START < 1000)
11026 {
11027 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11028 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11029 }
11030 }
11031 #ifndef SERVER
11032 else if (action_id ==
EActions.WATCH_PLAYER)
11033 {
11034 PluginDeveloper.SetDeveloperItemClientEx(player);
11035 }
11036 #endif
11038 {
11039 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11040 {
11041 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11042 OnDebugButtonPressServer(id + 1);
11043 }
11044
11045 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11046 {
11047 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11049 }
11050
11051 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11052 {
11053 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11055 }
11056
11057 else if (action_id ==
EActions.ADD_QUANTITY)
11058 {
11059 if (IsMagazine())
11060 {
11061 Magazine mag = Magazine.Cast(this);
11062 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11063 }
11064 else
11065 {
11067 }
11068
11069 if (m_EM)
11070 {
11071 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11072 }
11073
11074 }
11075
11076 else if (action_id ==
EActions.REMOVE_QUANTITY)
11077 {
11078 if (IsMagazine())
11079 {
11080 Magazine mag2 = Magazine.Cast(this);
11081 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11082 }
11083 else
11084 {
11086 }
11087 if (m_EM)
11088 {
11089 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11090 }
11091
11092 }
11093
11094 else if (action_id ==
EActions.SET_QUANTITY_0)
11095 {
11097
11098 if (m_EM)
11099 {
11100 m_EM.SetEnergy(0);
11101 }
11102 }
11103
11104 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11105 {
11107
11108 if (m_EM)
11109 {
11110 m_EM.SetEnergy(m_EM.GetEnergyMax());
11111 }
11112 }
11113
11114 else if (action_id ==
EActions.ADD_HEALTH)
11115 {
11116 AddHealth("","",GetMaxHealth("","Health")/5);
11117 }
11118 else if (action_id ==
EActions.REMOVE_HEALTH)
11119 {
11120 AddHealth("","",-GetMaxHealth("","Health")/5);
11121 }
11122 else if (action_id ==
EActions.DESTROY_HEALTH)
11123 {
11124 SetHealth01("","",0);
11125 }
11126 else if (action_id ==
EActions.WATCH_ITEM)
11127 {
11129 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11130 #ifdef DEVELOPER
11131 SetDebugDeveloper_item(this);
11132 #endif
11133 }
11134
11135 else if (action_id ==
EActions.ADD_TEMPERATURE)
11136 {
11137 AddTemperature(20);
11138
11139 }
11140
11141 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11142 {
11143 AddTemperature(-20);
11144
11145 }
11146
11147 else if (action_id ==
EActions.FLIP_FROZEN)
11148 {
11149 SetFrozen(!GetIsFrozen());
11150
11151 }
11152
11153 else if (action_id ==
EActions.ADD_WETNESS)
11154 {
11156
11157 }
11158
11159 else if (action_id ==
EActions.REMOVE_WETNESS)
11160 {
11162
11163 }
11164
11165 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11166 {
11169
11170
11171 }
11172
11173 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11174 {
11177 }
11178
11179 else if (action_id ==
EActions.MAKE_SPECIAL)
11180 {
11181 auto debugParams = DebugSpawnParams.WithPlayer(player);
11182 OnDebugSpawnEx(debugParams);
11183 }
11184
11185 }
11186
11187
11188 return false;
11189 }
11190
11191
11192
11193
11197
11200
11201
11202
11204 {
11205 return false;
11206 }
11207
11208
11210 {
11211 return true;
11212 }
11213
11214
11216 {
11217 return true;
11218 }
11219
11220
11221
11223 {
11224 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11225 return g_Game.ConfigIsExisting(config_path);
11226 }
11227
11230 {
11231 return null;
11232 }
11233
11235 {
11236 return false;
11237 }
11238
11240 {
11241 return false;
11242 }
11243
11247
11248
11250 {
11251 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11252 return module_repairing.CanRepair(this, item_repair_kit);
11253 }
11254
11255
11256 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11257 {
11258 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11259 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11260 }
11261
11262
11264 {
11265
11266
11267
11268
11269
11270
11271
11272
11273 return 1;
11274 }
11275
11276
11277
11279 {
11281 }
11282
11283
11284
11286 {
11288 }
11289
11290
11299 {
11300 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11301
11302 if (player)
11303 {
11304 player.MessageStatus(text);
11305 }
11306 }
11307
11308
11317 {
11318 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11319
11320 if (player)
11321 {
11322 player.MessageAction(text);
11323 }
11324 }
11325
11326
11335 {
11336 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11337
11338 if (player)
11339 {
11340 player.MessageFriendly(text);
11341 }
11342 }
11343
11344
11353 {
11354 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11355
11356 if (player)
11357 {
11358 player.MessageImportant(text);
11359 }
11360 }
11361
11363 {
11364 return true;
11365 }
11366
11367
11368 override bool KindOf(
string tag)
11369 {
11370 bool found = false;
11371 string item_name = this.
GetType();
11373 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11374
11375 int array_size = item_tag_array.Count();
11376 for (int i = 0; i < array_size; i++)
11377 {
11378 if (item_tag_array.Get(i) == tag)
11379 {
11380 found = true;
11381 break;
11382 }
11383 }
11384 return found;
11385 }
11386
11387
11389 {
11390
11391 super.OnRPC(sender, rpc_type,ctx);
11392
11393
11394 switch (rpc_type)
11395 {
11396 #ifndef SERVER
11397 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11398 Param2<bool, string> p = new Param2<bool, string>(false, "");
11399
11401 return;
11402
11403 bool play = p.param1;
11404 string soundSet = p.param2;
11405
11406 if (play)
11407 {
11409 {
11411 {
11413 }
11414 }
11415 else
11416 {
11418 }
11419 }
11420 else
11421 {
11423 }
11424
11425 break;
11426 #endif
11427
11428 }
11429
11431 {
11433 }
11434 }
11435
11436
11437
11438
11440 {
11441 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11442 return plugin.GetID(
name);
11443 }
11444
11446 {
11447 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11448 return plugin.GetName(id);
11449 }
11450
11453 {
11454
11455
11456 int varFlags;
11457 if (!ctx.
Read(varFlags))
11458 return;
11459
11460 if (varFlags & ItemVariableFlags.FLOAT)
11461 {
11463 }
11464 }
11465
11467 {
11468
11469 super.SerializeNumericalVars(floats_out);
11470
11471
11472
11474 {
11476 }
11477
11479 {
11481 }
11482
11484 {
11486 }
11487
11489 {
11494 }
11495
11497 {
11499 }
11500 }
11501
11503 {
11504
11505 super.DeSerializeNumericalVars(floats);
11506
11507
11508 int index = 0;
11509 int mask = Math.Round(floats.Get(index));
11510
11511 index++;
11512
11514 {
11516 {
11518 }
11519 else
11520 {
11521 float quantity = floats.Get(index);
11522 SetQuantity(quantity,
true,
false,
false,
false);
11523 }
11524 index++;
11525 }
11526
11528 {
11529 float wet = floats.Get(index);
11531 index++;
11532 }
11533
11535 {
11536 int liquidtype = Math.Round(floats.Get(index));
11538 index++;
11539 }
11540
11542 {
11544 index++;
11546 index++;
11548 index++;
11550 index++;
11551 }
11552
11554 {
11555 int cleanness = Math.Round(floats.Get(index));
11557 index++;
11558 }
11559 }
11560
11562 {
11563 super.WriteVarsToCTX(ctx);
11564
11565
11567 {
11569 }
11570
11572 {
11574 }
11575
11577 {
11579 }
11580
11582 {
11583 int r,g,b,a;
11589 }
11590
11592 {
11594 }
11595 }
11596
11598 {
11599 if (!super.ReadVarsFromCTX(ctx,version))
11600 return false;
11601
11602 int intValue;
11603 float value;
11604
11605 if (version < 140)
11606 {
11607 if (!ctx.
Read(intValue))
11608 return false;
11609
11610 m_VariablesMask = intValue;
11611 }
11612
11614 {
11615 if (!ctx.
Read(value))
11616 return false;
11617
11619 {
11621 }
11622 else
11623 {
11625 }
11626 }
11627
11628 if (version < 140)
11629 {
11631 {
11632 if (!ctx.
Read(value))
11633 return false;
11634 SetTemperatureDirect(value);
11635 }
11636 }
11637
11639 {
11640 if (!ctx.
Read(value))
11641 return false;
11643 }
11644
11646 {
11647 if (!ctx.
Read(intValue))
11648 return false;
11650 }
11651
11653 {
11654 int r,g,b,a;
11656 return false;
11658 return false;
11660 return false;
11662 return false;
11663
11665 }
11666
11668 {
11669 if (!ctx.
Read(intValue))
11670 return false;
11672 }
11673
11674 if (version >= 138 && version < 140)
11675 {
11677 {
11678 if (!ctx.
Read(intValue))
11679 return false;
11680 SetFrozen(intValue);
11681 }
11682 }
11683
11684 return true;
11685 }
11686
11687
11689 {
11692 {
11694 }
11695
11696 if (!super.OnStoreLoad(ctx, version))
11697 {
11699 return false;
11700 }
11701
11702 if (version >= 114)
11703 {
11704 bool hasQuickBarIndexSaved;
11705
11706 if (!ctx.
Read(hasQuickBarIndexSaved))
11707 {
11709 return false;
11710 }
11711
11712 if (hasQuickBarIndexSaved)
11713 {
11714 int itmQBIndex;
11715
11716
11717 if (!ctx.
Read(itmQBIndex))
11718 {
11720 return false;
11721 }
11722
11723 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11724 if (itmQBIndex != -1 && parentPlayer)
11725 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11726 }
11727 }
11728 else
11729 {
11730
11731 PlayerBase player;
11732 int itemQBIndex;
11733 if (version ==
int.
MAX)
11734 {
11735 if (!ctx.
Read(itemQBIndex))
11736 {
11738 return false;
11739 }
11740 }
11741 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11742 {
11743
11744 if (!ctx.
Read(itemQBIndex))
11745 {
11747 return false;
11748 }
11749 if (itemQBIndex != -1 && player)
11750 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11751 }
11752 }
11753
11754 if (version < 140)
11755 {
11756
11757 if (!LoadVariables(ctx, version))
11758 {
11760 return false;
11761 }
11762 }
11763
11764
11766 {
11768 return false;
11769 }
11770 if (version >= 132)
11771 {
11773 if (raib)
11774 {
11776 {
11778 return false;
11779 }
11780 }
11781 }
11782
11784 return true;
11785 }
11786
11787
11788
11790 {
11791 super.OnStoreSave(ctx);
11792
11793 PlayerBase player;
11794 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11795 {
11797
11798 int itemQBIndex = -1;
11799 itemQBIndex = player.FindQuickBarEntityIndex(this);
11800 ctx.
Write(itemQBIndex);
11801 }
11802 else
11803 {
11805 }
11806
11808
11810 if (raib)
11811 {
11813 }
11814 }
11815
11816
11818 {
11819 super.AfterStoreLoad();
11820
11822 {
11824 }
11825
11827 {
11830 }
11831 }
11832
11834 {
11835 super.EEOnAfterLoad();
11836
11838 {
11840 }
11841
11844 }
11845
11847 {
11848 return false;
11849 }
11850
11851
11852
11854 {
11856 {
11857 #ifdef PLATFORM_CONSOLE
11858
11860 {
11862 if (menu)
11863 {
11865 }
11866 }
11867 #endif
11868 }
11869
11871 {
11874 }
11875
11877 {
11878 SetWeightDirty();
11880 }
11882 {
11885 }
11886
11888 {
11891
11894 }
11896 {
11900 }
11901
11902 super.OnVariablesSynchronized();
11903 }
11904
11905
11906
11908 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11909 {
11910 if (!IsServerCheck(allow_client))
11911 return false;
11912
11914 return false;
11915
11918
11919 if (value <= (min + 0.001))
11920 value = min;
11921
11922 if (value == min)
11923 {
11924 if (destroy_config)
11925 {
11926 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11927 if (dstr)
11928 {
11930 this.Delete();
11931 return true;
11932 }
11933 }
11934 else if (destroy_forced)
11935 {
11937 this.Delete();
11938 return true;
11939 }
11940
11942 }
11943
11946
11948 {
11949 EntityAI parent = GetHierarchyRoot();
11950 InventoryLocation iLoc = new InventoryLocation();
11951 GetInventory().GetCurrentInventoryLocation(iLoc);
11953 {
11954 int iLocSlot = iLoc.
GetSlot();
11956 {
11958 }
11960 {
11962 }
11963 }
11964 }
11965
11967 {
11969
11970 if (delta)
11972 }
11973
11975
11976 return false;
11977 }
11978
11979
11981 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11982 {
11984 }
11985
11987 {
11990 }
11991
11993 {
11996 }
11997
11999 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12000 {
12001 float value_clamped = Math.Clamp(value, 0, 1);
12003 SetQuantity(result, destroy_config, destroy_forced);
12004 }
12005
12006
12009 {
12011 }
12012
12014 {
12016 }
12017
12018
12019
12020
12021
12022
12023
12024
12025
12026
12028 {
12029 int slot = -1;
12030 GameInventory inventory = GetInventory();
12031 if (inventory)
12032 {
12033 InventoryLocation il = new InventoryLocation;
12036 }
12037
12039 }
12040
12042 {
12043 float quantity_max = 0;
12044
12046 {
12047 if (attSlotID != -1)
12048 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12049
12050 if (quantity_max <= 0)
12052 }
12053
12054 if (quantity_max <= 0)
12056
12057 return quantity_max;
12058 }
12059
12061 {
12063 }
12064
12066 {
12068 }
12069
12070
12072 {
12074 }
12075
12077 {
12079 }
12080
12082 {
12084 }
12085
12086
12088 {
12089
12090 float weightEx = GetWeightEx();
12091 float special = GetInventoryAndCargoWeight();
12092 return weightEx - special;
12093 }
12094
12095
12097 {
12099 }
12100
12102 {
12104 {
12105 #ifdef DEVELOPER
12106 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12107 {
12108 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12110 }
12111 #endif
12112
12113 return GetQuantity() * GetConfigWeightModified();
12114 }
12115 else if (HasEnergyManager())
12116 {
12117 #ifdef DEVELOPER
12118 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12119 {
12120 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12121 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12122 }
12123 #endif
12124 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12125 }
12126 else
12127 {
12128 #ifdef DEVELOPER
12129 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12130 {
12131 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12132 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12133 }
12134 #endif
12135 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12136 }
12137 }
12138
12141 {
12142 int item_count = 0;
12144
12145 GameInventory inventory = GetInventory();
12146 CargoBase cargo = inventory.
GetCargo();
12147 if (cargo != NULL)
12148 {
12150 }
12151
12153 for (int i = 0; i < nAttachments; ++i)
12154 {
12156 if (item)
12157 item_count += item.GetNumberOfItems();
12158 }
12159 return item_count;
12160 }
12161
12164 {
12165 float weight = 0;
12166 float wetness = 1;
12167 if (include_wetness)
12170 {
12171 weight = wetness * m_ConfigWeight;
12172 }
12174 {
12175 weight = 1;
12176 }
12177 return weight;
12178 }
12179
12180
12181
12183 {
12184 GameInventory inventory = GetInventory();
12185 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12186 {
12187 array<EntityAI> items = new array<EntityAI>;
12189 for (int i = 0; i < items.Count(); ++i)
12190 {
12192 if (item)
12193 {
12194 g_Game.ObjectDelete(item);
12195 }
12196 }
12197 }
12198 }
12199
12200
12201
12202
12204 {
12205 float energy = 0;
12206 if (HasEnergyManager())
12207 {
12208 energy = GetCompEM().GetEnergy();
12209 }
12210 return energy;
12211 }
12212
12213
12215 {
12216 super.OnEnergyConsumed();
12217
12219 }
12220
12222 {
12223 super.OnEnergyAdded();
12224
12226 }
12227
12228
12230 {
12231 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12232 {
12234 {
12235 float energy_0to1 = GetCompEM().GetEnergy0To1();
12237 }
12238 }
12239 }
12240
12241
12243 {
12244 return ConfigGetFloat("heatIsolation");
12245 }
12246
12248 {
12250 }
12251
12253 {
12254 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12255 if (
g_Game.ConfigIsExisting(paramPath))
12256 return g_Game.ConfigGetFloat(paramPath);
12257
12258 return 0.0;
12259 }
12260
12262 {
12263 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12264 if (
g_Game.ConfigIsExisting(paramPath))
12265 return g_Game.ConfigGetFloat(paramPath);
12266
12267 return 0.0;
12268 }
12269
12270 override void SetWet(
float value,
bool allow_client =
false)
12271 {
12272 if (!IsServerCheck(allow_client))
12273 return;
12274
12277
12279
12280 m_VarWet = Math.Clamp(value, min, max);
12281
12283 {
12286 }
12287 }
12288
12289 override void AddWet(
float value)
12290 {
12292 }
12293
12295 {
12297 }
12298
12300 {
12302 }
12303
12305 {
12307 }
12308
12310 {
12312 }
12313
12315 {
12317 }
12318
12319 override void OnWetChanged(
float newVal,
float oldVal)
12320 {
12323 if (newLevel != oldLevel)
12324 {
12326 }
12327 }
12328
12330 {
12331 SetWeightDirty();
12332 }
12333
12335 {
12336 return GetWetLevelInternal(
m_VarWet);
12337 }
12338
12339
12340
12342 {
12344 }
12345
12347 {
12349 }
12350
12352 {
12354 }
12355
12357 {
12359 }
12360
12361
12362
12364 {
12365 if (ConfigIsExisting("itemModelLength"))
12366 {
12367 return ConfigGetFloat("itemModelLength");
12368 }
12369 return 0;
12370 }
12371
12373 {
12374 if (ConfigIsExisting("itemAttachOffset"))
12375 {
12376 return ConfigGetFloat("itemAttachOffset");
12377 }
12378 return 0;
12379 }
12380
12381 override void SetCleanness(
int value,
bool allow_client =
false)
12382 {
12383 if (!IsServerCheck(allow_client))
12384 return;
12385
12387
12389
12392 }
12393
12395 {
12397 }
12398
12400 {
12401 return true;
12402 }
12403
12404
12405
12406
12408 {
12410 }
12411
12413 {
12415 }
12416
12417
12418
12419
12420 override void SetColor(
int r,
int g,
int b,
int a)
12421 {
12427 }
12429 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12430 {
12435 }
12436
12438 {
12440 }
12441
12444 {
12445 int r,g,b,a;
12447 r = r/255;
12448 g = g/255;
12449 b = b/255;
12450 a = a/255;
12451 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12452 }
12453
12454
12455
12456 override void SetLiquidType(
int value,
bool allow_client =
false)
12457 {
12458 if (!IsServerCheck(allow_client))
12459 return;
12460
12465 }
12466
12468 {
12469 return ConfigGetInt("varLiquidTypeInit");
12470 }
12471
12473 {
12475 }
12476
12478 {
12480 SetFrozen(false);
12481 }
12482
12485 {
12486 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12487 }
12488
12489
12492 {
12493 PlayerBase nplayer;
12494 if (PlayerBase.CastTo(nplayer, player))
12495 {
12497 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12498 }
12499 }
12500
12501
12504 {
12505 PlayerBase nplayer;
12506 if (PlayerBase.CastTo(nplayer,player))
12507 {
12508 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12509 }
12510
12511 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12512
12513 if (HasEnergyManager())
12514 {
12515 GetCompEM().UpdatePlugState();
12516 }
12517 }
12518
12519
12521 {
12522 super.OnPlacementStarted(player);
12523
12525 }
12526
12527 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12528 {
12530 {
12531 m_AdminLog.OnPlacementComplete(player,
this);
12532 }
12533
12534 super.OnPlacementComplete(player, position, orientation);
12535 }
12536
12537
12538
12539
12540
12542 {
12544 {
12545 return true;
12546 }
12547 else
12548 {
12549 return false;
12550 }
12551 }
12552
12553
12555 {
12557 {
12559 }
12560 }
12561
12562
12564 {
12566 }
12567
12569 {
12571 }
12572
12573 override void InsertAgent(
int agent,
float count = 1)
12574 {
12575 if (count < 1)
12576 return;
12577
12579 }
12580
12583 {
12585 }
12586
12587
12589 {
12591 }
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12635 {
12637 return false;
12638 return true;
12639 }
12640
12642 {
12643
12645 }
12646
12647
12650 {
12651 super.CheckForRoofLimited(timeTresholdMS);
12652
12653 float time =
g_Game.GetTime();
12654 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12655 {
12656 m_PreviousRoofTestTime = time;
12657 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12658 }
12659 }
12660
12661
12663 {
12665 {
12666 return 0;
12667 }
12668
12669 if (GetInventory().GetAttachmentSlotsCount() != 0)
12670 {
12671 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12672 if (filter)
12673 return filter.GetProtectionLevel(type, false, system);
12674 else
12675 return 0;
12676 }
12677
12678 string subclassPath, entryName;
12679
12680 switch (type)
12681 {
12683 entryName = "biological";
12684 break;
12686 entryName = "chemical";
12687 break;
12688 default:
12689 entryName = "biological";
12690 break;
12691 }
12692
12693 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12694
12695 return g_Game.ConfigGetFloat(subclassPath + entryName);
12696 }
12697
12698
12699
12702 {
12703 if (!IsMagazine())
12705
12707 }
12708
12709
12710
12711
12712
12717 {
12718 return true;
12719 }
12720
12722 {
12724 }
12725
12726
12727
12728
12729
12731 {
12732 if (parent)
12733 {
12734 if (parent.IsInherited(DayZInfected))
12735 return true;
12736
12737 if (!parent.IsRuined())
12738 return true;
12739 }
12740
12741 return true;
12742 }
12743
12745 {
12746 if (!super.CanPutAsAttachment(parent))
12747 {
12748 return false;
12749 }
12750
12751 if (!IsRuined() && !parent.IsRuined())
12752 {
12753 return true;
12754 }
12755
12756 return false;
12757 }
12758
12760 {
12761
12762
12763
12764
12765 return super.CanReceiveItemIntoCargo(item);
12766 }
12767
12769 {
12770
12771
12772
12773
12774 GameInventory attachmentInv = attachment.GetInventory();
12776 {
12777 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12778 return false;
12779 }
12780
12781 InventoryLocation loc = new InventoryLocation();
12782 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12783 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12784 return false;
12785
12786 return super.CanReceiveAttachment(attachment, slotId);
12787 }
12788
12790 {
12791 if (!super.CanReleaseAttachment(attachment))
12792 return false;
12793
12794 return GetInventory().AreChildrenAccessible();
12795 }
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12818 {
12819 int id = muzzle_owner.GetMuzzleID();
12820 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12821
12822 if (WPOF_array)
12823 {
12824 for (int i = 0; i < WPOF_array.Count(); i++)
12825 {
12826 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12827
12828 if (WPOF)
12829 {
12830 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12831 }
12832 }
12833 }
12834 }
12835
12836
12838 {
12839 int id = muzzle_owner.GetMuzzleID();
12841
12842 if (WPOBE_array)
12843 {
12844 for (int i = 0; i < WPOBE_array.Count(); i++)
12845 {
12846 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12847
12848 if (WPOBE)
12849 {
12850 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12851 }
12852 }
12853 }
12854 }
12855
12856
12858 {
12859 int id = muzzle_owner.GetMuzzleID();
12860 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12861
12862 if (WPOOH_array)
12863 {
12864 for (int i = 0; i < WPOOH_array.Count(); i++)
12865 {
12866 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12867
12868 if (WPOOH)
12869 {
12870 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12871 }
12872 }
12873 }
12874 }
12875
12876
12878 {
12879 int id = muzzle_owner.GetMuzzleID();
12880 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12881
12882 if (WPOOH_array)
12883 {
12884 for (int i = 0; i < WPOOH_array.Count(); i++)
12885 {
12886 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12887
12888 if (WPOOH)
12889 {
12890 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12891 }
12892 }
12893 }
12894 }
12895
12896
12898 {
12899 int id = muzzle_owner.GetMuzzleID();
12900 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12901
12902 if (WPOOH_array)
12903 {
12904 for (int i = 0; i < WPOOH_array.Count(); i++)
12905 {
12906 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12907
12908 if (WPOOH)
12909 {
12910 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12911 }
12912 }
12913 }
12914 }
12915
12916
12917
12919 {
12921 {
12922 return true;
12923 }
12924
12925 return false;
12926 }
12927
12929 {
12931 {
12932 return true;
12933 }
12934
12935 return false;
12936 }
12937
12939 {
12941 {
12942 return true;
12943 }
12944
12945 return false;
12946 }
12947
12949 {
12950 return false;
12951 }
12952
12955 {
12956 return UATimeSpent.DEFAULT_DEPLOY;
12957 }
12958
12959
12960
12961
12963 {
12965 SetSynchDirty();
12966 }
12967
12969 {
12971 }
12972
12973
12975 {
12976 return false;
12977 }
12978
12981 {
12982 string att_type = "None";
12983
12984 if (ConfigIsExisting("soundAttType"))
12985 {
12986 att_type = ConfigGetString("soundAttType");
12987 }
12988
12990 }
12991
12993 {
12995 }
12996
12997
12998
12999
13000
13006
13008 {
13011
13013 }
13014
13015
13017 {
13019 return;
13020
13022
13025
13028
13029 SoundParameters params = new SoundParameters();
13033 }
13034
13035
13037 {
13039 {
13042
13043 SetSynchDirty();
13044
13047 }
13048 }
13049
13051 {
13053 }
13054
13055
13057 {
13059 return;
13060
13062 SetSynchDirty();
13063
13066 }
13067
13069 {
13072 }
13073
13075 {
13077 }
13078
13079 void OnApply(PlayerBase player);
13080
13082 {
13083 return 1.0;
13084 };
13085
13087 {
13089 }
13090
13092 {
13094 }
13095
13097
13099 {
13100 SetDynamicPhysicsLifeTime(0.01);
13102 }
13103
13105 {
13106 array<string> zone_names = new array<string>;
13107 GetDamageZones(zone_names);
13108 for (int i = 0; i < zone_names.Count(); i++)
13109 {
13110 SetHealthMax(zone_names.Get(i),"Health");
13111 }
13112 SetHealthMax("","Health");
13113 }
13114
13117 {
13118 float global_health = GetHealth01("","Health");
13119 array<string> zones = new array<string>;
13120 GetDamageZones(zones);
13121
13122 for (int i = 0; i < zones.Count(); i++)
13123 {
13124 SetHealth01(zones.Get(i),"Health",global_health);
13125 }
13126 }
13127
13130 {
13131 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13132 }
13133
13135 {
13136 if (!hasRootAsPlayer)
13137 {
13138 if (refParentIB)
13139 {
13140
13141 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13142 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13143
13144 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13145 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13146
13149 }
13150 else
13151 {
13152
13155 }
13156 }
13157 }
13158
13160 {
13162 {
13163 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13164 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13165 {
13166 float heatPermCoef = 1.0;
13168 while (ent)
13169 {
13170 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13171 ent = ent.GetHierarchyParent();
13172 }
13173
13174 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13175 }
13176 }
13177 }
13178
13180 {
13181
13182 EntityAI parent = GetHierarchyParent();
13183 if (!parent)
13184 {
13185 hasParent = false;
13186 hasRootAsPlayer = false;
13187 }
13188 else
13189 {
13190 hasParent = true;
13191 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13192 refParentIB =
ItemBase.Cast(parent);
13193 }
13194 }
13195
13196 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13197 {
13198
13199 }
13200
13202 {
13203
13204 return false;
13205 }
13206
13208 {
13209
13210
13211 return false;
13212 }
13213
13215 {
13216
13217 return false;
13218 }
13219
13222 {
13223 return !GetIsFrozen() &&
IsOpen();
13224 }
13225
13227 {
13228 bool hasParent = false, hasRootAsPlayer = false;
13230
13231 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13232 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13233
13234 if (wwtu || foodDecay)
13235 {
13239
13240 if (processWetness || processTemperature || processDecay)
13241 {
13243
13244 if (processWetness)
13245 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13246
13247 if (processTemperature)
13249
13250 if (processDecay)
13251 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13252 }
13253 }
13254 }
13255
13258 {
13260 }
13261
13263 {
13266
13267 return super.GetTemperatureFreezeThreshold();
13268 }
13269
13271 {
13274
13275 return super.GetTemperatureThawThreshold();
13276 }
13277
13279 {
13282
13283 return super.GetItemOverheatThreshold();
13284 }
13285
13287 {
13289 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13290
13291 return super.GetTemperatureFreezeTime();
13292 }
13293
13295 {
13297 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13298
13299 return super.GetTemperatureThawTime();
13300 }
13301
13306
13308 {
13309 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13310 }
13311
13313 {
13314 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13315 }
13316
13319 {
13321 }
13322
13324 {
13326 }
13327
13329 {
13331 }
13332
13335 {
13336 return null;
13337 }
13338
13341 {
13342 return false;
13343 }
13344
13346 {
13348 {
13351 if (!trg)
13352 {
13354 explosive = this;
13355 }
13356
13357 explosive.PairRemote(trg);
13359
13360 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13361 trg.SetPersistentPairID(persistentID);
13362 explosive.SetPersistentPairID(persistentID);
13363
13364 return true;
13365 }
13366 return false;
13367 }
13368
13371 {
13372 float ret = 1.0;
13375 ret *= GetHealth01();
13376
13377 return ret;
13378 }
13379
13380 #ifdef DEVELOPER
13381 override void SetDebugItem()
13382 {
13383 super.SetDebugItem();
13384 _itemBase = this;
13385 }
13386
13388 {
13389 string text = super.GetDebugText();
13390
13392 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13393
13394 return text;
13395 }
13396 #endif
13397
13399 {
13400 return true;
13401 }
13402
13404
13406
13408 {
13411 }
13412
13413
13421
13437
13438 [
Obsolete(
"Use ItemSoundHandler instead")]
13441 {
13442 if (!
g_Game.IsDedicatedServer())
13443 {
13444 if (ConfigIsExisting("attachSoundSet"))
13445 {
13446 string cfg_path = "";
13447 string soundset = "";
13448 string type_name =
GetType();
13449
13452 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13453 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13454
13455 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13456 {
13457 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13458 {
13459 if (cfg_slot_array[i] == slot_type)
13460 {
13461 soundset = cfg_soundset_array[i];
13462 break;
13463 }
13464 }
13465 }
13466
13467 if (soundset != "")
13468 {
13469 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13471 }
13472 }
13473 }
13474 }
13475
13477}
13478
13480{
13482 if (entity)
13483 {
13484 bool is_item = entity.IsInherited(
ItemBase);
13485 if (is_item && full_quantity)
13486 {
13489 }
13490 }
13491 else
13492 {
13494 return NULL;
13495 }
13496 return entity;
13497}
13498
13500{
13501 if (item)
13502 {
13503 if (health > 0)
13504 item.SetHealth("", "", health);
13505
13506 if (item.CanHaveTemperature())
13507 {
13509 if (item.CanFreeze())
13510 item.SetFrozen(false);
13511 }
13512
13513 if (item.HasEnergyManager())
13514 {
13515 if (quantity >= 0)
13516 {
13517 item.GetCompEM().SetEnergy0To1(quantity);
13518 }
13519 else
13520 {
13522 }
13523 }
13524 else if (item.IsMagazine())
13525 {
13526 Magazine mag = Magazine.Cast(item);
13527 if (quantity >= 0)
13528 {
13529 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13530 }
13531 else
13532 {
13534 }
13535
13536 }
13537 else
13538 {
13539 if (quantity >= 0)
13540 {
13541 item.SetQuantityNormalized(quantity, false);
13542 }
13543 else
13544 {
13546 }
13547
13548 }
13549 }
13550}
13551
13552#ifdef DEVELOPER
13554#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
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)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.