7241{
7243 {
7244 return true;
7245 }
7246};
7247
7248
7249
7251{
7255
7257
7260
7261
7262
7263
7264
7273
7279
7284
7289
7310 protected bool m_IsResultOfSplit
7311
7313
7318
7319
7320
7322
7326
7327
7328
7330
7333
7334
7335
7341
7342
7350
7353
7354
7356
7357
7359
7360
7365
7366
7371
7372
7374
7375
7377 {
7382
7383 if (!
GetGame().IsDedicatedServer())
7384 {
7386 {
7388
7390 {
7392 }
7393 }
7394
7397 }
7398
7399 m_OldLocation = null;
7400
7402 {
7404 }
7405
7406 if (ConfigIsExisting("headSelectionsToHide"))
7407 {
7410 }
7411
7413 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7414 {
7416 }
7417
7419
7420 m_IsResultOfSplit = false;
7421
7423 }
7424
7426 {
7427 super.InitItemVariables();
7428
7434 m_Count = ConfigGetInt(
"count");
7435
7438
7443
7446
7451
7463
7467
7468
7471 if (ConfigIsExisting("canBeSplit"))
7472 {
7475 }
7476
7478 if (ConfigIsExisting("itemBehaviour"))
7480
7481
7484 RegisterNetSyncVariableInt("m_VarLiquidType");
7485 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7486
7487 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7488 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7489 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7490
7491 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7492 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7493 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7494 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7495
7496 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7497 RegisterNetSyncVariableBool("m_IsTakeable");
7498 RegisterNetSyncVariableBool("m_IsHologram");
7499
7502 {
7505 }
7506
7508
7510 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7512
7513 }
7514
7516 {
7518 }
7519
7521 {
7524 {
7529 }
7530 }
7531
7532 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7533 {
7535 {
7538 }
7539
7541 }
7542
7544 {
7550 }
7551
7553
7555 {
7557
7558 if (!action)
7559 {
7560 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7561 return;
7562 }
7563
7565 if (!ai)
7566 {
7568 return;
7569 }
7570
7572 if (!action_array)
7573 {
7574 action_array = new array<ActionBase_Basic>;
7576 }
7577 if (LogManager.IsActionLogEnable())
7578 {
7579 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7580 }
7581
7582 if (action_array.Find(action) != -1)
7583 {
7584 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7585 }
7586 else
7587 {
7588 action_array.Insert(action);
7589 }
7590 }
7591
7593 {
7595 ActionBase action = player.GetActionManager().GetAction(actionName);
7598
7599 if (action_array)
7600 {
7601 action_array.RemoveItem(action);
7602 }
7603 }
7604
7605
7606
7608 {
7609 ActionOverrideData overrideData = new ActionOverrideData();
7613
7615 if (!actionMap)
7616 {
7619 }
7620
7621 actionMap.Insert(this.
Type(), overrideData);
7622
7623 }
7624
7626
7628
7629
7631 {
7634
7637
7638 string config_to_search = "CfgVehicles";
7639 string muzzle_owner_config;
7640
7642 {
7643 if (IsInherited(Weapon))
7644 config_to_search = "CfgWeapons";
7645
7646 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7647
7648 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7649
7651
7652 if (config_OnFire_subclass_count > 0)
7653 {
7654 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7655
7656 for (int i = 0; i < config_OnFire_subclass_count; i++)
7657 {
7658 string particle_class = "";
7660 string config_OnFire_entry = config_OnFire_class + particle_class;
7661 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7662 WPOF_array.Insert(WPOF);
7663 }
7664
7665
7667 }
7668 }
7669
7671 {
7672 config_to_search = "CfgWeapons";
7673 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7674
7675 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7676
7678
7679 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7680 {
7681 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7682
7683 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7684 {
7685 string particle_class2 = "";
7687 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7688 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7689 WPOBE_array.Insert(WPOBE);
7690 }
7691
7692
7694 }
7695 }
7696 }
7697
7698
7700 {
7703
7705 {
7706 string config_to_search = "CfgVehicles";
7707
7708 if (IsInherited(Weapon))
7709 config_to_search = "CfgWeapons";
7710
7711 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7712 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7713
7714 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7715 {
7716
7718
7720 {
7722 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7724 return;
7725 }
7726
7729
7730
7731
7733 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7734
7735 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7736 {
7737 string particle_class = "";
7739 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7741
7742 if (entry_type == CT_CLASS)
7743 {
7744 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7745 WPOOH_array.Insert(WPOF);
7746 }
7747 }
7748
7749
7751 }
7752 }
7753 }
7754
7756 {
7758 }
7759
7761 {
7763 {
7765
7768
7771
7772 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7773 }
7774 }
7775
7777 {
7779 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7780
7782 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7783
7785 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7786
7788 {
7790 }
7791 }
7792
7794 {
7796 }
7797
7799 {
7802 else
7804
7806 {
7809 }
7810 else
7811 {
7814
7817 }
7818
7820 }
7821
7823 {
7825 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7826 }
7827
7829 {
7831 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7833 }
7834
7836 {
7838 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7839 }
7840
7842 {
7845
7846 OverheatingParticle OP = new OverheatingParticle();
7851
7853 }
7854
7856 {
7859
7860 return -1;
7861 }
7862
7864 {
7866 {
7869
7870 for (int i = count; i > 0; --i)
7871 {
7872 int id = i - 1;
7875
7878
7879 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7880 {
7881 if (p)
7882 {
7885 }
7886 }
7887 }
7888 }
7889 }
7890
7892 {
7894 {
7896 {
7897 int id = i - 1;
7899
7900 if (OP)
7901 {
7903
7904 if (p)
7905 {
7907 }
7908
7909 delete OP;
7910 }
7911 }
7912
7915 }
7916 }
7917
7920 {
7921 return 0.0;
7922 }
7923
7924
7926 {
7927 return 250;
7928 }
7929
7931 {
7932 return 0;
7933 }
7934
7937 {
7939 return true;
7940
7941 return false;
7942 }
7943
7946 {
7949
7951 {
7953 }
7954 else
7955 {
7956
7958 }
7959
7961 }
7962
7969 {
7970 return -1;
7971 }
7972
7973
7974
7975
7977 {
7979 {
7981 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7982
7983 if (r_index >= 0)
7984 {
7985 InventoryLocation r_il = new InventoryLocation;
7986 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7987
7988 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7991 {
7992 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7993 }
7995 {
7996 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7997 }
7998
7999 }
8000
8001 player.GetHumanInventory().ClearUserReservedLocation(this);
8002 }
8003
8006 }
8007
8008
8009
8010
8012 {
8013 return ItemBase.m_DebugActionsMask;
8014 }
8015
8017 {
8018 return ItemBase.m_DebugActionsMask & mask;
8019 }
8020
8022 {
8023 ItemBase.m_DebugActionsMask = mask;
8024 }
8025
8027 {
8028 ItemBase.m_DebugActionsMask |= mask;
8029 }
8030
8032 {
8033 ItemBase.m_DebugActionsMask &= ~mask;
8034 }
8035
8037 {
8039 {
8041 }
8042 else
8043 {
8045 }
8046 }
8047
8048
8050 {
8051 if (GetEconomyProfile())
8052 {
8053 float q_max = GetEconomyProfile().GetQuantityMax();
8054 if (q_max > 0)
8055 {
8056 float q_min = GetEconomyProfile().GetQuantityMin();
8057 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8058
8060 {
8061 ComponentEnergyManager comp = GetCompEM();
8063 {
8065 }
8066 }
8068 {
8070
8071 }
8072
8073 }
8074 }
8075 }
8076
8079 {
8080 EntityAI parent = GetHierarchyParent();
8081
8082 if (parent)
8083 {
8084 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8085 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8086 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8087 }
8088 }
8089
8092 {
8093 EntityAI parent = GetHierarchyParent();
8094
8095 if (parent)
8096 {
8097 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8098 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8099 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
8100 }
8101 }
8102
8104 {
8105
8106
8107
8108
8110
8112 {
8113 if (ScriptInputUserData.CanStoreInputUserData())
8114 {
8115 ScriptInputUserData ctx = new ScriptInputUserData;
8121 ctx.
Write(use_stack_max);
8124
8126 {
8127 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8128 }
8129 }
8130 }
8131 else if (!
GetGame().IsMultiplayer())
8132 {
8134 }
8135 }
8136
8138 {
8140 }
8141
8143 {
8145 }
8146
8148 {
8150 }
8151
8153 {
8154
8155 return false;
8156 }
8157
8159 {
8160 return false;
8161 }
8162
8166 {
8167 return false;
8168 }
8169
8171 {
8172 return "";
8173 }
8174
8176
8178 {
8179 return false;
8180 }
8181
8183 {
8184 return true;
8185 }
8186
8187
8188
8190 {
8191 return true;
8192 }
8193
8195 {
8196 return true;
8197 }
8198
8200 {
8201 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8203 }
8204
8206 {
8208 }
8209
8211 {
8213 if (!is_being_placed)
8215 SetSynchDirty();
8216 }
8217
8218
8220
8222 {
8224 }
8225
8227 {
8229 }
8230
8232 {
8233 return 1;
8234 }
8235
8237 {
8238 return false;
8239 }
8240
8242 {
8244 SetSynchDirty();
8245 }
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8282 {
8283 super.OnMovedInsideCargo(container);
8284
8285 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8286 }
8287
8288 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8289 {
8290 super.EEItemLocationChanged(oldLoc,newLoc);
8291
8292 PlayerBase new_player = null;
8293 PlayerBase old_player = null;
8294
8295 if (newLoc.GetParent())
8296 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8297
8298 if (oldLoc.GetParent())
8299 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8300
8302 {
8303 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8304
8305 if (r_index >= 0)
8306 {
8307 InventoryLocation r_il = new InventoryLocation;
8308 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8309
8310 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8313 {
8314 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8315 }
8317 {
8318 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8319 }
8320
8321 }
8322 }
8323
8325 {
8326 if (new_player)
8327 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8328
8329 if (new_player == old_player)
8330 {
8331
8332 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8333 {
8335 {
8336 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8337 {
8338 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8339 }
8340 }
8341 else
8342 {
8343 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8344 }
8345 }
8346
8347 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8348 {
8349 int type = oldLoc.GetType();
8351 {
8352 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8353 }
8355 {
8356 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8357 }
8358 }
8359 if (!m_OldLocation)
8360 {
8361 m_OldLocation = new InventoryLocation;
8362 }
8363 m_OldLocation.Copy(oldLoc);
8364 }
8365 else
8366 {
8367 if (m_OldLocation)
8368 {
8369 m_OldLocation.Reset();
8370 }
8371 }
8372
8374 }
8375 else
8376 {
8377 if (new_player)
8378 {
8379 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8380 if (res_index >= 0)
8381 {
8382 InventoryLocation il = new InventoryLocation;
8383 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8385 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8388 {
8389 il.
GetParent().GetOnReleaseLock().Invoke(it);
8390 }
8392 {
8394 }
8395
8396 }
8397 }
8399 {
8400
8402 }
8403
8404 if (m_OldLocation)
8405 {
8406 m_OldLocation.Reset();
8407 }
8408 }
8409 }
8410
8411 override void EOnContact(IEntity other, Contact extra)
8412 {
8414 {
8415 int liquidType = -1;
8417 if (impactSpeed > 0.0)
8418 {
8420 #ifndef SERVER
8422 #else
8424 SetSynchDirty();
8425 #endif
8427 }
8428 }
8429
8430 #ifdef SERVER
8431 if (GetCompEM() && GetCompEM().IsPlugged())
8432 {
8433 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8434 GetCompEM().UnplugThis();
8435 }
8436 #endif
8437 }
8438
8440
8442 {
8444 }
8445
8447 {
8448
8449 }
8450
8452 {
8453 super.OnItemLocationChanged(old_owner, new_owner);
8454
8455 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8456 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8457
8458 if (!relatedPlayer && playerNew)
8459 relatedPlayer = playerNew;
8460
8461 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8462 {
8464 if (actionMgr)
8465 {
8466 ActionBase currentAction = actionMgr.GetRunningAction();
8467 if (currentAction)
8469 }
8470 }
8471
8472 Man ownerPlayerOld = null;
8473 Man ownerPlayerNew = null;
8474
8475 if (old_owner)
8476 {
8477 if (old_owner.
IsMan())
8478 {
8479 ownerPlayerOld = Man.Cast(old_owner);
8480 }
8481 else
8482 {
8483 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8484 }
8485 }
8486 else
8487 {
8489 {
8491
8492 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8493 {
8494 GetCompEM().UnplugThis();
8495 }
8496 }
8497 }
8498
8499 if (new_owner)
8500 {
8501 if (new_owner.
IsMan())
8502 {
8503 ownerPlayerNew = Man.Cast(new_owner);
8504 }
8505 else
8506 {
8507 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8508 }
8509 }
8510
8511 if (ownerPlayerOld != ownerPlayerNew)
8512 {
8513 if (ownerPlayerOld)
8514 {
8515 array<EntityAI> subItemsExit = new array<EntityAI>;
8517 for (int i = 0; i < subItemsExit.Count(); i++)
8518 {
8521 }
8522 }
8523
8524 if (ownerPlayerNew)
8525 {
8526 array<EntityAI> subItemsEnter = new array<EntityAI>;
8528 for (int j = 0; j < subItemsEnter.Count(); j++)
8529 {
8532 }
8533 }
8534 }
8535 else if (ownerPlayerNew != null)
8536 {
8537 PlayerBase nplayer;
8538 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8539 {
8540 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8542 for (int k = 0; k < subItemsUpdate.Count(); k++)
8543 {
8545 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8546 }
8547 }
8548 }
8549
8550 if (old_owner)
8551 old_owner.OnChildItemRemoved(this);
8552 if (new_owner)
8553 new_owner.OnChildItemReceived(this);
8554 }
8555
8556
8558 {
8559 super.EEDelete(parent);
8560 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8561 if (player)
8562 {
8564
8565 if (player.IsAlive())
8566 {
8567 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8568 if (r_index >= 0)
8569 {
8570 InventoryLocation r_il = new InventoryLocation;
8571 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8572
8573 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8576 {
8577 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8578 }
8580 {
8581 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8582 }
8583
8584 }
8585
8586 player.RemoveQuickBarEntityShortcut(this);
8587 }
8588 }
8589 }
8590
8592 {
8593 super.EEKilled(killer);
8594
8597 {
8598 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8599 {
8600 if (IsMagazine())
8601 {
8602 if (Magazine.Cast(this).GetAmmoCount() > 0)
8603 {
8605 }
8606 }
8607 else
8608 {
8610 }
8611 }
8612 }
8613 }
8614
8616 {
8617 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8618
8619 super.OnWasAttached(parent, slot_id);
8620
8623
8625 }
8626
8628 {
8629 super.OnWasDetached(parent, slot_id);
8630
8633 }
8634
8636 {
8637 int idx;
8640
8641 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8642 if (inventory_slots.Count() < 1)
8643 {
8644 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8645 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8646 }
8647 else
8648 {
8649 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8650 }
8651
8652 idx = inventory_slots.Find(slot);
8653 if (idx < 0)
8654 return "";
8655
8656 return attach_types.Get(idx);
8657 }
8658
8660 {
8661 int idx = -1;
8662 string slot;
8663
8666
8667 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8668 if (inventory_slots.Count() < 1)
8669 {
8670 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8671 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8672 }
8673 else
8674 {
8675 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8676 if (detach_types.Count() < 1)
8677 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8678 }
8679
8680 for (int i = 0; i < inventory_slots.Count(); i++)
8681 {
8682 slot = inventory_slots.Get(i);
8683 }
8684
8685 if (slot != "")
8686 {
8687 if (detach_types.Count() == 1)
8688 idx = 0;
8689 else
8690 idx = inventory_slots.Find(slot);
8691 }
8692 if (idx < 0)
8693 return "";
8694
8695 return detach_types.Get(idx);
8696 }
8697
8699 {
8700
8702
8703
8704 float min_time = 1;
8705 float max_time = 3;
8706 float delay = Math.RandomFloat(min_time, max_time);
8707
8708 explode_timer.Run(delay, this, "DoAmmoExplosion");
8709 }
8710
8712 {
8713 Magazine magazine = Magazine.Cast(this);
8714 int pop_sounds_count = 6;
8715 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8716
8717
8718 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8719 string sound_name = pop_sounds[ sound_idx ];
8721
8722
8723 magazine.ServerAddAmmoCount(-1);
8724
8725
8726 float min_temp_to_explode = 100;
8727
8728 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
8729 {
8731 }
8732 }
8733
8734
8735 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8736 {
8737 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8738
8739 const int CHANCE_DAMAGE_CARGO = 4;
8740 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8741 const int CHANCE_DAMAGE_NOTHING = 2;
8742
8744 {
8745 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8746 int chances;
8747 int rnd;
8748
8749 if (GetInventory().GetCargo())
8750 {
8751 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8752 rnd = Math.RandomInt(0,chances);
8753
8754 if (rnd < CHANCE_DAMAGE_CARGO)
8755 {
8757 }
8758 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8759 {
8761 }
8762 }
8763 else
8764 {
8765 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8766 rnd = Math.RandomInt(0,chances);
8767
8768 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8769 {
8771 }
8772 }
8773 }
8774 }
8775
8777 {
8778 if (GetInventory().GetCargo())
8779 {
8780 int item_count = GetInventory().GetCargo().GetItemCount();
8781 if (item_count > 0)
8782 {
8783 int random_pick = Math.RandomInt(0, item_count);
8785 if (!item.IsExplosive())
8786 {
8787 item.AddHealth("","",damage);
8788 return true;
8789 }
8790 }
8791 }
8792 return false;
8793 }
8794
8796 {
8797 int attachment_count = GetInventory().AttachmentCount();
8798 if (attachment_count > 0)
8799 {
8800 int random_pick = Math.RandomInt(0, attachment_count);
8801 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8802 if (!attachment.IsExplosive())
8803 {
8804 attachment.AddHealth("","",damage);
8805 return true;
8806 }
8807 }
8808 return false;
8809 }
8810
8812 {
8814 }
8815
8817 {
8819 return GetInventory().CanRemoveEntity();
8820
8821 return false;
8822 }
8823
8825 {
8826
8828 return false;
8829
8830
8832 return false;
8833
8834
8835
8837 if (delta == 0)
8838 return false;
8839
8840
8841 return true;
8842 }
8843
8845 {
8847 {
8848 if (ScriptInputUserData.CanStoreInputUserData())
8849 {
8850 ScriptInputUserData ctx = new ScriptInputUserData;
8855 ctx.
Write(destination_entity);
8859 }
8860 }
8861 else if (!
GetGame().IsMultiplayer())
8862 {
8864 }
8865 }
8866
8868 {
8869 float split_quantity_new;
8873 InventoryLocation loc = new InventoryLocation;
8874
8875 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8876 {
8878 split_quantity_new = stack_max;
8879 else
8881
8883 {
8884 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8885 if (new_item)
8886 {
8887 new_item.SetResultOfSplit(true);
8888 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8890 new_item.
SetQuantity(split_quantity_new,
false,
true);
8891 }
8892 }
8893 }
8894 else if (destination_entity && slot_id == -1)
8895 {
8896 if (quantity > stack_max)
8897 split_quantity_new = stack_max;
8898 else
8899 split_quantity_new = quantity;
8900
8902 {
8904 {
8907 }
8908
8909 if (new_item)
8910 {
8911 new_item.SetResultOfSplit(true);
8912 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8914 new_item.
SetQuantity(split_quantity_new,
false,
true);
8915 }
8916 }
8917 }
8918 else
8919 {
8920 if (stack_max != 0)
8921 {
8923 {
8925 }
8926
8927 if (split_quantity_new == 0)
8928 {
8929 if (!
GetGame().IsMultiplayer())
8930 player.PhysicalPredictiveDropItem(this);
8931 else
8932 player.ServerDropEntity(this);
8933 return;
8934 }
8935
8937 {
8939
8940 if (new_item)
8941 {
8942 new_item.SetResultOfSplit(true);
8943 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8946 new_item.PlaceOnSurface();
8947 }
8948 }
8949 }
8950 }
8951 }
8952
8954 {
8955 float split_quantity_new;
8959 InventoryLocation loc = new InventoryLocation;
8960
8961 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8962 {
8964 split_quantity_new = stack_max;
8965 else
8967
8969 {
8970 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8971 if (new_item)
8972 {
8973 new_item.SetResultOfSplit(true);
8974 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8976 new_item.
SetQuantity(split_quantity_new,
false,
true);
8977 }
8978 }
8979 }
8980 else if (destination_entity && slot_id == -1)
8981 {
8982 if (quantity > stack_max)
8983 split_quantity_new = stack_max;
8984 else
8985 split_quantity_new = quantity;
8986
8988 {
8990 {
8993 }
8994
8995 if (new_item)
8996 {
8997 new_item.SetResultOfSplit(true);
8998 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9000 new_item.
SetQuantity(split_quantity_new,
false,
true);
9001 }
9002 }
9003 }
9004 else
9005 {
9006 if (stack_max != 0)
9007 {
9009 {
9011 }
9012
9014 {
9016
9017 if (new_item)
9018 {
9019 new_item.SetResultOfSplit(true);
9020 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9023 new_item.PlaceOnSurface();
9024 }
9025 }
9026 }
9027 }
9028 }
9029
9031 {
9033 {
9034 if (ScriptInputUserData.CanStoreInputUserData())
9035 {
9036 ScriptInputUserData ctx = new ScriptInputUserData;
9041 dst.WriteToContext(ctx);
9043 }
9044 }
9045 else if (!
GetGame().IsMultiplayer())
9046 {
9048 }
9049 }
9050
9052 {
9054 {
9055 if (ScriptInputUserData.CanStoreInputUserData())
9056 {
9057 ScriptInputUserData ctx = new ScriptInputUserData;
9062 ctx.
Write(destination_entity);
9068 }
9069 }
9070 else if (!
GetGame().IsMultiplayer())
9071 {
9073 }
9074 }
9075
9077 {
9079 }
9080
9082 {
9084 float split_quantity_new;
9086 if (dst.IsValid())
9087 {
9088 int slot_id = dst.GetSlot();
9090
9091 if (quantity > stack_max)
9092 split_quantity_new = stack_max;
9093 else
9094 split_quantity_new = quantity;
9095
9097 {
9099
9100 if (new_item)
9101 {
9102 new_item.SetResultOfSplit(true);
9103 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9105 new_item.
SetQuantity(split_quantity_new,
false,
true);
9106 }
9107
9108 return new_item;
9109 }
9110 }
9111
9112 return null;
9113 }
9114
9116 {
9118 float split_quantity_new;
9120 if (destination_entity)
9121 {
9123 if (quantity > stackable)
9124 split_quantity_new = stackable;
9125 else
9126 split_quantity_new = quantity;
9127
9129 {
9130 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
9131 if (new_item)
9132 {
9133 new_item.SetResultOfSplit(true);
9134 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9136 new_item.
SetQuantity(split_quantity_new,
false,
true);
9137 }
9138 }
9139 }
9140 }
9141
9143 {
9145 {
9146 if (ScriptInputUserData.CanStoreInputUserData())
9147 {
9148 ScriptInputUserData ctx = new ScriptInputUserData;
9153 ItemBase destination_entity =
this;
9154 ctx.
Write(destination_entity);
9158 }
9159 }
9160 else if (!
GetGame().IsMultiplayer())
9161 {
9163 }
9164 }
9165
9167 {
9169 float split_quantity_new;
9171 if (player)
9172 {
9174 if (quantity > stackable)
9175 split_quantity_new = stackable;
9176 else
9177 split_quantity_new = quantity;
9178
9180 {
9181 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
9182 new_item =
ItemBase.Cast(in_hands);
9183 if (new_item)
9184 {
9185 new_item.SetResultOfSplit(true);
9186 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9188 new_item.SetQuantity(split_quantity_new, false, true);
9189 }
9190 }
9191 }
9192 }
9193
9195 {
9197 float split_quantity_new = Math.Floor(quantity * 0.5);
9198
9200 return;
9201
9203
9204 if (new_item)
9205 {
9206 if (new_item.GetQuantityMax() < split_quantity_new)
9207 {
9208 split_quantity_new = new_item.GetQuantityMax();
9209 }
9210
9211 new_item.SetResultOfSplit(true);
9212 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9213
9215 {
9218 }
9219 else
9220 {
9222 new_item.
SetQuantity(split_quantity_new,
false,
true);
9223 }
9224 }
9225 }
9226
9228 {
9230 float split_quantity_new = Math.Floor(quantity / 2);
9231
9233 return;
9234
9235 InventoryLocation invloc = new InventoryLocation;
9237
9239 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9240
9241 if (new_item)
9242 {
9243 if (new_item.GetQuantityMax() < split_quantity_new)
9244 {
9245 split_quantity_new = new_item.GetQuantityMax();
9246 }
9248 {
9251 }
9252 else if (split_quantity_new > 1)
9253 {
9255 new_item.
SetQuantity(split_quantity_new,
false,
true);
9256 }
9257 }
9258 }
9259
9262 {
9263 SetWeightDirty();
9265
9266 if (parent)
9267 parent.OnAttachmentQuantityChangedEx(this, delta);
9268
9270 {
9272 {
9274 }
9276 {
9277 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9279 }
9280 }
9281
9282 }
9283
9286 {
9287
9288 }
9289
9292 {
9294 }
9295
9297 {
9298 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9299
9301 {
9302 if (newLevel == GameConstants.STATE_RUINED)
9303 {
9305 EntityAI parent = GetHierarchyParent();
9306 if (parent && parent.IsFireplace())
9307 {
9308 CargoBase cargo = GetInventory().GetCargo();
9309 if (cargo)
9310 {
9312 {
9314 }
9315 }
9316 }
9317 }
9318
9320 {
9321
9323 return;
9324 }
9325
9326 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9327 {
9329 }
9330 }
9331 }
9332
9333
9335 {
9336 super.OnRightClick();
9337
9339 {
9341 {
9342 if (ScriptInputUserData.CanStoreInputUserData())
9343 {
9344 EntityAI root = GetHierarchyRoot();
9345 Man playerOwner = GetHierarchyRootPlayer();
9346 InventoryLocation dst = new InventoryLocation;
9347
9348
9349 if (!playerOwner && root && root == this)
9350 {
9352 }
9353 else
9354 {
9355
9356 GetInventory().GetCurrentInventoryLocation(dst);
9358 {
9361 {
9363 }
9364 else
9365 {
9367
9368
9369 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9370 {
9372 }
9373 else
9374 {
9375 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9376 }
9377 }
9378 }
9379 }
9380
9381 ScriptInputUserData ctx = new ScriptInputUserData;
9389 }
9390 }
9391 else if (!
GetGame().IsMultiplayer())
9392 {
9394 }
9395 }
9396 }
9397
9399 {
9400 if (root)
9401 {
9402 vector m4[4];
9403 root.GetTransform(m4);
9404 dst.SetGround(this, m4);
9405 }
9406 else
9407 {
9408 GetInventory().GetCurrentInventoryLocation(dst);
9409 }
9410 }
9411
9412 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9413 {
9414
9415 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9416 return false;
9417
9418 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9419 return false;
9420
9421
9423 return false;
9424
9425
9426 Magazine mag = Magazine.Cast(this);
9427 if (mag)
9428 {
9429 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9430 return false;
9431
9432 if (stack_max_limit)
9433 {
9434 Magazine other_mag = Magazine.Cast(other_item);
9435 if (other_item)
9436 {
9437 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9438 return false;
9439 }
9440
9441 }
9442 }
9443 else
9444 {
9445
9447 return false;
9448
9450 return false;
9451 }
9452
9453 PlayerBase player = null;
9454 if (CastTo(player, GetHierarchyRootPlayer()))
9455 {
9456 if (player.GetInventory().HasAttachment(this))
9457 return false;
9458
9459 if (player.IsItemsToDelete())
9460 return false;
9461 }
9462
9463 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9464 return false;
9465
9466 int slotID;
9468 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9469 return false;
9470
9471 return true;
9472 }
9473
9475 {
9477 }
9478
9480 {
9481 return m_IsResultOfSplit;
9482 }
9483
9485 {
9486 m_IsResultOfSplit = value;
9487 }
9488
9490 {
9492 }
9493
9495 {
9496 float other_item_quantity = other_item.GetQuantity();
9497 float this_free_space;
9498
9500
9502
9503 if (other_item_quantity > this_free_space)
9504 {
9505 return this_free_space;
9506 }
9507 else
9508 {
9509 return other_item_quantity;
9510 }
9511 }
9512
9514 {
9516 }
9517
9519 {
9521 return;
9522
9523 if (!IsMagazine() && other_item)
9524 {
9526 if (quantity_used != 0)
9527 {
9528 float hp1 = GetHealth01("","");
9529 float hp2 = other_item.GetHealth01("","");
9530 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9531 hpResult = hpResult / (
GetQuantity() + quantity_used);
9532
9533 hpResult *= GetMaxHealth();
9534 Math.Round(hpResult);
9535 SetHealth("", "Health", hpResult);
9536
9538 other_item.AddQuantity(-quantity_used);
9539 }
9540 }
9542 }
9543
9545 {
9546 #ifdef SERVER
9547 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9548 GetHierarchyParent().IncreaseLifetimeUp();
9549 #endif
9550 };
9551
9553 {
9554 PlayerBase p = PlayerBase.Cast(player);
9555
9556 array<int> recipesIds = p.m_Recipes;
9557 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9558 if (moduleRecipesManager)
9559 {
9560 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9561 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9562 }
9563
9564 for (int i = 0;i < recipesIds.Count(); i++)
9565 {
9566 int key = recipesIds.Get(i);
9567 string recipeName = moduleRecipesManager.GetRecipeName(key);
9569 }
9570 }
9571
9572
9573 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9574 {
9575 super.GetDebugActions(outputList);
9576
9577
9583
9584
9589
9594
9595
9599
9600
9602 {
9606 }
9607
9610
9611
9615
9617
9618 InventoryLocation loc = new InventoryLocation();
9619 GetInventory().GetCurrentInventoryLocation(loc);
9621 {
9622 if (Gizmo_IsSupported())
9625 }
9626
9628 }
9629
9630
9631
9632
9634 {
9635 super.OnAction(action_id, player, ctx);
9636
9638 {
9639 switch (action_id)
9640 {
9643 return true;
9646 return true;
9647 }
9648 }
9649
9651 {
9652 switch (action_id)
9653 {
9655 Delete();
9656 return true;
9657 }
9658 }
9659
9660 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9661 {
9662 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9663 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9664 PlayerBase p = PlayerBase.Cast(player);
9665 if (
EActions.RECIPES_RANGE_START < 1000)
9666 {
9667 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9668 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9669 }
9670 }
9671 #ifndef SERVER
9672 else if (action_id ==
EActions.WATCH_PLAYER)
9673 {
9674 PluginDeveloper.SetDeveloperItemClientEx(player);
9675 }
9676 #endif
9678 {
9679 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9680 {
9681 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9682 OnDebugButtonPressServer(id + 1);
9683 }
9684
9685 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9686 {
9687 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9689 }
9690
9691 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9692 {
9693 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9695 }
9696
9697 else if (action_id ==
EActions.ADD_QUANTITY)
9698 {
9699 if (IsMagazine())
9700 {
9701 Magazine mag = Magazine.Cast(this);
9702 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9703 }
9704 else
9705 {
9707 }
9708
9709 if (m_EM)
9710 {
9711 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9712 }
9713
9714 }
9715
9716 else if (action_id ==
EActions.REMOVE_QUANTITY)
9717 {
9718 if (IsMagazine())
9719 {
9720 Magazine mag2 = Magazine.Cast(this);
9721 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9722 }
9723 else
9724 {
9726 }
9727 if (m_EM)
9728 {
9729 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9730 }
9731
9732 }
9733
9734 else if (action_id ==
EActions.SET_QUANTITY_0)
9735 {
9737
9738 if (m_EM)
9739 {
9740 m_EM.SetEnergy(0);
9741 }
9742 }
9743
9744 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9745 {
9747
9748 if (m_EM)
9749 {
9750 m_EM.SetEnergy(m_EM.GetEnergyMax());
9751 }
9752 }
9753
9754 else if (action_id ==
EActions.ADD_HEALTH)
9755 {
9756 AddHealth("","",GetMaxHealth("","Health")/5);
9757 }
9758 else if (action_id ==
EActions.REMOVE_HEALTH)
9759 {
9760 AddHealth("","",-GetMaxHealth("","Health")/5);
9761 }
9762 else if (action_id ==
EActions.DESTROY_HEALTH)
9763 {
9764 SetHealth01("","",0);
9765 }
9766 else if (action_id ==
EActions.WATCH_ITEM)
9767 {
9769 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9770 #ifdef DEVELOPER
9771 SetDebugDeveloper_item(this);
9772 #endif
9773 }
9774
9775 else if (action_id ==
EActions.ADD_TEMPERATURE)
9776 {
9777 AddTemperature(20);
9778
9779 }
9780
9781 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9782 {
9783 AddTemperature(-20);
9784
9785 }
9786
9787 else if (action_id ==
EActions.FLIP_FROZEN)
9788 {
9789 SetFrozen(!GetIsFrozen());
9790
9791 }
9792
9793 else if (action_id ==
EActions.ADD_WETNESS)
9794 {
9796
9797 }
9798
9799 else if (action_id ==
EActions.REMOVE_WETNESS)
9800 {
9802
9803 }
9804
9805 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9806 {
9809
9810
9811 }
9812
9813 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9814 {
9817 }
9818
9819 else if (action_id ==
EActions.MAKE_SPECIAL)
9820 {
9821 auto debugParams = DebugSpawnParams.WithPlayer(player);
9822 OnDebugSpawnEx(debugParams);
9823 }
9824
9825 }
9826
9827
9828 return false;
9829 }
9830
9831
9832
9833
9837
9840
9841
9842
9844 {
9845 return false;
9846 }
9847
9848
9850 {
9851 return true;
9852 }
9853
9854
9856 {
9857 return true;
9858 }
9859
9860
9861
9863 {
9864 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9866 }
9867
9870 {
9871 return null;
9872 }
9873
9875 {
9876 return false;
9877 }
9878
9880 {
9881 return false;
9882 }
9883
9887
9888
9890 {
9891 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9892 return module_repairing.CanRepair(this, item_repair_kit);
9893 }
9894
9895
9896 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9897 {
9898 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9899 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9900 }
9901
9902
9904 {
9905
9906
9907
9908
9909
9910
9911
9912
9913 return 1;
9914 }
9915
9916
9917
9919 {
9921 }
9922
9923
9924
9926 {
9928 }
9929
9930
9939 {
9940 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9941
9942 if (player)
9943 {
9944 player.MessageStatus(text);
9945 }
9946 }
9947
9948
9957 {
9958 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9959
9960 if (player)
9961 {
9962 player.MessageAction(text);
9963 }
9964 }
9965
9966
9975 {
9976 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9977
9978 if (player)
9979 {
9980 player.MessageFriendly(text);
9981 }
9982 }
9983
9984
9993 {
9994 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9995
9996 if (player)
9997 {
9998 player.MessageImportant(text);
9999 }
10000 }
10001
10003 {
10004 return true;
10005 }
10006
10007
10008 override bool KindOf(
string tag)
10009 {
10010 bool found = false;
10011 string item_name = this.
GetType();
10014
10015 int array_size = item_tag_array.Count();
10016 for (int i = 0; i < array_size; i++)
10017 {
10018 if (item_tag_array.Get(i) == tag)
10019 {
10020 found = true;
10021 break;
10022 }
10023 }
10024 return found;
10025 }
10026
10027
10029 {
10030
10031 super.OnRPC(sender, rpc_type,ctx);
10032
10033
10034 switch (rpc_type)
10035 {
10036 #ifndef SERVER
10037 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10038 Param2<bool, string> p = new Param2<bool, string>(false, "");
10039
10041 return;
10042
10043 bool play = p.param1;
10044 string soundSet = p.param2;
10045
10046 if (play)
10047 {
10049 {
10051 {
10053 }
10054 }
10055 else
10056 {
10058 }
10059 }
10060 else
10061 {
10063 }
10064
10065 break;
10066 #endif
10067
10068 }
10069
10071 {
10073 }
10074 }
10075
10076
10077
10078
10080 {
10081 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10082 return plugin.GetID(
name);
10083 }
10084
10086 {
10087 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10088 return plugin.GetName(id);
10089 }
10090
10093 {
10094
10095
10096 int varFlags;
10097 if (!ctx.
Read(varFlags))
10098 return;
10099
10100 if (varFlags & ItemVariableFlags.FLOAT)
10101 {
10103 }
10104 }
10105
10107 {
10108
10109 super.SerializeNumericalVars(floats_out);
10110
10111
10112
10114 {
10116 }
10117
10119 {
10121 }
10122
10124 {
10126 }
10127
10129 {
10134 }
10135
10137 {
10139 }
10140 }
10141
10143 {
10144
10145 super.DeSerializeNumericalVars(floats);
10146
10147
10148 int index = 0;
10149 int mask = Math.Round(floats.Get(index));
10150
10151 index++;
10152
10154 {
10156 {
10158 }
10159 else
10160 {
10161 float quantity = floats.Get(index);
10162 SetQuantity(quantity,
true,
false,
false,
false);
10163 }
10164 index++;
10165 }
10166
10168 {
10169 float wet = floats.Get(index);
10171 index++;
10172 }
10173
10175 {
10176 int liquidtype = Math.Round(floats.Get(index));
10178 index++;
10179 }
10180
10182 {
10184 index++;
10186 index++;
10188 index++;
10190 index++;
10191 }
10192
10194 {
10195 int cleanness = Math.Round(floats.Get(index));
10197 index++;
10198 }
10199 }
10200
10202 {
10203 super.WriteVarsToCTX(ctx);
10204
10205
10207 {
10209 }
10210
10212 {
10214 }
10215
10217 {
10219 }
10220
10222 {
10223 int r,g,b,a;
10229 }
10230
10232 {
10234 }
10235 }
10236
10238 {
10239 if (!super.ReadVarsFromCTX(ctx,version))
10240 return false;
10241
10242 int intValue;
10243 float value;
10244
10245 if (version < 140)
10246 {
10247 if (!ctx.
Read(intValue))
10248 return false;
10249
10250 m_VariablesMask = intValue;
10251 }
10252
10254 {
10255 if (!ctx.
Read(value))
10256 return false;
10257
10259 {
10261 }
10262 else
10263 {
10265 }
10266 }
10267
10268 if (version < 140)
10269 {
10271 {
10272 if (!ctx.
Read(value))
10273 return false;
10274 SetTemperatureDirect(value);
10275 }
10276 }
10277
10279 {
10280 if (!ctx.
Read(value))
10281 return false;
10283 }
10284
10286 {
10287 if (!ctx.
Read(intValue))
10288 return false;
10290 }
10291
10293 {
10294 int r,g,b,a;
10296 return false;
10298 return false;
10300 return false;
10302 return false;
10303
10305 }
10306
10308 {
10309 if (!ctx.
Read(intValue))
10310 return false;
10312 }
10313
10314 if (version >= 138 && version < 140)
10315 {
10317 {
10318 if (!ctx.
Read(intValue))
10319 return false;
10320 SetFrozen(intValue);
10321 }
10322 }
10323
10324 return true;
10325 }
10326
10327
10329 {
10332 {
10334 }
10335
10336 if (!super.OnStoreLoad(ctx, version))
10337 {
10339 return false;
10340 }
10341
10342 if (version >= 114)
10343 {
10344 bool hasQuickBarIndexSaved;
10345
10346 if (!ctx.
Read(hasQuickBarIndexSaved))
10347 {
10349 return false;
10350 }
10351
10352 if (hasQuickBarIndexSaved)
10353 {
10354 int itmQBIndex;
10355
10356
10357 if (!ctx.
Read(itmQBIndex))
10358 {
10360 return false;
10361 }
10362
10363 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10364 if (itmQBIndex != -1 && parentPlayer)
10365 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10366 }
10367 }
10368 else
10369 {
10370
10371 PlayerBase player;
10372 int itemQBIndex;
10373 if (version ==
int.
MAX)
10374 {
10375 if (!ctx.
Read(itemQBIndex))
10376 {
10378 return false;
10379 }
10380 }
10381 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10382 {
10383
10384 if (!ctx.
Read(itemQBIndex))
10385 {
10387 return false;
10388 }
10389 if (itemQBIndex != -1 && player)
10390 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10391 }
10392 }
10393
10394 if (version < 140)
10395 {
10396
10397 if (!LoadVariables(ctx, version))
10398 {
10400 return false;
10401 }
10402 }
10403
10404
10406 {
10408 return false;
10409 }
10410 if (version >= 132)
10411 {
10413 if (raib)
10414 {
10416 {
10418 return false;
10419 }
10420 }
10421 }
10422
10424 return true;
10425 }
10426
10427
10428
10430 {
10431 super.OnStoreSave(ctx);
10432
10433 PlayerBase player;
10434 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10435 {
10437
10438 int itemQBIndex = -1;
10439 itemQBIndex = player.FindQuickBarEntityIndex(this);
10440 ctx.
Write(itemQBIndex);
10441 }
10442 else
10443 {
10445 }
10446
10448
10450 if (raib)
10451 {
10453 }
10454 }
10455
10456
10458 {
10459 super.AfterStoreLoad();
10460
10462 {
10464 }
10465
10467 {
10470 }
10471 }
10472
10474 {
10475 super.EEOnAfterLoad();
10476
10478 {
10480 }
10481
10484 }
10485
10487 {
10488 return false;
10489 }
10490
10491
10492
10494 {
10496 {
10497 #ifdef PLATFORM_CONSOLE
10498
10500 {
10502 if (menu)
10503 {
10505 }
10506 }
10507 #endif
10508 }
10509
10511 {
10514 }
10515
10517 {
10518 SetWeightDirty();
10520 }
10522 {
10525 }
10526
10528 {
10531 }
10533 {
10536 }
10537
10538 super.OnVariablesSynchronized();
10539 }
10540
10541
10542
10544 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10545 {
10546 if (!IsServerCheck(allow_client))
10547 return false;
10548
10550 return false;
10551
10554
10555 if (value <= (min + 0.001))
10556 value = min;
10557
10558 if (value == min)
10559 {
10560 if (destroy_config)
10561 {
10562 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10563 if (dstr)
10564 {
10566 this.Delete();
10567 return true;
10568 }
10569 }
10570 else if (destroy_forced)
10571 {
10573 this.Delete();
10574 return true;
10575 }
10576
10578 }
10579
10582
10584 {
10586
10587 if (delta)
10589 }
10590
10592
10593 return false;
10594 }
10595
10596
10598 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10599 {
10601 }
10602
10604 {
10607 }
10608
10610 {
10613 }
10614
10616 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10617 {
10618 float value_clamped = Math.Clamp(value, 0, 1);
10620 SetQuantity(result, destroy_config, destroy_forced);
10621 }
10622
10623
10626 {
10628 }
10629
10631 {
10633 }
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10645 {
10646 int slot = -1;
10647 if (GetInventory())
10648 {
10649 InventoryLocation il = new InventoryLocation;
10650 GetInventory().GetCurrentInventoryLocation(il);
10652 }
10653
10655 }
10656
10658 {
10659 float quantity_max = 0;
10660
10662 {
10663 if (attSlotID != -1)
10664 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10665
10666 if (quantity_max <= 0)
10668 }
10669
10670 if (quantity_max <= 0)
10672
10673 return quantity_max;
10674 }
10675
10677 {
10679 }
10680
10682 {
10684 }
10685
10686
10688 {
10690 }
10691
10693 {
10695 }
10696
10698 {
10700 }
10701
10702
10704 {
10705
10706 float weightEx = GetWeightEx();
10707 float special = GetInventoryAndCargoWeight();
10708 return weightEx - special;
10709 }
10710
10711
10713 {
10715 }
10716
10718 {
10720 {
10721 #ifdef DEVELOPER
10722 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10723 {
10724 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10726 }
10727 #endif
10728
10729 return GetQuantity() * GetConfigWeightModified();
10730 }
10731 else if (HasEnergyManager())
10732 {
10733 #ifdef DEVELOPER
10734 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10735 {
10736 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10737 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10738 }
10739 #endif
10740 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
10741 }
10742 else
10743 {
10744 #ifdef DEVELOPER
10745 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10746 {
10747 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10748 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10749 }
10750 #endif
10751 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
10752 }
10753 }
10754
10757 {
10758 int item_count = 0;
10760
10761 if (GetInventory().GetCargo() != NULL)
10762 {
10763 item_count = GetInventory().GetCargo().GetItemCount();
10764 }
10765
10766 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10767 {
10768 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10769 if (item)
10770 item_count += item.GetNumberOfItems();
10771 }
10772 return item_count;
10773 }
10774
10777 {
10778 float weight = 0;
10779 float wetness = 1;
10780 if (include_wetness)
10783 {
10784 weight = wetness * m_ConfigWeight;
10785 }
10787 {
10788 weight = 1;
10789 }
10790 return weight;
10791 }
10792
10793
10794
10796 {
10797 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10798 {
10799 GameInventory inv = GetInventory();
10800 array<EntityAI> items = new array<EntityAI>;
10802 for (int i = 0; i < items.Count(); i++)
10803 {
10805 if (item)
10806 {
10808 }
10809 }
10810 }
10811 }
10812
10813
10814
10815
10817 {
10818 float energy = 0;
10819 if (HasEnergyManager())
10820 {
10821 energy = GetCompEM().GetEnergy();
10822 }
10823 return energy;
10824 }
10825
10826
10828 {
10829 super.OnEnergyConsumed();
10830
10832 }
10833
10835 {
10836 super.OnEnergyAdded();
10837
10839 }
10840
10841
10843 {
10844 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10845 {
10847 {
10848 float energy_0to1 = GetCompEM().GetEnergy0To1();
10850 }
10851 }
10852 }
10853
10854
10856 {
10857 return ConfigGetFloat("heatIsolation");
10858 }
10859
10861 {
10863 }
10864
10866 {
10867 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10868 if (
GetGame().ConfigIsExisting(paramPath))
10870
10871 return 0.0;
10872 }
10873
10875 {
10876 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10877 if (
GetGame().ConfigIsExisting(paramPath))
10879
10880 return 0.0;
10881 }
10882
10883 override void SetWet(
float value,
bool allow_client =
false)
10884 {
10885 if (!IsServerCheck(allow_client))
10886 return;
10887
10890
10892
10893 m_VarWet = Math.Clamp(value, min, max);
10894
10896 {
10899 }
10900 }
10901
10902 override void AddWet(
float value)
10903 {
10905 }
10906
10908 {
10910 }
10911
10913 {
10915 }
10916
10918 {
10920 }
10921
10923 {
10925 }
10926
10928 {
10930 }
10931
10932 override void OnWetChanged(
float newVal,
float oldVal)
10933 {
10936 if (newLevel != oldLevel)
10937 {
10939 }
10940 }
10941
10943 {
10944 SetWeightDirty();
10945 }
10946
10948 {
10949 return GetWetLevelInternal(
m_VarWet);
10950 }
10951
10952
10953
10955 {
10957 }
10958
10960 {
10962 }
10963
10965 {
10967 }
10968
10970 {
10972 }
10973
10974
10975
10977 {
10978 if (ConfigIsExisting("itemModelLength"))
10979 {
10980 return ConfigGetFloat("itemModelLength");
10981 }
10982 return 0;
10983 }
10984
10986 {
10987 if (ConfigIsExisting("itemAttachOffset"))
10988 {
10989 return ConfigGetFloat("itemAttachOffset");
10990 }
10991 return 0;
10992 }
10993
10994 override void SetCleanness(
int value,
bool allow_client =
false)
10995 {
10996 if (!IsServerCheck(allow_client))
10997 return;
10998
11000
11002
11005 }
11006
11008 {
11010 }
11011
11013 {
11014 return true;
11015 }
11016
11017
11018
11019
11021 {
11023 }
11024
11026 {
11028 }
11029
11030
11031
11032
11033 override void SetColor(
int r,
int g,
int b,
int a)
11034 {
11040 }
11042 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11043 {
11048 }
11049
11051 {
11053 }
11054
11057 {
11058 int r,g,b,a;
11060 r = r/255;
11061 g = g/255;
11062 b = b/255;
11063 a = a/255;
11064 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11065 }
11066
11067
11068
11069 override void SetLiquidType(
int value,
bool allow_client =
false)
11070 {
11071 if (!IsServerCheck(allow_client))
11072 return;
11073
11078 }
11079
11081 {
11082 return ConfigGetInt("varLiquidTypeInit");
11083 }
11084
11086 {
11088 }
11089
11091 {
11093 SetFrozen(false);
11094 }
11095
11098 {
11099 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11100 }
11101
11102
11105 {
11106 PlayerBase nplayer;
11107 if (PlayerBase.CastTo(nplayer, player))
11108 {
11110
11111 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11112 }
11113 }
11114
11115
11118 {
11119 PlayerBase nplayer;
11120 if (PlayerBase.CastTo(nplayer,player))
11121 {
11122
11123 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11124
11125 }
11126
11127
11128 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11129
11130
11131 if (HasEnergyManager())
11132 {
11133 GetCompEM().UpdatePlugState();
11134 }
11135 }
11136
11137
11139 {
11140 super.OnPlacementStarted(player);
11141
11143 }
11144
11145 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11146 {
11148 {
11149 m_AdminLog.OnPlacementComplete(player,
this);
11150 }
11151
11152 super.OnPlacementComplete(player, position, orientation);
11153 }
11154
11155
11156
11157
11158
11160 {
11162 {
11163 return true;
11164 }
11165 else
11166 {
11167 return false;
11168 }
11169 }
11170
11171
11173 {
11175 {
11177 }
11178 }
11179
11180
11182 {
11184 }
11185
11187 {
11189 }
11190
11191 override void InsertAgent(
int agent,
float count = 1)
11192 {
11193 if (count < 1)
11194 return;
11195
11197 }
11198
11201 {
11203 }
11204
11205
11207 {
11209 }
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11253 {
11255 return false;
11256 return true;
11257 }
11258
11260 {
11261
11263 }
11264
11265
11268 {
11269 super.CheckForRoofLimited(timeTresholdMS);
11270
11272 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11273 {
11274 m_PreviousRoofTestTime = time;
11275 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11276 }
11277 }
11278
11279
11281 {
11283 {
11284 return 0;
11285 }
11286
11287 if (GetInventory().GetAttachmentSlotsCount() != 0)
11288 {
11289 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
11290 if (filter)
11291 return filter.GetProtectionLevel(type, false, system);
11292 else
11293 return 0;
11294 }
11295
11296 string subclassPath, entryName;
11297
11298 switch (type)
11299 {
11301 entryName = "biological";
11302 break;
11304 entryName = "chemical";
11305 break;
11306 default:
11307 entryName = "biological";
11308 break;
11309 }
11310
11311 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11312
11314 }
11315
11316
11317
11320 {
11321 if (!IsMagazine())
11323
11325 }
11326
11327
11328
11329
11330
11335 {
11336 return true;
11337 }
11338
11340 {
11342 }
11343
11344
11345
11346
11347
11349 {
11350 if (parent)
11351 {
11352 if (parent.IsInherited(DayZInfected))
11353 return true;
11354
11355 if (!parent.IsRuined())
11356 return true;
11357 }
11358
11359 return true;
11360 }
11361
11363 {
11364 if (!super.CanPutAsAttachment(parent))
11365 {
11366 return false;
11367 }
11368
11369 if (!IsRuined() && !parent.IsRuined())
11370 {
11371 return true;
11372 }
11373
11374 return false;
11375 }
11376
11378 {
11379
11380
11381
11382
11383 return super.CanReceiveItemIntoCargo(item);
11384 }
11385
11387 {
11388
11389
11390
11391
11392 GameInventory attachmentInv = attachment.GetInventory();
11394 {
11395 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11396 return false;
11397 }
11398
11399 InventoryLocation loc = new InventoryLocation();
11400 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11401 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11402 return false;
11403
11404 return super.CanReceiveAttachment(attachment, slotId);
11405 }
11406
11408 {
11409 if (!super.CanReleaseAttachment(attachment))
11410 return false;
11411
11412 return GetInventory().AreChildrenAccessible();
11413 }
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11436 {
11437 int id = muzzle_owner.GetMuzzleID();
11438 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11439
11440 if (WPOF_array)
11441 {
11442 for (int i = 0; i < WPOF_array.Count(); i++)
11443 {
11444 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11445
11446 if (WPOF)
11447 {
11448 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11449 }
11450 }
11451 }
11452 }
11453
11454
11456 {
11457 int id = muzzle_owner.GetMuzzleID();
11459
11460 if (WPOBE_array)
11461 {
11462 for (int i = 0; i < WPOBE_array.Count(); i++)
11463 {
11464 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11465
11466 if (WPOBE)
11467 {
11468 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11469 }
11470 }
11471 }
11472 }
11473
11474
11476 {
11477 int id = muzzle_owner.GetMuzzleID();
11478 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11479
11480 if (WPOOH_array)
11481 {
11482 for (int i = 0; i < WPOOH_array.Count(); i++)
11483 {
11484 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11485
11486 if (WPOOH)
11487 {
11488 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11489 }
11490 }
11491 }
11492 }
11493
11494
11496 {
11497 int id = muzzle_owner.GetMuzzleID();
11498 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11499
11500 if (WPOOH_array)
11501 {
11502 for (int i = 0; i < WPOOH_array.Count(); i++)
11503 {
11504 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11505
11506 if (WPOOH)
11507 {
11508 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11509 }
11510 }
11511 }
11512 }
11513
11514
11516 {
11517 int id = muzzle_owner.GetMuzzleID();
11518 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11519
11520 if (WPOOH_array)
11521 {
11522 for (int i = 0; i < WPOOH_array.Count(); i++)
11523 {
11524 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11525
11526 if (WPOOH)
11527 {
11528 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11529 }
11530 }
11531 }
11532 }
11533
11534
11535
11537 {
11539 {
11540 return true;
11541 }
11542
11543 return false;
11544 }
11545
11547 {
11549 {
11550 return true;
11551 }
11552
11553 return false;
11554 }
11555
11557 {
11559 {
11560 return true;
11561 }
11562
11563 return false;
11564 }
11565
11567 {
11568 return false;
11569 }
11570
11573 {
11574 return UATimeSpent.DEFAULT_DEPLOY;
11575 }
11576
11577
11578
11579
11581 {
11583 SetSynchDirty();
11584 }
11585
11587 {
11589 }
11590
11591
11593 {
11594 return false;
11595 }
11596
11599 {
11600 string att_type = "None";
11601
11602 if (ConfigIsExisting("soundAttType"))
11603 {
11604 att_type = ConfigGetString("soundAttType");
11605 }
11606
11608 }
11609
11611 {
11613 }
11614
11615
11616
11617
11618
11624
11626 {
11629
11631 }
11632
11633
11635 {
11637 return;
11638
11640
11643
11646
11647 SoundParameters params = new SoundParameters();
11651 }
11652
11653
11655 {
11657 return;
11658
11660 SetSynchDirty();
11661
11664 }
11665
11666
11668 {
11670 return;
11671
11673 SetSynchDirty();
11674
11677 }
11678
11680 {
11682 }
11683
11685 {
11687 }
11688
11691 {
11692 if (!
GetGame().IsDedicatedServer())
11693 {
11694 if (ConfigIsExisting("attachSoundSet"))
11695 {
11696 string cfg_path = "";
11697 string soundset = "";
11698 string type_name =
GetType();
11699
11702 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11703 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11704
11705 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11706 {
11707 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11708 {
11709 if (cfg_slot_array[i] == slot_type)
11710 {
11711 soundset = cfg_soundset_array[i];
11712 break;
11713 }
11714 }
11715 }
11716
11717 if (soundset != "")
11718 {
11719 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11721 }
11722 }
11723 }
11724 }
11725
11727 {
11728
11729 }
11730
11731 void OnApply(PlayerBase player);
11732
11734 {
11735 return 1.0;
11736 };
11737
11739 {
11741 }
11742
11744 {
11746 }
11747
11749
11751 {
11752 SetDynamicPhysicsLifeTime(0.01);
11754 }
11755
11757 {
11758 array<string> zone_names = new array<string>;
11759 GetDamageZones(zone_names);
11760 for (int i = 0; i < zone_names.Count(); i++)
11761 {
11762 SetHealthMax(zone_names.Get(i),"Health");
11763 }
11764 SetHealthMax("","Health");
11765 }
11766
11769 {
11770 float global_health = GetHealth01("","Health");
11771 array<string> zones = new array<string>;
11772 GetDamageZones(zones);
11773
11774 for (int i = 0; i < zones.Count(); i++)
11775 {
11776 SetHealth01(zones.Get(i),"Health",global_health);
11777 }
11778 }
11779
11782 {
11783 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11784 }
11785
11787 {
11788 if (!hasRootAsPlayer)
11789 {
11790 if (refParentIB)
11791 {
11792
11793 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11794 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11795
11796 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11797 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11798
11801 }
11802 else
11803 {
11804
11807 }
11808 }
11809 }
11810
11812 {
11814 {
11815 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11816 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
11817 {
11818 float heatPermCoef = 1.0;
11820 while (ent)
11821 {
11822 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11823 ent = ent.GetHierarchyParent();
11824 }
11825
11826 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11827 }
11828 }
11829 }
11830
11832 {
11833
11834 EntityAI parent = GetHierarchyParent();
11835 if (!parent)
11836 {
11837 hasParent = false;
11838 hasRootAsPlayer = false;
11839 }
11840 else
11841 {
11842 hasParent = true;
11843 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11844 refParentIB =
ItemBase.Cast(parent);
11845 }
11846 }
11847
11848 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11849 {
11850
11851 }
11852
11854 {
11855
11856 return false;
11857 }
11858
11860 {
11861
11862
11863 return false;
11864 }
11865
11867 {
11868
11869 return false;
11870 }
11871
11874 {
11875 return !GetIsFrozen() &&
IsOpen();
11876 }
11877
11879 {
11880 bool hasParent = false, hasRootAsPlayer = false;
11882
11883 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11884 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11885
11886 if (wwtu || foodDecay)
11887 {
11891
11892 if (processWetness || processTemperature || processDecay)
11893 {
11895
11896 if (processWetness)
11897 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11898
11899 if (processTemperature)
11901
11902 if (processDecay)
11903 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11904 }
11905 }
11906 }
11907
11910 {
11912 }
11913
11915 {
11918
11919 return super.GetTemperatureFreezeThreshold();
11920 }
11921
11923 {
11926
11927 return super.GetTemperatureThawThreshold();
11928 }
11929
11931 {
11934
11935 return super.GetItemOverheatThreshold();
11936 }
11937
11939 {
11941 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11942
11943 return super.GetTemperatureFreezeTime();
11944 }
11945
11947 {
11949 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11950
11951 return super.GetTemperatureThawTime();
11952 }
11953
11958
11960 {
11961 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11962 }
11963
11965 {
11966 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11967 }
11968
11971 {
11973 }
11974
11976 {
11978 }
11979
11981 {
11983 }
11984
11987 {
11988 return null;
11989 }
11990
11993 {
11994 return false;
11995 }
11996
11998 {
12000 {
12003 if (!trg)
12004 {
12006 explosive = this;
12007 }
12008
12009 explosive.PairRemote(trg);
12011
12012 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12013 trg.SetPersistentPairID(persistentID);
12014 explosive.SetPersistentPairID(persistentID);
12015
12016 return true;
12017 }
12018 return false;
12019 }
12020
12023 {
12024 float ret = 1.0;
12027 ret *= GetHealth01();
12028
12029 return ret;
12030 }
12031
12032 #ifdef DEVELOPER
12033 override void SetDebugItem()
12034 {
12035 super.SetDebugItem();
12036 _itemBase = this;
12037 }
12038
12040 {
12041 string text = super.GetDebugText();
12042
12044 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12045
12046 return text;
12047 }
12048 #endif
12049
12051 {
12052 return true;
12053 }
12054
12056
12058
12060 {
12063 }
12064
12065
12073
12089}
12090
12092{
12094 if (entity)
12095 {
12096 bool is_item = entity.IsInherited(
ItemBase);
12097 if (is_item && full_quantity)
12098 {
12101 }
12102 }
12103 else
12104 {
12106 return NULL;
12107 }
12108 return entity;
12109}
12110
12112{
12113 if (item)
12114 {
12115 if (health > 0)
12116 item.SetHealth("", "", health);
12117
12118 if (item.CanHaveTemperature())
12119 {
12121 if (item.CanFreeze())
12122 item.SetFrozen(false);
12123 }
12124
12125 if (item.HasEnergyManager())
12126 {
12127 if (quantity >= 0)
12128 {
12129 item.GetCompEM().SetEnergy0To1(quantity);
12130 }
12131 else
12132 {
12134 }
12135 }
12136 else if (item.IsMagazine())
12137 {
12138 Magazine mag = Magazine.Cast(item);
12139 if (quantity >= 0)
12140 {
12141 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12142 }
12143 else
12144 {
12146 }
12147
12148 }
12149 else
12150 {
12151 if (quantity >= 0)
12152 {
12153 item.SetQuantityNormalized(quantity, false);
12154 }
12155 else
12156 {
12158 }
12159
12160 }
12161 }
12162}
12163
12164#ifdef DEVELOPER
12166#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.