8408{
8410 {
8411 return true;
8412 }
8413};
8414
8416{
8417
8418};
8419
8420
8421
8423{
8427
8429
8432
8433
8434
8435
8436
8445
8451
8456
8461
8482 protected bool m_IsResultOfSplit
8483
8485
8490
8491
8492
8494
8498
8499
8500
8502
8505
8506
8507
8513
8514
8522
8525
8526
8528
8529
8531
8532
8537
8538
8543
8545
8546
8548
8549
8551 {
8556
8557 if (!
g_Game.IsDedicatedServer())
8558 {
8560 {
8562
8564 {
8566 }
8567 }
8568
8571 }
8572
8573 m_OldLocation = null;
8574
8576 {
8578 }
8579
8580 if (ConfigIsExisting("headSelectionsToHide"))
8581 {
8584 }
8585
8587 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8588 {
8590 }
8591
8593
8594 m_IsResultOfSplit = false;
8595
8597 }
8598
8600 {
8601 super.InitItemVariables();
8602
8608 m_Count = ConfigGetInt(
"count");
8609
8612
8617
8620
8625
8637
8641
8642
8645 if (ConfigIsExisting("canBeSplit"))
8646 {
8649 }
8650
8652 if (ConfigIsExisting("itemBehaviour"))
8654
8655
8658 RegisterNetSyncVariableInt("m_VarLiquidType");
8659 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8660
8661 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8662 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8663 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8664
8665 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8666 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8667 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8668 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8669
8670 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8671 RegisterNetSyncVariableBool("m_IsTakeable");
8672 RegisterNetSyncVariableBool("m_IsHologram");
8673
8676 {
8679 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8680 }
8681
8683
8685 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8687
8689 }
8690
8692 {
8694 }
8695
8697 {
8700 {
8705 }
8706 }
8707
8708 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8709 {
8711 {
8714 }
8715
8717 }
8718
8720 {
8726 }
8727
8729
8731 {
8733
8734 if (!action)
8735 {
8736 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8737 return;
8738 }
8739
8741 if (!ai)
8742 {
8744 return;
8745 }
8746
8748 if (!action_array)
8749 {
8750 action_array = new array<ActionBase_Basic>;
8752 }
8753 if (LogManager.IsActionLogEnable())
8754 {
8755 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8756 }
8757
8758 if (action_array.Find(action) != -1)
8759 {
8760 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8761 }
8762 else
8763 {
8764 action_array.Insert(action);
8765 }
8766 }
8767
8769 {
8770 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8771 ActionBase action = player.GetActionManager().GetAction(actionName);
8774
8775 if (action_array)
8776 {
8777 action_array.RemoveItem(action);
8778 }
8779 }
8780
8781
8782
8784 {
8785 ActionOverrideData overrideData = new ActionOverrideData();
8789
8791 if (!actionMap)
8792 {
8795 }
8796
8797 actionMap.Insert(this.
Type(), overrideData);
8798
8799 }
8800
8802
8804
8805
8807 {
8810
8813
8814 string config_to_search = "CfgVehicles";
8815 string muzzle_owner_config;
8816
8818 {
8819 if (IsInherited(Weapon))
8820 config_to_search = "CfgWeapons";
8821
8822 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8823
8824 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8825
8826 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8827
8828 if (config_OnFire_subclass_count > 0)
8829 {
8830 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8831
8832 for (int i = 0; i < config_OnFire_subclass_count; i++)
8833 {
8834 string particle_class = "";
8835 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8836 string config_OnFire_entry = config_OnFire_class + particle_class;
8837 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8838 WPOF_array.Insert(WPOF);
8839 }
8840
8841
8843 }
8844 }
8845
8847 {
8848 config_to_search = "CfgWeapons";
8849 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8850
8851 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8852
8853 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8854
8855 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8856 {
8857 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8858
8859 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8860 {
8861 string particle_class2 = "";
8862 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8863 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8864 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8865 WPOBE_array.Insert(WPOBE);
8866 }
8867
8868
8870 }
8871 }
8872 }
8873
8874
8876 {
8879
8881 {
8882 string config_to_search = "CfgVehicles";
8883
8884 if (IsInherited(Weapon))
8885 config_to_search = "CfgWeapons";
8886
8887 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8888 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8889
8890 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8891 {
8892
8894
8896 {
8898 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8900 return;
8901 }
8902
8905
8906
8907
8908 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8909 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8910
8911 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8912 {
8913 string particle_class = "";
8914 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8915 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8916 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8917
8918 if (entry_type == CT_CLASS)
8919 {
8920 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8921 WPOOH_array.Insert(WPOF);
8922 }
8923 }
8924
8925
8927 }
8928 }
8929 }
8930
8932 {
8934 }
8935
8937 {
8939 {
8941
8944
8947
8948 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8949 }
8950 }
8951
8953 {
8955 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8956
8958 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8959
8961 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8962
8964 {
8966 }
8967 }
8968
8970 {
8972 }
8973
8975 {
8978 else
8980
8982 {
8985 }
8986 else
8987 {
8990
8993 }
8994
8996 }
8997
8999 {
9001 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9002 }
9003
9005 {
9007 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9009 }
9010
9012 {
9014 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9015 }
9016
9018 {
9021
9022 OverheatingParticle OP = new OverheatingParticle();
9027
9029 }
9030
9032 {
9035
9036 return -1;
9037 }
9038
9040 {
9042 {
9045
9046 for (int i = count; i > 0; --i)
9047 {
9048 int id = i - 1;
9051
9054
9055 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9056 {
9057 if (p)
9058 {
9061 }
9062 }
9063 }
9064 }
9065 }
9066
9068 {
9070 {
9072 {
9073 int id = i - 1;
9075
9076 if (OP)
9077 {
9079
9080 if (p)
9081 {
9083 }
9084
9085 delete OP;
9086 }
9087 }
9088
9091 }
9092 }
9093
9096 {
9097 return 0.0;
9098 }
9099
9100
9102 {
9103 return 250;
9104 }
9105
9107 {
9108 return 0;
9109 }
9110
9113 {
9115 return true;
9116
9117 return false;
9118 }
9119
9122 {
9125
9127 {
9129 }
9130 else
9131 {
9132
9134 }
9135
9137 }
9138
9145 {
9146 return -1;
9147 }
9148
9149
9150
9151
9153 {
9155 {
9156 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9157 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9158
9159 if (r_index >= 0)
9160 {
9161 InventoryLocation r_il = new InventoryLocation;
9162 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9163
9164 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9167 {
9168 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9169 }
9171 {
9172 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9173 }
9174
9175 }
9176
9177 player.GetHumanInventory().ClearUserReservedLocation(this);
9178 }
9179
9182 }
9183
9184
9185
9186
9188 {
9189 return ItemBase.m_DebugActionsMask;
9190 }
9191
9193 {
9194 return ItemBase.m_DebugActionsMask & mask;
9195 }
9196
9198 {
9199 ItemBase.m_DebugActionsMask = mask;
9200 }
9201
9203 {
9204 ItemBase.m_DebugActionsMask |= mask;
9205 }
9206
9208 {
9209 ItemBase.m_DebugActionsMask &= ~mask;
9210 }
9211
9213 {
9215 {
9217 }
9218 else
9219 {
9221 }
9222 }
9223
9224
9226 {
9227 if (GetEconomyProfile())
9228 {
9229 float q_max = GetEconomyProfile().GetQuantityMax();
9230 if (q_max > 0)
9231 {
9232 float q_min = GetEconomyProfile().GetQuantityMin();
9233 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9234
9236 {
9237 ComponentEnergyManager comp = GetCompEM();
9239 {
9241 }
9242 }
9244 {
9246
9247 }
9248
9249 }
9250 }
9251 }
9252
9255 {
9256 EntityAI parent = GetHierarchyParent();
9257
9258 if (parent)
9259 {
9260 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9261 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9262 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9263 }
9264 }
9265
9268 {
9269 EntityAI parent = GetHierarchyParent();
9270
9271 if (parent)
9272 {
9273 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9274 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9275 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9276 }
9277 }
9278
9280 {
9281
9282
9283
9284
9286
9288 {
9289 if (ScriptInputUserData.CanStoreInputUserData())
9290 {
9291 ScriptInputUserData ctx = new ScriptInputUserData;
9297 ctx.
Write(use_stack_max);
9300
9302 {
9303 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9304 }
9305 }
9306 }
9307 else if (!
g_Game.IsMultiplayer())
9308 {
9310 }
9311 }
9312
9314 {
9316 }
9317
9319 {
9321 }
9322
9324 {
9326 }
9327
9329 {
9330
9331 return false;
9332 }
9333
9335 {
9336 return false;
9337 }
9338
9342 {
9343 return false;
9344 }
9345
9347 {
9348 return "";
9349 }
9350
9352
9354 {
9355 return false;
9356 }
9357
9359 {
9360 return true;
9361 }
9362
9363
9364
9366 {
9367 return true;
9368 }
9369
9371 {
9372 return true;
9373 }
9374
9376 {
9377 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9379 }
9380
9382 {
9384 }
9385
9387 {
9389 if (!is_being_placed)
9391 SetSynchDirty();
9392 }
9393
9394
9396
9398 {
9400 }
9401
9403 {
9405 }
9406
9408 {
9409 return 1;
9410 }
9411
9413 {
9414 return false;
9415 }
9416
9418 {
9420 SetSynchDirty();
9421 }
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9458 {
9459 super.OnMovedInsideCargo(container);
9460
9461 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9462 }
9463
9464 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9465 {
9466 super.EEItemLocationChanged(oldLoc, newLoc);
9467
9468 PlayerBase newPlayer = null;
9469 PlayerBase oldPlayer = null;
9470
9471 if (newLoc.GetParent())
9472 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9473
9474 if (oldLoc.GetParent())
9475 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9476
9478 {
9479 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9480
9481 if (rIndex >= 0)
9482 {
9483 InventoryLocation rIl = new InventoryLocation;
9484 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9485
9486 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9489 {
9490 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9491 }
9493 {
9495 }
9496
9497 }
9498 }
9499
9501 {
9502 if (newPlayer)
9503 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9504
9505 if (newPlayer == oldPlayer)
9506 {
9507 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9508 {
9510 {
9511 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9512 {
9513 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9514 }
9515 }
9516 else
9517 {
9518 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9519 }
9520 }
9521
9522 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9523 {
9524 int type = oldLoc.GetType();
9526 {
9527 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9528 }
9530 {
9531 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9532 }
9533 }
9534 if (!m_OldLocation)
9535 {
9536 m_OldLocation = new InventoryLocation;
9537 }
9538 m_OldLocation.Copy(oldLoc);
9539 }
9540 else
9541 {
9542 if (m_OldLocation)
9543 {
9544 m_OldLocation.Reset();
9545 }
9546 }
9547
9548 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9549 }
9550 else
9551 {
9552 if (newPlayer)
9553 {
9554 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9555 if (resIndex >= 0)
9556 {
9557 InventoryLocation il = new InventoryLocation;
9558 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9560 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9563 {
9564 il.
GetParent().GetOnReleaseLock().Invoke(it);
9565 }
9567 {
9569 }
9570
9571 }
9572 }
9574 {
9575
9577 }
9578
9579 if (m_OldLocation)
9580 {
9581 m_OldLocation.Reset();
9582 }
9583 }
9584
9586 {
9587 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9588 }
9589
9591 {
9592 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9593 }
9594 }
9595
9596 override void EOnContact(IEntity other, Contact extra)
9597 {
9599 {
9600 int liquidType = -1;
9602 if (impactSpeed > 0.0)
9603 {
9605 #ifndef SERVER
9607 #else
9609 SetSynchDirty();
9610 #endif
9612 }
9613 }
9614
9615 #ifdef SERVER
9616 if (GetCompEM() && GetCompEM().IsPlugged())
9617 {
9618 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9619 GetCompEM().UnplugThis();
9620 }
9621 #endif
9622 }
9623
9625
9627 {
9629 }
9630
9632 {
9633
9634 }
9635
9637 {
9638 super.OnItemLocationChanged(old_owner, new_owner);
9639
9640 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9641 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9642
9643 if (!relatedPlayer && playerNew)
9644 relatedPlayer = playerNew;
9645
9646 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9647 {
9649 if (actionMgr)
9650 {
9651 ActionBase currentAction = actionMgr.GetRunningAction();
9652 if (currentAction)
9654 }
9655 }
9656
9657 Man ownerPlayerOld = null;
9658 Man ownerPlayerNew = null;
9659
9660 if (old_owner)
9661 {
9662 if (old_owner.
IsMan())
9663 {
9664 ownerPlayerOld = Man.Cast(old_owner);
9665 }
9666 else
9667 {
9668 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9669 }
9670 }
9671 else
9672 {
9674 {
9676
9677 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9678 {
9679 GetCompEM().UnplugThis();
9680 }
9681 }
9682 }
9683
9684 if (new_owner)
9685 {
9686 if (new_owner.
IsMan())
9687 {
9688 ownerPlayerNew = Man.Cast(new_owner);
9689 }
9690 else
9691 {
9692 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9693 }
9694 }
9695
9696 if (ownerPlayerOld != ownerPlayerNew)
9697 {
9698 if (ownerPlayerOld)
9699 {
9700 array<EntityAI> subItemsExit = new array<EntityAI>;
9702 for (int i = 0; i < subItemsExit.Count(); i++)
9703 {
9706 }
9707 }
9708
9709 if (ownerPlayerNew)
9710 {
9711 array<EntityAI> subItemsEnter = new array<EntityAI>;
9713 for (int j = 0; j < subItemsEnter.Count(); j++)
9714 {
9717 }
9718 }
9719 }
9720 else if (ownerPlayerNew != null)
9721 {
9722 PlayerBase nplayer;
9723 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9724 {
9725 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9727 for (int k = 0; k < subItemsUpdate.Count(); k++)
9728 {
9730 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9731 }
9732 }
9733 }
9734
9735 if (old_owner)
9736 old_owner.OnChildItemRemoved(this);
9737 if (new_owner)
9738 new_owner.OnChildItemReceived(this);
9739 }
9740
9741
9743 {
9744 super.EEDelete(parent);
9745 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9746 if (player)
9747 {
9749
9750 if (player.IsAlive())
9751 {
9752 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9753 if (r_index >= 0)
9754 {
9755 InventoryLocation r_il = new InventoryLocation;
9756 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9757
9758 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9761 {
9762 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9763 }
9765 {
9766 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9767 }
9768
9769 }
9770
9771 player.RemoveQuickBarEntityShortcut(this);
9772 }
9773 }
9774 }
9775
9777 {
9778 super.EEKilled(killer);
9779
9782 {
9783 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9784 {
9785 if (IsMagazine())
9786 {
9787 if (Magazine.Cast(this).GetAmmoCount() > 0)
9788 {
9790 }
9791 }
9792 else
9793 {
9795 }
9796 }
9797 }
9798 }
9799
9801 {
9802 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9803
9804 super.OnWasAttached(parent, slot_id);
9805
9808
9811 }
9812
9814 {
9815 super.OnWasDetached(parent, slot_id);
9816
9819
9822 }
9823
9825 {
9826 int idx;
9829
9830 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9831 if (inventory_slots.Count() < 1)
9832 {
9833 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9834 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9835 }
9836 else
9837 {
9838 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9839 }
9840
9841 idx = inventory_slots.Find(slot);
9842 if (idx < 0)
9843 return "";
9844
9845 return attach_types.Get(idx);
9846 }
9847
9849 {
9850 int idx = -1;
9851 string slot;
9852
9855
9856 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9857 if (inventory_slots.Count() < 1)
9858 {
9859 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9860 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9861 }
9862 else
9863 {
9864 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9865 if (detach_types.Count() < 1)
9866 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9867 }
9868
9869 for (int i = 0; i < inventory_slots.Count(); i++)
9870 {
9871 slot = inventory_slots.Get(i);
9872 }
9873
9874 if (slot != "")
9875 {
9876 if (detach_types.Count() == 1)
9877 idx = 0;
9878 else
9879 idx = inventory_slots.Find(slot);
9880 }
9881 if (idx < 0)
9882 return "";
9883
9884 return detach_types.Get(idx);
9885 }
9886
9888 {
9889
9891
9892
9893 float min_time = 1;
9894 float max_time = 3;
9895 float delay = Math.RandomFloat(min_time, max_time);
9896
9897 explode_timer.Run(delay, this, "DoAmmoExplosion");
9898 }
9899
9901 {
9902 Magazine magazine = Magazine.Cast(this);
9903 int pop_sounds_count = 6;
9904 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9905
9906
9907 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9908 string sound_name = pop_sounds[ sound_idx ];
9909 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9910
9911
9912 magazine.ServerAddAmmoCount(-1);
9913
9914
9915 float min_temp_to_explode = 100;
9916
9917 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9918 {
9920 }
9921 }
9922
9923
9924 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9925 {
9926 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9927
9928 const int CHANCE_DAMAGE_CARGO = 4;
9929 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9930 const int CHANCE_DAMAGE_NOTHING = 2;
9931
9933 {
9934 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9935 int chances;
9936 int rnd;
9937
9938 if (GetInventory().GetCargo())
9939 {
9940 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9941 rnd = Math.RandomInt(0,chances);
9942
9943 if (rnd < CHANCE_DAMAGE_CARGO)
9944 {
9946 }
9947 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9948 {
9950 }
9951 }
9952 else
9953 {
9954 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9955 rnd = Math.RandomInt(0,chances);
9956
9957 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9958 {
9960 }
9961 }
9962 }
9963 }
9964
9966 {
9967 CargoBase cargo = GetInventory().GetCargo();
9968 if (cargo)
9969 {
9971 if (item_count > 0)
9972 {
9973 int random_pick = Math.RandomInt(0, item_count);
9975 if (!item.IsExplosive())
9976 {
9977 item.AddHealth("","",damage);
9978 return true;
9979 }
9980 }
9981 }
9982 return false;
9983 }
9984
9986 {
9987 GameInventory inventory = GetInventory();
9989 if (attachment_count > 0)
9990 {
9991 int random_pick = Math.RandomInt(0, attachment_count);
9993 if (!attachment.IsExplosive())
9994 {
9995 attachment.AddHealth("","",damage);
9996 return true;
9997 }
9998 }
9999 return false;
10000 }
10001
10003 {
10005 }
10006
10008 {
10010 return GetInventory().CanRemoveEntity();
10011
10012 return false;
10013 }
10014
10016 {
10017
10019 return false;
10020
10021
10023 return false;
10024
10025
10026
10028 if (delta == 0)
10029 return false;
10030
10031
10032 return true;
10033 }
10034
10036 {
10038 {
10039 if (ScriptInputUserData.CanStoreInputUserData())
10040 {
10041 ScriptInputUserData ctx = new ScriptInputUserData;
10046 ctx.
Write(destination_entity);
10048 ctx.
Write(slot_id);
10050 }
10051 }
10052 else if (!
g_Game.IsMultiplayer())
10053 {
10055 }
10056 }
10057
10059 {
10060 float split_quantity_new;
10064 InventoryLocation loc = new InventoryLocation;
10065
10066 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10067 {
10069 split_quantity_new = stack_max;
10070 else
10072
10074 {
10075 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10076 if (new_item)
10077 {
10078 new_item.SetResultOfSplit(true);
10079 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10081 new_item.
SetQuantity(split_quantity_new,
false,
true);
10082 }
10083 }
10084 }
10085 else if (destination_entity && slot_id == -1)
10086 {
10087 if (quantity > stack_max)
10088 split_quantity_new = stack_max;
10089 else
10090 split_quantity_new = quantity;
10091
10093 {
10094 GameInventory destinationInventory = destination_entity.GetInventory();
10096 {
10099 }
10100
10101 if (new_item)
10102 {
10103 new_item.SetResultOfSplit(true);
10104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10106 new_item.
SetQuantity(split_quantity_new,
false,
true);
10107 }
10108 }
10109 }
10110 else
10111 {
10112 if (stack_max != 0)
10113 {
10115 {
10117 }
10118
10119 if (split_quantity_new == 0)
10120 {
10121 if (!
g_Game.IsMultiplayer())
10122 player.PhysicalPredictiveDropItem(this);
10123 else
10124 player.ServerDropEntity(this);
10125 return;
10126 }
10127
10129 {
10131
10132 if (new_item)
10133 {
10134 new_item.SetResultOfSplit(true);
10135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10138 new_item.PlaceOnSurface();
10139 }
10140 }
10141 }
10142 }
10143 }
10144
10146 {
10147 float split_quantity_new;
10151 InventoryLocation loc = new InventoryLocation;
10152
10153 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10154 {
10156 split_quantity_new = stack_max;
10157 else
10159
10161 {
10162 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10163 if (new_item)
10164 {
10165 new_item.SetResultOfSplit(true);
10166 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10168 new_item.
SetQuantity(split_quantity_new,
false,
true);
10169 }
10170 }
10171 }
10172 else if (destination_entity && slot_id == -1)
10173 {
10174 if (quantity > stack_max)
10175 split_quantity_new = stack_max;
10176 else
10177 split_quantity_new = quantity;
10178
10180 {
10181 GameInventory destinationInventory = destination_entity.GetInventory();
10183 {
10186 }
10187
10188 if (new_item)
10189 {
10190 new_item.SetResultOfSplit(true);
10191 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10193 new_item.
SetQuantity(split_quantity_new,
false,
true);
10194 }
10195 }
10196 }
10197 else
10198 {
10199 if (stack_max != 0)
10200 {
10202 {
10204 }
10205
10207 {
10209
10210 if (new_item)
10211 {
10212 new_item.SetResultOfSplit(true);
10213 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10216 new_item.PlaceOnSurface();
10217 }
10218 }
10219 }
10220 }
10221 }
10222
10224 {
10226 {
10227 if (ScriptInputUserData.CanStoreInputUserData())
10228 {
10229 ScriptInputUserData ctx = new ScriptInputUserData;
10234 dst.WriteToContext(ctx);
10236 }
10237 }
10238 else if (!
g_Game.IsMultiplayer())
10239 {
10241 }
10242 }
10243
10245 {
10247 {
10248 if (ScriptInputUserData.CanStoreInputUserData())
10249 {
10250 ScriptInputUserData ctx = new ScriptInputUserData;
10255 ctx.
Write(destination_entity);
10261 }
10262 }
10263 else if (!
g_Game.IsMultiplayer())
10264 {
10266 }
10267 }
10268
10270 {
10272 }
10273
10275 {
10277 float split_quantity_new;
10279 if (dst.IsValid())
10280 {
10281 int slot_id = dst.GetSlot();
10283
10284 if (quantity > stack_max)
10285 split_quantity_new = stack_max;
10286 else
10287 split_quantity_new = quantity;
10288
10290 {
10292
10293 if (new_item)
10294 {
10295 new_item.SetResultOfSplit(true);
10296 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10298 new_item.
SetQuantity(split_quantity_new,
false,
true);
10299 }
10300
10301 return new_item;
10302 }
10303 }
10304
10305 return null;
10306 }
10307
10309 {
10311 float split_quantity_new;
10313 if (destination_entity)
10314 {
10316 if (quantity > stackable)
10317 split_quantity_new = stackable;
10318 else
10319 split_quantity_new = quantity;
10320
10322 {
10323 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10324 if (new_item)
10325 {
10326 new_item.SetResultOfSplit(true);
10327 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10329 new_item.
SetQuantity(split_quantity_new,
false,
true);
10330 }
10331 }
10332 }
10333 }
10334
10336 {
10338 {
10339 if (ScriptInputUserData.CanStoreInputUserData())
10340 {
10341 ScriptInputUserData ctx = new ScriptInputUserData;
10346 ItemBase destination_entity =
this;
10347 ctx.
Write(destination_entity);
10351 }
10352 }
10353 else if (!
g_Game.IsMultiplayer())
10354 {
10356 }
10357 }
10358
10360 {
10362 float split_quantity_new;
10364 if (player)
10365 {
10367 if (quantity > stackable)
10368 split_quantity_new = stackable;
10369 else
10370 split_quantity_new = quantity;
10371
10373 {
10374 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10375 new_item =
ItemBase.Cast(in_hands);
10376 if (new_item)
10377 {
10378 new_item.SetResultOfSplit(true);
10379 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10381 new_item.SetQuantity(split_quantity_new, false, true);
10382 }
10383 }
10384 }
10385 }
10386
10388 {
10390 float split_quantity_new = Math.Floor(quantity * 0.5);
10391
10393 return;
10394
10396
10397 if (new_item)
10398 {
10399 if (new_item.GetQuantityMax() < split_quantity_new)
10400 {
10401 split_quantity_new = new_item.GetQuantityMax();
10402 }
10403
10404 new_item.SetResultOfSplit(true);
10405 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10406
10408 {
10411 }
10412 else
10413 {
10415 new_item.
SetQuantity(split_quantity_new,
false,
true);
10416 }
10417 }
10418 }
10419
10421 {
10423 float split_quantity_new = Math.Floor(quantity / 2);
10424
10426 return;
10427
10428 InventoryLocation invloc = new InventoryLocation;
10430
10432 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10433
10434 if (new_item)
10435 {
10436 if (new_item.GetQuantityMax() < split_quantity_new)
10437 {
10438 split_quantity_new = new_item.GetQuantityMax();
10439 }
10441 {
10444 }
10445 else if (split_quantity_new > 1)
10446 {
10448 new_item.
SetQuantity(split_quantity_new,
false,
true);
10449 }
10450 }
10451 }
10452
10455 {
10456 SetWeightDirty();
10458
10459 if (parent)
10460 parent.OnAttachmentQuantityChangedEx(this, delta);
10461
10463 {
10465 {
10467 }
10469 {
10470 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10472 }
10473 }
10474 }
10475
10478 {
10479
10480 }
10481
10484 {
10486 }
10487
10489 {
10490 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10491
10493 {
10494 if (newLevel == GameConstants.STATE_RUINED)
10495 {
10497 EntityAI parent = GetHierarchyParent();
10498 if (parent && parent.IsFireplace())
10499 {
10500 CargoBase cargo = GetInventory().GetCargo();
10501 if (cargo)
10502 {
10504 {
10506 }
10507 }
10508 }
10509 }
10510
10512 {
10513
10515 return;
10516 }
10517
10518 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10519 {
10521 }
10522 }
10523 }
10524
10525
10527 {
10528 super.OnRightClick();
10529
10531 {
10533 {
10534 if (ScriptInputUserData.CanStoreInputUserData())
10535 {
10536 EntityAI root = GetHierarchyRoot();
10537 Man playerOwner = GetHierarchyRootPlayer();
10538 InventoryLocation dst = new InventoryLocation;
10539
10540
10541 if (!playerOwner && root && root == this)
10542 {
10544 }
10545 else
10546 {
10547
10548 GetInventory().GetCurrentInventoryLocation(dst);
10550 {
10551 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10553 {
10555 }
10556 else
10557 {
10559
10560
10561 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10562 {
10564 }
10565 else
10566 {
10567 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10568 }
10569 }
10570 }
10571 }
10572
10573 ScriptInputUserData ctx = new ScriptInputUserData;
10581 }
10582 }
10583 else if (!
g_Game.IsMultiplayer())
10584 {
10586 }
10587 }
10588 }
10589
10591 {
10592 if (root)
10593 {
10594 vector m4[4];
10595 root.GetTransform(m4);
10596 dst.SetGround(this, m4);
10597 }
10598 else
10599 {
10600 GetInventory().GetCurrentInventoryLocation(dst);
10601 }
10602 }
10603
10604 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10605 {
10606
10607 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10608 return false;
10609
10610 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10611 return false;
10612
10613
10615 return false;
10616
10617
10618 Magazine mag = Magazine.Cast(this);
10619 if (mag)
10620 {
10621 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10622 return false;
10623
10624 if (stack_max_limit)
10625 {
10626 Magazine other_mag = Magazine.Cast(other_item);
10627 if (other_item)
10628 {
10629 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10630 return false;
10631 }
10632
10633 }
10634 }
10635 else
10636 {
10637
10639 return false;
10640
10642 return false;
10643 }
10644
10645 PlayerBase player = null;
10646 if (CastTo(player, GetHierarchyRootPlayer()))
10647 {
10648 if (player.GetInventory().HasAttachment(this))
10649 return false;
10650
10651 if (player.IsItemsToDelete())
10652 return false;
10653 }
10654
10655 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10656 return false;
10657
10658 int slotID;
10660 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10661 return false;
10662
10663 return true;
10664 }
10665
10667 {
10669 }
10670
10672 {
10673 return m_IsResultOfSplit;
10674 }
10675
10677 {
10678 m_IsResultOfSplit = value;
10679 }
10680
10682 {
10684 }
10685
10687 {
10688 float other_item_quantity = other_item.GetQuantity();
10689 float this_free_space;
10690
10692
10694
10695 if (other_item_quantity > this_free_space)
10696 {
10697 return this_free_space;
10698 }
10699 else
10700 {
10701 return other_item_quantity;
10702 }
10703 }
10704
10706 {
10708 }
10709
10711 {
10713 return;
10714
10715 if (!IsMagazine() && other_item)
10716 {
10718 if (quantity_used != 0)
10719 {
10720 float hp1 = GetHealth01("","");
10721 float hp2 = other_item.GetHealth01("","");
10722 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10723 hpResult = hpResult / (
GetQuantity() + quantity_used);
10724
10725 hpResult *= GetMaxHealth();
10726 Math.Round(hpResult);
10727 SetHealth("", "Health", hpResult);
10728
10730 other_item.AddQuantity(-quantity_used);
10731 }
10732 }
10734 }
10735
10737 {
10738 #ifdef SERVER
10739 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10740 GetHierarchyParent().IncreaseLifetimeUp();
10741 #endif
10742 };
10743
10745 {
10746 PlayerBase p = PlayerBase.Cast(player);
10747
10748 array<int> recipesIds = p.m_Recipes;
10749 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10750 if (moduleRecipesManager)
10751 {
10752 EntityAI itemInHands = player.GetEntityInHands();
10753 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10754 }
10755
10756 for (int i = 0;i < recipesIds.Count(); i++)
10757 {
10758 int key = recipesIds.Get(i);
10759 string recipeName = moduleRecipesManager.GetRecipeName(key);
10761 }
10762 }
10763
10764
10765 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10766 {
10767 super.GetDebugActions(outputList);
10768
10769
10775
10776
10781
10786
10787
10791
10792
10794 {
10798 }
10799
10802
10803
10807
10809
10810 InventoryLocation loc = new InventoryLocation();
10811 GetInventory().GetCurrentInventoryLocation(loc);
10813 {
10814 if (Gizmo_IsSupported())
10817 }
10818
10820 }
10821
10822
10823
10824
10826 {
10827 super.OnAction(action_id, player, ctx);
10828
10830 {
10831 switch (action_id)
10832 {
10836 return true;
10840 return true;
10841 }
10842 }
10843
10845 {
10846 switch (action_id)
10847 {
10849 Delete();
10850 return true;
10851 }
10852 }
10853
10854 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10855 {
10856 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10857 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10858 PlayerBase p = PlayerBase.Cast(player);
10859 if (
EActions.RECIPES_RANGE_START < 1000)
10860 {
10861 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10862 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10863 }
10864 }
10865 #ifndef SERVER
10866 else if (action_id ==
EActions.WATCH_PLAYER)
10867 {
10868 PluginDeveloper.SetDeveloperItemClientEx(player);
10869 }
10870 #endif
10872 {
10873 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10874 {
10875 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10876 OnDebugButtonPressServer(id + 1);
10877 }
10878
10879 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10880 {
10881 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10883 }
10884
10885 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10886 {
10887 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10889 }
10890
10891 else if (action_id ==
EActions.ADD_QUANTITY)
10892 {
10893 if (IsMagazine())
10894 {
10895 Magazine mag = Magazine.Cast(this);
10896 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10897 }
10898 else
10899 {
10901 }
10902
10903 if (m_EM)
10904 {
10905 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10906 }
10907
10908 }
10909
10910 else if (action_id ==
EActions.REMOVE_QUANTITY)
10911 {
10912 if (IsMagazine())
10913 {
10914 Magazine mag2 = Magazine.Cast(this);
10915 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10916 }
10917 else
10918 {
10920 }
10921 if (m_EM)
10922 {
10923 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10924 }
10925
10926 }
10927
10928 else if (action_id ==
EActions.SET_QUANTITY_0)
10929 {
10931
10932 if (m_EM)
10933 {
10934 m_EM.SetEnergy(0);
10935 }
10936 }
10937
10938 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10939 {
10941
10942 if (m_EM)
10943 {
10944 m_EM.SetEnergy(m_EM.GetEnergyMax());
10945 }
10946 }
10947
10948 else if (action_id ==
EActions.ADD_HEALTH)
10949 {
10950 AddHealth("","",GetMaxHealth("","Health")/5);
10951 }
10952 else if (action_id ==
EActions.REMOVE_HEALTH)
10953 {
10954 AddHealth("","",-GetMaxHealth("","Health")/5);
10955 }
10956 else if (action_id ==
EActions.DESTROY_HEALTH)
10957 {
10958 SetHealth01("","",0);
10959 }
10960 else if (action_id ==
EActions.WATCH_ITEM)
10961 {
10963 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10964 #ifdef DEVELOPER
10965 SetDebugDeveloper_item(this);
10966 #endif
10967 }
10968
10969 else if (action_id ==
EActions.ADD_TEMPERATURE)
10970 {
10971 AddTemperature(20);
10972
10973 }
10974
10975 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10976 {
10977 AddTemperature(-20);
10978
10979 }
10980
10981 else if (action_id ==
EActions.FLIP_FROZEN)
10982 {
10983 SetFrozen(!GetIsFrozen());
10984
10985 }
10986
10987 else if (action_id ==
EActions.ADD_WETNESS)
10988 {
10990
10991 }
10992
10993 else if (action_id ==
EActions.REMOVE_WETNESS)
10994 {
10996
10997 }
10998
10999 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11000 {
11003
11004
11005 }
11006
11007 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11008 {
11011 }
11012
11013 else if (action_id ==
EActions.MAKE_SPECIAL)
11014 {
11015 auto debugParams = DebugSpawnParams.WithPlayer(player);
11016 OnDebugSpawnEx(debugParams);
11017 }
11018
11019 }
11020
11021
11022 return false;
11023 }
11024
11025
11026
11027
11031
11034
11035
11036
11038 {
11039 return false;
11040 }
11041
11042
11044 {
11045 return true;
11046 }
11047
11048
11050 {
11051 return true;
11052 }
11053
11054
11055
11057 {
11058 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11059 return g_Game.ConfigIsExisting(config_path);
11060 }
11061
11064 {
11065 return null;
11066 }
11067
11069 {
11070 return false;
11071 }
11072
11074 {
11075 return false;
11076 }
11077
11081
11082
11084 {
11085 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11086 return module_repairing.CanRepair(this, item_repair_kit);
11087 }
11088
11089
11090 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11091 {
11092 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11093 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11094 }
11095
11096
11098 {
11099
11100
11101
11102
11103
11104
11105
11106
11107 return 1;
11108 }
11109
11110
11111
11113 {
11115 }
11116
11117
11118
11120 {
11122 }
11123
11124
11133 {
11134 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11135
11136 if (player)
11137 {
11138 player.MessageStatus(text);
11139 }
11140 }
11141
11142
11151 {
11152 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11153
11154 if (player)
11155 {
11156 player.MessageAction(text);
11157 }
11158 }
11159
11160
11169 {
11170 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11171
11172 if (player)
11173 {
11174 player.MessageFriendly(text);
11175 }
11176 }
11177
11178
11187 {
11188 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11189
11190 if (player)
11191 {
11192 player.MessageImportant(text);
11193 }
11194 }
11195
11197 {
11198 return true;
11199 }
11200
11201
11202 override bool KindOf(
string tag)
11203 {
11204 bool found = false;
11205 string item_name = this.
GetType();
11207 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11208
11209 int array_size = item_tag_array.Count();
11210 for (int i = 0; i < array_size; i++)
11211 {
11212 if (item_tag_array.Get(i) == tag)
11213 {
11214 found = true;
11215 break;
11216 }
11217 }
11218 return found;
11219 }
11220
11221
11223 {
11224
11225 super.OnRPC(sender, rpc_type,ctx);
11226
11227
11228 switch (rpc_type)
11229 {
11230 #ifndef SERVER
11231 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11232 Param2<bool, string> p = new Param2<bool, string>(false, "");
11233
11235 return;
11236
11237 bool play = p.param1;
11238 string soundSet = p.param2;
11239
11240 if (play)
11241 {
11243 {
11245 {
11247 }
11248 }
11249 else
11250 {
11252 }
11253 }
11254 else
11255 {
11257 }
11258
11259 break;
11260 #endif
11261
11262 }
11263
11265 {
11267 }
11268 }
11269
11270
11271
11272
11274 {
11275 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11276 return plugin.GetID(
name);
11277 }
11278
11280 {
11281 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11282 return plugin.GetName(id);
11283 }
11284
11287 {
11288
11289
11290 int varFlags;
11291 if (!ctx.
Read(varFlags))
11292 return;
11293
11294 if (varFlags & ItemVariableFlags.FLOAT)
11295 {
11297 }
11298 }
11299
11301 {
11302
11303 super.SerializeNumericalVars(floats_out);
11304
11305
11306
11308 {
11310 }
11311
11313 {
11315 }
11316
11318 {
11320 }
11321
11323 {
11328 }
11329
11331 {
11333 }
11334 }
11335
11337 {
11338
11339 super.DeSerializeNumericalVars(floats);
11340
11341
11342 int index = 0;
11343 int mask = Math.Round(floats.Get(index));
11344
11345 index++;
11346
11348 {
11350 {
11352 }
11353 else
11354 {
11355 float quantity = floats.Get(index);
11356 SetQuantity(quantity,
true,
false,
false,
false);
11357 }
11358 index++;
11359 }
11360
11362 {
11363 float wet = floats.Get(index);
11365 index++;
11366 }
11367
11369 {
11370 int liquidtype = Math.Round(floats.Get(index));
11372 index++;
11373 }
11374
11376 {
11378 index++;
11380 index++;
11382 index++;
11384 index++;
11385 }
11386
11388 {
11389 int cleanness = Math.Round(floats.Get(index));
11391 index++;
11392 }
11393 }
11394
11396 {
11397 super.WriteVarsToCTX(ctx);
11398
11399
11401 {
11403 }
11404
11406 {
11408 }
11409
11411 {
11413 }
11414
11416 {
11417 int r,g,b,a;
11423 }
11424
11426 {
11428 }
11429 }
11430
11432 {
11433 if (!super.ReadVarsFromCTX(ctx,version))
11434 return false;
11435
11436 int intValue;
11437 float value;
11438
11439 if (version < 140)
11440 {
11441 if (!ctx.
Read(intValue))
11442 return false;
11443
11444 m_VariablesMask = intValue;
11445 }
11446
11448 {
11449 if (!ctx.
Read(value))
11450 return false;
11451
11453 {
11455 }
11456 else
11457 {
11459 }
11460 }
11461
11462 if (version < 140)
11463 {
11465 {
11466 if (!ctx.
Read(value))
11467 return false;
11468 SetTemperatureDirect(value);
11469 }
11470 }
11471
11473 {
11474 if (!ctx.
Read(value))
11475 return false;
11477 }
11478
11480 {
11481 if (!ctx.
Read(intValue))
11482 return false;
11484 }
11485
11487 {
11488 int r,g,b,a;
11490 return false;
11492 return false;
11494 return false;
11496 return false;
11497
11499 }
11500
11502 {
11503 if (!ctx.
Read(intValue))
11504 return false;
11506 }
11507
11508 if (version >= 138 && version < 140)
11509 {
11511 {
11512 if (!ctx.
Read(intValue))
11513 return false;
11514 SetFrozen(intValue);
11515 }
11516 }
11517
11518 return true;
11519 }
11520
11521
11523 {
11526 {
11528 }
11529
11530 if (!super.OnStoreLoad(ctx, version))
11531 {
11533 return false;
11534 }
11535
11536 if (version >= 114)
11537 {
11538 bool hasQuickBarIndexSaved;
11539
11540 if (!ctx.
Read(hasQuickBarIndexSaved))
11541 {
11543 return false;
11544 }
11545
11546 if (hasQuickBarIndexSaved)
11547 {
11548 int itmQBIndex;
11549
11550
11551 if (!ctx.
Read(itmQBIndex))
11552 {
11554 return false;
11555 }
11556
11557 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11558 if (itmQBIndex != -1 && parentPlayer)
11559 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11560 }
11561 }
11562 else
11563 {
11564
11565 PlayerBase player;
11566 int itemQBIndex;
11567 if (version ==
int.
MAX)
11568 {
11569 if (!ctx.
Read(itemQBIndex))
11570 {
11572 return false;
11573 }
11574 }
11575 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11576 {
11577
11578 if (!ctx.
Read(itemQBIndex))
11579 {
11581 return false;
11582 }
11583 if (itemQBIndex != -1 && player)
11584 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11585 }
11586 }
11587
11588 if (version < 140)
11589 {
11590
11591 if (!LoadVariables(ctx, version))
11592 {
11594 return false;
11595 }
11596 }
11597
11598
11600 {
11602 return false;
11603 }
11604 if (version >= 132)
11605 {
11607 if (raib)
11608 {
11610 {
11612 return false;
11613 }
11614 }
11615 }
11616
11618 return true;
11619 }
11620
11621
11622
11624 {
11625 super.OnStoreSave(ctx);
11626
11627 PlayerBase player;
11628 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11629 {
11631
11632 int itemQBIndex = -1;
11633 itemQBIndex = player.FindQuickBarEntityIndex(this);
11634 ctx.
Write(itemQBIndex);
11635 }
11636 else
11637 {
11639 }
11640
11642
11644 if (raib)
11645 {
11647 }
11648 }
11649
11650
11652 {
11653 super.AfterStoreLoad();
11654
11656 {
11658 }
11659
11661 {
11664 }
11665 }
11666
11668 {
11669 super.EEOnAfterLoad();
11670
11672 {
11674 }
11675
11678 }
11679
11681 {
11682 return false;
11683 }
11684
11685
11686
11688 {
11690 {
11691 #ifdef PLATFORM_CONSOLE
11692
11694 {
11696 if (menu)
11697 {
11699 }
11700 }
11701 #endif
11702 }
11703
11705 {
11708 }
11709
11711 {
11712 SetWeightDirty();
11714 }
11716 {
11719 }
11720
11722 {
11725
11728 }
11730 {
11734 }
11735
11736 super.OnVariablesSynchronized();
11737 }
11738
11739
11740
11742 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11743 {
11744 if (!IsServerCheck(allow_client))
11745 return false;
11746
11748 return false;
11749
11752
11753 if (value <= (min + 0.001))
11754 value = min;
11755
11756 if (value == min)
11757 {
11758 if (destroy_config)
11759 {
11760 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11761 if (dstr)
11762 {
11764 this.Delete();
11765 return true;
11766 }
11767 }
11768 else if (destroy_forced)
11769 {
11771 this.Delete();
11772 return true;
11773 }
11774
11776 }
11777
11780
11782 {
11783 EntityAI parent = GetHierarchyRoot();
11784 InventoryLocation iLoc = new InventoryLocation();
11785 GetInventory().GetCurrentInventoryLocation(iLoc);
11787 {
11788 int iLocSlot = iLoc.
GetSlot();
11790 {
11792 }
11794 {
11796 }
11797 }
11798 }
11799
11801 {
11803
11804 if (delta)
11806 }
11807
11809
11810 return false;
11811 }
11812
11813
11815 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11816 {
11818 }
11819
11821 {
11824 }
11825
11827 {
11830 }
11831
11833 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11834 {
11835 float value_clamped = Math.Clamp(value, 0, 1);
11837 SetQuantity(result, destroy_config, destroy_forced);
11838 }
11839
11840
11843 {
11845 }
11846
11848 {
11850 }
11851
11852
11853
11854
11855
11856
11857
11858
11859
11860
11862 {
11863 int slot = -1;
11864 GameInventory inventory = GetInventory();
11865 if (inventory)
11866 {
11867 InventoryLocation il = new InventoryLocation;
11870 }
11871
11873 }
11874
11876 {
11877 float quantity_max = 0;
11878
11880 {
11881 if (attSlotID != -1)
11882 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11883
11884 if (quantity_max <= 0)
11886 }
11887
11888 if (quantity_max <= 0)
11890
11891 return quantity_max;
11892 }
11893
11895 {
11897 }
11898
11900 {
11902 }
11903
11904
11906 {
11908 }
11909
11911 {
11913 }
11914
11916 {
11918 }
11919
11920
11922 {
11923
11924 float weightEx = GetWeightEx();
11925 float special = GetInventoryAndCargoWeight();
11926 return weightEx - special;
11927 }
11928
11929
11931 {
11933 }
11934
11936 {
11938 {
11939 #ifdef DEVELOPER
11940 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11941 {
11942 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11944 }
11945 #endif
11946
11947 return GetQuantity() * GetConfigWeightModified();
11948 }
11949 else if (HasEnergyManager())
11950 {
11951 #ifdef DEVELOPER
11952 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11953 {
11954 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11955 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11956 }
11957 #endif
11958 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11959 }
11960 else
11961 {
11962 #ifdef DEVELOPER
11963 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11964 {
11965 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11966 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11967 }
11968 #endif
11969 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11970 }
11971 }
11972
11975 {
11976 int item_count = 0;
11978
11979 GameInventory inventory = GetInventory();
11980 CargoBase cargo = inventory.
GetCargo();
11981 if (cargo != NULL)
11982 {
11984 }
11985
11987 for (int i = 0; i < nAttachments; ++i)
11988 {
11990 if (item)
11991 item_count += item.GetNumberOfItems();
11992 }
11993 return item_count;
11994 }
11995
11998 {
11999 float weight = 0;
12000 float wetness = 1;
12001 if (include_wetness)
12004 {
12005 weight = wetness * m_ConfigWeight;
12006 }
12008 {
12009 weight = 1;
12010 }
12011 return weight;
12012 }
12013
12014
12015
12017 {
12018 GameInventory inventory = GetInventory();
12019 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12020 {
12021 array<EntityAI> items = new array<EntityAI>;
12023 for (int i = 0; i < items.Count(); ++i)
12024 {
12026 if (item)
12027 {
12028 g_Game.ObjectDelete(item);
12029 }
12030 }
12031 }
12032 }
12033
12034
12035
12036
12038 {
12039 float energy = 0;
12040 if (HasEnergyManager())
12041 {
12042 energy = GetCompEM().GetEnergy();
12043 }
12044 return energy;
12045 }
12046
12047
12049 {
12050 super.OnEnergyConsumed();
12051
12053 }
12054
12056 {
12057 super.OnEnergyAdded();
12058
12060 }
12061
12062
12064 {
12065 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12066 {
12068 {
12069 float energy_0to1 = GetCompEM().GetEnergy0To1();
12071 }
12072 }
12073 }
12074
12075
12077 {
12078 return ConfigGetFloat("heatIsolation");
12079 }
12080
12082 {
12084 }
12085
12087 {
12088 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12089 if (
g_Game.ConfigIsExisting(paramPath))
12090 return g_Game.ConfigGetFloat(paramPath);
12091
12092 return 0.0;
12093 }
12094
12096 {
12097 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12098 if (
g_Game.ConfigIsExisting(paramPath))
12099 return g_Game.ConfigGetFloat(paramPath);
12100
12101 return 0.0;
12102 }
12103
12104 override void SetWet(
float value,
bool allow_client =
false)
12105 {
12106 if (!IsServerCheck(allow_client))
12107 return;
12108
12111
12113
12114 m_VarWet = Math.Clamp(value, min, max);
12115
12117 {
12120 }
12121 }
12122
12123 override void AddWet(
float value)
12124 {
12126 }
12127
12129 {
12131 }
12132
12134 {
12136 }
12137
12139 {
12141 }
12142
12144 {
12146 }
12147
12149 {
12151 }
12152
12153 override void OnWetChanged(
float newVal,
float oldVal)
12154 {
12157 if (newLevel != oldLevel)
12158 {
12160 }
12161 }
12162
12164 {
12165 SetWeightDirty();
12166 }
12167
12169 {
12170 return GetWetLevelInternal(
m_VarWet);
12171 }
12172
12173
12174
12176 {
12178 }
12179
12181 {
12183 }
12184
12186 {
12188 }
12189
12191 {
12193 }
12194
12195
12196
12198 {
12199 if (ConfigIsExisting("itemModelLength"))
12200 {
12201 return ConfigGetFloat("itemModelLength");
12202 }
12203 return 0;
12204 }
12205
12207 {
12208 if (ConfigIsExisting("itemAttachOffset"))
12209 {
12210 return ConfigGetFloat("itemAttachOffset");
12211 }
12212 return 0;
12213 }
12214
12215 override void SetCleanness(
int value,
bool allow_client =
false)
12216 {
12217 if (!IsServerCheck(allow_client))
12218 return;
12219
12221
12223
12226 }
12227
12229 {
12231 }
12232
12234 {
12235 return true;
12236 }
12237
12238
12239
12240
12242 {
12244 }
12245
12247 {
12249 }
12250
12251
12252
12253
12254 override void SetColor(
int r,
int g,
int b,
int a)
12255 {
12261 }
12263 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12264 {
12269 }
12270
12272 {
12274 }
12275
12278 {
12279 int r,g,b,a;
12281 r = r/255;
12282 g = g/255;
12283 b = b/255;
12284 a = a/255;
12285 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12286 }
12287
12288
12289
12290 override void SetLiquidType(
int value,
bool allow_client =
false)
12291 {
12292 if (!IsServerCheck(allow_client))
12293 return;
12294
12299 }
12300
12302 {
12303 return ConfigGetInt("varLiquidTypeInit");
12304 }
12305
12307 {
12309 }
12310
12312 {
12314 SetFrozen(false);
12315 }
12316
12319 {
12320 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12321 }
12322
12323
12326 {
12327 PlayerBase nplayer;
12328 if (PlayerBase.CastTo(nplayer, player))
12329 {
12331 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12332 }
12333 }
12334
12335
12338 {
12339 PlayerBase nplayer;
12340 if (PlayerBase.CastTo(nplayer,player))
12341 {
12342 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12343 }
12344
12345 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12346
12347 if (HasEnergyManager())
12348 {
12349 GetCompEM().UpdatePlugState();
12350 }
12351 }
12352
12353
12355 {
12356 super.OnPlacementStarted(player);
12357
12359 }
12360
12361 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12362 {
12364 {
12365 m_AdminLog.OnPlacementComplete(player,
this);
12366 }
12367
12368 super.OnPlacementComplete(player, position, orientation);
12369 }
12370
12371
12372
12373
12374
12376 {
12378 {
12379 return true;
12380 }
12381 else
12382 {
12383 return false;
12384 }
12385 }
12386
12387
12389 {
12391 {
12393 }
12394 }
12395
12396
12398 {
12400 }
12401
12403 {
12405 }
12406
12407 override void InsertAgent(
int agent,
float count = 1)
12408 {
12409 if (count < 1)
12410 return;
12411
12413 }
12414
12417 {
12419 }
12420
12421
12423 {
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
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12469 {
12471 return false;
12472 return true;
12473 }
12474
12476 {
12477
12479 }
12480
12481
12484 {
12485 super.CheckForRoofLimited(timeTresholdMS);
12486
12487 float time =
g_Game.GetTime();
12488 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12489 {
12490 m_PreviousRoofTestTime = time;
12491 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12492 }
12493 }
12494
12495
12497 {
12499 {
12500 return 0;
12501 }
12502
12503 if (GetInventory().GetAttachmentSlotsCount() != 0)
12504 {
12505 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12506 if (filter)
12507 return filter.GetProtectionLevel(type, false, system);
12508 else
12509 return 0;
12510 }
12511
12512 string subclassPath, entryName;
12513
12514 switch (type)
12515 {
12517 entryName = "biological";
12518 break;
12520 entryName = "chemical";
12521 break;
12522 default:
12523 entryName = "biological";
12524 break;
12525 }
12526
12527 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12528
12529 return g_Game.ConfigGetFloat(subclassPath + entryName);
12530 }
12531
12532
12533
12536 {
12537 if (!IsMagazine())
12539
12541 }
12542
12543
12544
12545
12546
12551 {
12552 return true;
12553 }
12554
12556 {
12558 }
12559
12560
12561
12562
12563
12565 {
12566 if (parent)
12567 {
12568 if (parent.IsInherited(DayZInfected))
12569 return true;
12570
12571 if (!parent.IsRuined())
12572 return true;
12573 }
12574
12575 return true;
12576 }
12577
12579 {
12580 if (!super.CanPutAsAttachment(parent))
12581 {
12582 return false;
12583 }
12584
12585 if (!IsRuined() && !parent.IsRuined())
12586 {
12587 return true;
12588 }
12589
12590 return false;
12591 }
12592
12594 {
12595
12596
12597
12598
12599 return super.CanReceiveItemIntoCargo(item);
12600 }
12601
12603 {
12604
12605
12606
12607
12608 GameInventory attachmentInv = attachment.GetInventory();
12610 {
12611 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12612 return false;
12613 }
12614
12615 InventoryLocation loc = new InventoryLocation();
12616 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12617 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12618 return false;
12619
12620 return super.CanReceiveAttachment(attachment, slotId);
12621 }
12622
12624 {
12625 if (!super.CanReleaseAttachment(attachment))
12626 return false;
12627
12628 return GetInventory().AreChildrenAccessible();
12629 }
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12652 {
12653 int id = muzzle_owner.GetMuzzleID();
12654 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12655
12656 if (WPOF_array)
12657 {
12658 for (int i = 0; i < WPOF_array.Count(); i++)
12659 {
12660 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12661
12662 if (WPOF)
12663 {
12664 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12665 }
12666 }
12667 }
12668 }
12669
12670
12672 {
12673 int id = muzzle_owner.GetMuzzleID();
12675
12676 if (WPOBE_array)
12677 {
12678 for (int i = 0; i < WPOBE_array.Count(); i++)
12679 {
12680 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12681
12682 if (WPOBE)
12683 {
12684 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12685 }
12686 }
12687 }
12688 }
12689
12690
12692 {
12693 int id = muzzle_owner.GetMuzzleID();
12694 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12695
12696 if (WPOOH_array)
12697 {
12698 for (int i = 0; i < WPOOH_array.Count(); i++)
12699 {
12700 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12701
12702 if (WPOOH)
12703 {
12704 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12705 }
12706 }
12707 }
12708 }
12709
12710
12712 {
12713 int id = muzzle_owner.GetMuzzleID();
12714 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12715
12716 if (WPOOH_array)
12717 {
12718 for (int i = 0; i < WPOOH_array.Count(); i++)
12719 {
12720 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12721
12722 if (WPOOH)
12723 {
12724 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12725 }
12726 }
12727 }
12728 }
12729
12730
12732 {
12733 int id = muzzle_owner.GetMuzzleID();
12734 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12735
12736 if (WPOOH_array)
12737 {
12738 for (int i = 0; i < WPOOH_array.Count(); i++)
12739 {
12740 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12741
12742 if (WPOOH)
12743 {
12744 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12745 }
12746 }
12747 }
12748 }
12749
12750
12751
12753 {
12755 {
12756 return true;
12757 }
12758
12759 return false;
12760 }
12761
12763 {
12765 {
12766 return true;
12767 }
12768
12769 return false;
12770 }
12771
12773 {
12775 {
12776 return true;
12777 }
12778
12779 return false;
12780 }
12781
12783 {
12784 return false;
12785 }
12786
12789 {
12790 return UATimeSpent.DEFAULT_DEPLOY;
12791 }
12792
12793
12794
12795
12797 {
12799 SetSynchDirty();
12800 }
12801
12803 {
12805 }
12806
12807
12809 {
12810 return false;
12811 }
12812
12815 {
12816 string att_type = "None";
12817
12818 if (ConfigIsExisting("soundAttType"))
12819 {
12820 att_type = ConfigGetString("soundAttType");
12821 }
12822
12824 }
12825
12827 {
12829 }
12830
12831
12832
12833
12834
12840
12842 {
12845
12847 }
12848
12849
12851 {
12853 return;
12854
12856
12859
12862
12863 SoundParameters params = new SoundParameters();
12867 }
12868
12869
12871 {
12873 {
12876
12877 SetSynchDirty();
12878
12881 }
12882 }
12883
12885 {
12887 }
12888
12889
12891 {
12893 return;
12894
12896 SetSynchDirty();
12897
12900 }
12901
12903 {
12906 }
12907
12909 {
12911 }
12912
12913 void OnApply(PlayerBase player);
12914
12916 {
12917 return 1.0;
12918 };
12919
12921 {
12923 }
12924
12926 {
12928 }
12929
12931
12933 {
12934 SetDynamicPhysicsLifeTime(0.01);
12936 }
12937
12939 {
12940 array<string> zone_names = new array<string>;
12941 GetDamageZones(zone_names);
12942 for (int i = 0; i < zone_names.Count(); i++)
12943 {
12944 SetHealthMax(zone_names.Get(i),"Health");
12945 }
12946 SetHealthMax("","Health");
12947 }
12948
12951 {
12952 float global_health = GetHealth01("","Health");
12953 array<string> zones = new array<string>;
12954 GetDamageZones(zones);
12955
12956 for (int i = 0; i < zones.Count(); i++)
12957 {
12958 SetHealth01(zones.Get(i),"Health",global_health);
12959 }
12960 }
12961
12964 {
12965 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12966 }
12967
12969 {
12970 if (!hasRootAsPlayer)
12971 {
12972 if (refParentIB)
12973 {
12974
12975 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12976 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12977
12978 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12979 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12980
12983 }
12984 else
12985 {
12986
12989 }
12990 }
12991 }
12992
12994 {
12996 {
12997 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12998 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12999 {
13000 float heatPermCoef = 1.0;
13002 while (ent)
13003 {
13004 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13005 ent = ent.GetHierarchyParent();
13006 }
13007
13008 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13009 }
13010 }
13011 }
13012
13014 {
13015
13016 EntityAI parent = GetHierarchyParent();
13017 if (!parent)
13018 {
13019 hasParent = false;
13020 hasRootAsPlayer = false;
13021 }
13022 else
13023 {
13024 hasParent = true;
13025 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13026 refParentIB =
ItemBase.Cast(parent);
13027 }
13028 }
13029
13030 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13031 {
13032
13033 }
13034
13036 {
13037
13038 return false;
13039 }
13040
13042 {
13043
13044
13045 return false;
13046 }
13047
13049 {
13050
13051 return false;
13052 }
13053
13056 {
13057 return !GetIsFrozen() &&
IsOpen();
13058 }
13059
13061 {
13062 bool hasParent = false, hasRootAsPlayer = false;
13064
13065 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13066 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13067
13068 if (wwtu || foodDecay)
13069 {
13073
13074 if (processWetness || processTemperature || processDecay)
13075 {
13077
13078 if (processWetness)
13079 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13080
13081 if (processTemperature)
13083
13084 if (processDecay)
13085 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13086 }
13087 }
13088 }
13089
13092 {
13094 }
13095
13097 {
13100
13101 return super.GetTemperatureFreezeThreshold();
13102 }
13103
13105 {
13108
13109 return super.GetTemperatureThawThreshold();
13110 }
13111
13113 {
13116
13117 return super.GetItemOverheatThreshold();
13118 }
13119
13121 {
13123 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13124
13125 return super.GetTemperatureFreezeTime();
13126 }
13127
13129 {
13131 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13132
13133 return super.GetTemperatureThawTime();
13134 }
13135
13140
13142 {
13143 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13144 }
13145
13147 {
13148 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13149 }
13150
13153 {
13155 }
13156
13158 {
13160 }
13161
13163 {
13165 }
13166
13169 {
13170 return null;
13171 }
13172
13175 {
13176 return false;
13177 }
13178
13180 {
13182 {
13185 if (!trg)
13186 {
13188 explosive = this;
13189 }
13190
13191 explosive.PairRemote(trg);
13193
13194 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13195 trg.SetPersistentPairID(persistentID);
13196 explosive.SetPersistentPairID(persistentID);
13197
13198 return true;
13199 }
13200 return false;
13201 }
13202
13205 {
13206 float ret = 1.0;
13209 ret *= GetHealth01();
13210
13211 return ret;
13212 }
13213
13214 #ifdef DEVELOPER
13215 override void SetDebugItem()
13216 {
13217 super.SetDebugItem();
13218 _itemBase = this;
13219 }
13220
13222 {
13223 string text = super.GetDebugText();
13224
13226 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13227
13228 return text;
13229 }
13230 #endif
13231
13233 {
13234 return true;
13235 }
13236
13238
13240
13242 {
13245 }
13246
13247
13255
13271
13272 [
Obsolete(
"Use ItemSoundHandler instead")]
13275 {
13276 if (!
g_Game.IsDedicatedServer())
13277 {
13278 if (ConfigIsExisting("attachSoundSet"))
13279 {
13280 string cfg_path = "";
13281 string soundset = "";
13282 string type_name =
GetType();
13283
13286 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13287 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13288
13289 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13290 {
13291 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13292 {
13293 if (cfg_slot_array[i] == slot_type)
13294 {
13295 soundset = cfg_soundset_array[i];
13296 break;
13297 }
13298 }
13299 }
13300
13301 if (soundset != "")
13302 {
13303 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13305 }
13306 }
13307 }
13308 }
13309
13311}
13312
13314{
13316 if (entity)
13317 {
13318 bool is_item = entity.IsInherited(
ItemBase);
13319 if (is_item && full_quantity)
13320 {
13323 }
13324 }
13325 else
13326 {
13328 return NULL;
13329 }
13330 return entity;
13331}
13332
13334{
13335 if (item)
13336 {
13337 if (health > 0)
13338 item.SetHealth("", "", health);
13339
13340 if (item.CanHaveTemperature())
13341 {
13343 if (item.CanFreeze())
13344 item.SetFrozen(false);
13345 }
13346
13347 if (item.HasEnergyManager())
13348 {
13349 if (quantity >= 0)
13350 {
13351 item.GetCompEM().SetEnergy0To1(quantity);
13352 }
13353 else
13354 {
13356 }
13357 }
13358 else if (item.IsMagazine())
13359 {
13360 Magazine mag = Magazine.Cast(item);
13361 if (quantity >= 0)
13362 {
13363 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13364 }
13365 else
13366 {
13368 }
13369
13370 }
13371 else
13372 {
13373 if (quantity >= 0)
13374 {
13375 item.SetQuantityNormalized(quantity, false);
13376 }
13377 else
13378 {
13380 }
13381
13382 }
13383 }
13384}
13385
13386#ifdef DEVELOPER
13388#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.