8780{
8782 {
8783 return true;
8784 }
8785};
8786
8787
8788
8790{
8794
8796
8799
8800
8801
8802
8803
8812
8818
8823
8828
8849 protected bool m_IsResultOfSplit
8850
8852
8857
8858
8859
8861
8865
8866
8867
8869
8872
8873
8874
8880
8881
8889
8892
8893
8895
8896
8898
8899
8904
8905
8910
8911
8913
8914
8916 {
8921
8922 if (!
GetGame().IsDedicatedServer())
8923 {
8925 {
8927
8929 {
8931 }
8932 }
8933
8936 }
8937
8938 m_OldLocation = null;
8939
8941 {
8943 }
8944
8945 if (ConfigIsExisting("headSelectionsToHide"))
8946 {
8949 }
8950
8952 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8953 {
8955 }
8956
8958
8959 m_IsResultOfSplit = false;
8960
8962 }
8963
8965 {
8966 super.InitItemVariables();
8967
8973 m_Count = ConfigGetInt(
"count");
8974
8977
8982
8985
8990
9002
9006
9007
9010 if (ConfigIsExisting("canBeSplit"))
9011 {
9014 }
9015
9017 if (ConfigIsExisting("itemBehaviour"))
9019
9020
9023 RegisterNetSyncVariableInt("m_VarLiquidType");
9024 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9025
9026 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9027 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9028 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9029
9030 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9031 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9032 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9033 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9034
9035 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9036 RegisterNetSyncVariableBool("m_IsTakeable");
9037 RegisterNetSyncVariableBool("m_IsHologram");
9038
9041 {
9044 }
9045
9047
9049 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9051
9052 }
9053
9055 {
9057 }
9058
9060 {
9063 {
9068 }
9069 }
9070
9071 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9072 {
9074 {
9077 }
9078
9080 }
9081
9083 {
9089 }
9090
9092
9094 {
9096
9097 if (!action)
9098 {
9099 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9100 return;
9101 }
9102
9104 if (!ai)
9105 {
9107 return;
9108 }
9109
9111 if (!action_array)
9112 {
9113 action_array = new array<ActionBase_Basic>;
9115 }
9116 if (LogManager.IsActionLogEnable())
9117 {
9118 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9119 }
9120
9121 if (action_array.Find(action) != -1)
9122 {
9123 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9124 }
9125 else
9126 {
9127 action_array.Insert(action);
9128 }
9129 }
9130
9132 {
9134 ActionBase action = player.GetActionManager().GetAction(actionName);
9137
9138 if (action_array)
9139 {
9140 action_array.RemoveItem(action);
9141 }
9142 }
9143
9144
9145
9147 {
9148 ActionOverrideData overrideData = new ActionOverrideData();
9152
9154 if (!actionMap)
9155 {
9158 }
9159
9160 actionMap.Insert(this.
Type(), overrideData);
9161
9162 }
9163
9165
9167
9168
9170 {
9173
9176
9177 string config_to_search = "CfgVehicles";
9178 string muzzle_owner_config;
9179
9181 {
9182 if (IsInherited(Weapon))
9183 config_to_search = "CfgWeapons";
9184
9185 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9186
9187 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9188
9190
9191 if (config_OnFire_subclass_count > 0)
9192 {
9193 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9194
9195 for (int i = 0; i < config_OnFire_subclass_count; i++)
9196 {
9197 string particle_class = "";
9199 string config_OnFire_entry = config_OnFire_class + particle_class;
9200 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9201 WPOF_array.Insert(WPOF);
9202 }
9203
9204
9206 }
9207 }
9208
9210 {
9211 config_to_search = "CfgWeapons";
9212 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9213
9214 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9215
9217
9218 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9219 {
9220 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9221
9222 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9223 {
9224 string particle_class2 = "";
9226 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9227 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9228 WPOBE_array.Insert(WPOBE);
9229 }
9230
9231
9233 }
9234 }
9235 }
9236
9237
9239 {
9242
9244 {
9245 string config_to_search = "CfgVehicles";
9246
9247 if (IsInherited(Weapon))
9248 config_to_search = "CfgWeapons";
9249
9250 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9251 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9252
9253 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9254 {
9255
9257
9259 {
9261 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9263 return;
9264 }
9265
9268
9269
9270
9272 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9273
9274 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9275 {
9276 string particle_class = "";
9278 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9280
9281 if (entry_type == CT_CLASS)
9282 {
9283 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9284 WPOOH_array.Insert(WPOF);
9285 }
9286 }
9287
9288
9290 }
9291 }
9292 }
9293
9295 {
9297 }
9298
9300 {
9302 {
9304
9307
9310
9311 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9312 }
9313 }
9314
9316 {
9318 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9319
9321 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9322
9324 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9325
9327 {
9329 }
9330 }
9331
9333 {
9335 }
9336
9338 {
9341 else
9343
9345 {
9348 }
9349 else
9350 {
9353
9356 }
9357
9359 }
9360
9362 {
9364 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9365 }
9366
9368 {
9370 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9372 }
9373
9375 {
9377 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9378 }
9379
9381 {
9384
9385 OverheatingParticle OP = new OverheatingParticle();
9390
9392 }
9393
9395 {
9398
9399 return -1;
9400 }
9401
9403 {
9405 {
9408
9409 for (int i = count; i > 0; --i)
9410 {
9411 int id = i - 1;
9414
9417
9418 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9419 {
9420 if (p)
9421 {
9424 }
9425 }
9426 }
9427 }
9428 }
9429
9431 {
9433 {
9435 {
9436 int id = i - 1;
9438
9439 if (OP)
9440 {
9442
9443 if (p)
9444 {
9446 }
9447
9448 delete OP;
9449 }
9450 }
9451
9454 }
9455 }
9456
9459 {
9460 return 0.0;
9461 }
9462
9463
9465 {
9466 return 250;
9467 }
9468
9470 {
9471 return 0;
9472 }
9473
9476 {
9478 return true;
9479
9480 return false;
9481 }
9482
9485 {
9488
9490 {
9492 }
9493 else
9494 {
9495
9497 }
9498
9500 }
9501
9508 {
9509 return -1;
9510 }
9511
9512
9513
9514
9516 {
9518 {
9520 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9521
9522 if (r_index >= 0)
9523 {
9524 InventoryLocation r_il = new InventoryLocation;
9525 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9526
9527 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9530 {
9531 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9532 }
9534 {
9535 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9536 }
9537
9538 }
9539
9540 player.GetHumanInventory().ClearUserReservedLocation(this);
9541 }
9542
9545 }
9546
9547
9548
9549
9551 {
9552 return ItemBase.m_DebugActionsMask;
9553 }
9554
9556 {
9557 return ItemBase.m_DebugActionsMask & mask;
9558 }
9559
9561 {
9562 ItemBase.m_DebugActionsMask = mask;
9563 }
9564
9566 {
9567 ItemBase.m_DebugActionsMask |= mask;
9568 }
9569
9571 {
9572 ItemBase.m_DebugActionsMask &= ~mask;
9573 }
9574
9576 {
9578 {
9580 }
9581 else
9582 {
9584 }
9585 }
9586
9587
9589 {
9590 if (GetEconomyProfile())
9591 {
9592 float q_max = GetEconomyProfile().GetQuantityMax();
9593 if (q_max > 0)
9594 {
9595 float q_min = GetEconomyProfile().GetQuantityMin();
9596 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9597
9599 {
9600 ComponentEnergyManager comp = GetCompEM();
9602 {
9604 }
9605 }
9607 {
9609
9610 }
9611
9612 }
9613 }
9614 }
9615
9618 {
9619 EntityAI parent = GetHierarchyParent();
9620
9621 if (parent)
9622 {
9623 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9624 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9625 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9626 }
9627 }
9628
9631 {
9632 EntityAI parent = GetHierarchyParent();
9633
9634 if (parent)
9635 {
9636 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9637 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9638 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9639 }
9640 }
9641
9643 {
9644
9645
9646
9647
9649
9651 {
9652 if (ScriptInputUserData.CanStoreInputUserData())
9653 {
9654 ScriptInputUserData ctx = new ScriptInputUserData;
9660 ctx.
Write(use_stack_max);
9663
9665 {
9666 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9667 }
9668 }
9669 }
9670 else if (!
GetGame().IsMultiplayer())
9671 {
9673 }
9674 }
9675
9677 {
9679 }
9680
9682 {
9684 }
9685
9687 {
9689 }
9690
9692 {
9693
9694 return false;
9695 }
9696
9698 {
9699 return false;
9700 }
9701
9705 {
9706 return false;
9707 }
9708
9710 {
9711 return "";
9712 }
9713
9715
9717 {
9718 return false;
9719 }
9720
9722 {
9723 return true;
9724 }
9725
9726
9727
9729 {
9730 return true;
9731 }
9732
9734 {
9735 return true;
9736 }
9737
9739 {
9740 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9742 }
9743
9745 {
9747 }
9748
9750 {
9752 if (!is_being_placed)
9754 SetSynchDirty();
9755 }
9756
9757
9759
9761 {
9763 }
9764
9766 {
9768 }
9769
9771 {
9772 return 1;
9773 }
9774
9776 {
9777 return false;
9778 }
9779
9781 {
9783 SetSynchDirty();
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
9813
9814
9815
9816
9817
9818
9819
9821 {
9822 super.OnMovedInsideCargo(container);
9823
9824 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9825 }
9826
9827 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9828 {
9829 super.EEItemLocationChanged(oldLoc,newLoc);
9830
9831 PlayerBase new_player = null;
9832 PlayerBase old_player = null;
9833
9834 if (newLoc.GetParent())
9835 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9836
9837 if (oldLoc.GetParent())
9838 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9839
9841 {
9842 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9843
9844 if (r_index >= 0)
9845 {
9846 InventoryLocation r_il = new InventoryLocation;
9847 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9848
9849 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9852 {
9853 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9854 }
9856 {
9857 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9858 }
9859
9860 }
9861 }
9862
9864 {
9865 if (new_player)
9866 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9867
9868 if (new_player == old_player)
9869 {
9870
9871 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9872 {
9874 {
9875 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9876 {
9877 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9878 }
9879 }
9880 else
9881 {
9882 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9883 }
9884 }
9885
9886 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9887 {
9888 int type = oldLoc.GetType();
9890 {
9891 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9892 }
9894 {
9895 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9896 }
9897 }
9898 if (!m_OldLocation)
9899 {
9900 m_OldLocation = new InventoryLocation;
9901 }
9902 m_OldLocation.Copy(oldLoc);
9903 }
9904 else
9905 {
9906 if (m_OldLocation)
9907 {
9908 m_OldLocation.Reset();
9909 }
9910 }
9911
9913 }
9914 else
9915 {
9916 if (new_player)
9917 {
9918 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9919 if (res_index >= 0)
9920 {
9921 InventoryLocation il = new InventoryLocation;
9922 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9924 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9927 {
9928 il.
GetParent().GetOnReleaseLock().Invoke(it);
9929 }
9931 {
9933 }
9934
9935 }
9936 }
9938 {
9939
9941 }
9942
9943 if (m_OldLocation)
9944 {
9945 m_OldLocation.Reset();
9946 }
9947 }
9948 }
9949
9950 override void EOnContact(IEntity other, Contact extra)
9951 {
9953 {
9954 int liquidType = -1;
9956 if (impactSpeed > 0.0)
9957 {
9959 #ifndef SERVER
9961 #else
9963 SetSynchDirty();
9964 #endif
9966 }
9967 }
9968
9969 #ifdef SERVER
9970 if (GetCompEM() && GetCompEM().IsPlugged())
9971 {
9972 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9973 GetCompEM().UnplugThis();
9974 }
9975 #endif
9976 }
9977
9979
9981 {
9983 }
9984
9986 {
9987
9988 }
9989
9991 {
9992 super.OnItemLocationChanged(old_owner, new_owner);
9993
9994 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9995 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9996
9997 if (!relatedPlayer && playerNew)
9998 relatedPlayer = playerNew;
9999
10000 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10001 {
10003 if (actionMgr)
10004 {
10005 ActionBase currentAction = actionMgr.GetRunningAction();
10006 if (currentAction)
10008 }
10009 }
10010
10011 Man ownerPlayerOld = null;
10012 Man ownerPlayerNew = null;
10013
10014 if (old_owner)
10015 {
10016 if (old_owner.
IsMan())
10017 {
10018 ownerPlayerOld = Man.Cast(old_owner);
10019 }
10020 else
10021 {
10022 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10023 }
10024 }
10025 else
10026 {
10028 {
10030
10031 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10032 {
10033 GetCompEM().UnplugThis();
10034 }
10035 }
10036 }
10037
10038 if (new_owner)
10039 {
10040 if (new_owner.
IsMan())
10041 {
10042 ownerPlayerNew = Man.Cast(new_owner);
10043 }
10044 else
10045 {
10046 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10047 }
10048 }
10049
10050 if (ownerPlayerOld != ownerPlayerNew)
10051 {
10052 if (ownerPlayerOld)
10053 {
10054 array<EntityAI> subItemsExit = new array<EntityAI>;
10056 for (int i = 0; i < subItemsExit.Count(); i++)
10057 {
10060 }
10061 }
10062
10063 if (ownerPlayerNew)
10064 {
10065 array<EntityAI> subItemsEnter = new array<EntityAI>;
10067 for (int j = 0; j < subItemsEnter.Count(); j++)
10068 {
10071 }
10072 }
10073 }
10074 else if (ownerPlayerNew != null)
10075 {
10076 PlayerBase nplayer;
10077 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10078 {
10079 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10081 for (int k = 0; k < subItemsUpdate.Count(); k++)
10082 {
10084 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10085 }
10086 }
10087 }
10088
10089 if (old_owner)
10090 old_owner.OnChildItemRemoved(this);
10091 if (new_owner)
10092 new_owner.OnChildItemReceived(this);
10093 }
10094
10095
10097 {
10098 super.EEDelete(parent);
10099 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10100 if (player)
10101 {
10103
10104 if (player.IsAlive())
10105 {
10106 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10107 if (r_index >= 0)
10108 {
10109 InventoryLocation r_il = new InventoryLocation;
10110 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10111
10112 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10115 {
10116 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10117 }
10119 {
10120 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10121 }
10122
10123 }
10124
10125 player.RemoveQuickBarEntityShortcut(this);
10126 }
10127 }
10128 }
10129
10131 {
10132 super.EEKilled(killer);
10133
10136 {
10137 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10138 {
10139 if (IsMagazine())
10140 {
10141 if (Magazine.Cast(this).GetAmmoCount() > 0)
10142 {
10144 }
10145 }
10146 else
10147 {
10149 }
10150 }
10151 }
10152 }
10153
10155 {
10156 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10157
10158 super.OnWasAttached(parent, slot_id);
10159
10162
10164 }
10165
10167 {
10168 super.OnWasDetached(parent, slot_id);
10169
10172 }
10173
10175 {
10176 int idx;
10179
10180 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10181 if (inventory_slots.Count() < 1)
10182 {
10183 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10184 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10185 }
10186 else
10187 {
10188 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10189 }
10190
10191 idx = inventory_slots.Find(slot);
10192 if (idx < 0)
10193 return "";
10194
10195 return attach_types.Get(idx);
10196 }
10197
10199 {
10200 int idx = -1;
10201 string slot;
10202
10205
10206 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10207 if (inventory_slots.Count() < 1)
10208 {
10209 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10210 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10211 }
10212 else
10213 {
10214 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10215 if (detach_types.Count() < 1)
10216 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10217 }
10218
10219 for (int i = 0; i < inventory_slots.Count(); i++)
10220 {
10221 slot = inventory_slots.Get(i);
10222 }
10223
10224 if (slot != "")
10225 {
10226 if (detach_types.Count() == 1)
10227 idx = 0;
10228 else
10229 idx = inventory_slots.Find(slot);
10230 }
10231 if (idx < 0)
10232 return "";
10233
10234 return detach_types.Get(idx);
10235 }
10236
10238 {
10239
10241
10242
10243 float min_time = 1;
10244 float max_time = 3;
10245 float delay = Math.RandomFloat(min_time, max_time);
10246
10247 explode_timer.Run(delay, this, "DoAmmoExplosion");
10248 }
10249
10251 {
10252 Magazine magazine = Magazine.Cast(this);
10253 int pop_sounds_count = 6;
10254 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10255
10256
10257 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10258 string sound_name = pop_sounds[ sound_idx ];
10260
10261
10262 magazine.ServerAddAmmoCount(-1);
10263
10264
10265 float min_temp_to_explode = 100;
10266
10267 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10268 {
10270 }
10271 }
10272
10273
10274 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10275 {
10276 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10277
10278 const int CHANCE_DAMAGE_CARGO = 4;
10279 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10280 const int CHANCE_DAMAGE_NOTHING = 2;
10281
10283 {
10284 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10285 int chances;
10286 int rnd;
10287
10288 if (GetInventory().GetCargo())
10289 {
10290 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10291 rnd = Math.RandomInt(0,chances);
10292
10293 if (rnd < CHANCE_DAMAGE_CARGO)
10294 {
10296 }
10297 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10298 {
10300 }
10301 }
10302 else
10303 {
10304 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10305 rnd = Math.RandomInt(0,chances);
10306
10307 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10308 {
10310 }
10311 }
10312 }
10313 }
10314
10316 {
10317 if (GetInventory().GetCargo())
10318 {
10319 int item_count = GetInventory().GetCargo().GetItemCount();
10320 if (item_count > 0)
10321 {
10322 int random_pick = Math.RandomInt(0, item_count);
10324 if (!item.IsExplosive())
10325 {
10326 item.AddHealth("","",damage);
10327 return true;
10328 }
10329 }
10330 }
10331 return false;
10332 }
10333
10335 {
10336 int attachment_count = GetInventory().AttachmentCount();
10337 if (attachment_count > 0)
10338 {
10339 int random_pick = Math.RandomInt(0, attachment_count);
10340 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10341 if (!attachment.IsExplosive())
10342 {
10343 attachment.AddHealth("","",damage);
10344 return true;
10345 }
10346 }
10347 return false;
10348 }
10349
10351 {
10353 }
10354
10356 {
10358 return GetInventory().CanRemoveEntity();
10359
10360 return false;
10361 }
10362
10364 {
10365
10367 return false;
10368
10369
10371 return false;
10372
10373
10374
10376 if (delta == 0)
10377 return false;
10378
10379
10380 return true;
10381 }
10382
10384 {
10386 {
10387 if (ScriptInputUserData.CanStoreInputUserData())
10388 {
10389 ScriptInputUserData ctx = new ScriptInputUserData;
10394 ctx.
Write(destination_entity);
10396 ctx.
Write(slot_id);
10398 }
10399 }
10400 else if (!
GetGame().IsMultiplayer())
10401 {
10403 }
10404 }
10405
10407 {
10408 float split_quantity_new;
10412 InventoryLocation loc = new InventoryLocation;
10413
10414 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10415 {
10417 split_quantity_new = stack_max;
10418 else
10420
10422 {
10423 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10424 if (new_item)
10425 {
10426 new_item.SetResultOfSplit(true);
10427 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10429 new_item.
SetQuantity(split_quantity_new,
false,
true);
10430 }
10431 }
10432 }
10433 else if (destination_entity && slot_id == -1)
10434 {
10435 if (quantity > stack_max)
10436 split_quantity_new = stack_max;
10437 else
10438 split_quantity_new = quantity;
10439
10441 {
10443 {
10446 }
10447
10448 if (new_item)
10449 {
10450 new_item.SetResultOfSplit(true);
10451 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10453 new_item.
SetQuantity(split_quantity_new,
false,
true);
10454 }
10455 }
10456 }
10457 else
10458 {
10459 if (stack_max != 0)
10460 {
10462 {
10464 }
10465
10466 if (split_quantity_new == 0)
10467 {
10468 if (!
GetGame().IsMultiplayer())
10469 player.PhysicalPredictiveDropItem(this);
10470 else
10471 player.ServerDropEntity(this);
10472 return;
10473 }
10474
10476 {
10478
10479 if (new_item)
10480 {
10481 new_item.SetResultOfSplit(true);
10482 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10485 new_item.PlaceOnSurface();
10486 }
10487 }
10488 }
10489 }
10490 }
10491
10493 {
10494 float split_quantity_new;
10498 InventoryLocation loc = new InventoryLocation;
10499
10500 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10501 {
10503 split_quantity_new = stack_max;
10504 else
10506
10508 {
10509 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10510 if (new_item)
10511 {
10512 new_item.SetResultOfSplit(true);
10513 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10515 new_item.
SetQuantity(split_quantity_new,
false,
true);
10516 }
10517 }
10518 }
10519 else if (destination_entity && slot_id == -1)
10520 {
10521 if (quantity > stack_max)
10522 split_quantity_new = stack_max;
10523 else
10524 split_quantity_new = quantity;
10525
10527 {
10529 {
10532 }
10533
10534 if (new_item)
10535 {
10536 new_item.SetResultOfSplit(true);
10537 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10539 new_item.
SetQuantity(split_quantity_new,
false,
true);
10540 }
10541 }
10542 }
10543 else
10544 {
10545 if (stack_max != 0)
10546 {
10548 {
10550 }
10551
10553 {
10555
10556 if (new_item)
10557 {
10558 new_item.SetResultOfSplit(true);
10559 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10562 new_item.PlaceOnSurface();
10563 }
10564 }
10565 }
10566 }
10567 }
10568
10570 {
10572 {
10573 if (ScriptInputUserData.CanStoreInputUserData())
10574 {
10575 ScriptInputUserData ctx = new ScriptInputUserData;
10580 dst.WriteToContext(ctx);
10582 }
10583 }
10584 else if (!
GetGame().IsMultiplayer())
10585 {
10587 }
10588 }
10589
10591 {
10593 {
10594 if (ScriptInputUserData.CanStoreInputUserData())
10595 {
10596 ScriptInputUserData ctx = new ScriptInputUserData;
10601 ctx.
Write(destination_entity);
10607 }
10608 }
10609 else if (!
GetGame().IsMultiplayer())
10610 {
10612 }
10613 }
10614
10616 {
10618 }
10619
10621 {
10623 float split_quantity_new;
10625 if (dst.IsValid())
10626 {
10627 int slot_id = dst.GetSlot();
10629
10630 if (quantity > stack_max)
10631 split_quantity_new = stack_max;
10632 else
10633 split_quantity_new = quantity;
10634
10636 {
10638
10639 if (new_item)
10640 {
10641 new_item.SetResultOfSplit(true);
10642 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10644 new_item.
SetQuantity(split_quantity_new,
false,
true);
10645 }
10646
10647 return new_item;
10648 }
10649 }
10650
10651 return null;
10652 }
10653
10655 {
10657 float split_quantity_new;
10659 if (destination_entity)
10660 {
10662 if (quantity > stackable)
10663 split_quantity_new = stackable;
10664 else
10665 split_quantity_new = quantity;
10666
10668 {
10669 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10670 if (new_item)
10671 {
10672 new_item.SetResultOfSplit(true);
10673 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10675 new_item.
SetQuantity(split_quantity_new,
false,
true);
10676 }
10677 }
10678 }
10679 }
10680
10682 {
10684 {
10685 if (ScriptInputUserData.CanStoreInputUserData())
10686 {
10687 ScriptInputUserData ctx = new ScriptInputUserData;
10692 ItemBase destination_entity =
this;
10693 ctx.
Write(destination_entity);
10697 }
10698 }
10699 else if (!
GetGame().IsMultiplayer())
10700 {
10702 }
10703 }
10704
10706 {
10708 float split_quantity_new;
10710 if (player)
10711 {
10713 if (quantity > stackable)
10714 split_quantity_new = stackable;
10715 else
10716 split_quantity_new = quantity;
10717
10719 {
10720 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10721 new_item =
ItemBase.Cast(in_hands);
10722 if (new_item)
10723 {
10724 new_item.SetResultOfSplit(true);
10725 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10727 new_item.SetQuantity(split_quantity_new, false, true);
10728 }
10729 }
10730 }
10731 }
10732
10734 {
10736 float split_quantity_new = Math.Floor(quantity * 0.5);
10737
10739 return;
10740
10742
10743 if (new_item)
10744 {
10745 if (new_item.GetQuantityMax() < split_quantity_new)
10746 {
10747 split_quantity_new = new_item.GetQuantityMax();
10748 }
10749
10750 new_item.SetResultOfSplit(true);
10751 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10752
10754 {
10757 }
10758 else
10759 {
10761 new_item.
SetQuantity(split_quantity_new,
false,
true);
10762 }
10763 }
10764 }
10765
10767 {
10769 float split_quantity_new = Math.Floor(quantity / 2);
10770
10772 return;
10773
10774 InventoryLocation invloc = new InventoryLocation;
10776
10778 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10779
10780 if (new_item)
10781 {
10782 if (new_item.GetQuantityMax() < split_quantity_new)
10783 {
10784 split_quantity_new = new_item.GetQuantityMax();
10785 }
10787 {
10790 }
10791 else if (split_quantity_new > 1)
10792 {
10794 new_item.
SetQuantity(split_quantity_new,
false,
true);
10795 }
10796 }
10797 }
10798
10801 {
10802 SetWeightDirty();
10804
10805 if (parent)
10806 parent.OnAttachmentQuantityChangedEx(this, delta);
10807
10809 {
10811 {
10813 }
10815 {
10816 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10818 }
10819 }
10820
10821 }
10822
10825 {
10826
10827 }
10828
10831 {
10833 }
10834
10836 {
10837 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10838
10840 {
10841 if (newLevel == GameConstants.STATE_RUINED)
10842 {
10844 EntityAI parent = GetHierarchyParent();
10845 if (parent && parent.IsFireplace())
10846 {
10847 CargoBase cargo = GetInventory().GetCargo();
10848 if (cargo)
10849 {
10851 {
10853 }
10854 }
10855 }
10856 }
10857
10859 {
10860
10862 return;
10863 }
10864
10865 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10866 {
10868 }
10869 }
10870 }
10871
10872
10874 {
10875 super.OnRightClick();
10876
10878 {
10880 {
10881 if (ScriptInputUserData.CanStoreInputUserData())
10882 {
10883 EntityAI root = GetHierarchyRoot();
10884 Man playerOwner = GetHierarchyRootPlayer();
10885 InventoryLocation dst = new InventoryLocation;
10886
10887
10888 if (!playerOwner && root && root == this)
10889 {
10891 }
10892 else
10893 {
10894
10895 GetInventory().GetCurrentInventoryLocation(dst);
10897 {
10900 {
10902 }
10903 else
10904 {
10906
10907
10908 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10909 {
10911 }
10912 else
10913 {
10914 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10915 }
10916 }
10917 }
10918 }
10919
10920 ScriptInputUserData ctx = new ScriptInputUserData;
10928 }
10929 }
10930 else if (!
GetGame().IsMultiplayer())
10931 {
10933 }
10934 }
10935 }
10936
10938 {
10939 if (root)
10940 {
10941 vector m4[4];
10942 root.GetTransform(m4);
10943 dst.SetGround(this, m4);
10944 }
10945 else
10946 {
10947 GetInventory().GetCurrentInventoryLocation(dst);
10948 }
10949 }
10950
10951 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10952 {
10953
10954 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10955 return false;
10956
10957 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10958 return false;
10959
10960
10962 return false;
10963
10964
10965 Magazine mag = Magazine.Cast(this);
10966 if (mag)
10967 {
10968 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10969 return false;
10970
10971 if (stack_max_limit)
10972 {
10973 Magazine other_mag = Magazine.Cast(other_item);
10974 if (other_item)
10975 {
10976 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10977 return false;
10978 }
10979
10980 }
10981 }
10982 else
10983 {
10984
10986 return false;
10987
10989 return false;
10990 }
10991
10992 PlayerBase player = null;
10993 if (CastTo(player, GetHierarchyRootPlayer()))
10994 {
10995 if (player.GetInventory().HasAttachment(this))
10996 return false;
10997
10998 if (player.IsItemsToDelete())
10999 return false;
11000 }
11001
11002 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11003 return false;
11004
11005 int slotID;
11007 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11008 return false;
11009
11010 return true;
11011 }
11012
11014 {
11016 }
11017
11019 {
11020 return m_IsResultOfSplit;
11021 }
11022
11024 {
11025 m_IsResultOfSplit = value;
11026 }
11027
11029 {
11031 }
11032
11034 {
11035 float other_item_quantity = other_item.GetQuantity();
11036 float this_free_space;
11037
11039
11041
11042 if (other_item_quantity > this_free_space)
11043 {
11044 return this_free_space;
11045 }
11046 else
11047 {
11048 return other_item_quantity;
11049 }
11050 }
11051
11053 {
11055 }
11056
11058 {
11060 return;
11061
11062 if (!IsMagazine() && other_item)
11063 {
11065 if (quantity_used != 0)
11066 {
11067 float hp1 = GetHealth01("","");
11068 float hp2 = other_item.GetHealth01("","");
11069 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11070 hpResult = hpResult / (
GetQuantity() + quantity_used);
11071
11072 hpResult *= GetMaxHealth();
11073 Math.Round(hpResult);
11074 SetHealth("", "Health", hpResult);
11075
11077 other_item.AddQuantity(-quantity_used);
11078 }
11079 }
11081 }
11082
11084 {
11085 #ifdef SERVER
11086 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11087 GetHierarchyParent().IncreaseLifetimeUp();
11088 #endif
11089 };
11090
11092 {
11093 PlayerBase p = PlayerBase.Cast(player);
11094
11095 array<int> recipesIds = p.m_Recipes;
11096 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11097 if (moduleRecipesManager)
11098 {
11099 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11100 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11101 }
11102
11103 for (int i = 0;i < recipesIds.Count(); i++)
11104 {
11105 int key = recipesIds.Get(i);
11106 string recipeName = moduleRecipesManager.GetRecipeName(key);
11108 }
11109 }
11110
11111
11112 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11113 {
11114 super.GetDebugActions(outputList);
11115
11116
11122
11123
11128
11133
11134
11138
11139
11141 {
11145 }
11146
11149
11150
11154
11156
11157 InventoryLocation loc = new InventoryLocation();
11158 GetInventory().GetCurrentInventoryLocation(loc);
11160 {
11161 if (Gizmo_IsSupported())
11164 }
11165
11167 }
11168
11169
11170
11171
11173 {
11174 super.OnAction(action_id, player, ctx);
11175
11177 {
11178 switch (action_id)
11179 {
11182 return true;
11185 return true;
11186 }
11187 }
11188
11190 {
11191 switch (action_id)
11192 {
11194 Delete();
11195 return true;
11196 }
11197 }
11198
11199 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11200 {
11201 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11202 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11203 PlayerBase p = PlayerBase.Cast(player);
11204 if (
EActions.RECIPES_RANGE_START < 1000)
11205 {
11206 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11207 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11208 }
11209 }
11210 #ifndef SERVER
11211 else if (action_id ==
EActions.WATCH_PLAYER)
11212 {
11213 PluginDeveloper.SetDeveloperItemClientEx(player);
11214 }
11215 #endif
11217 {
11218 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11219 {
11220 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11221 OnDebugButtonPressServer(id + 1);
11222 }
11223
11224 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11225 {
11226 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11228 }
11229
11230 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11231 {
11232 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11234 }
11235
11236 else if (action_id ==
EActions.ADD_QUANTITY)
11237 {
11238 if (IsMagazine())
11239 {
11240 Magazine mag = Magazine.Cast(this);
11241 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11242 }
11243 else
11244 {
11246 }
11247
11248 if (m_EM)
11249 {
11250 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11251 }
11252
11253 }
11254
11255 else if (action_id ==
EActions.REMOVE_QUANTITY)
11256 {
11257 if (IsMagazine())
11258 {
11259 Magazine mag2 = Magazine.Cast(this);
11260 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11261 }
11262 else
11263 {
11265 }
11266 if (m_EM)
11267 {
11268 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11269 }
11270
11271 }
11272
11273 else if (action_id ==
EActions.SET_QUANTITY_0)
11274 {
11276
11277 if (m_EM)
11278 {
11279 m_EM.SetEnergy(0);
11280 }
11281 }
11282
11283 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11284 {
11286
11287 if (m_EM)
11288 {
11289 m_EM.SetEnergy(m_EM.GetEnergyMax());
11290 }
11291 }
11292
11293 else if (action_id ==
EActions.ADD_HEALTH)
11294 {
11295 AddHealth("","",GetMaxHealth("","Health")/5);
11296 }
11297 else if (action_id ==
EActions.REMOVE_HEALTH)
11298 {
11299 AddHealth("","",-GetMaxHealth("","Health")/5);
11300 }
11301 else if (action_id ==
EActions.DESTROY_HEALTH)
11302 {
11303 SetHealth01("","",0);
11304 }
11305 else if (action_id ==
EActions.WATCH_ITEM)
11306 {
11308 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11309 #ifdef DEVELOPER
11310 SetDebugDeveloper_item(this);
11311 #endif
11312 }
11313
11314 else if (action_id ==
EActions.ADD_TEMPERATURE)
11315 {
11316 AddTemperature(20);
11317
11318 }
11319
11320 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11321 {
11322 AddTemperature(-20);
11323
11324 }
11325
11326 else if (action_id ==
EActions.FLIP_FROZEN)
11327 {
11328 SetFrozen(!GetIsFrozen());
11329
11330 }
11331
11332 else if (action_id ==
EActions.ADD_WETNESS)
11333 {
11335
11336 }
11337
11338 else if (action_id ==
EActions.REMOVE_WETNESS)
11339 {
11341
11342 }
11343
11344 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11345 {
11348
11349
11350 }
11351
11352 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11353 {
11356 }
11357
11358 else if (action_id ==
EActions.MAKE_SPECIAL)
11359 {
11360 auto debugParams = DebugSpawnParams.WithPlayer(player);
11361 OnDebugSpawnEx(debugParams);
11362 }
11363
11364 }
11365
11366
11367 return false;
11368 }
11369
11370
11371
11372
11376
11379
11380
11381
11383 {
11384 return false;
11385 }
11386
11387
11389 {
11390 return true;
11391 }
11392
11393
11395 {
11396 return true;
11397 }
11398
11399
11400
11402 {
11403 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11405 }
11406
11409 {
11410 return null;
11411 }
11412
11414 {
11415 return false;
11416 }
11417
11419 {
11420 return false;
11421 }
11422
11426
11427
11429 {
11430 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11431 return module_repairing.CanRepair(this, item_repair_kit);
11432 }
11433
11434
11435 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11436 {
11437 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11438 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11439 }
11440
11441
11443 {
11444
11445
11446
11447
11448
11449
11450
11451
11452 return 1;
11453 }
11454
11455
11456
11458 {
11460 }
11461
11462
11463
11465 {
11467 }
11468
11469
11478 {
11479 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11480
11481 if (player)
11482 {
11483 player.MessageStatus(text);
11484 }
11485 }
11486
11487
11496 {
11497 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11498
11499 if (player)
11500 {
11501 player.MessageAction(text);
11502 }
11503 }
11504
11505
11514 {
11515 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11516
11517 if (player)
11518 {
11519 player.MessageFriendly(text);
11520 }
11521 }
11522
11523
11532 {
11533 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11534
11535 if (player)
11536 {
11537 player.MessageImportant(text);
11538 }
11539 }
11540
11542 {
11543 return true;
11544 }
11545
11546
11547 override bool KindOf(
string tag)
11548 {
11549 bool found = false;
11550 string item_name = this.
GetType();
11553
11554 int array_size = item_tag_array.Count();
11555 for (int i = 0; i < array_size; i++)
11556 {
11557 if (item_tag_array.Get(i) == tag)
11558 {
11559 found = true;
11560 break;
11561 }
11562 }
11563 return found;
11564 }
11565
11566
11568 {
11569
11570 super.OnRPC(sender, rpc_type,ctx);
11571
11572
11573 switch (rpc_type)
11574 {
11575 #ifndef SERVER
11576 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11577 Param2<bool, string> p = new Param2<bool, string>(false, "");
11578
11580 return;
11581
11582 bool play = p.param1;
11583 string soundSet = p.param2;
11584
11585 if (play)
11586 {
11588 {
11590 {
11592 }
11593 }
11594 else
11595 {
11597 }
11598 }
11599 else
11600 {
11602 }
11603
11604 break;
11605 #endif
11606
11607 }
11608
11610 {
11612 }
11613 }
11614
11615
11616
11617
11619 {
11620 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11621 return plugin.GetID(
name);
11622 }
11623
11625 {
11626 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11627 return plugin.GetName(id);
11628 }
11629
11632 {
11633
11634
11635 int varFlags;
11636 if (!ctx.
Read(varFlags))
11637 return;
11638
11639 if (varFlags & ItemVariableFlags.FLOAT)
11640 {
11642 }
11643 }
11644
11646 {
11647
11648 super.SerializeNumericalVars(floats_out);
11649
11650
11651
11653 {
11655 }
11656
11658 {
11660 }
11661
11663 {
11665 }
11666
11668 {
11673 }
11674
11676 {
11678 }
11679 }
11680
11682 {
11683
11684 super.DeSerializeNumericalVars(floats);
11685
11686
11687 int index = 0;
11688 int mask = Math.Round(floats.Get(index));
11689
11690 index++;
11691
11693 {
11695 {
11697 }
11698 else
11699 {
11700 float quantity = floats.Get(index);
11701 SetQuantity(quantity,
true,
false,
false,
false);
11702 }
11703 index++;
11704 }
11705
11707 {
11708 float wet = floats.Get(index);
11710 index++;
11711 }
11712
11714 {
11715 int liquidtype = Math.Round(floats.Get(index));
11717 index++;
11718 }
11719
11721 {
11723 index++;
11725 index++;
11727 index++;
11729 index++;
11730 }
11731
11733 {
11734 int cleanness = Math.Round(floats.Get(index));
11736 index++;
11737 }
11738 }
11739
11741 {
11742 super.WriteVarsToCTX(ctx);
11743
11744
11746 {
11748 }
11749
11751 {
11753 }
11754
11756 {
11758 }
11759
11761 {
11762 int r,g,b,a;
11768 }
11769
11771 {
11773 }
11774 }
11775
11777 {
11778 if (!super.ReadVarsFromCTX(ctx,version))
11779 return false;
11780
11781 int intValue;
11782 float value;
11783
11784 if (version < 140)
11785 {
11786 if (!ctx.
Read(intValue))
11787 return false;
11788
11789 m_VariablesMask = intValue;
11790 }
11791
11793 {
11794 if (!ctx.
Read(value))
11795 return false;
11796
11798 {
11800 }
11801 else
11802 {
11804 }
11805 }
11806
11807 if (version < 140)
11808 {
11810 {
11811 if (!ctx.
Read(value))
11812 return false;
11813 SetTemperatureDirect(value);
11814 }
11815 }
11816
11818 {
11819 if (!ctx.
Read(value))
11820 return false;
11822 }
11823
11825 {
11826 if (!ctx.
Read(intValue))
11827 return false;
11829 }
11830
11832 {
11833 int r,g,b,a;
11835 return false;
11837 return false;
11839 return false;
11841 return false;
11842
11844 }
11845
11847 {
11848 if (!ctx.
Read(intValue))
11849 return false;
11851 }
11852
11853 if (version >= 138 && version < 140)
11854 {
11856 {
11857 if (!ctx.
Read(intValue))
11858 return false;
11859 SetFrozen(intValue);
11860 }
11861 }
11862
11863 return true;
11864 }
11865
11866
11868 {
11871 {
11873 }
11874
11875 if (!super.OnStoreLoad(ctx, version))
11876 {
11878 return false;
11879 }
11880
11881 if (version >= 114)
11882 {
11883 bool hasQuickBarIndexSaved;
11884
11885 if (!ctx.
Read(hasQuickBarIndexSaved))
11886 {
11888 return false;
11889 }
11890
11891 if (hasQuickBarIndexSaved)
11892 {
11893 int itmQBIndex;
11894
11895
11896 if (!ctx.
Read(itmQBIndex))
11897 {
11899 return false;
11900 }
11901
11902 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11903 if (itmQBIndex != -1 && parentPlayer)
11904 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11905 }
11906 }
11907 else
11908 {
11909
11910 PlayerBase player;
11911 int itemQBIndex;
11912 if (version ==
int.
MAX)
11913 {
11914 if (!ctx.
Read(itemQBIndex))
11915 {
11917 return false;
11918 }
11919 }
11920 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11921 {
11922
11923 if (!ctx.
Read(itemQBIndex))
11924 {
11926 return false;
11927 }
11928 if (itemQBIndex != -1 && player)
11929 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11930 }
11931 }
11932
11933 if (version < 140)
11934 {
11935
11936 if (!LoadVariables(ctx, version))
11937 {
11939 return false;
11940 }
11941 }
11942
11943
11945 {
11947 return false;
11948 }
11949 if (version >= 132)
11950 {
11952 if (raib)
11953 {
11955 {
11957 return false;
11958 }
11959 }
11960 }
11961
11963 return true;
11964 }
11965
11966
11967
11969 {
11970 super.OnStoreSave(ctx);
11971
11972 PlayerBase player;
11973 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11974 {
11976
11977 int itemQBIndex = -1;
11978 itemQBIndex = player.FindQuickBarEntityIndex(this);
11979 ctx.
Write(itemQBIndex);
11980 }
11981 else
11982 {
11984 }
11985
11987
11989 if (raib)
11990 {
11992 }
11993 }
11994
11995
11997 {
11998 super.AfterStoreLoad();
11999
12001 {
12003 }
12004
12006 {
12009 }
12010 }
12011
12013 {
12014 super.EEOnAfterLoad();
12015
12017 {
12019 }
12020
12023 }
12024
12026 {
12027 return false;
12028 }
12029
12030
12031
12033 {
12035 {
12036 #ifdef PLATFORM_CONSOLE
12037
12039 {
12041 if (menu)
12042 {
12044 }
12045 }
12046 #endif
12047 }
12048
12050 {
12053 }
12054
12056 {
12057 SetWeightDirty();
12059 }
12061 {
12064 }
12065
12067 {
12070 }
12072 {
12075 }
12076
12077 super.OnVariablesSynchronized();
12078 }
12079
12080
12081
12083 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12084 {
12085 if (!IsServerCheck(allow_client))
12086 return false;
12087
12089 return false;
12090
12093
12094 if (value <= (min + 0.001))
12095 value = min;
12096
12097 if (value == min)
12098 {
12099 if (destroy_config)
12100 {
12101 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12102 if (dstr)
12103 {
12105 this.Delete();
12106 return true;
12107 }
12108 }
12109 else if (destroy_forced)
12110 {
12112 this.Delete();
12113 return true;
12114 }
12115
12117 }
12118
12121
12123 {
12125
12126 if (delta)
12128 }
12129
12131
12132 return false;
12133 }
12134
12135
12137 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12138 {
12140 }
12141
12143 {
12146 }
12147
12149 {
12152 }
12153
12155 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12156 {
12157 float value_clamped = Math.Clamp(value, 0, 1);
12159 SetQuantity(result, destroy_config, destroy_forced);
12160 }
12161
12162
12165 {
12167 }
12168
12170 {
12172 }
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12184 {
12185 int slot = -1;
12186 if (GetInventory())
12187 {
12188 InventoryLocation il = new InventoryLocation;
12189 GetInventory().GetCurrentInventoryLocation(il);
12191 }
12192
12194 }
12195
12197 {
12198 float quantity_max = 0;
12199
12201 {
12202 if (attSlotID != -1)
12203 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12204
12205 if (quantity_max <= 0)
12207 }
12208
12209 if (quantity_max <= 0)
12211
12212 return quantity_max;
12213 }
12214
12216 {
12218 }
12219
12221 {
12223 }
12224
12225
12227 {
12229 }
12230
12232 {
12234 }
12235
12237 {
12239 }
12240
12241
12243 {
12244
12245 float weightEx = GetWeightEx();
12246 float special = GetInventoryAndCargoWeight();
12247 return weightEx - special;
12248 }
12249
12250
12252 {
12254 }
12255
12257 {
12259 {
12260 #ifdef DEVELOPER
12261 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12262 {
12263 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12265 }
12266 #endif
12267
12268 return GetQuantity() * GetConfigWeightModified();
12269 }
12270 else if (HasEnergyManager())
12271 {
12272 #ifdef DEVELOPER
12273 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12274 {
12275 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12276 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12277 }
12278 #endif
12279 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12280 }
12281 else
12282 {
12283 #ifdef DEVELOPER
12284 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12285 {
12286 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12287 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12288 }
12289 #endif
12290 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12291 }
12292 }
12293
12296 {
12297 int item_count = 0;
12299
12300 if (GetInventory().GetCargo() != NULL)
12301 {
12302 item_count = GetInventory().GetCargo().GetItemCount();
12303 }
12304
12305 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12306 {
12307 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12308 if (item)
12309 item_count += item.GetNumberOfItems();
12310 }
12311 return item_count;
12312 }
12313
12316 {
12317 float weight = 0;
12318 float wetness = 1;
12319 if (include_wetness)
12322 {
12323 weight = wetness * m_ConfigWeight;
12324 }
12326 {
12327 weight = 1;
12328 }
12329 return weight;
12330 }
12331
12332
12333
12335 {
12336 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12337 {
12338 GameInventory inv = GetInventory();
12339 array<EntityAI> items = new array<EntityAI>;
12341 for (int i = 0; i < items.Count(); i++)
12342 {
12344 if (item)
12345 {
12347 }
12348 }
12349 }
12350 }
12351
12352
12353
12354
12356 {
12357 float energy = 0;
12358 if (HasEnergyManager())
12359 {
12360 energy = GetCompEM().GetEnergy();
12361 }
12362 return energy;
12363 }
12364
12365
12367 {
12368 super.OnEnergyConsumed();
12369
12371 }
12372
12374 {
12375 super.OnEnergyAdded();
12376
12378 }
12379
12380
12382 {
12383 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12384 {
12386 {
12387 float energy_0to1 = GetCompEM().GetEnergy0To1();
12389 }
12390 }
12391 }
12392
12393
12395 {
12396 return ConfigGetFloat("heatIsolation");
12397 }
12398
12400 {
12402 }
12403
12405 {
12406 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12407 if (
GetGame().ConfigIsExisting(paramPath))
12409
12410 return 0.0;
12411 }
12412
12414 {
12415 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12416 if (
GetGame().ConfigIsExisting(paramPath))
12418
12419 return 0.0;
12420 }
12421
12422 override void SetWet(
float value,
bool allow_client =
false)
12423 {
12424 if (!IsServerCheck(allow_client))
12425 return;
12426
12429
12431
12432 m_VarWet = Math.Clamp(value, min, max);
12433
12435 {
12438 }
12439 }
12440
12441 override void AddWet(
float value)
12442 {
12444 }
12445
12447 {
12449 }
12450
12452 {
12454 }
12455
12457 {
12459 }
12460
12462 {
12464 }
12465
12467 {
12469 }
12470
12471 override void OnWetChanged(
float newVal,
float oldVal)
12472 {
12475 if (newLevel != oldLevel)
12476 {
12478 }
12479 }
12480
12482 {
12483 SetWeightDirty();
12484 }
12485
12487 {
12488 return GetWetLevelInternal(
m_VarWet);
12489 }
12490
12491
12492
12494 {
12496 }
12497
12499 {
12501 }
12502
12504 {
12506 }
12507
12509 {
12511 }
12512
12513
12514
12516 {
12517 if (ConfigIsExisting("itemModelLength"))
12518 {
12519 return ConfigGetFloat("itemModelLength");
12520 }
12521 return 0;
12522 }
12523
12525 {
12526 if (ConfigIsExisting("itemAttachOffset"))
12527 {
12528 return ConfigGetFloat("itemAttachOffset");
12529 }
12530 return 0;
12531 }
12532
12533 override void SetCleanness(
int value,
bool allow_client =
false)
12534 {
12535 if (!IsServerCheck(allow_client))
12536 return;
12537
12539
12541
12544 }
12545
12547 {
12549 }
12550
12552 {
12553 return true;
12554 }
12555
12556
12557
12558
12560 {
12562 }
12563
12565 {
12567 }
12568
12569
12570
12571
12572 override void SetColor(
int r,
int g,
int b,
int a)
12573 {
12579 }
12581 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12582 {
12587 }
12588
12590 {
12592 }
12593
12596 {
12597 int r,g,b,a;
12599 r = r/255;
12600 g = g/255;
12601 b = b/255;
12602 a = a/255;
12603 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12604 }
12605
12606
12607
12608 override void SetLiquidType(
int value,
bool allow_client =
false)
12609 {
12610 if (!IsServerCheck(allow_client))
12611 return;
12612
12617 }
12618
12620 {
12621 return ConfigGetInt("varLiquidTypeInit");
12622 }
12623
12625 {
12627 }
12628
12630 {
12632 SetFrozen(false);
12633 }
12634
12637 {
12638 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12639 }
12640
12641
12644 {
12645 PlayerBase nplayer;
12646 if (PlayerBase.CastTo(nplayer, player))
12647 {
12649
12650 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12651 }
12652 }
12653
12654
12657 {
12658 PlayerBase nplayer;
12659 if (PlayerBase.CastTo(nplayer,player))
12660 {
12661
12662 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12663
12664 }
12665
12666
12667 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12668
12669
12670 if (HasEnergyManager())
12671 {
12672 GetCompEM().UpdatePlugState();
12673 }
12674 }
12675
12676
12678 {
12679 super.OnPlacementStarted(player);
12680
12682 }
12683
12684 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12685 {
12687 {
12688 m_AdminLog.OnPlacementComplete(player,
this);
12689 }
12690
12691 super.OnPlacementComplete(player, position, orientation);
12692 }
12693
12694
12695
12696
12697
12699 {
12701 {
12702 return true;
12703 }
12704 else
12705 {
12706 return false;
12707 }
12708 }
12709
12710
12712 {
12714 {
12716 }
12717 }
12718
12719
12721 {
12723 }
12724
12726 {
12728 }
12729
12730 override void InsertAgent(
int agent,
float count = 1)
12731 {
12732 if (count < 1)
12733 return;
12734
12736 }
12737
12740 {
12742 }
12743
12744
12746 {
12748 }
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12792 {
12794 return false;
12795 return true;
12796 }
12797
12799 {
12800
12802 }
12803
12804
12807 {
12808 super.CheckForRoofLimited(timeTresholdMS);
12809
12811 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12812 {
12813 m_PreviousRoofTestTime = time;
12814 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12815 }
12816 }
12817
12818
12820 {
12822 {
12823 return 0;
12824 }
12825
12826 if (GetInventory().GetAttachmentSlotsCount() != 0)
12827 {
12828 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12829 if (filter)
12830 return filter.GetProtectionLevel(type, false, system);
12831 else
12832 return 0;
12833 }
12834
12835 string subclassPath, entryName;
12836
12837 switch (type)
12838 {
12840 entryName = "biological";
12841 break;
12843 entryName = "chemical";
12844 break;
12845 default:
12846 entryName = "biological";
12847 break;
12848 }
12849
12850 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12851
12853 }
12854
12855
12856
12859 {
12860 if (!IsMagazine())
12862
12864 }
12865
12866
12867
12868
12869
12874 {
12875 return true;
12876 }
12877
12879 {
12881 }
12882
12883
12884
12885
12886
12888 {
12889 if (parent)
12890 {
12891 if (parent.IsInherited(DayZInfected))
12892 return true;
12893
12894 if (!parent.IsRuined())
12895 return true;
12896 }
12897
12898 return true;
12899 }
12900
12902 {
12903 if (!super.CanPutAsAttachment(parent))
12904 {
12905 return false;
12906 }
12907
12908 if (!IsRuined() && !parent.IsRuined())
12909 {
12910 return true;
12911 }
12912
12913 return false;
12914 }
12915
12917 {
12918
12919
12920
12921
12922 return super.CanReceiveItemIntoCargo(item);
12923 }
12924
12926 {
12927
12928
12929
12930
12931 GameInventory attachmentInv = attachment.GetInventory();
12933 {
12934 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12935 return false;
12936 }
12937
12938 InventoryLocation loc = new InventoryLocation();
12939 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12940 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12941 return false;
12942
12943 return super.CanReceiveAttachment(attachment, slotId);
12944 }
12945
12947 {
12948 if (!super.CanReleaseAttachment(attachment))
12949 return false;
12950
12951 return GetInventory().AreChildrenAccessible();
12952 }
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12975 {
12976 int id = muzzle_owner.GetMuzzleID();
12977 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12978
12979 if (WPOF_array)
12980 {
12981 for (int i = 0; i < WPOF_array.Count(); i++)
12982 {
12983 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12984
12985 if (WPOF)
12986 {
12987 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12988 }
12989 }
12990 }
12991 }
12992
12993
12995 {
12996 int id = muzzle_owner.GetMuzzleID();
12998
12999 if (WPOBE_array)
13000 {
13001 for (int i = 0; i < WPOBE_array.Count(); i++)
13002 {
13003 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13004
13005 if (WPOBE)
13006 {
13007 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13008 }
13009 }
13010 }
13011 }
13012
13013
13015 {
13016 int id = muzzle_owner.GetMuzzleID();
13017 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13018
13019 if (WPOOH_array)
13020 {
13021 for (int i = 0; i < WPOOH_array.Count(); i++)
13022 {
13023 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13024
13025 if (WPOOH)
13026 {
13027 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13028 }
13029 }
13030 }
13031 }
13032
13033
13035 {
13036 int id = muzzle_owner.GetMuzzleID();
13037 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13038
13039 if (WPOOH_array)
13040 {
13041 for (int i = 0; i < WPOOH_array.Count(); i++)
13042 {
13043 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13044
13045 if (WPOOH)
13046 {
13047 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13048 }
13049 }
13050 }
13051 }
13052
13053
13055 {
13056 int id = muzzle_owner.GetMuzzleID();
13057 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13058
13059 if (WPOOH_array)
13060 {
13061 for (int i = 0; i < WPOOH_array.Count(); i++)
13062 {
13063 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13064
13065 if (WPOOH)
13066 {
13067 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13068 }
13069 }
13070 }
13071 }
13072
13073
13074
13076 {
13078 {
13079 return true;
13080 }
13081
13082 return false;
13083 }
13084
13086 {
13088 {
13089 return true;
13090 }
13091
13092 return false;
13093 }
13094
13096 {
13098 {
13099 return true;
13100 }
13101
13102 return false;
13103 }
13104
13106 {
13107 return false;
13108 }
13109
13112 {
13113 return UATimeSpent.DEFAULT_DEPLOY;
13114 }
13115
13116
13117
13118
13120 {
13122 SetSynchDirty();
13123 }
13124
13126 {
13128 }
13129
13130
13132 {
13133 return false;
13134 }
13135
13138 {
13139 string att_type = "None";
13140
13141 if (ConfigIsExisting("soundAttType"))
13142 {
13143 att_type = ConfigGetString("soundAttType");
13144 }
13145
13147 }
13148
13150 {
13152 }
13153
13154
13155
13156
13157
13163
13165 {
13168
13170 }
13171
13172
13174 {
13176 return;
13177
13179
13182
13185
13186 SoundParameters params = new SoundParameters();
13190 }
13191
13192
13194 {
13196 return;
13197
13199 SetSynchDirty();
13200
13203 }
13204
13205
13207 {
13209 return;
13210
13212 SetSynchDirty();
13213
13216 }
13217
13219 {
13221 }
13222
13224 {
13226 }
13227
13230 {
13231 if (!
GetGame().IsDedicatedServer())
13232 {
13233 if (ConfigIsExisting("attachSoundSet"))
13234 {
13235 string cfg_path = "";
13236 string soundset = "";
13237 string type_name =
GetType();
13238
13241 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13242 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13243
13244 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13245 {
13246 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13247 {
13248 if (cfg_slot_array[i] == slot_type)
13249 {
13250 soundset = cfg_soundset_array[i];
13251 break;
13252 }
13253 }
13254 }
13255
13256 if (soundset != "")
13257 {
13258 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13260 }
13261 }
13262 }
13263 }
13264
13266 {
13267
13268 }
13269
13270 void OnApply(PlayerBase player);
13271
13273 {
13274 return 1.0;
13275 };
13276
13278 {
13280 }
13281
13283 {
13285 }
13286
13288
13290 {
13291 SetDynamicPhysicsLifeTime(0.01);
13293 }
13294
13296 {
13297 array<string> zone_names = new array<string>;
13298 GetDamageZones(zone_names);
13299 for (int i = 0; i < zone_names.Count(); i++)
13300 {
13301 SetHealthMax(zone_names.Get(i),"Health");
13302 }
13303 SetHealthMax("","Health");
13304 }
13305
13308 {
13309 float global_health = GetHealth01("","Health");
13310 array<string> zones = new array<string>;
13311 GetDamageZones(zones);
13312
13313 for (int i = 0; i < zones.Count(); i++)
13314 {
13315 SetHealth01(zones.Get(i),"Health",global_health);
13316 }
13317 }
13318
13321 {
13322 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13323 }
13324
13326 {
13327 if (!hasRootAsPlayer)
13328 {
13329 if (refParentIB)
13330 {
13331
13332 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13333 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13334
13335 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13336 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13337
13340 }
13341 else
13342 {
13343
13346 }
13347 }
13348 }
13349
13351 {
13353 {
13354 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13355 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13356 {
13357 float heatPermCoef = 1.0;
13359 while (ent)
13360 {
13361 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13362 ent = ent.GetHierarchyParent();
13363 }
13364
13365 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13366 }
13367 }
13368 }
13369
13371 {
13372
13373 EntityAI parent = GetHierarchyParent();
13374 if (!parent)
13375 {
13376 hasParent = false;
13377 hasRootAsPlayer = false;
13378 }
13379 else
13380 {
13381 hasParent = true;
13382 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13383 refParentIB =
ItemBase.Cast(parent);
13384 }
13385 }
13386
13387 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13388 {
13389
13390 }
13391
13393 {
13394
13395 return false;
13396 }
13397
13399 {
13400
13401
13402 return false;
13403 }
13404
13406 {
13407
13408 return false;
13409 }
13410
13413 {
13414 return !GetIsFrozen() &&
IsOpen();
13415 }
13416
13418 {
13419 bool hasParent = false, hasRootAsPlayer = false;
13421
13422 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13423 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13424
13425 if (wwtu || foodDecay)
13426 {
13430
13431 if (processWetness || processTemperature || processDecay)
13432 {
13434
13435 if (processWetness)
13436 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13437
13438 if (processTemperature)
13440
13441 if (processDecay)
13442 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13443 }
13444 }
13445 }
13446
13449 {
13451 }
13452
13454 {
13457
13458 return super.GetTemperatureFreezeThreshold();
13459 }
13460
13462 {
13465
13466 return super.GetTemperatureThawThreshold();
13467 }
13468
13470 {
13473
13474 return super.GetItemOverheatThreshold();
13475 }
13476
13478 {
13480 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13481
13482 return super.GetTemperatureFreezeTime();
13483 }
13484
13486 {
13488 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13489
13490 return super.GetTemperatureThawTime();
13491 }
13492
13497
13499 {
13500 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13501 }
13502
13504 {
13505 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13506 }
13507
13510 {
13512 }
13513
13515 {
13517 }
13518
13520 {
13522 }
13523
13526 {
13527 return null;
13528 }
13529
13532 {
13533 return false;
13534 }
13535
13537 {
13539 {
13542 if (!trg)
13543 {
13545 explosive = this;
13546 }
13547
13548 explosive.PairRemote(trg);
13550
13551 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13552 trg.SetPersistentPairID(persistentID);
13553 explosive.SetPersistentPairID(persistentID);
13554
13555 return true;
13556 }
13557 return false;
13558 }
13559
13562 {
13563 float ret = 1.0;
13566 ret *= GetHealth01();
13567
13568 return ret;
13569 }
13570
13571 #ifdef DEVELOPER
13572 override void SetDebugItem()
13573 {
13574 super.SetDebugItem();
13575 _itemBase = this;
13576 }
13577
13579 {
13580 string text = super.GetDebugText();
13581
13583 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13584
13585 return text;
13586 }
13587 #endif
13588
13590 {
13591 return true;
13592 }
13593
13595
13597
13599 {
13602 }
13603
13604
13612
13628}
13629
13631{
13633 if (entity)
13634 {
13635 bool is_item = entity.IsInherited(
ItemBase);
13636 if (is_item && full_quantity)
13637 {
13640 }
13641 }
13642 else
13643 {
13645 return NULL;
13646 }
13647 return entity;
13648}
13649
13651{
13652 if (item)
13653 {
13654 if (health > 0)
13655 item.SetHealth("", "", health);
13656
13657 if (item.CanHaveTemperature())
13658 {
13660 if (item.CanFreeze())
13661 item.SetFrozen(false);
13662 }
13663
13664 if (item.HasEnergyManager())
13665 {
13666 if (quantity >= 0)
13667 {
13668 item.GetCompEM().SetEnergy0To1(quantity);
13669 }
13670 else
13671 {
13673 }
13674 }
13675 else if (item.IsMagazine())
13676 {
13677 Magazine mag = Magazine.Cast(item);
13678 if (quantity >= 0)
13679 {
13680 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13681 }
13682 else
13683 {
13685 }
13686
13687 }
13688 else
13689 {
13690 if (quantity >= 0)
13691 {
13692 item.SetQuantityNormalized(quantity, false);
13693 }
13694 else
13695 {
13697 }
13698
13699 }
13700 }
13701}
13702
13703#ifdef DEVELOPER
13705#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
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()
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)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.