7335{
7337 {
7338 return true;
7339 }
7340};
7341
7342
7343
7345{
7349
7351
7354
7355
7356
7357
7358
7367
7373
7378
7383
7404 protected bool m_IsResultOfSplit
7405
7407
7412
7413
7414
7416
7420
7421
7422
7424
7427
7428
7429
7435
7436
7444
7447
7448
7450
7451
7453
7454
7459
7460
7465
7466
7468
7469
7471 {
7476
7477 if (!
GetGame().IsDedicatedServer())
7478 {
7480 {
7482
7484 {
7486 }
7487 }
7488
7491 }
7492
7493 m_OldLocation = null;
7494
7496 {
7498 }
7499
7500 if (ConfigIsExisting("headSelectionsToHide"))
7501 {
7504 }
7505
7507 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7508 {
7510 }
7511
7513
7514 m_IsResultOfSplit = false;
7515
7517 }
7518
7520 {
7521 super.InitItemVariables();
7522
7528 m_Count = ConfigGetInt(
"count");
7529
7532
7537
7540
7545
7557
7561
7562
7565 if (ConfigIsExisting("canBeSplit"))
7566 {
7569 }
7570
7572 if (ConfigIsExisting("itemBehaviour"))
7574
7575
7578 RegisterNetSyncVariableInt("m_VarLiquidType");
7579 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7580
7581 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7582 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7583 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7584
7585 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7586 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7587 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7588 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7589
7590 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7591 RegisterNetSyncVariableBool("m_IsTakeable");
7592 RegisterNetSyncVariableBool("m_IsHologram");
7593
7596 {
7599 }
7600
7602
7604 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7606
7607 }
7608
7610 {
7612 }
7613
7615 {
7618 {
7623 }
7624 }
7625
7626 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7627 {
7629 {
7632 }
7633
7635 }
7636
7638 {
7644 }
7645
7647
7649 {
7651
7652 if (!action)
7653 {
7654 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7655 return;
7656 }
7657
7659 if (!ai)
7660 {
7662 return;
7663 }
7664
7666 if (!action_array)
7667 {
7668 action_array = new array<ActionBase_Basic>;
7670 }
7671 if (LogManager.IsActionLogEnable())
7672 {
7673 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7674 }
7675
7676 if (action_array.Find(action) != -1)
7677 {
7678 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7679 }
7680 else
7681 {
7682 action_array.Insert(action);
7683 }
7684 }
7685
7687 {
7689 ActionBase action = player.GetActionManager().GetAction(actionName);
7692
7693 if (action_array)
7694 {
7695 action_array.RemoveItem(action);
7696 }
7697 }
7698
7699
7700
7702 {
7703 ActionOverrideData overrideData = new ActionOverrideData();
7707
7709 if (!actionMap)
7710 {
7713 }
7714
7715 actionMap.Insert(this.
Type(), overrideData);
7716
7717 }
7718
7720
7722
7723
7725 {
7728
7731
7732 string config_to_search = "CfgVehicles";
7733 string muzzle_owner_config;
7734
7736 {
7737 if (IsInherited(Weapon))
7738 config_to_search = "CfgWeapons";
7739
7740 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7741
7742 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7743
7745
7746 if (config_OnFire_subclass_count > 0)
7747 {
7748 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7749
7750 for (int i = 0; i < config_OnFire_subclass_count; i++)
7751 {
7752 string particle_class = "";
7754 string config_OnFire_entry = config_OnFire_class + particle_class;
7755 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7756 WPOF_array.Insert(WPOF);
7757 }
7758
7759
7761 }
7762 }
7763
7765 {
7766 config_to_search = "CfgWeapons";
7767 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7768
7769 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7770
7772
7773 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7774 {
7775 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7776
7777 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7778 {
7779 string particle_class2 = "";
7781 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7782 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7783 WPOBE_array.Insert(WPOBE);
7784 }
7785
7786
7788 }
7789 }
7790 }
7791
7792
7794 {
7797
7799 {
7800 string config_to_search = "CfgVehicles";
7801
7802 if (IsInherited(Weapon))
7803 config_to_search = "CfgWeapons";
7804
7805 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7806 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7807
7808 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7809 {
7810
7812
7814 {
7816 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7818 return;
7819 }
7820
7823
7824
7825
7827 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7828
7829 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7830 {
7831 string particle_class = "";
7833 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7835
7836 if (entry_type == CT_CLASS)
7837 {
7838 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7839 WPOOH_array.Insert(WPOF);
7840 }
7841 }
7842
7843
7845 }
7846 }
7847 }
7848
7850 {
7852 }
7853
7855 {
7857 {
7859
7862
7865
7866 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7867 }
7868 }
7869
7871 {
7873 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7874
7876 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7877
7879 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7880
7882 {
7884 }
7885 }
7886
7888 {
7890 }
7891
7893 {
7896 else
7898
7900 {
7903 }
7904 else
7905 {
7908
7911 }
7912
7914 }
7915
7917 {
7919 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7920 }
7921
7923 {
7925 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7927 }
7928
7930 {
7932 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7933 }
7934
7936 {
7939
7940 OverheatingParticle OP = new OverheatingParticle();
7945
7947 }
7948
7950 {
7953
7954 return -1;
7955 }
7956
7958 {
7960 {
7963
7964 for (int i = count; i > 0; --i)
7965 {
7966 int id = i - 1;
7969
7972
7973 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7974 {
7975 if (p)
7976 {
7979 }
7980 }
7981 }
7982 }
7983 }
7984
7986 {
7988 {
7990 {
7991 int id = i - 1;
7993
7994 if (OP)
7995 {
7997
7998 if (p)
7999 {
8001 }
8002
8003 delete OP;
8004 }
8005 }
8006
8009 }
8010 }
8011
8014 {
8015 return 0.0;
8016 }
8017
8018
8020 {
8021 return 250;
8022 }
8023
8025 {
8026 return 0;
8027 }
8028
8031 {
8033 return true;
8034
8035 return false;
8036 }
8037
8040 {
8043
8045 {
8047 }
8048 else
8049 {
8050
8052 }
8053
8055 }
8056
8063 {
8064 return -1;
8065 }
8066
8067
8068
8069
8071 {
8073 {
8075 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8076
8077 if (r_index >= 0)
8078 {
8079 InventoryLocation r_il = new InventoryLocation;
8080 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8081
8082 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8085 {
8086 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8087 }
8089 {
8090 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8091 }
8092
8093 }
8094
8095 player.GetHumanInventory().ClearUserReservedLocation(this);
8096 }
8097
8100 }
8101
8102
8103
8104
8106 {
8107 return ItemBase.m_DebugActionsMask;
8108 }
8109
8111 {
8112 return ItemBase.m_DebugActionsMask & mask;
8113 }
8114
8116 {
8117 ItemBase.m_DebugActionsMask = mask;
8118 }
8119
8121 {
8122 ItemBase.m_DebugActionsMask |= mask;
8123 }
8124
8126 {
8127 ItemBase.m_DebugActionsMask &= ~mask;
8128 }
8129
8131 {
8133 {
8135 }
8136 else
8137 {
8139 }
8140 }
8141
8142
8144 {
8145 if (GetEconomyProfile())
8146 {
8147 float q_max = GetEconomyProfile().GetQuantityMax();
8148 if (q_max > 0)
8149 {
8150 float q_min = GetEconomyProfile().GetQuantityMin();
8151 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8152
8154 {
8155 ComponentEnergyManager comp = GetCompEM();
8157 {
8159 }
8160 }
8162 {
8164
8165 }
8166
8167 }
8168 }
8169 }
8170
8173 {
8174 EntityAI parent = GetHierarchyParent();
8175
8176 if (parent)
8177 {
8178 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8179 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8180 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8181 }
8182 }
8183
8186 {
8187 EntityAI parent = GetHierarchyParent();
8188
8189 if (parent)
8190 {
8191 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8192 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8193 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
8194 }
8195 }
8196
8198 {
8199
8200
8201
8202
8204
8206 {
8207 if (ScriptInputUserData.CanStoreInputUserData())
8208 {
8209 ScriptInputUserData ctx = new ScriptInputUserData;
8215 ctx.
Write(use_stack_max);
8218
8220 {
8221 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8222 }
8223 }
8224 }
8225 else if (!
GetGame().IsMultiplayer())
8226 {
8228 }
8229 }
8230
8232 {
8234 }
8235
8237 {
8239 }
8240
8242 {
8244 }
8245
8247 {
8248
8249 return false;
8250 }
8251
8253 {
8254 return false;
8255 }
8256
8260 {
8261 return false;
8262 }
8263
8265 {
8266 return "";
8267 }
8268
8270
8272 {
8273 return false;
8274 }
8275
8277 {
8278 return true;
8279 }
8280
8281
8282
8284 {
8285 return true;
8286 }
8287
8289 {
8290 return true;
8291 }
8292
8294 {
8295 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8297 }
8298
8300 {
8302 }
8303
8305 {
8307 if (!is_being_placed)
8309 SetSynchDirty();
8310 }
8311
8312
8314
8316 {
8318 }
8319
8321 {
8323 }
8324
8326 {
8327 return 1;
8328 }
8329
8331 {
8332 return false;
8333 }
8334
8336 {
8338 SetSynchDirty();
8339 }
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8376 {
8377 super.OnMovedInsideCargo(container);
8378
8379 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8380 }
8381
8382 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8383 {
8384 super.EEItemLocationChanged(oldLoc,newLoc);
8385
8386 PlayerBase new_player = null;
8387 PlayerBase old_player = null;
8388
8389 if (newLoc.GetParent())
8390 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8391
8392 if (oldLoc.GetParent())
8393 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8394
8396 {
8397 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8398
8399 if (r_index >= 0)
8400 {
8401 InventoryLocation r_il = new InventoryLocation;
8402 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8403
8404 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8407 {
8408 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8409 }
8411 {
8412 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8413 }
8414
8415 }
8416 }
8417
8419 {
8420 if (new_player)
8421 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8422
8423 if (new_player == old_player)
8424 {
8425
8426 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8427 {
8429 {
8430 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8431 {
8432 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8433 }
8434 }
8435 else
8436 {
8437 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8438 }
8439 }
8440
8441 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8442 {
8443 int type = oldLoc.GetType();
8445 {
8446 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8447 }
8449 {
8450 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8451 }
8452 }
8453 if (!m_OldLocation)
8454 {
8455 m_OldLocation = new InventoryLocation;
8456 }
8457 m_OldLocation.Copy(oldLoc);
8458 }
8459 else
8460 {
8461 if (m_OldLocation)
8462 {
8463 m_OldLocation.Reset();
8464 }
8465 }
8466
8468 }
8469 else
8470 {
8471 if (new_player)
8472 {
8473 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8474 if (res_index >= 0)
8475 {
8476 InventoryLocation il = new InventoryLocation;
8477 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8479 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8482 {
8483 il.
GetParent().GetOnReleaseLock().Invoke(it);
8484 }
8486 {
8488 }
8489
8490 }
8491 }
8493 {
8494
8496 }
8497
8498 if (m_OldLocation)
8499 {
8500 m_OldLocation.Reset();
8501 }
8502 }
8503 }
8504
8505 override void EOnContact(IEntity other, Contact extra)
8506 {
8508 {
8509 int liquidType = -1;
8511 if (impactSpeed > 0.0)
8512 {
8514 #ifndef SERVER
8516 #else
8518 SetSynchDirty();
8519 #endif
8521 }
8522 }
8523
8524 #ifdef SERVER
8525 if (GetCompEM() && GetCompEM().IsPlugged())
8526 {
8527 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8528 GetCompEM().UnplugThis();
8529 }
8530 #endif
8531 }
8532
8534
8536 {
8538 }
8539
8541 {
8542
8543 }
8544
8546 {
8547 super.OnItemLocationChanged(old_owner, new_owner);
8548
8549 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8550 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8551
8552 if (!relatedPlayer && playerNew)
8553 relatedPlayer = playerNew;
8554
8555 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8556 {
8558 if (actionMgr)
8559 {
8560 ActionBase currentAction = actionMgr.GetRunningAction();
8561 if (currentAction)
8563 }
8564 }
8565
8566 Man ownerPlayerOld = null;
8567 Man ownerPlayerNew = null;
8568
8569 if (old_owner)
8570 {
8571 if (old_owner.
IsMan())
8572 {
8573 ownerPlayerOld = Man.Cast(old_owner);
8574 }
8575 else
8576 {
8577 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8578 }
8579 }
8580 else
8581 {
8583 {
8585
8586 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8587 {
8588 GetCompEM().UnplugThis();
8589 }
8590 }
8591 }
8592
8593 if (new_owner)
8594 {
8595 if (new_owner.
IsMan())
8596 {
8597 ownerPlayerNew = Man.Cast(new_owner);
8598 }
8599 else
8600 {
8601 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8602 }
8603 }
8604
8605 if (ownerPlayerOld != ownerPlayerNew)
8606 {
8607 if (ownerPlayerOld)
8608 {
8609 array<EntityAI> subItemsExit = new array<EntityAI>;
8611 for (int i = 0; i < subItemsExit.Count(); i++)
8612 {
8615 }
8616 }
8617
8618 if (ownerPlayerNew)
8619 {
8620 array<EntityAI> subItemsEnter = new array<EntityAI>;
8622 for (int j = 0; j < subItemsEnter.Count(); j++)
8623 {
8626 }
8627 }
8628 }
8629 else if (ownerPlayerNew != null)
8630 {
8631 PlayerBase nplayer;
8632 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8633 {
8634 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8636 for (int k = 0; k < subItemsUpdate.Count(); k++)
8637 {
8639 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8640 }
8641 }
8642 }
8643
8644 if (old_owner)
8645 old_owner.OnChildItemRemoved(this);
8646 if (new_owner)
8647 new_owner.OnChildItemReceived(this);
8648 }
8649
8650
8652 {
8653 super.EEDelete(parent);
8654 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8655 if (player)
8656 {
8658
8659 if (player.IsAlive())
8660 {
8661 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8662 if (r_index >= 0)
8663 {
8664 InventoryLocation r_il = new InventoryLocation;
8665 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8666
8667 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8670 {
8671 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8672 }
8674 {
8675 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8676 }
8677
8678 }
8679
8680 player.RemoveQuickBarEntityShortcut(this);
8681 }
8682 }
8683 }
8684
8686 {
8687 super.EEKilled(killer);
8688
8691 {
8692 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8693 {
8694 if (IsMagazine())
8695 {
8696 if (Magazine.Cast(this).GetAmmoCount() > 0)
8697 {
8699 }
8700 }
8701 else
8702 {
8704 }
8705 }
8706 }
8707 }
8708
8710 {
8711 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8712
8713 super.OnWasAttached(parent, slot_id);
8714
8717
8719 }
8720
8722 {
8723 super.OnWasDetached(parent, slot_id);
8724
8727 }
8728
8730 {
8731 int idx;
8734
8735 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8736 if (inventory_slots.Count() < 1)
8737 {
8738 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8739 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8740 }
8741 else
8742 {
8743 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8744 }
8745
8746 idx = inventory_slots.Find(slot);
8747 if (idx < 0)
8748 return "";
8749
8750 return attach_types.Get(idx);
8751 }
8752
8754 {
8755 int idx = -1;
8756 string slot;
8757
8760
8761 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8762 if (inventory_slots.Count() < 1)
8763 {
8764 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8765 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8766 }
8767 else
8768 {
8769 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8770 if (detach_types.Count() < 1)
8771 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8772 }
8773
8774 for (int i = 0; i < inventory_slots.Count(); i++)
8775 {
8776 slot = inventory_slots.Get(i);
8777 }
8778
8779 if (slot != "")
8780 {
8781 if (detach_types.Count() == 1)
8782 idx = 0;
8783 else
8784 idx = inventory_slots.Find(slot);
8785 }
8786 if (idx < 0)
8787 return "";
8788
8789 return detach_types.Get(idx);
8790 }
8791
8793 {
8794
8796
8797
8798 float min_time = 1;
8799 float max_time = 3;
8800 float delay = Math.RandomFloat(min_time, max_time);
8801
8802 explode_timer.Run(delay, this, "DoAmmoExplosion");
8803 }
8804
8806 {
8807 Magazine magazine = Magazine.Cast(this);
8808 int pop_sounds_count = 6;
8809 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8810
8811
8812 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8813 string sound_name = pop_sounds[ sound_idx ];
8815
8816
8817 magazine.ServerAddAmmoCount(-1);
8818
8819
8820 float min_temp_to_explode = 100;
8821
8822 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8823 {
8825 }
8826 }
8827
8828
8829 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8830 {
8831 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8832
8833 const int CHANCE_DAMAGE_CARGO = 4;
8834 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8835 const int CHANCE_DAMAGE_NOTHING = 2;
8836
8838 {
8839 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8840 int chances;
8841 int rnd;
8842
8843 if (GetInventory().GetCargo())
8844 {
8845 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8846 rnd = Math.RandomInt(0,chances);
8847
8848 if (rnd < CHANCE_DAMAGE_CARGO)
8849 {
8851 }
8852 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8853 {
8855 }
8856 }
8857 else
8858 {
8859 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8860 rnd = Math.RandomInt(0,chances);
8861
8862 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8863 {
8865 }
8866 }
8867 }
8868 }
8869
8871 {
8872 if (GetInventory().GetCargo())
8873 {
8874 int item_count = GetInventory().GetCargo().GetItemCount();
8875 if (item_count > 0)
8876 {
8877 int random_pick = Math.RandomInt(0, item_count);
8879 if (!item.IsExplosive())
8880 {
8881 item.AddHealth("","",damage);
8882 return true;
8883 }
8884 }
8885 }
8886 return false;
8887 }
8888
8890 {
8891 int attachment_count = GetInventory().AttachmentCount();
8892 if (attachment_count > 0)
8893 {
8894 int random_pick = Math.RandomInt(0, attachment_count);
8895 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8896 if (!attachment.IsExplosive())
8897 {
8898 attachment.AddHealth("","",damage);
8899 return true;
8900 }
8901 }
8902 return false;
8903 }
8904
8906 {
8908 }
8909
8911 {
8913 return GetInventory().CanRemoveEntity();
8914
8915 return false;
8916 }
8917
8919 {
8921 return;
8922
8924 {
8925 if (ScriptInputUserData.CanStoreInputUserData())
8926 {
8927 ScriptInputUserData ctx = new ScriptInputUserData;
8932 ctx.
Write(destination_entity);
8936 }
8937 }
8938 else if (!
GetGame().IsMultiplayer())
8939 {
8941 }
8942 }
8943
8945 {
8947 return;
8948
8949 float split_quantity_new;
8953 InventoryLocation loc = new InventoryLocation;
8954
8955 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8956 {
8958 split_quantity_new = stack_max;
8959 else
8961
8962 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8963 if (new_item)
8964 {
8965 new_item.SetResultOfSplit(true);
8966 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8968 new_item.SetQuantity(split_quantity_new);
8969 }
8970 }
8971 else if (destination_entity && slot_id == -1)
8972 {
8973 if (quantity > stack_max)
8974 split_quantity_new = stack_max;
8975 else
8976 split_quantity_new = quantity;
8977
8979 {
8982 }
8983
8984 if (new_item)
8985 {
8986 new_item.SetResultOfSplit(true);
8987 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8989 new_item.SetQuantity(split_quantity_new);
8990 }
8991 }
8992 else
8993 {
8994 if (stack_max != 0)
8995 {
8997 {
8999 }
9000
9001 if (split_quantity_new == 0)
9002 {
9003 if (!
GetGame().IsMultiplayer())
9004 player.PhysicalPredictiveDropItem(this);
9005 else
9006 player.ServerDropEntity(this);
9007 return;
9008 }
9009
9011
9012 if (new_item)
9013 {
9014 new_item.SetResultOfSplit(true);
9015 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9017 new_item.SetQuantity(stack_max);
9018 new_item.PlaceOnSurface();
9019 }
9020 }
9021 }
9022 }
9023
9025 {
9027 return;
9028
9029 float split_quantity_new;
9033 InventoryLocation loc = new InventoryLocation;
9034
9035 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9036 {
9038 split_quantity_new = stack_max;
9039 else
9041
9042 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9043 if (new_item)
9044 {
9045 new_item.SetResultOfSplit(true);
9046 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9048 new_item.SetQuantity(split_quantity_new);
9049 }
9050 }
9051 else if (destination_entity && slot_id == -1)
9052 {
9053 if (quantity > stack_max)
9054 split_quantity_new = stack_max;
9055 else
9056 split_quantity_new = quantity;
9057
9059 {
9062 }
9063
9064 if (new_item)
9065 {
9066 new_item.SetResultOfSplit(true);
9067 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9069 new_item.SetQuantity(split_quantity_new);
9070 }
9071 }
9072 else
9073 {
9074 if (stack_max != 0)
9075 {
9077 {
9079 }
9080
9082
9083 if (new_item)
9084 {
9085 new_item.SetResultOfSplit(true);
9086 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9088 new_item.SetQuantity(stack_max);
9089 new_item.PlaceOnSurface();
9090 }
9091 }
9092 }
9093 }
9094
9096 {
9098 return;
9099
9101 {
9102 if (ScriptInputUserData.CanStoreInputUserData())
9103 {
9104 ScriptInputUserData ctx = new ScriptInputUserData;
9109 dst.WriteToContext(ctx);
9111 }
9112 }
9113 else if (!
GetGame().IsMultiplayer())
9114 {
9116 }
9117 }
9118
9120 {
9122 return;
9123
9125 {
9126 if (ScriptInputUserData.CanStoreInputUserData())
9127 {
9128 ScriptInputUserData ctx = new ScriptInputUserData;
9133 ctx.
Write(destination_entity);
9139 }
9140 }
9141 else if (!
GetGame().IsMultiplayer())
9142 {
9144 }
9145 }
9146
9148 {
9150 }
9151
9153 {
9155 return this;
9156
9158 float split_quantity_new;
9160 if (dst.IsValid())
9161 {
9162 int slot_id = dst.GetSlot();
9164
9165 if (quantity > stack_max)
9166 split_quantity_new = stack_max;
9167 else
9168 split_quantity_new = quantity;
9169
9171
9172 if (new_item)
9173 {
9174 new_item.SetResultOfSplit(true);
9175 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9178 }
9179
9180 return new_item;
9181 }
9182
9183 return null;
9184 }
9185
9187 {
9189 return;
9190
9192 float split_quantity_new;
9194 if (destination_entity)
9195 {
9197 if (quantity > stackable)
9198 split_quantity_new = stackable;
9199 else
9200 split_quantity_new = quantity;
9201
9202 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
9203 if (new_item)
9204 {
9205 new_item.SetResultOfSplit(true);
9206 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9208 new_item.SetQuantity(split_quantity_new);
9209 }
9210 }
9211 }
9212
9214 {
9216 return;
9217
9219 {
9220 if (ScriptInputUserData.CanStoreInputUserData())
9221 {
9222 ScriptInputUserData ctx = new ScriptInputUserData;
9227 ItemBase destination_entity =
this;
9228 ctx.
Write(destination_entity);
9232 }
9233 }
9234 else if (!
GetGame().IsMultiplayer())
9235 {
9237 }
9238 }
9239
9241 {
9243 return;
9244
9246 float split_quantity_new;
9248 if (player)
9249 {
9251 if (quantity > stackable)
9252 split_quantity_new = stackable;
9253 else
9254 split_quantity_new = quantity;
9255
9256 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
9257 new_item =
ItemBase.Cast(in_hands);
9258 if (new_item)
9259 {
9260 new_item.SetResultOfSplit(true);
9261 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9263 new_item.SetQuantity(split_quantity_new);
9264 }
9265 }
9266 }
9267
9269 {
9271 return;
9272
9274 float split_quantity_new = Math.Floor(quantity * 0.5);
9275
9277
9278 if (new_item)
9279 {
9280 if (new_item.GetQuantityMax() < split_quantity_new)
9281 {
9282 split_quantity_new = new_item.GetQuantityMax();
9283 }
9284
9285 new_item.SetResultOfSplit(true);
9286 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9287
9289 {
9292 }
9293 else
9294 {
9297 }
9298 }
9299 }
9300
9302 {
9304 return;
9305
9307 float split_quantity_new = Math.Floor(quantity / 2);
9308
9309 InventoryLocation invloc = new InventoryLocation;
9311
9313 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9314
9315 if (new_item)
9316 {
9317 if (new_item.GetQuantityMax() < split_quantity_new)
9318 {
9319 split_quantity_new = new_item.GetQuantityMax();
9320 }
9322 {
9325 }
9326 else
9327 {
9330 }
9331 }
9332 }
9333
9336 {
9337 SetWeightDirty();
9339
9340 if (parent)
9341 parent.OnAttachmentQuantityChangedEx(this, delta);
9342
9344 {
9346 {
9348 }
9350 {
9351 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9353 }
9354 }
9355
9356 }
9357
9360 {
9361
9362 }
9363
9366 {
9368 }
9369
9371 {
9372 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9373
9375 {
9376 if (newLevel == GameConstants.STATE_RUINED)
9377 {
9379 EntityAI parent = GetHierarchyParent();
9380 if (parent && parent.IsFireplace())
9381 {
9382 CargoBase cargo = GetInventory().GetCargo();
9383 if (cargo)
9384 {
9386 {
9388 }
9389 }
9390 }
9391 }
9392
9394 {
9395
9397 return;
9398 }
9399
9400 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9401 {
9403 }
9404 }
9405 }
9406
9407
9409 {
9410 super.OnRightClick();
9411
9413 {
9415 {
9416 if (ScriptInputUserData.CanStoreInputUserData())
9417 {
9418 vector m4[4];
9420
9421 EntityAI root = GetHierarchyRoot();
9422
9423 InventoryLocation dst = new InventoryLocation;
9425 {
9426 if (root)
9427 {
9428 root.GetTransform(m4);
9430 }
9431 else
9432 GetInventory().GetCurrentInventoryLocation(dst);
9433 }
9434 else
9435 {
9437
9438
9439 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9440 {
9441 if (root)
9442 {
9443 root.GetTransform(m4);
9445 }
9446 else
9447 GetInventory().GetCurrentInventoryLocation(dst);
9448 }
9449 else
9450 {
9451 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9452 }
9453 }
9454
9455 ScriptInputUserData ctx = new ScriptInputUserData;
9463 }
9464 }
9465 else if (!
GetGame().IsMultiplayer())
9466 {
9468 }
9469 }
9470 }
9471
9472 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9473 {
9474
9475 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9476 return false;
9477
9478 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9479 return false;
9480
9481
9483 return false;
9484
9485
9486 Magazine mag = Magazine.Cast(this);
9487 if (mag)
9488 {
9489 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9490 return false;
9491
9492 if (stack_max_limit)
9493 {
9494 Magazine other_mag = Magazine.Cast(other_item);
9495 if (other_item)
9496 {
9497 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9498 return false;
9499 }
9500
9501 }
9502 }
9503 else
9504 {
9505
9507 return false;
9508
9510 return false;
9511 }
9512
9513 PlayerBase player = null;
9514 if (CastTo(player, GetHierarchyRootPlayer()))
9515 {
9516 if (player.GetInventory().HasAttachment(this))
9517 return false;
9518
9519 if (player.IsItemsToDelete())
9520 return false;
9521 }
9522
9523 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9524 return false;
9525
9526 int slotID;
9528 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9529 return false;
9530
9531 return true;
9532 }
9533
9535 {
9537 }
9538
9540 {
9541 return m_IsResultOfSplit;
9542 }
9543
9545 {
9546 m_IsResultOfSplit = value;
9547 }
9548
9550 {
9552 }
9553
9555 {
9556 float other_item_quantity = other_item.GetQuantity();
9557 float this_free_space;
9558
9560
9562
9563 if (other_item_quantity > this_free_space)
9564 {
9565 return this_free_space;
9566 }
9567 else
9568 {
9569 return other_item_quantity;
9570 }
9571 }
9572
9574 {
9576 }
9577
9579 {
9581 return;
9582
9583 if (!IsMagazine() && other_item)
9584 {
9586 if (quantity_used != 0)
9587 {
9588 float hp1 = GetHealth01("","");
9589 float hp2 = other_item.GetHealth01("","");
9590 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9591 hpResult = hpResult / (
GetQuantity() + quantity_used);
9592
9593 hpResult *= GetMaxHealth();
9594 Math.Round(hpResult);
9595 SetHealth("", "Health", hpResult);
9596
9598 other_item.AddQuantity(-quantity_used);
9599 }
9600 }
9602 }
9603
9605 {
9606 #ifdef SERVER
9607 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9608 GetHierarchyParent().IncreaseLifetimeUp();
9609 #endif
9610 };
9611
9613 {
9614 PlayerBase p = PlayerBase.Cast(player);
9615
9616 array<int> recipesIds = p.m_Recipes;
9617 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9618 if (moduleRecipesManager)
9619 {
9620 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9621 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9622 }
9623
9624 for (int i = 0;i < recipesIds.Count(); i++)
9625 {
9626 int key = recipesIds.Get(i);
9627 string recipeName = moduleRecipesManager.GetRecipeName(key);
9629 }
9630 }
9631
9632
9633 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9634 {
9635 super.GetDebugActions(outputList);
9636
9637
9642
9643
9647
9651
9652
9655
9656
9658 {
9661 }
9662
9664
9667
9671 }
9672
9673
9674
9675
9677 {
9678 super.OnAction(action_id, player, ctx);
9679 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9680 {
9681 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9682 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9683 PlayerBase p = PlayerBase.Cast(player);
9684 if (
EActions.RECIPES_RANGE_START < 1000)
9685 {
9686 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9687 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9688 }
9689 }
9690 #ifndef SERVER
9691 else if (action_id ==
EActions.WATCH_PLAYER)
9692 {
9693 PluginDeveloper.SetDeveloperItemClientEx(player);
9694 }
9695 #endif
9697 {
9698 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9699 {
9700 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9701 OnDebugButtonPressServer(id + 1);
9702 }
9703
9704 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9705 {
9706 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9708 }
9709
9710 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9711 {
9712 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9714 }
9715
9716 else if (action_id ==
EActions.ADD_QUANTITY)
9717 {
9718 if (IsMagazine())
9719 {
9720 Magazine mag = Magazine.Cast(this);
9721 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9722 }
9723 else
9724 {
9726 }
9727
9728 if (m_EM)
9729 {
9730 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9731 }
9732
9733 }
9734
9735 else if (action_id ==
EActions.REMOVE_QUANTITY)
9736 {
9737 if (IsMagazine())
9738 {
9739 Magazine mag2 = Magazine.Cast(this);
9740 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9741 }
9742 else
9743 {
9745 }
9746 if (m_EM)
9747 {
9748 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9749 }
9750
9751 }
9752
9753 else if (action_id ==
EActions.SET_QUANTITY_0)
9754 {
9756
9757 if (m_EM)
9758 {
9759 m_EM.SetEnergy(0);
9760 }
9761 }
9762
9763 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9764 {
9766
9767 if (m_EM)
9768 {
9769 m_EM.SetEnergy(m_EM.GetEnergyMax());
9770 }
9771 }
9772
9773 else if (action_id ==
EActions.ADD_HEALTH)
9774 {
9775 AddHealth("","",GetMaxHealth("","Health")/5);
9776 }
9777 else if (action_id ==
EActions.REMOVE_HEALTH)
9778 {
9779 AddHealth("","",-GetMaxHealth("","Health")/5);
9780 }
9781 else if (action_id ==
EActions.DESTROY_HEALTH)
9782 {
9783 SetHealth01("","",0);
9784 }
9785 else if (action_id ==
EActions.WATCH_ITEM)
9786 {
9788 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9789 #ifdef DEVELOPER
9790 SetDebugDeveloper_item(this);
9791 #endif
9792 }
9793
9794 else if (action_id ==
EActions.ADD_TEMPERATURE)
9795 {
9796 AddTemperature(20);
9797
9798 }
9799
9800 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9801 {
9802 AddTemperature(-20);
9803
9804 }
9805
9806 else if (action_id ==
EActions.FLIP_FROZEN)
9807 {
9808 SetFrozen(!GetIsFrozen());
9809
9810 }
9811
9812 else if (action_id ==
EActions.ADD_WETNESS)
9813 {
9815
9816 }
9817
9818 else if (action_id ==
EActions.REMOVE_WETNESS)
9819 {
9821
9822 }
9823
9824 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9825 {
9828
9829
9830 }
9831
9832 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9833 {
9836 }
9837
9838 else if (action_id ==
EActions.MAKE_SPECIAL)
9839 {
9840 auto debugParams = DebugSpawnParams.WithPlayer(player);
9841 OnDebugSpawnEx(debugParams);
9842 }
9843
9844 else if (action_id ==
EActions.DELETE)
9845 {
9846 Delete();
9847 }
9848
9849 }
9850
9851
9852 return false;
9853 }
9854
9855
9856
9857
9861
9864
9865
9866
9868 {
9869 return false;
9870 }
9871
9872
9874 {
9875 return true;
9876 }
9877
9878
9880 {
9881 return true;
9882 }
9883
9884
9885
9887 {
9888 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9890 }
9891
9894 {
9895 return null;
9896 }
9897
9899 {
9900 return false;
9901 }
9902
9904 {
9905 return false;
9906 }
9907
9911
9912
9914 {
9915 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9916 return module_repairing.CanRepair(this, item_repair_kit);
9917 }
9918
9919
9920 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9921 {
9922 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9923 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9924 }
9925
9926
9928 {
9929
9930
9931
9932
9933
9934
9935
9936
9937 return 1;
9938 }
9939
9940
9941
9943 {
9945 }
9946
9947
9948
9950 {
9952 }
9953
9954
9963 {
9964 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9965
9966 if (player)
9967 {
9968 player.MessageStatus(text);
9969 }
9970 }
9971
9972
9981 {
9982 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9983
9984 if (player)
9985 {
9986 player.MessageAction(text);
9987 }
9988 }
9989
9990
9999 {
10000 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10001
10002 if (player)
10003 {
10004 player.MessageFriendly(text);
10005 }
10006 }
10007
10008
10017 {
10018 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10019
10020 if (player)
10021 {
10022 player.MessageImportant(text);
10023 }
10024 }
10025
10027 {
10028 return true;
10029 }
10030
10031
10032 override bool KindOf(
string tag)
10033 {
10034 bool found = false;
10035 string item_name = this.
GetType();
10038
10039 int array_size = item_tag_array.Count();
10040 for (int i = 0; i < array_size; i++)
10041 {
10042 if (item_tag_array.Get(i) == tag)
10043 {
10044 found = true;
10045 break;
10046 }
10047 }
10048 return found;
10049 }
10050
10051
10053 {
10054
10055 super.OnRPC(sender, rpc_type,ctx);
10056
10057
10058 switch (rpc_type)
10059 {
10060 #ifndef SERVER
10061 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10062 Param2<bool, string> p = new Param2<bool, string>(false, "");
10063
10065 return;
10066
10067 bool play = p.param1;
10068 string soundSet = p.param2;
10069
10070 if (play)
10071 {
10073 {
10075 {
10077 }
10078 }
10079 else
10080 {
10082 }
10083 }
10084 else
10085 {
10087 }
10088
10089 break;
10090 #endif
10091
10092 }
10093
10095 {
10097 }
10098 }
10099
10100
10101
10102
10104 {
10105 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10106 return plugin.GetID(
name);
10107 }
10108
10110 {
10111 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10112 return plugin.GetName(id);
10113 }
10114
10117 {
10118
10119
10120 int varFlags;
10121 if (!ctx.
Read(varFlags))
10122 return;
10123
10124 if (varFlags & ItemVariableFlags.FLOAT)
10125 {
10127 }
10128 }
10129
10131 {
10132
10133 super.SerializeNumericalVars(floats_out);
10134
10135
10136
10138 {
10140 }
10141
10143 {
10145 }
10146
10148 {
10150 }
10151
10153 {
10158 }
10159
10161 {
10163 }
10164 }
10165
10167 {
10168
10169 super.DeSerializeNumericalVars(floats);
10170
10171
10172 int index = 0;
10173 int mask = Math.Round(floats.Get(index));
10174
10175 index++;
10176
10178 {
10180 {
10182 }
10183 else
10184 {
10185 float quantity = floats.Get(index);
10186 SetQuantity(quantity,
true,
false,
false,
false);
10187 }
10188 index++;
10189 }
10190
10192 {
10193 float wet = floats.Get(index);
10195 index++;
10196 }
10197
10199 {
10200 int liquidtype = Math.Round(floats.Get(index));
10202 index++;
10203 }
10204
10206 {
10208 index++;
10210 index++;
10212 index++;
10214 index++;
10215 }
10216
10218 {
10219 int cleanness = Math.Round(floats.Get(index));
10221 index++;
10222 }
10223 }
10224
10226 {
10227 super.WriteVarsToCTX(ctx);
10228
10229
10231 {
10233 }
10234
10236 {
10238 }
10239
10241 {
10243 }
10244
10246 {
10247 int r,g,b,a;
10253 }
10254
10256 {
10258 }
10259 }
10260
10262 {
10263 if (!super.ReadVarsFromCTX(ctx,version))
10264 return false;
10265
10266 int intValue;
10267 float value;
10268
10269 if (version < 140)
10270 {
10271 if (!ctx.
Read(intValue))
10272 return false;
10273
10274 m_VariablesMask = intValue;
10275 }
10276
10278 {
10279 if (!ctx.
Read(value))
10280 return false;
10281
10283 {
10285 }
10286 else
10287 {
10289 }
10290 }
10291
10292 if (version < 140)
10293 {
10295 {
10296 if (!ctx.
Read(value))
10297 return false;
10298 SetTemperatureDirect(value);
10299 }
10300 }
10301
10303 {
10304 if (!ctx.
Read(value))
10305 return false;
10307 }
10308
10310 {
10311 if (!ctx.
Read(intValue))
10312 return false;
10314 }
10315
10317 {
10318 int r,g,b,a;
10320 return false;
10322 return false;
10324 return false;
10326 return false;
10327
10329 }
10330
10332 {
10333 if (!ctx.
Read(intValue))
10334 return false;
10336 }
10337
10338 if (version >= 138 && version < 140)
10339 {
10341 {
10342 if (!ctx.
Read(intValue))
10343 return false;
10344 SetFrozen(intValue);
10345 }
10346 }
10347
10348 return true;
10349 }
10350
10351
10353 {
10356 {
10358 }
10359
10360 if (!super.OnStoreLoad(ctx, version))
10361 {
10363 return false;
10364 }
10365
10366 if (version >= 114)
10367 {
10368 bool hasQuickBarIndexSaved;
10369
10370 if (!ctx.
Read(hasQuickBarIndexSaved))
10371 {
10373 return false;
10374 }
10375
10376 if (hasQuickBarIndexSaved)
10377 {
10378 int itmQBIndex;
10379
10380
10381 if (!ctx.
Read(itmQBIndex))
10382 {
10384 return false;
10385 }
10386
10387 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10388 if (itmQBIndex != -1 && parentPlayer)
10389 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10390 }
10391 }
10392 else
10393 {
10394
10395 PlayerBase player;
10396 int itemQBIndex;
10397 if (version ==
int.
MAX)
10398 {
10399 if (!ctx.
Read(itemQBIndex))
10400 {
10402 return false;
10403 }
10404 }
10405 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10406 {
10407
10408 if (!ctx.
Read(itemQBIndex))
10409 {
10411 return false;
10412 }
10413 if (itemQBIndex != -1 && player)
10414 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10415 }
10416 }
10417
10418 if (version < 140)
10419 {
10420
10421 if (!LoadVariables(ctx, version))
10422 {
10424 return false;
10425 }
10426 }
10427
10428
10430 {
10432 return false;
10433 }
10434 if (version >= 132)
10435 {
10437 if (raib)
10438 {
10440 {
10442 return false;
10443 }
10444 }
10445 }
10446
10448 return true;
10449 }
10450
10451
10452
10454 {
10455 super.OnStoreSave(ctx);
10456
10457 PlayerBase player;
10458 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10459 {
10461
10462 int itemQBIndex = -1;
10463 itemQBIndex = player.FindQuickBarEntityIndex(this);
10464 ctx.
Write(itemQBIndex);
10465 }
10466 else
10467 {
10469 }
10470
10472
10474 if (raib)
10475 {
10477 }
10478 }
10479
10480
10482 {
10483 super.AfterStoreLoad();
10484
10486 {
10488 }
10489
10491 {
10494 }
10495 }
10496
10498 {
10499 super.EEOnAfterLoad();
10500
10502 {
10504 }
10505
10508 }
10509
10511 {
10512 return false;
10513 }
10514
10515
10516
10518 {
10520 {
10521 #ifdef PLATFORM_CONSOLE
10522
10524 {
10526 if (menu)
10527 {
10529 }
10530 }
10531 #endif
10532 }
10533
10535 {
10538 }
10539
10541 {
10542 SetWeightDirty();
10544 }
10546 {
10549 }
10550
10552 {
10555 }
10557 {
10560 }
10561
10562 super.OnVariablesSynchronized();
10563 }
10564
10565
10566
10568 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10569 {
10570 if (!IsServerCheck(allow_client))
10571 return false;
10572
10574 return false;
10575
10578
10579 if (value <= (min + 0.001))
10580 value = min;
10581
10582 if (value == min)
10583 {
10584 if (destroy_config)
10585 {
10586 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10587 if (dstr)
10588 {
10590 this.Delete();
10591 return true;
10592 }
10593 }
10594 else if (destroy_forced)
10595 {
10597 this.Delete();
10598 return true;
10599 }
10600
10602 }
10603
10606
10608 {
10610
10611 if (delta)
10613 }
10614
10616
10617 return false;
10618 }
10619
10620
10622 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10623 {
10625 }
10626
10628 {
10631 }
10632
10634 {
10637 }
10638
10641 {
10642 float value_clamped = Math.Clamp(value, 0, 1);
10644 SetQuantity(result, destroy_config, destroy_forced);
10645 }
10646
10647
10650 {
10652 }
10653
10655 {
10657 }
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10669 {
10670 int slot = -1;
10671 if (GetInventory())
10672 {
10673 InventoryLocation il = new InventoryLocation;
10674 GetInventory().GetCurrentInventoryLocation(il);
10676 }
10677
10679 }
10680
10682 {
10683 float quantity_max = 0;
10684
10686 {
10687 if (attSlotID != -1)
10688 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10689
10690 if (quantity_max <= 0)
10692 }
10693
10694 if (quantity_max <= 0)
10696
10697 return quantity_max;
10698 }
10699
10701 {
10703 }
10704
10706 {
10708 }
10709
10710
10712 {
10714 }
10715
10717 {
10719 }
10720
10722 {
10724 }
10725
10726
10728 {
10729
10730 float weightEx = GetWeightEx();
10731 float special = GetInventoryAndCargoWeight();
10732 return weightEx - special;
10733 }
10734
10735
10737 {
10739 }
10740
10742 {
10744 {
10745 #ifdef DEVELOPER
10746 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10747 {
10748 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10750 }
10751 #endif
10752
10753 return GetQuantity() * GetConfigWeightModified();
10754 }
10755 else if (HasEnergyManager())
10756 {
10757 #ifdef DEVELOPER
10758 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10759 {
10760 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10761 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10762 }
10763 #endif
10764 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10765 }
10766 else
10767 {
10768 #ifdef DEVELOPER
10769 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10770 {
10771 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10772 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10773 }
10774 #endif
10775 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10776 }
10777 }
10778
10781 {
10782 int item_count = 0;
10784
10785 if (GetInventory().GetCargo() != NULL)
10786 {
10787 item_count = GetInventory().GetCargo().GetItemCount();
10788 }
10789
10790 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10791 {
10792 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10793 if (item)
10794 item_count += item.GetNumberOfItems();
10795 }
10796 return item_count;
10797 }
10798
10801 {
10802 float weight = 0;
10803 float wetness = 1;
10804 if (include_wetness)
10807 {
10808 weight = wetness * m_ConfigWeight;
10809 }
10811 {
10812 weight = 1;
10813 }
10814 return weight;
10815 }
10816
10817
10818
10820 {
10821 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10822 {
10823 GameInventory inv = GetInventory();
10824 array<EntityAI> items = new array<EntityAI>;
10826 for (int i = 0; i < items.Count(); i++)
10827 {
10829 if (item)
10830 {
10832 }
10833 }
10834 }
10835 }
10836
10837
10838
10839
10841 {
10842 float energy = 0;
10843 if (HasEnergyManager())
10844 {
10845 energy = GetCompEM().GetEnergy();
10846 }
10847 return energy;
10848 }
10849
10850
10852 {
10853 super.OnEnergyConsumed();
10854
10856 }
10857
10859 {
10860 super.OnEnergyAdded();
10861
10863 }
10864
10865
10867 {
10868 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10869 {
10871 {
10872 float energy_0to1 = GetCompEM().GetEnergy0To1();
10874 }
10875 }
10876 }
10877
10878
10880 {
10881 return ConfigGetFloat("heatIsolation");
10882 }
10883
10885 {
10887 }
10888
10890 {
10891 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10892 if (
GetGame().ConfigIsExisting(paramPath))
10894
10895 return 0.0;
10896 }
10897
10899 {
10900 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10901 if (
GetGame().ConfigIsExisting(paramPath))
10903
10904 return 0.0;
10905 }
10906
10907 override void SetWet(
float value,
bool allow_client =
false)
10908 {
10909 if (!IsServerCheck(allow_client))
10910 return;
10911
10914
10916
10917 m_VarWet = Math.Clamp(value, min, max);
10918
10920 {
10923 }
10924 }
10925
10926 override void AddWet(
float value)
10927 {
10929 }
10930
10932 {
10934 }
10935
10937 {
10939 }
10940
10942 {
10944 }
10945
10947 {
10949 }
10950
10952 {
10954 }
10955
10956 override void OnWetChanged(
float newVal,
float oldVal)
10957 {
10960 if (newLevel != oldLevel)
10961 {
10963 }
10964 }
10965
10967 {
10968 SetWeightDirty();
10969 }
10970
10972 {
10973 return GetWetLevelInternal(
m_VarWet);
10974 }
10975
10976
10977
10979 {
10981 }
10982
10984 {
10986 }
10987
10989 {
10991 }
10992
10994 {
10996 }
10997
10998
10999
11001 {
11002 if (ConfigIsExisting("itemModelLength"))
11003 {
11004 return ConfigGetFloat("itemModelLength");
11005 }
11006 return 0;
11007 }
11008
11010 {
11011 if (ConfigIsExisting("itemAttachOffset"))
11012 {
11013 return ConfigGetFloat("itemAttachOffset");
11014 }
11015 return 0;
11016 }
11017
11018 override void SetCleanness(
int value,
bool allow_client =
false)
11019 {
11020 if (!IsServerCheck(allow_client))
11021 return;
11022
11024
11026
11029 }
11030
11032 {
11034 }
11035
11037 {
11038 return true;
11039 }
11040
11041
11042
11043
11045 {
11047 }
11048
11050 {
11052 }
11053
11054
11055
11056
11057 override void SetColor(
int r,
int g,
int b,
int a)
11058 {
11064 }
11066 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11067 {
11072 }
11073
11075 {
11077 }
11078
11081 {
11082 int r,g,b,a;
11084 r = r/255;
11085 g = g/255;
11086 b = b/255;
11087 a = a/255;
11088 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11089 }
11090
11091
11092
11093 override void SetLiquidType(
int value,
bool allow_client =
false)
11094 {
11095 if (!IsServerCheck(allow_client))
11096 return;
11097
11102 }
11103
11105 {
11106 return ConfigGetInt("varLiquidTypeInit");
11107 }
11108
11110 {
11112 }
11113
11115 {
11117 SetFrozen(false);
11118 }
11119
11122 {
11123 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11124 }
11125
11126
11129 {
11130 PlayerBase nplayer;
11131 if (PlayerBase.CastTo(nplayer, player))
11132 {
11134
11135 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11136 }
11137 }
11138
11139
11142 {
11143 PlayerBase nplayer;
11144 if (PlayerBase.CastTo(nplayer,player))
11145 {
11146
11147 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11148
11149 }
11150
11151
11152 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11153
11154
11155 if (HasEnergyManager())
11156 {
11157 GetCompEM().UpdatePlugState();
11158 }
11159 }
11160
11161
11163 {
11164 super.OnPlacementStarted(player);
11165
11167 }
11168
11169 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11170 {
11172 {
11173 m_AdminLog.OnPlacementComplete(player,
this);
11174 }
11175
11176 super.OnPlacementComplete(player, position, orientation);
11177 }
11178
11179
11180
11181
11182
11184 {
11186 {
11187 return true;
11188 }
11189 else
11190 {
11191 return false;
11192 }
11193 }
11194
11195
11197 {
11199 {
11201 }
11202 }
11203
11204
11206 {
11208 }
11209
11211 {
11213 }
11214
11215 override void InsertAgent(
int agent,
float count = 1)
11216 {
11217 if (count < 1)
11218 return;
11219
11221 }
11222
11225 {
11227 }
11228
11229
11231 {
11233 }
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11277 {
11279 return false;
11280 return true;
11281 }
11282
11284 {
11285
11287 }
11288
11289
11292 {
11293 super.CheckForRoofLimited(timeTresholdMS);
11294
11296 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11297 {
11298 m_PreviousRoofTestTime = time;
11299 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11300 }
11301 }
11302
11303
11305 {
11307 {
11308 return 0;
11309 }
11310
11311 if (GetInventory().GetAttachmentSlotsCount() != 0)
11312 {
11313 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
11314 if (filter)
11315 return filter.GetProtectionLevel(type, false, system);
11316 else
11317 return 0;
11318 }
11319
11320 string subclassPath, entryName;
11321
11322 switch (type)
11323 {
11325 entryName = "biological";
11326 break;
11328 entryName = "chemical";
11329 break;
11330 default:
11331 entryName = "biological";
11332 break;
11333 }
11334
11335 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11336
11338 }
11339
11340
11341
11344 {
11345 if (!IsMagazine())
11347
11349 }
11350
11351
11352
11353
11354
11359 {
11360 return true;
11361 }
11362
11364 {
11366 }
11367
11368
11369
11370
11371
11373 {
11374 if (parent)
11375 {
11376 if (parent.IsInherited(DayZInfected))
11377 return true;
11378
11379 if (!parent.IsRuined())
11380 return true;
11381 }
11382
11383 return true;
11384 }
11385
11387 {
11388 if (!super.CanPutAsAttachment(parent))
11389 {
11390 return false;
11391 }
11392
11393 if (!IsRuined() && !parent.IsRuined())
11394 {
11395 return true;
11396 }
11397
11398 return false;
11399 }
11400
11402 {
11403
11404
11405
11406
11407 return super.CanReceiveItemIntoCargo(item);
11408 }
11409
11411 {
11412
11413
11414
11415
11416 GameInventory attachmentInv = attachment.GetInventory();
11418 {
11419 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11420 return false;
11421 }
11422
11423 InventoryLocation loc = new InventoryLocation();
11424 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11425 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11426 return false;
11427
11428 return super.CanReceiveAttachment(attachment, slotId);
11429 }
11430
11432 {
11433 if (!super.CanReleaseAttachment(attachment))
11434 return false;
11435
11436 return GetInventory().AreChildrenAccessible();
11437 }
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11456
11457
11458
11460 {
11461 int id = muzzle_owner.GetMuzzleID();
11462 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11463
11464 if (WPOF_array)
11465 {
11466 for (int i = 0; i < WPOF_array.Count(); i++)
11467 {
11468 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11469
11470 if (WPOF)
11471 {
11472 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11473 }
11474 }
11475 }
11476 }
11477
11478
11480 {
11481 int id = muzzle_owner.GetMuzzleID();
11483
11484 if (WPOBE_array)
11485 {
11486 for (int i = 0; i < WPOBE_array.Count(); i++)
11487 {
11488 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11489
11490 if (WPOBE)
11491 {
11492 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11493 }
11494 }
11495 }
11496 }
11497
11498
11500 {
11501 int id = muzzle_owner.GetMuzzleID();
11502 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11503
11504 if (WPOOH_array)
11505 {
11506 for (int i = 0; i < WPOOH_array.Count(); i++)
11507 {
11508 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11509
11510 if (WPOOH)
11511 {
11512 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11513 }
11514 }
11515 }
11516 }
11517
11518
11520 {
11521 int id = muzzle_owner.GetMuzzleID();
11522 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11523
11524 if (WPOOH_array)
11525 {
11526 for (int i = 0; i < WPOOH_array.Count(); i++)
11527 {
11528 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11529
11530 if (WPOOH)
11531 {
11532 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11533 }
11534 }
11535 }
11536 }
11537
11538
11540 {
11541 int id = muzzle_owner.GetMuzzleID();
11542 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11543
11544 if (WPOOH_array)
11545 {
11546 for (int i = 0; i < WPOOH_array.Count(); i++)
11547 {
11548 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11549
11550 if (WPOOH)
11551 {
11552 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11553 }
11554 }
11555 }
11556 }
11557
11558
11559
11561 {
11563 {
11564 return true;
11565 }
11566
11567 return false;
11568 }
11569
11571 {
11573 {
11574 return true;
11575 }
11576
11577 return false;
11578 }
11579
11581 {
11583 {
11584 return true;
11585 }
11586
11587 return false;
11588 }
11589
11591 {
11592 return false;
11593 }
11594
11597 {
11598 return UATimeSpent.DEFAULT_DEPLOY;
11599 }
11600
11601
11602
11603
11605 {
11607 SetSynchDirty();
11608 }
11609
11611 {
11613 }
11614
11615
11617 {
11618 return false;
11619 }
11620
11623 {
11624 string att_type = "None";
11625
11626 if (ConfigIsExisting("soundAttType"))
11627 {
11628 att_type = ConfigGetString("soundAttType");
11629 }
11630
11632 }
11633
11635 {
11637 }
11638
11639
11640
11641
11642
11646
11648 {
11651
11653 }
11654
11655
11657 {
11659 return;
11660
11662
11665
11668
11669 SoundParameters params = new SoundParameters();
11673 }
11674
11675
11677 {
11679 return;
11680
11682 SetSynchDirty();
11683
11686 }
11687
11688
11690 {
11692 return;
11693
11695 SetSynchDirty();
11696
11699 }
11700
11702 {
11704 }
11705
11707 {
11709 }
11710
11713 {
11714 if (!
GetGame().IsDedicatedServer())
11715 {
11716 if (ConfigIsExisting("attachSoundSet"))
11717 {
11718 string cfg_path = "";
11719 string soundset = "";
11720 string type_name =
GetType();
11721
11724 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11725 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11726
11727 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11728 {
11729 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11730 {
11731 if (cfg_slot_array[i] == slot_type)
11732 {
11733 soundset = cfg_soundset_array[i];
11734 break;
11735 }
11736 }
11737 }
11738
11739 if (soundset != "")
11740 {
11741 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11743 }
11744 }
11745 }
11746 }
11747
11749 {
11750
11751 }
11752
11753 void OnApply(PlayerBase player);
11754
11756 {
11757 return 1.0;
11758 };
11759
11761 {
11763 }
11764
11766 {
11768 }
11769
11771
11773 {
11774 SetDynamicPhysicsLifeTime(0.01);
11776 }
11777
11779 {
11780 array<string> zone_names = new array<string>;
11781 GetDamageZones(zone_names);
11782 for (int i = 0; i < zone_names.Count(); i++)
11783 {
11784 SetHealthMax(zone_names.Get(i),"Health");
11785 }
11786 SetHealthMax("","Health");
11787 }
11788
11791 {
11792 float global_health = GetHealth01("","Health");
11793 array<string> zones = new array<string>;
11794 GetDamageZones(zones);
11795
11796 for (int i = 0; i < zones.Count(); i++)
11797 {
11798 SetHealth01(zones.Get(i),"Health",global_health);
11799 }
11800 }
11801
11804 {
11805 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11806 }
11807
11809 {
11810 if (!hasRootAsPlayer)
11811 {
11812 if (refParentIB)
11813 {
11814
11815 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11816 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11817
11818 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11819 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11820
11823 }
11824 else
11825 {
11826
11829 }
11830 }
11831 }
11832
11834 {
11836 {
11837 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11838 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11839 {
11840 float heatPermCoef = 1.0;
11842 while (ent)
11843 {
11844 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11845 ent = ent.GetHierarchyParent();
11846 }
11847
11848 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11849 }
11850 }
11851 }
11852
11854 {
11855
11856 EntityAI parent = GetHierarchyParent();
11857 if (!parent)
11858 {
11859 hasParent = false;
11860 hasRootAsPlayer = false;
11861 }
11862 else
11863 {
11864 hasParent = true;
11865 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11866 refParentIB =
ItemBase.Cast(parent);
11867 }
11868 }
11869
11870 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11871 {
11872
11873 }
11874
11876 {
11877
11878 return false;
11879 }
11880
11882 {
11883
11884
11885 return false;
11886 }
11887
11889 {
11890
11891 return false;
11892 }
11893
11896 {
11897 return !GetIsFrozen() &&
IsOpen();
11898 }
11899
11901 {
11902 bool hasParent = false, hasRootAsPlayer = false;
11904
11905 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11906 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11907
11908 if (wwtu || foodDecay)
11909 {
11913
11914 if (processWetness || processTemperature || processDecay)
11915 {
11917
11918 if (processWetness)
11919 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11920
11921 if (processTemperature)
11923
11924 if (processDecay)
11925 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11926 }
11927 }
11928 }
11929
11932 {
11934 }
11935
11937 {
11940
11941 return super.GetTemperatureFreezeThreshold();
11942 }
11943
11945 {
11948
11949 return super.GetTemperatureThawThreshold();
11950 }
11951
11953 {
11956
11957 return super.GetItemOverheatThreshold();
11958 }
11959
11961 {
11963 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11964
11965 return super.GetTemperatureFreezeTime();
11966 }
11967
11969 {
11971 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11972
11973 return super.GetTemperatureThawTime();
11974 }
11975
11980
11982 {
11983 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11984 }
11985
11987 {
11988 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11989 }
11990
11993 {
11995 }
11996
11998 {
12000 }
12001
12003 {
12005 }
12006
12009 {
12010 return null;
12011 }
12012
12015 {
12016 return false;
12017 }
12018
12020 {
12022 {
12025 if (!trg)
12026 {
12028 explosive = this;
12029 }
12030
12031 explosive.PairRemote(trg);
12033
12034 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12035 trg.SetPersistentPairID(persistentID);
12036 explosive.SetPersistentPairID(persistentID);
12037
12038 return true;
12039 }
12040 return false;
12041 }
12042
12045 {
12046 float ret = 1.0;
12049 ret *= GetHealth01();
12050
12051 return ret;
12052 }
12053
12054 #ifdef DEVELOPER
12055 override void SetDebugItem()
12056 {
12057 super.SetDebugItem();
12058 _itemBase = this;
12059 }
12060
12062 {
12063 string text = super.GetDebugText();
12064
12066 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12067
12068 return text;
12069 }
12070 #endif
12071
12073 {
12074 return true;
12075 }
12076
12078
12080
12082 {
12085 }
12086
12087
12095
12111}
12112
12114{
12116 if (entity)
12117 {
12118 bool is_item = entity.IsInherited(
ItemBase);
12119 if (is_item && full_quantity)
12120 {
12123 }
12124 }
12125 else
12126 {
12128 return NULL;
12129 }
12130 return entity;
12131}
12132
12134{
12135 if (item)
12136 {
12137 if (health > 0)
12138 item.SetHealth("", "", health);
12139
12140 if (item.CanHaveTemperature())
12141 {
12143 if (item.CanFreeze())
12144 item.SetFrozen(false);
12145 }
12146
12147 if (item.HasEnergyManager())
12148 {
12149 if (quantity >= 0)
12150 {
12151 item.GetCompEM().SetEnergy0To1(quantity);
12152 }
12153 else
12154 {
12156 }
12157 }
12158 else if (item.IsMagazine())
12159 {
12160 Magazine mag = Magazine.Cast(item);
12161 if (quantity >= 0)
12162 {
12163 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12164 }
12165 else
12166 {
12168 }
12169
12170 }
12171 else
12172 {
12173 if (quantity >= 0)
12174 {
12175 item.SetQuantityNormalized(quantity, false);
12176 }
12177 else
12178 {
12180 }
12181
12182 }
12183 }
12184}
12185
12186#ifdef DEVELOPER
12188#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.