8764{
8766 {
8767 return true;
8768 }
8769};
8770
8772{
8773
8774};
8775
8776
8777
8779{
8783
8785
8788
8789
8790
8791
8792
8801
8807
8812
8817
8838 protected bool m_IsResultOfSplit
8839
8841
8846
8847
8848
8850
8854
8855
8856
8858
8861
8862
8863
8869
8870
8878
8881
8882
8884
8885
8887
8888
8893
8894
8899
8901
8902
8904
8905
8907 {
8912
8913 if (!
g_Game.IsDedicatedServer())
8914 {
8916 {
8918
8920 {
8922 }
8923 }
8924
8927 }
8928
8929 m_OldLocation = null;
8930
8932 {
8934 }
8935
8936 if (ConfigIsExisting("headSelectionsToHide"))
8937 {
8940 }
8941
8943 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8944 {
8946 }
8947
8949
8950 m_IsResultOfSplit = false;
8951
8953 }
8954
8956 {
8957 super.InitItemVariables();
8958
8964 m_Count = ConfigGetInt(
"count");
8965
8968
8973
8976
8981
8993
8997
8998
9001 if (ConfigIsExisting("canBeSplit"))
9002 {
9005 }
9006
9008 if (ConfigIsExisting("itemBehaviour"))
9010
9011
9014 RegisterNetSyncVariableInt("m_VarLiquidType");
9015 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9016
9017 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9018 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9019 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9020
9021 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9022 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9023 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9024 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9025
9026 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9027 RegisterNetSyncVariableBool("m_IsTakeable");
9028 RegisterNetSyncVariableBool("m_IsHologram");
9029
9032 {
9035 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9036 }
9037
9039
9041 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9043
9045 }
9046
9048 {
9050 }
9051
9053 {
9056 {
9061 }
9062 }
9063
9064 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9065 {
9067 {
9070 }
9071
9073 }
9074
9076 {
9082 }
9083
9085
9087 {
9089
9090 if (!action)
9091 {
9092 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9093 return;
9094 }
9095
9097 if (!ai)
9098 {
9100 return;
9101 }
9102
9104 if (!action_array)
9105 {
9106 action_array = new array<ActionBase_Basic>;
9108 }
9109 if (LogManager.IsActionLogEnable())
9110 {
9111 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9112 }
9113
9114 if (action_array.Find(action) != -1)
9115 {
9116 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9117 }
9118 else
9119 {
9120 action_array.Insert(action);
9121 }
9122 }
9123
9125 {
9126 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9127 ActionBase action = player.GetActionManager().GetAction(actionName);
9130
9131 if (action_array)
9132 {
9133 action_array.RemoveItem(action);
9134 }
9135 }
9136
9137
9138
9140 {
9141 ActionOverrideData overrideData = new ActionOverrideData();
9145
9147 if (!actionMap)
9148 {
9151 }
9152
9153 actionMap.Insert(this.
Type(), overrideData);
9154
9155 }
9156
9158
9160
9161
9163 {
9166
9169
9170 string config_to_search = "CfgVehicles";
9171 string muzzle_owner_config;
9172
9174 {
9175 if (IsInherited(Weapon))
9176 config_to_search = "CfgWeapons";
9177
9178 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9179
9180 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9181
9182 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9183
9184 if (config_OnFire_subclass_count > 0)
9185 {
9186 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9187
9188 for (int i = 0; i < config_OnFire_subclass_count; i++)
9189 {
9190 string particle_class = "";
9191 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9192 string config_OnFire_entry = config_OnFire_class + particle_class;
9193 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9194 WPOF_array.Insert(WPOF);
9195 }
9196
9197
9199 }
9200 }
9201
9203 {
9204 config_to_search = "CfgWeapons";
9205 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9206
9207 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9208
9209 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9210
9211 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9212 {
9213 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9214
9215 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9216 {
9217 string particle_class2 = "";
9218 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9219 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9220 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9221 WPOBE_array.Insert(WPOBE);
9222 }
9223
9224
9226 }
9227 }
9228 }
9229
9230
9232 {
9235
9237 {
9238 string config_to_search = "CfgVehicles";
9239
9240 if (IsInherited(Weapon))
9241 config_to_search = "CfgWeapons";
9242
9243 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9244 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9245
9246 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9247 {
9248
9250
9252 {
9254 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9256 return;
9257 }
9258
9261
9262
9263
9264 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9265 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9266
9267 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9268 {
9269 string particle_class = "";
9270 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9271 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9272 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9273
9274 if (entry_type == CT_CLASS)
9275 {
9276 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9277 WPOOH_array.Insert(WPOF);
9278 }
9279 }
9280
9281
9283 }
9284 }
9285 }
9286
9288 {
9290 }
9291
9293 {
9295 {
9297
9300
9303
9304 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9305 }
9306 }
9307
9309 {
9311 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9312
9314 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9315
9317 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9318
9320 {
9322 }
9323 }
9324
9326 {
9328 }
9329
9331 {
9334 else
9336
9338 {
9341 }
9342 else
9343 {
9346
9349 }
9350
9352 }
9353
9355 {
9357 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9358 }
9359
9361 {
9363 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9365 }
9366
9368 {
9370 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9371 }
9372
9374 {
9377
9378 OverheatingParticle OP = new OverheatingParticle();
9383
9385 }
9386
9388 {
9391
9392 return -1;
9393 }
9394
9396 {
9398 {
9401
9402 for (int i = count; i > 0; --i)
9403 {
9404 int id = i - 1;
9407
9410
9411 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9412 {
9413 if (p)
9414 {
9417 }
9418 }
9419 }
9420 }
9421 }
9422
9424 {
9426 {
9428 {
9429 int id = i - 1;
9431
9432 if (OP)
9433 {
9435
9436 if (p)
9437 {
9439 }
9440
9441 delete OP;
9442 }
9443 }
9444
9447 }
9448 }
9449
9452 {
9453 return 0.0;
9454 }
9455
9456
9458 {
9459 return 250;
9460 }
9461
9463 {
9464 return 0;
9465 }
9466
9469 {
9471 return true;
9472
9473 return false;
9474 }
9475
9478 {
9481
9483 {
9485 }
9486 else
9487 {
9488
9490 }
9491
9493 }
9494
9501 {
9502 return -1;
9503 }
9504
9505
9506
9507
9509 {
9511 {
9512 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9513 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9514
9515 if (r_index >= 0)
9516 {
9517 InventoryLocation r_il = new InventoryLocation;
9518 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9519
9520 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9523 {
9524 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9525 }
9527 {
9528 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9529 }
9530
9531 }
9532
9533 player.GetHumanInventory().ClearUserReservedLocation(this);
9534 }
9535
9538 }
9539
9540
9541
9542
9544 {
9545 return ItemBase.m_DebugActionsMask;
9546 }
9547
9549 {
9550 return ItemBase.m_DebugActionsMask & mask;
9551 }
9552
9554 {
9555 ItemBase.m_DebugActionsMask = mask;
9556 }
9557
9559 {
9560 ItemBase.m_DebugActionsMask |= mask;
9561 }
9562
9564 {
9565 ItemBase.m_DebugActionsMask &= ~mask;
9566 }
9567
9569 {
9571 {
9573 }
9574 else
9575 {
9577 }
9578 }
9579
9580
9582 {
9583 if (GetEconomyProfile())
9584 {
9585 float q_max = GetEconomyProfile().GetQuantityMax();
9586 if (q_max > 0)
9587 {
9588 float q_min = GetEconomyProfile().GetQuantityMin();
9589 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9590
9592 {
9593 ComponentEnergyManager comp = GetCompEM();
9595 {
9597 }
9598 }
9600 {
9602
9603 }
9604
9605 }
9606 }
9607 }
9608
9611 {
9612 EntityAI parent = GetHierarchyParent();
9613
9614 if (parent)
9615 {
9616 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9617 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9618 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9619 }
9620 }
9621
9624 {
9625 EntityAI parent = GetHierarchyParent();
9626
9627 if (parent)
9628 {
9629 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9630 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9631 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9632 }
9633 }
9634
9636 {
9637
9638
9639
9640
9642
9644 {
9645 if (ScriptInputUserData.CanStoreInputUserData())
9646 {
9647 ScriptInputUserData ctx = new ScriptInputUserData;
9653 ctx.
Write(use_stack_max);
9656
9658 {
9659 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9660 }
9661 }
9662 }
9663 else if (!
g_Game.IsMultiplayer())
9664 {
9666 }
9667 }
9668
9670 {
9672 }
9673
9675 {
9677 }
9678
9680 {
9682 }
9683
9685 {
9686
9687 return false;
9688 }
9689
9691 {
9692 return false;
9693 }
9694
9698 {
9699 return false;
9700 }
9701
9703 {
9704 return "";
9705 }
9706
9708
9710 {
9711 return false;
9712 }
9713
9715 {
9716 return true;
9717 }
9718
9719
9720
9722 {
9723 return true;
9724 }
9725
9727 {
9728 return true;
9729 }
9730
9732 {
9733 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9735 }
9736
9738 {
9740 }
9741
9743 {
9745 if (!is_being_placed)
9747 SetSynchDirty();
9748 }
9749
9750
9752
9754 {
9756 }
9757
9759 {
9761 }
9762
9764 {
9765 return 1;
9766 }
9767
9769 {
9770 return false;
9771 }
9772
9774 {
9776 SetSynchDirty();
9777 }
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800
9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9814 {
9815 super.OnMovedInsideCargo(container);
9816
9817 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9818 }
9819
9820 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9821 {
9822 super.EEItemLocationChanged(oldLoc, newLoc);
9823
9824 PlayerBase newPlayer = null;
9825 PlayerBase oldPlayer = null;
9826
9827 if (newLoc.GetParent())
9828 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9829
9830 if (oldLoc.GetParent())
9831 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9832
9834 {
9835 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9836
9837 if (rIndex >= 0)
9838 {
9839 InventoryLocation rIl = new InventoryLocation;
9840 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9841
9842 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9845 {
9846 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9847 }
9849 {
9851 }
9852
9853 }
9854 }
9855
9857 {
9858 if (newPlayer)
9859 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9860
9861 if (newPlayer == oldPlayer)
9862 {
9863 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9864 {
9866 {
9867 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9868 {
9869 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9870 }
9871 }
9872 else
9873 {
9874 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9875 }
9876 }
9877
9878 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9879 {
9880 int type = oldLoc.GetType();
9882 {
9883 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9884 }
9886 {
9887 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9888 }
9889 }
9890 if (!m_OldLocation)
9891 {
9892 m_OldLocation = new InventoryLocation;
9893 }
9894 m_OldLocation.Copy(oldLoc);
9895 }
9896 else
9897 {
9898 if (m_OldLocation)
9899 {
9900 m_OldLocation.Reset();
9901 }
9902 }
9903
9904 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9905 }
9906 else
9907 {
9908 if (newPlayer)
9909 {
9910 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9911 if (resIndex >= 0)
9912 {
9913 InventoryLocation il = new InventoryLocation;
9914 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9916 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9919 {
9920 il.
GetParent().GetOnReleaseLock().Invoke(it);
9921 }
9923 {
9925 }
9926
9927 }
9928 }
9930 {
9931
9933 }
9934
9935 if (m_OldLocation)
9936 {
9937 m_OldLocation.Reset();
9938 }
9939 }
9940
9942 {
9943 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9944 }
9945
9947 {
9948 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9949 }
9950 }
9951
9952 override void EOnContact(IEntity other, Contact extra)
9953 {
9955 {
9956 int liquidType = -1;
9958 if (impactSpeed > 0.0)
9959 {
9961 #ifndef SERVER
9963 #else
9965 SetSynchDirty();
9966 #endif
9968 }
9969 }
9970
9971 #ifdef SERVER
9972 if (GetCompEM() && GetCompEM().IsPlugged())
9973 {
9974 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9975 GetCompEM().UnplugThis();
9976 }
9977 #endif
9978 }
9979
9981
9983 {
9985 }
9986
9988 {
9989
9990 }
9991
9993 {
9994 super.OnItemLocationChanged(old_owner, new_owner);
9995
9996 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9997 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9998
9999 if (!relatedPlayer && playerNew)
10000 relatedPlayer = playerNew;
10001
10002 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10003 {
10005 if (actionMgr)
10006 {
10007 ActionBase currentAction = actionMgr.GetRunningAction();
10008 if (currentAction)
10010 }
10011 }
10012
10013 Man ownerPlayerOld = null;
10014 Man ownerPlayerNew = null;
10015
10016 if (old_owner)
10017 {
10018 if (old_owner.
IsMan())
10019 {
10020 ownerPlayerOld = Man.Cast(old_owner);
10021 }
10022 else
10023 {
10024 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10025 }
10026 }
10027 else
10028 {
10030 {
10032
10033 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10034 {
10035 GetCompEM().UnplugThis();
10036 }
10037 }
10038 }
10039
10040 if (new_owner)
10041 {
10042 if (new_owner.
IsMan())
10043 {
10044 ownerPlayerNew = Man.Cast(new_owner);
10045 }
10046 else
10047 {
10048 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10049 }
10050 }
10051
10052 if (ownerPlayerOld != ownerPlayerNew)
10053 {
10054 if (ownerPlayerOld)
10055 {
10056 array<EntityAI> subItemsExit = new array<EntityAI>;
10058 for (int i = 0; i < subItemsExit.Count(); i++)
10059 {
10062 }
10063 }
10064
10065 if (ownerPlayerNew)
10066 {
10067 array<EntityAI> subItemsEnter = new array<EntityAI>;
10069 for (int j = 0; j < subItemsEnter.Count(); j++)
10070 {
10073 }
10074 }
10075 }
10076 else if (ownerPlayerNew != null)
10077 {
10078 PlayerBase nplayer;
10079 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10080 {
10081 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10083 for (int k = 0; k < subItemsUpdate.Count(); k++)
10084 {
10086 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10087 }
10088 }
10089 }
10090
10091 if (old_owner)
10092 old_owner.OnChildItemRemoved(this);
10093 if (new_owner)
10094 new_owner.OnChildItemReceived(this);
10095 }
10096
10097
10099 {
10100 super.EEDelete(parent);
10101 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10102 if (player)
10103 {
10105
10106 if (player.IsAlive())
10107 {
10108 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10109 if (r_index >= 0)
10110 {
10111 InventoryLocation r_il = new InventoryLocation;
10112 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10113
10114 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10117 {
10118 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10119 }
10121 {
10122 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10123 }
10124
10125 }
10126
10127 player.RemoveQuickBarEntityShortcut(this);
10128 }
10129 }
10130 }
10131
10133 {
10134 super.EEKilled(killer);
10135
10138 {
10139 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10140 {
10141 if (IsMagazine())
10142 {
10143 if (Magazine.Cast(this).GetAmmoCount() > 0)
10144 {
10146 }
10147 }
10148 else
10149 {
10151 }
10152 }
10153 }
10154 }
10155
10157 {
10158 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10159
10160 super.OnWasAttached(parent, slot_id);
10161
10164
10167 }
10168
10170 {
10171 super.OnWasDetached(parent, slot_id);
10172
10175
10178 }
10179
10181 {
10182 int idx;
10185
10186 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10187 if (inventory_slots.Count() < 1)
10188 {
10189 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10190 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10191 }
10192 else
10193 {
10194 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10195 }
10196
10197 idx = inventory_slots.Find(slot);
10198 if (idx < 0)
10199 return "";
10200
10201 return attach_types.Get(idx);
10202 }
10203
10205 {
10206 int idx = -1;
10207 string slot;
10208
10211
10212 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10213 if (inventory_slots.Count() < 1)
10214 {
10215 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10216 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10217 }
10218 else
10219 {
10220 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10221 if (detach_types.Count() < 1)
10222 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10223 }
10224
10225 for (int i = 0; i < inventory_slots.Count(); i++)
10226 {
10227 slot = inventory_slots.Get(i);
10228 }
10229
10230 if (slot != "")
10231 {
10232 if (detach_types.Count() == 1)
10233 idx = 0;
10234 else
10235 idx = inventory_slots.Find(slot);
10236 }
10237 if (idx < 0)
10238 return "";
10239
10240 return detach_types.Get(idx);
10241 }
10242
10244 {
10245
10247
10248
10249 float min_time = 1;
10250 float max_time = 3;
10251 float delay = Math.RandomFloat(min_time, max_time);
10252
10253 explode_timer.Run(delay, this, "DoAmmoExplosion");
10254 }
10255
10257 {
10258 Magazine magazine = Magazine.Cast(this);
10259 int pop_sounds_count = 6;
10260 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10261
10262
10263 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10264 string sound_name = pop_sounds[ sound_idx ];
10265 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10266
10267
10268 magazine.ServerAddAmmoCount(-1);
10269
10270
10271 float min_temp_to_explode = 100;
10272
10273 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10274 {
10276 }
10277 }
10278
10279
10280 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10281 {
10282 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10283
10284 const int CHANCE_DAMAGE_CARGO = 4;
10285 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10286 const int CHANCE_DAMAGE_NOTHING = 2;
10287
10289 {
10290 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10291 int chances;
10292 int rnd;
10293
10294 if (GetInventory().GetCargo())
10295 {
10296 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10297 rnd = Math.RandomInt(0,chances);
10298
10299 if (rnd < CHANCE_DAMAGE_CARGO)
10300 {
10302 }
10303 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10304 {
10306 }
10307 }
10308 else
10309 {
10310 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10311 rnd = Math.RandomInt(0,chances);
10312
10313 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10314 {
10316 }
10317 }
10318 }
10319 }
10320
10322 {
10323 CargoBase cargo = GetInventory().GetCargo();
10324 if (cargo)
10325 {
10327 if (item_count > 0)
10328 {
10329 int random_pick = Math.RandomInt(0, item_count);
10331 if (!item.IsExplosive())
10332 {
10333 item.AddHealth("","",damage);
10334 return true;
10335 }
10336 }
10337 }
10338 return false;
10339 }
10340
10342 {
10343 GameInventory inventory = GetInventory();
10345 if (attachment_count > 0)
10346 {
10347 int random_pick = Math.RandomInt(0, attachment_count);
10349 if (!attachment.IsExplosive())
10350 {
10351 attachment.AddHealth("","",damage);
10352 return true;
10353 }
10354 }
10355 return false;
10356 }
10357
10359 {
10361 }
10362
10364 {
10366 return GetInventory().CanRemoveEntity();
10367
10368 return false;
10369 }
10370
10372 {
10373
10375 return false;
10376
10377
10379 return false;
10380
10381
10382
10384 if (delta == 0)
10385 return false;
10386
10387
10388 return true;
10389 }
10390
10392 {
10394 {
10395 if (ScriptInputUserData.CanStoreInputUserData())
10396 {
10397 ScriptInputUserData ctx = new ScriptInputUserData;
10402 ctx.
Write(destination_entity);
10404 ctx.
Write(slot_id);
10406 }
10407 }
10408 else if (!
g_Game.IsMultiplayer())
10409 {
10411 }
10412 }
10413
10415 {
10416 float split_quantity_new;
10420 InventoryLocation loc = new InventoryLocation;
10421
10422 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10423 {
10425 split_quantity_new = stack_max;
10426 else
10428
10430 {
10431 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10432 if (new_item)
10433 {
10434 new_item.SetResultOfSplit(true);
10435 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10437 new_item.
SetQuantity(split_quantity_new,
false,
true);
10438 }
10439 }
10440 }
10441 else if (destination_entity && slot_id == -1)
10442 {
10443 if (quantity > stack_max)
10444 split_quantity_new = stack_max;
10445 else
10446 split_quantity_new = quantity;
10447
10449 {
10450 GameInventory destinationInventory = destination_entity.GetInventory();
10452 {
10455 }
10456
10457 if (new_item)
10458 {
10459 new_item.SetResultOfSplit(true);
10460 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10462 new_item.
SetQuantity(split_quantity_new,
false,
true);
10463 }
10464 }
10465 }
10466 else
10467 {
10468 if (stack_max != 0)
10469 {
10471 {
10473 }
10474
10475 if (split_quantity_new == 0)
10476 {
10477 if (!
g_Game.IsMultiplayer())
10478 player.PhysicalPredictiveDropItem(this);
10479 else
10480 player.ServerDropEntity(this);
10481 return;
10482 }
10483
10485 {
10487
10488 if (new_item)
10489 {
10490 new_item.SetResultOfSplit(true);
10491 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10494 new_item.PlaceOnSurface();
10495 }
10496 }
10497 }
10498 }
10499 }
10500
10502 {
10503 float split_quantity_new;
10507 InventoryLocation loc = new InventoryLocation;
10508
10509 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10510 {
10512 split_quantity_new = stack_max;
10513 else
10515
10517 {
10518 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10519 if (new_item)
10520 {
10521 new_item.SetResultOfSplit(true);
10522 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10524 new_item.
SetQuantity(split_quantity_new,
false,
true);
10525 }
10526 }
10527 }
10528 else if (destination_entity && slot_id == -1)
10529 {
10530 if (quantity > stack_max)
10531 split_quantity_new = stack_max;
10532 else
10533 split_quantity_new = quantity;
10534
10536 {
10537 GameInventory destinationInventory = destination_entity.GetInventory();
10539 {
10542 }
10543
10544 if (new_item)
10545 {
10546 new_item.SetResultOfSplit(true);
10547 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10549 new_item.
SetQuantity(split_quantity_new,
false,
true);
10550 }
10551 }
10552 }
10553 else
10554 {
10555 if (stack_max != 0)
10556 {
10558 {
10560 }
10561
10563 {
10565
10566 if (new_item)
10567 {
10568 new_item.SetResultOfSplit(true);
10569 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10572 new_item.PlaceOnSurface();
10573 }
10574 }
10575 }
10576 }
10577 }
10578
10580 {
10582 {
10583 if (ScriptInputUserData.CanStoreInputUserData())
10584 {
10585 ScriptInputUserData ctx = new ScriptInputUserData;
10590 dst.WriteToContext(ctx);
10592 }
10593 }
10594 else if (!
g_Game.IsMultiplayer())
10595 {
10597 }
10598 }
10599
10601 {
10603 {
10604 if (ScriptInputUserData.CanStoreInputUserData())
10605 {
10606 ScriptInputUserData ctx = new ScriptInputUserData;
10611 ctx.
Write(destination_entity);
10617 }
10618 }
10619 else if (!
g_Game.IsMultiplayer())
10620 {
10622 }
10623 }
10624
10626 {
10628 }
10629
10631 {
10633 float split_quantity_new;
10635 if (dst.IsValid())
10636 {
10637 int slot_id = dst.GetSlot();
10639
10640 if (quantity > stack_max)
10641 split_quantity_new = stack_max;
10642 else
10643 split_quantity_new = quantity;
10644
10646 {
10648
10649 if (new_item)
10650 {
10651 new_item.SetResultOfSplit(true);
10652 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10654 new_item.
SetQuantity(split_quantity_new,
false,
true);
10655 }
10656
10657 return new_item;
10658 }
10659 }
10660
10661 return null;
10662 }
10663
10665 {
10667 float split_quantity_new;
10669 if (destination_entity)
10670 {
10672 if (quantity > stackable)
10673 split_quantity_new = stackable;
10674 else
10675 split_quantity_new = quantity;
10676
10678 {
10679 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10680 if (new_item)
10681 {
10682 new_item.SetResultOfSplit(true);
10683 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10685 new_item.
SetQuantity(split_quantity_new,
false,
true);
10686 }
10687 }
10688 }
10689 }
10690
10692 {
10694 {
10695 if (ScriptInputUserData.CanStoreInputUserData())
10696 {
10697 ScriptInputUserData ctx = new ScriptInputUserData;
10702 ItemBase destination_entity =
this;
10703 ctx.
Write(destination_entity);
10707 }
10708 }
10709 else if (!
g_Game.IsMultiplayer())
10710 {
10712 }
10713 }
10714
10716 {
10718 float split_quantity_new;
10720 if (player)
10721 {
10723 if (quantity > stackable)
10724 split_quantity_new = stackable;
10725 else
10726 split_quantity_new = quantity;
10727
10729 {
10730 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10731 new_item =
ItemBase.Cast(in_hands);
10732 if (new_item)
10733 {
10734 new_item.SetResultOfSplit(true);
10735 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10737 new_item.SetQuantity(split_quantity_new, false, true);
10738 }
10739 }
10740 }
10741 }
10742
10744 {
10746 float split_quantity_new = Math.Floor(quantity * 0.5);
10747
10749 return;
10750
10752
10753 if (new_item)
10754 {
10755 if (new_item.GetQuantityMax() < split_quantity_new)
10756 {
10757 split_quantity_new = new_item.GetQuantityMax();
10758 }
10759
10760 new_item.SetResultOfSplit(true);
10761 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10762
10764 {
10767 }
10768 else
10769 {
10771 new_item.
SetQuantity(split_quantity_new,
false,
true);
10772 }
10773 }
10774 }
10775
10777 {
10779 float split_quantity_new = Math.Floor(quantity / 2);
10780
10782 return;
10783
10784 InventoryLocation invloc = new InventoryLocation;
10786
10788 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10789
10790 if (new_item)
10791 {
10792 if (new_item.GetQuantityMax() < split_quantity_new)
10793 {
10794 split_quantity_new = new_item.GetQuantityMax();
10795 }
10797 {
10800 }
10801 else if (split_quantity_new > 1)
10802 {
10804 new_item.
SetQuantity(split_quantity_new,
false,
true);
10805 }
10806 }
10807 }
10808
10811 {
10812 SetWeightDirty();
10814
10815 if (parent)
10816 parent.OnAttachmentQuantityChangedEx(this, delta);
10817
10819 {
10821 {
10823 }
10825 {
10826 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10828 }
10829 }
10830 }
10831
10834 {
10835
10836 }
10837
10840 {
10842 }
10843
10845 {
10846 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10847
10849 {
10850 if (newLevel == GameConstants.STATE_RUINED)
10851 {
10853 EntityAI parent = GetHierarchyParent();
10854 if (parent && parent.IsFireplace())
10855 {
10856 CargoBase cargo = GetInventory().GetCargo();
10857 if (cargo)
10858 {
10860 {
10862 }
10863 }
10864 }
10865 }
10866
10868 {
10869
10871 return;
10872 }
10873
10874 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10875 {
10877 }
10878 }
10879 }
10880
10881
10883 {
10884 super.OnRightClick();
10885
10887 {
10889 {
10890 if (ScriptInputUserData.CanStoreInputUserData())
10891 {
10892 EntityAI root = GetHierarchyRoot();
10893 Man playerOwner = GetHierarchyRootPlayer();
10894 InventoryLocation dst = new InventoryLocation;
10895
10896
10897 if (!playerOwner && root && root == this)
10898 {
10900 }
10901 else
10902 {
10903
10904 GetInventory().GetCurrentInventoryLocation(dst);
10906 {
10907 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10909 {
10911 }
10912 else
10913 {
10915
10916
10917 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10918 {
10920 }
10921 else
10922 {
10923 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10924 }
10925 }
10926 }
10927 }
10928
10929 ScriptInputUserData ctx = new ScriptInputUserData;
10937 }
10938 }
10939 else if (!
g_Game.IsMultiplayer())
10940 {
10942 }
10943 }
10944 }
10945
10947 {
10948 if (root)
10949 {
10950 vector m4[4];
10951 root.GetTransform(m4);
10952 dst.SetGround(this, m4);
10953 }
10954 else
10955 {
10956 GetInventory().GetCurrentInventoryLocation(dst);
10957 }
10958 }
10959
10960 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10961 {
10962
10963 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10964 return false;
10965
10966 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10967 return false;
10968
10969
10971 return false;
10972
10973
10974 Magazine mag = Magazine.Cast(this);
10975 if (mag)
10976 {
10977 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10978 return false;
10979
10980 if (stack_max_limit)
10981 {
10982 Magazine other_mag = Magazine.Cast(other_item);
10983 if (other_item)
10984 {
10985 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10986 return false;
10987 }
10988
10989 }
10990 }
10991 else
10992 {
10993
10995 return false;
10996
10998 return false;
10999 }
11000
11001 PlayerBase player = null;
11002 if (CastTo(player, GetHierarchyRootPlayer()))
11003 {
11004 if (player.GetInventory().HasAttachment(this))
11005 return false;
11006
11007 if (player.IsItemsToDelete())
11008 return false;
11009 }
11010
11011 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11012 return false;
11013
11014 int slotID;
11016 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11017 return false;
11018
11019 return true;
11020 }
11021
11023 {
11025 }
11026
11028 {
11029 return m_IsResultOfSplit;
11030 }
11031
11033 {
11034 m_IsResultOfSplit = value;
11035 }
11036
11038 {
11040 }
11041
11043 {
11044 float other_item_quantity = other_item.GetQuantity();
11045 float this_free_space;
11046
11048
11050
11051 if (other_item_quantity > this_free_space)
11052 {
11053 return this_free_space;
11054 }
11055 else
11056 {
11057 return other_item_quantity;
11058 }
11059 }
11060
11062 {
11064 }
11065
11067 {
11069 return;
11070
11071 if (!IsMagazine() && other_item)
11072 {
11074 if (quantity_used != 0)
11075 {
11076 float hp1 = GetHealth01("","");
11077 float hp2 = other_item.GetHealth01("","");
11078 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11079 hpResult = hpResult / (
GetQuantity() + quantity_used);
11080
11081 hpResult *= GetMaxHealth();
11082 Math.Round(hpResult);
11083 SetHealth("", "Health", hpResult);
11084
11086 other_item.AddQuantity(-quantity_used);
11087 }
11088 }
11090 }
11091
11093 {
11094 #ifdef SERVER
11095 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11096 GetHierarchyParent().IncreaseLifetimeUp();
11097 #endif
11098 };
11099
11101 {
11102 PlayerBase p = PlayerBase.Cast(player);
11103
11104 array<int> recipesIds = p.m_Recipes;
11105 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11106 if (moduleRecipesManager)
11107 {
11108 EntityAI itemInHands = player.GetEntityInHands();
11109 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11110 }
11111
11112 for (int i = 0;i < recipesIds.Count(); i++)
11113 {
11114 int key = recipesIds.Get(i);
11115 string recipeName = moduleRecipesManager.GetRecipeName(key);
11117 }
11118 }
11119
11120
11121 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11122 {
11123 super.GetDebugActions(outputList);
11124
11125
11131
11132
11137
11142
11143
11147
11148
11150 {
11154 }
11155
11158
11159
11163
11165
11166 InventoryLocation loc = new InventoryLocation();
11167 GetInventory().GetCurrentInventoryLocation(loc);
11169 {
11170 if (Gizmo_IsSupported())
11173 }
11174
11176 }
11177
11178
11179
11180
11182 {
11183 super.OnAction(action_id, player, ctx);
11184
11186 {
11187 switch (action_id)
11188 {
11192 return true;
11196 return true;
11197 }
11198 }
11199
11201 {
11202 switch (action_id)
11203 {
11205 Delete();
11206 return true;
11207 }
11208 }
11209
11210 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11211 {
11212 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11213 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11214 PlayerBase p = PlayerBase.Cast(player);
11215 if (
EActions.RECIPES_RANGE_START < 1000)
11216 {
11217 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11218 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11219 }
11220 }
11221 #ifndef SERVER
11222 else if (action_id ==
EActions.WATCH_PLAYER)
11223 {
11224 PluginDeveloper.SetDeveloperItemClientEx(player);
11225 }
11226 #endif
11228 {
11229 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11230 {
11231 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11232 OnDebugButtonPressServer(id + 1);
11233 }
11234
11235 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11236 {
11237 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11239 }
11240
11241 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11242 {
11243 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11245 }
11246
11247 else if (action_id ==
EActions.ADD_QUANTITY)
11248 {
11249 if (IsMagazine())
11250 {
11251 Magazine mag = Magazine.Cast(this);
11252 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11253 }
11254 else
11255 {
11257 }
11258
11259 if (m_EM)
11260 {
11261 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11262 }
11263
11264 }
11265
11266 else if (action_id ==
EActions.REMOVE_QUANTITY)
11267 {
11268 if (IsMagazine())
11269 {
11270 Magazine mag2 = Magazine.Cast(this);
11271 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11272 }
11273 else
11274 {
11276 }
11277 if (m_EM)
11278 {
11279 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11280 }
11281
11282 }
11283
11284 else if (action_id ==
EActions.SET_QUANTITY_0)
11285 {
11287
11288 if (m_EM)
11289 {
11290 m_EM.SetEnergy(0);
11291 }
11292 }
11293
11294 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11295 {
11297
11298 if (m_EM)
11299 {
11300 m_EM.SetEnergy(m_EM.GetEnergyMax());
11301 }
11302 }
11303
11304 else if (action_id ==
EActions.ADD_HEALTH)
11305 {
11306 AddHealth("","",GetMaxHealth("","Health")/5);
11307 }
11308 else if (action_id ==
EActions.REMOVE_HEALTH)
11309 {
11310 AddHealth("","",-GetMaxHealth("","Health")/5);
11311 }
11312 else if (action_id ==
EActions.DESTROY_HEALTH)
11313 {
11314 SetHealth01("","",0);
11315 }
11316 else if (action_id ==
EActions.WATCH_ITEM)
11317 {
11319 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11320 #ifdef DEVELOPER
11321 SetDebugDeveloper_item(this);
11322 #endif
11323 }
11324
11325 else if (action_id ==
EActions.ADD_TEMPERATURE)
11326 {
11327 AddTemperature(20);
11328
11329 }
11330
11331 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11332 {
11333 AddTemperature(-20);
11334
11335 }
11336
11337 else if (action_id ==
EActions.FLIP_FROZEN)
11338 {
11339 SetFrozen(!GetIsFrozen());
11340
11341 }
11342
11343 else if (action_id ==
EActions.ADD_WETNESS)
11344 {
11346
11347 }
11348
11349 else if (action_id ==
EActions.REMOVE_WETNESS)
11350 {
11352
11353 }
11354
11355 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11356 {
11359
11360
11361 }
11362
11363 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11364 {
11367 }
11368
11369 else if (action_id ==
EActions.MAKE_SPECIAL)
11370 {
11371 auto debugParams = DebugSpawnParams.WithPlayer(player);
11372 OnDebugSpawnEx(debugParams);
11373 }
11374
11375 }
11376
11377
11378 return false;
11379 }
11380
11381
11382
11383
11387
11390
11391
11392
11394 {
11395 return false;
11396 }
11397
11398
11400 {
11401 return true;
11402 }
11403
11404
11406 {
11407 return true;
11408 }
11409
11410
11411
11413 {
11414 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11415 return g_Game.ConfigIsExisting(config_path);
11416 }
11417
11420 {
11421 return null;
11422 }
11423
11425 {
11426 return false;
11427 }
11428
11430 {
11431 return false;
11432 }
11433
11437
11438
11440 {
11441 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11442 return module_repairing.CanRepair(this, item_repair_kit);
11443 }
11444
11445
11446 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11447 {
11448 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11449 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11450 }
11451
11452
11454 {
11455
11456
11457
11458
11459
11460
11461
11462
11463 return 1;
11464 }
11465
11466
11467
11469 {
11471 }
11472
11473
11474
11476 {
11478 }
11479
11480
11489 {
11490 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11491
11492 if (player)
11493 {
11494 player.MessageStatus(text);
11495 }
11496 }
11497
11498
11507 {
11508 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11509
11510 if (player)
11511 {
11512 player.MessageAction(text);
11513 }
11514 }
11515
11516
11525 {
11526 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11527
11528 if (player)
11529 {
11530 player.MessageFriendly(text);
11531 }
11532 }
11533
11534
11543 {
11544 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11545
11546 if (player)
11547 {
11548 player.MessageImportant(text);
11549 }
11550 }
11551
11553 {
11554 return true;
11555 }
11556
11557
11558 override bool KindOf(
string tag)
11559 {
11560 bool found = false;
11561 string item_name = this.
GetType();
11563 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11564
11565 int array_size = item_tag_array.Count();
11566 for (int i = 0; i < array_size; i++)
11567 {
11568 if (item_tag_array.Get(i) == tag)
11569 {
11570 found = true;
11571 break;
11572 }
11573 }
11574 return found;
11575 }
11576
11577
11579 {
11580
11581 super.OnRPC(sender, rpc_type,ctx);
11582
11583
11584 switch (rpc_type)
11585 {
11586 #ifndef SERVER
11587 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11588 Param2<bool, string> p = new Param2<bool, string>(false, "");
11589
11591 return;
11592
11593 bool play = p.param1;
11594 string soundSet = p.param2;
11595
11596 if (play)
11597 {
11599 {
11601 {
11603 }
11604 }
11605 else
11606 {
11608 }
11609 }
11610 else
11611 {
11613 }
11614
11615 break;
11616 #endif
11617
11618 }
11619
11621 {
11623 }
11624 }
11625
11626
11627
11628
11630 {
11631 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11632 return plugin.GetID(
name);
11633 }
11634
11636 {
11637 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11638 return plugin.GetName(id);
11639 }
11640
11643 {
11644
11645
11646 int varFlags;
11647 if (!ctx.
Read(varFlags))
11648 return;
11649
11650 if (varFlags & ItemVariableFlags.FLOAT)
11651 {
11653 }
11654 }
11655
11657 {
11658
11659 super.SerializeNumericalVars(floats_out);
11660
11661
11662
11664 {
11666 }
11667
11669 {
11671 }
11672
11674 {
11676 }
11677
11679 {
11684 }
11685
11687 {
11689 }
11690 }
11691
11693 {
11694
11695 super.DeSerializeNumericalVars(floats);
11696
11697
11698 int index = 0;
11699 int mask = Math.Round(floats.Get(index));
11700
11701 index++;
11702
11704 {
11706 {
11708 }
11709 else
11710 {
11711 float quantity = floats.Get(index);
11712 SetQuantity(quantity,
true,
false,
false,
false);
11713 }
11714 index++;
11715 }
11716
11718 {
11719 float wet = floats.Get(index);
11721 index++;
11722 }
11723
11725 {
11726 int liquidtype = Math.Round(floats.Get(index));
11728 index++;
11729 }
11730
11732 {
11734 index++;
11736 index++;
11738 index++;
11740 index++;
11741 }
11742
11744 {
11745 int cleanness = Math.Round(floats.Get(index));
11747 index++;
11748 }
11749 }
11750
11752 {
11753 super.WriteVarsToCTX(ctx);
11754
11755
11757 {
11759 }
11760
11762 {
11764 }
11765
11767 {
11769 }
11770
11772 {
11773 int r,g,b,a;
11779 }
11780
11782 {
11784 }
11785 }
11786
11788 {
11789 if (!super.ReadVarsFromCTX(ctx,version))
11790 return false;
11791
11792 int intValue;
11793 float value;
11794
11795 if (version < 140)
11796 {
11797 if (!ctx.
Read(intValue))
11798 return false;
11799
11800 m_VariablesMask = intValue;
11801 }
11802
11804 {
11805 if (!ctx.
Read(value))
11806 return false;
11807
11809 {
11811 }
11812 else
11813 {
11815 }
11816 }
11817
11818 if (version < 140)
11819 {
11821 {
11822 if (!ctx.
Read(value))
11823 return false;
11824 SetTemperatureDirect(value);
11825 }
11826 }
11827
11829 {
11830 if (!ctx.
Read(value))
11831 return false;
11833 }
11834
11836 {
11837 if (!ctx.
Read(intValue))
11838 return false;
11840 }
11841
11843 {
11844 int r,g,b,a;
11846 return false;
11848 return false;
11850 return false;
11852 return false;
11853
11855 }
11856
11858 {
11859 if (!ctx.
Read(intValue))
11860 return false;
11862 }
11863
11864 if (version >= 138 && version < 140)
11865 {
11867 {
11868 if (!ctx.
Read(intValue))
11869 return false;
11870 SetFrozen(intValue);
11871 }
11872 }
11873
11874 return true;
11875 }
11876
11877
11879 {
11882 {
11884 }
11885
11886 if (!super.OnStoreLoad(ctx, version))
11887 {
11889 return false;
11890 }
11891
11892 if (version >= 114)
11893 {
11894 bool hasQuickBarIndexSaved;
11895
11896 if (!ctx.
Read(hasQuickBarIndexSaved))
11897 {
11899 return false;
11900 }
11901
11902 if (hasQuickBarIndexSaved)
11903 {
11904 int itmQBIndex;
11905
11906
11907 if (!ctx.
Read(itmQBIndex))
11908 {
11910 return false;
11911 }
11912
11913 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11914 if (itmQBIndex != -1 && parentPlayer)
11915 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11916 }
11917 }
11918 else
11919 {
11920
11921 PlayerBase player;
11922 int itemQBIndex;
11923 if (version ==
int.
MAX)
11924 {
11925 if (!ctx.
Read(itemQBIndex))
11926 {
11928 return false;
11929 }
11930 }
11931 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11932 {
11933
11934 if (!ctx.
Read(itemQBIndex))
11935 {
11937 return false;
11938 }
11939 if (itemQBIndex != -1 && player)
11940 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11941 }
11942 }
11943
11944 if (version < 140)
11945 {
11946
11947 if (!LoadVariables(ctx, version))
11948 {
11950 return false;
11951 }
11952 }
11953
11954
11956 {
11958 return false;
11959 }
11960 if (version >= 132)
11961 {
11963 if (raib)
11964 {
11966 {
11968 return false;
11969 }
11970 }
11971 }
11972
11974 return true;
11975 }
11976
11977
11978
11980 {
11981 super.OnStoreSave(ctx);
11982
11983 PlayerBase player;
11984 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11985 {
11987
11988 int itemQBIndex = -1;
11989 itemQBIndex = player.FindQuickBarEntityIndex(this);
11990 ctx.
Write(itemQBIndex);
11991 }
11992 else
11993 {
11995 }
11996
11998
12000 if (raib)
12001 {
12003 }
12004 }
12005
12006
12008 {
12009 super.AfterStoreLoad();
12010
12012 {
12014 }
12015
12017 {
12020 }
12021 }
12022
12024 {
12025 super.EEOnAfterLoad();
12026
12028 {
12030 }
12031
12034 }
12035
12037 {
12038 return false;
12039 }
12040
12041
12042
12044 {
12046 {
12047 #ifdef PLATFORM_CONSOLE
12048
12050 {
12052 if (menu)
12053 {
12055 }
12056 }
12057 #endif
12058 }
12059
12061 {
12064 }
12065
12067 {
12068 SetWeightDirty();
12070 }
12072 {
12075 }
12076
12078 {
12081
12084 }
12086 {
12090 }
12091
12092 super.OnVariablesSynchronized();
12093 }
12094
12095
12096
12098 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12099 {
12100 if (!IsServerCheck(allow_client))
12101 return false;
12102
12104 return false;
12105
12108
12109 if (value <= (min + 0.001))
12110 value = min;
12111
12112 if (value == min)
12113 {
12114 if (destroy_config)
12115 {
12116 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12117 if (dstr)
12118 {
12120 this.Delete();
12121 return true;
12122 }
12123 }
12124 else if (destroy_forced)
12125 {
12127 this.Delete();
12128 return true;
12129 }
12130
12132 }
12133
12136
12138 {
12139 EntityAI parent = GetHierarchyRoot();
12140 InventoryLocation iLoc = new InventoryLocation();
12141 GetInventory().GetCurrentInventoryLocation(iLoc);
12143 {
12144 int iLocSlot = iLoc.
GetSlot();
12146 {
12148 }
12150 {
12152 }
12153 }
12154 }
12155
12157 {
12159
12160 if (delta)
12162 }
12163
12165
12166 return false;
12167 }
12168
12169
12171 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12172 {
12174 }
12175
12177 {
12180 }
12181
12183 {
12186 }
12187
12189 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12190 {
12191 float value_clamped = Math.Clamp(value, 0, 1);
12193 SetQuantity(result, destroy_config, destroy_forced);
12194 }
12195
12196
12199 {
12201 }
12202
12204 {
12206 }
12207
12208
12209
12210
12211
12212
12213
12214
12215
12216
12218 {
12219 int slot = -1;
12220 GameInventory inventory = GetInventory();
12221 if (inventory)
12222 {
12223 InventoryLocation il = new InventoryLocation;
12226 }
12227
12229 }
12230
12232 {
12233 float quantity_max = 0;
12234
12236 {
12237 if (attSlotID != -1)
12238 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12239
12240 if (quantity_max <= 0)
12242 }
12243
12244 if (quantity_max <= 0)
12246
12247 return quantity_max;
12248 }
12249
12251 {
12253 }
12254
12256 {
12258 }
12259
12260
12262 {
12264 }
12265
12267 {
12269 }
12270
12272 {
12274 }
12275
12276
12278 {
12279
12280 float weightEx = GetWeightEx();
12281 float special = GetInventoryAndCargoWeight();
12282 return weightEx - special;
12283 }
12284
12285
12287 {
12289 }
12290
12292 {
12294 {
12295 #ifdef DEVELOPER
12296 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12297 {
12298 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12300 }
12301 #endif
12302
12303 return GetQuantity() * GetConfigWeightModified();
12304 }
12305 else if (HasEnergyManager())
12306 {
12307 #ifdef DEVELOPER
12308 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12309 {
12310 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12311 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12312 }
12313 #endif
12314 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12315 }
12316 else
12317 {
12318 #ifdef DEVELOPER
12319 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12320 {
12321 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12322 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12323 }
12324 #endif
12325 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12326 }
12327 }
12328
12331 {
12332 int item_count = 0;
12334
12335 GameInventory inventory = GetInventory();
12336 CargoBase cargo = inventory.
GetCargo();
12337 if (cargo != NULL)
12338 {
12340 }
12341
12343 for (int i = 0; i < nAttachments; ++i)
12344 {
12346 if (item)
12347 item_count += item.GetNumberOfItems();
12348 }
12349 return item_count;
12350 }
12351
12354 {
12355 float weight = 0;
12356 float wetness = 1;
12357 if (include_wetness)
12360 {
12361 weight = wetness * m_ConfigWeight;
12362 }
12364 {
12365 weight = 1;
12366 }
12367 return weight;
12368 }
12369
12370
12371
12373 {
12374 GameInventory inventory = GetInventory();
12375 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12376 {
12377 array<EntityAI> items = new array<EntityAI>;
12379 for (int i = 0; i < items.Count(); ++i)
12380 {
12382 if (item)
12383 {
12384 g_Game.ObjectDelete(item);
12385 }
12386 }
12387 }
12388 }
12389
12390
12391
12392
12394 {
12395 float energy = 0;
12396 if (HasEnergyManager())
12397 {
12398 energy = GetCompEM().GetEnergy();
12399 }
12400 return energy;
12401 }
12402
12403
12405 {
12406 super.OnEnergyConsumed();
12407
12409 }
12410
12412 {
12413 super.OnEnergyAdded();
12414
12416 }
12417
12418
12420 {
12421 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12422 {
12424 {
12425 float energy_0to1 = GetCompEM().GetEnergy0To1();
12427 }
12428 }
12429 }
12430
12431
12433 {
12434 return ConfigGetFloat("heatIsolation");
12435 }
12436
12438 {
12440 }
12441
12443 {
12444 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12445 if (
g_Game.ConfigIsExisting(paramPath))
12446 return g_Game.ConfigGetFloat(paramPath);
12447
12448 return 0.0;
12449 }
12450
12452 {
12453 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12454 if (
g_Game.ConfigIsExisting(paramPath))
12455 return g_Game.ConfigGetFloat(paramPath);
12456
12457 return 0.0;
12458 }
12459
12460 override void SetWet(
float value,
bool allow_client =
false)
12461 {
12462 if (!IsServerCheck(allow_client))
12463 return;
12464
12467
12469
12470 m_VarWet = Math.Clamp(value, min, max);
12471
12473 {
12476 }
12477 }
12478
12479 override void AddWet(
float value)
12480 {
12482 }
12483
12485 {
12487 }
12488
12490 {
12492 }
12493
12495 {
12497 }
12498
12500 {
12502 }
12503
12505 {
12507 }
12508
12509 override void OnWetChanged(
float newVal,
float oldVal)
12510 {
12513 if (newLevel != oldLevel)
12514 {
12516 }
12517 }
12518
12520 {
12521 SetWeightDirty();
12522 }
12523
12525 {
12526 return GetWetLevelInternal(
m_VarWet);
12527 }
12528
12529
12530
12532 {
12534 }
12535
12537 {
12539 }
12540
12542 {
12544 }
12545
12547 {
12549 }
12550
12551
12552
12554 {
12555 if (ConfigIsExisting("itemModelLength"))
12556 {
12557 return ConfigGetFloat("itemModelLength");
12558 }
12559 return 0;
12560 }
12561
12563 {
12564 if (ConfigIsExisting("itemAttachOffset"))
12565 {
12566 return ConfigGetFloat("itemAttachOffset");
12567 }
12568 return 0;
12569 }
12570
12571 override void SetCleanness(
int value,
bool allow_client =
false)
12572 {
12573 if (!IsServerCheck(allow_client))
12574 return;
12575
12577
12579
12582 }
12583
12585 {
12587 }
12588
12590 {
12591 return true;
12592 }
12593
12594
12595
12596
12598 {
12600 }
12601
12603 {
12605 }
12606
12607
12608
12609
12610 override void SetColor(
int r,
int g,
int b,
int a)
12611 {
12617 }
12619 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12620 {
12625 }
12626
12628 {
12630 }
12631
12634 {
12635 int r,g,b,a;
12637 r = r/255;
12638 g = g/255;
12639 b = b/255;
12640 a = a/255;
12641 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12642 }
12643
12644
12645
12646 override void SetLiquidType(
int value,
bool allow_client =
false)
12647 {
12648 if (!IsServerCheck(allow_client))
12649 return;
12650
12655 }
12656
12658 {
12659 return ConfigGetInt("varLiquidTypeInit");
12660 }
12661
12663 {
12665 }
12666
12668 {
12670 SetFrozen(false);
12671 }
12672
12675 {
12676 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12677 }
12678
12679
12682 {
12683 PlayerBase nplayer;
12684 if (PlayerBase.CastTo(nplayer, player))
12685 {
12687 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12688 }
12689 }
12690
12691
12694 {
12695 PlayerBase nplayer;
12696 if (PlayerBase.CastTo(nplayer,player))
12697 {
12698 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12699 }
12700
12701 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12702
12703 if (HasEnergyManager())
12704 {
12705 GetCompEM().UpdatePlugState();
12706 }
12707 }
12708
12709
12711 {
12712 super.OnPlacementStarted(player);
12713
12715 }
12716
12717 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12718 {
12720 {
12721 m_AdminLog.OnPlacementComplete(player,
this);
12722 }
12723
12724 super.OnPlacementComplete(player, position, orientation);
12725 }
12726
12727
12728
12729
12730
12732 {
12734 {
12735 return true;
12736 }
12737 else
12738 {
12739 return false;
12740 }
12741 }
12742
12743
12745 {
12747 {
12749 }
12750 }
12751
12752
12754 {
12756 }
12757
12759 {
12761 }
12762
12763 override void InsertAgent(
int agent,
float count = 1)
12764 {
12765 if (count < 1)
12766 return;
12767
12769 }
12770
12773 {
12775 }
12776
12777
12779 {
12781 }
12782
12783
12784
12785
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12825 {
12827 return false;
12828 return true;
12829 }
12830
12832 {
12833
12835 }
12836
12837
12840 {
12841 super.CheckForRoofLimited(timeTresholdMS);
12842
12843 float time =
g_Game.GetTime();
12844 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12845 {
12846 m_PreviousRoofTestTime = time;
12847 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12848 }
12849 }
12850
12851
12853 {
12855 {
12856 return 0;
12857 }
12858
12859 if (GetInventory().GetAttachmentSlotsCount() != 0)
12860 {
12861 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12862 if (filter)
12863 return filter.GetProtectionLevel(type, false, system);
12864 else
12865 return 0;
12866 }
12867
12868 string subclassPath, entryName;
12869
12870 switch (type)
12871 {
12873 entryName = "biological";
12874 break;
12876 entryName = "chemical";
12877 break;
12878 default:
12879 entryName = "biological";
12880 break;
12881 }
12882
12883 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12884
12885 return g_Game.ConfigGetFloat(subclassPath + entryName);
12886 }
12887
12888
12889
12892 {
12893 if (!IsMagazine())
12895
12897 }
12898
12899
12900
12901
12902
12907 {
12908 return true;
12909 }
12910
12912 {
12914 }
12915
12916
12917
12918
12919
12921 {
12922 if (parent)
12923 {
12924 if (parent.IsInherited(DayZInfected))
12925 return true;
12926
12927 if (!parent.IsRuined())
12928 return true;
12929 }
12930
12931 return true;
12932 }
12933
12935 {
12936 if (!super.CanPutAsAttachment(parent))
12937 {
12938 return false;
12939 }
12940
12941 if (!IsRuined() && !parent.IsRuined())
12942 {
12943 return true;
12944 }
12945
12946 return false;
12947 }
12948
12950 {
12951
12952
12953
12954
12955 return super.CanReceiveItemIntoCargo(item);
12956 }
12957
12959 {
12960
12961
12962
12963
12964 GameInventory attachmentInv = attachment.GetInventory();
12966 {
12967 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12968 return false;
12969 }
12970
12971 InventoryLocation loc = new InventoryLocation();
12972 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12973 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12974 return false;
12975
12976 return super.CanReceiveAttachment(attachment, slotId);
12977 }
12978
12980 {
12981 if (!super.CanReleaseAttachment(attachment))
12982 return false;
12983
12984 return GetInventory().AreChildrenAccessible();
12985 }
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13001
13002
13003
13004
13005
13006
13008 {
13009 int id = muzzle_owner.GetMuzzleID();
13010 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13011
13012 if (WPOF_array)
13013 {
13014 for (int i = 0; i < WPOF_array.Count(); i++)
13015 {
13016 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13017
13018 if (WPOF)
13019 {
13020 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13021 }
13022 }
13023 }
13024 }
13025
13026
13028 {
13029 int id = muzzle_owner.GetMuzzleID();
13031
13032 if (WPOBE_array)
13033 {
13034 for (int i = 0; i < WPOBE_array.Count(); i++)
13035 {
13036 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13037
13038 if (WPOBE)
13039 {
13040 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13041 }
13042 }
13043 }
13044 }
13045
13046
13048 {
13049 int id = muzzle_owner.GetMuzzleID();
13050 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13051
13052 if (WPOOH_array)
13053 {
13054 for (int i = 0; i < WPOOH_array.Count(); i++)
13055 {
13056 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13057
13058 if (WPOOH)
13059 {
13060 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13061 }
13062 }
13063 }
13064 }
13065
13066
13068 {
13069 int id = muzzle_owner.GetMuzzleID();
13070 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13071
13072 if (WPOOH_array)
13073 {
13074 for (int i = 0; i < WPOOH_array.Count(); i++)
13075 {
13076 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13077
13078 if (WPOOH)
13079 {
13080 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13081 }
13082 }
13083 }
13084 }
13085
13086
13088 {
13089 int id = muzzle_owner.GetMuzzleID();
13090 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13091
13092 if (WPOOH_array)
13093 {
13094 for (int i = 0; i < WPOOH_array.Count(); i++)
13095 {
13096 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13097
13098 if (WPOOH)
13099 {
13100 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13101 }
13102 }
13103 }
13104 }
13105
13106
13107
13109 {
13111 {
13112 return true;
13113 }
13114
13115 return false;
13116 }
13117
13119 {
13121 {
13122 return true;
13123 }
13124
13125 return false;
13126 }
13127
13129 {
13131 {
13132 return true;
13133 }
13134
13135 return false;
13136 }
13137
13139 {
13140 return false;
13141 }
13142
13145 {
13146 return UATimeSpent.DEFAULT_DEPLOY;
13147 }
13148
13149
13150
13151
13153 {
13155 SetSynchDirty();
13156 }
13157
13159 {
13161 }
13162
13163
13165 {
13166 return false;
13167 }
13168
13171 {
13172 string att_type = "None";
13173
13174 if (ConfigIsExisting("soundAttType"))
13175 {
13176 att_type = ConfigGetString("soundAttType");
13177 }
13178
13180 }
13181
13183 {
13185 }
13186
13187
13188
13189
13190
13196
13198 {
13201
13203 }
13204
13205
13207 {
13209 return;
13210
13212
13215
13218
13219 SoundParameters params = new SoundParameters();
13223 }
13224
13225
13227 {
13229 {
13232
13233 SetSynchDirty();
13234
13237 }
13238 }
13239
13241 {
13243 }
13244
13245
13247 {
13249 return;
13250
13252 SetSynchDirty();
13253
13256 }
13257
13259 {
13262 }
13263
13265 {
13267 }
13268
13269 void OnApply(PlayerBase player);
13270
13272 {
13273 return 1.0;
13274 };
13275
13277 {
13279 }
13280
13282 {
13284 }
13285
13287
13289 {
13290 SetDynamicPhysicsLifeTime(0.01);
13292 }
13293
13295 {
13296 array<string> zone_names = new array<string>;
13297 GetDamageZones(zone_names);
13298 for (int i = 0; i < zone_names.Count(); i++)
13299 {
13300 SetHealthMax(zone_names.Get(i),"Health");
13301 }
13302 SetHealthMax("","Health");
13303 }
13304
13307 {
13308 float global_health = GetHealth01("","Health");
13309 array<string> zones = new array<string>;
13310 GetDamageZones(zones);
13311
13312 for (int i = 0; i < zones.Count(); i++)
13313 {
13314 SetHealth01(zones.Get(i),"Health",global_health);
13315 }
13316 }
13317
13320 {
13321 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13322 }
13323
13325 {
13326 if (!hasRootAsPlayer)
13327 {
13328 if (refParentIB)
13329 {
13330
13331 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13332 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13333
13334 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13335 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13336
13339 }
13340 else
13341 {
13342
13345 }
13346 }
13347 }
13348
13350 {
13352 {
13353 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13354 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13355 {
13356 float heatPermCoef = 1.0;
13358 while (ent)
13359 {
13360 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13361 ent = ent.GetHierarchyParent();
13362 }
13363
13364 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13365 }
13366 }
13367 }
13368
13370 {
13371
13372 EntityAI parent = GetHierarchyParent();
13373 if (!parent)
13374 {
13375 hasParent = false;
13376 hasRootAsPlayer = false;
13377 }
13378 else
13379 {
13380 hasParent = true;
13381 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13382 refParentIB =
ItemBase.Cast(parent);
13383 }
13384 }
13385
13386 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13387 {
13388
13389 }
13390
13392 {
13393
13394 return false;
13395 }
13396
13398 {
13399
13400
13401 return false;
13402 }
13403
13405 {
13406
13407 return false;
13408 }
13409
13412 {
13413 return !GetIsFrozen() &&
IsOpen();
13414 }
13415
13417 {
13418 bool hasParent = false, hasRootAsPlayer = false;
13420
13421 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13422 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13423
13424 if (wwtu || foodDecay)
13425 {
13429
13430 if (processWetness || processTemperature || processDecay)
13431 {
13433
13434 if (processWetness)
13435 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13436
13437 if (processTemperature)
13439
13440 if (processDecay)
13441 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13442 }
13443 }
13444 }
13445
13448 {
13450 }
13451
13453 {
13456
13457 return super.GetTemperatureFreezeThreshold();
13458 }
13459
13461 {
13464
13465 return super.GetTemperatureThawThreshold();
13466 }
13467
13469 {
13472
13473 return super.GetItemOverheatThreshold();
13474 }
13475
13477 {
13479 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13480
13481 return super.GetTemperatureFreezeTime();
13482 }
13483
13485 {
13487 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13488
13489 return super.GetTemperatureThawTime();
13490 }
13491
13496
13498 {
13499 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13500 }
13501
13503 {
13504 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13505 }
13506
13509 {
13511 }
13512
13514 {
13516 }
13517
13519 {
13521 }
13522
13525 {
13526 return null;
13527 }
13528
13531 {
13532 return false;
13533 }
13534
13536 {
13538 {
13541 if (!trg)
13542 {
13544 explosive = this;
13545 }
13546
13547 explosive.PairRemote(trg);
13549
13550 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13551 trg.SetPersistentPairID(persistentID);
13552 explosive.SetPersistentPairID(persistentID);
13553
13554 return true;
13555 }
13556 return false;
13557 }
13558
13561 {
13562 float ret = 1.0;
13565 ret *= GetHealth01();
13566
13567 return ret;
13568 }
13569
13570 #ifdef DEVELOPER
13571 override void SetDebugItem()
13572 {
13573 super.SetDebugItem();
13574 _itemBase = this;
13575 }
13576
13578 {
13579 string text = super.GetDebugText();
13580
13582 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13583
13584 return text;
13585 }
13586 #endif
13587
13589 {
13590 return true;
13591 }
13592
13594
13596
13598 {
13601 }
13602
13603
13611
13627
13628 [
Obsolete(
"Use ItemSoundHandler instead")]
13631 {
13632 if (!
g_Game.IsDedicatedServer())
13633 {
13634 if (ConfigIsExisting("attachSoundSet"))
13635 {
13636 string cfg_path = "";
13637 string soundset = "";
13638 string type_name =
GetType();
13639
13642 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13643 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13644
13645 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13646 {
13647 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13648 {
13649 if (cfg_slot_array[i] == slot_type)
13650 {
13651 soundset = cfg_soundset_array[i];
13652 break;
13653 }
13654 }
13655 }
13656
13657 if (soundset != "")
13658 {
13659 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13661 }
13662 }
13663 }
13664 }
13665
13667}
13668
13670{
13672 if (entity)
13673 {
13674 bool is_item = entity.IsInherited(
ItemBase);
13675 if (is_item && full_quantity)
13676 {
13679 }
13680 }
13681 else
13682 {
13684 return NULL;
13685 }
13686 return entity;
13687}
13688
13690{
13691 if (item)
13692 {
13693 if (health > 0)
13694 item.SetHealth("", "", health);
13695
13696 if (item.CanHaveTemperature())
13697 {
13699 if (item.CanFreeze())
13700 item.SetFrozen(false);
13701 }
13702
13703 if (item.HasEnergyManager())
13704 {
13705 if (quantity >= 0)
13706 {
13707 item.GetCompEM().SetEnergy0To1(quantity);
13708 }
13709 else
13710 {
13712 }
13713 }
13714 else if (item.IsMagazine())
13715 {
13716 Magazine mag = Magazine.Cast(item);
13717 if (quantity >= 0)
13718 {
13719 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13720 }
13721 else
13722 {
13724 }
13725
13726 }
13727 else
13728 {
13729 if (quantity >= 0)
13730 {
13731 item.SetQuantityNormalized(quantity, false);
13732 }
13733 else
13734 {
13736 }
13737
13738 }
13739 }
13740}
13741
13742#ifdef DEVELOPER
13744#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.