8392{
8394 {
8395 return true;
8396 }
8397};
8398
8400{
8401
8402};
8403
8404
8405
8407{
8411
8413
8416
8417
8418
8419
8420
8429
8435
8440
8445
8466 protected bool m_IsResultOfSplit
8467
8469
8474
8475
8476
8478
8482
8483
8484
8486
8489
8490
8491
8497
8498
8506
8509
8510
8512
8513
8515
8516
8521
8522
8527
8529
8530
8532
8533
8535 {
8540
8541 if (!
g_Game.IsDedicatedServer())
8542 {
8544 {
8546
8548 {
8550 }
8551 }
8552
8555 }
8556
8557 m_OldLocation = null;
8558
8560 {
8562 }
8563
8564 if (ConfigIsExisting("headSelectionsToHide"))
8565 {
8568 }
8569
8571 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8572 {
8574 }
8575
8577
8578 m_IsResultOfSplit = false;
8579
8581 }
8582
8584 {
8585 super.InitItemVariables();
8586
8592 m_Count = ConfigGetInt(
"count");
8593
8596
8601
8604
8609
8621
8625
8626
8629 if (ConfigIsExisting("canBeSplit"))
8630 {
8633 }
8634
8636 if (ConfigIsExisting("itemBehaviour"))
8638
8639
8642 RegisterNetSyncVariableInt("m_VarLiquidType");
8643 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8644
8645 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8646 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8647 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8648
8649 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8650 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8651 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8652 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8653
8654 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8655 RegisterNetSyncVariableBool("m_IsTakeable");
8656 RegisterNetSyncVariableBool("m_IsHologram");
8657
8660 {
8663 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8664 }
8665
8667
8669 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8671
8673 }
8674
8676 {
8678 }
8679
8681 {
8684 {
8689 }
8690 }
8691
8692 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8693 {
8695 {
8698 }
8699
8701 }
8702
8704 {
8710 }
8711
8713
8715 {
8717
8718 if (!action)
8719 {
8720 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8721 return;
8722 }
8723
8725 if (!ai)
8726 {
8728 return;
8729 }
8730
8732 if (!action_array)
8733 {
8734 action_array = new array<ActionBase_Basic>;
8736 }
8737 if (LogManager.IsActionLogEnable())
8738 {
8739 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8740 }
8741
8742 if (action_array.Find(action) != -1)
8743 {
8744 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8745 }
8746 else
8747 {
8748 action_array.Insert(action);
8749 }
8750 }
8751
8753 {
8754 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8755 ActionBase action = player.GetActionManager().GetAction(actionName);
8758
8759 if (action_array)
8760 {
8761 action_array.RemoveItem(action);
8762 }
8763 }
8764
8765
8766
8768 {
8769 ActionOverrideData overrideData = new ActionOverrideData();
8773
8775 if (!actionMap)
8776 {
8779 }
8780
8781 actionMap.Insert(this.
Type(), overrideData);
8782
8783 }
8784
8786
8788
8789
8791 {
8794
8797
8798 string config_to_search = "CfgVehicles";
8799 string muzzle_owner_config;
8800
8802 {
8803 if (IsInherited(Weapon))
8804 config_to_search = "CfgWeapons";
8805
8806 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8807
8808 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8809
8810 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8811
8812 if (config_OnFire_subclass_count > 0)
8813 {
8814 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8815
8816 for (int i = 0; i < config_OnFire_subclass_count; i++)
8817 {
8818 string particle_class = "";
8819 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8820 string config_OnFire_entry = config_OnFire_class + particle_class;
8821 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8822 WPOF_array.Insert(WPOF);
8823 }
8824
8825
8827 }
8828 }
8829
8831 {
8832 config_to_search = "CfgWeapons";
8833 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8834
8835 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8836
8837 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8838
8839 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8840 {
8841 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8842
8843 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8844 {
8845 string particle_class2 = "";
8846 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8847 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8848 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8849 WPOBE_array.Insert(WPOBE);
8850 }
8851
8852
8854 }
8855 }
8856 }
8857
8858
8860 {
8863
8865 {
8866 string config_to_search = "CfgVehicles";
8867
8868 if (IsInherited(Weapon))
8869 config_to_search = "CfgWeapons";
8870
8871 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8872 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8873
8874 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8875 {
8876
8878
8880 {
8882 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8884 return;
8885 }
8886
8889
8890
8891
8892 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8893 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8894
8895 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8896 {
8897 string particle_class = "";
8898 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8899 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8900 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8901
8902 if (entry_type == CT_CLASS)
8903 {
8904 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8905 WPOOH_array.Insert(WPOF);
8906 }
8907 }
8908
8909
8911 }
8912 }
8913 }
8914
8916 {
8918 }
8919
8921 {
8923 {
8925
8928
8931
8932 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8933 }
8934 }
8935
8937 {
8939 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8940
8942 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8943
8945 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8946
8948 {
8950 }
8951 }
8952
8954 {
8956 }
8957
8959 {
8962 else
8964
8966 {
8969 }
8970 else
8971 {
8974
8977 }
8978
8980 }
8981
8983 {
8985 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8986 }
8987
8989 {
8991 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8993 }
8994
8996 {
8998 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8999 }
9000
9002 {
9005
9006 OverheatingParticle OP = new OverheatingParticle();
9011
9013 }
9014
9016 {
9019
9020 return -1;
9021 }
9022
9024 {
9026 {
9029
9030 for (int i = count; i > 0; --i)
9031 {
9032 int id = i - 1;
9035
9038
9039 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9040 {
9041 if (p)
9042 {
9045 }
9046 }
9047 }
9048 }
9049 }
9050
9052 {
9054 {
9056 {
9057 int id = i - 1;
9059
9060 if (OP)
9061 {
9063
9064 if (p)
9065 {
9067 }
9068
9069 delete OP;
9070 }
9071 }
9072
9075 }
9076 }
9077
9080 {
9081 return 0.0;
9082 }
9083
9084
9086 {
9087 return 250;
9088 }
9089
9091 {
9092 return 0;
9093 }
9094
9097 {
9099 return true;
9100
9101 return false;
9102 }
9103
9106 {
9109
9111 {
9113 }
9114 else
9115 {
9116
9118 }
9119
9121 }
9122
9129 {
9130 return -1;
9131 }
9132
9133
9134
9135
9137 {
9139 {
9140 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9141 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9142
9143 if (r_index >= 0)
9144 {
9145 InventoryLocation r_il = new InventoryLocation;
9146 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9147
9148 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9151 {
9152 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9153 }
9155 {
9156 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9157 }
9158
9159 }
9160
9161 player.GetHumanInventory().ClearUserReservedLocation(this);
9162 }
9163
9166 }
9167
9168
9169
9170
9172 {
9173 return ItemBase.m_DebugActionsMask;
9174 }
9175
9177 {
9178 return ItemBase.m_DebugActionsMask & mask;
9179 }
9180
9182 {
9183 ItemBase.m_DebugActionsMask = mask;
9184 }
9185
9187 {
9188 ItemBase.m_DebugActionsMask |= mask;
9189 }
9190
9192 {
9193 ItemBase.m_DebugActionsMask &= ~mask;
9194 }
9195
9197 {
9199 {
9201 }
9202 else
9203 {
9205 }
9206 }
9207
9208
9210 {
9211 if (GetEconomyProfile())
9212 {
9213 float q_max = GetEconomyProfile().GetQuantityMax();
9214 if (q_max > 0)
9215 {
9216 float q_min = GetEconomyProfile().GetQuantityMin();
9217 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9218
9220 {
9221 ComponentEnergyManager comp = GetCompEM();
9223 {
9225 }
9226 }
9228 {
9230
9231 }
9232
9233 }
9234 }
9235 }
9236
9239 {
9240 EntityAI parent = GetHierarchyParent();
9241
9242 if (parent)
9243 {
9244 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9245 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9246 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9247 }
9248 }
9249
9252 {
9253 EntityAI parent = GetHierarchyParent();
9254
9255 if (parent)
9256 {
9257 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9258 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9259 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9260 }
9261 }
9262
9264 {
9265
9266
9267
9268
9270
9272 {
9273 if (ScriptInputUserData.CanStoreInputUserData())
9274 {
9275 ScriptInputUserData ctx = new ScriptInputUserData;
9281 ctx.
Write(use_stack_max);
9284
9286 {
9287 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9288 }
9289 }
9290 }
9291 else if (!
g_Game.IsMultiplayer())
9292 {
9294 }
9295 }
9296
9298 {
9300 }
9301
9303 {
9305 }
9306
9308 {
9310 }
9311
9313 {
9314
9315 return false;
9316 }
9317
9319 {
9320 return false;
9321 }
9322
9326 {
9327 return false;
9328 }
9329
9331 {
9332 return "";
9333 }
9334
9336
9338 {
9339 return false;
9340 }
9341
9343 {
9344 return true;
9345 }
9346
9347
9348
9350 {
9351 return true;
9352 }
9353
9355 {
9356 return true;
9357 }
9358
9360 {
9361 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9363 }
9364
9366 {
9368 }
9369
9371 {
9373 if (!is_being_placed)
9375 SetSynchDirty();
9376 }
9377
9378
9380
9382 {
9384 }
9385
9387 {
9389 }
9390
9392 {
9393 return 1;
9394 }
9395
9397 {
9398 return false;
9399 }
9400
9402 {
9404 SetSynchDirty();
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
9433
9434
9435
9436
9437
9438
9439
9440
9442 {
9443 super.OnMovedInsideCargo(container);
9444
9445 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9446 }
9447
9448 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9449 {
9450 super.EEItemLocationChanged(oldLoc, newLoc);
9451
9452 PlayerBase newPlayer = null;
9453 PlayerBase oldPlayer = null;
9454
9455 if (newLoc.GetParent())
9456 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9457
9458 if (oldLoc.GetParent())
9459 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9460
9462 {
9463 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9464
9465 if (rIndex >= 0)
9466 {
9467 InventoryLocation rIl = new InventoryLocation;
9468 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9469
9470 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9473 {
9474 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9475 }
9477 {
9479 }
9480
9481 }
9482 }
9483
9485 {
9486 if (newPlayer)
9487 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9488
9489 if (newPlayer == oldPlayer)
9490 {
9491 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9492 {
9494 {
9495 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9496 {
9497 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9498 }
9499 }
9500 else
9501 {
9502 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9503 }
9504 }
9505
9506 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9507 {
9508 int type = oldLoc.GetType();
9510 {
9511 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9512 }
9514 {
9515 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9516 }
9517 }
9518 if (!m_OldLocation)
9519 {
9520 m_OldLocation = new InventoryLocation;
9521 }
9522 m_OldLocation.Copy(oldLoc);
9523 }
9524 else
9525 {
9526 if (m_OldLocation)
9527 {
9528 m_OldLocation.Reset();
9529 }
9530 }
9531
9532 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9533 }
9534 else
9535 {
9536 if (newPlayer)
9537 {
9538 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9539 if (resIndex >= 0)
9540 {
9541 InventoryLocation il = new InventoryLocation;
9542 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9544 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9547 {
9548 il.
GetParent().GetOnReleaseLock().Invoke(it);
9549 }
9551 {
9553 }
9554
9555 }
9556 }
9558 {
9559
9561 }
9562
9563 if (m_OldLocation)
9564 {
9565 m_OldLocation.Reset();
9566 }
9567 }
9568
9570 {
9571 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9572 }
9573
9575 {
9576 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9577 }
9578 }
9579
9580 override void EOnContact(IEntity other, Contact extra)
9581 {
9583 {
9584 int liquidType = -1;
9586 if (impactSpeed > 0.0)
9587 {
9589 #ifndef SERVER
9591 #else
9593 SetSynchDirty();
9594 #endif
9596 }
9597 }
9598
9599 #ifdef SERVER
9600 if (GetCompEM() && GetCompEM().IsPlugged())
9601 {
9602 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9603 GetCompEM().UnplugThis();
9604 }
9605 #endif
9606 }
9607
9609
9611 {
9613 }
9614
9616 {
9617
9618 }
9619
9621 {
9622 super.OnItemLocationChanged(old_owner, new_owner);
9623
9624 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9625 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9626
9627 if (!relatedPlayer && playerNew)
9628 relatedPlayer = playerNew;
9629
9630 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9631 {
9633 if (actionMgr)
9634 {
9635 ActionBase currentAction = actionMgr.GetRunningAction();
9636 if (currentAction)
9638 }
9639 }
9640
9641 Man ownerPlayerOld = null;
9642 Man ownerPlayerNew = null;
9643
9644 if (old_owner)
9645 {
9646 if (old_owner.
IsMan())
9647 {
9648 ownerPlayerOld = Man.Cast(old_owner);
9649 }
9650 else
9651 {
9652 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9653 }
9654 }
9655 else
9656 {
9658 {
9660
9661 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9662 {
9663 GetCompEM().UnplugThis();
9664 }
9665 }
9666 }
9667
9668 if (new_owner)
9669 {
9670 if (new_owner.
IsMan())
9671 {
9672 ownerPlayerNew = Man.Cast(new_owner);
9673 }
9674 else
9675 {
9676 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9677 }
9678 }
9679
9680 if (ownerPlayerOld != ownerPlayerNew)
9681 {
9682 if (ownerPlayerOld)
9683 {
9684 array<EntityAI> subItemsExit = new array<EntityAI>;
9686 for (int i = 0; i < subItemsExit.Count(); i++)
9687 {
9690 }
9691 }
9692
9693 if (ownerPlayerNew)
9694 {
9695 array<EntityAI> subItemsEnter = new array<EntityAI>;
9697 for (int j = 0; j < subItemsEnter.Count(); j++)
9698 {
9701 }
9702 }
9703 }
9704 else if (ownerPlayerNew != null)
9705 {
9706 PlayerBase nplayer;
9707 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9708 {
9709 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9711 for (int k = 0; k < subItemsUpdate.Count(); k++)
9712 {
9714 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9715 }
9716 }
9717 }
9718
9719 if (old_owner)
9720 old_owner.OnChildItemRemoved(this);
9721 if (new_owner)
9722 new_owner.OnChildItemReceived(this);
9723 }
9724
9725
9727 {
9728 super.EEDelete(parent);
9729 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9730 if (player)
9731 {
9733
9734 if (player.IsAlive())
9735 {
9736 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9737 if (r_index >= 0)
9738 {
9739 InventoryLocation r_il = new InventoryLocation;
9740 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9741
9742 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9745 {
9746 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9747 }
9749 {
9750 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9751 }
9752
9753 }
9754
9755 player.RemoveQuickBarEntityShortcut(this);
9756 }
9757 }
9758 }
9759
9761 {
9762 super.EEKilled(killer);
9763
9766 {
9767 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9768 {
9769 if (IsMagazine())
9770 {
9771 if (Magazine.Cast(this).GetAmmoCount() > 0)
9772 {
9774 }
9775 }
9776 else
9777 {
9779 }
9780 }
9781 }
9782 }
9783
9785 {
9786 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9787
9788 super.OnWasAttached(parent, slot_id);
9789
9792
9795 }
9796
9798 {
9799 super.OnWasDetached(parent, slot_id);
9800
9803
9806 }
9807
9809 {
9810 int idx;
9813
9814 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9815 if (inventory_slots.Count() < 1)
9816 {
9817 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9818 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9819 }
9820 else
9821 {
9822 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9823 }
9824
9825 idx = inventory_slots.Find(slot);
9826 if (idx < 0)
9827 return "";
9828
9829 return attach_types.Get(idx);
9830 }
9831
9833 {
9834 int idx = -1;
9835 string slot;
9836
9839
9840 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9841 if (inventory_slots.Count() < 1)
9842 {
9843 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9844 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9845 }
9846 else
9847 {
9848 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9849 if (detach_types.Count() < 1)
9850 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9851 }
9852
9853 for (int i = 0; i < inventory_slots.Count(); i++)
9854 {
9855 slot = inventory_slots.Get(i);
9856 }
9857
9858 if (slot != "")
9859 {
9860 if (detach_types.Count() == 1)
9861 idx = 0;
9862 else
9863 idx = inventory_slots.Find(slot);
9864 }
9865 if (idx < 0)
9866 return "";
9867
9868 return detach_types.Get(idx);
9869 }
9870
9872 {
9873
9875
9876
9877 float min_time = 1;
9878 float max_time = 3;
9879 float delay = Math.RandomFloat(min_time, max_time);
9880
9881 explode_timer.Run(delay, this, "DoAmmoExplosion");
9882 }
9883
9885 {
9886 Magazine magazine = Magazine.Cast(this);
9887 int pop_sounds_count = 6;
9888 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9889
9890
9891 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9892 string sound_name = pop_sounds[ sound_idx ];
9893 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9894
9895
9896 magazine.ServerAddAmmoCount(-1);
9897
9898
9899 float min_temp_to_explode = 100;
9900
9901 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9902 {
9904 }
9905 }
9906
9907
9908 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9909 {
9910 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9911
9912 const int CHANCE_DAMAGE_CARGO = 4;
9913 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9914 const int CHANCE_DAMAGE_NOTHING = 2;
9915
9917 {
9918 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9919 int chances;
9920 int rnd;
9921
9922 if (GetInventory().GetCargo())
9923 {
9924 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9925 rnd = Math.RandomInt(0,chances);
9926
9927 if (rnd < CHANCE_DAMAGE_CARGO)
9928 {
9930 }
9931 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9932 {
9934 }
9935 }
9936 else
9937 {
9938 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9939 rnd = Math.RandomInt(0,chances);
9940
9941 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9942 {
9944 }
9945 }
9946 }
9947 }
9948
9950 {
9951 CargoBase cargo = GetInventory().GetCargo();
9952 if (cargo)
9953 {
9955 if (item_count > 0)
9956 {
9957 int random_pick = Math.RandomInt(0, item_count);
9959 if (!item.IsExplosive())
9960 {
9961 item.AddHealth("","",damage);
9962 return true;
9963 }
9964 }
9965 }
9966 return false;
9967 }
9968
9970 {
9971 GameInventory inventory = GetInventory();
9973 if (attachment_count > 0)
9974 {
9975 int random_pick = Math.RandomInt(0, attachment_count);
9977 if (!attachment.IsExplosive())
9978 {
9979 attachment.AddHealth("","",damage);
9980 return true;
9981 }
9982 }
9983 return false;
9984 }
9985
9987 {
9989 }
9990
9992 {
9994 return GetInventory().CanRemoveEntity();
9995
9996 return false;
9997 }
9998
10000 {
10001
10003 return false;
10004
10005
10007 return false;
10008
10009
10010
10012 if (delta == 0)
10013 return false;
10014
10015
10016 return true;
10017 }
10018
10020 {
10022 {
10023 if (ScriptInputUserData.CanStoreInputUserData())
10024 {
10025 ScriptInputUserData ctx = new ScriptInputUserData;
10030 ctx.
Write(destination_entity);
10032 ctx.
Write(slot_id);
10034 }
10035 }
10036 else if (!
g_Game.IsMultiplayer())
10037 {
10039 }
10040 }
10041
10043 {
10044 float split_quantity_new;
10048 InventoryLocation loc = new InventoryLocation;
10049
10050 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10051 {
10053 split_quantity_new = stack_max;
10054 else
10056
10058 {
10059 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10060 if (new_item)
10061 {
10062 new_item.SetResultOfSplit(true);
10063 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10065 new_item.
SetQuantity(split_quantity_new,
false,
true);
10066 }
10067 }
10068 }
10069 else if (destination_entity && slot_id == -1)
10070 {
10071 if (quantity > stack_max)
10072 split_quantity_new = stack_max;
10073 else
10074 split_quantity_new = quantity;
10075
10077 {
10078 GameInventory destinationInventory = destination_entity.GetInventory();
10080 {
10083 }
10084
10085 if (new_item)
10086 {
10087 new_item.SetResultOfSplit(true);
10088 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10090 new_item.
SetQuantity(split_quantity_new,
false,
true);
10091 }
10092 }
10093 }
10094 else
10095 {
10096 if (stack_max != 0)
10097 {
10099 {
10101 }
10102
10103 if (split_quantity_new == 0)
10104 {
10105 if (!
g_Game.IsMultiplayer())
10106 player.PhysicalPredictiveDropItem(this);
10107 else
10108 player.ServerDropEntity(this);
10109 return;
10110 }
10111
10113 {
10115
10116 if (new_item)
10117 {
10118 new_item.SetResultOfSplit(true);
10119 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10122 new_item.PlaceOnSurface();
10123 }
10124 }
10125 }
10126 }
10127 }
10128
10130 {
10131 float split_quantity_new;
10135 InventoryLocation loc = new InventoryLocation;
10136
10137 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10138 {
10140 split_quantity_new = stack_max;
10141 else
10143
10145 {
10146 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10147 if (new_item)
10148 {
10149 new_item.SetResultOfSplit(true);
10150 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10152 new_item.
SetQuantity(split_quantity_new,
false,
true);
10153 }
10154 }
10155 }
10156 else if (destination_entity && slot_id == -1)
10157 {
10158 if (quantity > stack_max)
10159 split_quantity_new = stack_max;
10160 else
10161 split_quantity_new = quantity;
10162
10164 {
10165 GameInventory destinationInventory = destination_entity.GetInventory();
10167 {
10170 }
10171
10172 if (new_item)
10173 {
10174 new_item.SetResultOfSplit(true);
10175 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10177 new_item.
SetQuantity(split_quantity_new,
false,
true);
10178 }
10179 }
10180 }
10181 else
10182 {
10183 if (stack_max != 0)
10184 {
10186 {
10188 }
10189
10191 {
10193
10194 if (new_item)
10195 {
10196 new_item.SetResultOfSplit(true);
10197 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10200 new_item.PlaceOnSurface();
10201 }
10202 }
10203 }
10204 }
10205 }
10206
10208 {
10210 {
10211 if (ScriptInputUserData.CanStoreInputUserData())
10212 {
10213 ScriptInputUserData ctx = new ScriptInputUserData;
10218 dst.WriteToContext(ctx);
10220 }
10221 }
10222 else if (!
g_Game.IsMultiplayer())
10223 {
10225 }
10226 }
10227
10229 {
10231 {
10232 if (ScriptInputUserData.CanStoreInputUserData())
10233 {
10234 ScriptInputUserData ctx = new ScriptInputUserData;
10239 ctx.
Write(destination_entity);
10245 }
10246 }
10247 else if (!
g_Game.IsMultiplayer())
10248 {
10250 }
10251 }
10252
10254 {
10256 }
10257
10259 {
10261 float split_quantity_new;
10263 if (dst.IsValid())
10264 {
10265 int slot_id = dst.GetSlot();
10267
10268 if (quantity > stack_max)
10269 split_quantity_new = stack_max;
10270 else
10271 split_quantity_new = quantity;
10272
10274 {
10276
10277 if (new_item)
10278 {
10279 new_item.SetResultOfSplit(true);
10280 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10282 new_item.
SetQuantity(split_quantity_new,
false,
true);
10283 }
10284
10285 return new_item;
10286 }
10287 }
10288
10289 return null;
10290 }
10291
10293 {
10295 float split_quantity_new;
10297 if (destination_entity)
10298 {
10300 if (quantity > stackable)
10301 split_quantity_new = stackable;
10302 else
10303 split_quantity_new = quantity;
10304
10306 {
10307 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10308 if (new_item)
10309 {
10310 new_item.SetResultOfSplit(true);
10311 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10313 new_item.
SetQuantity(split_quantity_new,
false,
true);
10314 }
10315 }
10316 }
10317 }
10318
10320 {
10322 {
10323 if (ScriptInputUserData.CanStoreInputUserData())
10324 {
10325 ScriptInputUserData ctx = new ScriptInputUserData;
10330 ItemBase destination_entity =
this;
10331 ctx.
Write(destination_entity);
10335 }
10336 }
10337 else if (!
g_Game.IsMultiplayer())
10338 {
10340 }
10341 }
10342
10344 {
10346 float split_quantity_new;
10348 if (player)
10349 {
10351 if (quantity > stackable)
10352 split_quantity_new = stackable;
10353 else
10354 split_quantity_new = quantity;
10355
10357 {
10358 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10359 new_item =
ItemBase.Cast(in_hands);
10360 if (new_item)
10361 {
10362 new_item.SetResultOfSplit(true);
10363 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10365 new_item.SetQuantity(split_quantity_new, false, true);
10366 }
10367 }
10368 }
10369 }
10370
10372 {
10374 float split_quantity_new = Math.Floor(quantity * 0.5);
10375
10377 return;
10378
10380
10381 if (new_item)
10382 {
10383 if (new_item.GetQuantityMax() < split_quantity_new)
10384 {
10385 split_quantity_new = new_item.GetQuantityMax();
10386 }
10387
10388 new_item.SetResultOfSplit(true);
10389 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10390
10392 {
10395 }
10396 else
10397 {
10399 new_item.
SetQuantity(split_quantity_new,
false,
true);
10400 }
10401 }
10402 }
10403
10405 {
10407 float split_quantity_new = Math.Floor(quantity / 2);
10408
10410 return;
10411
10412 InventoryLocation invloc = new InventoryLocation;
10414
10416 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10417
10418 if (new_item)
10419 {
10420 if (new_item.GetQuantityMax() < split_quantity_new)
10421 {
10422 split_quantity_new = new_item.GetQuantityMax();
10423 }
10425 {
10428 }
10429 else if (split_quantity_new > 1)
10430 {
10432 new_item.
SetQuantity(split_quantity_new,
false,
true);
10433 }
10434 }
10435 }
10436
10439 {
10440 SetWeightDirty();
10442
10443 if (parent)
10444 parent.OnAttachmentQuantityChangedEx(this, delta);
10445
10447 {
10449 {
10451 }
10453 {
10454 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10456 }
10457 }
10458 }
10459
10462 {
10463
10464 }
10465
10468 {
10470 }
10471
10473 {
10474 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10475
10477 {
10478 if (newLevel == GameConstants.STATE_RUINED)
10479 {
10481 EntityAI parent = GetHierarchyParent();
10482 if (parent && parent.IsFireplace())
10483 {
10484 CargoBase cargo = GetInventory().GetCargo();
10485 if (cargo)
10486 {
10488 {
10490 }
10491 }
10492 }
10493 }
10494
10496 {
10497
10499 return;
10500 }
10501
10502 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10503 {
10505 }
10506 }
10507 }
10508
10509
10511 {
10512 super.OnRightClick();
10513
10515 {
10517 {
10518 if (ScriptInputUserData.CanStoreInputUserData())
10519 {
10520 EntityAI root = GetHierarchyRoot();
10521 Man playerOwner = GetHierarchyRootPlayer();
10522 InventoryLocation dst = new InventoryLocation;
10523
10524
10525 if (!playerOwner && root && root == this)
10526 {
10528 }
10529 else
10530 {
10531
10532 GetInventory().GetCurrentInventoryLocation(dst);
10534 {
10535 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10537 {
10539 }
10540 else
10541 {
10543
10544
10545 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10546 {
10548 }
10549 else
10550 {
10551 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10552 }
10553 }
10554 }
10555 }
10556
10557 ScriptInputUserData ctx = new ScriptInputUserData;
10565 }
10566 }
10567 else if (!
g_Game.IsMultiplayer())
10568 {
10570 }
10571 }
10572 }
10573
10575 {
10576 if (root)
10577 {
10578 vector m4[4];
10579 root.GetTransform(m4);
10580 dst.SetGround(this, m4);
10581 }
10582 else
10583 {
10584 GetInventory().GetCurrentInventoryLocation(dst);
10585 }
10586 }
10587
10588 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10589 {
10590
10591 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10592 return false;
10593
10594 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10595 return false;
10596
10597
10599 return false;
10600
10601
10602 Magazine mag = Magazine.Cast(this);
10603 if (mag)
10604 {
10605 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10606 return false;
10607
10608 if (stack_max_limit)
10609 {
10610 Magazine other_mag = Magazine.Cast(other_item);
10611 if (other_item)
10612 {
10613 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10614 return false;
10615 }
10616
10617 }
10618 }
10619 else
10620 {
10621
10623 return false;
10624
10626 return false;
10627 }
10628
10629 PlayerBase player = null;
10630 if (CastTo(player, GetHierarchyRootPlayer()))
10631 {
10632 if (player.GetInventory().HasAttachment(this))
10633 return false;
10634
10635 if (player.IsItemsToDelete())
10636 return false;
10637 }
10638
10639 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10640 return false;
10641
10642 int slotID;
10644 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10645 return false;
10646
10647 return true;
10648 }
10649
10651 {
10653 }
10654
10656 {
10657 return m_IsResultOfSplit;
10658 }
10659
10661 {
10662 m_IsResultOfSplit = value;
10663 }
10664
10666 {
10668 }
10669
10671 {
10672 float other_item_quantity = other_item.GetQuantity();
10673 float this_free_space;
10674
10676
10678
10679 if (other_item_quantity > this_free_space)
10680 {
10681 return this_free_space;
10682 }
10683 else
10684 {
10685 return other_item_quantity;
10686 }
10687 }
10688
10690 {
10692 }
10693
10695 {
10697 return;
10698
10699 if (!IsMagazine() && other_item)
10700 {
10702 if (quantity_used != 0)
10703 {
10704 float hp1 = GetHealth01("","");
10705 float hp2 = other_item.GetHealth01("","");
10706 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10707 hpResult = hpResult / (
GetQuantity() + quantity_used);
10708
10709 hpResult *= GetMaxHealth();
10710 Math.Round(hpResult);
10711 SetHealth("", "Health", hpResult);
10712
10714 other_item.AddQuantity(-quantity_used);
10715 }
10716 }
10718 }
10719
10721 {
10722 #ifdef SERVER
10723 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10724 GetHierarchyParent().IncreaseLifetimeUp();
10725 #endif
10726 };
10727
10729 {
10730 PlayerBase p = PlayerBase.Cast(player);
10731
10732 array<int> recipesIds = p.m_Recipes;
10733 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10734 if (moduleRecipesManager)
10735 {
10736 EntityAI itemInHands = player.GetEntityInHands();
10737 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10738 }
10739
10740 for (int i = 0;i < recipesIds.Count(); i++)
10741 {
10742 int key = recipesIds.Get(i);
10743 string recipeName = moduleRecipesManager.GetRecipeName(key);
10745 }
10746 }
10747
10748
10749 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10750 {
10751 super.GetDebugActions(outputList);
10752
10753
10759
10760
10765
10770
10771
10775
10776
10778 {
10782 }
10783
10786
10787
10791
10793
10794 InventoryLocation loc = new InventoryLocation();
10795 GetInventory().GetCurrentInventoryLocation(loc);
10797 {
10798 if (Gizmo_IsSupported())
10801 }
10802
10804 }
10805
10806
10807
10808
10810 {
10811 super.OnAction(action_id, player, ctx);
10812
10814 {
10815 switch (action_id)
10816 {
10820 return true;
10824 return true;
10825 }
10826 }
10827
10829 {
10830 switch (action_id)
10831 {
10833 Delete();
10834 return true;
10835 }
10836 }
10837
10838 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10839 {
10840 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10841 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10842 PlayerBase p = PlayerBase.Cast(player);
10843 if (
EActions.RECIPES_RANGE_START < 1000)
10844 {
10845 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10846 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10847 }
10848 }
10849 #ifndef SERVER
10850 else if (action_id ==
EActions.WATCH_PLAYER)
10851 {
10852 PluginDeveloper.SetDeveloperItemClientEx(player);
10853 }
10854 #endif
10856 {
10857 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10858 {
10859 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10860 OnDebugButtonPressServer(id + 1);
10861 }
10862
10863 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10864 {
10865 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10867 }
10868
10869 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10870 {
10871 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10873 }
10874
10875 else if (action_id ==
EActions.ADD_QUANTITY)
10876 {
10877 if (IsMagazine())
10878 {
10879 Magazine mag = Magazine.Cast(this);
10880 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10881 }
10882 else
10883 {
10885 }
10886
10887 if (m_EM)
10888 {
10889 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10890 }
10891
10892 }
10893
10894 else if (action_id ==
EActions.REMOVE_QUANTITY)
10895 {
10896 if (IsMagazine())
10897 {
10898 Magazine mag2 = Magazine.Cast(this);
10899 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10900 }
10901 else
10902 {
10904 }
10905 if (m_EM)
10906 {
10907 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10908 }
10909
10910 }
10911
10912 else if (action_id ==
EActions.SET_QUANTITY_0)
10913 {
10915
10916 if (m_EM)
10917 {
10918 m_EM.SetEnergy(0);
10919 }
10920 }
10921
10922 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10923 {
10925
10926 if (m_EM)
10927 {
10928 m_EM.SetEnergy(m_EM.GetEnergyMax());
10929 }
10930 }
10931
10932 else if (action_id ==
EActions.ADD_HEALTH)
10933 {
10934 AddHealth("","",GetMaxHealth("","Health")/5);
10935 }
10936 else if (action_id ==
EActions.REMOVE_HEALTH)
10937 {
10938 AddHealth("","",-GetMaxHealth("","Health")/5);
10939 }
10940 else if (action_id ==
EActions.DESTROY_HEALTH)
10941 {
10942 SetHealth01("","",0);
10943 }
10944 else if (action_id ==
EActions.WATCH_ITEM)
10945 {
10947 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10948 #ifdef DEVELOPER
10949 SetDebugDeveloper_item(this);
10950 #endif
10951 }
10952
10953 else if (action_id ==
EActions.ADD_TEMPERATURE)
10954 {
10955 AddTemperature(20);
10956
10957 }
10958
10959 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10960 {
10961 AddTemperature(-20);
10962
10963 }
10964
10965 else if (action_id ==
EActions.FLIP_FROZEN)
10966 {
10967 SetFrozen(!GetIsFrozen());
10968
10969 }
10970
10971 else if (action_id ==
EActions.ADD_WETNESS)
10972 {
10974
10975 }
10976
10977 else if (action_id ==
EActions.REMOVE_WETNESS)
10978 {
10980
10981 }
10982
10983 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10984 {
10987
10988
10989 }
10990
10991 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10992 {
10995 }
10996
10997 else if (action_id ==
EActions.MAKE_SPECIAL)
10998 {
10999 auto debugParams = DebugSpawnParams.WithPlayer(player);
11000 OnDebugSpawnEx(debugParams);
11001 }
11002
11003 }
11004
11005
11006 return false;
11007 }
11008
11009
11010
11011
11015
11018
11019
11020
11022 {
11023 return false;
11024 }
11025
11026
11028 {
11029 return true;
11030 }
11031
11032
11034 {
11035 return true;
11036 }
11037
11038
11039
11041 {
11042 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11043 return g_Game.ConfigIsExisting(config_path);
11044 }
11045
11048 {
11049 return null;
11050 }
11051
11053 {
11054 return false;
11055 }
11056
11058 {
11059 return false;
11060 }
11061
11065
11066
11068 {
11069 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11070 return module_repairing.CanRepair(this, item_repair_kit);
11071 }
11072
11073
11074 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11075 {
11076 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11077 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11078 }
11079
11080
11082 {
11083
11084
11085
11086
11087
11088
11089
11090
11091 return 1;
11092 }
11093
11094
11095
11097 {
11099 }
11100
11101
11102
11104 {
11106 }
11107
11108
11117 {
11118 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11119
11120 if (player)
11121 {
11122 player.MessageStatus(text);
11123 }
11124 }
11125
11126
11135 {
11136 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11137
11138 if (player)
11139 {
11140 player.MessageAction(text);
11141 }
11142 }
11143
11144
11153 {
11154 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11155
11156 if (player)
11157 {
11158 player.MessageFriendly(text);
11159 }
11160 }
11161
11162
11171 {
11172 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11173
11174 if (player)
11175 {
11176 player.MessageImportant(text);
11177 }
11178 }
11179
11181 {
11182 return true;
11183 }
11184
11185
11186 override bool KindOf(
string tag)
11187 {
11188 bool found = false;
11189 string item_name = this.
GetType();
11191 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11192
11193 int array_size = item_tag_array.Count();
11194 for (int i = 0; i < array_size; i++)
11195 {
11196 if (item_tag_array.Get(i) == tag)
11197 {
11198 found = true;
11199 break;
11200 }
11201 }
11202 return found;
11203 }
11204
11205
11207 {
11208
11209 super.OnRPC(sender, rpc_type,ctx);
11210
11211
11212 switch (rpc_type)
11213 {
11214 #ifndef SERVER
11215 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11216 Param2<bool, string> p = new Param2<bool, string>(false, "");
11217
11219 return;
11220
11221 bool play = p.param1;
11222 string soundSet = p.param2;
11223
11224 if (play)
11225 {
11227 {
11229 {
11231 }
11232 }
11233 else
11234 {
11236 }
11237 }
11238 else
11239 {
11241 }
11242
11243 break;
11244 #endif
11245
11246 }
11247
11249 {
11251 }
11252 }
11253
11254
11255
11256
11258 {
11259 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11260 return plugin.GetID(
name);
11261 }
11262
11264 {
11265 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11266 return plugin.GetName(id);
11267 }
11268
11271 {
11272
11273
11274 int varFlags;
11275 if (!ctx.
Read(varFlags))
11276 return;
11277
11278 if (varFlags & ItemVariableFlags.FLOAT)
11279 {
11281 }
11282 }
11283
11285 {
11286
11287 super.SerializeNumericalVars(floats_out);
11288
11289
11290
11292 {
11294 }
11295
11297 {
11299 }
11300
11302 {
11304 }
11305
11307 {
11312 }
11313
11315 {
11317 }
11318 }
11319
11321 {
11322
11323 super.DeSerializeNumericalVars(floats);
11324
11325
11326 int index = 0;
11327 int mask = Math.Round(floats.Get(index));
11328
11329 index++;
11330
11332 {
11334 {
11336 }
11337 else
11338 {
11339 float quantity = floats.Get(index);
11340 SetQuantity(quantity,
true,
false,
false,
false);
11341 }
11342 index++;
11343 }
11344
11346 {
11347 float wet = floats.Get(index);
11349 index++;
11350 }
11351
11353 {
11354 int liquidtype = Math.Round(floats.Get(index));
11356 index++;
11357 }
11358
11360 {
11362 index++;
11364 index++;
11366 index++;
11368 index++;
11369 }
11370
11372 {
11373 int cleanness = Math.Round(floats.Get(index));
11375 index++;
11376 }
11377 }
11378
11380 {
11381 super.WriteVarsToCTX(ctx);
11382
11383
11385 {
11387 }
11388
11390 {
11392 }
11393
11395 {
11397 }
11398
11400 {
11401 int r,g,b,a;
11407 }
11408
11410 {
11412 }
11413 }
11414
11416 {
11417 if (!super.ReadVarsFromCTX(ctx,version))
11418 return false;
11419
11420 int intValue;
11421 float value;
11422
11423 if (version < 140)
11424 {
11425 if (!ctx.
Read(intValue))
11426 return false;
11427
11428 m_VariablesMask = intValue;
11429 }
11430
11432 {
11433 if (!ctx.
Read(value))
11434 return false;
11435
11437 {
11439 }
11440 else
11441 {
11443 }
11444 }
11445
11446 if (version < 140)
11447 {
11449 {
11450 if (!ctx.
Read(value))
11451 return false;
11452 SetTemperatureDirect(value);
11453 }
11454 }
11455
11457 {
11458 if (!ctx.
Read(value))
11459 return false;
11461 }
11462
11464 {
11465 if (!ctx.
Read(intValue))
11466 return false;
11468 }
11469
11471 {
11472 int r,g,b,a;
11474 return false;
11476 return false;
11478 return false;
11480 return false;
11481
11483 }
11484
11486 {
11487 if (!ctx.
Read(intValue))
11488 return false;
11490 }
11491
11492 if (version >= 138 && version < 140)
11493 {
11495 {
11496 if (!ctx.
Read(intValue))
11497 return false;
11498 SetFrozen(intValue);
11499 }
11500 }
11501
11502 return true;
11503 }
11504
11505
11507 {
11510 {
11512 }
11513
11514 if (!super.OnStoreLoad(ctx, version))
11515 {
11517 return false;
11518 }
11519
11520 if (version >= 114)
11521 {
11522 bool hasQuickBarIndexSaved;
11523
11524 if (!ctx.
Read(hasQuickBarIndexSaved))
11525 {
11527 return false;
11528 }
11529
11530 if (hasQuickBarIndexSaved)
11531 {
11532 int itmQBIndex;
11533
11534
11535 if (!ctx.
Read(itmQBIndex))
11536 {
11538 return false;
11539 }
11540
11541 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11542 if (itmQBIndex != -1 && parentPlayer)
11543 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11544 }
11545 }
11546 else
11547 {
11548
11549 PlayerBase player;
11550 int itemQBIndex;
11551 if (version ==
int.
MAX)
11552 {
11553 if (!ctx.
Read(itemQBIndex))
11554 {
11556 return false;
11557 }
11558 }
11559 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11560 {
11561
11562 if (!ctx.
Read(itemQBIndex))
11563 {
11565 return false;
11566 }
11567 if (itemQBIndex != -1 && player)
11568 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11569 }
11570 }
11571
11572 if (version < 140)
11573 {
11574
11575 if (!LoadVariables(ctx, version))
11576 {
11578 return false;
11579 }
11580 }
11581
11582
11584 {
11586 return false;
11587 }
11588 if (version >= 132)
11589 {
11591 if (raib)
11592 {
11594 {
11596 return false;
11597 }
11598 }
11599 }
11600
11602 return true;
11603 }
11604
11605
11606
11608 {
11609 super.OnStoreSave(ctx);
11610
11611 PlayerBase player;
11612 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11613 {
11615
11616 int itemQBIndex = -1;
11617 itemQBIndex = player.FindQuickBarEntityIndex(this);
11618 ctx.
Write(itemQBIndex);
11619 }
11620 else
11621 {
11623 }
11624
11626
11628 if (raib)
11629 {
11631 }
11632 }
11633
11634
11636 {
11637 super.AfterStoreLoad();
11638
11640 {
11642 }
11643
11645 {
11648 }
11649 }
11650
11652 {
11653 super.EEOnAfterLoad();
11654
11656 {
11658 }
11659
11662 }
11663
11665 {
11666 return false;
11667 }
11668
11669
11670
11672 {
11674 {
11675 #ifdef PLATFORM_CONSOLE
11676
11678 {
11680 if (menu)
11681 {
11683 }
11684 }
11685 #endif
11686 }
11687
11689 {
11692 }
11693
11695 {
11696 SetWeightDirty();
11698 }
11700 {
11703 }
11704
11706 {
11709
11712 }
11714 {
11718 }
11719
11720 super.OnVariablesSynchronized();
11721 }
11722
11723
11724
11726 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11727 {
11728 if (!IsServerCheck(allow_client))
11729 return false;
11730
11732 return false;
11733
11736
11737 if (value <= (min + 0.001))
11738 value = min;
11739
11740 if (value == min)
11741 {
11742 if (destroy_config)
11743 {
11744 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11745 if (dstr)
11746 {
11748 this.Delete();
11749 return true;
11750 }
11751 }
11752 else if (destroy_forced)
11753 {
11755 this.Delete();
11756 return true;
11757 }
11758
11760 }
11761
11764
11766 {
11767 EntityAI parent = GetHierarchyRoot();
11768 InventoryLocation iLoc = new InventoryLocation();
11769 GetInventory().GetCurrentInventoryLocation(iLoc);
11771 {
11772 int iLocSlot = iLoc.
GetSlot();
11774 {
11776 }
11778 {
11780 }
11781 }
11782 }
11783
11785 {
11787
11788 if (delta)
11790 }
11791
11793
11794 return false;
11795 }
11796
11797
11799 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11800 {
11802 }
11803
11805 {
11808 }
11809
11811 {
11814 }
11815
11817 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11818 {
11819 float value_clamped = Math.Clamp(value, 0, 1);
11821 SetQuantity(result, destroy_config, destroy_forced);
11822 }
11823
11824
11827 {
11829 }
11830
11832 {
11834 }
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11846 {
11847 int slot = -1;
11848 GameInventory inventory = GetInventory();
11849 if (inventory)
11850 {
11851 InventoryLocation il = new InventoryLocation;
11854 }
11855
11857 }
11858
11860 {
11861 float quantity_max = 0;
11862
11864 {
11865 if (attSlotID != -1)
11866 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11867
11868 if (quantity_max <= 0)
11870 }
11871
11872 if (quantity_max <= 0)
11874
11875 return quantity_max;
11876 }
11877
11879 {
11881 }
11882
11884 {
11886 }
11887
11888
11890 {
11892 }
11893
11895 {
11897 }
11898
11900 {
11902 }
11903
11904
11906 {
11907
11908 float weightEx = GetWeightEx();
11909 float special = GetInventoryAndCargoWeight();
11910 return weightEx - special;
11911 }
11912
11913
11915 {
11917 }
11918
11920 {
11922 {
11923 #ifdef DEVELOPER
11924 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11925 {
11926 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11928 }
11929 #endif
11930
11931 return GetQuantity() * GetConfigWeightModified();
11932 }
11933 else if (HasEnergyManager())
11934 {
11935 #ifdef DEVELOPER
11936 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11937 {
11938 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11939 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11940 }
11941 #endif
11942 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11943 }
11944 else
11945 {
11946 #ifdef DEVELOPER
11947 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11948 {
11949 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11950 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11951 }
11952 #endif
11953 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11954 }
11955 }
11956
11959 {
11960 int item_count = 0;
11962
11963 GameInventory inventory = GetInventory();
11964 CargoBase cargo = inventory.
GetCargo();
11965 if (cargo != NULL)
11966 {
11968 }
11969
11971 for (int i = 0; i < nAttachments; ++i)
11972 {
11974 if (item)
11975 item_count += item.GetNumberOfItems();
11976 }
11977 return item_count;
11978 }
11979
11982 {
11983 float weight = 0;
11984 float wetness = 1;
11985 if (include_wetness)
11988 {
11989 weight = wetness * m_ConfigWeight;
11990 }
11992 {
11993 weight = 1;
11994 }
11995 return weight;
11996 }
11997
11998
11999
12001 {
12002 GameInventory inventory = GetInventory();
12003 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12004 {
12005 array<EntityAI> items = new array<EntityAI>;
12007 for (int i = 0; i < items.Count(); ++i)
12008 {
12010 if (item)
12011 {
12012 g_Game.ObjectDelete(item);
12013 }
12014 }
12015 }
12016 }
12017
12018
12019
12020
12022 {
12023 float energy = 0;
12024 if (HasEnergyManager())
12025 {
12026 energy = GetCompEM().GetEnergy();
12027 }
12028 return energy;
12029 }
12030
12031
12033 {
12034 super.OnEnergyConsumed();
12035
12037 }
12038
12040 {
12041 super.OnEnergyAdded();
12042
12044 }
12045
12046
12048 {
12049 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12050 {
12052 {
12053 float energy_0to1 = GetCompEM().GetEnergy0To1();
12055 }
12056 }
12057 }
12058
12059
12061 {
12062 return ConfigGetFloat("heatIsolation");
12063 }
12064
12066 {
12068 }
12069
12071 {
12072 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12073 if (
g_Game.ConfigIsExisting(paramPath))
12074 return g_Game.ConfigGetFloat(paramPath);
12075
12076 return 0.0;
12077 }
12078
12080 {
12081 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12082 if (
g_Game.ConfigIsExisting(paramPath))
12083 return g_Game.ConfigGetFloat(paramPath);
12084
12085 return 0.0;
12086 }
12087
12088 override void SetWet(
float value,
bool allow_client =
false)
12089 {
12090 if (!IsServerCheck(allow_client))
12091 return;
12092
12095
12097
12098 m_VarWet = Math.Clamp(value, min, max);
12099
12101 {
12104 }
12105 }
12106
12107 override void AddWet(
float value)
12108 {
12110 }
12111
12113 {
12115 }
12116
12118 {
12120 }
12121
12123 {
12125 }
12126
12128 {
12130 }
12131
12133 {
12135 }
12136
12137 override void OnWetChanged(
float newVal,
float oldVal)
12138 {
12141 if (newLevel != oldLevel)
12142 {
12144 }
12145 }
12146
12148 {
12149 SetWeightDirty();
12150 }
12151
12153 {
12154 return GetWetLevelInternal(
m_VarWet);
12155 }
12156
12157
12158
12160 {
12162 }
12163
12165 {
12167 }
12168
12170 {
12172 }
12173
12175 {
12177 }
12178
12179
12180
12182 {
12183 if (ConfigIsExisting("itemModelLength"))
12184 {
12185 return ConfigGetFloat("itemModelLength");
12186 }
12187 return 0;
12188 }
12189
12191 {
12192 if (ConfigIsExisting("itemAttachOffset"))
12193 {
12194 return ConfigGetFloat("itemAttachOffset");
12195 }
12196 return 0;
12197 }
12198
12199 override void SetCleanness(
int value,
bool allow_client =
false)
12200 {
12201 if (!IsServerCheck(allow_client))
12202 return;
12203
12205
12207
12210 }
12211
12213 {
12215 }
12216
12218 {
12219 return true;
12220 }
12221
12222
12223
12224
12226 {
12228 }
12229
12231 {
12233 }
12234
12235
12236
12237
12238 override void SetColor(
int r,
int g,
int b,
int a)
12239 {
12245 }
12247 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12248 {
12253 }
12254
12256 {
12258 }
12259
12262 {
12263 int r,g,b,a;
12265 r = r/255;
12266 g = g/255;
12267 b = b/255;
12268 a = a/255;
12269 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12270 }
12271
12272
12273
12274 override void SetLiquidType(
int value,
bool allow_client =
false)
12275 {
12276 if (!IsServerCheck(allow_client))
12277 return;
12278
12283 }
12284
12286 {
12287 return ConfigGetInt("varLiquidTypeInit");
12288 }
12289
12291 {
12293 }
12294
12296 {
12298 SetFrozen(false);
12299 }
12300
12303 {
12304 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12305 }
12306
12307
12310 {
12311 PlayerBase nplayer;
12312 if (PlayerBase.CastTo(nplayer, player))
12313 {
12315 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12316 }
12317 }
12318
12319
12322 {
12323 PlayerBase nplayer;
12324 if (PlayerBase.CastTo(nplayer,player))
12325 {
12326 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12327 }
12328
12329 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12330
12331 if (HasEnergyManager())
12332 {
12333 GetCompEM().UpdatePlugState();
12334 }
12335 }
12336
12337
12339 {
12340 super.OnPlacementStarted(player);
12341
12343 }
12344
12345 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12346 {
12348 {
12349 m_AdminLog.OnPlacementComplete(player,
this);
12350 }
12351
12352 super.OnPlacementComplete(player, position, orientation);
12353 }
12354
12355
12356
12357
12358
12360 {
12362 {
12363 return true;
12364 }
12365 else
12366 {
12367 return false;
12368 }
12369 }
12370
12371
12373 {
12375 {
12377 }
12378 }
12379
12380
12382 {
12384 }
12385
12387 {
12389 }
12390
12391 override void InsertAgent(
int agent,
float count = 1)
12392 {
12393 if (count < 1)
12394 return;
12395
12397 }
12398
12401 {
12403 }
12404
12405
12407 {
12409 }
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12453 {
12455 return false;
12456 return true;
12457 }
12458
12460 {
12461
12463 }
12464
12465
12468 {
12469 super.CheckForRoofLimited(timeTresholdMS);
12470
12471 float time =
g_Game.GetTime();
12472 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12473 {
12474 m_PreviousRoofTestTime = time;
12475 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12476 }
12477 }
12478
12479
12481 {
12483 {
12484 return 0;
12485 }
12486
12487 if (GetInventory().GetAttachmentSlotsCount() != 0)
12488 {
12489 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12490 if (filter)
12491 return filter.GetProtectionLevel(type, false, system);
12492 else
12493 return 0;
12494 }
12495
12496 string subclassPath, entryName;
12497
12498 switch (type)
12499 {
12501 entryName = "biological";
12502 break;
12504 entryName = "chemical";
12505 break;
12506 default:
12507 entryName = "biological";
12508 break;
12509 }
12510
12511 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12512
12513 return g_Game.ConfigGetFloat(subclassPath + entryName);
12514 }
12515
12516
12517
12520 {
12521 if (!IsMagazine())
12523
12525 }
12526
12527
12528
12529
12530
12535 {
12536 return true;
12537 }
12538
12540 {
12542 }
12543
12544
12545
12546
12547
12549 {
12550 if (parent)
12551 {
12552 if (parent.IsInherited(DayZInfected))
12553 return true;
12554
12555 if (!parent.IsRuined())
12556 return true;
12557 }
12558
12559 return true;
12560 }
12561
12563 {
12564 if (!super.CanPutAsAttachment(parent))
12565 {
12566 return false;
12567 }
12568
12569 if (!IsRuined() && !parent.IsRuined())
12570 {
12571 return true;
12572 }
12573
12574 return false;
12575 }
12576
12578 {
12579
12580
12581
12582
12583 return super.CanReceiveItemIntoCargo(item);
12584 }
12585
12587 {
12588
12589
12590
12591
12592 GameInventory attachmentInv = attachment.GetInventory();
12594 {
12595 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12596 return false;
12597 }
12598
12599 InventoryLocation loc = new InventoryLocation();
12600 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12601 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12602 return false;
12603
12604 return super.CanReceiveAttachment(attachment, slotId);
12605 }
12606
12608 {
12609 if (!super.CanReleaseAttachment(attachment))
12610 return false;
12611
12612 return GetInventory().AreChildrenAccessible();
12613 }
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12636 {
12637 int id = muzzle_owner.GetMuzzleID();
12638 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12639
12640 if (WPOF_array)
12641 {
12642 for (int i = 0; i < WPOF_array.Count(); i++)
12643 {
12644 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12645
12646 if (WPOF)
12647 {
12648 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12649 }
12650 }
12651 }
12652 }
12653
12654
12656 {
12657 int id = muzzle_owner.GetMuzzleID();
12659
12660 if (WPOBE_array)
12661 {
12662 for (int i = 0; i < WPOBE_array.Count(); i++)
12663 {
12664 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12665
12666 if (WPOBE)
12667 {
12668 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12669 }
12670 }
12671 }
12672 }
12673
12674
12676 {
12677 int id = muzzle_owner.GetMuzzleID();
12678 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12679
12680 if (WPOOH_array)
12681 {
12682 for (int i = 0; i < WPOOH_array.Count(); i++)
12683 {
12684 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12685
12686 if (WPOOH)
12687 {
12688 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12689 }
12690 }
12691 }
12692 }
12693
12694
12696 {
12697 int id = muzzle_owner.GetMuzzleID();
12698 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12699
12700 if (WPOOH_array)
12701 {
12702 for (int i = 0; i < WPOOH_array.Count(); i++)
12703 {
12704 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12705
12706 if (WPOOH)
12707 {
12708 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12709 }
12710 }
12711 }
12712 }
12713
12714
12716 {
12717 int id = muzzle_owner.GetMuzzleID();
12718 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12719
12720 if (WPOOH_array)
12721 {
12722 for (int i = 0; i < WPOOH_array.Count(); i++)
12723 {
12724 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12725
12726 if (WPOOH)
12727 {
12728 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12729 }
12730 }
12731 }
12732 }
12733
12734
12735
12737 {
12739 {
12740 return true;
12741 }
12742
12743 return false;
12744 }
12745
12747 {
12749 {
12750 return true;
12751 }
12752
12753 return false;
12754 }
12755
12757 {
12759 {
12760 return true;
12761 }
12762
12763 return false;
12764 }
12765
12767 {
12768 return false;
12769 }
12770
12773 {
12774 return UATimeSpent.DEFAULT_DEPLOY;
12775 }
12776
12777
12778
12779
12781 {
12783 SetSynchDirty();
12784 }
12785
12787 {
12789 }
12790
12791
12793 {
12794 return false;
12795 }
12796
12799 {
12800 string att_type = "None";
12801
12802 if (ConfigIsExisting("soundAttType"))
12803 {
12804 att_type = ConfigGetString("soundAttType");
12805 }
12806
12808 }
12809
12811 {
12813 }
12814
12815
12816
12817
12818
12824
12826 {
12829
12831 }
12832
12833
12835 {
12837 return;
12838
12840
12843
12846
12847 SoundParameters params = new SoundParameters();
12851 }
12852
12853
12855 {
12857 {
12860
12861 SetSynchDirty();
12862
12865 }
12866 }
12867
12869 {
12871 }
12872
12873
12875 {
12877 return;
12878
12880 SetSynchDirty();
12881
12884 }
12885
12887 {
12890 }
12891
12893 {
12895 }
12896
12897 void OnApply(PlayerBase player);
12898
12900 {
12901 return 1.0;
12902 };
12903
12905 {
12907 }
12908
12910 {
12912 }
12913
12915
12917 {
12918 SetDynamicPhysicsLifeTime(0.01);
12920 }
12921
12923 {
12924 array<string> zone_names = new array<string>;
12925 GetDamageZones(zone_names);
12926 for (int i = 0; i < zone_names.Count(); i++)
12927 {
12928 SetHealthMax(zone_names.Get(i),"Health");
12929 }
12930 SetHealthMax("","Health");
12931 }
12932
12935 {
12936 float global_health = GetHealth01("","Health");
12937 array<string> zones = new array<string>;
12938 GetDamageZones(zones);
12939
12940 for (int i = 0; i < zones.Count(); i++)
12941 {
12942 SetHealth01(zones.Get(i),"Health",global_health);
12943 }
12944 }
12945
12948 {
12949 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12950 }
12951
12953 {
12954 if (!hasRootAsPlayer)
12955 {
12956 if (refParentIB)
12957 {
12958
12959 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12960 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12961
12962 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12963 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12964
12967 }
12968 else
12969 {
12970
12973 }
12974 }
12975 }
12976
12978 {
12980 {
12981 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12982 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12983 {
12984 float heatPermCoef = 1.0;
12986 while (ent)
12987 {
12988 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12989 ent = ent.GetHierarchyParent();
12990 }
12991
12992 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12993 }
12994 }
12995 }
12996
12998 {
12999
13000 EntityAI parent = GetHierarchyParent();
13001 if (!parent)
13002 {
13003 hasParent = false;
13004 hasRootAsPlayer = false;
13005 }
13006 else
13007 {
13008 hasParent = true;
13009 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13010 refParentIB =
ItemBase.Cast(parent);
13011 }
13012 }
13013
13014 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13015 {
13016
13017 }
13018
13020 {
13021
13022 return false;
13023 }
13024
13026 {
13027
13028
13029 return false;
13030 }
13031
13033 {
13034
13035 return false;
13036 }
13037
13040 {
13041 return !GetIsFrozen() &&
IsOpen();
13042 }
13043
13045 {
13046 bool hasParent = false, hasRootAsPlayer = false;
13048
13049 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13050 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13051
13052 if (wwtu || foodDecay)
13053 {
13057
13058 if (processWetness || processTemperature || processDecay)
13059 {
13061
13062 if (processWetness)
13063 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13064
13065 if (processTemperature)
13067
13068 if (processDecay)
13069 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13070 }
13071 }
13072 }
13073
13076 {
13078 }
13079
13081 {
13084
13085 return super.GetTemperatureFreezeThreshold();
13086 }
13087
13089 {
13092
13093 return super.GetTemperatureThawThreshold();
13094 }
13095
13097 {
13100
13101 return super.GetItemOverheatThreshold();
13102 }
13103
13105 {
13107 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13108
13109 return super.GetTemperatureFreezeTime();
13110 }
13111
13113 {
13115 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13116
13117 return super.GetTemperatureThawTime();
13118 }
13119
13124
13126 {
13127 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13128 }
13129
13131 {
13132 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13133 }
13134
13137 {
13139 }
13140
13142 {
13144 }
13145
13147 {
13149 }
13150
13153 {
13154 return null;
13155 }
13156
13159 {
13160 return false;
13161 }
13162
13164 {
13166 {
13169 if (!trg)
13170 {
13172 explosive = this;
13173 }
13174
13175 explosive.PairRemote(trg);
13177
13178 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13179 trg.SetPersistentPairID(persistentID);
13180 explosive.SetPersistentPairID(persistentID);
13181
13182 return true;
13183 }
13184 return false;
13185 }
13186
13189 {
13190 float ret = 1.0;
13193 ret *= GetHealth01();
13194
13195 return ret;
13196 }
13197
13198 #ifdef DEVELOPER
13199 override void SetDebugItem()
13200 {
13201 super.SetDebugItem();
13202 _itemBase = this;
13203 }
13204
13206 {
13207 string text = super.GetDebugText();
13208
13210 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13211
13212 return text;
13213 }
13214 #endif
13215
13217 {
13218 return true;
13219 }
13220
13222
13224
13226 {
13229 }
13230
13231
13239
13255
13256 [
Obsolete(
"Use ItemSoundHandler instead")]
13259 {
13260 if (!
g_Game.IsDedicatedServer())
13261 {
13262 if (ConfigIsExisting("attachSoundSet"))
13263 {
13264 string cfg_path = "";
13265 string soundset = "";
13266 string type_name =
GetType();
13267
13270 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13271 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13272
13273 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13274 {
13275 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13276 {
13277 if (cfg_slot_array[i] == slot_type)
13278 {
13279 soundset = cfg_soundset_array[i];
13280 break;
13281 }
13282 }
13283 }
13284
13285 if (soundset != "")
13286 {
13287 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13289 }
13290 }
13291 }
13292 }
13293
13295}
13296
13298{
13300 if (entity)
13301 {
13302 bool is_item = entity.IsInherited(
ItemBase);
13303 if (is_item && full_quantity)
13304 {
13307 }
13308 }
13309 else
13310 {
13312 return NULL;
13313 }
13314 return entity;
13315}
13316
13318{
13319 if (item)
13320 {
13321 if (health > 0)
13322 item.SetHealth("", "", health);
13323
13324 if (item.CanHaveTemperature())
13325 {
13327 if (item.CanFreeze())
13328 item.SetFrozen(false);
13329 }
13330
13331 if (item.HasEnergyManager())
13332 {
13333 if (quantity >= 0)
13334 {
13335 item.GetCompEM().SetEnergy0To1(quantity);
13336 }
13337 else
13338 {
13340 }
13341 }
13342 else if (item.IsMagazine())
13343 {
13344 Magazine mag = Magazine.Cast(item);
13345 if (quantity >= 0)
13346 {
13347 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13348 }
13349 else
13350 {
13352 }
13353
13354 }
13355 else
13356 {
13357 if (quantity >= 0)
13358 {
13359 item.SetQuantityNormalized(quantity, false);
13360 }
13361 else
13362 {
13364 }
13365
13366 }
13367 }
13368}
13369
13370#ifdef DEVELOPER
13372#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
void Obsolete(string msg="")
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
vector GetPosition()
Get the world position of the Effect.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.