6991{
6993 {
6994 return true;
6995 }
6996};
6997
6998
6999
7001{
7005
7007
7010
7011
7012
7013
7014
7023
7029
7034
7039
7060 protected bool m_IsResultOfSplit
7061
7063
7068
7069
7070
7072
7076
7077
7078
7080
7083
7084
7085
7091
7092
7100
7103
7104
7106
7107
7109
7110
7115
7116
7121
7122
7124
7125
7127 {
7132
7133 if (!
GetGame().IsDedicatedServer())
7134 {
7136 {
7138
7140 {
7142 }
7143 }
7144
7147 }
7148
7149 m_OldLocation = null;
7150
7152 {
7154 }
7155
7156 if (ConfigIsExisting("headSelectionsToHide"))
7157 {
7160 }
7161
7163 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7164 {
7166 }
7167
7169
7170 m_IsResultOfSplit = false;
7171
7173 }
7174
7176 {
7177 super.InitItemVariables();
7178
7184 m_Count = ConfigGetInt(
"count");
7185
7188
7193
7196
7201
7213
7217
7218
7221 if (ConfigIsExisting("canBeSplit"))
7222 {
7225 }
7226
7228 if (ConfigIsExisting("itemBehaviour"))
7230
7231
7234 RegisterNetSyncVariableInt("m_VarLiquidType");
7235 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7236
7237 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7238 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7239 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7240
7241 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7242 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7243 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7244 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7245
7246 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7247 RegisterNetSyncVariableBool("m_IsTakeable");
7248 RegisterNetSyncVariableBool("m_IsHologram");
7249
7252 {
7255 }
7256
7258
7260 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7262
7263 }
7264
7266 {
7268 }
7269
7271 {
7274 {
7279 }
7280 }
7281
7282 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7283 {
7285 {
7288 }
7289
7291 }
7292
7294 {
7300 }
7301
7303
7305 {
7307
7308 if (!action)
7309 {
7310 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7311 return;
7312 }
7313
7315 if (!ai)
7316 {
7318 return;
7319 }
7320
7322 if (!action_array)
7323 {
7324 action_array = new array<ActionBase_Basic>;
7326 }
7327 if (LogManager.IsActionLogEnable())
7328 {
7329 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7330 }
7331
7332 if (action_array.Find(action) != -1)
7333 {
7334 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7335 }
7336 else
7337 {
7338 action_array.Insert(action);
7339 }
7340 }
7341
7343 {
7345 ActionBase action = player.GetActionManager().GetAction(actionName);
7348
7349 if (action_array)
7350 {
7351 action_array.RemoveItem(action);
7352 }
7353 }
7354
7355
7356
7358 {
7359 ActionOverrideData overrideData = new ActionOverrideData();
7363
7365 if (!actionMap)
7366 {
7369 }
7370
7371 actionMap.Insert(this.
Type(), overrideData);
7372
7373 }
7374
7376
7378
7379
7381 {
7384
7387
7388 string config_to_search = "CfgVehicles";
7389 string muzzle_owner_config;
7390
7392 {
7393 if (IsInherited(Weapon))
7394 config_to_search = "CfgWeapons";
7395
7396 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7397
7398 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7399
7401
7402 if (config_OnFire_subclass_count > 0)
7403 {
7404 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7405
7406 for (int i = 0; i < config_OnFire_subclass_count; i++)
7407 {
7408 string particle_class = "";
7410 string config_OnFire_entry = config_OnFire_class + particle_class;
7411 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7412 WPOF_array.Insert(WPOF);
7413 }
7414
7415
7417 }
7418 }
7419
7421 {
7422 config_to_search = "CfgWeapons";
7423 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7424
7425 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7426
7428
7429 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7430 {
7431 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7432
7433 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7434 {
7435 string particle_class2 = "";
7437 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7438 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7439 WPOBE_array.Insert(WPOBE);
7440 }
7441
7442
7444 }
7445 }
7446 }
7447
7448
7450 {
7453
7455 {
7456 string config_to_search = "CfgVehicles";
7457
7458 if (IsInherited(Weapon))
7459 config_to_search = "CfgWeapons";
7460
7461 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7462 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7463
7464 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7465 {
7466
7468
7470 {
7472 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7474 return;
7475 }
7476
7479
7480
7481
7483 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7484
7485 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7486 {
7487 string particle_class = "";
7489 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7491
7492 if (entry_type == CT_CLASS)
7493 {
7494 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7495 WPOOH_array.Insert(WPOF);
7496 }
7497 }
7498
7499
7501 }
7502 }
7503 }
7504
7506 {
7508 }
7509
7511 {
7513 {
7515
7518
7521
7522 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7523 }
7524 }
7525
7527 {
7529 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7530
7532 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7533
7535 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7536
7538 {
7540 }
7541 }
7542
7544 {
7546 }
7547
7549 {
7552 else
7554
7556 {
7559 }
7560 else
7561 {
7564
7567 }
7568
7570 }
7571
7573 {
7575 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7576 }
7577
7579 {
7581 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7583 }
7584
7586 {
7588 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7589 }
7590
7592 {
7595
7596 OverheatingParticle OP = new OverheatingParticle();
7601
7603 }
7604
7606 {
7609
7610 return -1;
7611 }
7612
7614 {
7616 {
7619
7620 for (int i = count; i > 0; --i)
7621 {
7622 int id = i - 1;
7625
7628
7629 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7630 {
7631 if (p)
7632 {
7635 }
7636 }
7637 }
7638 }
7639 }
7640
7642 {
7644 {
7646 {
7647 int id = i - 1;
7649
7650 if (OP)
7651 {
7653
7654 if (p)
7655 {
7657 }
7658
7659 delete OP;
7660 }
7661 }
7662
7665 }
7666 }
7667
7670 {
7671 return 0.0;
7672 }
7673
7674
7676 {
7677 return 250;
7678 }
7679
7681 {
7682 return 0;
7683 }
7684
7687 {
7689 return true;
7690
7691 return false;
7692 }
7693
7696 {
7699
7701 {
7703 }
7704 else
7705 {
7706
7708 }
7709
7711 }
7712
7719 {
7720 return -1;
7721 }
7722
7723
7724
7725
7727 {
7729 {
7731 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7732
7733 if (r_index >= 0)
7734 {
7735 InventoryLocation r_il = new InventoryLocation;
7736 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7737
7738 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7741 {
7742 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7743 }
7745 {
7746 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7747 }
7748
7749 }
7750
7751 player.GetHumanInventory().ClearUserReservedLocation(this);
7752 }
7753
7756 }
7757
7758
7759
7760
7762 {
7763 return ItemBase.m_DebugActionsMask;
7764 }
7765
7767 {
7768 return ItemBase.m_DebugActionsMask & mask;
7769 }
7770
7772 {
7773 ItemBase.m_DebugActionsMask = mask;
7774 }
7775
7777 {
7778 ItemBase.m_DebugActionsMask |= mask;
7779 }
7780
7782 {
7783 ItemBase.m_DebugActionsMask &= ~mask;
7784 }
7785
7787 {
7789 {
7791 }
7792 else
7793 {
7795 }
7796 }
7797
7798
7800 {
7801 if (GetEconomyProfile())
7802 {
7803 float q_max = GetEconomyProfile().GetQuantityMax();
7804 if (q_max > 0)
7805 {
7806 float q_min = GetEconomyProfile().GetQuantityMin();
7807 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7808
7810 {
7811 ComponentEnergyManager comp = GetCompEM();
7813 {
7815 }
7816 }
7818 {
7820
7821 }
7822
7823 }
7824 }
7825 }
7826
7829 {
7830 EntityAI parent = GetHierarchyParent();
7831
7832 if (parent)
7833 {
7834 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7835 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7836 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
7837 }
7838 }
7839
7842 {
7843 EntityAI parent = GetHierarchyParent();
7844
7845 if (parent)
7846 {
7847 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7848 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7849 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
7850 }
7851 }
7852
7854 {
7855
7856
7857
7858
7860
7862 {
7863 if (ScriptInputUserData.CanStoreInputUserData())
7864 {
7865 ScriptInputUserData ctx = new ScriptInputUserData;
7871 ctx.
Write(use_stack_max);
7874
7876 {
7877 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
7878 }
7879 }
7880 }
7881 else if (!
GetGame().IsMultiplayer())
7882 {
7884 }
7885 }
7886
7888 {
7890 }
7891
7893 {
7895 }
7896
7898 {
7900 }
7901
7903 {
7904
7905 return false;
7906 }
7907
7909 {
7910 return false;
7911 }
7912
7916 {
7917 return false;
7918 }
7919
7921 {
7922 return "";
7923 }
7924
7926
7928 {
7929 return false;
7930 }
7931
7933 {
7934 return true;
7935 }
7936
7937
7938
7940 {
7941 return true;
7942 }
7943
7945 {
7946 return true;
7947 }
7948
7950 {
7951 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7953 }
7954
7956 {
7958 }
7959
7961 {
7963 if (!is_being_placed)
7965 SetSynchDirty();
7966 }
7967
7968
7970
7972 {
7974 }
7975
7977 {
7979 }
7980
7982 {
7983 return 1;
7984 }
7985
7987 {
7988 return false;
7989 }
7990
7992 {
7994 SetSynchDirty();
7995 }
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8032 {
8033 super.OnMovedInsideCargo(container);
8034
8035 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8036 }
8037
8038 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8039 {
8040 super.EEItemLocationChanged(oldLoc,newLoc);
8041
8042 PlayerBase new_player = null;
8043 PlayerBase old_player = null;
8044
8045 if (newLoc.GetParent())
8046 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8047
8048 if (oldLoc.GetParent())
8049 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8050
8052 {
8053 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8054
8055 if (r_index >= 0)
8056 {
8057 InventoryLocation r_il = new InventoryLocation;
8058 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8059
8060 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8063 {
8064 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8065 }
8067 {
8068 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8069 }
8070
8071 }
8072 }
8073
8075 {
8076 if (new_player)
8077 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8078
8079 if (new_player == old_player)
8080 {
8081
8082 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8083 {
8085 {
8086 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8087 {
8088 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8089 }
8090 }
8091 else
8092 {
8093 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8094 }
8095 }
8096
8097 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8098 {
8099 int type = oldLoc.GetType();
8101 {
8102 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8103 }
8105 {
8106 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8107 }
8108 }
8109 if (!m_OldLocation)
8110 {
8111 m_OldLocation = new InventoryLocation;
8112 }
8113 m_OldLocation.Copy(oldLoc);
8114 }
8115 else
8116 {
8117 if (m_OldLocation)
8118 {
8119 m_OldLocation.Reset();
8120 }
8121 }
8122
8124 }
8125 else
8126 {
8127 if (new_player)
8128 {
8129 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8130 if (res_index >= 0)
8131 {
8132 InventoryLocation il = new InventoryLocation;
8133 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8135 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8138 {
8139 il.
GetParent().GetOnReleaseLock().Invoke(it);
8140 }
8142 {
8144 }
8145
8146 }
8147 }
8149 {
8150
8152 }
8153
8154 if (m_OldLocation)
8155 {
8156 m_OldLocation.Reset();
8157 }
8158 }
8159 }
8160
8161 override void EOnContact(IEntity other, Contact extra)
8162 {
8164 {
8165 int liquidType = -1;
8167 if (impactSpeed > 0.0)
8168 {
8170 #ifndef SERVER
8172 #else
8174 SetSynchDirty();
8175 #endif
8177 }
8178 }
8179
8180 #ifdef SERVER
8181 if (GetCompEM() && GetCompEM().IsPlugged())
8182 {
8183 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8184 GetCompEM().UnplugThis();
8185 }
8186 #endif
8187 }
8188
8190
8192 {
8194 }
8195
8197 {
8198
8199 }
8200
8202 {
8203 super.OnItemLocationChanged(old_owner, new_owner);
8204
8205 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8206 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8207
8208 if (!relatedPlayer && playerNew)
8209 relatedPlayer = playerNew;
8210
8211 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8212 {
8214 if (actionMgr)
8215 {
8216 ActionBase currentAction = actionMgr.GetRunningAction();
8217 if (currentAction)
8219 }
8220 }
8221
8222 Man ownerPlayerOld = null;
8223 Man ownerPlayerNew = null;
8224
8225 if (old_owner)
8226 {
8227 if (old_owner.
IsMan())
8228 {
8229 ownerPlayerOld = Man.Cast(old_owner);
8230 }
8231 else
8232 {
8233 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8234 }
8235 }
8236 else
8237 {
8239 {
8241
8242 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8243 {
8244 GetCompEM().UnplugThis();
8245 }
8246 }
8247 }
8248
8249 if (new_owner)
8250 {
8251 if (new_owner.
IsMan())
8252 {
8253 ownerPlayerNew = Man.Cast(new_owner);
8254 }
8255 else
8256 {
8257 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8258 }
8259 }
8260
8261 if (ownerPlayerOld != ownerPlayerNew)
8262 {
8263 if (ownerPlayerOld)
8264 {
8265 array<EntityAI> subItemsExit = new array<EntityAI>;
8267 for (int i = 0; i < subItemsExit.Count(); i++)
8268 {
8271 }
8272 }
8273
8274 if (ownerPlayerNew)
8275 {
8276 array<EntityAI> subItemsEnter = new array<EntityAI>;
8278 for (int j = 0; j < subItemsEnter.Count(); j++)
8279 {
8282 }
8283 }
8284 }
8285 else if (ownerPlayerNew != null)
8286 {
8287 PlayerBase nplayer;
8288 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8289 {
8290 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8292 for (int k = 0; k < subItemsUpdate.Count(); k++)
8293 {
8295 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8296 }
8297 }
8298 }
8299
8300 if (old_owner)
8301 old_owner.OnChildItemRemoved(this);
8302 if (new_owner)
8303 new_owner.OnChildItemReceived(this);
8304 }
8305
8306
8308 {
8309 super.EEDelete(parent);
8310 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8311 if (player)
8312 {
8314
8315 if (player.IsAlive())
8316 {
8317 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8318 if (r_index >= 0)
8319 {
8320 InventoryLocation r_il = new InventoryLocation;
8321 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8322
8323 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8326 {
8327 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8328 }
8330 {
8331 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8332 }
8333
8334 }
8335
8336 player.RemoveQuickBarEntityShortcut(this);
8337 }
8338 }
8339 }
8340
8342 {
8343 super.EEKilled(killer);
8344
8347 {
8348 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8349 {
8350 if (IsMagazine())
8351 {
8352 if (Magazine.Cast(this).GetAmmoCount() > 0)
8353 {
8355 }
8356 }
8357 else
8358 {
8360 }
8361 }
8362 }
8363 }
8364
8366 {
8367 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8368
8369 super.OnWasAttached(parent, slot_id);
8370
8373
8375 }
8376
8378 {
8379 super.OnWasDetached(parent, slot_id);
8380
8383 }
8384
8386 {
8387 int idx;
8390
8391 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8392 if (inventory_slots.Count() < 1)
8393 {
8394 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8395 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8396 }
8397 else
8398 {
8399 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8400 }
8401
8402 idx = inventory_slots.Find(slot);
8403 if (idx < 0)
8404 return "";
8405
8406 return attach_types.Get(idx);
8407 }
8408
8410 {
8411 int idx = -1;
8412 string slot;
8413
8416
8417 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8418 if (inventory_slots.Count() < 1)
8419 {
8420 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8421 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8422 }
8423 else
8424 {
8425 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8426 if (detach_types.Count() < 1)
8427 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8428 }
8429
8430 for (int i = 0; i < inventory_slots.Count(); i++)
8431 {
8432 slot = inventory_slots.Get(i);
8433 }
8434
8435 if (slot != "")
8436 {
8437 if (detach_types.Count() == 1)
8438 idx = 0;
8439 else
8440 idx = inventory_slots.Find(slot);
8441 }
8442 if (idx < 0)
8443 return "";
8444
8445 return detach_types.Get(idx);
8446 }
8447
8449 {
8450
8452
8453
8454 float min_time = 1;
8455 float max_time = 3;
8456 float delay = Math.RandomFloat(min_time, max_time);
8457
8458 explode_timer.Run(delay, this, "DoAmmoExplosion");
8459 }
8460
8462 {
8463 Magazine magazine = Magazine.Cast(this);
8464 int pop_sounds_count = 6;
8465 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8466
8467
8468 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8469 string sound_name = pop_sounds[ sound_idx ];
8471
8472
8473 magazine.ServerAddAmmoCount(-1);
8474
8475
8476 float min_temp_to_explode = 100;
8477
8478 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8479 {
8481 }
8482 }
8483
8484
8485 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8486 {
8487 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8488
8489 const int CHANCE_DAMAGE_CARGO = 4;
8490 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8491 const int CHANCE_DAMAGE_NOTHING = 2;
8492
8494 {
8495 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8496 int chances;
8497 int rnd;
8498
8499 if (GetInventory().GetCargo())
8500 {
8501 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8502 rnd = Math.RandomInt(0,chances);
8503
8504 if (rnd < CHANCE_DAMAGE_CARGO)
8505 {
8507 }
8508 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8509 {
8511 }
8512 }
8513 else
8514 {
8515 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8516 rnd = Math.RandomInt(0,chances);
8517
8518 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8519 {
8521 }
8522 }
8523 }
8524 }
8525
8527 {
8528 if (GetInventory().GetCargo())
8529 {
8530 int item_count = GetInventory().GetCargo().GetItemCount();
8531 if (item_count > 0)
8532 {
8533 int random_pick = Math.RandomInt(0, item_count);
8535 if (!item.IsExplosive())
8536 {
8537 item.AddHealth("","",damage);
8538 return true;
8539 }
8540 }
8541 }
8542 return false;
8543 }
8544
8546 {
8547 int attachment_count = GetInventory().AttachmentCount();
8548 if (attachment_count > 0)
8549 {
8550 int random_pick = Math.RandomInt(0, attachment_count);
8551 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8552 if (!attachment.IsExplosive())
8553 {
8554 attachment.AddHealth("","",damage);
8555 return true;
8556 }
8557 }
8558 return false;
8559 }
8560
8562 {
8564 }
8565
8567 {
8569 return GetInventory().CanRemoveEntity();
8570
8571 return false;
8572 }
8573
8575 {
8577 return;
8578
8580 {
8581 if (ScriptInputUserData.CanStoreInputUserData())
8582 {
8583 ScriptInputUserData ctx = new ScriptInputUserData;
8588 ctx.
Write(destination_entity);
8592 }
8593 }
8594 else if (!
GetGame().IsMultiplayer())
8595 {
8597 }
8598 }
8599
8601 {
8603 return;
8604
8605 float split_quantity_new;
8609 InventoryLocation loc = new InventoryLocation;
8610
8611 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8612 {
8614 split_quantity_new = stack_max;
8615 else
8617
8618 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8619 if (new_item)
8620 {
8621 new_item.SetResultOfSplit(true);
8622 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8624 new_item.SetQuantity(split_quantity_new);
8625 }
8626 }
8627 else if (destination_entity && slot_id == -1)
8628 {
8629 if (quantity > stack_max)
8630 split_quantity_new = stack_max;
8631 else
8632 split_quantity_new = quantity;
8633
8635 {
8638 }
8639
8640 if (new_item)
8641 {
8642 new_item.SetResultOfSplit(true);
8643 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8645 new_item.SetQuantity(split_quantity_new);
8646 }
8647 }
8648 else
8649 {
8650 if (stack_max != 0)
8651 {
8653 {
8655 }
8656
8657 if (split_quantity_new == 0)
8658 {
8659 if (!
GetGame().IsMultiplayer())
8660 player.PhysicalPredictiveDropItem(this);
8661 else
8662 player.ServerDropEntity(this);
8663 return;
8664 }
8665
8667
8668 if (new_item)
8669 {
8670 new_item.SetResultOfSplit(true);
8671 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8673 new_item.SetQuantity(stack_max);
8674 new_item.PlaceOnSurface();
8675 }
8676 }
8677 }
8678 }
8679
8681 {
8683 return;
8684
8685 float split_quantity_new;
8689 InventoryLocation loc = new InventoryLocation;
8690
8691 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8692 {
8694 split_quantity_new = stack_max;
8695 else
8697
8698 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8699 if (new_item)
8700 {
8701 new_item.SetResultOfSplit(true);
8702 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8704 new_item.SetQuantity(split_quantity_new);
8705 }
8706 }
8707 else if (destination_entity && slot_id == -1)
8708 {
8709 if (quantity > stack_max)
8710 split_quantity_new = stack_max;
8711 else
8712 split_quantity_new = quantity;
8713
8715 {
8718 }
8719
8720 if (new_item)
8721 {
8722 new_item.SetResultOfSplit(true);
8723 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8725 new_item.SetQuantity(split_quantity_new);
8726 }
8727 }
8728 else
8729 {
8730 if (stack_max != 0)
8731 {
8733 {
8735 }
8736
8738
8739 if (new_item)
8740 {
8741 new_item.SetResultOfSplit(true);
8742 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8744 new_item.SetQuantity(stack_max);
8745 new_item.PlaceOnSurface();
8746 }
8747 }
8748 }
8749 }
8750
8752 {
8754 return;
8755
8757 {
8758 if (ScriptInputUserData.CanStoreInputUserData())
8759 {
8760 ScriptInputUserData ctx = new ScriptInputUserData;
8765 dst.WriteToContext(ctx);
8767 }
8768 }
8769 else if (!
GetGame().IsMultiplayer())
8770 {
8772 }
8773 }
8774
8776 {
8778 return;
8779
8781 {
8782 if (ScriptInputUserData.CanStoreInputUserData())
8783 {
8784 ScriptInputUserData ctx = new ScriptInputUserData;
8789 ctx.
Write(destination_entity);
8795 }
8796 }
8797 else if (!
GetGame().IsMultiplayer())
8798 {
8800 }
8801 }
8802
8804 {
8806 }
8807
8809 {
8811 return this;
8812
8814 float split_quantity_new;
8816 if (dst.IsValid())
8817 {
8818 int slot_id = dst.GetSlot();
8820
8821 if (quantity > stack_max)
8822 split_quantity_new = stack_max;
8823 else
8824 split_quantity_new = quantity;
8825
8827
8828 if (new_item)
8829 {
8830 new_item.SetResultOfSplit(true);
8831 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8834 }
8835
8836 return new_item;
8837 }
8838
8839 return null;
8840 }
8841
8843 {
8845 return;
8846
8848 float split_quantity_new;
8850 if (destination_entity)
8851 {
8853 if (quantity > stackable)
8854 split_quantity_new = stackable;
8855 else
8856 split_quantity_new = quantity;
8857
8858 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
8859 if (new_item)
8860 {
8861 new_item.SetResultOfSplit(true);
8862 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8864 new_item.SetQuantity(split_quantity_new);
8865 }
8866 }
8867 }
8868
8870 {
8872 return;
8873
8875 {
8876 if (ScriptInputUserData.CanStoreInputUserData())
8877 {
8878 ScriptInputUserData ctx = new ScriptInputUserData;
8883 ItemBase destination_entity =
this;
8884 ctx.
Write(destination_entity);
8888 }
8889 }
8890 else if (!
GetGame().IsMultiplayer())
8891 {
8893 }
8894 }
8895
8897 {
8899 return;
8900
8902 float split_quantity_new;
8904 if (player)
8905 {
8907 if (quantity > stackable)
8908 split_quantity_new = stackable;
8909 else
8910 split_quantity_new = quantity;
8911
8912 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
8913 new_item =
ItemBase.Cast(in_hands);
8914 if (new_item)
8915 {
8916 new_item.SetResultOfSplit(true);
8917 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8919 new_item.SetQuantity(split_quantity_new);
8920 }
8921 }
8922 }
8923
8925 {
8927 return;
8928
8930 float split_quantity_new = Math.Floor(quantity * 0.5);
8931
8933
8934 if (new_item)
8935 {
8936 if (new_item.GetQuantityMax() < split_quantity_new)
8937 {
8938 split_quantity_new = new_item.GetQuantityMax();
8939 }
8940
8941 new_item.SetResultOfSplit(true);
8942 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8943
8945 {
8948 }
8949 else
8950 {
8953 }
8954 }
8955 }
8956
8958 {
8960 return;
8961
8963 float split_quantity_new = Math.Floor(quantity / 2);
8964
8965 InventoryLocation invloc = new InventoryLocation;
8967
8969 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
8970
8971 if (new_item)
8972 {
8973 if (new_item.GetQuantityMax() < split_quantity_new)
8974 {
8975 split_quantity_new = new_item.GetQuantityMax();
8976 }
8978 {
8981 }
8982 else
8983 {
8986 }
8987 }
8988 }
8989
8992 {
8993 SetWeightDirty();
8995
8996 if (parent)
8997 parent.OnAttachmentQuantityChangedEx(this, delta);
8998
9000 {
9002 {
9004 }
9006 {
9007 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9009 }
9010 }
9011
9012 }
9013
9016 {
9017
9018 }
9019
9022 {
9024 }
9025
9027 {
9028 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9029
9031 {
9032 if (newLevel == GameConstants.STATE_RUINED)
9033 {
9035 EntityAI parent = GetHierarchyParent();
9036 if (parent && parent.IsFireplace())
9037 {
9038 CargoBase cargo = GetInventory().GetCargo();
9039 if (cargo)
9040 {
9042 {
9044 }
9045 }
9046 }
9047 }
9048
9050 {
9051
9053 return;
9054 }
9055
9056 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9057 {
9059 }
9060 }
9061 }
9062
9063
9065 {
9066 super.OnRightClick();
9067
9069 {
9071 {
9072 if (ScriptInputUserData.CanStoreInputUserData())
9073 {
9074 vector m4[4];
9076
9077 EntityAI root = GetHierarchyRoot();
9078
9079 InventoryLocation dst = new InventoryLocation;
9081 {
9082 if (root)
9083 {
9084 root.GetTransform(m4);
9086 }
9087 else
9088 GetInventory().GetCurrentInventoryLocation(dst);
9089 }
9090 else
9091 {
9093
9094
9095 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9096 {
9097 if (root)
9098 {
9099 root.GetTransform(m4);
9101 }
9102 else
9103 GetInventory().GetCurrentInventoryLocation(dst);
9104 }
9105 else
9106 {
9107 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9108 }
9109 }
9110
9111 ScriptInputUserData ctx = new ScriptInputUserData;
9119 }
9120 }
9121 else if (!
GetGame().IsMultiplayer())
9122 {
9124 }
9125 }
9126 }
9127
9128 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9129 {
9130
9131 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9132 return false;
9133
9134 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9135 return false;
9136
9137
9139 return false;
9140
9141
9142 Magazine mag = Magazine.Cast(this);
9143 if (mag)
9144 {
9145 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9146 return false;
9147
9148 if (stack_max_limit)
9149 {
9150 Magazine other_mag = Magazine.Cast(other_item);
9151 if (other_item)
9152 {
9153 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9154 return false;
9155 }
9156
9157 }
9158 }
9159 else
9160 {
9161
9163 return false;
9164
9166 return false;
9167 }
9168
9169 PlayerBase player = null;
9170 if (CastTo(player, GetHierarchyRootPlayer()))
9171 {
9172 if (player.GetInventory().HasAttachment(this))
9173 return false;
9174
9175 if (player.IsItemsToDelete())
9176 return false;
9177 }
9178
9179 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9180 return false;
9181
9182 int slotID;
9184 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9185 return false;
9186
9187 return true;
9188 }
9189
9191 {
9193 }
9194
9196 {
9197 return m_IsResultOfSplit;
9198 }
9199
9201 {
9202 m_IsResultOfSplit = value;
9203 }
9204
9206 {
9208 }
9209
9211 {
9212 float other_item_quantity = other_item.GetQuantity();
9213 float this_free_space;
9214
9216
9218
9219 if (other_item_quantity > this_free_space)
9220 {
9221 return this_free_space;
9222 }
9223 else
9224 {
9225 return other_item_quantity;
9226 }
9227 }
9228
9230 {
9232 }
9233
9235 {
9237 return;
9238
9239 if (!IsMagazine() && other_item)
9240 {
9242 if (quantity_used != 0)
9243 {
9244 float hp1 = GetHealth01("","");
9245 float hp2 = other_item.GetHealth01("","");
9246 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9247 hpResult = hpResult / (
GetQuantity() + quantity_used);
9248
9249 hpResult *= GetMaxHealth();
9250 Math.Round(hpResult);
9251 SetHealth("", "Health", hpResult);
9252
9254 other_item.AddQuantity(-quantity_used);
9255 }
9256 }
9258 }
9259
9261 {
9262 #ifdef SERVER
9263 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9264 GetHierarchyParent().IncreaseLifetimeUp();
9265 #endif
9266 };
9267
9269 {
9270 PlayerBase p = PlayerBase.Cast(player);
9271
9272 array<int> recipesIds = p.m_Recipes;
9273 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9274 if (moduleRecipesManager)
9275 {
9276 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9277 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9278 }
9279
9280 for (int i = 0;i < recipesIds.Count(); i++)
9281 {
9282 int key = recipesIds.Get(i);
9283 string recipeName = moduleRecipesManager.GetRecipeName(key);
9285 }
9286 }
9287
9288
9289 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9290 {
9291 super.GetDebugActions(outputList);
9292
9293
9298
9299
9303
9307
9308
9311
9312
9314 {
9317 }
9318
9320
9323
9327 }
9328
9329
9330
9331
9333 {
9334 super.OnAction(action_id, player, ctx);
9335 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9336 {
9337 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9338 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9339 PlayerBase p = PlayerBase.Cast(player);
9340 if (
EActions.RECIPES_RANGE_START < 1000)
9341 {
9342 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9343 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9344 }
9345 }
9346 #ifndef SERVER
9347 else if (action_id ==
EActions.WATCH_PLAYER)
9348 {
9349 PluginDeveloper.SetDeveloperItemClientEx(player);
9350 }
9351 #endif
9353 {
9354 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9355 {
9356 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9357 OnDebugButtonPressServer(id + 1);
9358 }
9359
9360 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9361 {
9362 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9364 }
9365
9366 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9367 {
9368 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9370 }
9371
9372 else if (action_id ==
EActions.ADD_QUANTITY)
9373 {
9374 if (IsMagazine())
9375 {
9376 Magazine mag = Magazine.Cast(this);
9377 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9378 }
9379 else
9380 {
9382 }
9383
9384 if (m_EM)
9385 {
9386 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9387 }
9388
9389 }
9390
9391 else if (action_id ==
EActions.REMOVE_QUANTITY)
9392 {
9393 if (IsMagazine())
9394 {
9395 Magazine mag2 = Magazine.Cast(this);
9396 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9397 }
9398 else
9399 {
9401 }
9402 if (m_EM)
9403 {
9404 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9405 }
9406
9407 }
9408
9409 else if (action_id ==
EActions.SET_QUANTITY_0)
9410 {
9412
9413 if (m_EM)
9414 {
9415 m_EM.SetEnergy(0);
9416 }
9417 }
9418
9419 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9420 {
9422
9423 if (m_EM)
9424 {
9425 m_EM.SetEnergy(m_EM.GetEnergyMax());
9426 }
9427 }
9428
9429 else if (action_id ==
EActions.ADD_HEALTH)
9430 {
9431 AddHealth("","",GetMaxHealth("","Health")/5);
9432 }
9433 else if (action_id ==
EActions.REMOVE_HEALTH)
9434 {
9435 AddHealth("","",-GetMaxHealth("","Health")/5);
9436 }
9437 else if (action_id ==
EActions.DESTROY_HEALTH)
9438 {
9439 SetHealth01("","",0);
9440 }
9441 else if (action_id ==
EActions.WATCH_ITEM)
9442 {
9444 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9445 #ifdef DEVELOPER
9446 SetDebugDeveloper_item(this);
9447 #endif
9448 }
9449
9450 else if (action_id ==
EActions.ADD_TEMPERATURE)
9451 {
9452 AddTemperature(20);
9453
9454 }
9455
9456 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9457 {
9458 AddTemperature(-20);
9459
9460 }
9461
9462 else if (action_id ==
EActions.FLIP_FROZEN)
9463 {
9464 SetFrozen(!GetIsFrozen());
9465
9466 }
9467
9468 else if (action_id ==
EActions.ADD_WETNESS)
9469 {
9471
9472 }
9473
9474 else if (action_id ==
EActions.REMOVE_WETNESS)
9475 {
9477
9478 }
9479
9480 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9481 {
9484
9485
9486 }
9487
9488 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9489 {
9492 }
9493
9494 else if (action_id ==
EActions.MAKE_SPECIAL)
9495 {
9496 auto debugParams = DebugSpawnParams.WithPlayer(player);
9497 OnDebugSpawnEx(debugParams);
9498 }
9499
9500 else if (action_id ==
EActions.DELETE)
9501 {
9502 Delete();
9503 }
9504
9505 }
9506
9507
9508 return false;
9509 }
9510
9511
9512
9513
9517
9520
9521
9522
9524 {
9525 return false;
9526 }
9527
9528
9530 {
9531 return true;
9532 }
9533
9534
9536 {
9537 return true;
9538 }
9539
9540
9541
9543 {
9544 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9546 }
9547
9550 {
9551 return null;
9552 }
9553
9555 {
9556 return false;
9557 }
9558
9560 {
9561 return false;
9562 }
9563
9567
9568
9570 {
9571 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9572 return module_repairing.CanRepair(this, item_repair_kit);
9573 }
9574
9575
9576 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9577 {
9578 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9579 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9580 }
9581
9582
9584 {
9585
9586
9587
9588
9589
9590
9591
9592
9593 return 1;
9594 }
9595
9596
9597
9599 {
9601 }
9602
9603
9604
9606 {
9608 }
9609
9610
9619 {
9620 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9621
9622 if (player)
9623 {
9624 player.MessageStatus(text);
9625 }
9626 }
9627
9628
9637 {
9638 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9639
9640 if (player)
9641 {
9642 player.MessageAction(text);
9643 }
9644 }
9645
9646
9655 {
9656 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9657
9658 if (player)
9659 {
9660 player.MessageFriendly(text);
9661 }
9662 }
9663
9664
9673 {
9674 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9675
9676 if (player)
9677 {
9678 player.MessageImportant(text);
9679 }
9680 }
9681
9683 {
9684 return true;
9685 }
9686
9687
9688 override bool KindOf(
string tag)
9689 {
9690 bool found = false;
9691 string item_name = this.
GetType();
9694
9695 int array_size = item_tag_array.Count();
9696 for (int i = 0; i < array_size; i++)
9697 {
9698 if (item_tag_array.Get(i) == tag)
9699 {
9700 found = true;
9701 break;
9702 }
9703 }
9704 return found;
9705 }
9706
9707
9709 {
9710
9711 super.OnRPC(sender, rpc_type,ctx);
9712
9713
9714 switch (rpc_type)
9715 {
9716 #ifndef SERVER
9717 case ERPCs.RPC_SOUND_LOCK_ATTACH:
9718 Param2<bool, string> p = new Param2<bool, string>(false, "");
9719
9721 return;
9722
9723 bool play = p.param1;
9724 string soundSet = p.param2;
9725
9726 if (play)
9727 {
9729 {
9731 {
9733 }
9734 }
9735 else
9736 {
9738 }
9739 }
9740 else
9741 {
9743 }
9744
9745 break;
9746 #endif
9747
9748 }
9749
9751 {
9753 }
9754 }
9755
9756
9757
9758
9760 {
9761 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9762 return plugin.GetID(
name);
9763 }
9764
9766 {
9767 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9768 return plugin.GetName(id);
9769 }
9770
9773 {
9774
9775
9776 int varFlags;
9777 if (!ctx.
Read(varFlags))
9778 return;
9779
9780 if (varFlags & ItemVariableFlags.FLOAT)
9781 {
9783 }
9784 }
9785
9787 {
9788
9789 super.SerializeNumericalVars(floats_out);
9790
9791
9792
9794 {
9796 }
9797
9799 {
9801 }
9802
9804 {
9806 }
9807
9809 {
9814 }
9815
9817 {
9819 }
9820 }
9821
9823 {
9824
9825 super.DeSerializeNumericalVars(floats);
9826
9827
9828 int index = 0;
9829 int mask = Math.Round(floats.Get(index));
9830
9831 index++;
9832
9834 {
9836 {
9838 }
9839 else
9840 {
9841 float quantity = floats.Get(index);
9843 }
9844 index++;
9845 }
9846
9848 {
9849 float wet = floats.Get(index);
9851 index++;
9852 }
9853
9855 {
9856 int liquidtype = Math.Round(floats.Get(index));
9858 index++;
9859 }
9860
9862 {
9864 index++;
9866 index++;
9868 index++;
9870 index++;
9871 }
9872
9874 {
9875 int cleanness = Math.Round(floats.Get(index));
9877 index++;
9878 }
9879 }
9880
9882 {
9883 super.WriteVarsToCTX(ctx);
9884
9885
9887 {
9889 }
9890
9892 {
9894 }
9895
9897 {
9899 }
9900
9902 {
9903 int r,g,b,a;
9909 }
9910
9912 {
9914 }
9915 }
9916
9918 {
9919 if (!super.ReadVarsFromCTX(ctx,version))
9920 return false;
9921
9922 int intValue;
9923 float value;
9924
9925 if (version < 140)
9926 {
9927 if (!ctx.
Read(intValue))
9928 return false;
9929
9930 m_VariablesMask = intValue;
9931 }
9932
9934 {
9935 if (!ctx.
Read(value))
9936 return false;
9937
9939 {
9941 }
9942 else
9943 {
9945 }
9946 }
9947
9948 if (version < 140)
9949 {
9951 {
9952 if (!ctx.
Read(value))
9953 return false;
9954 SetTemperatureDirect(value);
9955 }
9956 }
9957
9959 {
9960 if (!ctx.
Read(value))
9961 return false;
9963 }
9964
9966 {
9967 if (!ctx.
Read(intValue))
9968 return false;
9970 }
9971
9973 {
9974 int r,g,b,a;
9976 return false;
9978 return false;
9980 return false;
9982 return false;
9983
9985 }
9986
9988 {
9989 if (!ctx.
Read(intValue))
9990 return false;
9992 }
9993
9994 if (version >= 138 && version < 140)
9995 {
9997 {
9998 if (!ctx.
Read(intValue))
9999 return false;
10000 SetFrozen(intValue);
10001 }
10002 }
10003
10004 return true;
10005 }
10006
10007
10009 {
10012 {
10014 }
10015
10016 if (!super.OnStoreLoad(ctx, version))
10017 {
10019 return false;
10020 }
10021
10022 if (version >= 114)
10023 {
10024 bool hasQuickBarIndexSaved;
10025
10026 if (!ctx.
Read(hasQuickBarIndexSaved))
10027 {
10029 return false;
10030 }
10031
10032 if (hasQuickBarIndexSaved)
10033 {
10034 int itmQBIndex;
10035
10036
10037 if (!ctx.
Read(itmQBIndex))
10038 {
10040 return false;
10041 }
10042
10043 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10044 if (itmQBIndex != -1 && parentPlayer)
10045 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10046 }
10047 }
10048 else
10049 {
10050
10051 PlayerBase player;
10052 int itemQBIndex;
10053 if (version ==
int.
MAX)
10054 {
10055 if (!ctx.
Read(itemQBIndex))
10056 {
10058 return false;
10059 }
10060 }
10061 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10062 {
10063
10064 if (!ctx.
Read(itemQBIndex))
10065 {
10067 return false;
10068 }
10069 if (itemQBIndex != -1 && player)
10070 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10071 }
10072 }
10073
10074 if (version < 140)
10075 {
10076
10077 if (!LoadVariables(ctx, version))
10078 {
10080 return false;
10081 }
10082 }
10083
10084
10086 {
10088 return false;
10089 }
10090 if (version >= 132)
10091 {
10093 if (raib)
10094 {
10096 {
10098 return false;
10099 }
10100 }
10101 }
10102
10104 return true;
10105 }
10106
10107
10108
10110 {
10111 super.OnStoreSave(ctx);
10112
10113 PlayerBase player;
10114 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10115 {
10117
10118 int itemQBIndex = -1;
10119 itemQBIndex = player.FindQuickBarEntityIndex(this);
10120 ctx.
Write(itemQBIndex);
10121 }
10122 else
10123 {
10125 }
10126
10128
10130 if (raib)
10131 {
10133 }
10134 }
10135
10136
10138 {
10139 super.AfterStoreLoad();
10140
10142 {
10144 }
10145
10147 {
10150 }
10151 }
10152
10154 {
10155 super.EEOnAfterLoad();
10156
10158 {
10160 }
10161
10164 }
10165
10167 {
10168 return false;
10169 }
10170
10171
10172
10174 {
10176 {
10177 #ifdef PLATFORM_CONSOLE
10178
10180 {
10182 if (menu)
10183 {
10185 }
10186 }
10187 #endif
10188 }
10189
10191 {
10194 }
10195
10197 {
10198 SetWeightDirty();
10200 }
10202 {
10205 }
10206
10208 {
10211 }
10213 {
10216 }
10217
10218 super.OnVariablesSynchronized();
10219 }
10220
10221
10222
10224 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10225 {
10226 if (!IsServerCheck(allow_client))
10227 return false;
10228
10230 return false;
10231
10234
10235 if (value <= (min + 0.001))
10236 value = min;
10237
10238 if (value == min)
10239 {
10240 if (destroy_config)
10241 {
10242 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10243 if (dstr)
10244 {
10246 this.Delete();
10247 return true;
10248 }
10249 }
10250 else if (destroy_forced)
10251 {
10253 this.Delete();
10254 return true;
10255 }
10256
10258 }
10259
10262
10264 {
10266
10267 if (delta)
10269 }
10270
10272
10273 return false;
10274 }
10275
10276
10278 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10279 {
10281 }
10282
10284 {
10287 }
10288
10290 {
10293 }
10294
10297 {
10298 float value_clamped = Math.Clamp(value, 0, 1);
10300 SetQuantity(result, destroy_config, destroy_forced);
10301 }
10302
10303
10306 {
10308 }
10309
10311 {
10313 }
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10325 {
10326 int slot = -1;
10327 if (GetInventory())
10328 {
10329 InventoryLocation il = new InventoryLocation;
10330 GetInventory().GetCurrentInventoryLocation(il);
10332 }
10333
10335 }
10336
10338 {
10339 float quantity_max = 0;
10340
10342 {
10343 if (attSlotID != -1)
10344 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10345
10346 if (quantity_max <= 0)
10348 }
10349
10350 if (quantity_max <= 0)
10352
10353 return quantity_max;
10354 }
10355
10357 {
10359 }
10360
10362 {
10364 }
10365
10366
10368 {
10370 }
10371
10373 {
10375 }
10376
10378 {
10380 }
10381
10382
10384 {
10385
10386 float weightEx = GetWeightEx();
10387 float special = GetInventoryAndCargoWeight();
10388 return weightEx - special;
10389 }
10390
10391
10393 {
10395 }
10396
10398 {
10400 {
10401 #ifdef DEVELOPER
10402 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10403 {
10404 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10406 }
10407 #endif
10408
10409 return GetQuantity() * GetConfigWeightModified();
10410 }
10411 else if (HasEnergyManager())
10412 {
10413 #ifdef DEVELOPER
10414 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10415 {
10416 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10417 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10418 }
10419 #endif
10420 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10421 }
10422 else
10423 {
10424 #ifdef DEVELOPER
10425 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10426 {
10427 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10428 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10429 }
10430 #endif
10431 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10432 }
10433 }
10434
10437 {
10438 int item_count = 0;
10440
10441 if (GetInventory().GetCargo() != NULL)
10442 {
10443 item_count = GetInventory().GetCargo().GetItemCount();
10444 }
10445
10446 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10447 {
10448 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10449 if (item)
10450 item_count += item.GetNumberOfItems();
10451 }
10452 return item_count;
10453 }
10454
10457 {
10458 float weight = 0;
10459 float wetness = 1;
10460 if (include_wetness)
10463 {
10464 weight = wetness * m_ConfigWeight;
10465 }
10467 {
10468 weight = 1;
10469 }
10470 return weight;
10471 }
10472
10473
10474
10476 {
10477 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10478 {
10479 GameInventory inv = GetInventory();
10480 array<EntityAI> items = new array<EntityAI>;
10482 for (int i = 0; i < items.Count(); i++)
10483 {
10485 if (item)
10486 {
10488 }
10489 }
10490 }
10491 }
10492
10493
10494
10495
10497 {
10498 float energy = 0;
10499 if (HasEnergyManager())
10500 {
10501 energy = GetCompEM().GetEnergy();
10502 }
10503 return energy;
10504 }
10505
10506
10508 {
10509 super.OnEnergyConsumed();
10510
10512 }
10513
10515 {
10516 super.OnEnergyAdded();
10517
10519 }
10520
10521
10523 {
10524 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10525 {
10527 {
10528 float energy_0to1 = GetCompEM().GetEnergy0To1();
10530 }
10531 }
10532 }
10533
10534
10536 {
10537 return ConfigGetFloat("heatIsolation");
10538 }
10539
10541 {
10543 }
10544
10546 {
10547 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10548 if (
GetGame().ConfigIsExisting(paramPath))
10550
10551 return 0.0;
10552 }
10553
10555 {
10556 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10557 if (
GetGame().ConfigIsExisting(paramPath))
10559
10560 return 0.0;
10561 }
10562
10563 override void SetWet(
float value,
bool allow_client =
false)
10564 {
10565 if (!IsServerCheck(allow_client))
10566 return;
10567
10570
10572
10573 m_VarWet = Math.Clamp(value, min, max);
10574
10576 {
10579 }
10580 }
10581
10582 override void AddWet(
float value)
10583 {
10585 }
10586
10588 {
10590 }
10591
10593 {
10595 }
10596
10598 {
10600 }
10601
10603 {
10605 }
10606
10608 {
10610 }
10611
10612 override void OnWetChanged(
float newVal,
float oldVal)
10613 {
10616 if (newLevel != oldLevel)
10617 {
10619 }
10620 }
10621
10623 {
10624 SetWeightDirty();
10625 }
10626
10628 {
10629 return GetWetLevelInternal(
m_VarWet);
10630 }
10631
10632
10633
10635 {
10637 }
10638
10640 {
10642 }
10643
10645 {
10647 }
10648
10650 {
10652 }
10653
10654
10655
10657 {
10658 if (ConfigIsExisting("itemModelLength"))
10659 {
10660 return ConfigGetFloat("itemModelLength");
10661 }
10662 return 0;
10663 }
10664
10666 {
10667 if (ConfigIsExisting("itemAttachOffset"))
10668 {
10669 return ConfigGetFloat("itemAttachOffset");
10670 }
10671 return 0;
10672 }
10673
10674 override void SetCleanness(
int value,
bool allow_client =
false)
10675 {
10676 if (!IsServerCheck(allow_client))
10677 return;
10678
10680
10682
10685 }
10686
10688 {
10690 }
10691
10693 {
10694 return true;
10695 }
10696
10697
10698
10699
10701 {
10703 }
10704
10706 {
10708 }
10709
10710
10711
10712
10713 override void SetColor(
int r,
int g,
int b,
int a)
10714 {
10720 }
10722 override void GetColor(out
int r,out
int g,out
int b,out
int a)
10723 {
10728 }
10729
10731 {
10733 }
10734
10737 {
10738 int r,g,b,a;
10740 r = r/255;
10741 g = g/255;
10742 b = b/255;
10743 a = a/255;
10744 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10745 }
10746
10747
10748
10749 override void SetLiquidType(
int value,
bool allow_client =
false)
10750 {
10751 if (!IsServerCheck(allow_client))
10752 return;
10753
10758 }
10759
10761 {
10762 return ConfigGetInt("varLiquidTypeInit");
10763 }
10764
10766 {
10768 }
10769
10771 {
10773 SetFrozen(false);
10774 }
10775
10778 {
10779 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10780 }
10781
10782
10785 {
10786 PlayerBase nplayer;
10787 if (PlayerBase.CastTo(nplayer, player))
10788 {
10790
10791 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10792 }
10793 }
10794
10795
10798 {
10799 PlayerBase nplayer;
10800 if (PlayerBase.CastTo(nplayer,player))
10801 {
10802
10803 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10804
10805 }
10806
10807
10808 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10809
10810
10811 if (HasEnergyManager())
10812 {
10813 GetCompEM().UpdatePlugState();
10814 }
10815 }
10816
10817
10819 {
10820 super.OnPlacementStarted(player);
10821
10823 }
10824
10825 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
10826 {
10828 {
10829 m_AdminLog.OnPlacementComplete(player,
this);
10830 }
10831
10832 super.OnPlacementComplete(player, position, orientation);
10833 }
10834
10835
10836
10837
10838
10840 {
10842 {
10843 return true;
10844 }
10845 else
10846 {
10847 return false;
10848 }
10849 }
10850
10851
10853 {
10855 {
10857 }
10858 }
10859
10860
10862 {
10864 }
10865
10867 {
10869 }
10870
10871 override void InsertAgent(
int agent,
float count = 1)
10872 {
10873 if (count < 1)
10874 return;
10875
10877 }
10878
10881 {
10883 }
10884
10885
10887 {
10889 }
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929
10930
10931
10933 {
10935 return false;
10936 return true;
10937 }
10938
10940 {
10941
10943 }
10944
10945
10948 {
10949 super.CheckForRoofLimited(timeTresholdMS);
10950
10952 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
10953 {
10954 m_PreviousRoofTestTime = time;
10955 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
10956 }
10957 }
10958
10959
10961 {
10963 {
10964 return 0;
10965 }
10966
10967 if (GetInventory().GetAttachmentSlotsCount() != 0)
10968 {
10969 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
10970 if (filter)
10971 return filter.GetProtectionLevel(type, false, system);
10972 else
10973 return 0;
10974 }
10975
10976 string subclassPath, entryName;
10977
10978 switch (type)
10979 {
10981 entryName = "biological";
10982 break;
10984 entryName = "chemical";
10985 break;
10986 default:
10987 entryName = "biological";
10988 break;
10989 }
10990
10991 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
10992
10994 }
10995
10996
10997
11000 {
11001 if (!IsMagazine())
11003
11005 }
11006
11007
11008
11009
11010
11015 {
11016 return true;
11017 }
11018
11020 {
11022 }
11023
11024
11025
11026
11027
11029 {
11030 if (parent)
11031 {
11032 if (parent.IsInherited(DayZInfected))
11033 return true;
11034
11035 if (!parent.IsRuined())
11036 return true;
11037 }
11038
11039 return true;
11040 }
11041
11043 {
11044 if (!super.CanPutAsAttachment(parent))
11045 {
11046 return false;
11047 }
11048
11049 if (!IsRuined() && !parent.IsRuined())
11050 {
11051 return true;
11052 }
11053
11054 return false;
11055 }
11056
11058 {
11059
11060
11061
11062
11063 return super.CanReceiveItemIntoCargo(item);
11064 }
11065
11067 {
11068
11069
11070
11071
11072 GameInventory attachmentInv = attachment.GetInventory();
11074 {
11075 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11076 return false;
11077 }
11078
11079 InventoryLocation loc = new InventoryLocation();
11080 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11081 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11082 return false;
11083
11084 return super.CanReceiveAttachment(attachment, slotId);
11085 }
11086
11088 {
11089 if (!super.CanReleaseAttachment(attachment))
11090 return false;
11091
11092 return GetInventory().AreChildrenAccessible();
11093 }
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103
11104
11105
11106
11107
11108
11109
11110
11111
11112
11113
11114
11116 {
11117 int id = muzzle_owner.GetMuzzleID();
11118 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11119
11120 if (WPOF_array)
11121 {
11122 for (int i = 0; i < WPOF_array.Count(); i++)
11123 {
11124 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11125
11126 if (WPOF)
11127 {
11128 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11129 }
11130 }
11131 }
11132 }
11133
11134
11136 {
11137 int id = muzzle_owner.GetMuzzleID();
11139
11140 if (WPOBE_array)
11141 {
11142 for (int i = 0; i < WPOBE_array.Count(); i++)
11143 {
11144 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11145
11146 if (WPOBE)
11147 {
11148 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11149 }
11150 }
11151 }
11152 }
11153
11154
11156 {
11157 int id = muzzle_owner.GetMuzzleID();
11158 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11159
11160 if (WPOOH_array)
11161 {
11162 for (int i = 0; i < WPOOH_array.Count(); i++)
11163 {
11164 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11165
11166 if (WPOOH)
11167 {
11168 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11169 }
11170 }
11171 }
11172 }
11173
11174
11176 {
11177 int id = muzzle_owner.GetMuzzleID();
11178 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11179
11180 if (WPOOH_array)
11181 {
11182 for (int i = 0; i < WPOOH_array.Count(); i++)
11183 {
11184 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11185
11186 if (WPOOH)
11187 {
11188 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11189 }
11190 }
11191 }
11192 }
11193
11194
11196 {
11197 int id = muzzle_owner.GetMuzzleID();
11198 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11199
11200 if (WPOOH_array)
11201 {
11202 for (int i = 0; i < WPOOH_array.Count(); i++)
11203 {
11204 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11205
11206 if (WPOOH)
11207 {
11208 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11209 }
11210 }
11211 }
11212 }
11213
11214
11215
11217 {
11219 {
11220 return true;
11221 }
11222
11223 return false;
11224 }
11225
11227 {
11229 {
11230 return true;
11231 }
11232
11233 return false;
11234 }
11235
11237 {
11239 {
11240 return true;
11241 }
11242
11243 return false;
11244 }
11245
11247 {
11248 return false;
11249 }
11250
11253 {
11254 return UATimeSpent.DEFAULT_DEPLOY;
11255 }
11256
11257
11258
11259
11261 {
11263 SetSynchDirty();
11264 }
11265
11267 {
11269 }
11270
11271
11273 {
11274 return false;
11275 }
11276
11279 {
11280 string att_type = "None";
11281
11282 if (ConfigIsExisting("soundAttType"))
11283 {
11284 att_type = ConfigGetString("soundAttType");
11285 }
11286
11288 }
11289
11291 {
11293 }
11294
11295
11296
11297
11298
11302
11304 {
11307
11309 }
11310
11311
11313 {
11315 return;
11316
11318
11321
11324
11325 SoundParameters params = new SoundParameters();
11329 }
11330
11331
11333 {
11335 return;
11336
11338 SetSynchDirty();
11339
11342 }
11343
11344
11346 {
11348 return;
11349
11351 SetSynchDirty();
11352
11355 }
11356
11358 {
11360 }
11361
11363 {
11365 }
11366
11369 {
11370 if (!
GetGame().IsDedicatedServer())
11371 {
11372 if (ConfigIsExisting("attachSoundSet"))
11373 {
11374 string cfg_path = "";
11375 string soundset = "";
11376 string type_name =
GetType();
11377
11380 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11381 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11382
11383 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11384 {
11385 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11386 {
11387 if (cfg_slot_array[i] == slot_type)
11388 {
11389 soundset = cfg_soundset_array[i];
11390 break;
11391 }
11392 }
11393 }
11394
11395 if (soundset != "")
11396 {
11397 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11399 }
11400 }
11401 }
11402 }
11403
11405 {
11406
11407 }
11408
11409 void OnApply(PlayerBase player);
11410
11412 {
11413 return 1.0;
11414 };
11415
11417 {
11419 }
11420
11422 {
11424 }
11425
11427
11429 {
11430 SetDynamicPhysicsLifeTime(0.01);
11432 }
11433
11435 {
11436 array<string> zone_names = new array<string>;
11437 GetDamageZones(zone_names);
11438 for (int i = 0; i < zone_names.Count(); i++)
11439 {
11440 SetHealthMax(zone_names.Get(i),"Health");
11441 }
11442 SetHealthMax("","Health");
11443 }
11444
11447 {
11448 float global_health = GetHealth01("","Health");
11449 array<string> zones = new array<string>;
11450 GetDamageZones(zones);
11451
11452 for (int i = 0; i < zones.Count(); i++)
11453 {
11454 SetHealth01(zones.Get(i),"Health",global_health);
11455 }
11456 }
11457
11460 {
11461 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11462 }
11463
11465 {
11466 if (!hasRootAsPlayer)
11467 {
11468 if (refParentIB)
11469 {
11470
11471 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11472 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11473
11474 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11475 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11476
11479 }
11480 else
11481 {
11482
11485 }
11486 }
11487 }
11488
11490 {
11492 {
11493 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11494 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11495 {
11496 float heatPermCoef = 1.0;
11498 while (ent)
11499 {
11500 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11501 ent = ent.GetHierarchyParent();
11502 }
11503
11504 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11505 }
11506 }
11507 }
11508
11510 {
11511
11512 EntityAI parent = GetHierarchyParent();
11513 if (!parent)
11514 {
11515 hasParent = false;
11516 hasRootAsPlayer = false;
11517 }
11518 else
11519 {
11520 hasParent = true;
11521 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11522 refParentIB =
ItemBase.Cast(parent);
11523 }
11524 }
11525
11526 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11527 {
11528
11529 }
11530
11532 {
11533
11534 return false;
11535 }
11536
11538 {
11539
11540
11541 return false;
11542 }
11543
11545 {
11546
11547 return false;
11548 }
11549
11552 {
11553 return !GetIsFrozen() &&
IsOpen();
11554 }
11555
11557 {
11558 bool hasParent = false, hasRootAsPlayer = false;
11560
11561 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11562 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11563
11564 if (wwtu || foodDecay)
11565 {
11569
11570 if (processWetness || processTemperature || processDecay)
11571 {
11573
11574 if (processWetness)
11575 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11576
11577 if (processTemperature)
11579
11580 if (processDecay)
11581 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11582 }
11583 }
11584 }
11585
11588 {
11590 }
11591
11593 {
11596
11597 return super.GetTemperatureFreezeThreshold();
11598 }
11599
11601 {
11604
11605 return super.GetTemperatureThawThreshold();
11606 }
11607
11609 {
11612
11613 return super.GetItemOverheatThreshold();
11614 }
11615
11617 {
11619 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11620
11621 return super.GetTemperatureFreezeTime();
11622 }
11623
11625 {
11627 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11628
11629 return super.GetTemperatureThawTime();
11630 }
11631
11636
11638 {
11639 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11640 }
11641
11643 {
11644 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11645 }
11646
11649 {
11651 }
11652
11654 {
11656 }
11657
11659 {
11661 }
11662
11665 {
11666 return null;
11667 }
11668
11671 {
11672 return false;
11673 }
11674
11676 {
11678 {
11681 if (!trg)
11682 {
11684 explosive = this;
11685 }
11686
11687 explosive.PairRemote(trg);
11689
11690 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
11691 trg.SetPersistentPairID(persistentID);
11692 explosive.SetPersistentPairID(persistentID);
11693
11694 return true;
11695 }
11696 return false;
11697 }
11698
11701 {
11702 float ret = 1.0;
11705 ret *= GetHealth01();
11706
11707 return ret;
11708 }
11709
11710 #ifdef DEVELOPER
11711 override void SetDebugItem()
11712 {
11713 super.SetDebugItem();
11714 _itemBase = this;
11715 }
11716
11718 {
11719 string text = super.GetDebugText();
11720
11722 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
11723
11724 return text;
11725 }
11726 #endif
11727
11729 {
11730 return true;
11731 }
11732
11734
11736
11738 {
11741 }
11742
11743
11751
11767}
11768
11770{
11772 if (entity)
11773 {
11774 bool is_item = entity.IsInherited(
ItemBase);
11775 if (is_item && full_quantity)
11776 {
11779 }
11780 }
11781 else
11782 {
11784 return NULL;
11785 }
11786 return entity;
11787}
11788
11790{
11791 if (item)
11792 {
11793 if (health > 0)
11794 item.SetHealth("", "", health);
11795
11796 if (item.CanHaveTemperature())
11797 {
11799 if (item.CanFreeze())
11800 item.SetFrozen(false);
11801 }
11802
11803 if (item.HasEnergyManager())
11804 {
11805 if (quantity >= 0)
11806 {
11807 item.GetCompEM().SetEnergy0To1(quantity);
11808 }
11809 else
11810 {
11812 }
11813 }
11814 else if (item.IsMagazine())
11815 {
11816 Magazine mag = Magazine.Cast(item);
11817 if (quantity >= 0)
11818 {
11819 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11820 }
11821 else
11822 {
11824 }
11825
11826 }
11827 else
11828 {
11829 if (quantity >= 0)
11830 {
11831 item.SetQuantityNormalized(quantity, false);
11832 }
11833 else
11834 {
11836 }
11837
11838 }
11839 }
11840}
11841
11842#ifdef DEVELOPER
11844#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.