6319{
6321 {
6322 return true;
6323 }
6324};
6325
6326
6327
6329{
6333
6335
6338
6339
6340
6341
6342
6351
6357
6362
6367
6388 protected bool m_IsResultOfSplit
6389
6391
6396
6397
6398
6400
6404
6405
6406
6408
6411
6412
6413
6419
6420
6428
6431
6432
6434
6435
6437
6438
6443
6444
6449
6450
6452
6453
6455 {
6460
6461 if (!
GetGame().IsDedicatedServer())
6462 {
6464 {
6466
6468 {
6470 }
6471 }
6472
6475 }
6476
6477 m_OldLocation = null;
6478
6480 {
6482 }
6483
6484 if (ConfigIsExisting("headSelectionsToHide"))
6485 {
6488 }
6489
6491 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
6492 {
6494 }
6495
6497
6498 m_IsResultOfSplit = false;
6499
6501 }
6502
6504 {
6505 super.InitItemVariables();
6506
6512 m_Count = ConfigGetInt(
"count");
6513
6516
6521
6524
6529
6541
6545
6546
6549 if (ConfigIsExisting("canBeSplit"))
6550 {
6553 }
6554
6556 if (ConfigIsExisting("itemBehaviour"))
6558
6559
6562 RegisterNetSyncVariableInt("m_VarLiquidType");
6563 RegisterNetSyncVariableInt("m_Cleanness",0,1);
6564
6565 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
6566 RegisterNetSyncVariableFloat("m_ImpactSpeed");
6567 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
6568
6569 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
6570 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
6571 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
6572 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
6573
6574 RegisterNetSyncVariableBool("m_IsBeingPlaced");
6575 RegisterNetSyncVariableBool("m_IsTakeable");
6576 RegisterNetSyncVariableBool("m_IsHologram");
6577
6580 {
6583 }
6584
6586
6588 if (ConfigIsExisting("temperaturePerQuantityWeight"))
6590
6591 }
6592
6594 {
6596 }
6597
6599 {
6602 {
6607 }
6608 }
6609
6610 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
6611 {
6613 {
6616 }
6617
6619 }
6620
6622 {
6628 }
6629
6631
6633 {
6635
6636 if (!action)
6637 {
6638 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6639 return;
6640 }
6641
6643 if (!ai)
6644 {
6646 return;
6647 }
6648
6650 if (!action_array)
6651 {
6652 action_array = new array<ActionBase_Basic>;
6654 }
6655 if (LogManager.IsActionLogEnable())
6656 {
6657 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6658 }
6659
6660 if (action_array.Find(action) != -1)
6661 {
6662 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6663 }
6664 else
6665 {
6666 action_array.Insert(action);
6667 }
6668 }
6669
6671 {
6673 ActionBase action = player.GetActionManager().GetAction(actionName);
6676
6677 if (action_array)
6678 {
6679 action_array.RemoveItem(action);
6680 }
6681 }
6682
6683
6684
6686 {
6687 ActionOverrideData overrideData = new ActionOverrideData();
6691
6693 if (!actionMap)
6694 {
6697 }
6698
6699 actionMap.Insert(this.
Type(), overrideData);
6700
6701 }
6702
6704
6706
6707
6709 {
6712
6715
6716 string config_to_search = "CfgVehicles";
6717 string muzzle_owner_config;
6718
6720 {
6721 if (IsInherited(Weapon))
6722 config_to_search = "CfgWeapons";
6723
6724 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6725
6726 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6727
6729
6730 if (config_OnFire_subclass_count > 0)
6731 {
6732 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6733
6734 for (int i = 0; i < config_OnFire_subclass_count; i++)
6735 {
6736 string particle_class = "";
6738 string config_OnFire_entry = config_OnFire_class + particle_class;
6739 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6740 WPOF_array.Insert(WPOF);
6741 }
6742
6743
6745 }
6746 }
6747
6749 {
6750 config_to_search = "CfgWeapons";
6751 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6752
6753 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6754
6756
6757 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6758 {
6759 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6760
6761 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6762 {
6763 string particle_class2 = "";
6765 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6766 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6767 WPOBE_array.Insert(WPOBE);
6768 }
6769
6770
6772 }
6773 }
6774 }
6775
6776
6778 {
6781
6783 {
6784 string config_to_search = "CfgVehicles";
6785
6786 if (IsInherited(Weapon))
6787 config_to_search = "CfgWeapons";
6788
6789 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6790 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6791
6792 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
6793 {
6794
6796
6798 {
6800 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6802 return;
6803 }
6804
6807
6808
6809
6811 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6812
6813 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6814 {
6815 string particle_class = "";
6817 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6819
6820 if (entry_type == CT_CLASS)
6821 {
6822 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6823 WPOOH_array.Insert(WPOF);
6824 }
6825 }
6826
6827
6829 }
6830 }
6831 }
6832
6834 {
6836 }
6837
6839 {
6841 {
6843
6846
6849
6850 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6851 }
6852 }
6853
6855 {
6857 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6858
6860 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6861
6863 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6864
6866 {
6868 }
6869 }
6870
6872 {
6874 }
6875
6877 {
6880 else
6882
6884 {
6887 }
6888 else
6889 {
6892
6895 }
6896
6898 }
6899
6901 {
6903 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6904 }
6905
6907 {
6909 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6911 }
6912
6914 {
6916 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6917 }
6918
6920 {
6923
6924 OverheatingParticle OP = new OverheatingParticle();
6929
6931 }
6932
6934 {
6937
6938 return -1;
6939 }
6940
6942 {
6944 {
6947
6948 for (int i = count; i > 0; --i)
6949 {
6950 int id = i - 1;
6953
6956
6957 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6958 {
6959 if (p)
6960 {
6963 }
6964 }
6965 }
6966 }
6967 }
6968
6970 {
6972 {
6974 {
6975 int id = i - 1;
6977
6978 if (OP)
6979 {
6981
6982 if (p)
6983 {
6985 }
6986
6987 delete OP;
6988 }
6989 }
6990
6993 }
6994 }
6995
6998 {
6999 return 0.0;
7000 }
7001
7002
7004 {
7005 return 250;
7006 }
7007
7009 {
7010 return 0;
7011 }
7012
7015 {
7017 return true;
7018
7019 return false;
7020 }
7021
7024 {
7027
7029 {
7031 }
7032 else
7033 {
7034
7036 }
7037
7039 }
7040
7047 {
7048 return -1;
7049 }
7050
7051
7052
7053
7055 {
7057 {
7059 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7060
7061 if (r_index >= 0)
7062 {
7063 InventoryLocation r_il = new InventoryLocation;
7064 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7065
7066 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7069 {
7070 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7071 }
7073 {
7074 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7075 }
7076
7077 }
7078
7079 player.GetHumanInventory().ClearUserReservedLocation(this);
7080 }
7081
7084 }
7085
7086
7087
7088
7090 {
7091 return ItemBase.m_DebugActionsMask;
7092 }
7093
7095 {
7096 return ItemBase.m_DebugActionsMask & mask;
7097 }
7098
7100 {
7101 ItemBase.m_DebugActionsMask = mask;
7102 }
7103
7105 {
7106 ItemBase.m_DebugActionsMask |= mask;
7107 }
7108
7110 {
7111 ItemBase.m_DebugActionsMask &= ~mask;
7112 }
7113
7115 {
7117 {
7119 }
7120 else
7121 {
7123 }
7124 }
7125
7126
7128 {
7129 if (GetEconomyProfile())
7130 {
7131 float q_max = GetEconomyProfile().GetQuantityMax();
7132 if (q_max > 0)
7133 {
7134 float q_min = GetEconomyProfile().GetQuantityMin();
7135 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7136
7138 {
7139 ComponentEnergyManager comp = GetCompEM();
7141 {
7143 }
7144 }
7146 {
7148
7149 }
7150
7151 }
7152 }
7153 }
7154
7157 {
7158 EntityAI parent = GetHierarchyParent();
7159
7160 if (parent)
7161 {
7162 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7163 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7164 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
7165 }
7166 }
7167
7170 {
7171 EntityAI parent = GetHierarchyParent();
7172
7173 if (parent)
7174 {
7175 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7176 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7177 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
7178 }
7179 }
7180
7182 {
7183
7184
7185
7186
7188
7190 {
7191 if (ScriptInputUserData.CanStoreInputUserData())
7192 {
7193 ScriptInputUserData ctx = new ScriptInputUserData;
7199 ctx.
Write(use_stack_max);
7202
7204 {
7205 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
7206 }
7207 }
7208 }
7209 else if (!
GetGame().IsMultiplayer())
7210 {
7212 }
7213 }
7214
7216 {
7218 }
7219
7221 {
7223 }
7224
7226 {
7228 }
7229
7231 {
7232
7233 return false;
7234 }
7235
7237 {
7238 return false;
7239 }
7240
7244 {
7245 return false;
7246 }
7247
7249 {
7250 return "";
7251 }
7252
7254
7256 {
7257 return false;
7258 }
7259
7261 {
7262 return true;
7263 }
7264
7265
7266
7268 {
7269 return true;
7270 }
7271
7273 {
7274 return true;
7275 }
7276
7278 {
7279 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7281 }
7282
7284 {
7286 }
7287
7289 {
7291 if (!is_being_placed)
7293 SetSynchDirty();
7294 }
7295
7296
7298
7300 {
7302 }
7303
7305 {
7307 }
7308
7310 {
7311 return 1;
7312 }
7313
7315 {
7316 return false;
7317 }
7318
7320 {
7322 SetSynchDirty();
7323 }
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7360 {
7361 super.OnMovedInsideCargo(container);
7362
7363 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7364 }
7365
7366 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
7367 {
7368 super.EEItemLocationChanged(oldLoc,newLoc);
7369
7370 PlayerBase new_player = null;
7371 PlayerBase old_player = null;
7372
7373 if (newLoc.GetParent())
7374 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
7375
7376 if (oldLoc.GetParent())
7377 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
7378
7380 {
7381 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
7382
7383 if (r_index >= 0)
7384 {
7385 InventoryLocation r_il = new InventoryLocation;
7386 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7387
7388 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7391 {
7392 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7393 }
7395 {
7396 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7397 }
7398
7399 }
7400 }
7401
7403 {
7404 if (new_player)
7405 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
7406
7407 if (new_player == old_player)
7408 {
7409
7410 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
7411 {
7413 {
7414 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
7415 {
7416 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7417 }
7418 }
7419 else
7420 {
7421 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7422 }
7423 }
7424
7425 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
7426 {
7427 int type = oldLoc.GetType();
7429 {
7430 oldLoc.GetParent().GetOnSetLock().Invoke(this);
7431 }
7433 {
7434 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
7435 }
7436 }
7437 if (!m_OldLocation)
7438 {
7439 m_OldLocation = new InventoryLocation;
7440 }
7441 m_OldLocation.Copy(oldLoc);
7442 }
7443 else
7444 {
7445 if (m_OldLocation)
7446 {
7447 m_OldLocation.Reset();
7448 }
7449 }
7450
7452 }
7453 else
7454 {
7455 if (new_player)
7456 {
7457 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
7458 if (res_index >= 0)
7459 {
7460 InventoryLocation il = new InventoryLocation;
7461 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
7463 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
7466 {
7467 il.
GetParent().GetOnReleaseLock().Invoke(it);
7468 }
7470 {
7472 }
7473
7474 }
7475 }
7477 {
7478
7480 }
7481
7482 if (m_OldLocation)
7483 {
7484 m_OldLocation.Reset();
7485 }
7486 }
7487 }
7488
7489 override void EOnContact(IEntity other, Contact extra)
7490 {
7492 {
7493 int liquidType = -1;
7495 if (impactSpeed > 0.0)
7496 {
7498 #ifndef SERVER
7500 #else
7502 SetSynchDirty();
7503 #endif
7505 }
7506 }
7507
7508 #ifdef SERVER
7509 if (GetCompEM() && GetCompEM().IsPlugged())
7510 {
7511 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
7512 GetCompEM().UnplugThis();
7513 }
7514 #endif
7515 }
7516
7518
7520 {
7522 }
7523
7525 {
7526
7527 }
7528
7530 {
7531 super.OnItemLocationChanged(old_owner, new_owner);
7532
7533 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7534 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7535
7536 if (!relatedPlayer && playerNew)
7537 relatedPlayer = playerNew;
7538
7539 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7540 {
7542 if (actionMgr)
7543 {
7544 ActionBase currentAction = actionMgr.GetRunningAction();
7545 if (currentAction)
7547 }
7548 }
7549
7550 Man ownerPlayerOld = null;
7551 Man ownerPlayerNew = null;
7552
7553 if (old_owner)
7554 {
7555 if (old_owner.
IsMan())
7556 {
7557 ownerPlayerOld = Man.Cast(old_owner);
7558 }
7559 else
7560 {
7561 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
7562 }
7563 }
7564 else
7565 {
7567 {
7569
7570 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
7571 {
7572 GetCompEM().UnplugThis();
7573 }
7574 }
7575 }
7576
7577 if (new_owner)
7578 {
7579 if (new_owner.
IsMan())
7580 {
7581 ownerPlayerNew = Man.Cast(new_owner);
7582 }
7583 else
7584 {
7585 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
7586 }
7587 }
7588
7589 if (ownerPlayerOld != ownerPlayerNew)
7590 {
7591 if (ownerPlayerOld)
7592 {
7593 array<EntityAI> subItemsExit = new array<EntityAI>;
7595 for (int i = 0; i < subItemsExit.Count(); i++)
7596 {
7599 }
7600 }
7601
7602 if (ownerPlayerNew)
7603 {
7604 array<EntityAI> subItemsEnter = new array<EntityAI>;
7606 for (int j = 0; j < subItemsEnter.Count(); j++)
7607 {
7610 }
7611 }
7612 }
7613 else if (ownerPlayerNew != null)
7614 {
7615 PlayerBase nplayer;
7616 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7617 {
7618 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7620 for (int k = 0; k < subItemsUpdate.Count(); k++)
7621 {
7623 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7624 }
7625 }
7626 }
7627
7628 if (old_owner)
7629 old_owner.OnChildItemRemoved(this);
7630 if (new_owner)
7631 new_owner.OnChildItemReceived(this);
7632 }
7633
7634
7636 {
7637 super.EEDelete(parent);
7638 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7639 if (player)
7640 {
7642
7643 if (player.IsAlive())
7644 {
7645 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7646 if (r_index >= 0)
7647 {
7648 InventoryLocation r_il = new InventoryLocation;
7649 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7650
7651 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7654 {
7655 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7656 }
7658 {
7659 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7660 }
7661
7662 }
7663
7664 player.RemoveQuickBarEntityShortcut(this);
7665 }
7666 }
7667 }
7668
7670 {
7671 super.EEKilled(killer);
7672
7675 {
7676 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7677 {
7678 if (IsMagazine())
7679 {
7680 if (Magazine.Cast(this).GetAmmoCount() > 0)
7681 {
7683 }
7684 }
7685 else
7686 {
7688 }
7689 }
7690 }
7691 }
7692
7694 {
7695 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7696
7697 super.OnWasAttached(parent, slot_id);
7698
7701
7703 }
7704
7706 {
7707 super.OnWasDetached(parent, slot_id);
7708
7711 }
7712
7714 {
7715 int idx;
7718
7719 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7720 if (inventory_slots.Count() < 1)
7721 {
7722 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7723 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7724 }
7725 else
7726 {
7727 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7728 }
7729
7730 idx = inventory_slots.Find(slot);
7731 if (idx < 0)
7732 return "";
7733
7734 return attach_types.Get(idx);
7735 }
7736
7738 {
7739 int idx = -1;
7740 string slot;
7741
7744
7745 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7746 if (inventory_slots.Count() < 1)
7747 {
7748 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7749 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7750 }
7751 else
7752 {
7753 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7754 if (detach_types.Count() < 1)
7755 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7756 }
7757
7758 for (int i = 0; i < inventory_slots.Count(); i++)
7759 {
7760 slot = inventory_slots.Get(i);
7761 }
7762
7763 if (slot != "")
7764 {
7765 if (detach_types.Count() == 1)
7766 idx = 0;
7767 else
7768 idx = inventory_slots.Find(slot);
7769 }
7770 if (idx < 0)
7771 return "";
7772
7773 return detach_types.Get(idx);
7774 }
7775
7777 {
7778
7780
7781
7782 float min_time = 1;
7783 float max_time = 3;
7784 float delay = Math.RandomFloat(min_time, max_time);
7785
7786 explode_timer.Run(delay, this, "DoAmmoExplosion");
7787 }
7788
7790 {
7791 Magazine magazine = Magazine.Cast(this);
7792 int pop_sounds_count = 6;
7793 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7794
7795
7796 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7797 string sound_name = pop_sounds[ sound_idx ];
7799
7800
7801 magazine.ServerAddAmmoCount(-1);
7802
7803
7804 float min_temp_to_explode = 100;
7805
7806 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7807 {
7809 }
7810 }
7811
7812
7813 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7814 {
7815 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7816
7817 const int CHANCE_DAMAGE_CARGO = 4;
7818 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7819 const int CHANCE_DAMAGE_NOTHING = 2;
7820
7822 {
7823 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7824 int chances;
7825 int rnd;
7826
7827 if (GetInventory().GetCargo())
7828 {
7829 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7830 rnd = Math.RandomInt(0,chances);
7831
7832 if (rnd < CHANCE_DAMAGE_CARGO)
7833 {
7835 }
7836 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7837 {
7839 }
7840 }
7841 else
7842 {
7843 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7844 rnd = Math.RandomInt(0,chances);
7845
7846 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7847 {
7849 }
7850 }
7851 }
7852 }
7853
7855 {
7856 if (GetInventory().GetCargo())
7857 {
7858 int item_count = GetInventory().GetCargo().GetItemCount();
7859 if (item_count > 0)
7860 {
7861 int random_pick = Math.RandomInt(0, item_count);
7863 if (!item.IsExplosive())
7864 {
7865 item.AddHealth("","",damage);
7866 return true;
7867 }
7868 }
7869 }
7870 return false;
7871 }
7872
7874 {
7875 int attachment_count = GetInventory().AttachmentCount();
7876 if (attachment_count > 0)
7877 {
7878 int random_pick = Math.RandomInt(0, attachment_count);
7879 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7880 if (!attachment.IsExplosive())
7881 {
7882 attachment.AddHealth("","",damage);
7883 return true;
7884 }
7885 }
7886 return false;
7887 }
7888
7890 {
7892 }
7893
7895 {
7897 return GetInventory().CanRemoveEntity();
7898
7899 return false;
7900 }
7901
7903 {
7904
7906 return false;
7907
7908
7910 return false;
7911
7912
7913
7915 if (delta == 0)
7916 return false;
7917
7918
7919 return true;
7920 }
7921
7923 {
7925 {
7926 if (ScriptInputUserData.CanStoreInputUserData())
7927 {
7928 ScriptInputUserData ctx = new ScriptInputUserData;
7933 ctx.
Write(destination_entity);
7937 }
7938 }
7939 else if (!
GetGame().IsMultiplayer())
7940 {
7942 }
7943 }
7944
7946 {
7947 float split_quantity_new;
7951 InventoryLocation loc = new InventoryLocation;
7952
7953 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7954 {
7956 split_quantity_new = stack_max;
7957 else
7959
7961 {
7962 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7963 if (new_item)
7964 {
7965 new_item.SetResultOfSplit(true);
7966 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7968 new_item.
SetQuantity(split_quantity_new,
false,
true);
7969 }
7970 }
7971 }
7972 else if (destination_entity && slot_id == -1)
7973 {
7974 if (quantity > stack_max)
7975 split_quantity_new = stack_max;
7976 else
7977 split_quantity_new = quantity;
7978
7980 {
7982 {
7985 }
7986
7987 if (new_item)
7988 {
7989 new_item.SetResultOfSplit(true);
7990 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7992 new_item.
SetQuantity(split_quantity_new,
false,
true);
7993 }
7994 }
7995 }
7996 else
7997 {
7998 if (stack_max != 0)
7999 {
8001 {
8003 }
8004
8005 if (split_quantity_new == 0)
8006 {
8007 if (!
GetGame().IsMultiplayer())
8008 player.PhysicalPredictiveDropItem(this);
8009 else
8010 player.ServerDropEntity(this);
8011 return;
8012 }
8013
8015 {
8017
8018 if (new_item)
8019 {
8020 new_item.SetResultOfSplit(true);
8021 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8024 new_item.PlaceOnSurface();
8025 }
8026 }
8027 }
8028 }
8029 }
8030
8032 {
8033 float split_quantity_new;
8037 InventoryLocation loc = new InventoryLocation;
8038
8039 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8040 {
8042 split_quantity_new = stack_max;
8043 else
8045
8047 {
8048 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8049 if (new_item)
8050 {
8051 new_item.SetResultOfSplit(true);
8052 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8054 new_item.
SetQuantity(split_quantity_new,
false,
true);
8055 }
8056 }
8057 }
8058 else if (destination_entity && slot_id == -1)
8059 {
8060 if (quantity > stack_max)
8061 split_quantity_new = stack_max;
8062 else
8063 split_quantity_new = quantity;
8064
8066 {
8068 {
8071 }
8072
8073 if (new_item)
8074 {
8075 new_item.SetResultOfSplit(true);
8076 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8078 new_item.
SetQuantity(split_quantity_new,
false,
true);
8079 }
8080 }
8081 }
8082 else
8083 {
8084 if (stack_max != 0)
8085 {
8087 {
8089 }
8090
8092 {
8094
8095 if (new_item)
8096 {
8097 new_item.SetResultOfSplit(true);
8098 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8101 new_item.PlaceOnSurface();
8102 }
8103 }
8104 }
8105 }
8106 }
8107
8109 {
8111 {
8112 if (ScriptInputUserData.CanStoreInputUserData())
8113 {
8114 ScriptInputUserData ctx = new ScriptInputUserData;
8119 dst.WriteToContext(ctx);
8121 }
8122 }
8123 else if (!
GetGame().IsMultiplayer())
8124 {
8126 }
8127 }
8128
8130 {
8132 {
8133 if (ScriptInputUserData.CanStoreInputUserData())
8134 {
8135 ScriptInputUserData ctx = new ScriptInputUserData;
8140 ctx.
Write(destination_entity);
8146 }
8147 }
8148 else if (!
GetGame().IsMultiplayer())
8149 {
8151 }
8152 }
8153
8155 {
8157 }
8158
8160 {
8162 float split_quantity_new;
8164 if (dst.IsValid())
8165 {
8166 int slot_id = dst.GetSlot();
8168
8169 if (quantity > stack_max)
8170 split_quantity_new = stack_max;
8171 else
8172 split_quantity_new = quantity;
8173
8175 {
8177
8178 if (new_item)
8179 {
8180 new_item.SetResultOfSplit(true);
8181 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8183 new_item.
SetQuantity(split_quantity_new,
false,
true);
8184 }
8185
8186 return new_item;
8187 }
8188 }
8189
8190 return null;
8191 }
8192
8194 {
8196 float split_quantity_new;
8198 if (destination_entity)
8199 {
8201 if (quantity > stackable)
8202 split_quantity_new = stackable;
8203 else
8204 split_quantity_new = quantity;
8205
8207 {
8208 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
8209 if (new_item)
8210 {
8211 new_item.SetResultOfSplit(true);
8212 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8214 new_item.
SetQuantity(split_quantity_new,
false,
true);
8215 }
8216 }
8217 }
8218 }
8219
8221 {
8223 {
8224 if (ScriptInputUserData.CanStoreInputUserData())
8225 {
8226 ScriptInputUserData ctx = new ScriptInputUserData;
8231 ItemBase destination_entity =
this;
8232 ctx.
Write(destination_entity);
8236 }
8237 }
8238 else if (!
GetGame().IsMultiplayer())
8239 {
8241 }
8242 }
8243
8245 {
8247 float split_quantity_new;
8249 if (player)
8250 {
8252 if (quantity > stackable)
8253 split_quantity_new = stackable;
8254 else
8255 split_quantity_new = quantity;
8256
8258 {
8259 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
8260 new_item =
ItemBase.Cast(in_hands);
8261 if (new_item)
8262 {
8263 new_item.SetResultOfSplit(true);
8264 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8266 new_item.SetQuantity(split_quantity_new, false, true);
8267 }
8268 }
8269 }
8270 }
8271
8273 {
8275 float split_quantity_new = Math.Floor(quantity * 0.5);
8276
8278 return;
8279
8281
8282 if (new_item)
8283 {
8284 if (new_item.GetQuantityMax() < split_quantity_new)
8285 {
8286 split_quantity_new = new_item.GetQuantityMax();
8287 }
8288
8289 new_item.SetResultOfSplit(true);
8290 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8291
8293 {
8296 }
8297 else
8298 {
8300 new_item.
SetQuantity(split_quantity_new,
false,
true);
8301 }
8302 }
8303 }
8304
8306 {
8308 float split_quantity_new = Math.Floor(quantity / 2);
8309
8311 return;
8312
8313 InventoryLocation invloc = new InventoryLocation;
8315
8317 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
8318
8319 if (new_item)
8320 {
8321 if (new_item.GetQuantityMax() < split_quantity_new)
8322 {
8323 split_quantity_new = new_item.GetQuantityMax();
8324 }
8326 {
8329 }
8330 else if (split_quantity_new > 1)
8331 {
8333 new_item.
SetQuantity(split_quantity_new,
false,
true);
8334 }
8335 }
8336 }
8337
8340 {
8341 SetWeightDirty();
8343
8344 if (parent)
8345 parent.OnAttachmentQuantityChangedEx(this, delta);
8346
8348 {
8350 {
8352 }
8354 {
8355 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
8357 }
8358 }
8359
8360 }
8361
8364 {
8365
8366 }
8367
8370 {
8372 }
8373
8375 {
8376 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
8377
8379 {
8380 if (newLevel == GameConstants.STATE_RUINED)
8381 {
8383 EntityAI parent = GetHierarchyParent();
8384 if (parent && parent.IsFireplace())
8385 {
8386 CargoBase cargo = GetInventory().GetCargo();
8387 if (cargo)
8388 {
8390 {
8392 }
8393 }
8394 }
8395 }
8396
8398 {
8399
8401 return;
8402 }
8403
8404 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
8405 {
8407 }
8408 }
8409 }
8410
8411
8413 {
8414 super.OnRightClick();
8415
8417 {
8419 {
8420 if (ScriptInputUserData.CanStoreInputUserData())
8421 {
8422 EntityAI root = GetHierarchyRoot();
8423 Man playerOwner = GetHierarchyRootPlayer();
8424 InventoryLocation dst = new InventoryLocation;
8425
8426
8427 if (!playerOwner && root && root == this)
8428 {
8430 }
8431 else
8432 {
8433
8434 GetInventory().GetCurrentInventoryLocation(dst);
8436 {
8439 {
8441 }
8442 else
8443 {
8445
8446
8447 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
8448 {
8450 }
8451 else
8452 {
8453 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
8454 }
8455 }
8456 }
8457 }
8458
8459 ScriptInputUserData ctx = new ScriptInputUserData;
8467 }
8468 }
8469 else if (!
GetGame().IsMultiplayer())
8470 {
8472 }
8473 }
8474 }
8475
8477 {
8478 if (root)
8479 {
8480 vector m4[4];
8481 root.GetTransform(m4);
8482 dst.SetGround(this, m4);
8483 }
8484 else
8485 {
8486 GetInventory().GetCurrentInventoryLocation(dst);
8487 }
8488 }
8489
8490 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
8491 {
8492
8493 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
8494 return false;
8495
8496 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8497 return false;
8498
8499
8501 return false;
8502
8503
8504 Magazine mag = Magazine.Cast(this);
8505 if (mag)
8506 {
8507 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8508 return false;
8509
8510 if (stack_max_limit)
8511 {
8512 Magazine other_mag = Magazine.Cast(other_item);
8513 if (other_item)
8514 {
8515 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8516 return false;
8517 }
8518
8519 }
8520 }
8521 else
8522 {
8523
8525 return false;
8526
8528 return false;
8529 }
8530
8531 PlayerBase player = null;
8532 if (CastTo(player, GetHierarchyRootPlayer()))
8533 {
8534 if (player.GetInventory().HasAttachment(this))
8535 return false;
8536
8537 if (player.IsItemsToDelete())
8538 return false;
8539 }
8540
8541 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8542 return false;
8543
8544 int slotID;
8546 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8547 return false;
8548
8549 return true;
8550 }
8551
8553 {
8555 }
8556
8558 {
8559 return m_IsResultOfSplit;
8560 }
8561
8563 {
8564 m_IsResultOfSplit = value;
8565 }
8566
8568 {
8570 }
8571
8573 {
8574 float other_item_quantity = other_item.GetQuantity();
8575 float this_free_space;
8576
8578
8580
8581 if (other_item_quantity > this_free_space)
8582 {
8583 return this_free_space;
8584 }
8585 else
8586 {
8587 return other_item_quantity;
8588 }
8589 }
8590
8592 {
8594 }
8595
8597 {
8599 return;
8600
8601 if (!IsMagazine() && other_item)
8602 {
8604 if (quantity_used != 0)
8605 {
8606 float hp1 = GetHealth01("","");
8607 float hp2 = other_item.GetHealth01("","");
8608 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
8609 hpResult = hpResult / (
GetQuantity() + quantity_used);
8610
8611 hpResult *= GetMaxHealth();
8612 Math.Round(hpResult);
8613 SetHealth("", "Health", hpResult);
8614
8616 other_item.AddQuantity(-quantity_used);
8617 }
8618 }
8620 }
8621
8623 {
8624 #ifdef SERVER
8625 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8626 GetHierarchyParent().IncreaseLifetimeUp();
8627 #endif
8628 };
8629
8631 {
8632 PlayerBase p = PlayerBase.Cast(player);
8633
8634 array<int> recipesIds = p.m_Recipes;
8635 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8636 if (moduleRecipesManager)
8637 {
8638 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
8639 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8640 }
8641
8642 for (int i = 0;i < recipesIds.Count(); i++)
8643 {
8644 int key = recipesIds.Get(i);
8645 string recipeName = moduleRecipesManager.GetRecipeName(key);
8647 }
8648 }
8649
8650
8651 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8652 {
8653 super.GetDebugActions(outputList);
8654
8655
8661
8662
8667
8672
8673
8677
8678
8680 {
8684 }
8685
8688
8689
8693
8695
8696 InventoryLocation loc = new InventoryLocation();
8697 GetInventory().GetCurrentInventoryLocation(loc);
8699 {
8700 if (Gizmo_IsSupported())
8703 }
8704
8706 }
8707
8708
8709
8710
8712 {
8713 super.OnAction(action_id, player, ctx);
8714
8716 {
8717 switch (action_id)
8718 {
8721 return true;
8724 return true;
8725 }
8726 }
8727
8729 {
8730 switch (action_id)
8731 {
8733 Delete();
8734 return true;
8735 }
8736 }
8737
8738 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8739 {
8740 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8741 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8742 PlayerBase p = PlayerBase.Cast(player);
8743 if (
EActions.RECIPES_RANGE_START < 1000)
8744 {
8745 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8746 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8747 }
8748 }
8749 #ifndef SERVER
8750 else if (action_id ==
EActions.WATCH_PLAYER)
8751 {
8752 PluginDeveloper.SetDeveloperItemClientEx(player);
8753 }
8754 #endif
8756 {
8757 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8758 {
8759 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8760 OnDebugButtonPressServer(id + 1);
8761 }
8762
8763 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8764 {
8765 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8767 }
8768
8769 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8770 {
8771 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8773 }
8774
8775 else if (action_id ==
EActions.ADD_QUANTITY)
8776 {
8777 if (IsMagazine())
8778 {
8779 Magazine mag = Magazine.Cast(this);
8780 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8781 }
8782 else
8783 {
8785 }
8786
8787 if (m_EM)
8788 {
8789 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8790 }
8791
8792 }
8793
8794 else if (action_id ==
EActions.REMOVE_QUANTITY)
8795 {
8796 if (IsMagazine())
8797 {
8798 Magazine mag2 = Magazine.Cast(this);
8799 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8800 }
8801 else
8802 {
8804 }
8805 if (m_EM)
8806 {
8807 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8808 }
8809
8810 }
8811
8812 else if (action_id ==
EActions.SET_QUANTITY_0)
8813 {
8815
8816 if (m_EM)
8817 {
8818 m_EM.SetEnergy(0);
8819 }
8820 }
8821
8822 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8823 {
8825
8826 if (m_EM)
8827 {
8828 m_EM.SetEnergy(m_EM.GetEnergyMax());
8829 }
8830 }
8831
8832 else if (action_id ==
EActions.ADD_HEALTH)
8833 {
8834 AddHealth("","",GetMaxHealth("","Health")/5);
8835 }
8836 else if (action_id ==
EActions.REMOVE_HEALTH)
8837 {
8838 AddHealth("","",-GetMaxHealth("","Health")/5);
8839 }
8840 else if (action_id ==
EActions.DESTROY_HEALTH)
8841 {
8842 SetHealth01("","",0);
8843 }
8844 else if (action_id ==
EActions.WATCH_ITEM)
8845 {
8847 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8848 #ifdef DEVELOPER
8849 SetDebugDeveloper_item(this);
8850 #endif
8851 }
8852
8853 else if (action_id ==
EActions.ADD_TEMPERATURE)
8854 {
8855 AddTemperature(20);
8856
8857 }
8858
8859 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8860 {
8861 AddTemperature(-20);
8862
8863 }
8864
8865 else if (action_id ==
EActions.FLIP_FROZEN)
8866 {
8867 SetFrozen(!GetIsFrozen());
8868
8869 }
8870
8871 else if (action_id ==
EActions.ADD_WETNESS)
8872 {
8874
8875 }
8876
8877 else if (action_id ==
EActions.REMOVE_WETNESS)
8878 {
8880
8881 }
8882
8883 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8884 {
8887
8888
8889 }
8890
8891 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8892 {
8895 }
8896
8897 else if (action_id ==
EActions.MAKE_SPECIAL)
8898 {
8899 auto debugParams = DebugSpawnParams.WithPlayer(player);
8900 OnDebugSpawnEx(debugParams);
8901 }
8902
8903 }
8904
8905
8906 return false;
8907 }
8908
8909
8910
8911
8915
8918
8919
8920
8922 {
8923 return false;
8924 }
8925
8926
8928 {
8929 return true;
8930 }
8931
8932
8934 {
8935 return true;
8936 }
8937
8938
8939
8941 {
8942 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8944 }
8945
8948 {
8949 return null;
8950 }
8951
8953 {
8954 return false;
8955 }
8956
8958 {
8959 return false;
8960 }
8961
8965
8966
8968 {
8969 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8970 return module_repairing.CanRepair(this, item_repair_kit);
8971 }
8972
8973
8974 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8975 {
8976 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8977 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8978 }
8979
8980
8982 {
8983
8984
8985
8986
8987
8988
8989
8990
8991 return 1;
8992 }
8993
8994
8995
8997 {
8999 }
9000
9001
9002
9004 {
9006 }
9007
9008
9017 {
9018 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9019
9020 if (player)
9021 {
9022 player.MessageStatus(text);
9023 }
9024 }
9025
9026
9035 {
9036 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9037
9038 if (player)
9039 {
9040 player.MessageAction(text);
9041 }
9042 }
9043
9044
9053 {
9054 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9055
9056 if (player)
9057 {
9058 player.MessageFriendly(text);
9059 }
9060 }
9061
9062
9071 {
9072 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9073
9074 if (player)
9075 {
9076 player.MessageImportant(text);
9077 }
9078 }
9079
9081 {
9082 return true;
9083 }
9084
9085
9086 override bool KindOf(
string tag)
9087 {
9088 bool found = false;
9089 string item_name = this.
GetType();
9092
9093 int array_size = item_tag_array.Count();
9094 for (int i = 0; i < array_size; i++)
9095 {
9096 if (item_tag_array.Get(i) == tag)
9097 {
9098 found = true;
9099 break;
9100 }
9101 }
9102 return found;
9103 }
9104
9105
9107 {
9108
9109 super.OnRPC(sender, rpc_type,ctx);
9110
9111
9112 switch (rpc_type)
9113 {
9114 #ifndef SERVER
9115 case ERPCs.RPC_SOUND_LOCK_ATTACH:
9116 Param2<bool, string> p = new Param2<bool, string>(false, "");
9117
9119 return;
9120
9121 bool play = p.param1;
9122 string soundSet = p.param2;
9123
9124 if (play)
9125 {
9127 {
9129 {
9131 }
9132 }
9133 else
9134 {
9136 }
9137 }
9138 else
9139 {
9141 }
9142
9143 break;
9144 #endif
9145
9146 }
9147
9149 {
9151 }
9152 }
9153
9154
9155
9156
9158 {
9159 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9160 return plugin.GetID(
name);
9161 }
9162
9164 {
9165 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9166 return plugin.GetName(id);
9167 }
9168
9171 {
9172
9173
9174 int varFlags;
9175 if (!ctx.
Read(varFlags))
9176 return;
9177
9178 if (varFlags & ItemVariableFlags.FLOAT)
9179 {
9181 }
9182 }
9183
9185 {
9186
9187 super.SerializeNumericalVars(floats_out);
9188
9189
9190
9192 {
9194 }
9195
9197 {
9199 }
9200
9202 {
9204 }
9205
9207 {
9212 }
9213
9215 {
9217 }
9218 }
9219
9221 {
9222
9223 super.DeSerializeNumericalVars(floats);
9224
9225
9226 int index = 0;
9227 int mask = Math.Round(floats.Get(index));
9228
9229 index++;
9230
9232 {
9234 {
9236 }
9237 else
9238 {
9239 float quantity = floats.Get(index);
9241 }
9242 index++;
9243 }
9244
9246 {
9247 float wet = floats.Get(index);
9249 index++;
9250 }
9251
9253 {
9254 int liquidtype = Math.Round(floats.Get(index));
9256 index++;
9257 }
9258
9260 {
9262 index++;
9264 index++;
9266 index++;
9268 index++;
9269 }
9270
9272 {
9273 int cleanness = Math.Round(floats.Get(index));
9275 index++;
9276 }
9277 }
9278
9280 {
9281 super.WriteVarsToCTX(ctx);
9282
9283
9285 {
9287 }
9288
9290 {
9292 }
9293
9295 {
9297 }
9298
9300 {
9301 int r,g,b,a;
9307 }
9308
9310 {
9312 }
9313 }
9314
9316 {
9317 if (!super.ReadVarsFromCTX(ctx,version))
9318 return false;
9319
9320 int intValue;
9321 float value;
9322
9323 if (version < 140)
9324 {
9325 if (!ctx.
Read(intValue))
9326 return false;
9327
9328 m_VariablesMask = intValue;
9329 }
9330
9332 {
9333 if (!ctx.
Read(value))
9334 return false;
9335
9337 {
9339 }
9340 else
9341 {
9343 }
9344 }
9345
9346 if (version < 140)
9347 {
9349 {
9350 if (!ctx.
Read(value))
9351 return false;
9352 SetTemperatureDirect(value);
9353 }
9354 }
9355
9357 {
9358 if (!ctx.
Read(value))
9359 return false;
9361 }
9362
9364 {
9365 if (!ctx.
Read(intValue))
9366 return false;
9368 }
9369
9371 {
9372 int r,g,b,a;
9374 return false;
9376 return false;
9378 return false;
9380 return false;
9381
9383 }
9384
9386 {
9387 if (!ctx.
Read(intValue))
9388 return false;
9390 }
9391
9392 if (version >= 138 && version < 140)
9393 {
9395 {
9396 if (!ctx.
Read(intValue))
9397 return false;
9398 SetFrozen(intValue);
9399 }
9400 }
9401
9402 return true;
9403 }
9404
9405
9407 {
9410 {
9412 }
9413
9414 if (!super.OnStoreLoad(ctx, version))
9415 {
9417 return false;
9418 }
9419
9420 if (version >= 114)
9421 {
9422 bool hasQuickBarIndexSaved;
9423
9424 if (!ctx.
Read(hasQuickBarIndexSaved))
9425 {
9427 return false;
9428 }
9429
9430 if (hasQuickBarIndexSaved)
9431 {
9432 int itmQBIndex;
9433
9434
9435 if (!ctx.
Read(itmQBIndex))
9436 {
9438 return false;
9439 }
9440
9441 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
9442 if (itmQBIndex != -1 && parentPlayer)
9443 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
9444 }
9445 }
9446 else
9447 {
9448
9449 PlayerBase player;
9450 int itemQBIndex;
9451 if (version ==
int.
MAX)
9452 {
9453 if (!ctx.
Read(itemQBIndex))
9454 {
9456 return false;
9457 }
9458 }
9459 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
9460 {
9461
9462 if (!ctx.
Read(itemQBIndex))
9463 {
9465 return false;
9466 }
9467 if (itemQBIndex != -1 && player)
9468 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
9469 }
9470 }
9471
9472 if (version < 140)
9473 {
9474
9475 if (!LoadVariables(ctx, version))
9476 {
9478 return false;
9479 }
9480 }
9481
9482
9484 {
9486 return false;
9487 }
9488 if (version >= 132)
9489 {
9491 if (raib)
9492 {
9494 {
9496 return false;
9497 }
9498 }
9499 }
9500
9502 return true;
9503 }
9504
9505
9506
9508 {
9509 super.OnStoreSave(ctx);
9510
9511 PlayerBase player;
9512 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9513 {
9515
9516 int itemQBIndex = -1;
9517 itemQBIndex = player.FindQuickBarEntityIndex(this);
9518 ctx.
Write(itemQBIndex);
9519 }
9520 else
9521 {
9523 }
9524
9526
9528 if (raib)
9529 {
9531 }
9532 }
9533
9534
9536 {
9537 super.AfterStoreLoad();
9538
9540 {
9542 }
9543
9545 {
9548 }
9549 }
9550
9552 {
9553 super.EEOnAfterLoad();
9554
9556 {
9558 }
9559
9562 }
9563
9565 {
9566 return false;
9567 }
9568
9569
9570
9572 {
9574 {
9575 #ifdef PLATFORM_CONSOLE
9576
9578 {
9580 if (menu)
9581 {
9583 }
9584 }
9585 #endif
9586 }
9587
9589 {
9592 }
9593
9595 {
9596 SetWeightDirty();
9598 }
9600 {
9603 }
9604
9606 {
9609 }
9611 {
9614 }
9615
9616 super.OnVariablesSynchronized();
9617 }
9618
9619
9620
9622 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9623 {
9624 if (!IsServerCheck(allow_client))
9625 return false;
9626
9628 return false;
9629
9632
9633 if (value <= (min + 0.001))
9634 value = min;
9635
9636 if (value == min)
9637 {
9638 if (destroy_config)
9639 {
9640 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9641 if (dstr)
9642 {
9644 this.Delete();
9645 return true;
9646 }
9647 }
9648 else if (destroy_forced)
9649 {
9651 this.Delete();
9652 return true;
9653 }
9654
9656 }
9657
9660
9662 {
9664
9665 if (delta)
9667 }
9668
9670
9671 return false;
9672 }
9673
9674
9676 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9677 {
9679 }
9680
9682 {
9685 }
9686
9688 {
9691 }
9692
9694 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9695 {
9696 float value_clamped = Math.Clamp(value, 0, 1);
9698 SetQuantity(result, destroy_config, destroy_forced);
9699 }
9700
9701
9704 {
9706 }
9707
9709 {
9711 }
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9723 {
9724 int slot = -1;
9725 if (GetInventory())
9726 {
9727 InventoryLocation il = new InventoryLocation;
9728 GetInventory().GetCurrentInventoryLocation(il);
9730 }
9731
9733 }
9734
9736 {
9737 float quantity_max = 0;
9738
9740 {
9741 if (attSlotID != -1)
9742 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9743
9744 if (quantity_max <= 0)
9746 }
9747
9748 if (quantity_max <= 0)
9750
9751 return quantity_max;
9752 }
9753
9755 {
9757 }
9758
9760 {
9762 }
9763
9764
9766 {
9768 }
9769
9771 {
9773 }
9774
9776 {
9778 }
9779
9780
9782 {
9783
9784 float weightEx = GetWeightEx();
9785 float special = GetInventoryAndCargoWeight();
9786 return weightEx - special;
9787 }
9788
9789
9791 {
9793 }
9794
9796 {
9798 {
9799 #ifdef DEVELOPER
9800 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9801 {
9802 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9804 }
9805 #endif
9806
9808 }
9809 else if (HasEnergyManager())
9810 {
9811 #ifdef DEVELOPER
9812 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9813 {
9814 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9815 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9816 }
9817 #endif
9818 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9819 }
9820 else
9821 {
9822 #ifdef DEVELOPER
9823 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9824 {
9825 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9826 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9827 }
9828 #endif
9829 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9830 }
9831 }
9832
9835 {
9836 int item_count = 0;
9838
9839 if (GetInventory().GetCargo() != NULL)
9840 {
9841 item_count = GetInventory().GetCargo().GetItemCount();
9842 }
9843
9844 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
9845 {
9846 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
9847 if (item)
9848 item_count += item.GetNumberOfItems();
9849 }
9850 return item_count;
9851 }
9852
9855 {
9856 float weight = 0;
9857 float wetness = 1;
9858 if (include_wetness)
9861 {
9862 weight = wetness * m_ConfigWeight;
9863 }
9865 {
9866 weight = 1;
9867 }
9868 return weight;
9869 }
9870
9871
9872
9874 {
9875 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
9876 {
9877 GameInventory inv = GetInventory();
9878 array<EntityAI> items = new array<EntityAI>;
9880 for (int i = 0; i < items.Count(); i++)
9881 {
9883 if (item)
9884 {
9886 }
9887 }
9888 }
9889 }
9890
9891
9892
9893
9895 {
9896 float energy = 0;
9897 if (HasEnergyManager())
9898 {
9899 energy = GetCompEM().GetEnergy();
9900 }
9901 return energy;
9902 }
9903
9904
9906 {
9907 super.OnEnergyConsumed();
9908
9910 }
9911
9913 {
9914 super.OnEnergyAdded();
9915
9917 }
9918
9919
9921 {
9922 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9923 {
9925 {
9926 float energy_0to1 = GetCompEM().GetEnergy0To1();
9928 }
9929 }
9930 }
9931
9932
9934 {
9935 return ConfigGetFloat("heatIsolation");
9936 }
9937
9939 {
9941 }
9942
9944 {
9945 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9946 if (
GetGame().ConfigIsExisting(paramPath))
9948
9949 return 0.0;
9950 }
9951
9953 {
9954 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9955 if (
GetGame().ConfigIsExisting(paramPath))
9957
9958 return 0.0;
9959 }
9960
9961 override void SetWet(
float value,
bool allow_client =
false)
9962 {
9963 if (!IsServerCheck(allow_client))
9964 return;
9965
9968
9970
9971 m_VarWet = Math.Clamp(value, min, max);
9972
9974 {
9977 }
9978 }
9979
9980 override void AddWet(
float value)
9981 {
9983 }
9984
9986 {
9988 }
9989
9991 {
9993 }
9994
9996 {
9998 }
9999
10001 {
10003 }
10004
10006 {
10008 }
10009
10010 override void OnWetChanged(
float newVal,
float oldVal)
10011 {
10014 if (newLevel != oldLevel)
10015 {
10017 }
10018 }
10019
10021 {
10022 SetWeightDirty();
10023 }
10024
10026 {
10027 return GetWetLevelInternal(
m_VarWet);
10028 }
10029
10030
10031
10033 {
10035 }
10036
10038 {
10040 }
10041
10043 {
10045 }
10046
10048 {
10050 }
10051
10052
10053
10055 {
10056 if (ConfigIsExisting("itemModelLength"))
10057 {
10058 return ConfigGetFloat("itemModelLength");
10059 }
10060 return 0;
10061 }
10062
10064 {
10065 if (ConfigIsExisting("itemAttachOffset"))
10066 {
10067 return ConfigGetFloat("itemAttachOffset");
10068 }
10069 return 0;
10070 }
10071
10072 override void SetCleanness(
int value,
bool allow_client =
false)
10073 {
10074 if (!IsServerCheck(allow_client))
10075 return;
10076
10078
10080
10083 }
10084
10086 {
10088 }
10089
10091 {
10092 return true;
10093 }
10094
10095
10096
10097
10099 {
10101 }
10102
10104 {
10106 }
10107
10108
10109
10110
10111 override void SetColor(
int r,
int g,
int b,
int a)
10112 {
10118 }
10120 override void GetColor(out
int r,out
int g,out
int b,out
int a)
10121 {
10126 }
10127
10129 {
10131 }
10132
10135 {
10136 int r,g,b,a;
10138 r = r/255;
10139 g = g/255;
10140 b = b/255;
10141 a = a/255;
10142 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10143 }
10144
10145
10146
10147 override void SetLiquidType(
int value,
bool allow_client =
false)
10148 {
10149 if (!IsServerCheck(allow_client))
10150 return;
10151
10156 }
10157
10159 {
10160 return ConfigGetInt("varLiquidTypeInit");
10161 }
10162
10164 {
10166 }
10167
10169 {
10171 SetFrozen(false);
10172 }
10173
10176 {
10177 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10178 }
10179
10180
10183 {
10184 PlayerBase nplayer;
10185 if (PlayerBase.CastTo(nplayer, player))
10186 {
10188
10189 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10190 }
10191 }
10192
10193
10196 {
10197 PlayerBase nplayer;
10198 if (PlayerBase.CastTo(nplayer,player))
10199 {
10200
10201 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10202
10203 }
10204
10205
10206 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10207
10208
10209 if (HasEnergyManager())
10210 {
10211 GetCompEM().UpdatePlugState();
10212 }
10213 }
10214
10215
10217 {
10218 super.OnPlacementStarted(player);
10219
10221 }
10222
10223 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
10224 {
10226 {
10227 m_AdminLog.OnPlacementComplete(player,
this);
10228 }
10229
10230 super.OnPlacementComplete(player, position, orientation);
10231 }
10232
10233
10234
10235
10236
10238 {
10240 {
10241 return true;
10242 }
10243 else
10244 {
10245 return false;
10246 }
10247 }
10248
10249
10251 {
10253 {
10255 }
10256 }
10257
10258
10260 {
10262 }
10263
10265 {
10267 }
10268
10269 override void InsertAgent(
int agent,
float count = 1)
10270 {
10271 if (count < 1)
10272 return;
10273
10275 }
10276
10279 {
10281 }
10282
10283
10285 {
10287 }
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10331 {
10333 return false;
10334 return true;
10335 }
10336
10338 {
10339
10341 }
10342
10343
10346 {
10347 super.CheckForRoofLimited(timeTresholdMS);
10348
10350 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
10351 {
10352 m_PreviousRoofTestTime = time;
10353 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
10354 }
10355 }
10356
10357
10359 {
10361 {
10362 return 0;
10363 }
10364
10365 if (GetInventory().GetAttachmentSlotsCount() != 0)
10366 {
10367 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
10368 if (filter)
10369 return filter.GetProtectionLevel(type, false, system);
10370 else
10371 return 0;
10372 }
10373
10374 string subclassPath, entryName;
10375
10376 switch (type)
10377 {
10379 entryName = "biological";
10380 break;
10382 entryName = "chemical";
10383 break;
10384 default:
10385 entryName = "biological";
10386 break;
10387 }
10388
10389 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
10390
10392 }
10393
10394
10395
10398 {
10399 if (!IsMagazine())
10401
10403 }
10404
10405
10406
10407
10408
10413 {
10414 return true;
10415 }
10416
10418 {
10420 }
10421
10422
10423
10424
10425
10427 {
10428 if (parent)
10429 {
10430 if (parent.IsInherited(DayZInfected))
10431 return true;
10432
10433 if (!parent.IsRuined())
10434 return true;
10435 }
10436
10437 return true;
10438 }
10439
10441 {
10442 if (!super.CanPutAsAttachment(parent))
10443 {
10444 return false;
10445 }
10446
10447 if (!IsRuined() && !parent.IsRuined())
10448 {
10449 return true;
10450 }
10451
10452 return false;
10453 }
10454
10456 {
10457
10458
10459
10460
10461 return super.CanReceiveItemIntoCargo(item);
10462 }
10463
10465 {
10466
10467
10468
10469
10470 GameInventory attachmentInv = attachment.GetInventory();
10472 {
10473 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10474 return false;
10475 }
10476
10477 InventoryLocation loc = new InventoryLocation();
10478 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10479 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
10480 return false;
10481
10482 return super.CanReceiveAttachment(attachment, slotId);
10483 }
10484
10486 {
10487 if (!super.CanReleaseAttachment(attachment))
10488 return false;
10489
10490 return GetInventory().AreChildrenAccessible();
10491 }
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10514 {
10515 int id = muzzle_owner.GetMuzzleID();
10516 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
10517
10518 if (WPOF_array)
10519 {
10520 for (int i = 0; i < WPOF_array.Count(); i++)
10521 {
10522 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10523
10524 if (WPOF)
10525 {
10526 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10527 }
10528 }
10529 }
10530 }
10531
10532
10534 {
10535 int id = muzzle_owner.GetMuzzleID();
10537
10538 if (WPOBE_array)
10539 {
10540 for (int i = 0; i < WPOBE_array.Count(); i++)
10541 {
10542 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10543
10544 if (WPOBE)
10545 {
10546 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10547 }
10548 }
10549 }
10550 }
10551
10552
10554 {
10555 int id = muzzle_owner.GetMuzzleID();
10556 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10557
10558 if (WPOOH_array)
10559 {
10560 for (int i = 0; i < WPOOH_array.Count(); i++)
10561 {
10562 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10563
10564 if (WPOOH)
10565 {
10566 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10567 }
10568 }
10569 }
10570 }
10571
10572
10574 {
10575 int id = muzzle_owner.GetMuzzleID();
10576 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10577
10578 if (WPOOH_array)
10579 {
10580 for (int i = 0; i < WPOOH_array.Count(); i++)
10581 {
10582 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10583
10584 if (WPOOH)
10585 {
10586 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10587 }
10588 }
10589 }
10590 }
10591
10592
10594 {
10595 int id = muzzle_owner.GetMuzzleID();
10596 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10597
10598 if (WPOOH_array)
10599 {
10600 for (int i = 0; i < WPOOH_array.Count(); i++)
10601 {
10602 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10603
10604 if (WPOOH)
10605 {
10606 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10607 }
10608 }
10609 }
10610 }
10611
10612
10613
10615 {
10617 {
10618 return true;
10619 }
10620
10621 return false;
10622 }
10623
10625 {
10627 {
10628 return true;
10629 }
10630
10631 return false;
10632 }
10633
10635 {
10637 {
10638 return true;
10639 }
10640
10641 return false;
10642 }
10643
10645 {
10646 return false;
10647 }
10648
10651 {
10652 return UATimeSpent.DEFAULT_DEPLOY;
10653 }
10654
10655
10656
10657
10659 {
10661 SetSynchDirty();
10662 }
10663
10665 {
10667 }
10668
10669
10671 {
10672 return false;
10673 }
10674
10677 {
10678 string att_type = "None";
10679
10680 if (ConfigIsExisting("soundAttType"))
10681 {
10682 att_type = ConfigGetString("soundAttType");
10683 }
10684
10686 }
10687
10689 {
10691 }
10692
10693
10694
10695
10696
10702
10704 {
10707
10709 }
10710
10711
10713 {
10715 return;
10716
10718
10721
10724
10725 SoundParameters params = new SoundParameters();
10729 }
10730
10731
10733 {
10735 return;
10736
10738 SetSynchDirty();
10739
10742 }
10743
10744
10746 {
10748 return;
10749
10751 SetSynchDirty();
10752
10755 }
10756
10758 {
10760 }
10761
10763 {
10765 }
10766
10769 {
10770 if (!
GetGame().IsDedicatedServer())
10771 {
10772 if (ConfigIsExisting("attachSoundSet"))
10773 {
10774 string cfg_path = "";
10775 string soundset = "";
10776 string type_name =
GetType();
10777
10780 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10781 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10782
10783 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10784 {
10785 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10786 {
10787 if (cfg_slot_array[i] == slot_type)
10788 {
10789 soundset = cfg_soundset_array[i];
10790 break;
10791 }
10792 }
10793 }
10794
10795 if (soundset != "")
10796 {
10797 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10799 }
10800 }
10801 }
10802 }
10803
10805 {
10806
10807 }
10808
10809 void OnApply(PlayerBase player);
10810
10812 {
10813 return 1.0;
10814 };
10815
10817 {
10819 }
10820
10822 {
10824 }
10825
10827
10829 {
10830 SetDynamicPhysicsLifeTime(0.01);
10832 }
10833
10835 {
10836 array<string> zone_names = new array<string>;
10837 GetDamageZones(zone_names);
10838 for (int i = 0; i < zone_names.Count(); i++)
10839 {
10840 SetHealthMax(zone_names.Get(i),"Health");
10841 }
10842 SetHealthMax("","Health");
10843 }
10844
10847 {
10848 float global_health = GetHealth01("","Health");
10849 array<string> zones = new array<string>;
10850 GetDamageZones(zones);
10851
10852 for (int i = 0; i < zones.Count(); i++)
10853 {
10854 SetHealth01(zones.Get(i),"Health",global_health);
10855 }
10856 }
10857
10860 {
10861 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10862 }
10863
10865 {
10866 if (!hasRootAsPlayer)
10867 {
10868 if (refParentIB)
10869 {
10870
10871 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10872 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10873
10874 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10875 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10876
10879 }
10880 else
10881 {
10882
10885 }
10886 }
10887 }
10888
10890 {
10892 {
10893 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10894 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10895 {
10896 float heatPermCoef = 1.0;
10898 while (ent)
10899 {
10900 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10901 ent = ent.GetHierarchyParent();
10902 }
10903
10904 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10905 }
10906 }
10907 }
10908
10910 {
10911
10912 EntityAI parent = GetHierarchyParent();
10913 if (!parent)
10914 {
10915 hasParent = false;
10916 hasRootAsPlayer = false;
10917 }
10918 else
10919 {
10920 hasParent = true;
10921 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10922 refParentIB =
ItemBase.Cast(parent);
10923 }
10924 }
10925
10926 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10927 {
10928
10929 }
10930
10932 {
10933
10934 return false;
10935 }
10936
10938 {
10939
10940
10941 return false;
10942 }
10943
10945 {
10946
10947 return false;
10948 }
10949
10952 {
10953 return !GetIsFrozen() &&
IsOpen();
10954 }
10955
10957 {
10958 bool hasParent = false, hasRootAsPlayer = false;
10960
10961 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10962 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10963
10964 if (wwtu || foodDecay)
10965 {
10969
10970 if (processWetness || processTemperature || processDecay)
10971 {
10973
10974 if (processWetness)
10975 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10976
10977 if (processTemperature)
10979
10980 if (processDecay)
10981 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10982 }
10983 }
10984 }
10985
10988 {
10990 }
10991
10993 {
10996
10997 return super.GetTemperatureFreezeThreshold();
10998 }
10999
11001 {
11004
11005 return super.GetTemperatureThawThreshold();
11006 }
11007
11009 {
11012
11013 return super.GetItemOverheatThreshold();
11014 }
11015
11017 {
11019 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11020
11021 return super.GetTemperatureFreezeTime();
11022 }
11023
11025 {
11027 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11028
11029 return super.GetTemperatureThawTime();
11030 }
11031
11036
11038 {
11039 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11040 }
11041
11043 {
11044 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11045 }
11046
11049 {
11051 }
11052
11054 {
11056 }
11057
11059 {
11061 }
11062
11065 {
11066 return null;
11067 }
11068
11071 {
11072 return false;
11073 }
11074
11076 {
11078 {
11081 if (!trg)
11082 {
11084 explosive = this;
11085 }
11086
11087 explosive.PairRemote(trg);
11089
11090 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
11091 trg.SetPersistentPairID(persistentID);
11092 explosive.SetPersistentPairID(persistentID);
11093
11094 return true;
11095 }
11096 return false;
11097 }
11098
11101 {
11102 float ret = 1.0;
11105 ret *= GetHealth01();
11106
11107 return ret;
11108 }
11109
11110 #ifdef DEVELOPER
11111 override void SetDebugItem()
11112 {
11113 super.SetDebugItem();
11114 _itemBase = this;
11115 }
11116
11118 {
11119 string text = super.GetDebugText();
11120
11122 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
11123
11124 return text;
11125 }
11126 #endif
11127
11129 {
11130 return true;
11131 }
11132
11134
11136
11138 {
11141 }
11142
11143
11151
11167}
11168
11170{
11172 if (entity)
11173 {
11174 bool is_item = entity.IsInherited(
ItemBase);
11175 if (is_item && full_quantity)
11176 {
11179 }
11180 }
11181 else
11182 {
11184 return NULL;
11185 }
11186 return entity;
11187}
11188
11190{
11191 if (item)
11192 {
11193 if (health > 0)
11194 item.SetHealth("", "", health);
11195
11196 if (item.CanHaveTemperature())
11197 {
11199 if (item.CanFreeze())
11200 item.SetFrozen(false);
11201 }
11202
11203 if (item.HasEnergyManager())
11204 {
11205 if (quantity >= 0)
11206 {
11207 item.GetCompEM().SetEnergy0To1(quantity);
11208 }
11209 else
11210 {
11212 }
11213 }
11214 else if (item.IsMagazine())
11215 {
11216 Magazine mag = Magazine.Cast(item);
11217 if (quantity >= 0)
11218 {
11219 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11220 }
11221 else
11222 {
11224 }
11225
11226 }
11227 else
11228 {
11229 if (quantity >= 0)
11230 {
11231 item.SetQuantityNormalized(quantity, false);
11232 }
11233 else
11234 {
11236 }
11237
11238 }
11239 }
11240}
11241
11242#ifdef DEVELOPER
11244#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.