7118{
7120 {
7121 return true;
7122 }
7123};
7124
7125
7126
7128{
7132
7134
7137
7138
7139
7140
7141
7150
7156
7161
7166
7187 protected bool m_IsResultOfSplit
7188
7190
7195
7196
7197
7199
7203
7204
7205
7207
7210
7211
7212
7218
7219
7227
7230
7231
7233
7234
7236
7237
7242
7243
7248
7249
7251
7252
7254 {
7259
7260 if (!
GetGame().IsDedicatedServer())
7261 {
7263 {
7265
7267 {
7269 }
7270 }
7271
7274 }
7275
7276 m_OldLocation = null;
7277
7279 {
7281 }
7282
7283 if (ConfigIsExisting("headSelectionsToHide"))
7284 {
7287 }
7288
7290 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7291 {
7293 }
7294
7296
7297 m_IsResultOfSplit = false;
7298
7300 }
7301
7303 {
7304 super.InitItemVariables();
7305
7311 m_Count = ConfigGetInt(
"count");
7312
7315
7320
7323
7328
7340
7344
7345
7348 if (ConfigIsExisting("canBeSplit"))
7349 {
7352 }
7353
7355 if (ConfigIsExisting("itemBehaviour"))
7357
7358
7361 RegisterNetSyncVariableInt("m_VarLiquidType");
7362 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7363
7364 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7365 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7366 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7367
7368 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7369 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7370 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7371 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7372
7373 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7374 RegisterNetSyncVariableBool("m_IsTakeable");
7375 RegisterNetSyncVariableBool("m_IsHologram");
7376
7379 {
7382 }
7383
7385
7387 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7389
7390 }
7391
7393 {
7395 }
7396
7398 {
7401 {
7406 }
7407 }
7408
7409 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7410 {
7412 {
7415 }
7416
7418 }
7419
7421 {
7427 }
7428
7430
7432 {
7434
7435 if (!action)
7436 {
7437 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7438 return;
7439 }
7440
7442 if (!ai)
7443 {
7445 return;
7446 }
7447
7449 if (!action_array)
7450 {
7451 action_array = new array<ActionBase_Basic>;
7453 }
7454 if (LogManager.IsActionLogEnable())
7455 {
7456 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7457 }
7458
7459 if (action_array.Find(action) != -1)
7460 {
7461 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7462 }
7463 else
7464 {
7465 action_array.Insert(action);
7466 }
7467 }
7468
7470 {
7472 ActionBase action = player.GetActionManager().GetAction(actionName);
7475
7476 if (action_array)
7477 {
7478 action_array.RemoveItem(action);
7479 }
7480 }
7481
7482
7483
7485 {
7486 ActionOverrideData overrideData = new ActionOverrideData();
7490
7492 if (!actionMap)
7493 {
7496 }
7497
7498 actionMap.Insert(this.
Type(), overrideData);
7499
7500 }
7501
7503
7505
7506
7508 {
7511
7514
7515 string config_to_search = "CfgVehicles";
7516 string muzzle_owner_config;
7517
7519 {
7520 if (IsInherited(Weapon))
7521 config_to_search = "CfgWeapons";
7522
7523 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7524
7525 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7526
7528
7529 if (config_OnFire_subclass_count > 0)
7530 {
7531 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7532
7533 for (int i = 0; i < config_OnFire_subclass_count; i++)
7534 {
7535 string particle_class = "";
7537 string config_OnFire_entry = config_OnFire_class + particle_class;
7538 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7539 WPOF_array.Insert(WPOF);
7540 }
7541
7542
7544 }
7545 }
7546
7548 {
7549 config_to_search = "CfgWeapons";
7550 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7551
7552 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7553
7555
7556 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7557 {
7558 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7559
7560 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7561 {
7562 string particle_class2 = "";
7564 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7565 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7566 WPOBE_array.Insert(WPOBE);
7567 }
7568
7569
7571 }
7572 }
7573 }
7574
7575
7577 {
7580
7582 {
7583 string config_to_search = "CfgVehicles";
7584
7585 if (IsInherited(Weapon))
7586 config_to_search = "CfgWeapons";
7587
7588 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7589 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7590
7591 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7592 {
7593
7595
7597 {
7599 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7601 return;
7602 }
7603
7606
7607
7608
7610 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7611
7612 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7613 {
7614 string particle_class = "";
7616 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7618
7619 if (entry_type == CT_CLASS)
7620 {
7621 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7622 WPOOH_array.Insert(WPOF);
7623 }
7624 }
7625
7626
7628 }
7629 }
7630 }
7631
7633 {
7635 }
7636
7638 {
7640 {
7642
7645
7648
7649 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7650 }
7651 }
7652
7654 {
7656 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7657
7659 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7660
7662 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7663
7665 {
7667 }
7668 }
7669
7671 {
7673 }
7674
7676 {
7679 else
7681
7683 {
7686 }
7687 else
7688 {
7691
7694 }
7695
7697 }
7698
7700 {
7702 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7703 }
7704
7706 {
7708 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7710 }
7711
7713 {
7715 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7716 }
7717
7719 {
7722
7723 OverheatingParticle OP = new OverheatingParticle();
7728
7730 }
7731
7733 {
7736
7737 return -1;
7738 }
7739
7741 {
7743 {
7746
7747 for (int i = count; i > 0; --i)
7748 {
7749 int id = i - 1;
7752
7755
7756 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7757 {
7758 if (p)
7759 {
7762 }
7763 }
7764 }
7765 }
7766 }
7767
7769 {
7771 {
7773 {
7774 int id = i - 1;
7776
7777 if (OP)
7778 {
7780
7781 if (p)
7782 {
7784 }
7785
7786 delete OP;
7787 }
7788 }
7789
7792 }
7793 }
7794
7797 {
7798 return 0.0;
7799 }
7800
7801
7803 {
7804 return 250;
7805 }
7806
7808 {
7809 return 0;
7810 }
7811
7814 {
7816 return true;
7817
7818 return false;
7819 }
7820
7823 {
7826
7828 {
7830 }
7831 else
7832 {
7833
7835 }
7836
7838 }
7839
7846 {
7847 return -1;
7848 }
7849
7850
7851
7852
7854 {
7856 {
7858 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7859
7860 if (r_index >= 0)
7861 {
7862 InventoryLocation r_il = new InventoryLocation;
7863 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7864
7865 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7868 {
7869 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7870 }
7872 {
7873 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7874 }
7875
7876 }
7877
7878 player.GetHumanInventory().ClearUserReservedLocation(this);
7879 }
7880
7883 }
7884
7885
7886
7887
7889 {
7890 return ItemBase.m_DebugActionsMask;
7891 }
7892
7894 {
7895 return ItemBase.m_DebugActionsMask & mask;
7896 }
7897
7899 {
7900 ItemBase.m_DebugActionsMask = mask;
7901 }
7902
7904 {
7905 ItemBase.m_DebugActionsMask |= mask;
7906 }
7907
7909 {
7910 ItemBase.m_DebugActionsMask &= ~mask;
7911 }
7912
7914 {
7916 {
7918 }
7919 else
7920 {
7922 }
7923 }
7924
7925
7927 {
7928 if (GetEconomyProfile())
7929 {
7930 float q_max = GetEconomyProfile().GetQuantityMax();
7931 if (q_max > 0)
7932 {
7933 float q_min = GetEconomyProfile().GetQuantityMin();
7934 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7935
7937 {
7938 ComponentEnergyManager comp = GetCompEM();
7940 {
7942 }
7943 }
7945 {
7947
7948 }
7949
7950 }
7951 }
7952 }
7953
7956 {
7957 EntityAI parent = GetHierarchyParent();
7958
7959 if (parent)
7960 {
7961 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7962 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7963 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
7964 }
7965 }
7966
7969 {
7970 EntityAI parent = GetHierarchyParent();
7971
7972 if (parent)
7973 {
7974 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7975 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7976 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
7977 }
7978 }
7979
7981 {
7982
7983
7984
7985
7987
7989 {
7990 if (ScriptInputUserData.CanStoreInputUserData())
7991 {
7992 ScriptInputUserData ctx = new ScriptInputUserData;
7998 ctx.
Write(use_stack_max);
8001
8003 {
8004 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8005 }
8006 }
8007 }
8008 else if (!
GetGame().IsMultiplayer())
8009 {
8011 }
8012 }
8013
8015 {
8017 }
8018
8020 {
8022 }
8023
8025 {
8027 }
8028
8030 {
8031
8032 return false;
8033 }
8034
8036 {
8037 return false;
8038 }
8039
8043 {
8044 return false;
8045 }
8046
8048 {
8049 return "";
8050 }
8051
8053
8055 {
8056 return false;
8057 }
8058
8060 {
8061 return true;
8062 }
8063
8064
8065
8067 {
8068 return true;
8069 }
8070
8072 {
8073 return true;
8074 }
8075
8077 {
8078 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8080 }
8081
8083 {
8085 }
8086
8088 {
8090 if (!is_being_placed)
8092 SetSynchDirty();
8093 }
8094
8095
8097
8099 {
8101 }
8102
8104 {
8106 }
8107
8109 {
8110 return 1;
8111 }
8112
8114 {
8115 return false;
8116 }
8117
8119 {
8121 SetSynchDirty();
8122 }
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8159 {
8160 super.OnMovedInsideCargo(container);
8161
8162 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8163 }
8164
8165 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8166 {
8167 super.EEItemLocationChanged(oldLoc,newLoc);
8168
8169 PlayerBase new_player = null;
8170 PlayerBase old_player = null;
8171
8172 if (newLoc.GetParent())
8173 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8174
8175 if (oldLoc.GetParent())
8176 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8177
8179 {
8180 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8181
8182 if (r_index >= 0)
8183 {
8184 InventoryLocation r_il = new InventoryLocation;
8185 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8186
8187 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8190 {
8191 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8192 }
8194 {
8195 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8196 }
8197
8198 }
8199 }
8200
8202 {
8203 if (new_player)
8204 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8205
8206 if (new_player == old_player)
8207 {
8208
8209 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8210 {
8212 {
8213 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8214 {
8215 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8216 }
8217 }
8218 else
8219 {
8220 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8221 }
8222 }
8223
8224 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8225 {
8226 int type = oldLoc.GetType();
8228 {
8229 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8230 }
8232 {
8233 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8234 }
8235 }
8236 if (!m_OldLocation)
8237 {
8238 m_OldLocation = new InventoryLocation;
8239 }
8240 m_OldLocation.Copy(oldLoc);
8241 }
8242 else
8243 {
8244 if (m_OldLocation)
8245 {
8246 m_OldLocation.Reset();
8247 }
8248 }
8249
8251 }
8252 else
8253 {
8254 if (new_player)
8255 {
8256 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8257 if (res_index >= 0)
8258 {
8259 InventoryLocation il = new InventoryLocation;
8260 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8262 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8265 {
8266 il.
GetParent().GetOnReleaseLock().Invoke(it);
8267 }
8269 {
8271 }
8272
8273 }
8274 }
8276 {
8277
8279 }
8280
8281 if (m_OldLocation)
8282 {
8283 m_OldLocation.Reset();
8284 }
8285 }
8286 }
8287
8288 override void EOnContact(IEntity other, Contact extra)
8289 {
8291 {
8292 int liquidType = -1;
8294 if (impactSpeed > 0.0)
8295 {
8297 #ifndef SERVER
8299 #else
8301 SetSynchDirty();
8302 #endif
8304 }
8305 }
8306
8307 #ifdef SERVER
8308 if (GetCompEM() && GetCompEM().IsPlugged())
8309 {
8310 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8311 GetCompEM().UnplugThis();
8312 }
8313 #endif
8314 }
8315
8317
8319 {
8321 }
8322
8324 {
8325
8326 }
8327
8329 {
8330 super.OnItemLocationChanged(old_owner, new_owner);
8331
8332 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8333 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8334
8335 if (!relatedPlayer && playerNew)
8336 relatedPlayer = playerNew;
8337
8338 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8339 {
8341 if (actionMgr)
8342 {
8343 ActionBase currentAction = actionMgr.GetRunningAction();
8344 if (currentAction)
8346 }
8347 }
8348
8349 Man ownerPlayerOld = null;
8350 Man ownerPlayerNew = null;
8351
8352 if (old_owner)
8353 {
8354 if (old_owner.
IsMan())
8355 {
8356 ownerPlayerOld = Man.Cast(old_owner);
8357 }
8358 else
8359 {
8360 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8361 }
8362 }
8363 else
8364 {
8366 {
8368
8369 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8370 {
8371 GetCompEM().UnplugThis();
8372 }
8373 }
8374 }
8375
8376 if (new_owner)
8377 {
8378 if (new_owner.
IsMan())
8379 {
8380 ownerPlayerNew = Man.Cast(new_owner);
8381 }
8382 else
8383 {
8384 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8385 }
8386 }
8387
8388 if (ownerPlayerOld != ownerPlayerNew)
8389 {
8390 if (ownerPlayerOld)
8391 {
8392 array<EntityAI> subItemsExit = new array<EntityAI>;
8394 for (int i = 0; i < subItemsExit.Count(); i++)
8395 {
8398 }
8399 }
8400
8401 if (ownerPlayerNew)
8402 {
8403 array<EntityAI> subItemsEnter = new array<EntityAI>;
8405 for (int j = 0; j < subItemsEnter.Count(); j++)
8406 {
8409 }
8410 }
8411 }
8412 else if (ownerPlayerNew != null)
8413 {
8414 PlayerBase nplayer;
8415 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8416 {
8417 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8419 for (int k = 0; k < subItemsUpdate.Count(); k++)
8420 {
8422 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8423 }
8424 }
8425 }
8426
8427 if (old_owner)
8428 old_owner.OnChildItemRemoved(this);
8429 if (new_owner)
8430 new_owner.OnChildItemReceived(this);
8431 }
8432
8433
8435 {
8436 super.EEDelete(parent);
8437 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8438 if (player)
8439 {
8441
8442 if (player.IsAlive())
8443 {
8444 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8445 if (r_index >= 0)
8446 {
8447 InventoryLocation r_il = new InventoryLocation;
8448 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8449
8450 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8453 {
8454 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8455 }
8457 {
8458 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8459 }
8460
8461 }
8462
8463 player.RemoveQuickBarEntityShortcut(this);
8464 }
8465 }
8466 }
8467
8469 {
8470 super.EEKilled(killer);
8471
8474 {
8475 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8476 {
8477 if (IsMagazine())
8478 {
8479 if (Magazine.Cast(this).GetAmmoCount() > 0)
8480 {
8482 }
8483 }
8484 else
8485 {
8487 }
8488 }
8489 }
8490 }
8491
8493 {
8494 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8495
8496 super.OnWasAttached(parent, slot_id);
8497
8500
8502 }
8503
8505 {
8506 super.OnWasDetached(parent, slot_id);
8507
8510 }
8511
8513 {
8514 int idx;
8517
8518 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8519 if (inventory_slots.Count() < 1)
8520 {
8521 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8522 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8523 }
8524 else
8525 {
8526 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8527 }
8528
8529 idx = inventory_slots.Find(slot);
8530 if (idx < 0)
8531 return "";
8532
8533 return attach_types.Get(idx);
8534 }
8535
8537 {
8538 int idx = -1;
8539 string slot;
8540
8543
8544 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8545 if (inventory_slots.Count() < 1)
8546 {
8547 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8548 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8549 }
8550 else
8551 {
8552 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8553 if (detach_types.Count() < 1)
8554 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8555 }
8556
8557 for (int i = 0; i < inventory_slots.Count(); i++)
8558 {
8559 slot = inventory_slots.Get(i);
8560 }
8561
8562 if (slot != "")
8563 {
8564 if (detach_types.Count() == 1)
8565 idx = 0;
8566 else
8567 idx = inventory_slots.Find(slot);
8568 }
8569 if (idx < 0)
8570 return "";
8571
8572 return detach_types.Get(idx);
8573 }
8574
8576 {
8577
8579
8580
8581 float min_time = 1;
8582 float max_time = 3;
8583 float delay = Math.RandomFloat(min_time, max_time);
8584
8585 explode_timer.Run(delay, this, "DoAmmoExplosion");
8586 }
8587
8589 {
8590 Magazine magazine = Magazine.Cast(this);
8591 int pop_sounds_count = 6;
8592 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8593
8594
8595 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8596 string sound_name = pop_sounds[ sound_idx ];
8598
8599
8600 magazine.ServerAddAmmoCount(-1);
8601
8602
8603 float min_temp_to_explode = 100;
8604
8605 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8606 {
8608 }
8609 }
8610
8611
8612 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8613 {
8614 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8615
8616 const int CHANCE_DAMAGE_CARGO = 4;
8617 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8618 const int CHANCE_DAMAGE_NOTHING = 2;
8619
8621 {
8622 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8623 int chances;
8624 int rnd;
8625
8626 if (GetInventory().GetCargo())
8627 {
8628 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8629 rnd = Math.RandomInt(0,chances);
8630
8631 if (rnd < CHANCE_DAMAGE_CARGO)
8632 {
8634 }
8635 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8636 {
8638 }
8639 }
8640 else
8641 {
8642 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8643 rnd = Math.RandomInt(0,chances);
8644
8645 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8646 {
8648 }
8649 }
8650 }
8651 }
8652
8654 {
8655 if (GetInventory().GetCargo())
8656 {
8657 int item_count = GetInventory().GetCargo().GetItemCount();
8658 if (item_count > 0)
8659 {
8660 int random_pick = Math.RandomInt(0, item_count);
8662 if (!item.IsExplosive())
8663 {
8664 item.AddHealth("","",damage);
8665 return true;
8666 }
8667 }
8668 }
8669 return false;
8670 }
8671
8673 {
8674 int attachment_count = GetInventory().AttachmentCount();
8675 if (attachment_count > 0)
8676 {
8677 int random_pick = Math.RandomInt(0, attachment_count);
8678 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8679 if (!attachment.IsExplosive())
8680 {
8681 attachment.AddHealth("","",damage);
8682 return true;
8683 }
8684 }
8685 return false;
8686 }
8687
8689 {
8691 }
8692
8694 {
8696 return GetInventory().CanRemoveEntity();
8697
8698 return false;
8699 }
8700
8702 {
8704 return;
8705
8707 {
8708 if (ScriptInputUserData.CanStoreInputUserData())
8709 {
8710 ScriptInputUserData ctx = new ScriptInputUserData;
8715 ctx.
Write(destination_entity);
8719 }
8720 }
8721 else if (!
GetGame().IsMultiplayer())
8722 {
8724 }
8725 }
8726
8728 {
8730 return;
8731
8732 float split_quantity_new;
8736 InventoryLocation loc = new InventoryLocation;
8737
8738 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8739 {
8741 split_quantity_new = stack_max;
8742 else
8744
8745 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8746 if (new_item)
8747 {
8748 new_item.SetResultOfSplit(true);
8749 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8751 new_item.SetQuantity(split_quantity_new);
8752 }
8753 }
8754 else if (destination_entity && slot_id == -1)
8755 {
8756 if (quantity > stack_max)
8757 split_quantity_new = stack_max;
8758 else
8759 split_quantity_new = quantity;
8760
8762 {
8765 }
8766
8767 if (new_item)
8768 {
8769 new_item.SetResultOfSplit(true);
8770 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8772 new_item.SetQuantity(split_quantity_new);
8773 }
8774 }
8775 else
8776 {
8777 if (stack_max != 0)
8778 {
8780 {
8782 }
8783
8784 if (split_quantity_new == 0)
8785 {
8786 if (!
GetGame().IsMultiplayer())
8787 player.PhysicalPredictiveDropItem(this);
8788 else
8789 player.ServerDropEntity(this);
8790 return;
8791 }
8792
8794
8795 if (new_item)
8796 {
8797 new_item.SetResultOfSplit(true);
8798 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8800 new_item.SetQuantity(stack_max);
8801 new_item.PlaceOnSurface();
8802 }
8803 }
8804 }
8805 }
8806
8808 {
8810 return;
8811
8812 float split_quantity_new;
8816 InventoryLocation loc = new InventoryLocation;
8817
8818 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8819 {
8821 split_quantity_new = stack_max;
8822 else
8824
8825 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8826 if (new_item)
8827 {
8828 new_item.SetResultOfSplit(true);
8829 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8831 new_item.SetQuantity(split_quantity_new);
8832 }
8833 }
8834 else if (destination_entity && slot_id == -1)
8835 {
8836 if (quantity > stack_max)
8837 split_quantity_new = stack_max;
8838 else
8839 split_quantity_new = quantity;
8840
8842 {
8845 }
8846
8847 if (new_item)
8848 {
8849 new_item.SetResultOfSplit(true);
8850 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8852 new_item.SetQuantity(split_quantity_new);
8853 }
8854 }
8855 else
8856 {
8857 if (stack_max != 0)
8858 {
8860 {
8862 }
8863
8865
8866 if (new_item)
8867 {
8868 new_item.SetResultOfSplit(true);
8869 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8871 new_item.SetQuantity(stack_max);
8872 new_item.PlaceOnSurface();
8873 }
8874 }
8875 }
8876 }
8877
8879 {
8881 return;
8882
8884 {
8885 if (ScriptInputUserData.CanStoreInputUserData())
8886 {
8887 ScriptInputUserData ctx = new ScriptInputUserData;
8892 dst.WriteToContext(ctx);
8894 }
8895 }
8896 else if (!
GetGame().IsMultiplayer())
8897 {
8899 }
8900 }
8901
8903 {
8905 return;
8906
8908 {
8909 if (ScriptInputUserData.CanStoreInputUserData())
8910 {
8911 ScriptInputUserData ctx = new ScriptInputUserData;
8916 ctx.
Write(destination_entity);
8922 }
8923 }
8924 else if (!
GetGame().IsMultiplayer())
8925 {
8927 }
8928 }
8929
8931 {
8933 }
8934
8936 {
8938 return this;
8939
8941 float split_quantity_new;
8943 if (dst.IsValid())
8944 {
8945 int slot_id = dst.GetSlot();
8947
8948 if (quantity > stack_max)
8949 split_quantity_new = stack_max;
8950 else
8951 split_quantity_new = quantity;
8952
8954
8955 if (new_item)
8956 {
8957 new_item.SetResultOfSplit(true);
8958 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8961 }
8962
8963 return new_item;
8964 }
8965
8966 return null;
8967 }
8968
8970 {
8972 return;
8973
8975 float split_quantity_new;
8977 if (destination_entity)
8978 {
8980 if (quantity > stackable)
8981 split_quantity_new = stackable;
8982 else
8983 split_quantity_new = quantity;
8984
8985 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
8986 if (new_item)
8987 {
8988 new_item.SetResultOfSplit(true);
8989 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8991 new_item.SetQuantity(split_quantity_new);
8992 }
8993 }
8994 }
8995
8997 {
8999 return;
9000
9002 {
9003 if (ScriptInputUserData.CanStoreInputUserData())
9004 {
9005 ScriptInputUserData ctx = new ScriptInputUserData;
9010 ItemBase destination_entity =
this;
9011 ctx.
Write(destination_entity);
9015 }
9016 }
9017 else if (!
GetGame().IsMultiplayer())
9018 {
9020 }
9021 }
9022
9024 {
9026 return;
9027
9029 float split_quantity_new;
9031 if (player)
9032 {
9034 if (quantity > stackable)
9035 split_quantity_new = stackable;
9036 else
9037 split_quantity_new = quantity;
9038
9039 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
9040 new_item =
ItemBase.Cast(in_hands);
9041 if (new_item)
9042 {
9043 new_item.SetResultOfSplit(true);
9044 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9046 new_item.SetQuantity(split_quantity_new);
9047 }
9048 }
9049 }
9050
9052 {
9054 return;
9055
9057 float split_quantity_new = Math.Floor(quantity * 0.5);
9058
9060
9061 if (new_item)
9062 {
9063 if (new_item.GetQuantityMax() < split_quantity_new)
9064 {
9065 split_quantity_new = new_item.GetQuantityMax();
9066 }
9067
9068 new_item.SetResultOfSplit(true);
9069 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9070
9072 {
9075 }
9076 else
9077 {
9080 }
9081 }
9082 }
9083
9085 {
9087 return;
9088
9090 float split_quantity_new = Math.Floor(quantity / 2);
9091
9092 InventoryLocation invloc = new InventoryLocation;
9094
9096 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9097
9098 if (new_item)
9099 {
9100 if (new_item.GetQuantityMax() < split_quantity_new)
9101 {
9102 split_quantity_new = new_item.GetQuantityMax();
9103 }
9105 {
9108 }
9109 else
9110 {
9113 }
9114 }
9115 }
9116
9119 {
9120 SetWeightDirty();
9122
9123 if (parent)
9124 parent.OnAttachmentQuantityChangedEx(this, delta);
9125
9127 {
9129 {
9131 }
9133 {
9134 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9136 }
9137 }
9138
9139 }
9140
9143 {
9144
9145 }
9146
9149 {
9151 }
9152
9154 {
9155 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9156
9158 {
9159 if (newLevel == GameConstants.STATE_RUINED)
9160 {
9162 EntityAI parent = GetHierarchyParent();
9163 if (parent && parent.IsFireplace())
9164 {
9165 CargoBase cargo = GetInventory().GetCargo();
9166 if (cargo)
9167 {
9169 {
9171 }
9172 }
9173 }
9174 }
9175
9177 {
9178
9180 return;
9181 }
9182
9183 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9184 {
9186 }
9187 }
9188 }
9189
9190
9192 {
9193 super.OnRightClick();
9194
9196 {
9198 {
9199 if (ScriptInputUserData.CanStoreInputUserData())
9200 {
9201 vector m4[4];
9203
9204 EntityAI root = GetHierarchyRoot();
9205
9206 InventoryLocation dst = new InventoryLocation;
9208 {
9209 if (root)
9210 {
9211 root.GetTransform(m4);
9213 }
9214 else
9215 GetInventory().GetCurrentInventoryLocation(dst);
9216 }
9217 else
9218 {
9220
9221
9222 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9223 {
9224 if (root)
9225 {
9226 root.GetTransform(m4);
9228 }
9229 else
9230 GetInventory().GetCurrentInventoryLocation(dst);
9231 }
9232 else
9233 {
9234 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9235 }
9236 }
9237
9238 ScriptInputUserData ctx = new ScriptInputUserData;
9246 }
9247 }
9248 else if (!
GetGame().IsMultiplayer())
9249 {
9251 }
9252 }
9253 }
9254
9255 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9256 {
9257
9258 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9259 return false;
9260
9261 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9262 return false;
9263
9264
9266 return false;
9267
9268
9269 Magazine mag = Magazine.Cast(this);
9270 if (mag)
9271 {
9272 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9273 return false;
9274
9275 if (stack_max_limit)
9276 {
9277 Magazine other_mag = Magazine.Cast(other_item);
9278 if (other_item)
9279 {
9280 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9281 return false;
9282 }
9283
9284 }
9285 }
9286 else
9287 {
9288
9290 return false;
9291
9293 return false;
9294 }
9295
9296 PlayerBase player = null;
9297 if (CastTo(player, GetHierarchyRootPlayer()))
9298 {
9299 if (player.GetInventory().HasAttachment(this))
9300 return false;
9301
9302 if (player.IsItemsToDelete())
9303 return false;
9304 }
9305
9306 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9307 return false;
9308
9309 int slotID;
9311 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9312 return false;
9313
9314 return true;
9315 }
9316
9318 {
9320 }
9321
9323 {
9324 return m_IsResultOfSplit;
9325 }
9326
9328 {
9329 m_IsResultOfSplit = value;
9330 }
9331
9333 {
9335 }
9336
9338 {
9339 float other_item_quantity = other_item.GetQuantity();
9340 float this_free_space;
9341
9343
9345
9346 if (other_item_quantity > this_free_space)
9347 {
9348 return this_free_space;
9349 }
9350 else
9351 {
9352 return other_item_quantity;
9353 }
9354 }
9355
9357 {
9359 }
9360
9362 {
9364 return;
9365
9366 if (!IsMagazine() && other_item)
9367 {
9369 if (quantity_used != 0)
9370 {
9371 float hp1 = GetHealth01("","");
9372 float hp2 = other_item.GetHealth01("","");
9373 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9374 hpResult = hpResult / (
GetQuantity() + quantity_used);
9375
9376 hpResult *= GetMaxHealth();
9377 Math.Round(hpResult);
9378 SetHealth("", "Health", hpResult);
9379
9381 other_item.AddQuantity(-quantity_used);
9382 }
9383 }
9385 }
9386
9388 {
9389 #ifdef SERVER
9390 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9391 GetHierarchyParent().IncreaseLifetimeUp();
9392 #endif
9393 };
9394
9396 {
9397 PlayerBase p = PlayerBase.Cast(player);
9398
9399 array<int> recipesIds = p.m_Recipes;
9400 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9401 if (moduleRecipesManager)
9402 {
9403 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9404 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9405 }
9406
9407 for (int i = 0;i < recipesIds.Count(); i++)
9408 {
9409 int key = recipesIds.Get(i);
9410 string recipeName = moduleRecipesManager.GetRecipeName(key);
9412 }
9413 }
9414
9415
9416 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9417 {
9418 super.GetDebugActions(outputList);
9419
9420
9425
9426
9430
9434
9435
9438
9439
9441 {
9444 }
9445
9447
9450
9454 }
9455
9456
9457
9458
9460 {
9461 super.OnAction(action_id, player, ctx);
9462 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9463 {
9464 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9465 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9466 PlayerBase p = PlayerBase.Cast(player);
9467 if (
EActions.RECIPES_RANGE_START < 1000)
9468 {
9469 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9470 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9471 }
9472 }
9473 #ifndef SERVER
9474 else if (action_id ==
EActions.WATCH_PLAYER)
9475 {
9476 PluginDeveloper.SetDeveloperItemClientEx(player);
9477 }
9478 #endif
9480 {
9481 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9482 {
9483 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9484 OnDebugButtonPressServer(id + 1);
9485 }
9486
9487 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9488 {
9489 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9491 }
9492
9493 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9494 {
9495 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9497 }
9498
9499 else if (action_id ==
EActions.ADD_QUANTITY)
9500 {
9501 if (IsMagazine())
9502 {
9503 Magazine mag = Magazine.Cast(this);
9504 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9505 }
9506 else
9507 {
9509 }
9510
9511 if (m_EM)
9512 {
9513 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9514 }
9515
9516 }
9517
9518 else if (action_id ==
EActions.REMOVE_QUANTITY)
9519 {
9520 if (IsMagazine())
9521 {
9522 Magazine mag2 = Magazine.Cast(this);
9523 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9524 }
9525 else
9526 {
9528 }
9529 if (m_EM)
9530 {
9531 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9532 }
9533
9534 }
9535
9536 else if (action_id ==
EActions.SET_QUANTITY_0)
9537 {
9539
9540 if (m_EM)
9541 {
9542 m_EM.SetEnergy(0);
9543 }
9544 }
9545
9546 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9547 {
9549
9550 if (m_EM)
9551 {
9552 m_EM.SetEnergy(m_EM.GetEnergyMax());
9553 }
9554 }
9555
9556 else if (action_id ==
EActions.ADD_HEALTH)
9557 {
9558 AddHealth("","",GetMaxHealth("","Health")/5);
9559 }
9560 else if (action_id ==
EActions.REMOVE_HEALTH)
9561 {
9562 AddHealth("","",-GetMaxHealth("","Health")/5);
9563 }
9564 else if (action_id ==
EActions.DESTROY_HEALTH)
9565 {
9566 SetHealth01("","",0);
9567 }
9568 else if (action_id ==
EActions.WATCH_ITEM)
9569 {
9571 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9572 #ifdef DEVELOPER
9573 SetDebugDeveloper_item(this);
9574 #endif
9575 }
9576
9577 else if (action_id ==
EActions.ADD_TEMPERATURE)
9578 {
9579 AddTemperature(20);
9580
9581 }
9582
9583 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9584 {
9585 AddTemperature(-20);
9586
9587 }
9588
9589 else if (action_id ==
EActions.FLIP_FROZEN)
9590 {
9591 SetFrozen(!GetIsFrozen());
9592
9593 }
9594
9595 else if (action_id ==
EActions.ADD_WETNESS)
9596 {
9598
9599 }
9600
9601 else if (action_id ==
EActions.REMOVE_WETNESS)
9602 {
9604
9605 }
9606
9607 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9608 {
9611
9612
9613 }
9614
9615 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9616 {
9619 }
9620
9621 else if (action_id ==
EActions.MAKE_SPECIAL)
9622 {
9623 auto debugParams = DebugSpawnParams.WithPlayer(player);
9624 OnDebugSpawnEx(debugParams);
9625 }
9626
9627 else if (action_id ==
EActions.DELETE)
9628 {
9629 Delete();
9630 }
9631
9632 }
9633
9634
9635 return false;
9636 }
9637
9638
9639
9640
9644
9647
9648
9649
9651 {
9652 return false;
9653 }
9654
9655
9657 {
9658 return true;
9659 }
9660
9661
9663 {
9664 return true;
9665 }
9666
9667
9668
9670 {
9671 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9673 }
9674
9677 {
9678 return null;
9679 }
9680
9682 {
9683 return false;
9684 }
9685
9687 {
9688 return false;
9689 }
9690
9694
9695
9697 {
9698 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9699 return module_repairing.CanRepair(this, item_repair_kit);
9700 }
9701
9702
9703 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9704 {
9705 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9706 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9707 }
9708
9709
9711 {
9712
9713
9714
9715
9716
9717
9718
9719
9720 return 1;
9721 }
9722
9723
9724
9726 {
9728 }
9729
9730
9731
9733 {
9735 }
9736
9737
9746 {
9747 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9748
9749 if (player)
9750 {
9751 player.MessageStatus(text);
9752 }
9753 }
9754
9755
9764 {
9765 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9766
9767 if (player)
9768 {
9769 player.MessageAction(text);
9770 }
9771 }
9772
9773
9782 {
9783 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9784
9785 if (player)
9786 {
9787 player.MessageFriendly(text);
9788 }
9789 }
9790
9791
9800 {
9801 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9802
9803 if (player)
9804 {
9805 player.MessageImportant(text);
9806 }
9807 }
9808
9810 {
9811 return true;
9812 }
9813
9814
9815 override bool KindOf(
string tag)
9816 {
9817 bool found = false;
9818 string item_name = this.
GetType();
9821
9822 int array_size = item_tag_array.Count();
9823 for (int i = 0; i < array_size; i++)
9824 {
9825 if (item_tag_array.Get(i) == tag)
9826 {
9827 found = true;
9828 break;
9829 }
9830 }
9831 return found;
9832 }
9833
9834
9836 {
9837
9838 super.OnRPC(sender, rpc_type,ctx);
9839
9840
9841 switch (rpc_type)
9842 {
9843 #ifndef SERVER
9844 case ERPCs.RPC_SOUND_LOCK_ATTACH:
9845 Param2<bool, string> p = new Param2<bool, string>(false, "");
9846
9848 return;
9849
9850 bool play = p.param1;
9851 string soundSet = p.param2;
9852
9853 if (play)
9854 {
9856 {
9858 {
9860 }
9861 }
9862 else
9863 {
9865 }
9866 }
9867 else
9868 {
9870 }
9871
9872 break;
9873 #endif
9874
9875 }
9876
9878 {
9880 }
9881 }
9882
9883
9884
9885
9887 {
9888 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9889 return plugin.GetID(
name);
9890 }
9891
9893 {
9894 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9895 return plugin.GetName(id);
9896 }
9897
9900 {
9901
9902
9903 int varFlags;
9904 if (!ctx.
Read(varFlags))
9905 return;
9906
9907 if (varFlags & ItemVariableFlags.FLOAT)
9908 {
9910 }
9911 }
9912
9914 {
9915
9916 super.SerializeNumericalVars(floats_out);
9917
9918
9919
9921 {
9923 }
9924
9926 {
9928 }
9929
9931 {
9933 }
9934
9936 {
9941 }
9942
9944 {
9946 }
9947 }
9948
9950 {
9951
9952 super.DeSerializeNumericalVars(floats);
9953
9954
9955 int index = 0;
9956 int mask = Math.Round(floats.Get(index));
9957
9958 index++;
9959
9961 {
9963 {
9965 }
9966 else
9967 {
9968 float quantity = floats.Get(index);
9970 }
9971 index++;
9972 }
9973
9975 {
9976 float wet = floats.Get(index);
9978 index++;
9979 }
9980
9982 {
9983 int liquidtype = Math.Round(floats.Get(index));
9985 index++;
9986 }
9987
9989 {
9991 index++;
9993 index++;
9995 index++;
9997 index++;
9998 }
9999
10001 {
10002 int cleanness = Math.Round(floats.Get(index));
10004 index++;
10005 }
10006 }
10007
10009 {
10010 super.WriteVarsToCTX(ctx);
10011
10012
10014 {
10016 }
10017
10019 {
10021 }
10022
10024 {
10026 }
10027
10029 {
10030 int r,g,b,a;
10036 }
10037
10039 {
10041 }
10042 }
10043
10045 {
10046 if (!super.ReadVarsFromCTX(ctx,version))
10047 return false;
10048
10049 int intValue;
10050 float value;
10051
10052 if (version < 140)
10053 {
10054 if (!ctx.
Read(intValue))
10055 return false;
10056
10057 m_VariablesMask = intValue;
10058 }
10059
10061 {
10062 if (!ctx.
Read(value))
10063 return false;
10064
10066 {
10068 }
10069 else
10070 {
10072 }
10073 }
10074
10075 if (version < 140)
10076 {
10078 {
10079 if (!ctx.
Read(value))
10080 return false;
10081 SetTemperatureDirect(value);
10082 }
10083 }
10084
10086 {
10087 if (!ctx.
Read(value))
10088 return false;
10090 }
10091
10093 {
10094 if (!ctx.
Read(intValue))
10095 return false;
10097 }
10098
10100 {
10101 int r,g,b,a;
10103 return false;
10105 return false;
10107 return false;
10109 return false;
10110
10112 }
10113
10115 {
10116 if (!ctx.
Read(intValue))
10117 return false;
10119 }
10120
10121 if (version >= 138 && version < 140)
10122 {
10124 {
10125 if (!ctx.
Read(intValue))
10126 return false;
10127 SetFrozen(intValue);
10128 }
10129 }
10130
10131 return true;
10132 }
10133
10134
10136 {
10139 {
10141 }
10142
10143 if (!super.OnStoreLoad(ctx, version))
10144 {
10146 return false;
10147 }
10148
10149 if (version >= 114)
10150 {
10151 bool hasQuickBarIndexSaved;
10152
10153 if (!ctx.
Read(hasQuickBarIndexSaved))
10154 {
10156 return false;
10157 }
10158
10159 if (hasQuickBarIndexSaved)
10160 {
10161 int itmQBIndex;
10162
10163
10164 if (!ctx.
Read(itmQBIndex))
10165 {
10167 return false;
10168 }
10169
10170 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10171 if (itmQBIndex != -1 && parentPlayer)
10172 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10173 }
10174 }
10175 else
10176 {
10177
10178 PlayerBase player;
10179 int itemQBIndex;
10180 if (version ==
int.
MAX)
10181 {
10182 if (!ctx.
Read(itemQBIndex))
10183 {
10185 return false;
10186 }
10187 }
10188 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10189 {
10190
10191 if (!ctx.
Read(itemQBIndex))
10192 {
10194 return false;
10195 }
10196 if (itemQBIndex != -1 && player)
10197 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10198 }
10199 }
10200
10201 if (version < 140)
10202 {
10203
10204 if (!LoadVariables(ctx, version))
10205 {
10207 return false;
10208 }
10209 }
10210
10211
10213 {
10215 return false;
10216 }
10217 if (version >= 132)
10218 {
10220 if (raib)
10221 {
10223 {
10225 return false;
10226 }
10227 }
10228 }
10229
10231 return true;
10232 }
10233
10234
10235
10237 {
10238 super.OnStoreSave(ctx);
10239
10240 PlayerBase player;
10241 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10242 {
10244
10245 int itemQBIndex = -1;
10246 itemQBIndex = player.FindQuickBarEntityIndex(this);
10247 ctx.
Write(itemQBIndex);
10248 }
10249 else
10250 {
10252 }
10253
10255
10257 if (raib)
10258 {
10260 }
10261 }
10262
10263
10265 {
10266 super.AfterStoreLoad();
10267
10269 {
10271 }
10272
10274 {
10277 }
10278 }
10279
10281 {
10282 super.EEOnAfterLoad();
10283
10285 {
10287 }
10288
10291 }
10292
10294 {
10295 return false;
10296 }
10297
10298
10299
10301 {
10303 {
10304 #ifdef PLATFORM_CONSOLE
10305
10307 {
10309 if (menu)
10310 {
10312 }
10313 }
10314 #endif
10315 }
10316
10318 {
10321 }
10322
10324 {
10325 SetWeightDirty();
10327 }
10329 {
10332 }
10333
10335 {
10338 }
10340 {
10343 }
10344
10345 super.OnVariablesSynchronized();
10346 }
10347
10348
10349
10351 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10352 {
10353 if (!IsServerCheck(allow_client))
10354 return false;
10355
10357 return false;
10358
10361
10362 if (value <= (min + 0.001))
10363 value = min;
10364
10365 if (value == min)
10366 {
10367 if (destroy_config)
10368 {
10369 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10370 if (dstr)
10371 {
10373 this.Delete();
10374 return true;
10375 }
10376 }
10377 else if (destroy_forced)
10378 {
10380 this.Delete();
10381 return true;
10382 }
10383
10385 }
10386
10389
10391 {
10393
10394 if (delta)
10396 }
10397
10399
10400 return false;
10401 }
10402
10403
10405 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10406 {
10408 }
10409
10411 {
10414 }
10415
10417 {
10420 }
10421
10424 {
10425 float value_clamped = Math.Clamp(value, 0, 1);
10427 SetQuantity(result, destroy_config, destroy_forced);
10428 }
10429
10430
10433 {
10435 }
10436
10438 {
10440 }
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10452 {
10453 int slot = -1;
10454 if (GetInventory())
10455 {
10456 InventoryLocation il = new InventoryLocation;
10457 GetInventory().GetCurrentInventoryLocation(il);
10459 }
10460
10462 }
10463
10465 {
10466 float quantity_max = 0;
10467
10469 {
10470 if (attSlotID != -1)
10471 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10472
10473 if (quantity_max <= 0)
10475 }
10476
10477 if (quantity_max <= 0)
10479
10480 return quantity_max;
10481 }
10482
10484 {
10486 }
10487
10489 {
10491 }
10492
10493
10495 {
10497 }
10498
10500 {
10502 }
10503
10505 {
10507 }
10508
10509
10511 {
10512
10513 float weightEx = GetWeightEx();
10514 float special = GetInventoryAndCargoWeight();
10515 return weightEx - special;
10516 }
10517
10518
10520 {
10522 }
10523
10525 {
10527 {
10528 #ifdef DEVELOPER
10529 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10530 {
10531 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10533 }
10534 #endif
10535
10536 return GetQuantity() * GetConfigWeightModified();
10537 }
10538 else if (HasEnergyManager())
10539 {
10540 #ifdef DEVELOPER
10541 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10542 {
10543 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10544 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10545 }
10546 #endif
10547 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10548 }
10549 else
10550 {
10551 #ifdef DEVELOPER
10552 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10553 {
10554 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10555 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10556 }
10557 #endif
10558 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10559 }
10560 }
10561
10564 {
10565 int item_count = 0;
10567
10568 if (GetInventory().GetCargo() != NULL)
10569 {
10570 item_count = GetInventory().GetCargo().GetItemCount();
10571 }
10572
10573 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10574 {
10575 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10576 if (item)
10577 item_count += item.GetNumberOfItems();
10578 }
10579 return item_count;
10580 }
10581
10584 {
10585 float weight = 0;
10586 float wetness = 1;
10587 if (include_wetness)
10590 {
10591 weight = wetness * m_ConfigWeight;
10592 }
10594 {
10595 weight = 1;
10596 }
10597 return weight;
10598 }
10599
10600
10601
10603 {
10604 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10605 {
10606 GameInventory inv = GetInventory();
10607 array<EntityAI> items = new array<EntityAI>;
10609 for (int i = 0; i < items.Count(); i++)
10610 {
10612 if (item)
10613 {
10615 }
10616 }
10617 }
10618 }
10619
10620
10621
10622
10624 {
10625 float energy = 0;
10626 if (HasEnergyManager())
10627 {
10628 energy = GetCompEM().GetEnergy();
10629 }
10630 return energy;
10631 }
10632
10633
10635 {
10636 super.OnEnergyConsumed();
10637
10639 }
10640
10642 {
10643 super.OnEnergyAdded();
10644
10646 }
10647
10648
10650 {
10651 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10652 {
10654 {
10655 float energy_0to1 = GetCompEM().GetEnergy0To1();
10657 }
10658 }
10659 }
10660
10661
10663 {
10664 return ConfigGetFloat("heatIsolation");
10665 }
10666
10668 {
10670 }
10671
10673 {
10674 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10675 if (
GetGame().ConfigIsExisting(paramPath))
10677
10678 return 0.0;
10679 }
10680
10682 {
10683 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10684 if (
GetGame().ConfigIsExisting(paramPath))
10686
10687 return 0.0;
10688 }
10689
10690 override void SetWet(
float value,
bool allow_client =
false)
10691 {
10692 if (!IsServerCheck(allow_client))
10693 return;
10694
10697
10699
10700 m_VarWet = Math.Clamp(value, min, max);
10701
10703 {
10706 }
10707 }
10708
10709 override void AddWet(
float value)
10710 {
10712 }
10713
10715 {
10717 }
10718
10720 {
10722 }
10723
10725 {
10727 }
10728
10730 {
10732 }
10733
10735 {
10737 }
10738
10739 override void OnWetChanged(
float newVal,
float oldVal)
10740 {
10743 if (newLevel != oldLevel)
10744 {
10746 }
10747 }
10748
10750 {
10751 SetWeightDirty();
10752 }
10753
10755 {
10756 return GetWetLevelInternal(
m_VarWet);
10757 }
10758
10759
10760
10762 {
10764 }
10765
10767 {
10769 }
10770
10772 {
10774 }
10775
10777 {
10779 }
10780
10781
10782
10784 {
10785 if (ConfigIsExisting("itemModelLength"))
10786 {
10787 return ConfigGetFloat("itemModelLength");
10788 }
10789 return 0;
10790 }
10791
10793 {
10794 if (ConfigIsExisting("itemAttachOffset"))
10795 {
10796 return ConfigGetFloat("itemAttachOffset");
10797 }
10798 return 0;
10799 }
10800
10801 override void SetCleanness(
int value,
bool allow_client =
false)
10802 {
10803 if (!IsServerCheck(allow_client))
10804 return;
10805
10807
10809
10812 }
10813
10815 {
10817 }
10818
10820 {
10821 return true;
10822 }
10823
10824
10825
10826
10828 {
10830 }
10831
10833 {
10835 }
10836
10837
10838
10839
10840 override void SetColor(
int r,
int g,
int b,
int a)
10841 {
10847 }
10849 override void GetColor(out
int r,out
int g,out
int b,out
int a)
10850 {
10855 }
10856
10858 {
10860 }
10861
10864 {
10865 int r,g,b,a;
10867 r = r/255;
10868 g = g/255;
10869 b = b/255;
10870 a = a/255;
10871 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10872 }
10873
10874
10875
10876 override void SetLiquidType(
int value,
bool allow_client =
false)
10877 {
10878 if (!IsServerCheck(allow_client))
10879 return;
10880
10885 }
10886
10888 {
10889 return ConfigGetInt("varLiquidTypeInit");
10890 }
10891
10893 {
10895 }
10896
10898 {
10900 SetFrozen(false);
10901 }
10902
10905 {
10906 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10907 }
10908
10909
10912 {
10913 PlayerBase nplayer;
10914 if (PlayerBase.CastTo(nplayer, player))
10915 {
10917
10918 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10919 }
10920 }
10921
10922
10925 {
10926 PlayerBase nplayer;
10927 if (PlayerBase.CastTo(nplayer,player))
10928 {
10929
10930 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10931
10932 }
10933
10934
10935 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10936
10937
10938 if (HasEnergyManager())
10939 {
10940 GetCompEM().UpdatePlugState();
10941 }
10942 }
10943
10944
10946 {
10947 super.OnPlacementStarted(player);
10948
10950 }
10951
10952 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
10953 {
10955 {
10956 m_AdminLog.OnPlacementComplete(player,
this);
10957 }
10958
10959 super.OnPlacementComplete(player, position, orientation);
10960 }
10961
10962
10963
10964
10965
10967 {
10969 {
10970 return true;
10971 }
10972 else
10973 {
10974 return false;
10975 }
10976 }
10977
10978
10980 {
10982 {
10984 }
10985 }
10986
10987
10989 {
10991 }
10992
10994 {
10996 }
10997
10998 override void InsertAgent(
int agent,
float count = 1)
10999 {
11000 if (count < 1)
11001 return;
11002
11004 }
11005
11008 {
11010 }
11011
11012
11014 {
11016 }
11017
11018
11019
11020
11021
11022
11023
11024
11025
11026
11027
11028
11029
11030
11031
11032
11033
11034
11035
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
11051
11052
11053
11054
11055
11056
11057
11058
11060 {
11062 return false;
11063 return true;
11064 }
11065
11067 {
11068
11070 }
11071
11072
11075 {
11076 super.CheckForRoofLimited(timeTresholdMS);
11077
11079 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11080 {
11081 m_PreviousRoofTestTime = time;
11082 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11083 }
11084 }
11085
11086
11088 {
11090 {
11091 return 0;
11092 }
11093
11094 if (GetInventory().GetAttachmentSlotsCount() != 0)
11095 {
11096 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
11097 if (filter)
11098 return filter.GetProtectionLevel(type, false, system);
11099 else
11100 return 0;
11101 }
11102
11103 string subclassPath, entryName;
11104
11105 switch (type)
11106 {
11108 entryName = "biological";
11109 break;
11111 entryName = "chemical";
11112 break;
11113 default:
11114 entryName = "biological";
11115 break;
11116 }
11117
11118 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11119
11121 }
11122
11123
11124
11127 {
11128 if (!IsMagazine())
11130
11132 }
11133
11134
11135
11136
11137
11142 {
11143 return true;
11144 }
11145
11147 {
11149 }
11150
11151
11152
11153
11154
11156 {
11157 if (parent)
11158 {
11159 if (parent.IsInherited(DayZInfected))
11160 return true;
11161
11162 if (!parent.IsRuined())
11163 return true;
11164 }
11165
11166 return true;
11167 }
11168
11170 {
11171 if (!super.CanPutAsAttachment(parent))
11172 {
11173 return false;
11174 }
11175
11176 if (!IsRuined() && !parent.IsRuined())
11177 {
11178 return true;
11179 }
11180
11181 return false;
11182 }
11183
11185 {
11186
11187
11188
11189
11190 return super.CanReceiveItemIntoCargo(item);
11191 }
11192
11194 {
11195
11196
11197
11198
11199 GameInventory attachmentInv = attachment.GetInventory();
11201 {
11202 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11203 return false;
11204 }
11205
11206 InventoryLocation loc = new InventoryLocation();
11207 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11208 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11209 return false;
11210
11211 return super.CanReceiveAttachment(attachment, slotId);
11212 }
11213
11215 {
11216 if (!super.CanReleaseAttachment(attachment))
11217 return false;
11218
11219 return GetInventory().AreChildrenAccessible();
11220 }
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11243 {
11244 int id = muzzle_owner.GetMuzzleID();
11245 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11246
11247 if (WPOF_array)
11248 {
11249 for (int i = 0; i < WPOF_array.Count(); i++)
11250 {
11251 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11252
11253 if (WPOF)
11254 {
11255 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11256 }
11257 }
11258 }
11259 }
11260
11261
11263 {
11264 int id = muzzle_owner.GetMuzzleID();
11266
11267 if (WPOBE_array)
11268 {
11269 for (int i = 0; i < WPOBE_array.Count(); i++)
11270 {
11271 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11272
11273 if (WPOBE)
11274 {
11275 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11276 }
11277 }
11278 }
11279 }
11280
11281
11283 {
11284 int id = muzzle_owner.GetMuzzleID();
11285 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11286
11287 if (WPOOH_array)
11288 {
11289 for (int i = 0; i < WPOOH_array.Count(); i++)
11290 {
11291 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11292
11293 if (WPOOH)
11294 {
11295 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11296 }
11297 }
11298 }
11299 }
11300
11301
11303 {
11304 int id = muzzle_owner.GetMuzzleID();
11305 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11306
11307 if (WPOOH_array)
11308 {
11309 for (int i = 0; i < WPOOH_array.Count(); i++)
11310 {
11311 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11312
11313 if (WPOOH)
11314 {
11315 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11316 }
11317 }
11318 }
11319 }
11320
11321
11323 {
11324 int id = muzzle_owner.GetMuzzleID();
11325 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11326
11327 if (WPOOH_array)
11328 {
11329 for (int i = 0; i < WPOOH_array.Count(); i++)
11330 {
11331 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11332
11333 if (WPOOH)
11334 {
11335 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11336 }
11337 }
11338 }
11339 }
11340
11341
11342
11344 {
11346 {
11347 return true;
11348 }
11349
11350 return false;
11351 }
11352
11354 {
11356 {
11357 return true;
11358 }
11359
11360 return false;
11361 }
11362
11364 {
11366 {
11367 return true;
11368 }
11369
11370 return false;
11371 }
11372
11374 {
11375 return false;
11376 }
11377
11380 {
11381 return UATimeSpent.DEFAULT_DEPLOY;
11382 }
11383
11384
11385
11386
11388 {
11390 SetSynchDirty();
11391 }
11392
11394 {
11396 }
11397
11398
11400 {
11401 return false;
11402 }
11403
11406 {
11407 string att_type = "None";
11408
11409 if (ConfigIsExisting("soundAttType"))
11410 {
11411 att_type = ConfigGetString("soundAttType");
11412 }
11413
11415 }
11416
11418 {
11420 }
11421
11422
11423
11424
11425
11429
11431 {
11434
11436 }
11437
11438
11440 {
11442 return;
11443
11445
11448
11451
11452 SoundParameters params = new SoundParameters();
11456 }
11457
11458
11460 {
11462 return;
11463
11465 SetSynchDirty();
11466
11469 }
11470
11471
11473 {
11475 return;
11476
11478 SetSynchDirty();
11479
11482 }
11483
11485 {
11487 }
11488
11490 {
11492 }
11493
11496 {
11497 if (!
GetGame().IsDedicatedServer())
11498 {
11499 if (ConfigIsExisting("attachSoundSet"))
11500 {
11501 string cfg_path = "";
11502 string soundset = "";
11503 string type_name =
GetType();
11504
11507 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11508 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11509
11510 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11511 {
11512 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11513 {
11514 if (cfg_slot_array[i] == slot_type)
11515 {
11516 soundset = cfg_soundset_array[i];
11517 break;
11518 }
11519 }
11520 }
11521
11522 if (soundset != "")
11523 {
11524 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11526 }
11527 }
11528 }
11529 }
11530
11532 {
11533
11534 }
11535
11536 void OnApply(PlayerBase player);
11537
11539 {
11540 return 1.0;
11541 };
11542
11544 {
11546 }
11547
11549 {
11551 }
11552
11554
11556 {
11557 SetDynamicPhysicsLifeTime(0.01);
11559 }
11560
11562 {
11563 array<string> zone_names = new array<string>;
11564 GetDamageZones(zone_names);
11565 for (int i = 0; i < zone_names.Count(); i++)
11566 {
11567 SetHealthMax(zone_names.Get(i),"Health");
11568 }
11569 SetHealthMax("","Health");
11570 }
11571
11574 {
11575 float global_health = GetHealth01("","Health");
11576 array<string> zones = new array<string>;
11577 GetDamageZones(zones);
11578
11579 for (int i = 0; i < zones.Count(); i++)
11580 {
11581 SetHealth01(zones.Get(i),"Health",global_health);
11582 }
11583 }
11584
11587 {
11588 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11589 }
11590
11592 {
11593 if (!hasRootAsPlayer)
11594 {
11595 if (refParentIB)
11596 {
11597
11598 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11599 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11600
11601 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11602 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11603
11606 }
11607 else
11608 {
11609
11612 }
11613 }
11614 }
11615
11617 {
11619 {
11620 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11621 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11622 {
11623 float heatPermCoef = 1.0;
11625 while (ent)
11626 {
11627 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11628 ent = ent.GetHierarchyParent();
11629 }
11630
11631 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11632 }
11633 }
11634 }
11635
11637 {
11638
11639 EntityAI parent = GetHierarchyParent();
11640 if (!parent)
11641 {
11642 hasParent = false;
11643 hasRootAsPlayer = false;
11644 }
11645 else
11646 {
11647 hasParent = true;
11648 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11649 refParentIB =
ItemBase.Cast(parent);
11650 }
11651 }
11652
11653 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11654 {
11655
11656 }
11657
11659 {
11660
11661 return false;
11662 }
11663
11665 {
11666
11667
11668 return false;
11669 }
11670
11672 {
11673
11674 return false;
11675 }
11676
11679 {
11680 return !GetIsFrozen() &&
IsOpen();
11681 }
11682
11684 {
11685 bool hasParent = false, hasRootAsPlayer = false;
11687
11688 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11689 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11690
11691 if (wwtu || foodDecay)
11692 {
11696
11697 if (processWetness || processTemperature || processDecay)
11698 {
11700
11701 if (processWetness)
11702 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11703
11704 if (processTemperature)
11706
11707 if (processDecay)
11708 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11709 }
11710 }
11711 }
11712
11715 {
11717 }
11718
11720 {
11723
11724 return super.GetTemperatureFreezeThreshold();
11725 }
11726
11728 {
11731
11732 return super.GetTemperatureThawThreshold();
11733 }
11734
11736 {
11739
11740 return super.GetItemOverheatThreshold();
11741 }
11742
11744 {
11746 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11747
11748 return super.GetTemperatureFreezeTime();
11749 }
11750
11752 {
11754 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11755
11756 return super.GetTemperatureThawTime();
11757 }
11758
11763
11765 {
11766 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11767 }
11768
11770 {
11771 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11772 }
11773
11776 {
11778 }
11779
11781 {
11783 }
11784
11786 {
11788 }
11789
11792 {
11793 return null;
11794 }
11795
11798 {
11799 return false;
11800 }
11801
11803 {
11805 {
11808 if (!trg)
11809 {
11811 explosive = this;
11812 }
11813
11814 explosive.PairRemote(trg);
11816
11817 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
11818 trg.SetPersistentPairID(persistentID);
11819 explosive.SetPersistentPairID(persistentID);
11820
11821 return true;
11822 }
11823 return false;
11824 }
11825
11828 {
11829 float ret = 1.0;
11832 ret *= GetHealth01();
11833
11834 return ret;
11835 }
11836
11837 #ifdef DEVELOPER
11838 override void SetDebugItem()
11839 {
11840 super.SetDebugItem();
11841 _itemBase = this;
11842 }
11843
11845 {
11846 string text = super.GetDebugText();
11847
11849 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
11850
11851 return text;
11852 }
11853 #endif
11854
11856 {
11857 return true;
11858 }
11859
11861
11863
11865 {
11868 }
11869
11870
11878
11894}
11895
11897{
11899 if (entity)
11900 {
11901 bool is_item = entity.IsInherited(
ItemBase);
11902 if (is_item && full_quantity)
11903 {
11906 }
11907 }
11908 else
11909 {
11911 return NULL;
11912 }
11913 return entity;
11914}
11915
11917{
11918 if (item)
11919 {
11920 if (health > 0)
11921 item.SetHealth("", "", health);
11922
11923 if (item.CanHaveTemperature())
11924 {
11926 if (item.CanFreeze())
11927 item.SetFrozen(false);
11928 }
11929
11930 if (item.HasEnergyManager())
11931 {
11932 if (quantity >= 0)
11933 {
11934 item.GetCompEM().SetEnergy0To1(quantity);
11935 }
11936 else
11937 {
11939 }
11940 }
11941 else if (item.IsMagazine())
11942 {
11943 Magazine mag = Magazine.Cast(item);
11944 if (quantity >= 0)
11945 {
11946 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11947 }
11948 else
11949 {
11951 }
11952
11953 }
11954 else
11955 {
11956 if (quantity >= 0)
11957 {
11958 item.SetQuantityNormalized(quantity, false);
11959 }
11960 else
11961 {
11963 }
11964
11965 }
11966 }
11967}
11968
11969#ifdef DEVELOPER
11971#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.