8383{
8385 {
8386 return true;
8387 }
8388};
8389
8390
8391
8393{
8397
8399
8402
8403
8404
8405
8406
8415
8421
8426
8431
8452 protected bool m_IsResultOfSplit
8453
8455
8460
8461
8462
8464
8468
8469
8470
8472
8475
8476
8477
8483
8484
8492
8495
8496
8498
8499
8501
8502
8507
8508
8513
8514
8516
8517
8519 {
8524
8525 if (!
GetGame().IsDedicatedServer())
8526 {
8528 {
8530
8532 {
8534 }
8535 }
8536
8539 }
8540
8541 m_OldLocation = null;
8542
8544 {
8546 }
8547
8548 if (ConfigIsExisting("headSelectionsToHide"))
8549 {
8552 }
8553
8555 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8556 {
8558 }
8559
8561
8562 m_IsResultOfSplit = false;
8563
8565 }
8566
8568 {
8569 super.InitItemVariables();
8570
8576 m_Count = ConfigGetInt(
"count");
8577
8580
8585
8588
8593
8605
8609
8610
8613 if (ConfigIsExisting("canBeSplit"))
8614 {
8617 }
8618
8620 if (ConfigIsExisting("itemBehaviour"))
8622
8623
8626 RegisterNetSyncVariableInt("m_VarLiquidType");
8627 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8628
8629 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8630 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8631 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8632
8633 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8634 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8635 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8636 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8637
8638 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8639 RegisterNetSyncVariableBool("m_IsTakeable");
8640 RegisterNetSyncVariableBool("m_IsHologram");
8641
8644 {
8647 }
8648
8650
8652 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8654
8655 }
8656
8658 {
8660 }
8661
8663 {
8666 {
8671 }
8672 }
8673
8674 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8675 {
8677 {
8680 }
8681
8683 }
8684
8686 {
8692 }
8693
8695
8697 {
8699
8700 if (!action)
8701 {
8702 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8703 return;
8704 }
8705
8707 if (!ai)
8708 {
8710 return;
8711 }
8712
8714 if (!action_array)
8715 {
8716 action_array = new array<ActionBase_Basic>;
8718 }
8719 if (LogManager.IsActionLogEnable())
8720 {
8721 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8722 }
8723
8724 if (action_array.Find(action) != -1)
8725 {
8726 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8727 }
8728 else
8729 {
8730 action_array.Insert(action);
8731 }
8732 }
8733
8735 {
8737 ActionBase action = player.GetActionManager().GetAction(actionName);
8740
8741 if (action_array)
8742 {
8743 action_array.RemoveItem(action);
8744 }
8745 }
8746
8747
8748
8750 {
8751 ActionOverrideData overrideData = new ActionOverrideData();
8755
8757 if (!actionMap)
8758 {
8761 }
8762
8763 actionMap.Insert(this.
Type(), overrideData);
8764
8765 }
8766
8768
8770
8771
8773 {
8776
8779
8780 string config_to_search = "CfgVehicles";
8781 string muzzle_owner_config;
8782
8784 {
8785 if (IsInherited(Weapon))
8786 config_to_search = "CfgWeapons";
8787
8788 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8789
8790 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8791
8793
8794 if (config_OnFire_subclass_count > 0)
8795 {
8796 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8797
8798 for (int i = 0; i < config_OnFire_subclass_count; i++)
8799 {
8800 string particle_class = "";
8802 string config_OnFire_entry = config_OnFire_class + particle_class;
8803 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8804 WPOF_array.Insert(WPOF);
8805 }
8806
8807
8809 }
8810 }
8811
8813 {
8814 config_to_search = "CfgWeapons";
8815 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8816
8817 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8818
8820
8821 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8822 {
8823 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8824
8825 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8826 {
8827 string particle_class2 = "";
8829 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8830 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8831 WPOBE_array.Insert(WPOBE);
8832 }
8833
8834
8836 }
8837 }
8838 }
8839
8840
8842 {
8845
8847 {
8848 string config_to_search = "CfgVehicles";
8849
8850 if (IsInherited(Weapon))
8851 config_to_search = "CfgWeapons";
8852
8853 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8854 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8855
8856 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8857 {
8858
8860
8862 {
8864 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8866 return;
8867 }
8868
8871
8872
8873
8875 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8876
8877 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8878 {
8879 string particle_class = "";
8881 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8883
8884 if (entry_type == CT_CLASS)
8885 {
8886 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8887 WPOOH_array.Insert(WPOF);
8888 }
8889 }
8890
8891
8893 }
8894 }
8895 }
8896
8898 {
8900 }
8901
8903 {
8905 {
8907
8910
8913
8914 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8915 }
8916 }
8917
8919 {
8921 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8922
8924 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8925
8927 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8928
8930 {
8932 }
8933 }
8934
8936 {
8938 }
8939
8941 {
8944 else
8946
8948 {
8951 }
8952 else
8953 {
8956
8959 }
8960
8962 }
8963
8965 {
8967 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8968 }
8969
8971 {
8973 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8975 }
8976
8978 {
8980 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8981 }
8982
8984 {
8987
8988 OverheatingParticle OP = new OverheatingParticle();
8993
8995 }
8996
8998 {
9001
9002 return -1;
9003 }
9004
9006 {
9008 {
9011
9012 for (int i = count; i > 0; --i)
9013 {
9014 int id = i - 1;
9017
9020
9021 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9022 {
9023 if (p)
9024 {
9027 }
9028 }
9029 }
9030 }
9031 }
9032
9034 {
9036 {
9038 {
9039 int id = i - 1;
9041
9042 if (OP)
9043 {
9045
9046 if (p)
9047 {
9049 }
9050
9051 delete OP;
9052 }
9053 }
9054
9057 }
9058 }
9059
9062 {
9063 return 0.0;
9064 }
9065
9066
9068 {
9069 return 250;
9070 }
9071
9073 {
9074 return 0;
9075 }
9076
9079 {
9081 return true;
9082
9083 return false;
9084 }
9085
9088 {
9091
9093 {
9095 }
9096 else
9097 {
9098
9100 }
9101
9103 }
9104
9111 {
9112 return -1;
9113 }
9114
9115
9116
9117
9119 {
9121 {
9123 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9124
9125 if (r_index >= 0)
9126 {
9127 InventoryLocation r_il = new InventoryLocation;
9128 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9129
9130 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9133 {
9134 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9135 }
9137 {
9138 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9139 }
9140
9141 }
9142
9143 player.GetHumanInventory().ClearUserReservedLocation(this);
9144 }
9145
9148 }
9149
9150
9151
9152
9154 {
9155 return ItemBase.m_DebugActionsMask;
9156 }
9157
9159 {
9160 return ItemBase.m_DebugActionsMask & mask;
9161 }
9162
9164 {
9165 ItemBase.m_DebugActionsMask = mask;
9166 }
9167
9169 {
9170 ItemBase.m_DebugActionsMask |= mask;
9171 }
9172
9174 {
9175 ItemBase.m_DebugActionsMask &= ~mask;
9176 }
9177
9179 {
9181 {
9183 }
9184 else
9185 {
9187 }
9188 }
9189
9190
9192 {
9193 if (GetEconomyProfile())
9194 {
9195 float q_max = GetEconomyProfile().GetQuantityMax();
9196 if (q_max > 0)
9197 {
9198 float q_min = GetEconomyProfile().GetQuantityMin();
9199 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9200
9202 {
9203 ComponentEnergyManager comp = GetCompEM();
9205 {
9207 }
9208 }
9210 {
9212
9213 }
9214
9215 }
9216 }
9217 }
9218
9221 {
9222 EntityAI parent = GetHierarchyParent();
9223
9224 if (parent)
9225 {
9226 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9227 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9228 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9229 }
9230 }
9231
9234 {
9235 EntityAI parent = GetHierarchyParent();
9236
9237 if (parent)
9238 {
9239 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9240 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9241 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9242 }
9243 }
9244
9246 {
9247
9248
9249
9250
9252
9254 {
9255 if (ScriptInputUserData.CanStoreInputUserData())
9256 {
9257 ScriptInputUserData ctx = new ScriptInputUserData;
9263 ctx.
Write(use_stack_max);
9266
9268 {
9269 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9270 }
9271 }
9272 }
9273 else if (!
GetGame().IsMultiplayer())
9274 {
9276 }
9277 }
9278
9280 {
9282 }
9283
9285 {
9287 }
9288
9290 {
9292 }
9293
9295 {
9296
9297 return false;
9298 }
9299
9301 {
9302 return false;
9303 }
9304
9308 {
9309 return false;
9310 }
9311
9313 {
9314 return "";
9315 }
9316
9318
9320 {
9321 return false;
9322 }
9323
9325 {
9326 return true;
9327 }
9328
9329
9330
9332 {
9333 return true;
9334 }
9335
9337 {
9338 return true;
9339 }
9340
9342 {
9343 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9345 }
9346
9348 {
9350 }
9351
9353 {
9355 if (!is_being_placed)
9357 SetSynchDirty();
9358 }
9359
9360
9362
9364 {
9366 }
9367
9369 {
9371 }
9372
9374 {
9375 return 1;
9376 }
9377
9379 {
9380 return false;
9381 }
9382
9384 {
9386 SetSynchDirty();
9387 }
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9424 {
9425 super.OnMovedInsideCargo(container);
9426
9427 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9428 }
9429
9430 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9431 {
9432 super.EEItemLocationChanged(oldLoc,newLoc);
9433
9434 PlayerBase new_player = null;
9435 PlayerBase old_player = null;
9436
9437 if (newLoc.GetParent())
9438 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9439
9440 if (oldLoc.GetParent())
9441 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9442
9444 {
9445 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9446
9447 if (r_index >= 0)
9448 {
9449 InventoryLocation r_il = new InventoryLocation;
9450 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9451
9452 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9455 {
9456 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9457 }
9459 {
9460 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9461 }
9462
9463 }
9464 }
9465
9467 {
9468 if (new_player)
9469 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9470
9471 if (new_player == old_player)
9472 {
9473
9474 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9475 {
9477 {
9478 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9479 {
9480 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9481 }
9482 }
9483 else
9484 {
9485 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9486 }
9487 }
9488
9489 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9490 {
9491 int type = oldLoc.GetType();
9493 {
9494 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9495 }
9497 {
9498 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9499 }
9500 }
9501 if (!m_OldLocation)
9502 {
9503 m_OldLocation = new InventoryLocation;
9504 }
9505 m_OldLocation.Copy(oldLoc);
9506 }
9507 else
9508 {
9509 if (m_OldLocation)
9510 {
9511 m_OldLocation.Reset();
9512 }
9513 }
9514
9516 }
9517 else
9518 {
9519 if (new_player)
9520 {
9521 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9522 if (res_index >= 0)
9523 {
9524 InventoryLocation il = new InventoryLocation;
9525 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9527 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9530 {
9531 il.
GetParent().GetOnReleaseLock().Invoke(it);
9532 }
9534 {
9536 }
9537
9538 }
9539 }
9541 {
9542
9544 }
9545
9546 if (m_OldLocation)
9547 {
9548 m_OldLocation.Reset();
9549 }
9550 }
9551 }
9552
9553 override void EOnContact(IEntity other, Contact extra)
9554 {
9556 {
9557 int liquidType = -1;
9559 if (impactSpeed > 0.0)
9560 {
9562 #ifndef SERVER
9564 #else
9566 SetSynchDirty();
9567 #endif
9569 }
9570 }
9571
9572 #ifdef SERVER
9573 if (GetCompEM() && GetCompEM().IsPlugged())
9574 {
9575 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9576 GetCompEM().UnplugThis();
9577 }
9578 #endif
9579 }
9580
9582
9584 {
9586 }
9587
9589 {
9590
9591 }
9592
9594 {
9595 super.OnItemLocationChanged(old_owner, new_owner);
9596
9597 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9598 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9599
9600 if (!relatedPlayer && playerNew)
9601 relatedPlayer = playerNew;
9602
9603 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9604 {
9606 if (actionMgr)
9607 {
9608 ActionBase currentAction = actionMgr.GetRunningAction();
9609 if (currentAction)
9611 }
9612 }
9613
9614 Man ownerPlayerOld = null;
9615 Man ownerPlayerNew = null;
9616
9617 if (old_owner)
9618 {
9619 if (old_owner.
IsMan())
9620 {
9621 ownerPlayerOld = Man.Cast(old_owner);
9622 }
9623 else
9624 {
9625 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9626 }
9627 }
9628 else
9629 {
9631 {
9633
9634 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9635 {
9636 GetCompEM().UnplugThis();
9637 }
9638 }
9639 }
9640
9641 if (new_owner)
9642 {
9643 if (new_owner.
IsMan())
9644 {
9645 ownerPlayerNew = Man.Cast(new_owner);
9646 }
9647 else
9648 {
9649 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9650 }
9651 }
9652
9653 if (ownerPlayerOld != ownerPlayerNew)
9654 {
9655 if (ownerPlayerOld)
9656 {
9657 array<EntityAI> subItemsExit = new array<EntityAI>;
9659 for (int i = 0; i < subItemsExit.Count(); i++)
9660 {
9663 }
9664 }
9665
9666 if (ownerPlayerNew)
9667 {
9668 array<EntityAI> subItemsEnter = new array<EntityAI>;
9670 for (int j = 0; j < subItemsEnter.Count(); j++)
9671 {
9674 }
9675 }
9676 }
9677 else if (ownerPlayerNew != null)
9678 {
9679 PlayerBase nplayer;
9680 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9681 {
9682 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9684 for (int k = 0; k < subItemsUpdate.Count(); k++)
9685 {
9687 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9688 }
9689 }
9690 }
9691
9692 if (old_owner)
9693 old_owner.OnChildItemRemoved(this);
9694 if (new_owner)
9695 new_owner.OnChildItemReceived(this);
9696 }
9697
9698
9700 {
9701 super.EEDelete(parent);
9702 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9703 if (player)
9704 {
9706
9707 if (player.IsAlive())
9708 {
9709 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9710 if (r_index >= 0)
9711 {
9712 InventoryLocation r_il = new InventoryLocation;
9713 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9714
9715 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9718 {
9719 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9720 }
9722 {
9723 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9724 }
9725
9726 }
9727
9728 player.RemoveQuickBarEntityShortcut(this);
9729 }
9730 }
9731 }
9732
9734 {
9735 super.EEKilled(killer);
9736
9739 {
9740 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9741 {
9742 if (IsMagazine())
9743 {
9744 if (Magazine.Cast(this).GetAmmoCount() > 0)
9745 {
9747 }
9748 }
9749 else
9750 {
9752 }
9753 }
9754 }
9755 }
9756
9758 {
9759 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9760
9761 super.OnWasAttached(parent, slot_id);
9762
9765
9767 }
9768
9770 {
9771 super.OnWasDetached(parent, slot_id);
9772
9775 }
9776
9778 {
9779 int idx;
9782
9783 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9784 if (inventory_slots.Count() < 1)
9785 {
9786 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9787 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9788 }
9789 else
9790 {
9791 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9792 }
9793
9794 idx = inventory_slots.Find(slot);
9795 if (idx < 0)
9796 return "";
9797
9798 return attach_types.Get(idx);
9799 }
9800
9802 {
9803 int idx = -1;
9804 string slot;
9805
9808
9809 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9810 if (inventory_slots.Count() < 1)
9811 {
9812 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9813 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9814 }
9815 else
9816 {
9817 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9818 if (detach_types.Count() < 1)
9819 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9820 }
9821
9822 for (int i = 0; i < inventory_slots.Count(); i++)
9823 {
9824 slot = inventory_slots.Get(i);
9825 }
9826
9827 if (slot != "")
9828 {
9829 if (detach_types.Count() == 1)
9830 idx = 0;
9831 else
9832 idx = inventory_slots.Find(slot);
9833 }
9834 if (idx < 0)
9835 return "";
9836
9837 return detach_types.Get(idx);
9838 }
9839
9841 {
9842
9844
9845
9846 float min_time = 1;
9847 float max_time = 3;
9848 float delay = Math.RandomFloat(min_time, max_time);
9849
9850 explode_timer.Run(delay, this, "DoAmmoExplosion");
9851 }
9852
9854 {
9855 Magazine magazine = Magazine.Cast(this);
9856 int pop_sounds_count = 6;
9857 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9858
9859
9860 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9861 string sound_name = pop_sounds[ sound_idx ];
9863
9864
9865 magazine.ServerAddAmmoCount(-1);
9866
9867
9868 float min_temp_to_explode = 100;
9869
9870 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9871 {
9873 }
9874 }
9875
9876
9877 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9878 {
9879 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9880
9881 const int CHANCE_DAMAGE_CARGO = 4;
9882 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9883 const int CHANCE_DAMAGE_NOTHING = 2;
9884
9886 {
9887 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9888 int chances;
9889 int rnd;
9890
9891 if (GetInventory().GetCargo())
9892 {
9893 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9894 rnd = Math.RandomInt(0,chances);
9895
9896 if (rnd < CHANCE_DAMAGE_CARGO)
9897 {
9899 }
9900 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9901 {
9903 }
9904 }
9905 else
9906 {
9907 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9908 rnd = Math.RandomInt(0,chances);
9909
9910 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9911 {
9913 }
9914 }
9915 }
9916 }
9917
9919 {
9920 if (GetInventory().GetCargo())
9921 {
9922 int item_count = GetInventory().GetCargo().GetItemCount();
9923 if (item_count > 0)
9924 {
9925 int random_pick = Math.RandomInt(0, item_count);
9927 if (!item.IsExplosive())
9928 {
9929 item.AddHealth("","",damage);
9930 return true;
9931 }
9932 }
9933 }
9934 return false;
9935 }
9936
9938 {
9939 int attachment_count = GetInventory().AttachmentCount();
9940 if (attachment_count > 0)
9941 {
9942 int random_pick = Math.RandomInt(0, attachment_count);
9943 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9944 if (!attachment.IsExplosive())
9945 {
9946 attachment.AddHealth("","",damage);
9947 return true;
9948 }
9949 }
9950 return false;
9951 }
9952
9954 {
9956 }
9957
9959 {
9961 return GetInventory().CanRemoveEntity();
9962
9963 return false;
9964 }
9965
9967 {
9969 return;
9970
9972 {
9973 if (ScriptInputUserData.CanStoreInputUserData())
9974 {
9975 ScriptInputUserData ctx = new ScriptInputUserData;
9980 ctx.
Write(destination_entity);
9984 }
9985 }
9986 else if (!
GetGame().IsMultiplayer())
9987 {
9989 }
9990 }
9991
9993 {
9995 return;
9996
9997 float split_quantity_new;
10001 InventoryLocation loc = new InventoryLocation;
10002
10003 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10004 {
10006 split_quantity_new = stack_max;
10007 else
10009
10010 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10011 if (new_item)
10012 {
10013 new_item.SetResultOfSplit(true);
10014 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10016 new_item.SetQuantity(split_quantity_new);
10017 }
10018 }
10019 else if (destination_entity && slot_id == -1)
10020 {
10021 if (quantity > stack_max)
10022 split_quantity_new = stack_max;
10023 else
10024 split_quantity_new = quantity;
10025
10027 {
10030 }
10031
10032 if (new_item)
10033 {
10034 new_item.SetResultOfSplit(true);
10035 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10037 new_item.SetQuantity(split_quantity_new);
10038 }
10039 }
10040 else
10041 {
10042 if (stack_max != 0)
10043 {
10045 {
10047 }
10048
10049 if (split_quantity_new == 0)
10050 {
10051 if (!
GetGame().IsMultiplayer())
10052 player.PhysicalPredictiveDropItem(this);
10053 else
10054 player.ServerDropEntity(this);
10055 return;
10056 }
10057
10059
10060 if (new_item)
10061 {
10062 new_item.SetResultOfSplit(true);
10063 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10065 new_item.SetQuantity(stack_max);
10066 new_item.PlaceOnSurface();
10067 }
10068 }
10069 }
10070 }
10071
10073 {
10075 return;
10076
10077 float split_quantity_new;
10081 InventoryLocation loc = new InventoryLocation;
10082
10083 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10084 {
10086 split_quantity_new = stack_max;
10087 else
10089
10090 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10091 if (new_item)
10092 {
10093 new_item.SetResultOfSplit(true);
10094 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10096 new_item.SetQuantity(split_quantity_new);
10097 }
10098 }
10099 else if (destination_entity && slot_id == -1)
10100 {
10101 if (quantity > stack_max)
10102 split_quantity_new = stack_max;
10103 else
10104 split_quantity_new = quantity;
10105
10107 {
10110 }
10111
10112 if (new_item)
10113 {
10114 new_item.SetResultOfSplit(true);
10115 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10117 new_item.SetQuantity(split_quantity_new);
10118 }
10119 }
10120 else
10121 {
10122 if (stack_max != 0)
10123 {
10125 {
10127 }
10128
10130
10131 if (new_item)
10132 {
10133 new_item.SetResultOfSplit(true);
10134 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10136 new_item.SetQuantity(stack_max);
10137 new_item.PlaceOnSurface();
10138 }
10139 }
10140 }
10141 }
10142
10144 {
10146 return;
10147
10149 {
10150 if (ScriptInputUserData.CanStoreInputUserData())
10151 {
10152 ScriptInputUserData ctx = new ScriptInputUserData;
10157 dst.WriteToContext(ctx);
10159 }
10160 }
10161 else if (!
GetGame().IsMultiplayer())
10162 {
10164 }
10165 }
10166
10168 {
10170 return;
10171
10173 {
10174 if (ScriptInputUserData.CanStoreInputUserData())
10175 {
10176 ScriptInputUserData ctx = new ScriptInputUserData;
10181 ctx.
Write(destination_entity);
10187 }
10188 }
10189 else if (!
GetGame().IsMultiplayer())
10190 {
10192 }
10193 }
10194
10196 {
10198 }
10199
10201 {
10203 return this;
10204
10206 float split_quantity_new;
10208 if (dst.IsValid())
10209 {
10210 int slot_id = dst.GetSlot();
10212
10213 if (quantity > stack_max)
10214 split_quantity_new = stack_max;
10215 else
10216 split_quantity_new = quantity;
10217
10219
10220 if (new_item)
10221 {
10222 new_item.SetResultOfSplit(true);
10223 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10226 }
10227
10228 return new_item;
10229 }
10230
10231 return null;
10232 }
10233
10235 {
10237 return;
10238
10240 float split_quantity_new;
10242 if (destination_entity)
10243 {
10245 if (quantity > stackable)
10246 split_quantity_new = stackable;
10247 else
10248 split_quantity_new = quantity;
10249
10250 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10251 if (new_item)
10252 {
10253 new_item.SetResultOfSplit(true);
10254 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10256 new_item.SetQuantity(split_quantity_new);
10257 }
10258 }
10259 }
10260
10262 {
10264 return;
10265
10267 {
10268 if (ScriptInputUserData.CanStoreInputUserData())
10269 {
10270 ScriptInputUserData ctx = new ScriptInputUserData;
10275 ItemBase destination_entity =
this;
10276 ctx.
Write(destination_entity);
10280 }
10281 }
10282 else if (!
GetGame().IsMultiplayer())
10283 {
10285 }
10286 }
10287
10289 {
10291 return;
10292
10294 float split_quantity_new;
10296 if (player)
10297 {
10299 if (quantity > stackable)
10300 split_quantity_new = stackable;
10301 else
10302 split_quantity_new = quantity;
10303
10304 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10305 new_item =
ItemBase.Cast(in_hands);
10306 if (new_item)
10307 {
10308 new_item.SetResultOfSplit(true);
10309 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10311 new_item.SetQuantity(split_quantity_new);
10312 }
10313 }
10314 }
10315
10317 {
10319 return;
10320
10322 float split_quantity_new = Math.Floor(quantity * 0.5);
10323
10325
10326 if (new_item)
10327 {
10328 if (new_item.GetQuantityMax() < split_quantity_new)
10329 {
10330 split_quantity_new = new_item.GetQuantityMax();
10331 }
10332
10333 new_item.SetResultOfSplit(true);
10334 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10335
10337 {
10340 }
10341 else
10342 {
10345 }
10346 }
10347 }
10348
10350 {
10352 return;
10353
10355 float split_quantity_new = Math.Floor(quantity / 2);
10356
10357 InventoryLocation invloc = new InventoryLocation;
10359
10361 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10362
10363 if (new_item)
10364 {
10365 if (new_item.GetQuantityMax() < split_quantity_new)
10366 {
10367 split_quantity_new = new_item.GetQuantityMax();
10368 }
10370 {
10373 }
10374 else
10375 {
10378 }
10379 }
10380 }
10381
10384 {
10385 SetWeightDirty();
10387
10388 if (parent)
10389 parent.OnAttachmentQuantityChangedEx(this, delta);
10390
10392 {
10394 {
10396 }
10398 {
10399 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10401 }
10402 }
10403
10404 }
10405
10408 {
10409
10410 }
10411
10414 {
10416 }
10417
10419 {
10420 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10421
10423 {
10424 if (newLevel == GameConstants.STATE_RUINED)
10425 {
10427 EntityAI parent = GetHierarchyParent();
10428 if (parent && parent.IsFireplace())
10429 {
10430 CargoBase cargo = GetInventory().GetCargo();
10431 if (cargo)
10432 {
10434 {
10436 }
10437 }
10438 }
10439 }
10440
10442 {
10443
10445 return;
10446 }
10447
10448 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10449 {
10451 }
10452 }
10453 }
10454
10455
10457 {
10458 super.OnRightClick();
10459
10461 {
10463 {
10464 if (ScriptInputUserData.CanStoreInputUserData())
10465 {
10466 vector m4[4];
10468
10469 EntityAI root = GetHierarchyRoot();
10470
10471 InventoryLocation dst = new InventoryLocation;
10473 {
10474 if (root)
10475 {
10476 root.GetTransform(m4);
10478 }
10479 else
10480 GetInventory().GetCurrentInventoryLocation(dst);
10481 }
10482 else
10483 {
10485
10486
10487 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10488 {
10489 if (root)
10490 {
10491 root.GetTransform(m4);
10493 }
10494 else
10495 GetInventory().GetCurrentInventoryLocation(dst);
10496 }
10497 else
10498 {
10499 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10500 }
10501 }
10502
10503 ScriptInputUserData ctx = new ScriptInputUserData;
10511 }
10512 }
10513 else if (!
GetGame().IsMultiplayer())
10514 {
10516 }
10517 }
10518 }
10519
10520 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10521 {
10522
10523 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10524 return false;
10525
10526 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10527 return false;
10528
10529
10531 return false;
10532
10533
10534 Magazine mag = Magazine.Cast(this);
10535 if (mag)
10536 {
10537 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10538 return false;
10539
10540 if (stack_max_limit)
10541 {
10542 Magazine other_mag = Magazine.Cast(other_item);
10543 if (other_item)
10544 {
10545 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10546 return false;
10547 }
10548
10549 }
10550 }
10551 else
10552 {
10553
10555 return false;
10556
10558 return false;
10559 }
10560
10561 PlayerBase player = null;
10562 if (CastTo(player, GetHierarchyRootPlayer()))
10563 {
10564 if (player.GetInventory().HasAttachment(this))
10565 return false;
10566
10567 if (player.IsItemsToDelete())
10568 return false;
10569 }
10570
10571 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10572 return false;
10573
10574 int slotID;
10576 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10577 return false;
10578
10579 return true;
10580 }
10581
10583 {
10585 }
10586
10588 {
10589 return m_IsResultOfSplit;
10590 }
10591
10593 {
10594 m_IsResultOfSplit = value;
10595 }
10596
10598 {
10600 }
10601
10603 {
10604 float other_item_quantity = other_item.GetQuantity();
10605 float this_free_space;
10606
10608
10610
10611 if (other_item_quantity > this_free_space)
10612 {
10613 return this_free_space;
10614 }
10615 else
10616 {
10617 return other_item_quantity;
10618 }
10619 }
10620
10622 {
10624 }
10625
10627 {
10629 return;
10630
10631 if (!IsMagazine() && other_item)
10632 {
10634 if (quantity_used != 0)
10635 {
10636 float hp1 = GetHealth01("","");
10637 float hp2 = other_item.GetHealth01("","");
10638 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10639 hpResult = hpResult / (
GetQuantity() + quantity_used);
10640
10641 hpResult *= GetMaxHealth();
10642 Math.Round(hpResult);
10643 SetHealth("", "Health", hpResult);
10644
10646 other_item.AddQuantity(-quantity_used);
10647 }
10648 }
10650 }
10651
10653 {
10654 #ifdef SERVER
10655 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10656 GetHierarchyParent().IncreaseLifetimeUp();
10657 #endif
10658 };
10659
10661 {
10662 PlayerBase p = PlayerBase.Cast(player);
10663
10664 array<int> recipesIds = p.m_Recipes;
10665 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10666 if (moduleRecipesManager)
10667 {
10668 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10669 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10670 }
10671
10672 for (int i = 0;i < recipesIds.Count(); i++)
10673 {
10674 int key = recipesIds.Get(i);
10675 string recipeName = moduleRecipesManager.GetRecipeName(key);
10677 }
10678 }
10679
10680
10681 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10682 {
10683 super.GetDebugActions(outputList);
10684
10685
10690
10691
10695
10699
10700
10703
10704
10706 {
10709 }
10710
10712
10715
10719 }
10720
10721
10722
10723
10725 {
10726 super.OnAction(action_id, player, ctx);
10727 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10728 {
10729 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10730 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10731 PlayerBase p = PlayerBase.Cast(player);
10732 if (
EActions.RECIPES_RANGE_START < 1000)
10733 {
10734 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10735 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10736 }
10737 }
10738 #ifndef SERVER
10739 else if (action_id ==
EActions.WATCH_PLAYER)
10740 {
10741 PluginDeveloper.SetDeveloperItemClientEx(player);
10742 }
10743 #endif
10745 {
10746 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10747 {
10748 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10749 OnDebugButtonPressServer(id + 1);
10750 }
10751
10752 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10753 {
10754 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10756 }
10757
10758 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10759 {
10760 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10762 }
10763
10764 else if (action_id ==
EActions.ADD_QUANTITY)
10765 {
10766 if (IsMagazine())
10767 {
10768 Magazine mag = Magazine.Cast(this);
10769 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10770 }
10771 else
10772 {
10774 }
10775
10776 if (m_EM)
10777 {
10778 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10779 }
10780
10781 }
10782
10783 else if (action_id ==
EActions.REMOVE_QUANTITY)
10784 {
10785 if (IsMagazine())
10786 {
10787 Magazine mag2 = Magazine.Cast(this);
10788 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10789 }
10790 else
10791 {
10793 }
10794 if (m_EM)
10795 {
10796 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10797 }
10798
10799 }
10800
10801 else if (action_id ==
EActions.SET_QUANTITY_0)
10802 {
10804
10805 if (m_EM)
10806 {
10807 m_EM.SetEnergy(0);
10808 }
10809 }
10810
10811 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10812 {
10814
10815 if (m_EM)
10816 {
10817 m_EM.SetEnergy(m_EM.GetEnergyMax());
10818 }
10819 }
10820
10821 else if (action_id ==
EActions.ADD_HEALTH)
10822 {
10823 AddHealth("","",GetMaxHealth("","Health")/5);
10824 }
10825 else if (action_id ==
EActions.REMOVE_HEALTH)
10826 {
10827 AddHealth("","",-GetMaxHealth("","Health")/5);
10828 }
10829 else if (action_id ==
EActions.DESTROY_HEALTH)
10830 {
10831 SetHealth01("","",0);
10832 }
10833 else if (action_id ==
EActions.WATCH_ITEM)
10834 {
10836 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10837 #ifdef DEVELOPER
10838 SetDebugDeveloper_item(this);
10839 #endif
10840 }
10841
10842 else if (action_id ==
EActions.ADD_TEMPERATURE)
10843 {
10844 AddTemperature(20);
10845
10846 }
10847
10848 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10849 {
10850 AddTemperature(-20);
10851
10852 }
10853
10854 else if (action_id ==
EActions.FLIP_FROZEN)
10855 {
10856 SetFrozen(!GetIsFrozen());
10857
10858 }
10859
10860 else if (action_id ==
EActions.ADD_WETNESS)
10861 {
10863
10864 }
10865
10866 else if (action_id ==
EActions.REMOVE_WETNESS)
10867 {
10869
10870 }
10871
10872 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10873 {
10876
10877
10878 }
10879
10880 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10881 {
10884 }
10885
10886 else if (action_id ==
EActions.MAKE_SPECIAL)
10887 {
10888 auto debugParams = DebugSpawnParams.WithPlayer(player);
10889 OnDebugSpawnEx(debugParams);
10890 }
10891
10892 else if (action_id ==
EActions.DELETE)
10893 {
10894 Delete();
10895 }
10896
10897 }
10898
10899
10900 return false;
10901 }
10902
10903
10904
10905
10909
10912
10913
10914
10916 {
10917 return false;
10918 }
10919
10920
10922 {
10923 return true;
10924 }
10925
10926
10928 {
10929 return true;
10930 }
10931
10932
10933
10935 {
10936 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10938 }
10939
10942 {
10943 return null;
10944 }
10945
10947 {
10948 return false;
10949 }
10950
10952 {
10953 return false;
10954 }
10955
10959
10960
10962 {
10963 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10964 return module_repairing.CanRepair(this, item_repair_kit);
10965 }
10966
10967
10968 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10969 {
10970 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10971 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10972 }
10973
10974
10976 {
10977
10978
10979
10980
10981
10982
10983
10984
10985 return 1;
10986 }
10987
10988
10989
10991 {
10993 }
10994
10995
10996
10998 {
11000 }
11001
11002
11011 {
11012 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11013
11014 if (player)
11015 {
11016 player.MessageStatus(text);
11017 }
11018 }
11019
11020
11029 {
11030 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11031
11032 if (player)
11033 {
11034 player.MessageAction(text);
11035 }
11036 }
11037
11038
11047 {
11048 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11049
11050 if (player)
11051 {
11052 player.MessageFriendly(text);
11053 }
11054 }
11055
11056
11065 {
11066 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11067
11068 if (player)
11069 {
11070 player.MessageImportant(text);
11071 }
11072 }
11073
11075 {
11076 return true;
11077 }
11078
11079
11080 override bool KindOf(
string tag)
11081 {
11082 bool found = false;
11083 string item_name = this.
GetType();
11086
11087 int array_size = item_tag_array.Count();
11088 for (int i = 0; i < array_size; i++)
11089 {
11090 if (item_tag_array.Get(i) == tag)
11091 {
11092 found = true;
11093 break;
11094 }
11095 }
11096 return found;
11097 }
11098
11099
11101 {
11102
11103 super.OnRPC(sender, rpc_type,ctx);
11104
11105
11106 switch (rpc_type)
11107 {
11108 #ifndef SERVER
11109 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11110 Param2<bool, string> p = new Param2<bool, string>(false, "");
11111
11113 return;
11114
11115 bool play = p.param1;
11116 string soundSet = p.param2;
11117
11118 if (play)
11119 {
11121 {
11123 {
11125 }
11126 }
11127 else
11128 {
11130 }
11131 }
11132 else
11133 {
11135 }
11136
11137 break;
11138 #endif
11139
11140 }
11141
11143 {
11145 }
11146 }
11147
11148
11149
11150
11152 {
11153 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11154 return plugin.GetID(
name);
11155 }
11156
11158 {
11159 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11160 return plugin.GetName(id);
11161 }
11162
11165 {
11166
11167
11168 int varFlags;
11169 if (!ctx.
Read(varFlags))
11170 return;
11171
11172 if (varFlags & ItemVariableFlags.FLOAT)
11173 {
11175 }
11176 }
11177
11179 {
11180
11181 super.SerializeNumericalVars(floats_out);
11182
11183
11184
11186 {
11188 }
11189
11191 {
11193 }
11194
11196 {
11198 }
11199
11201 {
11206 }
11207
11209 {
11211 }
11212 }
11213
11215 {
11216
11217 super.DeSerializeNumericalVars(floats);
11218
11219
11220 int index = 0;
11221 int mask = Math.Round(floats.Get(index));
11222
11223 index++;
11224
11226 {
11228 {
11230 }
11231 else
11232 {
11233 float quantity = floats.Get(index);
11234 SetQuantity(quantity,
true,
false,
false,
false);
11235 }
11236 index++;
11237 }
11238
11240 {
11241 float wet = floats.Get(index);
11243 index++;
11244 }
11245
11247 {
11248 int liquidtype = Math.Round(floats.Get(index));
11250 index++;
11251 }
11252
11254 {
11256 index++;
11258 index++;
11260 index++;
11262 index++;
11263 }
11264
11266 {
11267 int cleanness = Math.Round(floats.Get(index));
11269 index++;
11270 }
11271 }
11272
11274 {
11275 super.WriteVarsToCTX(ctx);
11276
11277
11279 {
11281 }
11282
11284 {
11286 }
11287
11289 {
11291 }
11292
11294 {
11295 int r,g,b,a;
11301 }
11302
11304 {
11306 }
11307 }
11308
11310 {
11311 if (!super.ReadVarsFromCTX(ctx,version))
11312 return false;
11313
11314 int intValue;
11315 float value;
11316
11317 if (version < 140)
11318 {
11319 if (!ctx.
Read(intValue))
11320 return false;
11321
11322 m_VariablesMask = intValue;
11323 }
11324
11326 {
11327 if (!ctx.
Read(value))
11328 return false;
11329
11331 {
11333 }
11334 else
11335 {
11337 }
11338 }
11339
11340 if (version < 140)
11341 {
11343 {
11344 if (!ctx.
Read(value))
11345 return false;
11346 SetTemperatureDirect(value);
11347 }
11348 }
11349
11351 {
11352 if (!ctx.
Read(value))
11353 return false;
11355 }
11356
11358 {
11359 if (!ctx.
Read(intValue))
11360 return false;
11362 }
11363
11365 {
11366 int r,g,b,a;
11368 return false;
11370 return false;
11372 return false;
11374 return false;
11375
11377 }
11378
11380 {
11381 if (!ctx.
Read(intValue))
11382 return false;
11384 }
11385
11386 if (version >= 138 && version < 140)
11387 {
11389 {
11390 if (!ctx.
Read(intValue))
11391 return false;
11392 SetFrozen(intValue);
11393 }
11394 }
11395
11396 return true;
11397 }
11398
11399
11401 {
11404 {
11406 }
11407
11408 if (!super.OnStoreLoad(ctx, version))
11409 {
11411 return false;
11412 }
11413
11414 if (version >= 114)
11415 {
11416 bool hasQuickBarIndexSaved;
11417
11418 if (!ctx.
Read(hasQuickBarIndexSaved))
11419 {
11421 return false;
11422 }
11423
11424 if (hasQuickBarIndexSaved)
11425 {
11426 int itmQBIndex;
11427
11428
11429 if (!ctx.
Read(itmQBIndex))
11430 {
11432 return false;
11433 }
11434
11435 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11436 if (itmQBIndex != -1 && parentPlayer)
11437 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11438 }
11439 }
11440 else
11441 {
11442
11443 PlayerBase player;
11444 int itemQBIndex;
11445 if (version ==
int.
MAX)
11446 {
11447 if (!ctx.
Read(itemQBIndex))
11448 {
11450 return false;
11451 }
11452 }
11453 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11454 {
11455
11456 if (!ctx.
Read(itemQBIndex))
11457 {
11459 return false;
11460 }
11461 if (itemQBIndex != -1 && player)
11462 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11463 }
11464 }
11465
11466 if (version < 140)
11467 {
11468
11469 if (!LoadVariables(ctx, version))
11470 {
11472 return false;
11473 }
11474 }
11475
11476
11478 {
11480 return false;
11481 }
11482 if (version >= 132)
11483 {
11485 if (raib)
11486 {
11488 {
11490 return false;
11491 }
11492 }
11493 }
11494
11496 return true;
11497 }
11498
11499
11500
11502 {
11503 super.OnStoreSave(ctx);
11504
11505 PlayerBase player;
11506 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11507 {
11509
11510 int itemQBIndex = -1;
11511 itemQBIndex = player.FindQuickBarEntityIndex(this);
11512 ctx.
Write(itemQBIndex);
11513 }
11514 else
11515 {
11517 }
11518
11520
11522 if (raib)
11523 {
11525 }
11526 }
11527
11528
11530 {
11531 super.AfterStoreLoad();
11532
11534 {
11536 }
11537
11539 {
11542 }
11543 }
11544
11546 {
11547 super.EEOnAfterLoad();
11548
11550 {
11552 }
11553
11556 }
11557
11559 {
11560 return false;
11561 }
11562
11563
11564
11566 {
11568 {
11569 #ifdef PLATFORM_CONSOLE
11570
11572 {
11574 if (menu)
11575 {
11577 }
11578 }
11579 #endif
11580 }
11581
11583 {
11586 }
11587
11589 {
11590 SetWeightDirty();
11592 }
11594 {
11597 }
11598
11600 {
11603 }
11605 {
11608 }
11609
11610 super.OnVariablesSynchronized();
11611 }
11612
11613
11614
11616 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11617 {
11618 if (!IsServerCheck(allow_client))
11619 return false;
11620
11622 return false;
11623
11626
11627 if (value <= (min + 0.001))
11628 value = min;
11629
11630 if (value == min)
11631 {
11632 if (destroy_config)
11633 {
11634 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11635 if (dstr)
11636 {
11638 this.Delete();
11639 return true;
11640 }
11641 }
11642 else if (destroy_forced)
11643 {
11645 this.Delete();
11646 return true;
11647 }
11648
11650 }
11651
11654
11656 {
11658
11659 if (delta)
11661 }
11662
11664
11665 return false;
11666 }
11667
11668
11670 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11671 {
11673 }
11674
11676 {
11679 }
11680
11682 {
11685 }
11686
11689 {
11690 float value_clamped = Math.Clamp(value, 0, 1);
11692 SetQuantity(result, destroy_config, destroy_forced);
11693 }
11694
11695
11698 {
11700 }
11701
11703 {
11705 }
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11717 {
11718 int slot = -1;
11719 if (GetInventory())
11720 {
11721 InventoryLocation il = new InventoryLocation;
11722 GetInventory().GetCurrentInventoryLocation(il);
11724 }
11725
11727 }
11728
11730 {
11731 float quantity_max = 0;
11732
11734 {
11735 if (attSlotID != -1)
11736 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11737
11738 if (quantity_max <= 0)
11740 }
11741
11742 if (quantity_max <= 0)
11744
11745 return quantity_max;
11746 }
11747
11749 {
11751 }
11752
11754 {
11756 }
11757
11758
11760 {
11762 }
11763
11765 {
11767 }
11768
11770 {
11772 }
11773
11774
11776 {
11777
11778 float weightEx = GetWeightEx();
11779 float special = GetInventoryAndCargoWeight();
11780 return weightEx - special;
11781 }
11782
11783
11785 {
11787 }
11788
11790 {
11792 {
11793 #ifdef DEVELOPER
11794 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11795 {
11796 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11798 }
11799 #endif
11800
11801 return GetQuantity() * GetConfigWeightModified();
11802 }
11803 else if (HasEnergyManager())
11804 {
11805 #ifdef DEVELOPER
11806 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11807 {
11808 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11809 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11810 }
11811 #endif
11812 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11813 }
11814 else
11815 {
11816 #ifdef DEVELOPER
11817 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11818 {
11819 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11820 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11821 }
11822 #endif
11823 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11824 }
11825 }
11826
11829 {
11830 int item_count = 0;
11832
11833 if (GetInventory().GetCargo() != NULL)
11834 {
11835 item_count = GetInventory().GetCargo().GetItemCount();
11836 }
11837
11838 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11839 {
11840 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11841 if (item)
11842 item_count += item.GetNumberOfItems();
11843 }
11844 return item_count;
11845 }
11846
11849 {
11850 float weight = 0;
11851 float wetness = 1;
11852 if (include_wetness)
11855 {
11856 weight = wetness * m_ConfigWeight;
11857 }
11859 {
11860 weight = 1;
11861 }
11862 return weight;
11863 }
11864
11865
11866
11868 {
11869 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11870 {
11871 GameInventory inv = GetInventory();
11872 array<EntityAI> items = new array<EntityAI>;
11874 for (int i = 0; i < items.Count(); i++)
11875 {
11877 if (item)
11878 {
11880 }
11881 }
11882 }
11883 }
11884
11885
11886
11887
11889 {
11890 float energy = 0;
11891 if (HasEnergyManager())
11892 {
11893 energy = GetCompEM().GetEnergy();
11894 }
11895 return energy;
11896 }
11897
11898
11900 {
11901 super.OnEnergyConsumed();
11902
11904 }
11905
11907 {
11908 super.OnEnergyAdded();
11909
11911 }
11912
11913
11915 {
11916 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11917 {
11919 {
11920 float energy_0to1 = GetCompEM().GetEnergy0To1();
11922 }
11923 }
11924 }
11925
11926
11928 {
11929 return ConfigGetFloat("heatIsolation");
11930 }
11931
11933 {
11935 }
11936
11938 {
11939 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11940 if (
GetGame().ConfigIsExisting(paramPath))
11942
11943 return 0.0;
11944 }
11945
11947 {
11948 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11949 if (
GetGame().ConfigIsExisting(paramPath))
11951
11952 return 0.0;
11953 }
11954
11955 override void SetWet(
float value,
bool allow_client =
false)
11956 {
11957 if (!IsServerCheck(allow_client))
11958 return;
11959
11962
11964
11965 m_VarWet = Math.Clamp(value, min, max);
11966
11968 {
11971 }
11972 }
11973
11974 override void AddWet(
float value)
11975 {
11977 }
11978
11980 {
11982 }
11983
11985 {
11987 }
11988
11990 {
11992 }
11993
11995 {
11997 }
11998
12000 {
12002 }
12003
12004 override void OnWetChanged(
float newVal,
float oldVal)
12005 {
12008 if (newLevel != oldLevel)
12009 {
12011 }
12012 }
12013
12015 {
12016 SetWeightDirty();
12017 }
12018
12020 {
12021 return GetWetLevelInternal(
m_VarWet);
12022 }
12023
12024
12025
12027 {
12029 }
12030
12032 {
12034 }
12035
12037 {
12039 }
12040
12042 {
12044 }
12045
12046
12047
12049 {
12050 if (ConfigIsExisting("itemModelLength"))
12051 {
12052 return ConfigGetFloat("itemModelLength");
12053 }
12054 return 0;
12055 }
12056
12058 {
12059 if (ConfigIsExisting("itemAttachOffset"))
12060 {
12061 return ConfigGetFloat("itemAttachOffset");
12062 }
12063 return 0;
12064 }
12065
12066 override void SetCleanness(
int value,
bool allow_client =
false)
12067 {
12068 if (!IsServerCheck(allow_client))
12069 return;
12070
12072
12074
12077 }
12078
12080 {
12082 }
12083
12085 {
12086 return true;
12087 }
12088
12089
12090
12091
12093 {
12095 }
12096
12098 {
12100 }
12101
12102
12103
12104
12105 override void SetColor(
int r,
int g,
int b,
int a)
12106 {
12112 }
12114 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12115 {
12120 }
12121
12123 {
12125 }
12126
12129 {
12130 int r,g,b,a;
12132 r = r/255;
12133 g = g/255;
12134 b = b/255;
12135 a = a/255;
12136 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12137 }
12138
12139
12140
12141 override void SetLiquidType(
int value,
bool allow_client =
false)
12142 {
12143 if (!IsServerCheck(allow_client))
12144 return;
12145
12150 }
12151
12153 {
12154 return ConfigGetInt("varLiquidTypeInit");
12155 }
12156
12158 {
12160 }
12161
12163 {
12165 SetFrozen(false);
12166 }
12167
12170 {
12171 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12172 }
12173
12174
12177 {
12178 PlayerBase nplayer;
12179 if (PlayerBase.CastTo(nplayer, player))
12180 {
12182
12183 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12184 }
12185 }
12186
12187
12190 {
12191 PlayerBase nplayer;
12192 if (PlayerBase.CastTo(nplayer,player))
12193 {
12194
12195 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12196
12197 }
12198
12199
12200 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12201
12202
12203 if (HasEnergyManager())
12204 {
12205 GetCompEM().UpdatePlugState();
12206 }
12207 }
12208
12209
12211 {
12212 super.OnPlacementStarted(player);
12213
12215 }
12216
12217 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12218 {
12220 {
12221 m_AdminLog.OnPlacementComplete(player,
this);
12222 }
12223
12224 super.OnPlacementComplete(player, position, orientation);
12225 }
12226
12227
12228
12229
12230
12232 {
12234 {
12235 return true;
12236 }
12237 else
12238 {
12239 return false;
12240 }
12241 }
12242
12243
12245 {
12247 {
12249 }
12250 }
12251
12252
12254 {
12256 }
12257
12259 {
12261 }
12262
12263 override void InsertAgent(
int agent,
float count = 1)
12264 {
12265 if (count < 1)
12266 return;
12267
12269 }
12270
12273 {
12275 }
12276
12277
12279 {
12281 }
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12306
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12325 {
12327 return false;
12328 return true;
12329 }
12330
12332 {
12333
12335 }
12336
12337
12340 {
12341 super.CheckForRoofLimited(timeTresholdMS);
12342
12344 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12345 {
12346 m_PreviousRoofTestTime = time;
12347 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12348 }
12349 }
12350
12351
12353 {
12355 {
12356 return 0;
12357 }
12358
12359 if (GetInventory().GetAttachmentSlotsCount() != 0)
12360 {
12361 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12362 if (filter)
12363 return filter.GetProtectionLevel(type, false, system);
12364 else
12365 return 0;
12366 }
12367
12368 string subclassPath, entryName;
12369
12370 switch (type)
12371 {
12373 entryName = "biological";
12374 break;
12376 entryName = "chemical";
12377 break;
12378 default:
12379 entryName = "biological";
12380 break;
12381 }
12382
12383 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12384
12386 }
12387
12388
12389
12392 {
12393 if (!IsMagazine())
12395
12397 }
12398
12399
12400
12401
12402
12407 {
12408 return true;
12409 }
12410
12412 {
12414 }
12415
12416
12417
12418
12419
12421 {
12422 if (parent)
12423 {
12424 if (parent.IsInherited(DayZInfected))
12425 return true;
12426
12427 if (!parent.IsRuined())
12428 return true;
12429 }
12430
12431 return true;
12432 }
12433
12435 {
12436 if (!super.CanPutAsAttachment(parent))
12437 {
12438 return false;
12439 }
12440
12441 if (!IsRuined() && !parent.IsRuined())
12442 {
12443 return true;
12444 }
12445
12446 return false;
12447 }
12448
12450 {
12451
12452
12453
12454
12455 return super.CanReceiveItemIntoCargo(item);
12456 }
12457
12459 {
12460
12461
12462
12463
12464 GameInventory attachmentInv = attachment.GetInventory();
12466 {
12467 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12468 return false;
12469 }
12470
12471 InventoryLocation loc = new InventoryLocation();
12472 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12473 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12474 return false;
12475
12476 return super.CanReceiveAttachment(attachment, slotId);
12477 }
12478
12480 {
12481 if (!super.CanReleaseAttachment(attachment))
12482 return false;
12483
12484 return GetInventory().AreChildrenAccessible();
12485 }
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12508 {
12509 int id = muzzle_owner.GetMuzzleID();
12510 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12511
12512 if (WPOF_array)
12513 {
12514 for (int i = 0; i < WPOF_array.Count(); i++)
12515 {
12516 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12517
12518 if (WPOF)
12519 {
12520 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12521 }
12522 }
12523 }
12524 }
12525
12526
12528 {
12529 int id = muzzle_owner.GetMuzzleID();
12531
12532 if (WPOBE_array)
12533 {
12534 for (int i = 0; i < WPOBE_array.Count(); i++)
12535 {
12536 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12537
12538 if (WPOBE)
12539 {
12540 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12541 }
12542 }
12543 }
12544 }
12545
12546
12548 {
12549 int id = muzzle_owner.GetMuzzleID();
12550 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12551
12552 if (WPOOH_array)
12553 {
12554 for (int i = 0; i < WPOOH_array.Count(); i++)
12555 {
12556 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12557
12558 if (WPOOH)
12559 {
12560 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12561 }
12562 }
12563 }
12564 }
12565
12566
12568 {
12569 int id = muzzle_owner.GetMuzzleID();
12570 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12571
12572 if (WPOOH_array)
12573 {
12574 for (int i = 0; i < WPOOH_array.Count(); i++)
12575 {
12576 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12577
12578 if (WPOOH)
12579 {
12580 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12581 }
12582 }
12583 }
12584 }
12585
12586
12588 {
12589 int id = muzzle_owner.GetMuzzleID();
12590 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12591
12592 if (WPOOH_array)
12593 {
12594 for (int i = 0; i < WPOOH_array.Count(); i++)
12595 {
12596 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12597
12598 if (WPOOH)
12599 {
12600 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12601 }
12602 }
12603 }
12604 }
12605
12606
12607
12609 {
12611 {
12612 return true;
12613 }
12614
12615 return false;
12616 }
12617
12619 {
12621 {
12622 return true;
12623 }
12624
12625 return false;
12626 }
12627
12629 {
12631 {
12632 return true;
12633 }
12634
12635 return false;
12636 }
12637
12639 {
12640 return false;
12641 }
12642
12645 {
12646 return UATimeSpent.DEFAULT_DEPLOY;
12647 }
12648
12649
12650
12651
12653 {
12655 SetSynchDirty();
12656 }
12657
12659 {
12661 }
12662
12663
12665 {
12666 return false;
12667 }
12668
12671 {
12672 string att_type = "None";
12673
12674 if (ConfigIsExisting("soundAttType"))
12675 {
12676 att_type = ConfigGetString("soundAttType");
12677 }
12678
12680 }
12681
12683 {
12685 }
12686
12687
12688
12689
12690
12694
12696 {
12699
12701 }
12702
12703
12705 {
12707 return;
12708
12710
12713
12716
12717 SoundParameters params = new SoundParameters();
12721 }
12722
12723
12725 {
12727 return;
12728
12730 SetSynchDirty();
12731
12734 }
12735
12736
12738 {
12740 return;
12741
12743 SetSynchDirty();
12744
12747 }
12748
12750 {
12752 }
12753
12755 {
12757 }
12758
12761 {
12762 if (!
GetGame().IsDedicatedServer())
12763 {
12764 if (ConfigIsExisting("attachSoundSet"))
12765 {
12766 string cfg_path = "";
12767 string soundset = "";
12768 string type_name =
GetType();
12769
12772 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12773 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12774
12775 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12776 {
12777 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12778 {
12779 if (cfg_slot_array[i] == slot_type)
12780 {
12781 soundset = cfg_soundset_array[i];
12782 break;
12783 }
12784 }
12785 }
12786
12787 if (soundset != "")
12788 {
12789 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12791 }
12792 }
12793 }
12794 }
12795
12797 {
12798
12799 }
12800
12801 void OnApply(PlayerBase player);
12802
12804 {
12805 return 1.0;
12806 };
12807
12809 {
12811 }
12812
12814 {
12816 }
12817
12819
12821 {
12822 SetDynamicPhysicsLifeTime(0.01);
12824 }
12825
12827 {
12828 array<string> zone_names = new array<string>;
12829 GetDamageZones(zone_names);
12830 for (int i = 0; i < zone_names.Count(); i++)
12831 {
12832 SetHealthMax(zone_names.Get(i),"Health");
12833 }
12834 SetHealthMax("","Health");
12835 }
12836
12839 {
12840 float global_health = GetHealth01("","Health");
12841 array<string> zones = new array<string>;
12842 GetDamageZones(zones);
12843
12844 for (int i = 0; i < zones.Count(); i++)
12845 {
12846 SetHealth01(zones.Get(i),"Health",global_health);
12847 }
12848 }
12849
12852 {
12853 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12854 }
12855
12857 {
12858 if (!hasRootAsPlayer)
12859 {
12860 if (refParentIB)
12861 {
12862
12863 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12864 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12865
12866 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12867 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12868
12871 }
12872 else
12873 {
12874
12877 }
12878 }
12879 }
12880
12882 {
12884 {
12885 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12886 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12887 {
12888 float heatPermCoef = 1.0;
12890 while (ent)
12891 {
12892 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12893 ent = ent.GetHierarchyParent();
12894 }
12895
12896 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12897 }
12898 }
12899 }
12900
12902 {
12903
12904 EntityAI parent = GetHierarchyParent();
12905 if (!parent)
12906 {
12907 hasParent = false;
12908 hasRootAsPlayer = false;
12909 }
12910 else
12911 {
12912 hasParent = true;
12913 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12914 refParentIB =
ItemBase.Cast(parent);
12915 }
12916 }
12917
12918 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12919 {
12920
12921 }
12922
12924 {
12925
12926 return false;
12927 }
12928
12930 {
12931
12932
12933 return false;
12934 }
12935
12937 {
12938
12939 return false;
12940 }
12941
12944 {
12945 return !GetIsFrozen() &&
IsOpen();
12946 }
12947
12949 {
12950 bool hasParent = false, hasRootAsPlayer = false;
12952
12953 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12954 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12955
12956 if (wwtu || foodDecay)
12957 {
12961
12962 if (processWetness || processTemperature || processDecay)
12963 {
12965
12966 if (processWetness)
12967 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12968
12969 if (processTemperature)
12971
12972 if (processDecay)
12973 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12974 }
12975 }
12976 }
12977
12980 {
12982 }
12983
12985 {
12988
12989 return super.GetTemperatureFreezeThreshold();
12990 }
12991
12993 {
12996
12997 return super.GetTemperatureThawThreshold();
12998 }
12999
13001 {
13004
13005 return super.GetItemOverheatThreshold();
13006 }
13007
13009 {
13011 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13012
13013 return super.GetTemperatureFreezeTime();
13014 }
13015
13017 {
13019 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13020
13021 return super.GetTemperatureThawTime();
13022 }
13023
13028
13030 {
13031 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13032 }
13033
13035 {
13036 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13037 }
13038
13041 {
13043 }
13044
13046 {
13048 }
13049
13051 {
13053 }
13054
13057 {
13058 return null;
13059 }
13060
13063 {
13064 return false;
13065 }
13066
13068 {
13070 {
13073 if (!trg)
13074 {
13076 explosive = this;
13077 }
13078
13079 explosive.PairRemote(trg);
13081
13082 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13083 trg.SetPersistentPairID(persistentID);
13084 explosive.SetPersistentPairID(persistentID);
13085
13086 return true;
13087 }
13088 return false;
13089 }
13090
13093 {
13094 float ret = 1.0;
13097 ret *= GetHealth01();
13098
13099 return ret;
13100 }
13101
13102 #ifdef DEVELOPER
13103 override void SetDebugItem()
13104 {
13105 super.SetDebugItem();
13106 _itemBase = this;
13107 }
13108
13110 {
13111 string text = super.GetDebugText();
13112
13114 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13115
13116 return text;
13117 }
13118 #endif
13119
13121 {
13122 return true;
13123 }
13124
13126
13128
13130 {
13133 }
13134
13135
13143
13159}
13160
13162{
13164 if (entity)
13165 {
13166 bool is_item = entity.IsInherited(
ItemBase);
13167 if (is_item && full_quantity)
13168 {
13171 }
13172 }
13173 else
13174 {
13176 return NULL;
13177 }
13178 return entity;
13179}
13180
13182{
13183 if (item)
13184 {
13185 if (health > 0)
13186 item.SetHealth("", "", health);
13187
13188 if (item.CanHaveTemperature())
13189 {
13191 if (item.CanFreeze())
13192 item.SetFrozen(false);
13193 }
13194
13195 if (item.HasEnergyManager())
13196 {
13197 if (quantity >= 0)
13198 {
13199 item.GetCompEM().SetEnergy0To1(quantity);
13200 }
13201 else
13202 {
13204 }
13205 }
13206 else if (item.IsMagazine())
13207 {
13208 Magazine mag = Magazine.Cast(item);
13209 if (quantity >= 0)
13210 {
13211 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13212 }
13213 else
13214 {
13216 }
13217
13218 }
13219 else
13220 {
13221 if (quantity >= 0)
13222 {
13223 item.SetQuantityNormalized(quantity, false);
13224 }
13225 else
13226 {
13228 }
13229
13230 }
13231 }
13232}
13233
13234#ifdef DEVELOPER
13236#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.