7020{
7022 {
7023 return true;
7024 }
7025};
7026
7027
7028
7030{
7034
7036
7039
7040
7041
7042
7043
7052
7058
7063
7068
7089 protected bool m_IsResultOfSplit
7090
7092
7097
7098
7099
7101
7105
7106
7107
7109
7112
7113
7114
7120
7121
7129
7132
7133
7135
7136
7138
7139
7144
7145
7150
7151
7153
7154
7156 {
7161
7162 if (!
GetGame().IsDedicatedServer())
7163 {
7165 {
7167
7169 {
7171 }
7172 }
7173
7176 }
7177
7178 m_OldLocation = null;
7179
7181 {
7183 }
7184
7185 if (ConfigIsExisting("headSelectionsToHide"))
7186 {
7189 }
7190
7192 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7193 {
7195 }
7196
7198
7199 m_IsResultOfSplit = false;
7200
7202 }
7203
7205 {
7206 super.InitItemVariables();
7207
7213 m_Count = ConfigGetInt(
"count");
7214
7217
7222
7225
7230
7242
7246
7247
7250 if (ConfigIsExisting("canBeSplit"))
7251 {
7254 }
7255
7257 if (ConfigIsExisting("itemBehaviour"))
7259
7260
7263 RegisterNetSyncVariableInt("m_VarLiquidType");
7264 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7265
7266 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7267 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7268 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7269
7270 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7271 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7272 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7273 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7274
7275 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7276 RegisterNetSyncVariableBool("m_IsTakeable");
7277 RegisterNetSyncVariableBool("m_IsHologram");
7278
7281 {
7284 }
7285
7287
7289 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7291
7292 }
7293
7295 {
7297 }
7298
7300 {
7303 {
7308 }
7309 }
7310
7311 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7312 {
7314 {
7317 }
7318
7320 }
7321
7323 {
7329 }
7330
7332
7334 {
7336
7337 if (!action)
7338 {
7339 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7340 return;
7341 }
7342
7344 if (!ai)
7345 {
7347 return;
7348 }
7349
7351 if (!action_array)
7352 {
7353 action_array = new array<ActionBase_Basic>;
7355 }
7356 if (LogManager.IsActionLogEnable())
7357 {
7358 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7359 }
7360
7361 if (action_array.Find(action) != -1)
7362 {
7363 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7364 }
7365 else
7366 {
7367 action_array.Insert(action);
7368 }
7369 }
7370
7372 {
7374 ActionBase action = player.GetActionManager().GetAction(actionName);
7377
7378 if (action_array)
7379 {
7380 action_array.RemoveItem(action);
7381 }
7382 }
7383
7384
7385
7387 {
7388 ActionOverrideData overrideData = new ActionOverrideData();
7392
7394 if (!actionMap)
7395 {
7398 }
7399
7400 actionMap.Insert(this.
Type(), overrideData);
7401
7402 }
7403
7405
7407
7408
7410 {
7413
7416
7417 string config_to_search = "CfgVehicles";
7418 string muzzle_owner_config;
7419
7421 {
7422 if (IsInherited(Weapon))
7423 config_to_search = "CfgWeapons";
7424
7425 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7426
7427 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7428
7430
7431 if (config_OnFire_subclass_count > 0)
7432 {
7433 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7434
7435 for (int i = 0; i < config_OnFire_subclass_count; i++)
7436 {
7437 string particle_class = "";
7439 string config_OnFire_entry = config_OnFire_class + particle_class;
7440 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7441 WPOF_array.Insert(WPOF);
7442 }
7443
7444
7446 }
7447 }
7448
7450 {
7451 config_to_search = "CfgWeapons";
7452 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7453
7454 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7455
7457
7458 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7459 {
7460 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7461
7462 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7463 {
7464 string particle_class2 = "";
7466 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7467 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7468 WPOBE_array.Insert(WPOBE);
7469 }
7470
7471
7473 }
7474 }
7475 }
7476
7477
7479 {
7482
7484 {
7485 string config_to_search = "CfgVehicles";
7486
7487 if (IsInherited(Weapon))
7488 config_to_search = "CfgWeapons";
7489
7490 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7491 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7492
7493 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7494 {
7495
7497
7499 {
7501 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7503 return;
7504 }
7505
7508
7509
7510
7512 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7513
7514 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7515 {
7516 string particle_class = "";
7518 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7520
7521 if (entry_type == CT_CLASS)
7522 {
7523 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7524 WPOOH_array.Insert(WPOF);
7525 }
7526 }
7527
7528
7530 }
7531 }
7532 }
7533
7535 {
7537 }
7538
7540 {
7542 {
7544
7547
7550
7551 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7552 }
7553 }
7554
7556 {
7558 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7559
7561 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7562
7564 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7565
7567 {
7569 }
7570 }
7571
7573 {
7575 }
7576
7578 {
7581 else
7583
7585 {
7588 }
7589 else
7590 {
7593
7596 }
7597
7599 }
7600
7602 {
7604 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7605 }
7606
7608 {
7610 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7612 }
7613
7615 {
7617 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7618 }
7619
7621 {
7624
7625 OverheatingParticle OP = new OverheatingParticle();
7630
7632 }
7633
7635 {
7638
7639 return -1;
7640 }
7641
7643 {
7645 {
7648
7649 for (int i = count; i > 0; --i)
7650 {
7651 int id = i - 1;
7654
7657
7658 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7659 {
7660 if (p)
7661 {
7664 }
7665 }
7666 }
7667 }
7668 }
7669
7671 {
7673 {
7675 {
7676 int id = i - 1;
7678
7679 if (OP)
7680 {
7682
7683 if (p)
7684 {
7686 }
7687
7688 delete OP;
7689 }
7690 }
7691
7694 }
7695 }
7696
7699 {
7700 return 0.0;
7701 }
7702
7703
7705 {
7706 return 250;
7707 }
7708
7710 {
7711 return 0;
7712 }
7713
7716 {
7718 return true;
7719
7720 return false;
7721 }
7722
7725 {
7728
7730 {
7732 }
7733 else
7734 {
7735
7737 }
7738
7740 }
7741
7748 {
7749 return -1;
7750 }
7751
7752
7753
7754
7756 {
7758 {
7760 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7761
7762 if (r_index >= 0)
7763 {
7764 InventoryLocation r_il = new InventoryLocation;
7765 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7766
7767 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7770 {
7771 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7772 }
7774 {
7775 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7776 }
7777
7778 }
7779
7780 player.GetHumanInventory().ClearUserReservedLocation(this);
7781 }
7782
7785 }
7786
7787
7788
7789
7791 {
7792 return ItemBase.m_DebugActionsMask;
7793 }
7794
7796 {
7797 return ItemBase.m_DebugActionsMask & mask;
7798 }
7799
7801 {
7802 ItemBase.m_DebugActionsMask = mask;
7803 }
7804
7806 {
7807 ItemBase.m_DebugActionsMask |= mask;
7808 }
7809
7811 {
7812 ItemBase.m_DebugActionsMask &= ~mask;
7813 }
7814
7816 {
7818 {
7820 }
7821 else
7822 {
7824 }
7825 }
7826
7827
7829 {
7830 if (GetEconomyProfile())
7831 {
7832 float q_max = GetEconomyProfile().GetQuantityMax();
7833 if (q_max > 0)
7834 {
7835 float q_min = GetEconomyProfile().GetQuantityMin();
7836 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7837
7839 {
7840 ComponentEnergyManager comp = GetCompEM();
7842 {
7844 }
7845 }
7847 {
7849
7850 }
7851
7852 }
7853 }
7854 }
7855
7858 {
7859 EntityAI parent = GetHierarchyParent();
7860
7861 if (parent)
7862 {
7863 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7864 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7865 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
7866 }
7867 }
7868
7871 {
7872 EntityAI parent = GetHierarchyParent();
7873
7874 if (parent)
7875 {
7876 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7877 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7878 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
7879 }
7880 }
7881
7883 {
7884
7885
7886
7887
7889
7891 {
7892 if (ScriptInputUserData.CanStoreInputUserData())
7893 {
7894 ScriptInputUserData ctx = new ScriptInputUserData;
7900 ctx.
Write(use_stack_max);
7903
7905 {
7906 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
7907 }
7908 }
7909 }
7910 else if (!
GetGame().IsMultiplayer())
7911 {
7913 }
7914 }
7915
7917 {
7919 }
7920
7922 {
7924 }
7925
7927 {
7929 }
7930
7932 {
7933
7934 return false;
7935 }
7936
7938 {
7939 return false;
7940 }
7941
7945 {
7946 return false;
7947 }
7948
7950 {
7951 return "";
7952 }
7953
7955
7957 {
7958 return false;
7959 }
7960
7962 {
7963 return true;
7964 }
7965
7966
7967
7969 {
7970 return true;
7971 }
7972
7974 {
7975 return true;
7976 }
7977
7979 {
7980 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7982 }
7983
7985 {
7987 }
7988
7990 {
7992 if (!is_being_placed)
7994 SetSynchDirty();
7995 }
7996
7997
7999
8001 {
8003 }
8004
8006 {
8008 }
8009
8011 {
8012 return 1;
8013 }
8014
8016 {
8017 return false;
8018 }
8019
8021 {
8023 SetSynchDirty();
8024 }
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8061 {
8062 super.OnMovedInsideCargo(container);
8063
8064 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8065 }
8066
8067 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8068 {
8069 super.EEItemLocationChanged(oldLoc,newLoc);
8070
8071 PlayerBase new_player = null;
8072 PlayerBase old_player = null;
8073
8074 if (newLoc.GetParent())
8075 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8076
8077 if (oldLoc.GetParent())
8078 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8079
8081 {
8082 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8083
8084 if (r_index >= 0)
8085 {
8086 InventoryLocation r_il = new InventoryLocation;
8087 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8088
8089 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8092 {
8093 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8094 }
8096 {
8097 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8098 }
8099
8100 }
8101 }
8102
8104 {
8105 if (new_player)
8106 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8107
8108 if (new_player == old_player)
8109 {
8110
8111 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8112 {
8114 {
8115 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8116 {
8117 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8118 }
8119 }
8120 else
8121 {
8122 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8123 }
8124 }
8125
8126 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8127 {
8128 int type = oldLoc.GetType();
8130 {
8131 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8132 }
8134 {
8135 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8136 }
8137 }
8138 if (!m_OldLocation)
8139 {
8140 m_OldLocation = new InventoryLocation;
8141 }
8142 m_OldLocation.Copy(oldLoc);
8143 }
8144 else
8145 {
8146 if (m_OldLocation)
8147 {
8148 m_OldLocation.Reset();
8149 }
8150 }
8151
8153 }
8154 else
8155 {
8156 if (new_player)
8157 {
8158 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8159 if (res_index >= 0)
8160 {
8161 InventoryLocation il = new InventoryLocation;
8162 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8164 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8167 {
8168 il.
GetParent().GetOnReleaseLock().Invoke(it);
8169 }
8171 {
8173 }
8174
8175 }
8176 }
8178 {
8179
8181 }
8182
8183 if (m_OldLocation)
8184 {
8185 m_OldLocation.Reset();
8186 }
8187 }
8188 }
8189
8190 override void EOnContact(IEntity other, Contact extra)
8191 {
8193 {
8194 int liquidType = -1;
8196 if (impactSpeed > 0.0)
8197 {
8199 #ifndef SERVER
8201 #else
8203 SetSynchDirty();
8204 #endif
8206 }
8207 }
8208
8209 #ifdef SERVER
8210 if (GetCompEM() && GetCompEM().IsPlugged())
8211 {
8212 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8213 GetCompEM().UnplugThis();
8214 }
8215 #endif
8216 }
8217
8219
8221 {
8223 }
8224
8226 {
8227
8228 }
8229
8231 {
8232 super.OnItemLocationChanged(old_owner, new_owner);
8233
8234 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8235 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8236
8237 if (!relatedPlayer && playerNew)
8238 relatedPlayer = playerNew;
8239
8240 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8241 {
8243 if (actionMgr)
8244 {
8245 ActionBase currentAction = actionMgr.GetRunningAction();
8246 if (currentAction)
8248 }
8249 }
8250
8251 Man ownerPlayerOld = null;
8252 Man ownerPlayerNew = null;
8253
8254 if (old_owner)
8255 {
8256 if (old_owner.
IsMan())
8257 {
8258 ownerPlayerOld = Man.Cast(old_owner);
8259 }
8260 else
8261 {
8262 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8263 }
8264 }
8265 else
8266 {
8268 {
8270
8271 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8272 {
8273 GetCompEM().UnplugThis();
8274 }
8275 }
8276 }
8277
8278 if (new_owner)
8279 {
8280 if (new_owner.
IsMan())
8281 {
8282 ownerPlayerNew = Man.Cast(new_owner);
8283 }
8284 else
8285 {
8286 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8287 }
8288 }
8289
8290 if (ownerPlayerOld != ownerPlayerNew)
8291 {
8292 if (ownerPlayerOld)
8293 {
8294 array<EntityAI> subItemsExit = new array<EntityAI>;
8296 for (int i = 0; i < subItemsExit.Count(); i++)
8297 {
8300 }
8301 }
8302
8303 if (ownerPlayerNew)
8304 {
8305 array<EntityAI> subItemsEnter = new array<EntityAI>;
8307 for (int j = 0; j < subItemsEnter.Count(); j++)
8308 {
8311 }
8312 }
8313 }
8314 else if (ownerPlayerNew != null)
8315 {
8316 PlayerBase nplayer;
8317 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8318 {
8319 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8321 for (int k = 0; k < subItemsUpdate.Count(); k++)
8322 {
8324 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8325 }
8326 }
8327 }
8328
8329 if (old_owner)
8330 old_owner.OnChildItemRemoved(this);
8331 if (new_owner)
8332 new_owner.OnChildItemReceived(this);
8333 }
8334
8335
8337 {
8338 super.EEDelete(parent);
8339 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8340 if (player)
8341 {
8343
8344 if (player.IsAlive())
8345 {
8346 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8347 if (r_index >= 0)
8348 {
8349 InventoryLocation r_il = new InventoryLocation;
8350 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8351
8352 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8355 {
8356 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8357 }
8359 {
8360 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8361 }
8362
8363 }
8364
8365 player.RemoveQuickBarEntityShortcut(this);
8366 }
8367 }
8368 }
8369
8371 {
8372 super.EEKilled(killer);
8373
8376 {
8377 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8378 {
8379 if (IsMagazine())
8380 {
8381 if (Magazine.Cast(this).GetAmmoCount() > 0)
8382 {
8384 }
8385 }
8386 else
8387 {
8389 }
8390 }
8391 }
8392 }
8393
8395 {
8396 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8397
8398 super.OnWasAttached(parent, slot_id);
8399
8402
8404 }
8405
8407 {
8408 super.OnWasDetached(parent, slot_id);
8409
8412 }
8413
8415 {
8416 int idx;
8419
8420 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8421 if (inventory_slots.Count() < 1)
8422 {
8423 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8424 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8425 }
8426 else
8427 {
8428 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8429 }
8430
8431 idx = inventory_slots.Find(slot);
8432 if (idx < 0)
8433 return "";
8434
8435 return attach_types.Get(idx);
8436 }
8437
8439 {
8440 int idx = -1;
8441 string slot;
8442
8445
8446 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8447 if (inventory_slots.Count() < 1)
8448 {
8449 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8450 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8451 }
8452 else
8453 {
8454 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8455 if (detach_types.Count() < 1)
8456 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8457 }
8458
8459 for (int i = 0; i < inventory_slots.Count(); i++)
8460 {
8461 slot = inventory_slots.Get(i);
8462 }
8463
8464 if (slot != "")
8465 {
8466 if (detach_types.Count() == 1)
8467 idx = 0;
8468 else
8469 idx = inventory_slots.Find(slot);
8470 }
8471 if (idx < 0)
8472 return "";
8473
8474 return detach_types.Get(idx);
8475 }
8476
8478 {
8479
8481
8482
8483 float min_time = 1;
8484 float max_time = 3;
8485 float delay = Math.RandomFloat(min_time, max_time);
8486
8487 explode_timer.Run(delay, this, "DoAmmoExplosion");
8488 }
8489
8491 {
8492 Magazine magazine = Magazine.Cast(this);
8493 int pop_sounds_count = 6;
8494 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8495
8496
8497 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8498 string sound_name = pop_sounds[ sound_idx ];
8500
8501
8502 magazine.ServerAddAmmoCount(-1);
8503
8504
8505 float min_temp_to_explode = 100;
8506
8507 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8508 {
8510 }
8511 }
8512
8513
8514 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8515 {
8516 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8517
8518 const int CHANCE_DAMAGE_CARGO = 4;
8519 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8520 const int CHANCE_DAMAGE_NOTHING = 2;
8521
8523 {
8524 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8525 int chances;
8526 int rnd;
8527
8528 if (GetInventory().GetCargo())
8529 {
8530 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8531 rnd = Math.RandomInt(0,chances);
8532
8533 if (rnd < CHANCE_DAMAGE_CARGO)
8534 {
8536 }
8537 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8538 {
8540 }
8541 }
8542 else
8543 {
8544 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8545 rnd = Math.RandomInt(0,chances);
8546
8547 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8548 {
8550 }
8551 }
8552 }
8553 }
8554
8556 {
8557 if (GetInventory().GetCargo())
8558 {
8559 int item_count = GetInventory().GetCargo().GetItemCount();
8560 if (item_count > 0)
8561 {
8562 int random_pick = Math.RandomInt(0, item_count);
8564 if (!item.IsExplosive())
8565 {
8566 item.AddHealth("","",damage);
8567 return true;
8568 }
8569 }
8570 }
8571 return false;
8572 }
8573
8575 {
8576 int attachment_count = GetInventory().AttachmentCount();
8577 if (attachment_count > 0)
8578 {
8579 int random_pick = Math.RandomInt(0, attachment_count);
8580 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8581 if (!attachment.IsExplosive())
8582 {
8583 attachment.AddHealth("","",damage);
8584 return true;
8585 }
8586 }
8587 return false;
8588 }
8589
8591 {
8593 }
8594
8596 {
8598 return GetInventory().CanRemoveEntity();
8599
8600 return false;
8601 }
8602
8604 {
8606 return;
8607
8609 {
8610 if (ScriptInputUserData.CanStoreInputUserData())
8611 {
8612 ScriptInputUserData ctx = new ScriptInputUserData;
8617 ctx.
Write(destination_entity);
8621 }
8622 }
8623 else if (!
GetGame().IsMultiplayer())
8624 {
8626 }
8627 }
8628
8630 {
8632 return;
8633
8634 float split_quantity_new;
8638 InventoryLocation loc = new InventoryLocation;
8639
8640 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8641 {
8643 split_quantity_new = stack_max;
8644 else
8646
8647 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8648 if (new_item)
8649 {
8650 new_item.SetResultOfSplit(true);
8651 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8653 new_item.SetQuantity(split_quantity_new);
8654 }
8655 }
8656 else if (destination_entity && slot_id == -1)
8657 {
8658 if (quantity > stack_max)
8659 split_quantity_new = stack_max;
8660 else
8661 split_quantity_new = quantity;
8662
8664 {
8667 }
8668
8669 if (new_item)
8670 {
8671 new_item.SetResultOfSplit(true);
8672 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8674 new_item.SetQuantity(split_quantity_new);
8675 }
8676 }
8677 else
8678 {
8679 if (stack_max != 0)
8680 {
8682 {
8684 }
8685
8686 if (split_quantity_new == 0)
8687 {
8688 if (!
GetGame().IsMultiplayer())
8689 player.PhysicalPredictiveDropItem(this);
8690 else
8691 player.ServerDropEntity(this);
8692 return;
8693 }
8694
8696
8697 if (new_item)
8698 {
8699 new_item.SetResultOfSplit(true);
8700 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8702 new_item.SetQuantity(stack_max);
8703 new_item.PlaceOnSurface();
8704 }
8705 }
8706 }
8707 }
8708
8710 {
8712 return;
8713
8714 float split_quantity_new;
8718 InventoryLocation loc = new InventoryLocation;
8719
8720 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8721 {
8723 split_quantity_new = stack_max;
8724 else
8726
8727 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8728 if (new_item)
8729 {
8730 new_item.SetResultOfSplit(true);
8731 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8733 new_item.SetQuantity(split_quantity_new);
8734 }
8735 }
8736 else if (destination_entity && slot_id == -1)
8737 {
8738 if (quantity > stack_max)
8739 split_quantity_new = stack_max;
8740 else
8741 split_quantity_new = quantity;
8742
8744 {
8747 }
8748
8749 if (new_item)
8750 {
8751 new_item.SetResultOfSplit(true);
8752 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8754 new_item.SetQuantity(split_quantity_new);
8755 }
8756 }
8757 else
8758 {
8759 if (stack_max != 0)
8760 {
8762 {
8764 }
8765
8767
8768 if (new_item)
8769 {
8770 new_item.SetResultOfSplit(true);
8771 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8773 new_item.SetQuantity(stack_max);
8774 new_item.PlaceOnSurface();
8775 }
8776 }
8777 }
8778 }
8779
8781 {
8783 return;
8784
8786 {
8787 if (ScriptInputUserData.CanStoreInputUserData())
8788 {
8789 ScriptInputUserData ctx = new ScriptInputUserData;
8794 dst.WriteToContext(ctx);
8796 }
8797 }
8798 else if (!
GetGame().IsMultiplayer())
8799 {
8801 }
8802 }
8803
8805 {
8807 return;
8808
8810 {
8811 if (ScriptInputUserData.CanStoreInputUserData())
8812 {
8813 ScriptInputUserData ctx = new ScriptInputUserData;
8818 ctx.
Write(destination_entity);
8824 }
8825 }
8826 else if (!
GetGame().IsMultiplayer())
8827 {
8829 }
8830 }
8831
8833 {
8835 }
8836
8838 {
8840 return this;
8841
8843 float split_quantity_new;
8845 if (dst.IsValid())
8846 {
8847 int slot_id = dst.GetSlot();
8849
8850 if (quantity > stack_max)
8851 split_quantity_new = stack_max;
8852 else
8853 split_quantity_new = quantity;
8854
8856
8857 if (new_item)
8858 {
8859 new_item.SetResultOfSplit(true);
8860 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8863 }
8864
8865 return new_item;
8866 }
8867
8868 return null;
8869 }
8870
8872 {
8874 return;
8875
8877 float split_quantity_new;
8879 if (destination_entity)
8880 {
8882 if (quantity > stackable)
8883 split_quantity_new = stackable;
8884 else
8885 split_quantity_new = quantity;
8886
8887 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
8888 if (new_item)
8889 {
8890 new_item.SetResultOfSplit(true);
8891 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8893 new_item.SetQuantity(split_quantity_new);
8894 }
8895 }
8896 }
8897
8899 {
8901 return;
8902
8904 {
8905 if (ScriptInputUserData.CanStoreInputUserData())
8906 {
8907 ScriptInputUserData ctx = new ScriptInputUserData;
8912 ItemBase destination_entity =
this;
8913 ctx.
Write(destination_entity);
8917 }
8918 }
8919 else if (!
GetGame().IsMultiplayer())
8920 {
8922 }
8923 }
8924
8926 {
8928 return;
8929
8931 float split_quantity_new;
8933 if (player)
8934 {
8936 if (quantity > stackable)
8937 split_quantity_new = stackable;
8938 else
8939 split_quantity_new = quantity;
8940
8941 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
8942 new_item =
ItemBase.Cast(in_hands);
8943 if (new_item)
8944 {
8945 new_item.SetResultOfSplit(true);
8946 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8948 new_item.SetQuantity(split_quantity_new);
8949 }
8950 }
8951 }
8952
8954 {
8956 return;
8957
8959 float split_quantity_new = Math.Floor(quantity * 0.5);
8960
8962
8963 if (new_item)
8964 {
8965 if (new_item.GetQuantityMax() < split_quantity_new)
8966 {
8967 split_quantity_new = new_item.GetQuantityMax();
8968 }
8969
8970 new_item.SetResultOfSplit(true);
8971 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8972
8974 {
8977 }
8978 else
8979 {
8982 }
8983 }
8984 }
8985
8987 {
8989 return;
8990
8992 float split_quantity_new = Math.Floor(quantity / 2);
8993
8994 InventoryLocation invloc = new InventoryLocation;
8996
8998 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
8999
9000 if (new_item)
9001 {
9002 if (new_item.GetQuantityMax() < split_quantity_new)
9003 {
9004 split_quantity_new = new_item.GetQuantityMax();
9005 }
9007 {
9010 }
9011 else
9012 {
9015 }
9016 }
9017 }
9018
9021 {
9022 SetWeightDirty();
9024
9025 if (parent)
9026 parent.OnAttachmentQuantityChangedEx(this, delta);
9027
9029 {
9031 {
9033 }
9035 {
9036 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9038 }
9039 }
9040
9041 }
9042
9045 {
9046
9047 }
9048
9051 {
9053 }
9054
9056 {
9057 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9058
9060 {
9061 if (newLevel == GameConstants.STATE_RUINED)
9062 {
9064 EntityAI parent = GetHierarchyParent();
9065 if (parent && parent.IsFireplace())
9066 {
9067 CargoBase cargo = GetInventory().GetCargo();
9068 if (cargo)
9069 {
9071 {
9073 }
9074 }
9075 }
9076 }
9077
9079 {
9080
9082 return;
9083 }
9084
9085 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9086 {
9088 }
9089 }
9090 }
9091
9092
9094 {
9095 super.OnRightClick();
9096
9098 {
9100 {
9101 if (ScriptInputUserData.CanStoreInputUserData())
9102 {
9103 vector m4[4];
9105
9106 EntityAI root = GetHierarchyRoot();
9107
9108 InventoryLocation dst = new InventoryLocation;
9110 {
9111 if (root)
9112 {
9113 root.GetTransform(m4);
9115 }
9116 else
9117 GetInventory().GetCurrentInventoryLocation(dst);
9118 }
9119 else
9120 {
9122
9123
9124 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9125 {
9126 if (root)
9127 {
9128 root.GetTransform(m4);
9130 }
9131 else
9132 GetInventory().GetCurrentInventoryLocation(dst);
9133 }
9134 else
9135 {
9136 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9137 }
9138 }
9139
9140 ScriptInputUserData ctx = new ScriptInputUserData;
9148 }
9149 }
9150 else if (!
GetGame().IsMultiplayer())
9151 {
9153 }
9154 }
9155 }
9156
9157 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9158 {
9159
9160 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9161 return false;
9162
9163 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9164 return false;
9165
9166
9168 return false;
9169
9170
9171 Magazine mag = Magazine.Cast(this);
9172 if (mag)
9173 {
9174 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9175 return false;
9176
9177 if (stack_max_limit)
9178 {
9179 Magazine other_mag = Magazine.Cast(other_item);
9180 if (other_item)
9181 {
9182 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9183 return false;
9184 }
9185
9186 }
9187 }
9188 else
9189 {
9190
9192 return false;
9193
9195 return false;
9196 }
9197
9198 PlayerBase player = null;
9199 if (CastTo(player, GetHierarchyRootPlayer()))
9200 {
9201 if (player.GetInventory().HasAttachment(this))
9202 return false;
9203
9204 if (player.IsItemsToDelete())
9205 return false;
9206 }
9207
9208 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9209 return false;
9210
9211 int slotID;
9213 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9214 return false;
9215
9216 return true;
9217 }
9218
9220 {
9222 }
9223
9225 {
9226 return m_IsResultOfSplit;
9227 }
9228
9230 {
9231 m_IsResultOfSplit = value;
9232 }
9233
9235 {
9237 }
9238
9240 {
9241 float other_item_quantity = other_item.GetQuantity();
9242 float this_free_space;
9243
9245
9247
9248 if (other_item_quantity > this_free_space)
9249 {
9250 return this_free_space;
9251 }
9252 else
9253 {
9254 return other_item_quantity;
9255 }
9256 }
9257
9259 {
9261 }
9262
9264 {
9266 return;
9267
9268 if (!IsMagazine() && other_item)
9269 {
9271 if (quantity_used != 0)
9272 {
9273 float hp1 = GetHealth01("","");
9274 float hp2 = other_item.GetHealth01("","");
9275 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9276 hpResult = hpResult / (
GetQuantity() + quantity_used);
9277
9278 hpResult *= GetMaxHealth();
9279 Math.Round(hpResult);
9280 SetHealth("", "Health", hpResult);
9281
9283 other_item.AddQuantity(-quantity_used);
9284 }
9285 }
9287 }
9288
9290 {
9291 #ifdef SERVER
9292 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9293 GetHierarchyParent().IncreaseLifetimeUp();
9294 #endif
9295 };
9296
9298 {
9299 PlayerBase p = PlayerBase.Cast(player);
9300
9301 array<int> recipesIds = p.m_Recipes;
9302 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9303 if (moduleRecipesManager)
9304 {
9305 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9306 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9307 }
9308
9309 for (int i = 0;i < recipesIds.Count(); i++)
9310 {
9311 int key = recipesIds.Get(i);
9312 string recipeName = moduleRecipesManager.GetRecipeName(key);
9314 }
9315 }
9316
9317
9318 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9319 {
9320 super.GetDebugActions(outputList);
9321
9322
9327
9328
9332
9336
9337
9340
9341
9343 {
9346 }
9347
9349
9352
9356 }
9357
9358
9359
9360
9362 {
9363 super.OnAction(action_id, player, ctx);
9364 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9365 {
9366 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9367 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9368 PlayerBase p = PlayerBase.Cast(player);
9369 if (
EActions.RECIPES_RANGE_START < 1000)
9370 {
9371 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9372 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9373 }
9374 }
9375 #ifndef SERVER
9376 else if (action_id ==
EActions.WATCH_PLAYER)
9377 {
9378 PluginDeveloper.SetDeveloperItemClientEx(player);
9379 }
9380 #endif
9382 {
9383 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9384 {
9385 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9386 OnDebugButtonPressServer(id + 1);
9387 }
9388
9389 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9390 {
9391 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9393 }
9394
9395 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9396 {
9397 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9399 }
9400
9401 else if (action_id ==
EActions.ADD_QUANTITY)
9402 {
9403 if (IsMagazine())
9404 {
9405 Magazine mag = Magazine.Cast(this);
9406 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9407 }
9408 else
9409 {
9411 }
9412
9413 if (m_EM)
9414 {
9415 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9416 }
9417
9418 }
9419
9420 else if (action_id ==
EActions.REMOVE_QUANTITY)
9421 {
9422 if (IsMagazine())
9423 {
9424 Magazine mag2 = Magazine.Cast(this);
9425 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9426 }
9427 else
9428 {
9430 }
9431 if (m_EM)
9432 {
9433 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9434 }
9435
9436 }
9437
9438 else if (action_id ==
EActions.SET_QUANTITY_0)
9439 {
9441
9442 if (m_EM)
9443 {
9444 m_EM.SetEnergy(0);
9445 }
9446 }
9447
9448 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9449 {
9451
9452 if (m_EM)
9453 {
9454 m_EM.SetEnergy(m_EM.GetEnergyMax());
9455 }
9456 }
9457
9458 else if (action_id ==
EActions.ADD_HEALTH)
9459 {
9460 AddHealth("","",GetMaxHealth("","Health")/5);
9461 }
9462 else if (action_id ==
EActions.REMOVE_HEALTH)
9463 {
9464 AddHealth("","",-GetMaxHealth("","Health")/5);
9465 }
9466 else if (action_id ==
EActions.DESTROY_HEALTH)
9467 {
9468 SetHealth01("","",0);
9469 }
9470 else if (action_id ==
EActions.WATCH_ITEM)
9471 {
9473 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9474 #ifdef DEVELOPER
9475 SetDebugDeveloper_item(this);
9476 #endif
9477 }
9478
9479 else if (action_id ==
EActions.ADD_TEMPERATURE)
9480 {
9481 AddTemperature(20);
9482
9483 }
9484
9485 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9486 {
9487 AddTemperature(-20);
9488
9489 }
9490
9491 else if (action_id ==
EActions.FLIP_FROZEN)
9492 {
9493 SetFrozen(!GetIsFrozen());
9494
9495 }
9496
9497 else if (action_id ==
EActions.ADD_WETNESS)
9498 {
9500
9501 }
9502
9503 else if (action_id ==
EActions.REMOVE_WETNESS)
9504 {
9506
9507 }
9508
9509 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9510 {
9513
9514
9515 }
9516
9517 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9518 {
9521 }
9522
9523 else if (action_id ==
EActions.MAKE_SPECIAL)
9524 {
9525 auto debugParams = DebugSpawnParams.WithPlayer(player);
9526 OnDebugSpawnEx(debugParams);
9527 }
9528
9529 else if (action_id ==
EActions.DELETE)
9530 {
9531 Delete();
9532 }
9533
9534 }
9535
9536
9537 return false;
9538 }
9539
9540
9541
9542
9546
9549
9550
9551
9553 {
9554 return false;
9555 }
9556
9557
9559 {
9560 return true;
9561 }
9562
9563
9565 {
9566 return true;
9567 }
9568
9569
9570
9572 {
9573 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9575 }
9576
9579 {
9580 return null;
9581 }
9582
9584 {
9585 return false;
9586 }
9587
9589 {
9590 return false;
9591 }
9592
9596
9597
9599 {
9600 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9601 return module_repairing.CanRepair(this, item_repair_kit);
9602 }
9603
9604
9605 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9606 {
9607 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9608 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9609 }
9610
9611
9613 {
9614
9615
9616
9617
9618
9619
9620
9621
9622 return 1;
9623 }
9624
9625
9626
9628 {
9630 }
9631
9632
9633
9635 {
9637 }
9638
9639
9648 {
9649 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9650
9651 if (player)
9652 {
9653 player.MessageStatus(text);
9654 }
9655 }
9656
9657
9666 {
9667 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9668
9669 if (player)
9670 {
9671 player.MessageAction(text);
9672 }
9673 }
9674
9675
9684 {
9685 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9686
9687 if (player)
9688 {
9689 player.MessageFriendly(text);
9690 }
9691 }
9692
9693
9702 {
9703 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9704
9705 if (player)
9706 {
9707 player.MessageImportant(text);
9708 }
9709 }
9710
9712 {
9713 return true;
9714 }
9715
9716
9717 override bool KindOf(
string tag)
9718 {
9719 bool found = false;
9720 string item_name = this.
GetType();
9723
9724 int array_size = item_tag_array.Count();
9725 for (int i = 0; i < array_size; i++)
9726 {
9727 if (item_tag_array.Get(i) == tag)
9728 {
9729 found = true;
9730 break;
9731 }
9732 }
9733 return found;
9734 }
9735
9736
9738 {
9739
9740 super.OnRPC(sender, rpc_type,ctx);
9741
9742
9743 switch (rpc_type)
9744 {
9745 #ifndef SERVER
9746 case ERPCs.RPC_SOUND_LOCK_ATTACH:
9747 Param2<bool, string> p = new Param2<bool, string>(false, "");
9748
9750 return;
9751
9752 bool play = p.param1;
9753 string soundSet = p.param2;
9754
9755 if (play)
9756 {
9758 {
9760 {
9762 }
9763 }
9764 else
9765 {
9767 }
9768 }
9769 else
9770 {
9772 }
9773
9774 break;
9775 #endif
9776
9777 }
9778
9780 {
9782 }
9783 }
9784
9785
9786
9787
9789 {
9790 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9791 return plugin.GetID(
name);
9792 }
9793
9795 {
9796 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9797 return plugin.GetName(id);
9798 }
9799
9802 {
9803
9804
9805 int varFlags;
9806 if (!ctx.
Read(varFlags))
9807 return;
9808
9809 if (varFlags & ItemVariableFlags.FLOAT)
9810 {
9812 }
9813 }
9814
9816 {
9817
9818 super.SerializeNumericalVars(floats_out);
9819
9820
9821
9823 {
9825 }
9826
9828 {
9830 }
9831
9833 {
9835 }
9836
9838 {
9843 }
9844
9846 {
9848 }
9849 }
9850
9852 {
9853
9854 super.DeSerializeNumericalVars(floats);
9855
9856
9857 int index = 0;
9858 int mask = Math.Round(floats.Get(index));
9859
9860 index++;
9861
9863 {
9865 {
9867 }
9868 else
9869 {
9870 float quantity = floats.Get(index);
9872 }
9873 index++;
9874 }
9875
9877 {
9878 float wet = floats.Get(index);
9880 index++;
9881 }
9882
9884 {
9885 int liquidtype = Math.Round(floats.Get(index));
9887 index++;
9888 }
9889
9891 {
9893 index++;
9895 index++;
9897 index++;
9899 index++;
9900 }
9901
9903 {
9904 int cleanness = Math.Round(floats.Get(index));
9906 index++;
9907 }
9908 }
9909
9911 {
9912 super.WriteVarsToCTX(ctx);
9913
9914
9916 {
9918 }
9919
9921 {
9923 }
9924
9926 {
9928 }
9929
9931 {
9932 int r,g,b,a;
9938 }
9939
9941 {
9943 }
9944 }
9945
9947 {
9948 if (!super.ReadVarsFromCTX(ctx,version))
9949 return false;
9950
9951 int intValue;
9952 float value;
9953
9954 if (version < 140)
9955 {
9956 if (!ctx.
Read(intValue))
9957 return false;
9958
9959 m_VariablesMask = intValue;
9960 }
9961
9963 {
9964 if (!ctx.
Read(value))
9965 return false;
9966
9968 {
9970 }
9971 else
9972 {
9974 }
9975 }
9976
9977 if (version < 140)
9978 {
9980 {
9981 if (!ctx.
Read(value))
9982 return false;
9983 SetTemperatureDirect(value);
9984 }
9985 }
9986
9988 {
9989 if (!ctx.
Read(value))
9990 return false;
9992 }
9993
9995 {
9996 if (!ctx.
Read(intValue))
9997 return false;
9999 }
10000
10002 {
10003 int r,g,b,a;
10005 return false;
10007 return false;
10009 return false;
10011 return false;
10012
10014 }
10015
10017 {
10018 if (!ctx.
Read(intValue))
10019 return false;
10021 }
10022
10023 if (version >= 138 && version < 140)
10024 {
10026 {
10027 if (!ctx.
Read(intValue))
10028 return false;
10029 SetFrozen(intValue);
10030 }
10031 }
10032
10033 return true;
10034 }
10035
10036
10038 {
10041 {
10043 }
10044
10045 if (!super.OnStoreLoad(ctx, version))
10046 {
10048 return false;
10049 }
10050
10051 if (version >= 114)
10052 {
10053 bool hasQuickBarIndexSaved;
10054
10055 if (!ctx.
Read(hasQuickBarIndexSaved))
10056 {
10058 return false;
10059 }
10060
10061 if (hasQuickBarIndexSaved)
10062 {
10063 int itmQBIndex;
10064
10065
10066 if (!ctx.
Read(itmQBIndex))
10067 {
10069 return false;
10070 }
10071
10072 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10073 if (itmQBIndex != -1 && parentPlayer)
10074 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10075 }
10076 }
10077 else
10078 {
10079
10080 PlayerBase player;
10081 int itemQBIndex;
10082 if (version ==
int.
MAX)
10083 {
10084 if (!ctx.
Read(itemQBIndex))
10085 {
10087 return false;
10088 }
10089 }
10090 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10091 {
10092
10093 if (!ctx.
Read(itemQBIndex))
10094 {
10096 return false;
10097 }
10098 if (itemQBIndex != -1 && player)
10099 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10100 }
10101 }
10102
10103 if (version < 140)
10104 {
10105
10106 if (!LoadVariables(ctx, version))
10107 {
10109 return false;
10110 }
10111 }
10112
10113
10115 {
10117 return false;
10118 }
10119 if (version >= 132)
10120 {
10122 if (raib)
10123 {
10125 {
10127 return false;
10128 }
10129 }
10130 }
10131
10133 return true;
10134 }
10135
10136
10137
10139 {
10140 super.OnStoreSave(ctx);
10141
10142 PlayerBase player;
10143 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10144 {
10146
10147 int itemQBIndex = -1;
10148 itemQBIndex = player.FindQuickBarEntityIndex(this);
10149 ctx.
Write(itemQBIndex);
10150 }
10151 else
10152 {
10154 }
10155
10157
10159 if (raib)
10160 {
10162 }
10163 }
10164
10165
10167 {
10168 super.AfterStoreLoad();
10169
10171 {
10173 }
10174
10176 {
10179 }
10180 }
10181
10183 {
10184 super.EEOnAfterLoad();
10185
10187 {
10189 }
10190
10193 }
10194
10196 {
10197 return false;
10198 }
10199
10200
10201
10203 {
10205 {
10206 #ifdef PLATFORM_CONSOLE
10207
10209 {
10211 if (menu)
10212 {
10214 }
10215 }
10216 #endif
10217 }
10218
10220 {
10223 }
10224
10226 {
10227 SetWeightDirty();
10229 }
10231 {
10234 }
10235
10237 {
10240 }
10242 {
10245 }
10246
10247 super.OnVariablesSynchronized();
10248 }
10249
10250
10251
10253 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10254 {
10255 if (!IsServerCheck(allow_client))
10256 return false;
10257
10259 return false;
10260
10263
10264 if (value <= (min + 0.001))
10265 value = min;
10266
10267 if (value == min)
10268 {
10269 if (destroy_config)
10270 {
10271 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10272 if (dstr)
10273 {
10275 this.Delete();
10276 return true;
10277 }
10278 }
10279 else if (destroy_forced)
10280 {
10282 this.Delete();
10283 return true;
10284 }
10285
10287 }
10288
10291
10293 {
10295
10296 if (delta)
10298 }
10299
10301
10302 return false;
10303 }
10304
10305
10307 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10308 {
10310 }
10311
10313 {
10316 }
10317
10319 {
10322 }
10323
10326 {
10327 float value_clamped = Math.Clamp(value, 0, 1);
10329 SetQuantity(result, destroy_config, destroy_forced);
10330 }
10331
10332
10335 {
10337 }
10338
10340 {
10342 }
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10354 {
10355 int slot = -1;
10356 if (GetInventory())
10357 {
10358 InventoryLocation il = new InventoryLocation;
10359 GetInventory().GetCurrentInventoryLocation(il);
10361 }
10362
10364 }
10365
10367 {
10368 float quantity_max = 0;
10369
10371 {
10372 if (attSlotID != -1)
10373 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10374
10375 if (quantity_max <= 0)
10377 }
10378
10379 if (quantity_max <= 0)
10381
10382 return quantity_max;
10383 }
10384
10386 {
10388 }
10389
10391 {
10393 }
10394
10395
10397 {
10399 }
10400
10402 {
10404 }
10405
10407 {
10409 }
10410
10411
10413 {
10414
10415 float weightEx = GetWeightEx();
10416 float special = GetInventoryAndCargoWeight();
10417 return weightEx - special;
10418 }
10419
10420
10422 {
10424 }
10425
10427 {
10429 {
10430 #ifdef DEVELOPER
10431 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10432 {
10433 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10435 }
10436 #endif
10437
10438 return GetQuantity() * GetConfigWeightModified();
10439 }
10440 else if (HasEnergyManager())
10441 {
10442 #ifdef DEVELOPER
10443 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10444 {
10445 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10446 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10447 }
10448 #endif
10449 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10450 }
10451 else
10452 {
10453 #ifdef DEVELOPER
10454 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10455 {
10456 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10457 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10458 }
10459 #endif
10460 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10461 }
10462 }
10463
10466 {
10467 int item_count = 0;
10469
10470 if (GetInventory().GetCargo() != NULL)
10471 {
10472 item_count = GetInventory().GetCargo().GetItemCount();
10473 }
10474
10475 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10476 {
10477 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10478 if (item)
10479 item_count += item.GetNumberOfItems();
10480 }
10481 return item_count;
10482 }
10483
10486 {
10487 float weight = 0;
10488 float wetness = 1;
10489 if (include_wetness)
10492 {
10493 weight = wetness * m_ConfigWeight;
10494 }
10496 {
10497 weight = 1;
10498 }
10499 return weight;
10500 }
10501
10502
10503
10505 {
10506 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10507 {
10508 GameInventory inv = GetInventory();
10509 array<EntityAI> items = new array<EntityAI>;
10511 for (int i = 0; i < items.Count(); i++)
10512 {
10514 if (item)
10515 {
10517 }
10518 }
10519 }
10520 }
10521
10522
10523
10524
10526 {
10527 float energy = 0;
10528 if (HasEnergyManager())
10529 {
10530 energy = GetCompEM().GetEnergy();
10531 }
10532 return energy;
10533 }
10534
10535
10537 {
10538 super.OnEnergyConsumed();
10539
10541 }
10542
10544 {
10545 super.OnEnergyAdded();
10546
10548 }
10549
10550
10552 {
10553 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10554 {
10556 {
10557 float energy_0to1 = GetCompEM().GetEnergy0To1();
10559 }
10560 }
10561 }
10562
10563
10565 {
10566 return ConfigGetFloat("heatIsolation");
10567 }
10568
10570 {
10572 }
10573
10575 {
10576 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10577 if (
GetGame().ConfigIsExisting(paramPath))
10579
10580 return 0.0;
10581 }
10582
10584 {
10585 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10586 if (
GetGame().ConfigIsExisting(paramPath))
10588
10589 return 0.0;
10590 }
10591
10592 override void SetWet(
float value,
bool allow_client =
false)
10593 {
10594 if (!IsServerCheck(allow_client))
10595 return;
10596
10599
10601
10602 m_VarWet = Math.Clamp(value, min, max);
10603
10605 {
10608 }
10609 }
10610
10611 override void AddWet(
float value)
10612 {
10614 }
10615
10617 {
10619 }
10620
10622 {
10624 }
10625
10627 {
10629 }
10630
10632 {
10634 }
10635
10637 {
10639 }
10640
10641 override void OnWetChanged(
float newVal,
float oldVal)
10642 {
10645 if (newLevel != oldLevel)
10646 {
10648 }
10649 }
10650
10652 {
10653 SetWeightDirty();
10654 }
10655
10657 {
10658 return GetWetLevelInternal(
m_VarWet);
10659 }
10660
10661
10662
10664 {
10666 }
10667
10669 {
10671 }
10672
10674 {
10676 }
10677
10679 {
10681 }
10682
10683
10684
10686 {
10687 if (ConfigIsExisting("itemModelLength"))
10688 {
10689 return ConfigGetFloat("itemModelLength");
10690 }
10691 return 0;
10692 }
10693
10695 {
10696 if (ConfigIsExisting("itemAttachOffset"))
10697 {
10698 return ConfigGetFloat("itemAttachOffset");
10699 }
10700 return 0;
10701 }
10702
10703 override void SetCleanness(
int value,
bool allow_client =
false)
10704 {
10705 if (!IsServerCheck(allow_client))
10706 return;
10707
10709
10711
10714 }
10715
10717 {
10719 }
10720
10722 {
10723 return true;
10724 }
10725
10726
10727
10728
10730 {
10732 }
10733
10735 {
10737 }
10738
10739
10740
10741
10742 override void SetColor(
int r,
int g,
int b,
int a)
10743 {
10749 }
10751 override void GetColor(out
int r,out
int g,out
int b,out
int a)
10752 {
10757 }
10758
10760 {
10762 }
10763
10766 {
10767 int r,g,b,a;
10769 r = r/255;
10770 g = g/255;
10771 b = b/255;
10772 a = a/255;
10773 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10774 }
10775
10776
10777
10778 override void SetLiquidType(
int value,
bool allow_client =
false)
10779 {
10780 if (!IsServerCheck(allow_client))
10781 return;
10782
10787 }
10788
10790 {
10791 return ConfigGetInt("varLiquidTypeInit");
10792 }
10793
10795 {
10797 }
10798
10800 {
10802 SetFrozen(false);
10803 }
10804
10807 {
10808 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10809 }
10810
10811
10814 {
10815 PlayerBase nplayer;
10816 if (PlayerBase.CastTo(nplayer, player))
10817 {
10819
10820 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10821 }
10822 }
10823
10824
10827 {
10828 PlayerBase nplayer;
10829 if (PlayerBase.CastTo(nplayer,player))
10830 {
10831
10832 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10833
10834 }
10835
10836
10837 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10838
10839
10840 if (HasEnergyManager())
10841 {
10842 GetCompEM().UpdatePlugState();
10843 }
10844 }
10845
10846
10848 {
10849 super.OnPlacementStarted(player);
10850
10852 }
10853
10854 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
10855 {
10857 {
10858 m_AdminLog.OnPlacementComplete(player,
this);
10859 }
10860
10861 super.OnPlacementComplete(player, position, orientation);
10862 }
10863
10864
10865
10866
10867
10869 {
10871 {
10872 return true;
10873 }
10874 else
10875 {
10876 return false;
10877 }
10878 }
10879
10880
10882 {
10884 {
10886 }
10887 }
10888
10889
10891 {
10893 }
10894
10896 {
10898 }
10899
10900 override void InsertAgent(
int agent,
float count = 1)
10901 {
10902 if (count < 1)
10903 return;
10904
10906 }
10907
10910 {
10912 }
10913
10914
10916 {
10918 }
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945
10946
10947
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10962 {
10964 return false;
10965 return true;
10966 }
10967
10969 {
10970
10972 }
10973
10974
10977 {
10978 super.CheckForRoofLimited(timeTresholdMS);
10979
10981 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
10982 {
10983 m_PreviousRoofTestTime = time;
10984 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
10985 }
10986 }
10987
10988
10990 {
10992 {
10993 return 0;
10994 }
10995
10996 if (GetInventory().GetAttachmentSlotsCount() != 0)
10997 {
10998 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
10999 if (filter)
11000 return filter.GetProtectionLevel(type, false, system);
11001 else
11002 return 0;
11003 }
11004
11005 string subclassPath, entryName;
11006
11007 switch (type)
11008 {
11010 entryName = "biological";
11011 break;
11013 entryName = "chemical";
11014 break;
11015 default:
11016 entryName = "biological";
11017 break;
11018 }
11019
11020 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11021
11023 }
11024
11025
11026
11029 {
11030 if (!IsMagazine())
11032
11034 }
11035
11036
11037
11038
11039
11044 {
11045 return true;
11046 }
11047
11049 {
11051 }
11052
11053
11054
11055
11056
11058 {
11059 if (parent)
11060 {
11061 if (parent.IsInherited(DayZInfected))
11062 return true;
11063
11064 if (!parent.IsRuined())
11065 return true;
11066 }
11067
11068 return true;
11069 }
11070
11072 {
11073 if (!super.CanPutAsAttachment(parent))
11074 {
11075 return false;
11076 }
11077
11078 if (!IsRuined() && !parent.IsRuined())
11079 {
11080 return true;
11081 }
11082
11083 return false;
11084 }
11085
11087 {
11088
11089
11090
11091
11092 return super.CanReceiveItemIntoCargo(item);
11093 }
11094
11096 {
11097
11098
11099
11100
11101 GameInventory attachmentInv = attachment.GetInventory();
11103 {
11104 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11105 return false;
11106 }
11107
11108 InventoryLocation loc = new InventoryLocation();
11109 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11110 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11111 return false;
11112
11113 return super.CanReceiveAttachment(attachment, slotId);
11114 }
11115
11117 {
11118 if (!super.CanReleaseAttachment(attachment))
11119 return false;
11120
11121 return GetInventory().AreChildrenAccessible();
11122 }
11123
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139
11140
11141
11142
11143
11145 {
11146 int id = muzzle_owner.GetMuzzleID();
11147 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11148
11149 if (WPOF_array)
11150 {
11151 for (int i = 0; i < WPOF_array.Count(); i++)
11152 {
11153 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11154
11155 if (WPOF)
11156 {
11157 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11158 }
11159 }
11160 }
11161 }
11162
11163
11165 {
11166 int id = muzzle_owner.GetMuzzleID();
11168
11169 if (WPOBE_array)
11170 {
11171 for (int i = 0; i < WPOBE_array.Count(); i++)
11172 {
11173 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11174
11175 if (WPOBE)
11176 {
11177 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11178 }
11179 }
11180 }
11181 }
11182
11183
11185 {
11186 int id = muzzle_owner.GetMuzzleID();
11187 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11188
11189 if (WPOOH_array)
11190 {
11191 for (int i = 0; i < WPOOH_array.Count(); i++)
11192 {
11193 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11194
11195 if (WPOOH)
11196 {
11197 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11198 }
11199 }
11200 }
11201 }
11202
11203
11205 {
11206 int id = muzzle_owner.GetMuzzleID();
11207 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11208
11209 if (WPOOH_array)
11210 {
11211 for (int i = 0; i < WPOOH_array.Count(); i++)
11212 {
11213 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11214
11215 if (WPOOH)
11216 {
11217 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11218 }
11219 }
11220 }
11221 }
11222
11223
11225 {
11226 int id = muzzle_owner.GetMuzzleID();
11227 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11228
11229 if (WPOOH_array)
11230 {
11231 for (int i = 0; i < WPOOH_array.Count(); i++)
11232 {
11233 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11234
11235 if (WPOOH)
11236 {
11237 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11238 }
11239 }
11240 }
11241 }
11242
11243
11244
11246 {
11248 {
11249 return true;
11250 }
11251
11252 return false;
11253 }
11254
11256 {
11258 {
11259 return true;
11260 }
11261
11262 return false;
11263 }
11264
11266 {
11268 {
11269 return true;
11270 }
11271
11272 return false;
11273 }
11274
11276 {
11277 return false;
11278 }
11279
11282 {
11283 return UATimeSpent.DEFAULT_DEPLOY;
11284 }
11285
11286
11287
11288
11290 {
11292 SetSynchDirty();
11293 }
11294
11296 {
11298 }
11299
11300
11302 {
11303 return false;
11304 }
11305
11308 {
11309 string att_type = "None";
11310
11311 if (ConfigIsExisting("soundAttType"))
11312 {
11313 att_type = ConfigGetString("soundAttType");
11314 }
11315
11317 }
11318
11320 {
11322 }
11323
11324
11325
11326
11327
11331
11333 {
11336
11338 }
11339
11340
11342 {
11344 return;
11345
11347
11350
11353
11354 SoundParameters params = new SoundParameters();
11358 }
11359
11360
11362 {
11364 return;
11365
11367 SetSynchDirty();
11368
11371 }
11372
11373
11375 {
11377 return;
11378
11380 SetSynchDirty();
11381
11384 }
11385
11387 {
11389 }
11390
11392 {
11394 }
11395
11398 {
11399 if (!
GetGame().IsDedicatedServer())
11400 {
11401 if (ConfigIsExisting("attachSoundSet"))
11402 {
11403 string cfg_path = "";
11404 string soundset = "";
11405 string type_name =
GetType();
11406
11409 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11410 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11411
11412 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11413 {
11414 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11415 {
11416 if (cfg_slot_array[i] == slot_type)
11417 {
11418 soundset = cfg_soundset_array[i];
11419 break;
11420 }
11421 }
11422 }
11423
11424 if (soundset != "")
11425 {
11426 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11428 }
11429 }
11430 }
11431 }
11432
11434 {
11435
11436 }
11437
11438 void OnApply(PlayerBase player);
11439
11441 {
11442 return 1.0;
11443 };
11444
11446 {
11448 }
11449
11451 {
11453 }
11454
11456
11458 {
11459 SetDynamicPhysicsLifeTime(0.01);
11461 }
11462
11464 {
11465 array<string> zone_names = new array<string>;
11466 GetDamageZones(zone_names);
11467 for (int i = 0; i < zone_names.Count(); i++)
11468 {
11469 SetHealthMax(zone_names.Get(i),"Health");
11470 }
11471 SetHealthMax("","Health");
11472 }
11473
11476 {
11477 float global_health = GetHealth01("","Health");
11478 array<string> zones = new array<string>;
11479 GetDamageZones(zones);
11480
11481 for (int i = 0; i < zones.Count(); i++)
11482 {
11483 SetHealth01(zones.Get(i),"Health",global_health);
11484 }
11485 }
11486
11489 {
11490 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11491 }
11492
11494 {
11495 if (!hasRootAsPlayer)
11496 {
11497 if (refParentIB)
11498 {
11499
11500 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11501 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11502
11503 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11504 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11505
11508 }
11509 else
11510 {
11511
11514 }
11515 }
11516 }
11517
11519 {
11521 {
11522 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11523 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11524 {
11525 float heatPermCoef = 1.0;
11527 while (ent)
11528 {
11529 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11530 ent = ent.GetHierarchyParent();
11531 }
11532
11533 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11534 }
11535 }
11536 }
11537
11539 {
11540
11541 EntityAI parent = GetHierarchyParent();
11542 if (!parent)
11543 {
11544 hasParent = false;
11545 hasRootAsPlayer = false;
11546 }
11547 else
11548 {
11549 hasParent = true;
11550 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11551 refParentIB =
ItemBase.Cast(parent);
11552 }
11553 }
11554
11555 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11556 {
11557
11558 }
11559
11561 {
11562
11563 return false;
11564 }
11565
11567 {
11568
11569
11570 return false;
11571 }
11572
11574 {
11575
11576 return false;
11577 }
11578
11581 {
11582 return !GetIsFrozen() &&
IsOpen();
11583 }
11584
11586 {
11587 bool hasParent = false, hasRootAsPlayer = false;
11589
11590 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11591 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11592
11593 if (wwtu || foodDecay)
11594 {
11598
11599 if (processWetness || processTemperature || processDecay)
11600 {
11602
11603 if (processWetness)
11604 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11605
11606 if (processTemperature)
11608
11609 if (processDecay)
11610 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11611 }
11612 }
11613 }
11614
11617 {
11619 }
11620
11622 {
11625
11626 return super.GetTemperatureFreezeThreshold();
11627 }
11628
11630 {
11633
11634 return super.GetTemperatureThawThreshold();
11635 }
11636
11638 {
11641
11642 return super.GetItemOverheatThreshold();
11643 }
11644
11646 {
11648 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11649
11650 return super.GetTemperatureFreezeTime();
11651 }
11652
11654 {
11656 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11657
11658 return super.GetTemperatureThawTime();
11659 }
11660
11665
11667 {
11668 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11669 }
11670
11672 {
11673 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11674 }
11675
11678 {
11680 }
11681
11683 {
11685 }
11686
11688 {
11690 }
11691
11694 {
11695 return null;
11696 }
11697
11700 {
11701 return false;
11702 }
11703
11705 {
11707 {
11710 if (!trg)
11711 {
11713 explosive = this;
11714 }
11715
11716 explosive.PairRemote(trg);
11718
11719 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
11720 trg.SetPersistentPairID(persistentID);
11721 explosive.SetPersistentPairID(persistentID);
11722
11723 return true;
11724 }
11725 return false;
11726 }
11727
11730 {
11731 float ret = 1.0;
11734 ret *= GetHealth01();
11735
11736 return ret;
11737 }
11738
11739 #ifdef DEVELOPER
11740 override void SetDebugItem()
11741 {
11742 super.SetDebugItem();
11743 _itemBase = this;
11744 }
11745
11747 {
11748 string text = super.GetDebugText();
11749
11751 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
11752
11753 return text;
11754 }
11755 #endif
11756
11758 {
11759 return true;
11760 }
11761
11763
11765
11767 {
11770 }
11771
11772
11780
11796}
11797
11799{
11801 if (entity)
11802 {
11803 bool is_item = entity.IsInherited(
ItemBase);
11804 if (is_item && full_quantity)
11805 {
11808 }
11809 }
11810 else
11811 {
11813 return NULL;
11814 }
11815 return entity;
11816}
11817
11819{
11820 if (item)
11821 {
11822 if (health > 0)
11823 item.SetHealth("", "", health);
11824
11825 if (item.CanHaveTemperature())
11826 {
11828 if (item.CanFreeze())
11829 item.SetFrozen(false);
11830 }
11831
11832 if (item.HasEnergyManager())
11833 {
11834 if (quantity >= 0)
11835 {
11836 item.GetCompEM().SetEnergy0To1(quantity);
11837 }
11838 else
11839 {
11841 }
11842 }
11843 else if (item.IsMagazine())
11844 {
11845 Magazine mag = Magazine.Cast(item);
11846 if (quantity >= 0)
11847 {
11848 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11849 }
11850 else
11851 {
11853 }
11854
11855 }
11856 else
11857 {
11858 if (quantity >= 0)
11859 {
11860 item.SetQuantityNormalized(quantity, false);
11861 }
11862 else
11863 {
11865 }
11866
11867 }
11868 }
11869}
11870
11871#ifdef DEVELOPER
11873#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.