8690{
8692 {
8693 return true;
8694 }
8695};
8696
8698{
8699
8700};
8701
8702
8703
8705{
8709
8711
8714
8715
8716
8717
8718
8727
8733
8738
8743
8764 protected bool m_IsResultOfSplit
8765
8767
8772
8773
8774
8776
8780
8781
8782
8784
8787
8788
8789
8795
8796
8804
8807
8808
8810
8811
8813
8814
8819
8820
8825
8827
8828
8830
8831
8833 {
8838
8839 if (!
g_Game.IsDedicatedServer())
8840 {
8842 {
8844
8846 {
8848 }
8849 }
8850
8853 }
8854
8855 m_OldLocation = null;
8856
8858 {
8860 }
8861
8862 if (ConfigIsExisting("headSelectionsToHide"))
8863 {
8866 }
8867
8869 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8870 {
8872 }
8873
8875
8876 m_IsResultOfSplit = false;
8877
8879 }
8880
8882 {
8883 super.InitItemVariables();
8884
8890 m_Count = ConfigGetInt(
"count");
8891
8894
8899
8902
8907
8919
8923
8924
8927 if (ConfigIsExisting("canBeSplit"))
8928 {
8931 }
8932
8934 if (ConfigIsExisting("itemBehaviour"))
8936
8937
8940 RegisterNetSyncVariableInt("m_VarLiquidType");
8941 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8942
8943 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8944 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8945 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8946
8947 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8948 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8949 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8950 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8951
8952 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8953 RegisterNetSyncVariableBool("m_IsTakeable");
8954 RegisterNetSyncVariableBool("m_IsHologram");
8955
8958 {
8961 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8962 }
8963
8965
8967 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8969
8971 }
8972
8974 {
8976 }
8977
8979 {
8982 {
8987 }
8988 }
8989
8990 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8991 {
8993 {
8996 }
8997
8999 }
9000
9002 {
9008 }
9009
9011
9013 {
9015
9016 if (!action)
9017 {
9018 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9019 return;
9020 }
9021
9023 if (!ai)
9024 {
9026 return;
9027 }
9028
9030 if (!action_array)
9031 {
9032 action_array = new array<ActionBase_Basic>;
9034 }
9035 if (LogManager.IsActionLogEnable())
9036 {
9037 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9038 }
9039
9040 if (action_array.Find(action) != -1)
9041 {
9042 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9043 }
9044 else
9045 {
9046 action_array.Insert(action);
9047 }
9048 }
9049
9051 {
9052 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9053 ActionBase action = player.GetActionManager().GetAction(actionName);
9056
9057 if (action_array)
9058 {
9059 action_array.RemoveItem(action);
9060 }
9061 }
9062
9063
9064
9066 {
9067 ActionOverrideData overrideData = new ActionOverrideData();
9071
9073 if (!actionMap)
9074 {
9077 }
9078
9079 actionMap.Insert(this.
Type(), overrideData);
9080
9081 }
9082
9084
9086
9087
9089 {
9092
9095
9096 string config_to_search = "CfgVehicles";
9097 string muzzle_owner_config;
9098
9100 {
9101 if (IsInherited(Weapon))
9102 config_to_search = "CfgWeapons";
9103
9104 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9105
9106 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9107
9108 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9109
9110 if (config_OnFire_subclass_count > 0)
9111 {
9112 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9113
9114 for (int i = 0; i < config_OnFire_subclass_count; i++)
9115 {
9116 string particle_class = "";
9117 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9118 string config_OnFire_entry = config_OnFire_class + particle_class;
9119 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9120 WPOF_array.Insert(WPOF);
9121 }
9122
9123
9125 }
9126 }
9127
9129 {
9130 config_to_search = "CfgWeapons";
9131 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9132
9133 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9134
9135 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9136
9137 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9138 {
9139 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9140
9141 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9142 {
9143 string particle_class2 = "";
9144 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9145 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9146 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9147 WPOBE_array.Insert(WPOBE);
9148 }
9149
9150
9152 }
9153 }
9154 }
9155
9156
9158 {
9161
9163 {
9164 string config_to_search = "CfgVehicles";
9165
9166 if (IsInherited(Weapon))
9167 config_to_search = "CfgWeapons";
9168
9169 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9170 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9171
9172 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9173 {
9174
9176
9178 {
9180 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9182 return;
9183 }
9184
9187
9188
9189
9190 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9191 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9192
9193 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9194 {
9195 string particle_class = "";
9196 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9197 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9198 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9199
9200 if (entry_type == CT_CLASS)
9201 {
9202 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9203 WPOOH_array.Insert(WPOF);
9204 }
9205 }
9206
9207
9209 }
9210 }
9211 }
9212
9214 {
9216 }
9217
9219 {
9221 {
9223
9226
9229
9230 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9231 }
9232 }
9233
9235 {
9237 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9238
9240 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9241
9243 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9244
9246 {
9248 }
9249 }
9250
9252 {
9254 }
9255
9257 {
9260 else
9262
9264 {
9267 }
9268 else
9269 {
9272
9275 }
9276
9278 }
9279
9281 {
9283 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9284 }
9285
9287 {
9289 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9291 }
9292
9294 {
9296 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9297 }
9298
9300 {
9303
9304 OverheatingParticle OP = new OverheatingParticle();
9309
9311 }
9312
9314 {
9317
9318 return -1;
9319 }
9320
9322 {
9324 {
9327
9328 for (int i = count; i > 0; --i)
9329 {
9330 int id = i - 1;
9333
9336
9337 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9338 {
9339 if (p)
9340 {
9343 }
9344 }
9345 }
9346 }
9347 }
9348
9350 {
9352 {
9354 {
9355 int id = i - 1;
9357
9358 if (OP)
9359 {
9361
9362 if (p)
9363 {
9365 }
9366
9367 delete OP;
9368 }
9369 }
9370
9373 }
9374 }
9375
9378 {
9379 return 0.0;
9380 }
9381
9382
9384 {
9385 return 250;
9386 }
9387
9389 {
9390 return 0;
9391 }
9392
9395 {
9397 return true;
9398
9399 return false;
9400 }
9401
9404 {
9407
9409 {
9411 }
9412 else
9413 {
9414
9416 }
9417
9419 }
9420
9427 {
9428 return -1;
9429 }
9430
9431
9432
9433
9435 {
9437 {
9438 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9439 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9440
9441 if (r_index >= 0)
9442 {
9443 InventoryLocation r_il = new InventoryLocation;
9444 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9445
9446 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9449 {
9450 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9451 }
9453 {
9454 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9455 }
9456
9457 }
9458
9459 player.GetHumanInventory().ClearUserReservedLocation(this);
9460 }
9461
9464 }
9465
9466
9467
9468
9470 {
9471 return ItemBase.m_DebugActionsMask;
9472 }
9473
9475 {
9476 return ItemBase.m_DebugActionsMask & mask;
9477 }
9478
9480 {
9481 ItemBase.m_DebugActionsMask = mask;
9482 }
9483
9485 {
9486 ItemBase.m_DebugActionsMask |= mask;
9487 }
9488
9490 {
9491 ItemBase.m_DebugActionsMask &= ~mask;
9492 }
9493
9495 {
9497 {
9499 }
9500 else
9501 {
9503 }
9504 }
9505
9506
9508 {
9509 if (GetEconomyProfile())
9510 {
9511 float q_max = GetEconomyProfile().GetQuantityMax();
9512 if (q_max > 0)
9513 {
9514 float q_min = GetEconomyProfile().GetQuantityMin();
9515 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9516
9518 {
9519 ComponentEnergyManager comp = GetCompEM();
9521 {
9523 }
9524 }
9526 {
9528
9529 }
9530
9531 }
9532 }
9533 }
9534
9537 {
9538 EntityAI parent = GetHierarchyParent();
9539
9540 if (parent)
9541 {
9542 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9543 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9544 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9545 }
9546 }
9547
9550 {
9551 EntityAI parent = GetHierarchyParent();
9552
9553 if (parent)
9554 {
9555 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9556 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9557 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9558 }
9559 }
9560
9562 {
9563
9564
9565
9566
9568
9570 {
9571 if (ScriptInputUserData.CanStoreInputUserData())
9572 {
9573 ScriptInputUserData ctx = new ScriptInputUserData;
9579 ctx.
Write(use_stack_max);
9582
9584 {
9585 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9586 }
9587 }
9588 }
9589 else if (!
g_Game.IsMultiplayer())
9590 {
9592 }
9593 }
9594
9596 {
9598 }
9599
9601 {
9603 }
9604
9606 {
9608 }
9609
9611 {
9612
9613 return false;
9614 }
9615
9617 {
9618 return false;
9619 }
9620
9624 {
9625 return false;
9626 }
9627
9629 {
9630 return "";
9631 }
9632
9634
9636 {
9637 return false;
9638 }
9639
9641 {
9642 return true;
9643 }
9644
9645
9646
9648 {
9649 return true;
9650 }
9651
9653 {
9654 return true;
9655 }
9656
9658 {
9659 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9661 }
9662
9664 {
9666 }
9667
9669 {
9671 if (!is_being_placed)
9673 SetSynchDirty();
9674 }
9675
9676
9678
9680 {
9682 }
9683
9685 {
9687 }
9688
9690 {
9691 return 1;
9692 }
9693
9695 {
9696 return false;
9697 }
9698
9700 {
9702 SetSynchDirty();
9703 }
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9740 {
9741 super.OnMovedInsideCargo(container);
9742
9743 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9744 }
9745
9746 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9747 {
9748 super.EEItemLocationChanged(oldLoc, newLoc);
9749
9750 PlayerBase newPlayer = null;
9751 PlayerBase oldPlayer = null;
9752
9753 if (newLoc.GetParent())
9754 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9755
9756 if (oldLoc.GetParent())
9757 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9758
9760 {
9761 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9762
9763 if (rIndex >= 0)
9764 {
9765 InventoryLocation rIl = new InventoryLocation;
9766 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9767
9768 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9771 {
9772 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9773 }
9775 {
9777 }
9778
9779 }
9780 }
9781
9783 {
9784 if (newPlayer)
9785 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9786
9787 if (newPlayer == oldPlayer)
9788 {
9789 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9790 {
9792 {
9793 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9794 {
9795 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9796 }
9797 }
9798 else
9799 {
9800 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9801 }
9802 }
9803
9804 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9805 {
9806 int type = oldLoc.GetType();
9808 {
9809 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9810 }
9812 {
9813 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9814 }
9815 }
9816 if (!m_OldLocation)
9817 {
9818 m_OldLocation = new InventoryLocation;
9819 }
9820 m_OldLocation.Copy(oldLoc);
9821 }
9822 else
9823 {
9824 if (m_OldLocation)
9825 {
9826 m_OldLocation.Reset();
9827 }
9828 }
9829
9830 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9831 }
9832 else
9833 {
9834 if (newPlayer)
9835 {
9836 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9837 if (resIndex >= 0)
9838 {
9839 InventoryLocation il = new InventoryLocation;
9840 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9842 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9845 {
9846 il.
GetParent().GetOnReleaseLock().Invoke(it);
9847 }
9849 {
9851 }
9852
9853 }
9854 }
9856 {
9857
9859 }
9860
9861 if (m_OldLocation)
9862 {
9863 m_OldLocation.Reset();
9864 }
9865 }
9866
9868 {
9869 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9870 }
9871
9873 {
9874 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9875 }
9876 }
9877
9878 override void EOnContact(IEntity other, Contact extra)
9879 {
9881 {
9882 int liquidType = -1;
9884 if (impactSpeed > 0.0)
9885 {
9887 #ifndef SERVER
9889 #else
9891 SetSynchDirty();
9892 #endif
9894 }
9895 }
9896
9897 #ifdef SERVER
9898 if (GetCompEM() && GetCompEM().IsPlugged())
9899 {
9900 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9901 GetCompEM().UnplugThis();
9902 }
9903 #endif
9904 }
9905
9907
9909 {
9911 }
9912
9914 {
9915
9916 }
9917
9919 {
9920 super.OnItemLocationChanged(old_owner, new_owner);
9921
9922 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9923 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9924
9925 if (!relatedPlayer && playerNew)
9926 relatedPlayer = playerNew;
9927
9928 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9929 {
9931 if (actionMgr)
9932 {
9933 ActionBase currentAction = actionMgr.GetRunningAction();
9934 if (currentAction)
9936 }
9937 }
9938
9939 Man ownerPlayerOld = null;
9940 Man ownerPlayerNew = null;
9941
9942 if (old_owner)
9943 {
9944 if (old_owner.
IsMan())
9945 {
9946 ownerPlayerOld = Man.Cast(old_owner);
9947 }
9948 else
9949 {
9950 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9951 }
9952 }
9953 else
9954 {
9956 {
9958
9959 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9960 {
9961 GetCompEM().UnplugThis();
9962 }
9963 }
9964 }
9965
9966 if (new_owner)
9967 {
9968 if (new_owner.
IsMan())
9969 {
9970 ownerPlayerNew = Man.Cast(new_owner);
9971 }
9972 else
9973 {
9974 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9975 }
9976 }
9977
9978 if (ownerPlayerOld != ownerPlayerNew)
9979 {
9980 if (ownerPlayerOld)
9981 {
9982 array<EntityAI> subItemsExit = new array<EntityAI>;
9984 for (int i = 0; i < subItemsExit.Count(); i++)
9985 {
9988 }
9989 }
9990
9991 if (ownerPlayerNew)
9992 {
9993 array<EntityAI> subItemsEnter = new array<EntityAI>;
9995 for (int j = 0; j < subItemsEnter.Count(); j++)
9996 {
9999 }
10000 }
10001 }
10002 else if (ownerPlayerNew != null)
10003 {
10004 PlayerBase nplayer;
10005 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10006 {
10007 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10009 for (int k = 0; k < subItemsUpdate.Count(); k++)
10010 {
10012 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10013 }
10014 }
10015 }
10016
10017 if (old_owner)
10018 old_owner.OnChildItemRemoved(this);
10019 if (new_owner)
10020 new_owner.OnChildItemReceived(this);
10021 }
10022
10023
10025 {
10026 super.EEDelete(parent);
10027 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10028 if (player)
10029 {
10031
10032 if (player.IsAlive())
10033 {
10034 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10035 if (r_index >= 0)
10036 {
10037 InventoryLocation r_il = new InventoryLocation;
10038 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10039
10040 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10043 {
10044 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10045 }
10047 {
10048 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10049 }
10050
10051 }
10052
10053 player.RemoveQuickBarEntityShortcut(this);
10054 }
10055 }
10056 }
10057
10059 {
10060 super.EEKilled(killer);
10061
10064 {
10065 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10066 {
10067 if (IsMagazine())
10068 {
10069 if (Magazine.Cast(this).GetAmmoCount() > 0)
10070 {
10072 }
10073 }
10074 else
10075 {
10077 }
10078 }
10079 }
10080 }
10081
10083 {
10084 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10085
10086 super.OnWasAttached(parent, slot_id);
10087
10090
10093 }
10094
10096 {
10097 super.OnWasDetached(parent, slot_id);
10098
10101
10104 }
10105
10107 {
10108 int idx;
10111
10112 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10113 if (inventory_slots.Count() < 1)
10114 {
10115 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10116 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10117 }
10118 else
10119 {
10120 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10121 }
10122
10123 idx = inventory_slots.Find(slot);
10124 if (idx < 0)
10125 return "";
10126
10127 return attach_types.Get(idx);
10128 }
10129
10131 {
10132 int idx = -1;
10133 string slot;
10134
10137
10138 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10139 if (inventory_slots.Count() < 1)
10140 {
10141 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10142 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10143 }
10144 else
10145 {
10146 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10147 if (detach_types.Count() < 1)
10148 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10149 }
10150
10151 for (int i = 0; i < inventory_slots.Count(); i++)
10152 {
10153 slot = inventory_slots.Get(i);
10154 }
10155
10156 if (slot != "")
10157 {
10158 if (detach_types.Count() == 1)
10159 idx = 0;
10160 else
10161 idx = inventory_slots.Find(slot);
10162 }
10163 if (idx < 0)
10164 return "";
10165
10166 return detach_types.Get(idx);
10167 }
10168
10170 {
10171
10173
10174
10175 float min_time = 1;
10176 float max_time = 3;
10177 float delay = Math.RandomFloat(min_time, max_time);
10178
10179 explode_timer.Run(delay, this, "DoAmmoExplosion");
10180 }
10181
10183 {
10184 Magazine magazine = Magazine.Cast(this);
10185 int pop_sounds_count = 6;
10186 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10187
10188
10189 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10190 string sound_name = pop_sounds[ sound_idx ];
10191 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10192
10193
10194 magazine.ServerAddAmmoCount(-1);
10195
10196
10197 float min_temp_to_explode = 100;
10198
10199 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10200 {
10202 }
10203 }
10204
10205
10206 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10207 {
10208 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10209
10210 const int CHANCE_DAMAGE_CARGO = 4;
10211 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10212 const int CHANCE_DAMAGE_NOTHING = 2;
10213
10215 {
10216 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10217 int chances;
10218 int rnd;
10219
10220 if (GetInventory().GetCargo())
10221 {
10222 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10223 rnd = Math.RandomInt(0,chances);
10224
10225 if (rnd < CHANCE_DAMAGE_CARGO)
10226 {
10228 }
10229 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10230 {
10232 }
10233 }
10234 else
10235 {
10236 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10237 rnd = Math.RandomInt(0,chances);
10238
10239 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10240 {
10242 }
10243 }
10244 }
10245 }
10246
10248 {
10249 CargoBase cargo = GetInventory().GetCargo();
10250 if (cargo)
10251 {
10253 if (item_count > 0)
10254 {
10255 int random_pick = Math.RandomInt(0, item_count);
10257 if (!item.IsExplosive())
10258 {
10259 item.AddHealth("","",damage);
10260 return true;
10261 }
10262 }
10263 }
10264 return false;
10265 }
10266
10268 {
10269 GameInventory inventory = GetInventory();
10271 if (attachment_count > 0)
10272 {
10273 int random_pick = Math.RandomInt(0, attachment_count);
10275 if (!attachment.IsExplosive())
10276 {
10277 attachment.AddHealth("","",damage);
10278 return true;
10279 }
10280 }
10281 return false;
10282 }
10283
10285 {
10287 }
10288
10290 {
10292 return GetInventory().CanRemoveEntity();
10293
10294 return false;
10295 }
10296
10298 {
10299
10301 return false;
10302
10303
10305 return false;
10306
10307
10308
10310 if (delta == 0)
10311 return false;
10312
10313
10314 return true;
10315 }
10316
10318 {
10320 {
10321 if (ScriptInputUserData.CanStoreInputUserData())
10322 {
10323 ScriptInputUserData ctx = new ScriptInputUserData;
10328 ctx.
Write(destination_entity);
10330 ctx.
Write(slot_id);
10332 }
10333 }
10334 else if (!
g_Game.IsMultiplayer())
10335 {
10337 }
10338 }
10339
10341 {
10342 float split_quantity_new;
10346 InventoryLocation loc = new InventoryLocation;
10347
10348 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10349 {
10351 split_quantity_new = stack_max;
10352 else
10354
10356 {
10357 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10358 if (new_item)
10359 {
10360 new_item.SetResultOfSplit(true);
10361 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10363 new_item.
SetQuantity(split_quantity_new,
false,
true);
10364 }
10365 }
10366 }
10367 else if (destination_entity && slot_id == -1)
10368 {
10369 if (quantity > stack_max)
10370 split_quantity_new = stack_max;
10371 else
10372 split_quantity_new = quantity;
10373
10375 {
10376 GameInventory destinationInventory = destination_entity.GetInventory();
10378 {
10381 }
10382
10383 if (new_item)
10384 {
10385 new_item.SetResultOfSplit(true);
10386 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10388 new_item.
SetQuantity(split_quantity_new,
false,
true);
10389 }
10390 }
10391 }
10392 else
10393 {
10394 if (stack_max != 0)
10395 {
10397 {
10399 }
10400
10401 if (split_quantity_new == 0)
10402 {
10403 if (!
g_Game.IsMultiplayer())
10404 player.PhysicalPredictiveDropItem(this);
10405 else
10406 player.ServerDropEntity(this);
10407 return;
10408 }
10409
10411 {
10413
10414 if (new_item)
10415 {
10416 new_item.SetResultOfSplit(true);
10417 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10420 new_item.PlaceOnSurface();
10421 }
10422 }
10423 }
10424 }
10425 }
10426
10428 {
10429 float split_quantity_new;
10433 InventoryLocation loc = new InventoryLocation;
10434
10435 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10436 {
10438 split_quantity_new = stack_max;
10439 else
10441
10443 {
10444 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10445 if (new_item)
10446 {
10447 new_item.SetResultOfSplit(true);
10448 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10450 new_item.
SetQuantity(split_quantity_new,
false,
true);
10451 }
10452 }
10453 }
10454 else if (destination_entity && slot_id == -1)
10455 {
10456 if (quantity > stack_max)
10457 split_quantity_new = stack_max;
10458 else
10459 split_quantity_new = quantity;
10460
10462 {
10463 GameInventory destinationInventory = destination_entity.GetInventory();
10465 {
10468 }
10469
10470 if (new_item)
10471 {
10472 new_item.SetResultOfSplit(true);
10473 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10475 new_item.
SetQuantity(split_quantity_new,
false,
true);
10476 }
10477 }
10478 }
10479 else
10480 {
10481 if (stack_max != 0)
10482 {
10484 {
10486 }
10487
10489 {
10491
10492 if (new_item)
10493 {
10494 new_item.SetResultOfSplit(true);
10495 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10498 new_item.PlaceOnSurface();
10499 }
10500 }
10501 }
10502 }
10503 }
10504
10506 {
10508 {
10509 if (ScriptInputUserData.CanStoreInputUserData())
10510 {
10511 ScriptInputUserData ctx = new ScriptInputUserData;
10516 dst.WriteToContext(ctx);
10518 }
10519 }
10520 else if (!
g_Game.IsMultiplayer())
10521 {
10523 }
10524 }
10525
10527 {
10529 {
10530 if (ScriptInputUserData.CanStoreInputUserData())
10531 {
10532 ScriptInputUserData ctx = new ScriptInputUserData;
10537 ctx.
Write(destination_entity);
10543 }
10544 }
10545 else if (!
g_Game.IsMultiplayer())
10546 {
10548 }
10549 }
10550
10552 {
10554 }
10555
10557 {
10559 float split_quantity_new;
10561 if (dst.IsValid())
10562 {
10563 int slot_id = dst.GetSlot();
10565
10566 if (quantity > stack_max)
10567 split_quantity_new = stack_max;
10568 else
10569 split_quantity_new = quantity;
10570
10572 {
10574
10575 if (new_item)
10576 {
10577 new_item.SetResultOfSplit(true);
10578 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10580 new_item.
SetQuantity(split_quantity_new,
false,
true);
10581 }
10582
10583 return new_item;
10584 }
10585 }
10586
10587 return null;
10588 }
10589
10591 {
10593 float split_quantity_new;
10595 if (destination_entity)
10596 {
10598 if (quantity > stackable)
10599 split_quantity_new = stackable;
10600 else
10601 split_quantity_new = quantity;
10602
10604 {
10605 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10606 if (new_item)
10607 {
10608 new_item.SetResultOfSplit(true);
10609 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10611 new_item.
SetQuantity(split_quantity_new,
false,
true);
10612 }
10613 }
10614 }
10615 }
10616
10618 {
10620 {
10621 if (ScriptInputUserData.CanStoreInputUserData())
10622 {
10623 ScriptInputUserData ctx = new ScriptInputUserData;
10628 ItemBase destination_entity =
this;
10629 ctx.
Write(destination_entity);
10633 }
10634 }
10635 else if (!
g_Game.IsMultiplayer())
10636 {
10638 }
10639 }
10640
10642 {
10644 float split_quantity_new;
10646 if (player)
10647 {
10649 if (quantity > stackable)
10650 split_quantity_new = stackable;
10651 else
10652 split_quantity_new = quantity;
10653
10655 {
10656 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10657 new_item =
ItemBase.Cast(in_hands);
10658 if (new_item)
10659 {
10660 new_item.SetResultOfSplit(true);
10661 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10663 new_item.SetQuantity(split_quantity_new, false, true);
10664 }
10665 }
10666 }
10667 }
10668
10670 {
10672 float split_quantity_new = Math.Floor(quantity * 0.5);
10673
10675 return;
10676
10678
10679 if (new_item)
10680 {
10681 if (new_item.GetQuantityMax() < split_quantity_new)
10682 {
10683 split_quantity_new = new_item.GetQuantityMax();
10684 }
10685
10686 new_item.SetResultOfSplit(true);
10687 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10688
10690 {
10693 }
10694 else
10695 {
10697 new_item.
SetQuantity(split_quantity_new,
false,
true);
10698 }
10699 }
10700 }
10701
10703 {
10705 float split_quantity_new = Math.Floor(quantity / 2);
10706
10708 return;
10709
10710 InventoryLocation invloc = new InventoryLocation;
10712
10714 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10715
10716 if (new_item)
10717 {
10718 if (new_item.GetQuantityMax() < split_quantity_new)
10719 {
10720 split_quantity_new = new_item.GetQuantityMax();
10721 }
10723 {
10726 }
10727 else if (split_quantity_new > 1)
10728 {
10730 new_item.
SetQuantity(split_quantity_new,
false,
true);
10731 }
10732 }
10733 }
10734
10737 {
10738 SetWeightDirty();
10740
10741 if (parent)
10742 parent.OnAttachmentQuantityChangedEx(this, delta);
10743
10745 {
10747 {
10749 }
10751 {
10752 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10754 }
10755 }
10756 }
10757
10760 {
10761
10762 }
10763
10766 {
10768 }
10769
10771 {
10772 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10773
10775 {
10776 if (newLevel == GameConstants.STATE_RUINED)
10777 {
10779 EntityAI parent = GetHierarchyParent();
10780 if (parent && parent.IsFireplace())
10781 {
10782 CargoBase cargo = GetInventory().GetCargo();
10783 if (cargo)
10784 {
10786 {
10788 }
10789 }
10790 }
10791 }
10792
10794 {
10795
10797 return;
10798 }
10799
10800 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10801 {
10803 }
10804 }
10805 }
10806
10807
10809 {
10810 super.OnRightClick();
10811
10813 {
10815 {
10816 if (ScriptInputUserData.CanStoreInputUserData())
10817 {
10818 EntityAI root = GetHierarchyRoot();
10819 Man playerOwner = GetHierarchyRootPlayer();
10820 InventoryLocation dst = new InventoryLocation;
10821
10822
10823 if (!playerOwner && root && root == this)
10824 {
10826 }
10827 else
10828 {
10829
10830 GetInventory().GetCurrentInventoryLocation(dst);
10832 {
10833 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10835 {
10837 }
10838 else
10839 {
10841
10842
10843 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10844 {
10846 }
10847 else
10848 {
10849 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10850 }
10851 }
10852 }
10853 }
10854
10855 ScriptInputUserData ctx = new ScriptInputUserData;
10863 }
10864 }
10865 else if (!
g_Game.IsMultiplayer())
10866 {
10868 }
10869 }
10870 }
10871
10873 {
10874 if (root)
10875 {
10876 vector m4[4];
10877 root.GetTransform(m4);
10878 dst.SetGround(this, m4);
10879 }
10880 else
10881 {
10882 GetInventory().GetCurrentInventoryLocation(dst);
10883 }
10884 }
10885
10886 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10887 {
10888
10889 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10890 return false;
10891
10892 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10893 return false;
10894
10895
10897 return false;
10898
10899
10900 Magazine mag = Magazine.Cast(this);
10901 if (mag)
10902 {
10903 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10904 return false;
10905
10906 if (stack_max_limit)
10907 {
10908 Magazine other_mag = Magazine.Cast(other_item);
10909 if (other_item)
10910 {
10911 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10912 return false;
10913 }
10914
10915 }
10916 }
10917 else
10918 {
10919
10921 return false;
10922
10924 return false;
10925 }
10926
10927 PlayerBase player = null;
10928 if (CastTo(player, GetHierarchyRootPlayer()))
10929 {
10930 if (player.GetInventory().HasAttachment(this))
10931 return false;
10932
10933 if (player.IsItemsToDelete())
10934 return false;
10935 }
10936
10937 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10938 return false;
10939
10940 int slotID;
10942 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10943 return false;
10944
10945 return true;
10946 }
10947
10949 {
10951 }
10952
10954 {
10955 return m_IsResultOfSplit;
10956 }
10957
10959 {
10960 m_IsResultOfSplit = value;
10961 }
10962
10964 {
10966 }
10967
10969 {
10970 float other_item_quantity = other_item.GetQuantity();
10971 float this_free_space;
10972
10974
10976
10977 if (other_item_quantity > this_free_space)
10978 {
10979 return this_free_space;
10980 }
10981 else
10982 {
10983 return other_item_quantity;
10984 }
10985 }
10986
10988 {
10990 }
10991
10993 {
10995 return;
10996
10997 if (!IsMagazine() && other_item)
10998 {
11000 if (quantity_used != 0)
11001 {
11002 float hp1 = GetHealth01("","");
11003 float hp2 = other_item.GetHealth01("","");
11004 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11005 hpResult = hpResult / (
GetQuantity() + quantity_used);
11006
11007 hpResult *= GetMaxHealth();
11008 Math.Round(hpResult);
11009 SetHealth("", "Health", hpResult);
11010
11012 other_item.AddQuantity(-quantity_used);
11013 }
11014 }
11016 }
11017
11019 {
11020 #ifdef SERVER
11021 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11022 GetHierarchyParent().IncreaseLifetimeUp();
11023 #endif
11024 };
11025
11027 {
11028 PlayerBase p = PlayerBase.Cast(player);
11029
11030 array<int> recipesIds = p.m_Recipes;
11031 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11032 if (moduleRecipesManager)
11033 {
11034 EntityAI itemInHands = player.GetEntityInHands();
11035 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11036 }
11037
11038 for (int i = 0;i < recipesIds.Count(); i++)
11039 {
11040 int key = recipesIds.Get(i);
11041 string recipeName = moduleRecipesManager.GetRecipeName(key);
11043 }
11044 }
11045
11046
11047 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11048 {
11049 super.GetDebugActions(outputList);
11050
11051
11057
11058
11063
11068
11069
11073
11074
11076 {
11080 }
11081
11084
11085
11089
11091
11092 InventoryLocation loc = new InventoryLocation();
11093 GetInventory().GetCurrentInventoryLocation(loc);
11095 {
11096 if (Gizmo_IsSupported())
11099 }
11100
11102 }
11103
11104
11105
11106
11108 {
11109 super.OnAction(action_id, player, ctx);
11110
11112 {
11113 switch (action_id)
11114 {
11118 return true;
11122 return true;
11123 }
11124 }
11125
11127 {
11128 switch (action_id)
11129 {
11131 Delete();
11132 return true;
11133 }
11134 }
11135
11136 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11137 {
11138 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11139 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11140 PlayerBase p = PlayerBase.Cast(player);
11141 if (
EActions.RECIPES_RANGE_START < 1000)
11142 {
11143 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11144 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11145 }
11146 }
11147 #ifndef SERVER
11148 else if (action_id ==
EActions.WATCH_PLAYER)
11149 {
11150 PluginDeveloper.SetDeveloperItemClientEx(player);
11151 }
11152 #endif
11154 {
11155 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11156 {
11157 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11158 OnDebugButtonPressServer(id + 1);
11159 }
11160
11161 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11162 {
11163 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11165 }
11166
11167 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11168 {
11169 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11171 }
11172
11173 else if (action_id ==
EActions.ADD_QUANTITY)
11174 {
11175 if (IsMagazine())
11176 {
11177 Magazine mag = Magazine.Cast(this);
11178 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11179 }
11180 else
11181 {
11183 }
11184
11185 if (m_EM)
11186 {
11187 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11188 }
11189
11190 }
11191
11192 else if (action_id ==
EActions.REMOVE_QUANTITY)
11193 {
11194 if (IsMagazine())
11195 {
11196 Magazine mag2 = Magazine.Cast(this);
11197 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11198 }
11199 else
11200 {
11202 }
11203 if (m_EM)
11204 {
11205 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11206 }
11207
11208 }
11209
11210 else if (action_id ==
EActions.SET_QUANTITY_0)
11211 {
11213
11214 if (m_EM)
11215 {
11216 m_EM.SetEnergy(0);
11217 }
11218 }
11219
11220 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11221 {
11223
11224 if (m_EM)
11225 {
11226 m_EM.SetEnergy(m_EM.GetEnergyMax());
11227 }
11228 }
11229
11230 else if (action_id ==
EActions.ADD_HEALTH)
11231 {
11232 AddHealth("","",GetMaxHealth("","Health")/5);
11233 }
11234 else if (action_id ==
EActions.REMOVE_HEALTH)
11235 {
11236 AddHealth("","",-GetMaxHealth("","Health")/5);
11237 }
11238 else if (action_id ==
EActions.DESTROY_HEALTH)
11239 {
11240 SetHealth01("","",0);
11241 }
11242 else if (action_id ==
EActions.WATCH_ITEM)
11243 {
11245 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11246 #ifdef DEVELOPER
11247 SetDebugDeveloper_item(this);
11248 #endif
11249 }
11250
11251 else if (action_id ==
EActions.ADD_TEMPERATURE)
11252 {
11253 AddTemperature(20);
11254
11255 }
11256
11257 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11258 {
11259 AddTemperature(-20);
11260
11261 }
11262
11263 else if (action_id ==
EActions.FLIP_FROZEN)
11264 {
11265 SetFrozen(!GetIsFrozen());
11266
11267 }
11268
11269 else if (action_id ==
EActions.ADD_WETNESS)
11270 {
11272
11273 }
11274
11275 else if (action_id ==
EActions.REMOVE_WETNESS)
11276 {
11278
11279 }
11280
11281 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11282 {
11285
11286
11287 }
11288
11289 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11290 {
11293 }
11294
11295 else if (action_id ==
EActions.MAKE_SPECIAL)
11296 {
11297 auto debugParams = DebugSpawnParams.WithPlayer(player);
11298 OnDebugSpawnEx(debugParams);
11299 }
11300
11301 }
11302
11303
11304 return false;
11305 }
11306
11307
11308
11309
11313
11316
11317
11318
11320 {
11321 return false;
11322 }
11323
11324
11326 {
11327 return true;
11328 }
11329
11330
11332 {
11333 return true;
11334 }
11335
11336
11337
11339 {
11340 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11341 return g_Game.ConfigIsExisting(config_path);
11342 }
11343
11346 {
11347 return null;
11348 }
11349
11351 {
11352 return false;
11353 }
11354
11356 {
11357 return false;
11358 }
11359
11363
11364
11366 {
11367 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11368 return module_repairing.CanRepair(this, item_repair_kit);
11369 }
11370
11371
11372 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11373 {
11374 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11375 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11376 }
11377
11378
11380 {
11381
11382
11383
11384
11385
11386
11387
11388
11389 return 1;
11390 }
11391
11392
11393
11395 {
11397 }
11398
11399
11400
11402 {
11404 }
11405
11406
11415 {
11416 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11417
11418 if (player)
11419 {
11420 player.MessageStatus(text);
11421 }
11422 }
11423
11424
11433 {
11434 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11435
11436 if (player)
11437 {
11438 player.MessageAction(text);
11439 }
11440 }
11441
11442
11451 {
11452 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11453
11454 if (player)
11455 {
11456 player.MessageFriendly(text);
11457 }
11458 }
11459
11460
11469 {
11470 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11471
11472 if (player)
11473 {
11474 player.MessageImportant(text);
11475 }
11476 }
11477
11479 {
11480 return true;
11481 }
11482
11483
11484 override bool KindOf(
string tag)
11485 {
11486 bool found = false;
11487 string item_name = this.
GetType();
11489 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11490
11491 int array_size = item_tag_array.Count();
11492 for (int i = 0; i < array_size; i++)
11493 {
11494 if (item_tag_array.Get(i) == tag)
11495 {
11496 found = true;
11497 break;
11498 }
11499 }
11500 return found;
11501 }
11502
11503
11505 {
11506
11507 super.OnRPC(sender, rpc_type,ctx);
11508
11509
11510 switch (rpc_type)
11511 {
11512 #ifndef SERVER
11513 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11514 Param2<bool, string> p = new Param2<bool, string>(false, "");
11515
11517 return;
11518
11519 bool play = p.param1;
11520 string soundSet = p.param2;
11521
11522 if (play)
11523 {
11525 {
11527 {
11529 }
11530 }
11531 else
11532 {
11534 }
11535 }
11536 else
11537 {
11539 }
11540
11541 break;
11542 #endif
11543
11544 }
11545
11547 {
11549 }
11550 }
11551
11552
11553
11554
11556 {
11557 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11558 return plugin.GetID(
name);
11559 }
11560
11562 {
11563 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11564 return plugin.GetName(id);
11565 }
11566
11569 {
11570
11571
11572 int varFlags;
11573 if (!ctx.
Read(varFlags))
11574 return;
11575
11576 if (varFlags & ItemVariableFlags.FLOAT)
11577 {
11579 }
11580 }
11581
11583 {
11584
11585 super.SerializeNumericalVars(floats_out);
11586
11587
11588
11590 {
11592 }
11593
11595 {
11597 }
11598
11600 {
11602 }
11603
11605 {
11610 }
11611
11613 {
11615 }
11616 }
11617
11619 {
11620
11621 super.DeSerializeNumericalVars(floats);
11622
11623
11624 int index = 0;
11625 int mask = Math.Round(floats.Get(index));
11626
11627 index++;
11628
11630 {
11632 {
11634 }
11635 else
11636 {
11637 float quantity = floats.Get(index);
11638 SetQuantity(quantity,
true,
false,
false,
false);
11639 }
11640 index++;
11641 }
11642
11644 {
11645 float wet = floats.Get(index);
11647 index++;
11648 }
11649
11651 {
11652 int liquidtype = Math.Round(floats.Get(index));
11654 index++;
11655 }
11656
11658 {
11660 index++;
11662 index++;
11664 index++;
11666 index++;
11667 }
11668
11670 {
11671 int cleanness = Math.Round(floats.Get(index));
11673 index++;
11674 }
11675 }
11676
11678 {
11679 super.WriteVarsToCTX(ctx);
11680
11681
11683 {
11685 }
11686
11688 {
11690 }
11691
11693 {
11695 }
11696
11698 {
11699 int r,g,b,a;
11705 }
11706
11708 {
11710 }
11711 }
11712
11714 {
11715 if (!super.ReadVarsFromCTX(ctx,version))
11716 return false;
11717
11718 int intValue;
11719 float value;
11720
11721 if (version < 140)
11722 {
11723 if (!ctx.
Read(intValue))
11724 return false;
11725
11726 m_VariablesMask = intValue;
11727 }
11728
11730 {
11731 if (!ctx.
Read(value))
11732 return false;
11733
11735 {
11737 }
11738 else
11739 {
11741 }
11742 }
11743
11744 if (version < 140)
11745 {
11747 {
11748 if (!ctx.
Read(value))
11749 return false;
11750 SetTemperatureDirect(value);
11751 }
11752 }
11753
11755 {
11756 if (!ctx.
Read(value))
11757 return false;
11759 }
11760
11762 {
11763 if (!ctx.
Read(intValue))
11764 return false;
11766 }
11767
11769 {
11770 int r,g,b,a;
11772 return false;
11774 return false;
11776 return false;
11778 return false;
11779
11781 }
11782
11784 {
11785 if (!ctx.
Read(intValue))
11786 return false;
11788 }
11789
11790 if (version >= 138 && version < 140)
11791 {
11793 {
11794 if (!ctx.
Read(intValue))
11795 return false;
11796 SetFrozen(intValue);
11797 }
11798 }
11799
11800 return true;
11801 }
11802
11803
11805 {
11808 {
11810 }
11811
11812 if (!super.OnStoreLoad(ctx, version))
11813 {
11815 return false;
11816 }
11817
11818 if (version >= 114)
11819 {
11820 bool hasQuickBarIndexSaved;
11821
11822 if (!ctx.
Read(hasQuickBarIndexSaved))
11823 {
11825 return false;
11826 }
11827
11828 if (hasQuickBarIndexSaved)
11829 {
11830 int itmQBIndex;
11831
11832
11833 if (!ctx.
Read(itmQBIndex))
11834 {
11836 return false;
11837 }
11838
11839 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11840 if (itmQBIndex != -1 && parentPlayer)
11841 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11842 }
11843 }
11844 else
11845 {
11846
11847 PlayerBase player;
11848 int itemQBIndex;
11849 if (version ==
int.
MAX)
11850 {
11851 if (!ctx.
Read(itemQBIndex))
11852 {
11854 return false;
11855 }
11856 }
11857 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11858 {
11859
11860 if (!ctx.
Read(itemQBIndex))
11861 {
11863 return false;
11864 }
11865 if (itemQBIndex != -1 && player)
11866 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11867 }
11868 }
11869
11870 if (version < 140)
11871 {
11872
11873 if (!LoadVariables(ctx, version))
11874 {
11876 return false;
11877 }
11878 }
11879
11880
11882 {
11884 return false;
11885 }
11886 if (version >= 132)
11887 {
11889 if (raib)
11890 {
11892 {
11894 return false;
11895 }
11896 }
11897 }
11898
11900 return true;
11901 }
11902
11903
11904
11906 {
11907 super.OnStoreSave(ctx);
11908
11909 PlayerBase player;
11910 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11911 {
11913
11914 int itemQBIndex = -1;
11915 itemQBIndex = player.FindQuickBarEntityIndex(this);
11916 ctx.
Write(itemQBIndex);
11917 }
11918 else
11919 {
11921 }
11922
11924
11926 if (raib)
11927 {
11929 }
11930 }
11931
11932
11934 {
11935 super.AfterStoreLoad();
11936
11938 {
11940 }
11941
11943 {
11946 }
11947 }
11948
11950 {
11951 super.EEOnAfterLoad();
11952
11954 {
11956 }
11957
11960 }
11961
11963 {
11964 return false;
11965 }
11966
11967
11968
11970 {
11972 {
11973 #ifdef PLATFORM_CONSOLE
11974
11976 {
11978 if (menu)
11979 {
11981 }
11982 }
11983 #endif
11984 }
11985
11987 {
11990 }
11991
11993 {
11994 SetWeightDirty();
11996 }
11998 {
12001 }
12002
12004 {
12007
12010 }
12012 {
12016 }
12017
12018 super.OnVariablesSynchronized();
12019 }
12020
12021
12022
12024 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12025 {
12026 if (!IsServerCheck(allow_client))
12027 return false;
12028
12030 return false;
12031
12034
12035 if (value <= (min + 0.001))
12036 value = min;
12037
12038 if (value == min)
12039 {
12040 if (destroy_config)
12041 {
12042 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12043 if (dstr)
12044 {
12046 this.Delete();
12047 return true;
12048 }
12049 }
12050 else if (destroy_forced)
12051 {
12053 this.Delete();
12054 return true;
12055 }
12056
12058 }
12059
12062
12064 {
12065 EntityAI parent = GetHierarchyRoot();
12066 InventoryLocation iLoc = new InventoryLocation();
12067 GetInventory().GetCurrentInventoryLocation(iLoc);
12069 {
12070 int iLocSlot = iLoc.
GetSlot();
12072 {
12074 }
12076 {
12078 }
12079 }
12080 }
12081
12083 {
12085
12086 if (delta)
12088 }
12089
12091
12092 return false;
12093 }
12094
12095
12097 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12098 {
12100 }
12101
12103 {
12106 }
12107
12109 {
12112 }
12113
12115 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12116 {
12117 float value_clamped = Math.Clamp(value, 0, 1);
12119 SetQuantity(result, destroy_config, destroy_forced);
12120 }
12121
12122
12125 {
12127 }
12128
12130 {
12132 }
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
12144 {
12145 int slot = -1;
12146 GameInventory inventory = GetInventory();
12147 if (inventory)
12148 {
12149 InventoryLocation il = new InventoryLocation;
12152 }
12153
12155 }
12156
12158 {
12159 float quantity_max = 0;
12160
12162 {
12163 if (attSlotID != -1)
12164 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12165
12166 if (quantity_max <= 0)
12168 }
12169
12170 if (quantity_max <= 0)
12172
12173 return quantity_max;
12174 }
12175
12177 {
12179 }
12180
12182 {
12184 }
12185
12186
12188 {
12190 }
12191
12193 {
12195 }
12196
12198 {
12200 }
12201
12202
12204 {
12205
12206 float weightEx = GetWeightEx();
12207 float special = GetInventoryAndCargoWeight();
12208 return weightEx - special;
12209 }
12210
12211
12213 {
12215 }
12216
12218 {
12220 {
12221 #ifdef DEVELOPER
12222 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12223 {
12224 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12226 }
12227 #endif
12228
12229 return GetQuantity() * GetConfigWeightModified();
12230 }
12231 else if (HasEnergyManager())
12232 {
12233 #ifdef DEVELOPER
12234 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12235 {
12236 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12237 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12238 }
12239 #endif
12240 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12241 }
12242 else
12243 {
12244 #ifdef DEVELOPER
12245 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12246 {
12247 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12248 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12249 }
12250 #endif
12251 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12252 }
12253 }
12254
12257 {
12258 int item_count = 0;
12260
12261 GameInventory inventory = GetInventory();
12262 CargoBase cargo = inventory.
GetCargo();
12263 if (cargo != NULL)
12264 {
12266 }
12267
12269 for (int i = 0; i < nAttachments; ++i)
12270 {
12272 if (item)
12273 item_count += item.GetNumberOfItems();
12274 }
12275 return item_count;
12276 }
12277
12280 {
12281 float weight = 0;
12282 float wetness = 1;
12283 if (include_wetness)
12286 {
12287 weight = wetness * m_ConfigWeight;
12288 }
12290 {
12291 weight = 1;
12292 }
12293 return weight;
12294 }
12295
12296
12297
12299 {
12300 GameInventory inventory = GetInventory();
12301 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12302 {
12303 array<EntityAI> items = new array<EntityAI>;
12305 for (int i = 0; i < items.Count(); ++i)
12306 {
12308 if (item)
12309 {
12310 g_Game.ObjectDelete(item);
12311 }
12312 }
12313 }
12314 }
12315
12316
12317
12318
12320 {
12321 float energy = 0;
12322 if (HasEnergyManager())
12323 {
12324 energy = GetCompEM().GetEnergy();
12325 }
12326 return energy;
12327 }
12328
12329
12331 {
12332 super.OnEnergyConsumed();
12333
12335 }
12336
12338 {
12339 super.OnEnergyAdded();
12340
12342 }
12343
12344
12346 {
12347 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12348 {
12350 {
12351 float energy_0to1 = GetCompEM().GetEnergy0To1();
12353 }
12354 }
12355 }
12356
12357
12359 {
12360 return ConfigGetFloat("heatIsolation");
12361 }
12362
12364 {
12366 }
12367
12369 {
12370 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12371 if (
g_Game.ConfigIsExisting(paramPath))
12372 return g_Game.ConfigGetFloat(paramPath);
12373
12374 return 0.0;
12375 }
12376
12378 {
12379 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12380 if (
g_Game.ConfigIsExisting(paramPath))
12381 return g_Game.ConfigGetFloat(paramPath);
12382
12383 return 0.0;
12384 }
12385
12386 override void SetWet(
float value,
bool allow_client =
false)
12387 {
12388 if (!IsServerCheck(allow_client))
12389 return;
12390
12393
12395
12396 m_VarWet = Math.Clamp(value, min, max);
12397
12399 {
12402 }
12403 }
12404
12405 override void AddWet(
float value)
12406 {
12408 }
12409
12411 {
12413 }
12414
12416 {
12418 }
12419
12421 {
12423 }
12424
12426 {
12428 }
12429
12431 {
12433 }
12434
12435 override void OnWetChanged(
float newVal,
float oldVal)
12436 {
12439 if (newLevel != oldLevel)
12440 {
12442 }
12443 }
12444
12446 {
12447 SetWeightDirty();
12448 }
12449
12451 {
12452 return GetWetLevelInternal(
m_VarWet);
12453 }
12454
12455
12456
12458 {
12460 }
12461
12463 {
12465 }
12466
12468 {
12470 }
12471
12473 {
12475 }
12476
12477
12478
12480 {
12481 if (ConfigIsExisting("itemModelLength"))
12482 {
12483 return ConfigGetFloat("itemModelLength");
12484 }
12485 return 0;
12486 }
12487
12489 {
12490 if (ConfigIsExisting("itemAttachOffset"))
12491 {
12492 return ConfigGetFloat("itemAttachOffset");
12493 }
12494 return 0;
12495 }
12496
12497 override void SetCleanness(
int value,
bool allow_client =
false)
12498 {
12499 if (!IsServerCheck(allow_client))
12500 return;
12501
12503
12505
12508 }
12509
12511 {
12513 }
12514
12516 {
12517 return true;
12518 }
12519
12520
12521
12522
12524 {
12526 }
12527
12529 {
12531 }
12532
12533
12534
12535
12536 override void SetColor(
int r,
int g,
int b,
int a)
12537 {
12543 }
12545 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12546 {
12551 }
12552
12554 {
12556 }
12557
12560 {
12561 int r,g,b,a;
12563 r = r/255;
12564 g = g/255;
12565 b = b/255;
12566 a = a/255;
12567 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12568 }
12569
12570
12571
12572 override void SetLiquidType(
int value,
bool allow_client =
false)
12573 {
12574 if (!IsServerCheck(allow_client))
12575 return;
12576
12581 }
12582
12584 {
12585 return ConfigGetInt("varLiquidTypeInit");
12586 }
12587
12589 {
12591 }
12592
12594 {
12596 SetFrozen(false);
12597 }
12598
12601 {
12602 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12603 }
12604
12605
12608 {
12609 PlayerBase nplayer;
12610 if (PlayerBase.CastTo(nplayer, player))
12611 {
12613 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12614 }
12615 }
12616
12617
12620 {
12621 PlayerBase nplayer;
12622 if (PlayerBase.CastTo(nplayer,player))
12623 {
12624 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12625 }
12626
12627 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12628
12629 if (HasEnergyManager())
12630 {
12631 GetCompEM().UpdatePlugState();
12632 }
12633 }
12634
12635
12637 {
12638 super.OnPlacementStarted(player);
12639
12641 }
12642
12643 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12644 {
12646 {
12647 m_AdminLog.OnPlacementComplete(player,
this);
12648 }
12649
12650 super.OnPlacementComplete(player, position, orientation);
12651 }
12652
12653
12654
12655
12656
12658 {
12660 {
12661 return true;
12662 }
12663 else
12664 {
12665 return false;
12666 }
12667 }
12668
12669
12671 {
12673 {
12675 }
12676 }
12677
12678
12680 {
12682 }
12683
12685 {
12687 }
12688
12689 override void InsertAgent(
int agent,
float count = 1)
12690 {
12691 if (count < 1)
12692 return;
12693
12695 }
12696
12699 {
12701 }
12702
12703
12705 {
12707 }
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12751 {
12753 return false;
12754 return true;
12755 }
12756
12758 {
12759
12761 }
12762
12763
12766 {
12767 super.CheckForRoofLimited(timeTresholdMS);
12768
12769 float time =
g_Game.GetTime();
12770 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12771 {
12772 m_PreviousRoofTestTime = time;
12773 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12774 }
12775 }
12776
12777
12779 {
12781 {
12782 return 0;
12783 }
12784
12785 if (GetInventory().GetAttachmentSlotsCount() != 0)
12786 {
12787 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12788 if (filter)
12789 return filter.GetProtectionLevel(type, false, system);
12790 else
12791 return 0;
12792 }
12793
12794 string subclassPath, entryName;
12795
12796 switch (type)
12797 {
12799 entryName = "biological";
12800 break;
12802 entryName = "chemical";
12803 break;
12804 default:
12805 entryName = "biological";
12806 break;
12807 }
12808
12809 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12810
12811 return g_Game.ConfigGetFloat(subclassPath + entryName);
12812 }
12813
12814
12815
12818 {
12819 if (!IsMagazine())
12821
12823 }
12824
12825
12826
12827
12828
12833 {
12834 return true;
12835 }
12836
12838 {
12840 }
12841
12842
12843
12844
12845
12847 {
12848 if (parent)
12849 {
12850 if (parent.IsInherited(DayZInfected))
12851 return true;
12852
12853 if (!parent.IsRuined())
12854 return true;
12855 }
12856
12857 return true;
12858 }
12859
12861 {
12862 if (!super.CanPutAsAttachment(parent))
12863 {
12864 return false;
12865 }
12866
12867 if (!IsRuined() && !parent.IsRuined())
12868 {
12869 return true;
12870 }
12871
12872 return false;
12873 }
12874
12876 {
12877
12878
12879
12880
12881 return super.CanReceiveItemIntoCargo(item);
12882 }
12883
12885 {
12886
12887
12888
12889
12890 GameInventory attachmentInv = attachment.GetInventory();
12892 {
12893 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12894 return false;
12895 }
12896
12897 InventoryLocation loc = new InventoryLocation();
12898 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12899 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12900 return false;
12901
12902 return super.CanReceiveAttachment(attachment, slotId);
12903 }
12904
12906 {
12907 if (!super.CanReleaseAttachment(attachment))
12908 return false;
12909
12910 return GetInventory().AreChildrenAccessible();
12911 }
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12934 {
12935 int id = muzzle_owner.GetMuzzleID();
12936 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12937
12938 if (WPOF_array)
12939 {
12940 for (int i = 0; i < WPOF_array.Count(); i++)
12941 {
12942 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12943
12944 if (WPOF)
12945 {
12946 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12947 }
12948 }
12949 }
12950 }
12951
12952
12954 {
12955 int id = muzzle_owner.GetMuzzleID();
12957
12958 if (WPOBE_array)
12959 {
12960 for (int i = 0; i < WPOBE_array.Count(); i++)
12961 {
12962 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12963
12964 if (WPOBE)
12965 {
12966 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12967 }
12968 }
12969 }
12970 }
12971
12972
12974 {
12975 int id = muzzle_owner.GetMuzzleID();
12976 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12977
12978 if (WPOOH_array)
12979 {
12980 for (int i = 0; i < WPOOH_array.Count(); i++)
12981 {
12982 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12983
12984 if (WPOOH)
12985 {
12986 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12987 }
12988 }
12989 }
12990 }
12991
12992
12994 {
12995 int id = muzzle_owner.GetMuzzleID();
12996 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12997
12998 if (WPOOH_array)
12999 {
13000 for (int i = 0; i < WPOOH_array.Count(); i++)
13001 {
13002 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13003
13004 if (WPOOH)
13005 {
13006 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13007 }
13008 }
13009 }
13010 }
13011
13012
13014 {
13015 int id = muzzle_owner.GetMuzzleID();
13016 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13017
13018 if (WPOOH_array)
13019 {
13020 for (int i = 0; i < WPOOH_array.Count(); i++)
13021 {
13022 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13023
13024 if (WPOOH)
13025 {
13026 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13027 }
13028 }
13029 }
13030 }
13031
13032
13033
13035 {
13037 {
13038 return true;
13039 }
13040
13041 return false;
13042 }
13043
13045 {
13047 {
13048 return true;
13049 }
13050
13051 return false;
13052 }
13053
13055 {
13057 {
13058 return true;
13059 }
13060
13061 return false;
13062 }
13063
13065 {
13066 return false;
13067 }
13068
13071 {
13072 return UATimeSpent.DEFAULT_DEPLOY;
13073 }
13074
13075
13076
13077
13079 {
13081 SetSynchDirty();
13082 }
13083
13085 {
13087 }
13088
13089
13091 {
13092 return false;
13093 }
13094
13097 {
13098 string att_type = "None";
13099
13100 if (ConfigIsExisting("soundAttType"))
13101 {
13102 att_type = ConfigGetString("soundAttType");
13103 }
13104
13106 }
13107
13109 {
13111 }
13112
13113
13114
13115
13116
13122
13124 {
13127
13129 }
13130
13131
13133 {
13135 return;
13136
13138
13141
13144
13145 SoundParameters params = new SoundParameters();
13149 }
13150
13151
13153 {
13155 {
13158
13159 SetSynchDirty();
13160
13163 }
13164 }
13165
13167 {
13169 }
13170
13171
13173 {
13175 return;
13176
13178 SetSynchDirty();
13179
13182 }
13183
13185 {
13188 }
13189
13191 {
13193 }
13194
13195 void OnApply(PlayerBase player);
13196
13198 {
13199 return 1.0;
13200 };
13201
13203 {
13205 }
13206
13208 {
13210 }
13211
13213
13215 {
13216 SetDynamicPhysicsLifeTime(0.01);
13218 }
13219
13221 {
13222 array<string> zone_names = new array<string>;
13223 GetDamageZones(zone_names);
13224 for (int i = 0; i < zone_names.Count(); i++)
13225 {
13226 SetHealthMax(zone_names.Get(i),"Health");
13227 }
13228 SetHealthMax("","Health");
13229 }
13230
13233 {
13234 float global_health = GetHealth01("","Health");
13235 array<string> zones = new array<string>;
13236 GetDamageZones(zones);
13237
13238 for (int i = 0; i < zones.Count(); i++)
13239 {
13240 SetHealth01(zones.Get(i),"Health",global_health);
13241 }
13242 }
13243
13246 {
13247 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13248 }
13249
13251 {
13252 if (!hasRootAsPlayer)
13253 {
13254 if (refParentIB)
13255 {
13256
13257 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13258 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13259
13260 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13261 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13262
13265 }
13266 else
13267 {
13268
13271 }
13272 }
13273 }
13274
13276 {
13278 {
13279 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13280 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13281 {
13282 float heatPermCoef = 1.0;
13284 while (ent)
13285 {
13286 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13287 ent = ent.GetHierarchyParent();
13288 }
13289
13290 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13291 }
13292 }
13293 }
13294
13296 {
13297
13298 EntityAI parent = GetHierarchyParent();
13299 if (!parent)
13300 {
13301 hasParent = false;
13302 hasRootAsPlayer = false;
13303 }
13304 else
13305 {
13306 hasParent = true;
13307 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13308 refParentIB =
ItemBase.Cast(parent);
13309 }
13310 }
13311
13312 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13313 {
13314
13315 }
13316
13318 {
13319
13320 return false;
13321 }
13322
13324 {
13325
13326
13327 return false;
13328 }
13329
13331 {
13332
13333 return false;
13334 }
13335
13338 {
13339 return !GetIsFrozen() &&
IsOpen();
13340 }
13341
13343 {
13344 bool hasParent = false, hasRootAsPlayer = false;
13346
13347 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13348 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13349
13350 if (wwtu || foodDecay)
13351 {
13355
13356 if (processWetness || processTemperature || processDecay)
13357 {
13359
13360 if (processWetness)
13361 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13362
13363 if (processTemperature)
13365
13366 if (processDecay)
13367 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13368 }
13369 }
13370 }
13371
13374 {
13376 }
13377
13379 {
13382
13383 return super.GetTemperatureFreezeThreshold();
13384 }
13385
13387 {
13390
13391 return super.GetTemperatureThawThreshold();
13392 }
13393
13395 {
13398
13399 return super.GetItemOverheatThreshold();
13400 }
13401
13403 {
13405 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13406
13407 return super.GetTemperatureFreezeTime();
13408 }
13409
13411 {
13413 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13414
13415 return super.GetTemperatureThawTime();
13416 }
13417
13422
13424 {
13425 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13426 }
13427
13429 {
13430 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13431 }
13432
13435 {
13437 }
13438
13440 {
13442 }
13443
13445 {
13447 }
13448
13451 {
13452 return null;
13453 }
13454
13457 {
13458 return false;
13459 }
13460
13462 {
13464 {
13467 if (!trg)
13468 {
13470 explosive = this;
13471 }
13472
13473 explosive.PairRemote(trg);
13475
13476 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13477 trg.SetPersistentPairID(persistentID);
13478 explosive.SetPersistentPairID(persistentID);
13479
13480 return true;
13481 }
13482 return false;
13483 }
13484
13487 {
13488 float ret = 1.0;
13491 ret *= GetHealth01();
13492
13493 return ret;
13494 }
13495
13496 #ifdef DEVELOPER
13497 override void SetDebugItem()
13498 {
13499 super.SetDebugItem();
13500 _itemBase = this;
13501 }
13502
13504 {
13505 string text = super.GetDebugText();
13506
13508 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13509
13510 return text;
13511 }
13512 #endif
13513
13515 {
13516 return true;
13517 }
13518
13520
13522
13524 {
13527 }
13528
13529
13537
13553
13554 [
Obsolete(
"Use ItemSoundHandler instead")]
13557 {
13558 if (!
g_Game.IsDedicatedServer())
13559 {
13560 if (ConfigIsExisting("attachSoundSet"))
13561 {
13562 string cfg_path = "";
13563 string soundset = "";
13564 string type_name =
GetType();
13565
13568 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13569 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13570
13571 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13572 {
13573 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13574 {
13575 if (cfg_slot_array[i] == slot_type)
13576 {
13577 soundset = cfg_soundset_array[i];
13578 break;
13579 }
13580 }
13581 }
13582
13583 if (soundset != "")
13584 {
13585 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13587 }
13588 }
13589 }
13590 }
13591
13593}
13594
13596{
13598 if (entity)
13599 {
13600 bool is_item = entity.IsInherited(
ItemBase);
13601 if (is_item && full_quantity)
13602 {
13605 }
13606 }
13607 else
13608 {
13610 return NULL;
13611 }
13612 return entity;
13613}
13614
13616{
13617 if (item)
13618 {
13619 if (health > 0)
13620 item.SetHealth("", "", health);
13621
13622 if (item.CanHaveTemperature())
13623 {
13625 if (item.CanFreeze())
13626 item.SetFrozen(false);
13627 }
13628
13629 if (item.HasEnergyManager())
13630 {
13631 if (quantity >= 0)
13632 {
13633 item.GetCompEM().SetEnergy0To1(quantity);
13634 }
13635 else
13636 {
13638 }
13639 }
13640 else if (item.IsMagazine())
13641 {
13642 Magazine mag = Magazine.Cast(item);
13643 if (quantity >= 0)
13644 {
13645 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13646 }
13647 else
13648 {
13650 }
13651
13652 }
13653 else
13654 {
13655 if (quantity >= 0)
13656 {
13657 item.SetQuantityNormalized(quantity, false);
13658 }
13659 else
13660 {
13662 }
13663
13664 }
13665 }
13666}
13667
13668#ifdef DEVELOPER
13670#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.