8393{
8395 {
8396 return true;
8397 }
8398};
8399
8400
8401
8403{
8407
8409
8412
8413
8414
8415
8416
8425
8431
8436
8441
8462 protected bool m_IsResultOfSplit
8463
8465
8470
8471
8472
8474
8478
8479
8480
8482
8485
8486
8487
8493
8494
8502
8505
8506
8508
8509
8511
8512
8517
8518
8523
8524
8526
8527
8529 {
8534
8535 if (!
GetGame().IsDedicatedServer())
8536 {
8538 {
8540
8542 {
8544 }
8545 }
8546
8549 }
8550
8551 m_OldLocation = null;
8552
8554 {
8556 }
8557
8558 if (ConfigIsExisting("headSelectionsToHide"))
8559 {
8562 }
8563
8565 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8566 {
8568 }
8569
8571
8572 m_IsResultOfSplit = false;
8573
8575 }
8576
8578 {
8579 super.InitItemVariables();
8580
8586 m_Count = ConfigGetInt(
"count");
8587
8590
8595
8598
8603
8615
8619
8620
8623 if (ConfigIsExisting("canBeSplit"))
8624 {
8627 }
8628
8630 if (ConfigIsExisting("itemBehaviour"))
8632
8633
8636 RegisterNetSyncVariableInt("m_VarLiquidType");
8637 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8638
8639 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8640 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8641 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8642
8643 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8644 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8645 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8646 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8647
8648 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8649 RegisterNetSyncVariableBool("m_IsTakeable");
8650 RegisterNetSyncVariableBool("m_IsHologram");
8651
8654 {
8657 }
8658
8660
8662 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8664
8665 }
8666
8668 {
8670 }
8671
8673 {
8676 {
8681 }
8682 }
8683
8684 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8685 {
8687 {
8690 }
8691
8693 }
8694
8696 {
8702 }
8703
8705
8707 {
8709
8710 if (!action)
8711 {
8712 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8713 return;
8714 }
8715
8717 if (!ai)
8718 {
8720 return;
8721 }
8722
8724 if (!action_array)
8725 {
8726 action_array = new array<ActionBase_Basic>;
8728 }
8729 if (LogManager.IsActionLogEnable())
8730 {
8731 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8732 }
8733
8734 if (action_array.Find(action) != -1)
8735 {
8736 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8737 }
8738 else
8739 {
8740 action_array.Insert(action);
8741 }
8742 }
8743
8745 {
8747 ActionBase action = player.GetActionManager().GetAction(actionName);
8750
8751 if (action_array)
8752 {
8753 action_array.RemoveItem(action);
8754 }
8755 }
8756
8757
8758
8760 {
8761 ActionOverrideData overrideData = new ActionOverrideData();
8765
8767 if (!actionMap)
8768 {
8771 }
8772
8773 actionMap.Insert(this.
Type(), overrideData);
8774
8775 }
8776
8778
8780
8781
8783 {
8786
8789
8790 string config_to_search = "CfgVehicles";
8791 string muzzle_owner_config;
8792
8794 {
8795 if (IsInherited(Weapon))
8796 config_to_search = "CfgWeapons";
8797
8798 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8799
8800 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8801
8803
8804 if (config_OnFire_subclass_count > 0)
8805 {
8806 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8807
8808 for (int i = 0; i < config_OnFire_subclass_count; i++)
8809 {
8810 string particle_class = "";
8812 string config_OnFire_entry = config_OnFire_class + particle_class;
8813 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8814 WPOF_array.Insert(WPOF);
8815 }
8816
8817
8819 }
8820 }
8821
8823 {
8824 config_to_search = "CfgWeapons";
8825 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8826
8827 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8828
8830
8831 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8832 {
8833 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8834
8835 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8836 {
8837 string particle_class2 = "";
8839 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8840 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8841 WPOBE_array.Insert(WPOBE);
8842 }
8843
8844
8846 }
8847 }
8848 }
8849
8850
8852 {
8855
8857 {
8858 string config_to_search = "CfgVehicles";
8859
8860 if (IsInherited(Weapon))
8861 config_to_search = "CfgWeapons";
8862
8863 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8864 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8865
8866 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8867 {
8868
8870
8872 {
8874 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8876 return;
8877 }
8878
8881
8882
8883
8885 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8886
8887 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8888 {
8889 string particle_class = "";
8891 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8893
8894 if (entry_type == CT_CLASS)
8895 {
8896 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8897 WPOOH_array.Insert(WPOF);
8898 }
8899 }
8900
8901
8903 }
8904 }
8905 }
8906
8908 {
8910 }
8911
8913 {
8915 {
8917
8920
8923
8924 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8925 }
8926 }
8927
8929 {
8931 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8932
8934 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8935
8937 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8938
8940 {
8942 }
8943 }
8944
8946 {
8948 }
8949
8951 {
8954 else
8956
8958 {
8961 }
8962 else
8963 {
8966
8969 }
8970
8972 }
8973
8975 {
8977 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8978 }
8979
8981 {
8983 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8985 }
8986
8988 {
8990 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8991 }
8992
8994 {
8997
8998 OverheatingParticle OP = new OverheatingParticle();
9003
9005 }
9006
9008 {
9011
9012 return -1;
9013 }
9014
9016 {
9018 {
9021
9022 for (int i = count; i > 0; --i)
9023 {
9024 int id = i - 1;
9027
9030
9031 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9032 {
9033 if (p)
9034 {
9037 }
9038 }
9039 }
9040 }
9041 }
9042
9044 {
9046 {
9048 {
9049 int id = i - 1;
9051
9052 if (OP)
9053 {
9055
9056 if (p)
9057 {
9059 }
9060
9061 delete OP;
9062 }
9063 }
9064
9067 }
9068 }
9069
9072 {
9073 return 0.0;
9074 }
9075
9076
9078 {
9079 return 250;
9080 }
9081
9083 {
9084 return 0;
9085 }
9086
9089 {
9091 return true;
9092
9093 return false;
9094 }
9095
9098 {
9101
9103 {
9105 }
9106 else
9107 {
9108
9110 }
9111
9113 }
9114
9121 {
9122 return -1;
9123 }
9124
9125
9126
9127
9129 {
9131 {
9133 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9134
9135 if (r_index >= 0)
9136 {
9137 InventoryLocation r_il = new InventoryLocation;
9138 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9139
9140 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9143 {
9144 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9145 }
9147 {
9148 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9149 }
9150
9151 }
9152
9153 player.GetHumanInventory().ClearUserReservedLocation(this);
9154 }
9155
9158 }
9159
9160
9161
9162
9164 {
9165 return ItemBase.m_DebugActionsMask;
9166 }
9167
9169 {
9170 return ItemBase.m_DebugActionsMask & mask;
9171 }
9172
9174 {
9175 ItemBase.m_DebugActionsMask = mask;
9176 }
9177
9179 {
9180 ItemBase.m_DebugActionsMask |= mask;
9181 }
9182
9184 {
9185 ItemBase.m_DebugActionsMask &= ~mask;
9186 }
9187
9189 {
9191 {
9193 }
9194 else
9195 {
9197 }
9198 }
9199
9200
9202 {
9203 if (GetEconomyProfile())
9204 {
9205 float q_max = GetEconomyProfile().GetQuantityMax();
9206 if (q_max > 0)
9207 {
9208 float q_min = GetEconomyProfile().GetQuantityMin();
9209 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9210
9212 {
9213 ComponentEnergyManager comp = GetCompEM();
9215 {
9217 }
9218 }
9220 {
9222
9223 }
9224
9225 }
9226 }
9227 }
9228
9231 {
9232 EntityAI parent = GetHierarchyParent();
9233
9234 if (parent)
9235 {
9236 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9237 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9238 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9239 }
9240 }
9241
9244 {
9245 EntityAI parent = GetHierarchyParent();
9246
9247 if (parent)
9248 {
9249 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9250 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9251 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9252 }
9253 }
9254
9256 {
9257
9258
9259
9260
9262
9264 {
9265 if (ScriptInputUserData.CanStoreInputUserData())
9266 {
9267 ScriptInputUserData ctx = new ScriptInputUserData;
9273 ctx.
Write(use_stack_max);
9276
9278 {
9279 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9280 }
9281 }
9282 }
9283 else if (!
GetGame().IsMultiplayer())
9284 {
9286 }
9287 }
9288
9290 {
9292 }
9293
9295 {
9297 }
9298
9300 {
9302 }
9303
9305 {
9306
9307 return false;
9308 }
9309
9311 {
9312 return false;
9313 }
9314
9318 {
9319 return false;
9320 }
9321
9323 {
9324 return "";
9325 }
9326
9328
9330 {
9331 return false;
9332 }
9333
9335 {
9336 return true;
9337 }
9338
9339
9340
9342 {
9343 return true;
9344 }
9345
9347 {
9348 return true;
9349 }
9350
9352 {
9353 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9355 }
9356
9358 {
9360 }
9361
9363 {
9365 if (!is_being_placed)
9367 SetSynchDirty();
9368 }
9369
9370
9372
9374 {
9376 }
9377
9379 {
9381 }
9382
9384 {
9385 return 1;
9386 }
9387
9389 {
9390 return false;
9391 }
9392
9394 {
9396 SetSynchDirty();
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
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9434 {
9435 super.OnMovedInsideCargo(container);
9436
9437 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9438 }
9439
9440 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9441 {
9442 super.EEItemLocationChanged(oldLoc,newLoc);
9443
9444 PlayerBase new_player = null;
9445 PlayerBase old_player = null;
9446
9447 if (newLoc.GetParent())
9448 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9449
9450 if (oldLoc.GetParent())
9451 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9452
9454 {
9455 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9456
9457 if (r_index >= 0)
9458 {
9459 InventoryLocation r_il = new InventoryLocation;
9460 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9461
9462 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9465 {
9466 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9467 }
9469 {
9470 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9471 }
9472
9473 }
9474 }
9475
9477 {
9478 if (new_player)
9479 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9480
9481 if (new_player == old_player)
9482 {
9483
9484 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9485 {
9487 {
9488 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9489 {
9490 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9491 }
9492 }
9493 else
9494 {
9495 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9496 }
9497 }
9498
9499 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9500 {
9501 int type = oldLoc.GetType();
9503 {
9504 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9505 }
9507 {
9508 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9509 }
9510 }
9511 if (!m_OldLocation)
9512 {
9513 m_OldLocation = new InventoryLocation;
9514 }
9515 m_OldLocation.Copy(oldLoc);
9516 }
9517 else
9518 {
9519 if (m_OldLocation)
9520 {
9521 m_OldLocation.Reset();
9522 }
9523 }
9524
9526 }
9527 else
9528 {
9529 if (new_player)
9530 {
9531 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9532 if (res_index >= 0)
9533 {
9534 InventoryLocation il = new InventoryLocation;
9535 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9537 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9540 {
9541 il.
GetParent().GetOnReleaseLock().Invoke(it);
9542 }
9544 {
9546 }
9547
9548 }
9549 }
9551 {
9552
9554 }
9555
9556 if (m_OldLocation)
9557 {
9558 m_OldLocation.Reset();
9559 }
9560 }
9561 }
9562
9563 override void EOnContact(IEntity other, Contact extra)
9564 {
9566 {
9567 int liquidType = -1;
9569 if (impactSpeed > 0.0)
9570 {
9572 #ifndef SERVER
9574 #else
9576 SetSynchDirty();
9577 #endif
9579 }
9580 }
9581
9582 #ifdef SERVER
9583 if (GetCompEM() && GetCompEM().IsPlugged())
9584 {
9585 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9586 GetCompEM().UnplugThis();
9587 }
9588 #endif
9589 }
9590
9592
9594 {
9596 }
9597
9599 {
9600
9601 }
9602
9604 {
9605 super.OnItemLocationChanged(old_owner, new_owner);
9606
9607 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9608 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9609
9610 if (!relatedPlayer && playerNew)
9611 relatedPlayer = playerNew;
9612
9613 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9614 {
9616 if (actionMgr)
9617 {
9618 ActionBase currentAction = actionMgr.GetRunningAction();
9619 if (currentAction)
9621 }
9622 }
9623
9624 Man ownerPlayerOld = null;
9625 Man ownerPlayerNew = null;
9626
9627 if (old_owner)
9628 {
9629 if (old_owner.
IsMan())
9630 {
9631 ownerPlayerOld = Man.Cast(old_owner);
9632 }
9633 else
9634 {
9635 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9636 }
9637 }
9638 else
9639 {
9641 {
9643
9644 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9645 {
9646 GetCompEM().UnplugThis();
9647 }
9648 }
9649 }
9650
9651 if (new_owner)
9652 {
9653 if (new_owner.
IsMan())
9654 {
9655 ownerPlayerNew = Man.Cast(new_owner);
9656 }
9657 else
9658 {
9659 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9660 }
9661 }
9662
9663 if (ownerPlayerOld != ownerPlayerNew)
9664 {
9665 if (ownerPlayerOld)
9666 {
9667 array<EntityAI> subItemsExit = new array<EntityAI>;
9669 for (int i = 0; i < subItemsExit.Count(); i++)
9670 {
9673 }
9674 }
9675
9676 if (ownerPlayerNew)
9677 {
9678 array<EntityAI> subItemsEnter = new array<EntityAI>;
9680 for (int j = 0; j < subItemsEnter.Count(); j++)
9681 {
9684 }
9685 }
9686 }
9687 else if (ownerPlayerNew != null)
9688 {
9689 PlayerBase nplayer;
9690 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9691 {
9692 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9694 for (int k = 0; k < subItemsUpdate.Count(); k++)
9695 {
9697 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9698 }
9699 }
9700 }
9701
9702 if (old_owner)
9703 old_owner.OnChildItemRemoved(this);
9704 if (new_owner)
9705 new_owner.OnChildItemReceived(this);
9706 }
9707
9708
9710 {
9711 super.EEDelete(parent);
9712 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9713 if (player)
9714 {
9716
9717 if (player.IsAlive())
9718 {
9719 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9720 if (r_index >= 0)
9721 {
9722 InventoryLocation r_il = new InventoryLocation;
9723 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9724
9725 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9728 {
9729 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9730 }
9732 {
9733 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9734 }
9735
9736 }
9737
9738 player.RemoveQuickBarEntityShortcut(this);
9739 }
9740 }
9741 }
9742
9744 {
9745 super.EEKilled(killer);
9746
9749 {
9750 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9751 {
9752 if (IsMagazine())
9753 {
9754 if (Magazine.Cast(this).GetAmmoCount() > 0)
9755 {
9757 }
9758 }
9759 else
9760 {
9762 }
9763 }
9764 }
9765 }
9766
9768 {
9769 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9770
9771 super.OnWasAttached(parent, slot_id);
9772
9775
9777 }
9778
9780 {
9781 super.OnWasDetached(parent, slot_id);
9782
9785 }
9786
9788 {
9789 int idx;
9792
9793 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9794 if (inventory_slots.Count() < 1)
9795 {
9796 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9797 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9798 }
9799 else
9800 {
9801 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9802 }
9803
9804 idx = inventory_slots.Find(slot);
9805 if (idx < 0)
9806 return "";
9807
9808 return attach_types.Get(idx);
9809 }
9810
9812 {
9813 int idx = -1;
9814 string slot;
9815
9818
9819 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9820 if (inventory_slots.Count() < 1)
9821 {
9822 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9823 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9824 }
9825 else
9826 {
9827 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9828 if (detach_types.Count() < 1)
9829 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9830 }
9831
9832 for (int i = 0; i < inventory_slots.Count(); i++)
9833 {
9834 slot = inventory_slots.Get(i);
9835 }
9836
9837 if (slot != "")
9838 {
9839 if (detach_types.Count() == 1)
9840 idx = 0;
9841 else
9842 idx = inventory_slots.Find(slot);
9843 }
9844 if (idx < 0)
9845 return "";
9846
9847 return detach_types.Get(idx);
9848 }
9849
9851 {
9852
9854
9855
9856 float min_time = 1;
9857 float max_time = 3;
9858 float delay = Math.RandomFloat(min_time, max_time);
9859
9860 explode_timer.Run(delay, this, "DoAmmoExplosion");
9861 }
9862
9864 {
9865 Magazine magazine = Magazine.Cast(this);
9866 int pop_sounds_count = 6;
9867 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9868
9869
9870 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9871 string sound_name = pop_sounds[ sound_idx ];
9873
9874
9875 magazine.ServerAddAmmoCount(-1);
9876
9877
9878 float min_temp_to_explode = 100;
9879
9880 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9881 {
9883 }
9884 }
9885
9886
9887 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9888 {
9889 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9890
9891 const int CHANCE_DAMAGE_CARGO = 4;
9892 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9893 const int CHANCE_DAMAGE_NOTHING = 2;
9894
9896 {
9897 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9898 int chances;
9899 int rnd;
9900
9901 if (GetInventory().GetCargo())
9902 {
9903 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9904 rnd = Math.RandomInt(0,chances);
9905
9906 if (rnd < CHANCE_DAMAGE_CARGO)
9907 {
9909 }
9910 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9911 {
9913 }
9914 }
9915 else
9916 {
9917 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9918 rnd = Math.RandomInt(0,chances);
9919
9920 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9921 {
9923 }
9924 }
9925 }
9926 }
9927
9929 {
9930 if (GetInventory().GetCargo())
9931 {
9932 int item_count = GetInventory().GetCargo().GetItemCount();
9933 if (item_count > 0)
9934 {
9935 int random_pick = Math.RandomInt(0, item_count);
9937 if (!item.IsExplosive())
9938 {
9939 item.AddHealth("","",damage);
9940 return true;
9941 }
9942 }
9943 }
9944 return false;
9945 }
9946
9948 {
9949 int attachment_count = GetInventory().AttachmentCount();
9950 if (attachment_count > 0)
9951 {
9952 int random_pick = Math.RandomInt(0, attachment_count);
9953 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9954 if (!attachment.IsExplosive())
9955 {
9956 attachment.AddHealth("","",damage);
9957 return true;
9958 }
9959 }
9960 return false;
9961 }
9962
9964 {
9966 }
9967
9969 {
9971 return GetInventory().CanRemoveEntity();
9972
9973 return false;
9974 }
9975
9977 {
9979 return;
9980
9982 {
9983 if (ScriptInputUserData.CanStoreInputUserData())
9984 {
9985 ScriptInputUserData ctx = new ScriptInputUserData;
9990 ctx.
Write(destination_entity);
9994 }
9995 }
9996 else if (!
GetGame().IsMultiplayer())
9997 {
9999 }
10000 }
10001
10003 {
10005 return;
10006
10007 float split_quantity_new;
10011 InventoryLocation loc = new InventoryLocation;
10012
10013 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10014 {
10016 split_quantity_new = stack_max;
10017 else
10019
10020 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10021 if (new_item)
10022 {
10023 new_item.SetResultOfSplit(true);
10024 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10026 new_item.SetQuantity(split_quantity_new);
10027 }
10028 }
10029 else if (destination_entity && slot_id == -1)
10030 {
10031 if (quantity > stack_max)
10032 split_quantity_new = stack_max;
10033 else
10034 split_quantity_new = quantity;
10035
10037 {
10040 }
10041
10042 if (new_item)
10043 {
10044 new_item.SetResultOfSplit(true);
10045 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10047 new_item.SetQuantity(split_quantity_new);
10048 }
10049 }
10050 else
10051 {
10052 if (stack_max != 0)
10053 {
10055 {
10057 }
10058
10059 if (split_quantity_new == 0)
10060 {
10061 if (!
GetGame().IsMultiplayer())
10062 player.PhysicalPredictiveDropItem(this);
10063 else
10064 player.ServerDropEntity(this);
10065 return;
10066 }
10067
10069
10070 if (new_item)
10071 {
10072 new_item.SetResultOfSplit(true);
10073 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10075 new_item.SetQuantity(stack_max);
10076 new_item.PlaceOnSurface();
10077 }
10078 }
10079 }
10080 }
10081
10083 {
10085 return;
10086
10087 float split_quantity_new;
10091 InventoryLocation loc = new InventoryLocation;
10092
10093 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10094 {
10096 split_quantity_new = stack_max;
10097 else
10099
10100 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10101 if (new_item)
10102 {
10103 new_item.SetResultOfSplit(true);
10104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10106 new_item.SetQuantity(split_quantity_new);
10107 }
10108 }
10109 else if (destination_entity && slot_id == -1)
10110 {
10111 if (quantity > stack_max)
10112 split_quantity_new = stack_max;
10113 else
10114 split_quantity_new = quantity;
10115
10117 {
10120 }
10121
10122 if (new_item)
10123 {
10124 new_item.SetResultOfSplit(true);
10125 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10127 new_item.SetQuantity(split_quantity_new);
10128 }
10129 }
10130 else
10131 {
10132 if (stack_max != 0)
10133 {
10135 {
10137 }
10138
10140
10141 if (new_item)
10142 {
10143 new_item.SetResultOfSplit(true);
10144 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10146 new_item.SetQuantity(stack_max);
10147 new_item.PlaceOnSurface();
10148 }
10149 }
10150 }
10151 }
10152
10154 {
10156 return;
10157
10159 {
10160 if (ScriptInputUserData.CanStoreInputUserData())
10161 {
10162 ScriptInputUserData ctx = new ScriptInputUserData;
10167 dst.WriteToContext(ctx);
10169 }
10170 }
10171 else if (!
GetGame().IsMultiplayer())
10172 {
10174 }
10175 }
10176
10178 {
10180 return;
10181
10183 {
10184 if (ScriptInputUserData.CanStoreInputUserData())
10185 {
10186 ScriptInputUserData ctx = new ScriptInputUserData;
10191 ctx.
Write(destination_entity);
10197 }
10198 }
10199 else if (!
GetGame().IsMultiplayer())
10200 {
10202 }
10203 }
10204
10206 {
10208 }
10209
10211 {
10213 return this;
10214
10216 float split_quantity_new;
10218 if (dst.IsValid())
10219 {
10220 int slot_id = dst.GetSlot();
10222
10223 if (quantity > stack_max)
10224 split_quantity_new = stack_max;
10225 else
10226 split_quantity_new = quantity;
10227
10229
10230 if (new_item)
10231 {
10232 new_item.SetResultOfSplit(true);
10233 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10236 }
10237
10238 return new_item;
10239 }
10240
10241 return null;
10242 }
10243
10245 {
10247 return;
10248
10250 float split_quantity_new;
10252 if (destination_entity)
10253 {
10255 if (quantity > stackable)
10256 split_quantity_new = stackable;
10257 else
10258 split_quantity_new = quantity;
10259
10260 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10261 if (new_item)
10262 {
10263 new_item.SetResultOfSplit(true);
10264 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10266 new_item.SetQuantity(split_quantity_new);
10267 }
10268 }
10269 }
10270
10272 {
10274 return;
10275
10277 {
10278 if (ScriptInputUserData.CanStoreInputUserData())
10279 {
10280 ScriptInputUserData ctx = new ScriptInputUserData;
10285 ItemBase destination_entity =
this;
10286 ctx.
Write(destination_entity);
10290 }
10291 }
10292 else if (!
GetGame().IsMultiplayer())
10293 {
10295 }
10296 }
10297
10299 {
10301 return;
10302
10304 float split_quantity_new;
10306 if (player)
10307 {
10309 if (quantity > stackable)
10310 split_quantity_new = stackable;
10311 else
10312 split_quantity_new = quantity;
10313
10314 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10315 new_item =
ItemBase.Cast(in_hands);
10316 if (new_item)
10317 {
10318 new_item.SetResultOfSplit(true);
10319 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10321 new_item.SetQuantity(split_quantity_new);
10322 }
10323 }
10324 }
10325
10327 {
10329 return;
10330
10332 float split_quantity_new = Math.Floor(quantity * 0.5);
10333
10335
10336 if (new_item)
10337 {
10338 if (new_item.GetQuantityMax() < split_quantity_new)
10339 {
10340 split_quantity_new = new_item.GetQuantityMax();
10341 }
10342
10343 new_item.SetResultOfSplit(true);
10344 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10345
10347 {
10350 }
10351 else
10352 {
10355 }
10356 }
10357 }
10358
10360 {
10362 return;
10363
10365 float split_quantity_new = Math.Floor(quantity / 2);
10366
10367 InventoryLocation invloc = new InventoryLocation;
10369
10371 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10372
10373 if (new_item)
10374 {
10375 if (new_item.GetQuantityMax() < split_quantity_new)
10376 {
10377 split_quantity_new = new_item.GetQuantityMax();
10378 }
10380 {
10383 }
10384 else
10385 {
10388 }
10389 }
10390 }
10391
10394 {
10395 SetWeightDirty();
10397
10398 if (parent)
10399 parent.OnAttachmentQuantityChangedEx(this, delta);
10400
10402 {
10404 {
10406 }
10408 {
10409 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10411 }
10412 }
10413
10414 }
10415
10418 {
10419
10420 }
10421
10424 {
10426 }
10427
10429 {
10430 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10431
10433 {
10434 if (newLevel == GameConstants.STATE_RUINED)
10435 {
10437 EntityAI parent = GetHierarchyParent();
10438 if (parent && parent.IsFireplace())
10439 {
10440 CargoBase cargo = GetInventory().GetCargo();
10441 if (cargo)
10442 {
10444 {
10446 }
10447 }
10448 }
10449 }
10450
10452 {
10453
10455 return;
10456 }
10457
10458 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10459 {
10461 }
10462 }
10463 }
10464
10465
10467 {
10468 super.OnRightClick();
10469
10471 {
10473 {
10474 if (ScriptInputUserData.CanStoreInputUserData())
10475 {
10476 vector m4[4];
10478
10479 EntityAI root = GetHierarchyRoot();
10480
10481 InventoryLocation dst = new InventoryLocation;
10483 {
10484 if (root)
10485 {
10486 root.GetTransform(m4);
10488 }
10489 else
10490 GetInventory().GetCurrentInventoryLocation(dst);
10491 }
10492 else
10493 {
10495
10496
10497 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10498 {
10499 if (root)
10500 {
10501 root.GetTransform(m4);
10503 }
10504 else
10505 GetInventory().GetCurrentInventoryLocation(dst);
10506 }
10507 else
10508 {
10509 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10510 }
10511 }
10512
10513 ScriptInputUserData ctx = new ScriptInputUserData;
10521 }
10522 }
10523 else if (!
GetGame().IsMultiplayer())
10524 {
10526 }
10527 }
10528 }
10529
10530 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10531 {
10532
10533 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10534 return false;
10535
10536 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10537 return false;
10538
10539
10541 return false;
10542
10543
10544 Magazine mag = Magazine.Cast(this);
10545 if (mag)
10546 {
10547 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10548 return false;
10549
10550 if (stack_max_limit)
10551 {
10552 Magazine other_mag = Magazine.Cast(other_item);
10553 if (other_item)
10554 {
10555 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10556 return false;
10557 }
10558
10559 }
10560 }
10561 else
10562 {
10563
10565 return false;
10566
10568 return false;
10569 }
10570
10571 PlayerBase player = null;
10572 if (CastTo(player, GetHierarchyRootPlayer()))
10573 {
10574 if (player.GetInventory().HasAttachment(this))
10575 return false;
10576
10577 if (player.IsItemsToDelete())
10578 return false;
10579 }
10580
10581 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10582 return false;
10583
10584 int slotID;
10586 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10587 return false;
10588
10589 return true;
10590 }
10591
10593 {
10595 }
10596
10598 {
10599 return m_IsResultOfSplit;
10600 }
10601
10603 {
10604 m_IsResultOfSplit = value;
10605 }
10606
10608 {
10610 }
10611
10613 {
10614 float other_item_quantity = other_item.GetQuantity();
10615 float this_free_space;
10616
10618
10620
10621 if (other_item_quantity > this_free_space)
10622 {
10623 return this_free_space;
10624 }
10625 else
10626 {
10627 return other_item_quantity;
10628 }
10629 }
10630
10632 {
10634 }
10635
10637 {
10639 return;
10640
10641 if (!IsMagazine() && other_item)
10642 {
10644 if (quantity_used != 0)
10645 {
10646 float hp1 = GetHealth01("","");
10647 float hp2 = other_item.GetHealth01("","");
10648 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10649 hpResult = hpResult / (
GetQuantity() + quantity_used);
10650
10651 hpResult *= GetMaxHealth();
10652 Math.Round(hpResult);
10653 SetHealth("", "Health", hpResult);
10654
10656 other_item.AddQuantity(-quantity_used);
10657 }
10658 }
10660 }
10661
10663 {
10664 #ifdef SERVER
10665 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10666 GetHierarchyParent().IncreaseLifetimeUp();
10667 #endif
10668 };
10669
10671 {
10672 PlayerBase p = PlayerBase.Cast(player);
10673
10674 array<int> recipesIds = p.m_Recipes;
10675 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10676 if (moduleRecipesManager)
10677 {
10678 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10679 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10680 }
10681
10682 for (int i = 0;i < recipesIds.Count(); i++)
10683 {
10684 int key = recipesIds.Get(i);
10685 string recipeName = moduleRecipesManager.GetRecipeName(key);
10687 }
10688 }
10689
10690
10691 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10692 {
10693 super.GetDebugActions(outputList);
10694
10695
10700
10701
10705
10709
10710
10713
10714
10716 {
10719 }
10720
10722
10725
10729 }
10730
10731
10732
10733
10735 {
10736 super.OnAction(action_id, player, ctx);
10737 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10738 {
10739 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10740 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10741 PlayerBase p = PlayerBase.Cast(player);
10742 if (
EActions.RECIPES_RANGE_START < 1000)
10743 {
10744 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10745 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10746 }
10747 }
10748 #ifndef SERVER
10749 else if (action_id ==
EActions.WATCH_PLAYER)
10750 {
10751 PluginDeveloper.SetDeveloperItemClientEx(player);
10752 }
10753 #endif
10755 {
10756 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10757 {
10758 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10759 OnDebugButtonPressServer(id + 1);
10760 }
10761
10762 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10763 {
10764 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10766 }
10767
10768 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10769 {
10770 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10772 }
10773
10774 else if (action_id ==
EActions.ADD_QUANTITY)
10775 {
10776 if (IsMagazine())
10777 {
10778 Magazine mag = Magazine.Cast(this);
10779 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10780 }
10781 else
10782 {
10784 }
10785
10786 if (m_EM)
10787 {
10788 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10789 }
10790
10791 }
10792
10793 else if (action_id ==
EActions.REMOVE_QUANTITY)
10794 {
10795 if (IsMagazine())
10796 {
10797 Magazine mag2 = Magazine.Cast(this);
10798 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10799 }
10800 else
10801 {
10803 }
10804 if (m_EM)
10805 {
10806 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10807 }
10808
10809 }
10810
10811 else if (action_id ==
EActions.SET_QUANTITY_0)
10812 {
10814
10815 if (m_EM)
10816 {
10817 m_EM.SetEnergy(0);
10818 }
10819 }
10820
10821 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10822 {
10824
10825 if (m_EM)
10826 {
10827 m_EM.SetEnergy(m_EM.GetEnergyMax());
10828 }
10829 }
10830
10831 else if (action_id ==
EActions.ADD_HEALTH)
10832 {
10833 AddHealth("","",GetMaxHealth("","Health")/5);
10834 }
10835 else if (action_id ==
EActions.REMOVE_HEALTH)
10836 {
10837 AddHealth("","",-GetMaxHealth("","Health")/5);
10838 }
10839 else if (action_id ==
EActions.DESTROY_HEALTH)
10840 {
10841 SetHealth01("","",0);
10842 }
10843 else if (action_id ==
EActions.WATCH_ITEM)
10844 {
10846 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10847 #ifdef DEVELOPER
10848 SetDebugDeveloper_item(this);
10849 #endif
10850 }
10851
10852 else if (action_id ==
EActions.ADD_TEMPERATURE)
10853 {
10854 AddTemperature(20);
10855
10856 }
10857
10858 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10859 {
10860 AddTemperature(-20);
10861
10862 }
10863
10864 else if (action_id ==
EActions.FLIP_FROZEN)
10865 {
10866 SetFrozen(!GetIsFrozen());
10867
10868 }
10869
10870 else if (action_id ==
EActions.ADD_WETNESS)
10871 {
10873
10874 }
10875
10876 else if (action_id ==
EActions.REMOVE_WETNESS)
10877 {
10879
10880 }
10881
10882 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10883 {
10886
10887
10888 }
10889
10890 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10891 {
10894 }
10895
10896 else if (action_id ==
EActions.MAKE_SPECIAL)
10897 {
10898 auto debugParams = DebugSpawnParams.WithPlayer(player);
10899 OnDebugSpawnEx(debugParams);
10900 }
10901
10902 else if (action_id ==
EActions.DELETE)
10903 {
10904 Delete();
10905 }
10906
10907 }
10908
10909
10910 return false;
10911 }
10912
10913
10914
10915
10919
10922
10923
10924
10926 {
10927 return false;
10928 }
10929
10930
10932 {
10933 return true;
10934 }
10935
10936
10938 {
10939 return true;
10940 }
10941
10942
10943
10945 {
10946 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10948 }
10949
10952 {
10953 return null;
10954 }
10955
10957 {
10958 return false;
10959 }
10960
10962 {
10963 return false;
10964 }
10965
10969
10970
10972 {
10973 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10974 return module_repairing.CanRepair(this, item_repair_kit);
10975 }
10976
10977
10978 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10979 {
10980 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10981 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10982 }
10983
10984
10986 {
10987
10988
10989
10990
10991
10992
10993
10994
10995 return 1;
10996 }
10997
10998
10999
11001 {
11003 }
11004
11005
11006
11008 {
11010 }
11011
11012
11021 {
11022 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11023
11024 if (player)
11025 {
11026 player.MessageStatus(text);
11027 }
11028 }
11029
11030
11039 {
11040 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11041
11042 if (player)
11043 {
11044 player.MessageAction(text);
11045 }
11046 }
11047
11048
11057 {
11058 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11059
11060 if (player)
11061 {
11062 player.MessageFriendly(text);
11063 }
11064 }
11065
11066
11075 {
11076 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11077
11078 if (player)
11079 {
11080 player.MessageImportant(text);
11081 }
11082 }
11083
11085 {
11086 return true;
11087 }
11088
11089
11090 override bool KindOf(
string tag)
11091 {
11092 bool found = false;
11093 string item_name = this.
GetType();
11096
11097 int array_size = item_tag_array.Count();
11098 for (int i = 0; i < array_size; i++)
11099 {
11100 if (item_tag_array.Get(i) == tag)
11101 {
11102 found = true;
11103 break;
11104 }
11105 }
11106 return found;
11107 }
11108
11109
11111 {
11112
11113 super.OnRPC(sender, rpc_type,ctx);
11114
11115
11116 switch (rpc_type)
11117 {
11118 #ifndef SERVER
11119 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11120 Param2<bool, string> p = new Param2<bool, string>(false, "");
11121
11123 return;
11124
11125 bool play = p.param1;
11126 string soundSet = p.param2;
11127
11128 if (play)
11129 {
11131 {
11133 {
11135 }
11136 }
11137 else
11138 {
11140 }
11141 }
11142 else
11143 {
11145 }
11146
11147 break;
11148 #endif
11149
11150 }
11151
11153 {
11155 }
11156 }
11157
11158
11159
11160
11162 {
11163 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11164 return plugin.GetID(
name);
11165 }
11166
11168 {
11169 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11170 return plugin.GetName(id);
11171 }
11172
11175 {
11176
11177
11178 int varFlags;
11179 if (!ctx.
Read(varFlags))
11180 return;
11181
11182 if (varFlags & ItemVariableFlags.FLOAT)
11183 {
11185 }
11186 }
11187
11189 {
11190
11191 super.SerializeNumericalVars(floats_out);
11192
11193
11194
11196 {
11198 }
11199
11201 {
11203 }
11204
11206 {
11208 }
11209
11211 {
11216 }
11217
11219 {
11221 }
11222 }
11223
11225 {
11226
11227 super.DeSerializeNumericalVars(floats);
11228
11229
11230 int index = 0;
11231 int mask = Math.Round(floats.Get(index));
11232
11233 index++;
11234
11236 {
11238 {
11240 }
11241 else
11242 {
11243 float quantity = floats.Get(index);
11244 SetQuantity(quantity,
true,
false,
false,
false);
11245 }
11246 index++;
11247 }
11248
11250 {
11251 float wet = floats.Get(index);
11253 index++;
11254 }
11255
11257 {
11258 int liquidtype = Math.Round(floats.Get(index));
11260 index++;
11261 }
11262
11264 {
11266 index++;
11268 index++;
11270 index++;
11272 index++;
11273 }
11274
11276 {
11277 int cleanness = Math.Round(floats.Get(index));
11279 index++;
11280 }
11281 }
11282
11284 {
11285 super.WriteVarsToCTX(ctx);
11286
11287
11289 {
11291 }
11292
11294 {
11296 }
11297
11299 {
11301 }
11302
11304 {
11305 int r,g,b,a;
11311 }
11312
11314 {
11316 }
11317 }
11318
11320 {
11321 if (!super.ReadVarsFromCTX(ctx,version))
11322 return false;
11323
11324 int intValue;
11325 float value;
11326
11327 if (version < 140)
11328 {
11329 if (!ctx.
Read(intValue))
11330 return false;
11331
11332 m_VariablesMask = intValue;
11333 }
11334
11336 {
11337 if (!ctx.
Read(value))
11338 return false;
11339
11341 {
11343 }
11344 else
11345 {
11347 }
11348 }
11349
11350 if (version < 140)
11351 {
11353 {
11354 if (!ctx.
Read(value))
11355 return false;
11356 SetTemperatureDirect(value);
11357 }
11358 }
11359
11361 {
11362 if (!ctx.
Read(value))
11363 return false;
11365 }
11366
11368 {
11369 if (!ctx.
Read(intValue))
11370 return false;
11372 }
11373
11375 {
11376 int r,g,b,a;
11378 return false;
11380 return false;
11382 return false;
11384 return false;
11385
11387 }
11388
11390 {
11391 if (!ctx.
Read(intValue))
11392 return false;
11394 }
11395
11396 if (version >= 138 && version < 140)
11397 {
11399 {
11400 if (!ctx.
Read(intValue))
11401 return false;
11402 SetFrozen(intValue);
11403 }
11404 }
11405
11406 return true;
11407 }
11408
11409
11411 {
11414 {
11416 }
11417
11418 if (!super.OnStoreLoad(ctx, version))
11419 {
11421 return false;
11422 }
11423
11424 if (version >= 114)
11425 {
11426 bool hasQuickBarIndexSaved;
11427
11428 if (!ctx.
Read(hasQuickBarIndexSaved))
11429 {
11431 return false;
11432 }
11433
11434 if (hasQuickBarIndexSaved)
11435 {
11436 int itmQBIndex;
11437
11438
11439 if (!ctx.
Read(itmQBIndex))
11440 {
11442 return false;
11443 }
11444
11445 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11446 if (itmQBIndex != -1 && parentPlayer)
11447 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11448 }
11449 }
11450 else
11451 {
11452
11453 PlayerBase player;
11454 int itemQBIndex;
11455 if (version ==
int.
MAX)
11456 {
11457 if (!ctx.
Read(itemQBIndex))
11458 {
11460 return false;
11461 }
11462 }
11463 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11464 {
11465
11466 if (!ctx.
Read(itemQBIndex))
11467 {
11469 return false;
11470 }
11471 if (itemQBIndex != -1 && player)
11472 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11473 }
11474 }
11475
11476 if (version < 140)
11477 {
11478
11479 if (!LoadVariables(ctx, version))
11480 {
11482 return false;
11483 }
11484 }
11485
11486
11488 {
11490 return false;
11491 }
11492 if (version >= 132)
11493 {
11495 if (raib)
11496 {
11498 {
11500 return false;
11501 }
11502 }
11503 }
11504
11506 return true;
11507 }
11508
11509
11510
11512 {
11513 super.OnStoreSave(ctx);
11514
11515 PlayerBase player;
11516 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11517 {
11519
11520 int itemQBIndex = -1;
11521 itemQBIndex = player.FindQuickBarEntityIndex(this);
11522 ctx.
Write(itemQBIndex);
11523 }
11524 else
11525 {
11527 }
11528
11530
11532 if (raib)
11533 {
11535 }
11536 }
11537
11538
11540 {
11541 super.AfterStoreLoad();
11542
11544 {
11546 }
11547
11549 {
11552 }
11553 }
11554
11556 {
11557 super.EEOnAfterLoad();
11558
11560 {
11562 }
11563
11566 }
11567
11569 {
11570 return false;
11571 }
11572
11573
11574
11576 {
11578 {
11579 #ifdef PLATFORM_CONSOLE
11580
11582 {
11584 if (menu)
11585 {
11587 }
11588 }
11589 #endif
11590 }
11591
11593 {
11596 }
11597
11599 {
11600 SetWeightDirty();
11602 }
11604 {
11607 }
11608
11610 {
11613 }
11615 {
11618 }
11619
11620 super.OnVariablesSynchronized();
11621 }
11622
11623
11624
11626 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11627 {
11628 if (!IsServerCheck(allow_client))
11629 return false;
11630
11632 return false;
11633
11636
11637 if (value <= (min + 0.001))
11638 value = min;
11639
11640 if (value == min)
11641 {
11642 if (destroy_config)
11643 {
11644 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11645 if (dstr)
11646 {
11648 this.Delete();
11649 return true;
11650 }
11651 }
11652 else if (destroy_forced)
11653 {
11655 this.Delete();
11656 return true;
11657 }
11658
11660 }
11661
11664
11666 {
11668
11669 if (delta)
11671 }
11672
11674
11675 return false;
11676 }
11677
11678
11680 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11681 {
11683 }
11684
11686 {
11689 }
11690
11692 {
11695 }
11696
11699 {
11700 float value_clamped = Math.Clamp(value, 0, 1);
11702 SetQuantity(result, destroy_config, destroy_forced);
11703 }
11704
11705
11708 {
11710 }
11711
11713 {
11715 }
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11727 {
11728 int slot = -1;
11729 if (GetInventory())
11730 {
11731 InventoryLocation il = new InventoryLocation;
11732 GetInventory().GetCurrentInventoryLocation(il);
11734 }
11735
11737 }
11738
11740 {
11741 float quantity_max = 0;
11742
11744 {
11745 if (attSlotID != -1)
11746 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11747
11748 if (quantity_max <= 0)
11750 }
11751
11752 if (quantity_max <= 0)
11754
11755 return quantity_max;
11756 }
11757
11759 {
11761 }
11762
11764 {
11766 }
11767
11768
11770 {
11772 }
11773
11775 {
11777 }
11778
11780 {
11782 }
11783
11784
11786 {
11787
11788 float weightEx = GetWeightEx();
11789 float special = GetInventoryAndCargoWeight();
11790 return weightEx - special;
11791 }
11792
11793
11795 {
11797 }
11798
11800 {
11802 {
11803 #ifdef DEVELOPER
11804 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11805 {
11806 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11808 }
11809 #endif
11810
11811 return GetQuantity() * GetConfigWeightModified();
11812 }
11813 else if (HasEnergyManager())
11814 {
11815 #ifdef DEVELOPER
11816 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11817 {
11818 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11819 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11820 }
11821 #endif
11822 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11823 }
11824 else
11825 {
11826 #ifdef DEVELOPER
11827 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11828 {
11829 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11830 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11831 }
11832 #endif
11833 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11834 }
11835 }
11836
11839 {
11840 int item_count = 0;
11842
11843 if (GetInventory().GetCargo() != NULL)
11844 {
11845 item_count = GetInventory().GetCargo().GetItemCount();
11846 }
11847
11848 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11849 {
11850 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11851 if (item)
11852 item_count += item.GetNumberOfItems();
11853 }
11854 return item_count;
11855 }
11856
11859 {
11860 float weight = 0;
11861 float wetness = 1;
11862 if (include_wetness)
11865 {
11866 weight = wetness * m_ConfigWeight;
11867 }
11869 {
11870 weight = 1;
11871 }
11872 return weight;
11873 }
11874
11875
11876
11878 {
11879 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11880 {
11881 GameInventory inv = GetInventory();
11882 array<EntityAI> items = new array<EntityAI>;
11884 for (int i = 0; i < items.Count(); i++)
11885 {
11887 if (item)
11888 {
11890 }
11891 }
11892 }
11893 }
11894
11895
11896
11897
11899 {
11900 float energy = 0;
11901 if (HasEnergyManager())
11902 {
11903 energy = GetCompEM().GetEnergy();
11904 }
11905 return energy;
11906 }
11907
11908
11910 {
11911 super.OnEnergyConsumed();
11912
11914 }
11915
11917 {
11918 super.OnEnergyAdded();
11919
11921 }
11922
11923
11925 {
11926 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11927 {
11929 {
11930 float energy_0to1 = GetCompEM().GetEnergy0To1();
11932 }
11933 }
11934 }
11935
11936
11938 {
11939 return ConfigGetFloat("heatIsolation");
11940 }
11941
11943 {
11945 }
11946
11948 {
11949 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11950 if (
GetGame().ConfigIsExisting(paramPath))
11952
11953 return 0.0;
11954 }
11955
11957 {
11958 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11959 if (
GetGame().ConfigIsExisting(paramPath))
11961
11962 return 0.0;
11963 }
11964
11965 override void SetWet(
float value,
bool allow_client =
false)
11966 {
11967 if (!IsServerCheck(allow_client))
11968 return;
11969
11972
11974
11975 m_VarWet = Math.Clamp(value, min, max);
11976
11978 {
11981 }
11982 }
11983
11984 override void AddWet(
float value)
11985 {
11987 }
11988
11990 {
11992 }
11993
11995 {
11997 }
11998
12000 {
12002 }
12003
12005 {
12007 }
12008
12010 {
12012 }
12013
12014 override void OnWetChanged(
float newVal,
float oldVal)
12015 {
12018 if (newLevel != oldLevel)
12019 {
12021 }
12022 }
12023
12025 {
12026 SetWeightDirty();
12027 }
12028
12030 {
12031 return GetWetLevelInternal(
m_VarWet);
12032 }
12033
12034
12035
12037 {
12039 }
12040
12042 {
12044 }
12045
12047 {
12049 }
12050
12052 {
12054 }
12055
12056
12057
12059 {
12060 if (ConfigIsExisting("itemModelLength"))
12061 {
12062 return ConfigGetFloat("itemModelLength");
12063 }
12064 return 0;
12065 }
12066
12068 {
12069 if (ConfigIsExisting("itemAttachOffset"))
12070 {
12071 return ConfigGetFloat("itemAttachOffset");
12072 }
12073 return 0;
12074 }
12075
12076 override void SetCleanness(
int value,
bool allow_client =
false)
12077 {
12078 if (!IsServerCheck(allow_client))
12079 return;
12080
12082
12084
12087 }
12088
12090 {
12092 }
12093
12095 {
12096 return true;
12097 }
12098
12099
12100
12101
12103 {
12105 }
12106
12108 {
12110 }
12111
12112
12113
12114
12115 override void SetColor(
int r,
int g,
int b,
int a)
12116 {
12122 }
12124 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12125 {
12130 }
12131
12133 {
12135 }
12136
12139 {
12140 int r,g,b,a;
12142 r = r/255;
12143 g = g/255;
12144 b = b/255;
12145 a = a/255;
12146 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12147 }
12148
12149
12150
12151 override void SetLiquidType(
int value,
bool allow_client =
false)
12152 {
12153 if (!IsServerCheck(allow_client))
12154 return;
12155
12160 }
12161
12163 {
12164 return ConfigGetInt("varLiquidTypeInit");
12165 }
12166
12168 {
12170 }
12171
12173 {
12175 SetFrozen(false);
12176 }
12177
12180 {
12181 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12182 }
12183
12184
12187 {
12188 PlayerBase nplayer;
12189 if (PlayerBase.CastTo(nplayer, player))
12190 {
12192
12193 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12194 }
12195 }
12196
12197
12200 {
12201 PlayerBase nplayer;
12202 if (PlayerBase.CastTo(nplayer,player))
12203 {
12204
12205 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12206
12207 }
12208
12209
12210 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12211
12212
12213 if (HasEnergyManager())
12214 {
12215 GetCompEM().UpdatePlugState();
12216 }
12217 }
12218
12219
12221 {
12222 super.OnPlacementStarted(player);
12223
12225 }
12226
12227 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12228 {
12230 {
12231 m_AdminLog.OnPlacementComplete(player,
this);
12232 }
12233
12234 super.OnPlacementComplete(player, position, orientation);
12235 }
12236
12237
12238
12239
12240
12242 {
12244 {
12245 return true;
12246 }
12247 else
12248 {
12249 return false;
12250 }
12251 }
12252
12253
12255 {
12257 {
12259 }
12260 }
12261
12262
12264 {
12266 }
12267
12269 {
12271 }
12272
12273 override void InsertAgent(
int agent,
float count = 1)
12274 {
12275 if (count < 1)
12276 return;
12277
12279 }
12280
12283 {
12285 }
12286
12287
12289 {
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
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12335 {
12337 return false;
12338 return true;
12339 }
12340
12342 {
12343
12345 }
12346
12347
12350 {
12351 super.CheckForRoofLimited(timeTresholdMS);
12352
12354 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12355 {
12356 m_PreviousRoofTestTime = time;
12357 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12358 }
12359 }
12360
12361
12363 {
12365 {
12366 return 0;
12367 }
12368
12369 if (GetInventory().GetAttachmentSlotsCount() != 0)
12370 {
12371 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12372 if (filter)
12373 return filter.GetProtectionLevel(type, false, system);
12374 else
12375 return 0;
12376 }
12377
12378 string subclassPath, entryName;
12379
12380 switch (type)
12381 {
12383 entryName = "biological";
12384 break;
12386 entryName = "chemical";
12387 break;
12388 default:
12389 entryName = "biological";
12390 break;
12391 }
12392
12393 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12394
12396 }
12397
12398
12399
12402 {
12403 if (!IsMagazine())
12405
12407 }
12408
12409
12410
12411
12412
12417 {
12418 return true;
12419 }
12420
12422 {
12424 }
12425
12426
12427
12428
12429
12431 {
12432 if (parent)
12433 {
12434 if (parent.IsInherited(DayZInfected))
12435 return true;
12436
12437 if (!parent.IsRuined())
12438 return true;
12439 }
12440
12441 return true;
12442 }
12443
12445 {
12446 if (!super.CanPutAsAttachment(parent))
12447 {
12448 return false;
12449 }
12450
12451 if (!IsRuined() && !parent.IsRuined())
12452 {
12453 return true;
12454 }
12455
12456 return false;
12457 }
12458
12460 {
12461
12462
12463
12464
12465 return super.CanReceiveItemIntoCargo(item);
12466 }
12467
12469 {
12470
12471
12472
12473
12474 GameInventory attachmentInv = attachment.GetInventory();
12476 {
12477 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12478 return false;
12479 }
12480
12481 InventoryLocation loc = new InventoryLocation();
12482 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12483 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12484 return false;
12485
12486 return super.CanReceiveAttachment(attachment, slotId);
12487 }
12488
12490 {
12491 if (!super.CanReleaseAttachment(attachment))
12492 return false;
12493
12494 return GetInventory().AreChildrenAccessible();
12495 }
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12518 {
12519 int id = muzzle_owner.GetMuzzleID();
12520 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12521
12522 if (WPOF_array)
12523 {
12524 for (int i = 0; i < WPOF_array.Count(); i++)
12525 {
12526 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12527
12528 if (WPOF)
12529 {
12530 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12531 }
12532 }
12533 }
12534 }
12535
12536
12538 {
12539 int id = muzzle_owner.GetMuzzleID();
12541
12542 if (WPOBE_array)
12543 {
12544 for (int i = 0; i < WPOBE_array.Count(); i++)
12545 {
12546 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12547
12548 if (WPOBE)
12549 {
12550 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12551 }
12552 }
12553 }
12554 }
12555
12556
12558 {
12559 int id = muzzle_owner.GetMuzzleID();
12560 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12561
12562 if (WPOOH_array)
12563 {
12564 for (int i = 0; i < WPOOH_array.Count(); i++)
12565 {
12566 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12567
12568 if (WPOOH)
12569 {
12570 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12571 }
12572 }
12573 }
12574 }
12575
12576
12578 {
12579 int id = muzzle_owner.GetMuzzleID();
12580 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12581
12582 if (WPOOH_array)
12583 {
12584 for (int i = 0; i < WPOOH_array.Count(); i++)
12585 {
12586 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12587
12588 if (WPOOH)
12589 {
12590 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12591 }
12592 }
12593 }
12594 }
12595
12596
12598 {
12599 int id = muzzle_owner.GetMuzzleID();
12600 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12601
12602 if (WPOOH_array)
12603 {
12604 for (int i = 0; i < WPOOH_array.Count(); i++)
12605 {
12606 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12607
12608 if (WPOOH)
12609 {
12610 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12611 }
12612 }
12613 }
12614 }
12615
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 {
12641 {
12642 return true;
12643 }
12644
12645 return false;
12646 }
12647
12649 {
12650 return false;
12651 }
12652
12655 {
12656 return UATimeSpent.DEFAULT_DEPLOY;
12657 }
12658
12659
12660
12661
12663 {
12665 SetSynchDirty();
12666 }
12667
12669 {
12671 }
12672
12673
12675 {
12676 return false;
12677 }
12678
12681 {
12682 string att_type = "None";
12683
12684 if (ConfigIsExisting("soundAttType"))
12685 {
12686 att_type = ConfigGetString("soundAttType");
12687 }
12688
12690 }
12691
12693 {
12695 }
12696
12697
12698
12699
12700
12704
12706 {
12709
12711 }
12712
12713
12715 {
12717 return;
12718
12720
12723
12726
12727 SoundParameters params = new SoundParameters();
12731 }
12732
12733
12735 {
12737 return;
12738
12740 SetSynchDirty();
12741
12744 }
12745
12746
12748 {
12750 return;
12751
12753 SetSynchDirty();
12754
12757 }
12758
12760 {
12762 }
12763
12765 {
12767 }
12768
12771 {
12772 if (!
GetGame().IsDedicatedServer())
12773 {
12774 if (ConfigIsExisting("attachSoundSet"))
12775 {
12776 string cfg_path = "";
12777 string soundset = "";
12778 string type_name =
GetType();
12779
12782 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12783 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12784
12785 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12786 {
12787 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12788 {
12789 if (cfg_slot_array[i] == slot_type)
12790 {
12791 soundset = cfg_soundset_array[i];
12792 break;
12793 }
12794 }
12795 }
12796
12797 if (soundset != "")
12798 {
12799 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12801 }
12802 }
12803 }
12804 }
12805
12807 {
12808
12809 }
12810
12811 void OnApply(PlayerBase player);
12812
12814 {
12815 return 1.0;
12816 };
12817
12819 {
12821 }
12822
12824 {
12826 }
12827
12829
12831 {
12832 SetDynamicPhysicsLifeTime(0.01);
12834 }
12835
12837 {
12838 array<string> zone_names = new array<string>;
12839 GetDamageZones(zone_names);
12840 for (int i = 0; i < zone_names.Count(); i++)
12841 {
12842 SetHealthMax(zone_names.Get(i),"Health");
12843 }
12844 SetHealthMax("","Health");
12845 }
12846
12849 {
12850 float global_health = GetHealth01("","Health");
12851 array<string> zones = new array<string>;
12852 GetDamageZones(zones);
12853
12854 for (int i = 0; i < zones.Count(); i++)
12855 {
12856 SetHealth01(zones.Get(i),"Health",global_health);
12857 }
12858 }
12859
12862 {
12863 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12864 }
12865
12867 {
12868 if (!hasRootAsPlayer)
12869 {
12870 if (refParentIB)
12871 {
12872
12873 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12874 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12875
12876 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12877 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12878
12881 }
12882 else
12883 {
12884
12887 }
12888 }
12889 }
12890
12892 {
12894 {
12895 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12896 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12897 {
12898 float heatPermCoef = 1.0;
12900 while (ent)
12901 {
12902 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12903 ent = ent.GetHierarchyParent();
12904 }
12905
12906 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12907 }
12908 }
12909 }
12910
12912 {
12913
12914 EntityAI parent = GetHierarchyParent();
12915 if (!parent)
12916 {
12917 hasParent = false;
12918 hasRootAsPlayer = false;
12919 }
12920 else
12921 {
12922 hasParent = true;
12923 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12924 refParentIB =
ItemBase.Cast(parent);
12925 }
12926 }
12927
12928 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12929 {
12930
12931 }
12932
12934 {
12935
12936 return false;
12937 }
12938
12940 {
12941
12942
12943 return false;
12944 }
12945
12947 {
12948
12949 return false;
12950 }
12951
12954 {
12955 return !GetIsFrozen() &&
IsOpen();
12956 }
12957
12959 {
12960 bool hasParent = false, hasRootAsPlayer = false;
12962
12963 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12964 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12965
12966 if (wwtu || foodDecay)
12967 {
12971
12972 if (processWetness || processTemperature || processDecay)
12973 {
12975
12976 if (processWetness)
12977 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12978
12979 if (processTemperature)
12981
12982 if (processDecay)
12983 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12984 }
12985 }
12986 }
12987
12990 {
12992 }
12993
12995 {
12998
12999 return super.GetTemperatureFreezeThreshold();
13000 }
13001
13003 {
13006
13007 return super.GetTemperatureThawThreshold();
13008 }
13009
13011 {
13014
13015 return super.GetItemOverheatThreshold();
13016 }
13017
13019 {
13021 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13022
13023 return super.GetTemperatureFreezeTime();
13024 }
13025
13027 {
13029 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13030
13031 return super.GetTemperatureThawTime();
13032 }
13033
13038
13040 {
13041 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13042 }
13043
13045 {
13046 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13047 }
13048
13051 {
13053 }
13054
13056 {
13058 }
13059
13061 {
13063 }
13064
13067 {
13068 return null;
13069 }
13070
13073 {
13074 return false;
13075 }
13076
13078 {
13080 {
13083 if (!trg)
13084 {
13086 explosive = this;
13087 }
13088
13089 explosive.PairRemote(trg);
13091
13092 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13093 trg.SetPersistentPairID(persistentID);
13094 explosive.SetPersistentPairID(persistentID);
13095
13096 return true;
13097 }
13098 return false;
13099 }
13100
13103 {
13104 float ret = 1.0;
13107 ret *= GetHealth01();
13108
13109 return ret;
13110 }
13111
13112 #ifdef DEVELOPER
13113 override void SetDebugItem()
13114 {
13115 super.SetDebugItem();
13116 _itemBase = this;
13117 }
13118
13120 {
13121 string text = super.GetDebugText();
13122
13124 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13125
13126 return text;
13127 }
13128 #endif
13129
13131 {
13132 return true;
13133 }
13134
13136
13138
13140 {
13143 }
13144
13145
13153
13169}
13170
13172{
13174 if (entity)
13175 {
13176 bool is_item = entity.IsInherited(
ItemBase);
13177 if (is_item && full_quantity)
13178 {
13181 }
13182 }
13183 else
13184 {
13186 return NULL;
13187 }
13188 return entity;
13189}
13190
13192{
13193 if (item)
13194 {
13195 if (health > 0)
13196 item.SetHealth("", "", health);
13197
13198 if (item.CanHaveTemperature())
13199 {
13201 if (item.CanFreeze())
13202 item.SetFrozen(false);
13203 }
13204
13205 if (item.HasEnergyManager())
13206 {
13207 if (quantity >= 0)
13208 {
13209 item.GetCompEM().SetEnergy0To1(quantity);
13210 }
13211 else
13212 {
13214 }
13215 }
13216 else if (item.IsMagazine())
13217 {
13218 Magazine mag = Magazine.Cast(item);
13219 if (quantity >= 0)
13220 {
13221 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13222 }
13223 else
13224 {
13226 }
13227
13228 }
13229 else
13230 {
13231 if (quantity >= 0)
13232 {
13233 item.SetQuantityNormalized(quantity, false);
13234 }
13235 else
13236 {
13238 }
13239
13240 }
13241 }
13242}
13243
13244#ifdef DEVELOPER
13246#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.