7006{
7008 {
7009 return true;
7010 }
7011};
7012
7013
7014
7016{
7020
7022
7025
7026
7027
7028
7029
7038
7044
7049
7054
7075 protected bool m_IsResultOfSplit
7076
7078
7083
7084
7085
7087
7091
7092
7093
7095
7098
7099
7100
7106
7107
7115
7118
7119
7121
7122
7124
7125
7130
7131
7136
7137
7139
7140
7142 {
7147
7148 if (!
GetGame().IsDedicatedServer())
7149 {
7151 {
7153
7155 {
7157 }
7158 }
7159
7162 }
7163
7164 m_OldLocation = null;
7165
7167 {
7169 }
7170
7171 if (ConfigIsExisting("headSelectionsToHide"))
7172 {
7175 }
7176
7178 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7179 {
7181 }
7182
7184
7185 m_IsResultOfSplit = false;
7186
7188 }
7189
7191 {
7192 super.InitItemVariables();
7193
7199 m_Count = ConfigGetInt(
"count");
7200
7203
7208
7211
7216
7228
7232
7233
7236 if (ConfigIsExisting("canBeSplit"))
7237 {
7240 }
7241
7243 if (ConfigIsExisting("itemBehaviour"))
7245
7246
7249 RegisterNetSyncVariableInt("m_VarLiquidType");
7250 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7251
7252 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7253 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7254 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7255
7256 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7257 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7258 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7259 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7260
7261 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7262 RegisterNetSyncVariableBool("m_IsTakeable");
7263 RegisterNetSyncVariableBool("m_IsHologram");
7264
7267 {
7270 }
7271
7273
7275 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7277
7278 }
7279
7281 {
7283 }
7284
7286 {
7289 {
7294 }
7295 }
7296
7297 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7298 {
7300 {
7303 }
7304
7306 }
7307
7309 {
7315 }
7316
7318
7320 {
7322
7323 if (!action)
7324 {
7325 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7326 return;
7327 }
7328
7330 if (!ai)
7331 {
7333 return;
7334 }
7335
7337 if (!action_array)
7338 {
7339 action_array = new array<ActionBase_Basic>;
7341 }
7342 if (LogManager.IsActionLogEnable())
7343 {
7344 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7345 }
7346
7347 if (action_array.Find(action) != -1)
7348 {
7349 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7350 }
7351 else
7352 {
7353 action_array.Insert(action);
7354 }
7355 }
7356
7358 {
7360 ActionBase action = player.GetActionManager().GetAction(actionName);
7363
7364 if (action_array)
7365 {
7366 action_array.RemoveItem(action);
7367 }
7368 }
7369
7370
7371
7373 {
7374 ActionOverrideData overrideData = new ActionOverrideData();
7378
7380 if (!actionMap)
7381 {
7384 }
7385
7386 actionMap.Insert(this.
Type(), overrideData);
7387
7388 }
7389
7391
7393
7394
7396 {
7399
7402
7403 string config_to_search = "CfgVehicles";
7404 string muzzle_owner_config;
7405
7407 {
7408 if (IsInherited(Weapon))
7409 config_to_search = "CfgWeapons";
7410
7411 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7412
7413 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7414
7416
7417 if (config_OnFire_subclass_count > 0)
7418 {
7419 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7420
7421 for (int i = 0; i < config_OnFire_subclass_count; i++)
7422 {
7423 string particle_class = "";
7425 string config_OnFire_entry = config_OnFire_class + particle_class;
7426 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7427 WPOF_array.Insert(WPOF);
7428 }
7429
7430
7432 }
7433 }
7434
7436 {
7437 config_to_search = "CfgWeapons";
7438 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7439
7440 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7441
7443
7444 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7445 {
7446 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7447
7448 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7449 {
7450 string particle_class2 = "";
7452 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7453 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7454 WPOBE_array.Insert(WPOBE);
7455 }
7456
7457
7459 }
7460 }
7461 }
7462
7463
7465 {
7468
7470 {
7471 string config_to_search = "CfgVehicles";
7472
7473 if (IsInherited(Weapon))
7474 config_to_search = "CfgWeapons";
7475
7476 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7477 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7478
7479 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7480 {
7481
7483
7485 {
7487 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7489 return;
7490 }
7491
7494
7495
7496
7498 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7499
7500 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7501 {
7502 string particle_class = "";
7504 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7506
7507 if (entry_type == CT_CLASS)
7508 {
7509 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7510 WPOOH_array.Insert(WPOF);
7511 }
7512 }
7513
7514
7516 }
7517 }
7518 }
7519
7521 {
7523 }
7524
7526 {
7528 {
7530
7533
7536
7537 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7538 }
7539 }
7540
7542 {
7544 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7545
7547 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7548
7550 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7551
7553 {
7555 }
7556 }
7557
7559 {
7561 }
7562
7564 {
7567 else
7569
7571 {
7574 }
7575 else
7576 {
7579
7582 }
7583
7585 }
7586
7588 {
7590 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7591 }
7592
7594 {
7596 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7598 }
7599
7601 {
7603 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7604 }
7605
7607 {
7610
7611 OverheatingParticle OP = new OverheatingParticle();
7616
7618 }
7619
7621 {
7624
7625 return -1;
7626 }
7627
7629 {
7631 {
7634
7635 for (int i = count; i > 0; --i)
7636 {
7637 int id = i - 1;
7640
7643
7644 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7645 {
7646 if (p)
7647 {
7650 }
7651 }
7652 }
7653 }
7654 }
7655
7657 {
7659 {
7661 {
7662 int id = i - 1;
7664
7665 if (OP)
7666 {
7668
7669 if (p)
7670 {
7672 }
7673
7674 delete OP;
7675 }
7676 }
7677
7680 }
7681 }
7682
7685 {
7686 return 0.0;
7687 }
7688
7689
7691 {
7692 return 250;
7693 }
7694
7696 {
7697 return 0;
7698 }
7699
7702 {
7704 return true;
7705
7706 return false;
7707 }
7708
7711 {
7714
7716 {
7718 }
7719 else
7720 {
7721
7723 }
7724
7726 }
7727
7734 {
7735 return -1;
7736 }
7737
7738
7739
7740
7742 {
7744 {
7746 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7747
7748 if (r_index >= 0)
7749 {
7750 InventoryLocation r_il = new InventoryLocation;
7751 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7752
7753 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7756 {
7757 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7758 }
7760 {
7761 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7762 }
7763
7764 }
7765
7766 player.GetHumanInventory().ClearUserReservedLocation(this);
7767 }
7768
7771 }
7772
7773
7774
7775
7777 {
7778 return ItemBase.m_DebugActionsMask;
7779 }
7780
7782 {
7783 return ItemBase.m_DebugActionsMask & mask;
7784 }
7785
7787 {
7788 ItemBase.m_DebugActionsMask = mask;
7789 }
7790
7792 {
7793 ItemBase.m_DebugActionsMask |= mask;
7794 }
7795
7797 {
7798 ItemBase.m_DebugActionsMask &= ~mask;
7799 }
7800
7802 {
7804 {
7806 }
7807 else
7808 {
7810 }
7811 }
7812
7813
7815 {
7816 if (GetEconomyProfile())
7817 {
7818 float q_max = GetEconomyProfile().GetQuantityMax();
7819 if (q_max > 0)
7820 {
7821 float q_min = GetEconomyProfile().GetQuantityMin();
7822 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7823
7825 {
7826 ComponentEnergyManager comp = GetCompEM();
7828 {
7830 }
7831 }
7833 {
7835
7836 }
7837
7838 }
7839 }
7840 }
7841
7844 {
7845 EntityAI parent = GetHierarchyParent();
7846
7847 if (parent)
7848 {
7849 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7850 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7851 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
7852 }
7853 }
7854
7857 {
7858 EntityAI parent = GetHierarchyParent();
7859
7860 if (parent)
7861 {
7862 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7863 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7864 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
7865 }
7866 }
7867
7869 {
7870
7871
7872
7873
7875
7877 {
7878 if (ScriptInputUserData.CanStoreInputUserData())
7879 {
7880 ScriptInputUserData ctx = new ScriptInputUserData;
7886 ctx.
Write(use_stack_max);
7889
7891 {
7892 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
7893 }
7894 }
7895 }
7896 else if (!
GetGame().IsMultiplayer())
7897 {
7899 }
7900 }
7901
7903 {
7905 }
7906
7908 {
7910 }
7911
7913 {
7915 }
7916
7918 {
7919
7920 return false;
7921 }
7922
7924 {
7925 return false;
7926 }
7927
7931 {
7932 return false;
7933 }
7934
7936 {
7937 return "";
7938 }
7939
7941
7943 {
7944 return false;
7945 }
7946
7948 {
7949 return true;
7950 }
7951
7952
7953
7955 {
7956 return true;
7957 }
7958
7960 {
7961 return true;
7962 }
7963
7965 {
7966 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7968 }
7969
7971 {
7973 }
7974
7976 {
7978 if (!is_being_placed)
7980 SetSynchDirty();
7981 }
7982
7983
7985
7987 {
7989 }
7990
7992 {
7994 }
7995
7997 {
7998 return 1;
7999 }
8000
8002 {
8003 return false;
8004 }
8005
8007 {
8009 SetSynchDirty();
8010 }
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8047 {
8048 super.OnMovedInsideCargo(container);
8049
8050 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8051 }
8052
8053 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8054 {
8055 super.EEItemLocationChanged(oldLoc,newLoc);
8056
8057 PlayerBase new_player = null;
8058 PlayerBase old_player = null;
8059
8060 if (newLoc.GetParent())
8061 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8062
8063 if (oldLoc.GetParent())
8064 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8065
8067 {
8068 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8069
8070 if (r_index >= 0)
8071 {
8072 InventoryLocation r_il = new InventoryLocation;
8073 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8074
8075 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8078 {
8079 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8080 }
8082 {
8083 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8084 }
8085
8086 }
8087 }
8088
8090 {
8091 if (new_player)
8092 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8093
8094 if (new_player == old_player)
8095 {
8096
8097 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8098 {
8100 {
8101 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8102 {
8103 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8104 }
8105 }
8106 else
8107 {
8108 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8109 }
8110 }
8111
8112 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8113 {
8114 int type = oldLoc.GetType();
8116 {
8117 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8118 }
8120 {
8121 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8122 }
8123 }
8124 if (!m_OldLocation)
8125 {
8126 m_OldLocation = new InventoryLocation;
8127 }
8128 m_OldLocation.Copy(oldLoc);
8129 }
8130 else
8131 {
8132 if (m_OldLocation)
8133 {
8134 m_OldLocation.Reset();
8135 }
8136 }
8137
8139 }
8140 else
8141 {
8142 if (new_player)
8143 {
8144 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8145 if (res_index >= 0)
8146 {
8147 InventoryLocation il = new InventoryLocation;
8148 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8150 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8153 {
8154 il.
GetParent().GetOnReleaseLock().Invoke(it);
8155 }
8157 {
8159 }
8160
8161 }
8162 }
8164 {
8165
8167 }
8168
8169 if (m_OldLocation)
8170 {
8171 m_OldLocation.Reset();
8172 }
8173 }
8174 }
8175
8176 override void EOnContact(IEntity other, Contact extra)
8177 {
8179 {
8180 int liquidType = -1;
8182 if (impactSpeed > 0.0)
8183 {
8185 #ifndef SERVER
8187 #else
8189 SetSynchDirty();
8190 #endif
8192 }
8193 }
8194
8195 #ifdef SERVER
8196 if (GetCompEM() && GetCompEM().IsPlugged())
8197 {
8198 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8199 GetCompEM().UnplugThis();
8200 }
8201 #endif
8202 }
8203
8205
8207 {
8209 }
8210
8212 {
8213
8214 }
8215
8217 {
8218 super.OnItemLocationChanged(old_owner, new_owner);
8219
8220 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8221 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8222
8223 if (!relatedPlayer && playerNew)
8224 relatedPlayer = playerNew;
8225
8226 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8227 {
8229 if (actionMgr)
8230 {
8231 ActionBase currentAction = actionMgr.GetRunningAction();
8232 if (currentAction)
8234 }
8235 }
8236
8237 Man ownerPlayerOld = null;
8238 Man ownerPlayerNew = null;
8239
8240 if (old_owner)
8241 {
8242 if (old_owner.
IsMan())
8243 {
8244 ownerPlayerOld = Man.Cast(old_owner);
8245 }
8246 else
8247 {
8248 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8249 }
8250 }
8251 else
8252 {
8254 {
8256
8257 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8258 {
8259 GetCompEM().UnplugThis();
8260 }
8261 }
8262 }
8263
8264 if (new_owner)
8265 {
8266 if (new_owner.
IsMan())
8267 {
8268 ownerPlayerNew = Man.Cast(new_owner);
8269 }
8270 else
8271 {
8272 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8273 }
8274 }
8275
8276 if (ownerPlayerOld != ownerPlayerNew)
8277 {
8278 if (ownerPlayerOld)
8279 {
8280 array<EntityAI> subItemsExit = new array<EntityAI>;
8282 for (int i = 0; i < subItemsExit.Count(); i++)
8283 {
8286 }
8287 }
8288
8289 if (ownerPlayerNew)
8290 {
8291 array<EntityAI> subItemsEnter = new array<EntityAI>;
8293 for (int j = 0; j < subItemsEnter.Count(); j++)
8294 {
8297 }
8298 }
8299 }
8300 else if (ownerPlayerNew != null)
8301 {
8302 PlayerBase nplayer;
8303 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8304 {
8305 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8307 for (int k = 0; k < subItemsUpdate.Count(); k++)
8308 {
8310 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8311 }
8312 }
8313 }
8314
8315 if (old_owner)
8316 old_owner.OnChildItemRemoved(this);
8317 if (new_owner)
8318 new_owner.OnChildItemReceived(this);
8319 }
8320
8321
8323 {
8324 super.EEDelete(parent);
8325 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8326 if (player)
8327 {
8329
8330 if (player.IsAlive())
8331 {
8332 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8333 if (r_index >= 0)
8334 {
8335 InventoryLocation r_il = new InventoryLocation;
8336 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8337
8338 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8341 {
8342 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8343 }
8345 {
8346 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8347 }
8348
8349 }
8350
8351 player.RemoveQuickBarEntityShortcut(this);
8352 }
8353 }
8354 }
8355
8357 {
8358 super.EEKilled(killer);
8359
8362 {
8363 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8364 {
8365 if (IsMagazine())
8366 {
8367 if (Magazine.Cast(this).GetAmmoCount() > 0)
8368 {
8370 }
8371 }
8372 else
8373 {
8375 }
8376 }
8377 }
8378 }
8379
8381 {
8382 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8383
8384 super.OnWasAttached(parent, slot_id);
8385
8388
8390 }
8391
8393 {
8394 super.OnWasDetached(parent, slot_id);
8395
8398 }
8399
8401 {
8402 int idx;
8405
8406 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8407 if (inventory_slots.Count() < 1)
8408 {
8409 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8410 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8411 }
8412 else
8413 {
8414 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8415 }
8416
8417 idx = inventory_slots.Find(slot);
8418 if (idx < 0)
8419 return "";
8420
8421 return attach_types.Get(idx);
8422 }
8423
8425 {
8426 int idx = -1;
8427 string slot;
8428
8431
8432 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8433 if (inventory_slots.Count() < 1)
8434 {
8435 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8436 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8437 }
8438 else
8439 {
8440 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8441 if (detach_types.Count() < 1)
8442 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8443 }
8444
8445 for (int i = 0; i < inventory_slots.Count(); i++)
8446 {
8447 slot = inventory_slots.Get(i);
8448 }
8449
8450 if (slot != "")
8451 {
8452 if (detach_types.Count() == 1)
8453 idx = 0;
8454 else
8455 idx = inventory_slots.Find(slot);
8456 }
8457 if (idx < 0)
8458 return "";
8459
8460 return detach_types.Get(idx);
8461 }
8462
8464 {
8465
8467
8468
8469 float min_time = 1;
8470 float max_time = 3;
8471 float delay = Math.RandomFloat(min_time, max_time);
8472
8473 explode_timer.Run(delay, this, "DoAmmoExplosion");
8474 }
8475
8477 {
8478 Magazine magazine = Magazine.Cast(this);
8479 int pop_sounds_count = 6;
8480 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8481
8482
8483 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8484 string sound_name = pop_sounds[ sound_idx ];
8486
8487
8488 magazine.ServerAddAmmoCount(-1);
8489
8490
8491 float min_temp_to_explode = 100;
8492
8493 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
8494 {
8496 }
8497 }
8498
8499
8500 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8501 {
8502 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8503
8504 const int CHANCE_DAMAGE_CARGO = 4;
8505 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8506 const int CHANCE_DAMAGE_NOTHING = 2;
8507
8509 {
8510 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8511 int chances;
8512 int rnd;
8513
8514 if (GetInventory().GetCargo())
8515 {
8516 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8517 rnd = Math.RandomInt(0,chances);
8518
8519 if (rnd < CHANCE_DAMAGE_CARGO)
8520 {
8522 }
8523 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8524 {
8526 }
8527 }
8528 else
8529 {
8530 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8531 rnd = Math.RandomInt(0,chances);
8532
8533 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8534 {
8536 }
8537 }
8538 }
8539 }
8540
8542 {
8543 if (GetInventory().GetCargo())
8544 {
8545 int item_count = GetInventory().GetCargo().GetItemCount();
8546 if (item_count > 0)
8547 {
8548 int random_pick = Math.RandomInt(0, item_count);
8550 if (!item.IsExplosive())
8551 {
8552 item.AddHealth("","",damage);
8553 return true;
8554 }
8555 }
8556 }
8557 return false;
8558 }
8559
8561 {
8562 int attachment_count = GetInventory().AttachmentCount();
8563 if (attachment_count > 0)
8564 {
8565 int random_pick = Math.RandomInt(0, attachment_count);
8566 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8567 if (!attachment.IsExplosive())
8568 {
8569 attachment.AddHealth("","",damage);
8570 return true;
8571 }
8572 }
8573 return false;
8574 }
8575
8577 {
8579 }
8580
8582 {
8584 return GetInventory().CanRemoveEntity();
8585
8586 return false;
8587 }
8588
8590 {
8591
8593 return false;
8594
8595
8597 return false;
8598
8599
8600
8602 if (delta == 0)
8603 return false;
8604
8605
8606 return true;
8607 }
8608
8610 {
8612 {
8613 if (ScriptInputUserData.CanStoreInputUserData())
8614 {
8615 ScriptInputUserData ctx = new ScriptInputUserData;
8620 ctx.
Write(destination_entity);
8624 }
8625 }
8626 else if (!
GetGame().IsMultiplayer())
8627 {
8629 }
8630 }
8631
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
8648 {
8649 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8650 if (new_item)
8651 {
8652 new_item.SetResultOfSplit(true);
8653 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8655 new_item.
SetQuantity(split_quantity_new,
false,
true);
8656 }
8657 }
8658 }
8659 else if (destination_entity && slot_id == -1)
8660 {
8661 if (quantity > stack_max)
8662 split_quantity_new = stack_max;
8663 else
8664 split_quantity_new = quantity;
8665
8667 {
8669 {
8672 }
8673
8674 if (new_item)
8675 {
8676 new_item.SetResultOfSplit(true);
8677 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8679 new_item.
SetQuantity(split_quantity_new,
false,
true);
8680 }
8681 }
8682 }
8683 else
8684 {
8685 if (stack_max != 0)
8686 {
8688 {
8690 }
8691
8692 if (split_quantity_new == 0)
8693 {
8694 if (!
GetGame().IsMultiplayer())
8695 player.PhysicalPredictiveDropItem(this);
8696 else
8697 player.ServerDropEntity(this);
8698 return;
8699 }
8700
8702 {
8704
8705 if (new_item)
8706 {
8707 new_item.SetResultOfSplit(true);
8708 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8711 new_item.PlaceOnSurface();
8712 }
8713 }
8714 }
8715 }
8716 }
8717
8719 {
8720 float split_quantity_new;
8724 InventoryLocation loc = new InventoryLocation;
8725
8726 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8727 {
8729 split_quantity_new = stack_max;
8730 else
8732
8734 {
8735 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8736 if (new_item)
8737 {
8738 new_item.SetResultOfSplit(true);
8739 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8741 new_item.
SetQuantity(split_quantity_new,
false,
true);
8742 }
8743 }
8744 }
8745 else if (destination_entity && slot_id == -1)
8746 {
8747 if (quantity > stack_max)
8748 split_quantity_new = stack_max;
8749 else
8750 split_quantity_new = quantity;
8751
8753 {
8755 {
8758 }
8759
8760 if (new_item)
8761 {
8762 new_item.SetResultOfSplit(true);
8763 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8765 new_item.
SetQuantity(split_quantity_new,
false,
true);
8766 }
8767 }
8768 }
8769 else
8770 {
8771 if (stack_max != 0)
8772 {
8774 {
8776 }
8777
8779 {
8781
8782 if (new_item)
8783 {
8784 new_item.SetResultOfSplit(true);
8785 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8788 new_item.PlaceOnSurface();
8789 }
8790 }
8791 }
8792 }
8793 }
8794
8796 {
8798 {
8799 if (ScriptInputUserData.CanStoreInputUserData())
8800 {
8801 ScriptInputUserData ctx = new ScriptInputUserData;
8806 dst.WriteToContext(ctx);
8808 }
8809 }
8810 else if (!
GetGame().IsMultiplayer())
8811 {
8813 }
8814 }
8815
8817 {
8819 {
8820 if (ScriptInputUserData.CanStoreInputUserData())
8821 {
8822 ScriptInputUserData ctx = new ScriptInputUserData;
8827 ctx.
Write(destination_entity);
8833 }
8834 }
8835 else if (!
GetGame().IsMultiplayer())
8836 {
8838 }
8839 }
8840
8842 {
8844 }
8845
8847 {
8849 float split_quantity_new;
8851 if (dst.IsValid())
8852 {
8853 int slot_id = dst.GetSlot();
8855
8856 if (quantity > stack_max)
8857 split_quantity_new = stack_max;
8858 else
8859 split_quantity_new = quantity;
8860
8862 {
8864
8865 if (new_item)
8866 {
8867 new_item.SetResultOfSplit(true);
8868 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8870 new_item.
SetQuantity(split_quantity_new,
false,
true);
8871 }
8872
8873 return new_item;
8874 }
8875 }
8876
8877 return null;
8878 }
8879
8881 {
8883 float split_quantity_new;
8885 if (destination_entity)
8886 {
8888 if (quantity > stackable)
8889 split_quantity_new = stackable;
8890 else
8891 split_quantity_new = quantity;
8892
8894 {
8895 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
8896 if (new_item)
8897 {
8898 new_item.SetResultOfSplit(true);
8899 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8901 new_item.
SetQuantity(split_quantity_new,
false,
true);
8902 }
8903 }
8904 }
8905 }
8906
8908 {
8910 {
8911 if (ScriptInputUserData.CanStoreInputUserData())
8912 {
8913 ScriptInputUserData ctx = new ScriptInputUserData;
8918 ItemBase destination_entity =
this;
8919 ctx.
Write(destination_entity);
8923 }
8924 }
8925 else if (!
GetGame().IsMultiplayer())
8926 {
8928 }
8929 }
8930
8932 {
8934 float split_quantity_new;
8936 if (player)
8937 {
8939 if (quantity > stackable)
8940 split_quantity_new = stackable;
8941 else
8942 split_quantity_new = quantity;
8943
8945 {
8946 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
8947 new_item =
ItemBase.Cast(in_hands);
8948 if (new_item)
8949 {
8950 new_item.SetResultOfSplit(true);
8951 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8953 new_item.SetQuantity(split_quantity_new, false, true);
8954 }
8955 }
8956 }
8957 }
8958
8960 {
8962 float split_quantity_new = Math.Floor(quantity * 0.5);
8963
8965 return;
8966
8968
8969 if (new_item)
8970 {
8971 if (new_item.GetQuantityMax() < split_quantity_new)
8972 {
8973 split_quantity_new = new_item.GetQuantityMax();
8974 }
8975
8976 new_item.SetResultOfSplit(true);
8977 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8978
8980 {
8983 }
8984 else
8985 {
8987 new_item.
SetQuantity(split_quantity_new,
false,
true);
8988 }
8989 }
8990 }
8991
8993 {
8995 float split_quantity_new = Math.Floor(quantity / 2);
8996
8998 return;
8999
9000 InventoryLocation invloc = new InventoryLocation;
9002
9004 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9005
9006 if (new_item)
9007 {
9008 if (new_item.GetQuantityMax() < split_quantity_new)
9009 {
9010 split_quantity_new = new_item.GetQuantityMax();
9011 }
9013 {
9016 }
9017 else if (split_quantity_new > 1)
9018 {
9020 new_item.
SetQuantity(split_quantity_new,
false,
true);
9021 }
9022 }
9023 }
9024
9027 {
9028 SetWeightDirty();
9030
9031 if (parent)
9032 parent.OnAttachmentQuantityChangedEx(this, delta);
9033
9035 {
9037 {
9039 }
9041 {
9042 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9044 }
9045 }
9046
9047 }
9048
9051 {
9052
9053 }
9054
9057 {
9059 }
9060
9062 {
9063 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9064
9066 {
9067 if (newLevel == GameConstants.STATE_RUINED)
9068 {
9070 EntityAI parent = GetHierarchyParent();
9071 if (parent && parent.IsFireplace())
9072 {
9073 CargoBase cargo = GetInventory().GetCargo();
9074 if (cargo)
9075 {
9077 {
9079 }
9080 }
9081 }
9082 }
9083
9085 {
9086
9088 return;
9089 }
9090
9091 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9092 {
9094 }
9095 }
9096 }
9097
9098
9100 {
9101 super.OnRightClick();
9102
9104 {
9106 {
9107 if (ScriptInputUserData.CanStoreInputUserData())
9108 {
9109 EntityAI root = GetHierarchyRoot();
9110 Man playerOwner = GetHierarchyRootPlayer();
9111 InventoryLocation dst = new InventoryLocation;
9112
9113
9114 if (!playerOwner && root && root == this)
9115 {
9117 }
9118 else
9119 {
9120
9121 GetInventory().GetCurrentInventoryLocation(dst);
9123 {
9126 {
9128 }
9129 else
9130 {
9132
9133
9134 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9135 {
9137 }
9138 else
9139 {
9140 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9141 }
9142 }
9143 }
9144 }
9145
9146 ScriptInputUserData ctx = new ScriptInputUserData;
9154 }
9155 }
9156 else if (!
GetGame().IsMultiplayer())
9157 {
9159 }
9160 }
9161 }
9162
9164 {
9165 if (root)
9166 {
9167 vector m4[4];
9168 root.GetTransform(m4);
9169 dst.SetGround(this, m4);
9170 }
9171 else
9172 {
9173 GetInventory().GetCurrentInventoryLocation(dst);
9174 }
9175 }
9176
9177 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9178 {
9179
9180 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9181 return false;
9182
9183 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9184 return false;
9185
9186
9188 return false;
9189
9190
9191 Magazine mag = Magazine.Cast(this);
9192 if (mag)
9193 {
9194 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9195 return false;
9196
9197 if (stack_max_limit)
9198 {
9199 Magazine other_mag = Magazine.Cast(other_item);
9200 if (other_item)
9201 {
9202 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9203 return false;
9204 }
9205
9206 }
9207 }
9208 else
9209 {
9210
9212 return false;
9213
9215 return false;
9216 }
9217
9218 PlayerBase player = null;
9219 if (CastTo(player, GetHierarchyRootPlayer()))
9220 {
9221 if (player.GetInventory().HasAttachment(this))
9222 return false;
9223
9224 if (player.IsItemsToDelete())
9225 return false;
9226 }
9227
9228 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9229 return false;
9230
9231 int slotID;
9233 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9234 return false;
9235
9236 return true;
9237 }
9238
9240 {
9242 }
9243
9245 {
9246 return m_IsResultOfSplit;
9247 }
9248
9250 {
9251 m_IsResultOfSplit = value;
9252 }
9253
9255 {
9257 }
9258
9260 {
9261 float other_item_quantity = other_item.GetQuantity();
9262 float this_free_space;
9263
9265
9267
9268 if (other_item_quantity > this_free_space)
9269 {
9270 return this_free_space;
9271 }
9272 else
9273 {
9274 return other_item_quantity;
9275 }
9276 }
9277
9279 {
9281 }
9282
9284 {
9286 return;
9287
9288 if (!IsMagazine() && other_item)
9289 {
9291 if (quantity_used != 0)
9292 {
9293 float hp1 = GetHealth01("","");
9294 float hp2 = other_item.GetHealth01("","");
9295 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9296 hpResult = hpResult / (
GetQuantity() + quantity_used);
9297
9298 hpResult *= GetMaxHealth();
9299 Math.Round(hpResult);
9300 SetHealth("", "Health", hpResult);
9301
9303 other_item.AddQuantity(-quantity_used);
9304 }
9305 }
9307 }
9308
9310 {
9311 #ifdef SERVER
9312 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9313 GetHierarchyParent().IncreaseLifetimeUp();
9314 #endif
9315 };
9316
9318 {
9319 PlayerBase p = PlayerBase.Cast(player);
9320
9321 array<int> recipesIds = p.m_Recipes;
9322 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9323 if (moduleRecipesManager)
9324 {
9325 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9326 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9327 }
9328
9329 for (int i = 0;i < recipesIds.Count(); i++)
9330 {
9331 int key = recipesIds.Get(i);
9332 string recipeName = moduleRecipesManager.GetRecipeName(key);
9334 }
9335 }
9336
9337
9338 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9339 {
9340 super.GetDebugActions(outputList);
9341
9342
9348
9349
9354
9359
9360
9364
9365
9367 {
9371 }
9372
9375
9376
9380
9382
9383 InventoryLocation loc = new InventoryLocation();
9384 GetInventory().GetCurrentInventoryLocation(loc);
9386 {
9387 if (Gizmo_IsSupported())
9390 }
9391
9393 }
9394
9395
9396
9397
9399 {
9400 super.OnAction(action_id, player, ctx);
9401
9403 {
9404 switch (action_id)
9405 {
9408 return true;
9411 return true;
9412 }
9413 }
9414
9416 {
9417 switch (action_id)
9418 {
9420 Delete();
9421 return true;
9422 }
9423 }
9424
9425 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9426 {
9427 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9428 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9429 PlayerBase p = PlayerBase.Cast(player);
9430 if (
EActions.RECIPES_RANGE_START < 1000)
9431 {
9432 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9433 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9434 }
9435 }
9436 #ifndef SERVER
9437 else if (action_id ==
EActions.WATCH_PLAYER)
9438 {
9439 PluginDeveloper.SetDeveloperItemClientEx(player);
9440 }
9441 #endif
9443 {
9444 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9445 {
9446 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9447 OnDebugButtonPressServer(id + 1);
9448 }
9449
9450 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9451 {
9452 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9454 }
9455
9456 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9457 {
9458 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9460 }
9461
9462 else if (action_id ==
EActions.ADD_QUANTITY)
9463 {
9464 if (IsMagazine())
9465 {
9466 Magazine mag = Magazine.Cast(this);
9467 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9468 }
9469 else
9470 {
9472 }
9473
9474 if (m_EM)
9475 {
9476 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9477 }
9478
9479 }
9480
9481 else if (action_id ==
EActions.REMOVE_QUANTITY)
9482 {
9483 if (IsMagazine())
9484 {
9485 Magazine mag2 = Magazine.Cast(this);
9486 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9487 }
9488 else
9489 {
9491 }
9492 if (m_EM)
9493 {
9494 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9495 }
9496
9497 }
9498
9499 else if (action_id ==
EActions.SET_QUANTITY_0)
9500 {
9502
9503 if (m_EM)
9504 {
9505 m_EM.SetEnergy(0);
9506 }
9507 }
9508
9509 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9510 {
9512
9513 if (m_EM)
9514 {
9515 m_EM.SetEnergy(m_EM.GetEnergyMax());
9516 }
9517 }
9518
9519 else if (action_id ==
EActions.ADD_HEALTH)
9520 {
9521 AddHealth("","",GetMaxHealth("","Health")/5);
9522 }
9523 else if (action_id ==
EActions.REMOVE_HEALTH)
9524 {
9525 AddHealth("","",-GetMaxHealth("","Health")/5);
9526 }
9527 else if (action_id ==
EActions.DESTROY_HEALTH)
9528 {
9529 SetHealth01("","",0);
9530 }
9531 else if (action_id ==
EActions.WATCH_ITEM)
9532 {
9534 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9535 #ifdef DEVELOPER
9536 SetDebugDeveloper_item(this);
9537 #endif
9538 }
9539
9540 else if (action_id ==
EActions.ADD_TEMPERATURE)
9541 {
9542 AddTemperature(20);
9543
9544 }
9545
9546 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9547 {
9548 AddTemperature(-20);
9549
9550 }
9551
9552 else if (action_id ==
EActions.FLIP_FROZEN)
9553 {
9554 SetFrozen(!GetIsFrozen());
9555
9556 }
9557
9558 else if (action_id ==
EActions.ADD_WETNESS)
9559 {
9561
9562 }
9563
9564 else if (action_id ==
EActions.REMOVE_WETNESS)
9565 {
9567
9568 }
9569
9570 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9571 {
9574
9575
9576 }
9577
9578 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9579 {
9582 }
9583
9584 else if (action_id ==
EActions.MAKE_SPECIAL)
9585 {
9586 auto debugParams = DebugSpawnParams.WithPlayer(player);
9587 OnDebugSpawnEx(debugParams);
9588 }
9589
9590 }
9591
9592
9593 return false;
9594 }
9595
9596
9597
9598
9602
9605
9606
9607
9609 {
9610 return false;
9611 }
9612
9613
9615 {
9616 return true;
9617 }
9618
9619
9621 {
9622 return true;
9623 }
9624
9625
9626
9628 {
9629 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9631 }
9632
9635 {
9636 return null;
9637 }
9638
9640 {
9641 return false;
9642 }
9643
9645 {
9646 return false;
9647 }
9648
9652
9653
9655 {
9656 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9657 return module_repairing.CanRepair(this, item_repair_kit);
9658 }
9659
9660
9661 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9662 {
9663 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9664 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9665 }
9666
9667
9669 {
9670
9671
9672
9673
9674
9675
9676
9677
9678 return 1;
9679 }
9680
9681
9682
9684 {
9686 }
9687
9688
9689
9691 {
9693 }
9694
9695
9704 {
9705 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9706
9707 if (player)
9708 {
9709 player.MessageStatus(text);
9710 }
9711 }
9712
9713
9722 {
9723 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9724
9725 if (player)
9726 {
9727 player.MessageAction(text);
9728 }
9729 }
9730
9731
9740 {
9741 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9742
9743 if (player)
9744 {
9745 player.MessageFriendly(text);
9746 }
9747 }
9748
9749
9758 {
9759 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9760
9761 if (player)
9762 {
9763 player.MessageImportant(text);
9764 }
9765 }
9766
9768 {
9769 return true;
9770 }
9771
9772
9773 override bool KindOf(
string tag)
9774 {
9775 bool found = false;
9776 string item_name = this.
GetType();
9779
9780 int array_size = item_tag_array.Count();
9781 for (int i = 0; i < array_size; i++)
9782 {
9783 if (item_tag_array.Get(i) == tag)
9784 {
9785 found = true;
9786 break;
9787 }
9788 }
9789 return found;
9790 }
9791
9792
9794 {
9795
9796 super.OnRPC(sender, rpc_type,ctx);
9797
9798
9799 switch (rpc_type)
9800 {
9801 #ifndef SERVER
9802 case ERPCs.RPC_SOUND_LOCK_ATTACH:
9803 Param2<bool, string> p = new Param2<bool, string>(false, "");
9804
9806 return;
9807
9808 bool play = p.param1;
9809 string soundSet = p.param2;
9810
9811 if (play)
9812 {
9814 {
9816 {
9818 }
9819 }
9820 else
9821 {
9823 }
9824 }
9825 else
9826 {
9828 }
9829
9830 break;
9831 #endif
9832
9833 }
9834
9836 {
9838 }
9839 }
9840
9841
9842
9843
9845 {
9846 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9847 return plugin.GetID(
name);
9848 }
9849
9851 {
9852 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9853 return plugin.GetName(id);
9854 }
9855
9858 {
9859
9860
9861 int varFlags;
9862 if (!ctx.
Read(varFlags))
9863 return;
9864
9865 if (varFlags & ItemVariableFlags.FLOAT)
9866 {
9868 }
9869 }
9870
9872 {
9873
9874 super.SerializeNumericalVars(floats_out);
9875
9876
9877
9879 {
9881 }
9882
9884 {
9886 }
9887
9889 {
9891 }
9892
9894 {
9899 }
9900
9902 {
9904 }
9905 }
9906
9908 {
9909
9910 super.DeSerializeNumericalVars(floats);
9911
9912
9913 int index = 0;
9914 int mask = Math.Round(floats.Get(index));
9915
9916 index++;
9917
9919 {
9921 {
9923 }
9924 else
9925 {
9926 float quantity = floats.Get(index);
9928 }
9929 index++;
9930 }
9931
9933 {
9934 float wet = floats.Get(index);
9936 index++;
9937 }
9938
9940 {
9941 int liquidtype = Math.Round(floats.Get(index));
9943 index++;
9944 }
9945
9947 {
9949 index++;
9951 index++;
9953 index++;
9955 index++;
9956 }
9957
9959 {
9960 int cleanness = Math.Round(floats.Get(index));
9962 index++;
9963 }
9964 }
9965
9967 {
9968 super.WriteVarsToCTX(ctx);
9969
9970
9972 {
9974 }
9975
9977 {
9979 }
9980
9982 {
9984 }
9985
9987 {
9988 int r,g,b,a;
9994 }
9995
9997 {
9999 }
10000 }
10001
10003 {
10004 if (!super.ReadVarsFromCTX(ctx,version))
10005 return false;
10006
10007 int intValue;
10008 float value;
10009
10010 if (version < 140)
10011 {
10012 if (!ctx.
Read(intValue))
10013 return false;
10014
10015 m_VariablesMask = intValue;
10016 }
10017
10019 {
10020 if (!ctx.
Read(value))
10021 return false;
10022
10024 {
10026 }
10027 else
10028 {
10030 }
10031 }
10032
10033 if (version < 140)
10034 {
10036 {
10037 if (!ctx.
Read(value))
10038 return false;
10039 SetTemperatureDirect(value);
10040 }
10041 }
10042
10044 {
10045 if (!ctx.
Read(value))
10046 return false;
10048 }
10049
10051 {
10052 if (!ctx.
Read(intValue))
10053 return false;
10055 }
10056
10058 {
10059 int r,g,b,a;
10061 return false;
10063 return false;
10065 return false;
10067 return false;
10068
10070 }
10071
10073 {
10074 if (!ctx.
Read(intValue))
10075 return false;
10077 }
10078
10079 if (version >= 138 && version < 140)
10080 {
10082 {
10083 if (!ctx.
Read(intValue))
10084 return false;
10085 SetFrozen(intValue);
10086 }
10087 }
10088
10089 return true;
10090 }
10091
10092
10094 {
10097 {
10099 }
10100
10101 if (!super.OnStoreLoad(ctx, version))
10102 {
10104 return false;
10105 }
10106
10107 if (version >= 114)
10108 {
10109 bool hasQuickBarIndexSaved;
10110
10111 if (!ctx.
Read(hasQuickBarIndexSaved))
10112 {
10114 return false;
10115 }
10116
10117 if (hasQuickBarIndexSaved)
10118 {
10119 int itmQBIndex;
10120
10121
10122 if (!ctx.
Read(itmQBIndex))
10123 {
10125 return false;
10126 }
10127
10128 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10129 if (itmQBIndex != -1 && parentPlayer)
10130 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10131 }
10132 }
10133 else
10134 {
10135
10136 PlayerBase player;
10137 int itemQBIndex;
10138 if (version ==
int.
MAX)
10139 {
10140 if (!ctx.
Read(itemQBIndex))
10141 {
10143 return false;
10144 }
10145 }
10146 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10147 {
10148
10149 if (!ctx.
Read(itemQBIndex))
10150 {
10152 return false;
10153 }
10154 if (itemQBIndex != -1 && player)
10155 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10156 }
10157 }
10158
10159 if (version < 140)
10160 {
10161
10162 if (!LoadVariables(ctx, version))
10163 {
10165 return false;
10166 }
10167 }
10168
10169
10171 {
10173 return false;
10174 }
10175 if (version >= 132)
10176 {
10178 if (raib)
10179 {
10181 {
10183 return false;
10184 }
10185 }
10186 }
10187
10189 return true;
10190 }
10191
10192
10193
10195 {
10196 super.OnStoreSave(ctx);
10197
10198 PlayerBase player;
10199 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10200 {
10202
10203 int itemQBIndex = -1;
10204 itemQBIndex = player.FindQuickBarEntityIndex(this);
10205 ctx.
Write(itemQBIndex);
10206 }
10207 else
10208 {
10210 }
10211
10213
10215 if (raib)
10216 {
10218 }
10219 }
10220
10221
10223 {
10224 super.AfterStoreLoad();
10225
10227 {
10229 }
10230
10232 {
10235 }
10236 }
10237
10239 {
10240 super.EEOnAfterLoad();
10241
10243 {
10245 }
10246
10249 }
10250
10252 {
10253 return false;
10254 }
10255
10256
10257
10259 {
10261 {
10262 #ifdef PLATFORM_CONSOLE
10263
10265 {
10267 if (menu)
10268 {
10270 }
10271 }
10272 #endif
10273 }
10274
10276 {
10279 }
10280
10282 {
10283 SetWeightDirty();
10285 }
10287 {
10290 }
10291
10293 {
10296 }
10298 {
10301 }
10302
10303 super.OnVariablesSynchronized();
10304 }
10305
10306
10307
10309 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10310 {
10311 if (!IsServerCheck(allow_client))
10312 return false;
10313
10315 return false;
10316
10319
10320 if (value <= (min + 0.001))
10321 value = min;
10322
10323 if (value == min)
10324 {
10325 if (destroy_config)
10326 {
10327 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10328 if (dstr)
10329 {
10331 this.Delete();
10332 return true;
10333 }
10334 }
10335 else if (destroy_forced)
10336 {
10338 this.Delete();
10339 return true;
10340 }
10341
10343 }
10344
10347
10349 {
10351
10352 if (delta)
10354 }
10355
10357
10358 return false;
10359 }
10360
10361
10363 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10364 {
10366 }
10367
10369 {
10372 }
10373
10375 {
10378 }
10379
10381 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10382 {
10383 float value_clamped = Math.Clamp(value, 0, 1);
10385 SetQuantity(result, destroy_config, destroy_forced);
10386 }
10387
10388
10391 {
10393 }
10394
10396 {
10398 }
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10410 {
10411 int slot = -1;
10412 if (GetInventory())
10413 {
10414 InventoryLocation il = new InventoryLocation;
10415 GetInventory().GetCurrentInventoryLocation(il);
10417 }
10418
10420 }
10421
10423 {
10424 float quantity_max = 0;
10425
10427 {
10428 if (attSlotID != -1)
10429 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10430
10431 if (quantity_max <= 0)
10433 }
10434
10435 if (quantity_max <= 0)
10437
10438 return quantity_max;
10439 }
10440
10442 {
10444 }
10445
10447 {
10449 }
10450
10451
10453 {
10455 }
10456
10458 {
10460 }
10461
10463 {
10465 }
10466
10467
10469 {
10470
10471 float weightEx = GetWeightEx();
10472 float special = GetInventoryAndCargoWeight();
10473 return weightEx - special;
10474 }
10475
10476
10478 {
10480 }
10481
10483 {
10485 {
10486 #ifdef DEVELOPER
10487 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10488 {
10489 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10491 }
10492 #endif
10493
10494 return GetQuantity() * GetConfigWeightModified();
10495 }
10496 else if (HasEnergyManager())
10497 {
10498 #ifdef DEVELOPER
10499 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10500 {
10501 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10502 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10503 }
10504 #endif
10505 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
10506 }
10507 else
10508 {
10509 #ifdef DEVELOPER
10510 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10511 {
10512 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10513 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10514 }
10515 #endif
10516 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
10517 }
10518 }
10519
10522 {
10523 int item_count = 0;
10525
10526 if (GetInventory().GetCargo() != NULL)
10527 {
10528 item_count = GetInventory().GetCargo().GetItemCount();
10529 }
10530
10531 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10532 {
10533 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10534 if (item)
10535 item_count += item.GetNumberOfItems();
10536 }
10537 return item_count;
10538 }
10539
10542 {
10543 float weight = 0;
10544 float wetness = 1;
10545 if (include_wetness)
10548 {
10549 weight = wetness * m_ConfigWeight;
10550 }
10552 {
10553 weight = 1;
10554 }
10555 return weight;
10556 }
10557
10558
10559
10561 {
10562 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10563 {
10564 GameInventory inv = GetInventory();
10565 array<EntityAI> items = new array<EntityAI>;
10567 for (int i = 0; i < items.Count(); i++)
10568 {
10570 if (item)
10571 {
10573 }
10574 }
10575 }
10576 }
10577
10578
10579
10580
10582 {
10583 float energy = 0;
10584 if (HasEnergyManager())
10585 {
10586 energy = GetCompEM().GetEnergy();
10587 }
10588 return energy;
10589 }
10590
10591
10593 {
10594 super.OnEnergyConsumed();
10595
10597 }
10598
10600 {
10601 super.OnEnergyAdded();
10602
10604 }
10605
10606
10608 {
10609 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10610 {
10612 {
10613 float energy_0to1 = GetCompEM().GetEnergy0To1();
10615 }
10616 }
10617 }
10618
10619
10621 {
10622 return ConfigGetFloat("heatIsolation");
10623 }
10624
10626 {
10628 }
10629
10631 {
10632 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10633 if (
GetGame().ConfigIsExisting(paramPath))
10635
10636 return 0.0;
10637 }
10638
10640 {
10641 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10642 if (
GetGame().ConfigIsExisting(paramPath))
10644
10645 return 0.0;
10646 }
10647
10648 override void SetWet(
float value,
bool allow_client =
false)
10649 {
10650 if (!IsServerCheck(allow_client))
10651 return;
10652
10655
10657
10658 m_VarWet = Math.Clamp(value, min, max);
10659
10661 {
10664 }
10665 }
10666
10667 override void AddWet(
float value)
10668 {
10670 }
10671
10673 {
10675 }
10676
10678 {
10680 }
10681
10683 {
10685 }
10686
10688 {
10690 }
10691
10693 {
10695 }
10696
10697 override void OnWetChanged(
float newVal,
float oldVal)
10698 {
10701 if (newLevel != oldLevel)
10702 {
10704 }
10705 }
10706
10708 {
10709 SetWeightDirty();
10710 }
10711
10713 {
10714 return GetWetLevelInternal(
m_VarWet);
10715 }
10716
10717
10718
10720 {
10722 }
10723
10725 {
10727 }
10728
10730 {
10732 }
10733
10735 {
10737 }
10738
10739
10740
10742 {
10743 if (ConfigIsExisting("itemModelLength"))
10744 {
10745 return ConfigGetFloat("itemModelLength");
10746 }
10747 return 0;
10748 }
10749
10751 {
10752 if (ConfigIsExisting("itemAttachOffset"))
10753 {
10754 return ConfigGetFloat("itemAttachOffset");
10755 }
10756 return 0;
10757 }
10758
10759 override void SetCleanness(
int value,
bool allow_client =
false)
10760 {
10761 if (!IsServerCheck(allow_client))
10762 return;
10763
10765
10767
10770 }
10771
10773 {
10775 }
10776
10778 {
10779 return true;
10780 }
10781
10782
10783
10784
10786 {
10788 }
10789
10791 {
10793 }
10794
10795
10796
10797
10798 override void SetColor(
int r,
int g,
int b,
int a)
10799 {
10805 }
10807 override void GetColor(out
int r,out
int g,out
int b,out
int a)
10808 {
10813 }
10814
10816 {
10818 }
10819
10822 {
10823 int r,g,b,a;
10825 r = r/255;
10826 g = g/255;
10827 b = b/255;
10828 a = a/255;
10829 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10830 }
10831
10832
10833
10834 override void SetLiquidType(
int value,
bool allow_client =
false)
10835 {
10836 if (!IsServerCheck(allow_client))
10837 return;
10838
10843 }
10844
10846 {
10847 return ConfigGetInt("varLiquidTypeInit");
10848 }
10849
10851 {
10853 }
10854
10856 {
10858 SetFrozen(false);
10859 }
10860
10863 {
10864 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10865 }
10866
10867
10870 {
10871 PlayerBase nplayer;
10872 if (PlayerBase.CastTo(nplayer, player))
10873 {
10875
10876 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10877 }
10878 }
10879
10880
10883 {
10884 PlayerBase nplayer;
10885 if (PlayerBase.CastTo(nplayer,player))
10886 {
10887
10888 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10889
10890 }
10891
10892
10893 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10894
10895
10896 if (HasEnergyManager())
10897 {
10898 GetCompEM().UpdatePlugState();
10899 }
10900 }
10901
10902
10904 {
10905 super.OnPlacementStarted(player);
10906
10908 }
10909
10910 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
10911 {
10913 {
10914 m_AdminLog.OnPlacementComplete(player,
this);
10915 }
10916
10917 super.OnPlacementComplete(player, position, orientation);
10918 }
10919
10920
10921
10922
10923
10925 {
10927 {
10928 return true;
10929 }
10930 else
10931 {
10932 return false;
10933 }
10934 }
10935
10936
10938 {
10940 {
10942 }
10943 }
10944
10945
10947 {
10949 }
10950
10952 {
10954 }
10955
10956 override void InsertAgent(
int agent,
float count = 1)
10957 {
10958 if (count < 1)
10959 return;
10960
10962 }
10963
10966 {
10968 }
10969
10970
10972 {
10974 }
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000
11001
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11018 {
11020 return false;
11021 return true;
11022 }
11023
11025 {
11026
11028 }
11029
11030
11033 {
11034 super.CheckForRoofLimited(timeTresholdMS);
11035
11037 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11038 {
11039 m_PreviousRoofTestTime = time;
11040 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11041 }
11042 }
11043
11044
11046 {
11048 {
11049 return 0;
11050 }
11051
11052 if (GetInventory().GetAttachmentSlotsCount() != 0)
11053 {
11054 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
11055 if (filter)
11056 return filter.GetProtectionLevel(type, false, system);
11057 else
11058 return 0;
11059 }
11060
11061 string subclassPath, entryName;
11062
11063 switch (type)
11064 {
11066 entryName = "biological";
11067 break;
11069 entryName = "chemical";
11070 break;
11071 default:
11072 entryName = "biological";
11073 break;
11074 }
11075
11076 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11077
11079 }
11080
11081
11082
11085 {
11086 if (!IsMagazine())
11088
11090 }
11091
11092
11093
11094
11095
11100 {
11101 return true;
11102 }
11103
11105 {
11107 }
11108
11109
11110
11111
11112
11114 {
11115 if (parent)
11116 {
11117 if (parent.IsInherited(DayZInfected))
11118 return true;
11119
11120 if (!parent.IsRuined())
11121 return true;
11122 }
11123
11124 return true;
11125 }
11126
11128 {
11129 if (!super.CanPutAsAttachment(parent))
11130 {
11131 return false;
11132 }
11133
11134 if (!IsRuined() && !parent.IsRuined())
11135 {
11136 return true;
11137 }
11138
11139 return false;
11140 }
11141
11143 {
11144
11145
11146
11147
11148 return super.CanReceiveItemIntoCargo(item);
11149 }
11150
11152 {
11153
11154
11155
11156
11157 GameInventory attachmentInv = attachment.GetInventory();
11159 {
11160 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11161 return false;
11162 }
11163
11164 InventoryLocation loc = new InventoryLocation();
11165 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11166 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11167 return false;
11168
11169 return super.CanReceiveAttachment(attachment, slotId);
11170 }
11171
11173 {
11174 if (!super.CanReleaseAttachment(attachment))
11175 return false;
11176
11177 return GetInventory().AreChildrenAccessible();
11178 }
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11201 {
11202 int id = muzzle_owner.GetMuzzleID();
11203 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11204
11205 if (WPOF_array)
11206 {
11207 for (int i = 0; i < WPOF_array.Count(); i++)
11208 {
11209 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11210
11211 if (WPOF)
11212 {
11213 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11214 }
11215 }
11216 }
11217 }
11218
11219
11221 {
11222 int id = muzzle_owner.GetMuzzleID();
11224
11225 if (WPOBE_array)
11226 {
11227 for (int i = 0; i < WPOBE_array.Count(); i++)
11228 {
11229 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11230
11231 if (WPOBE)
11232 {
11233 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11234 }
11235 }
11236 }
11237 }
11238
11239
11241 {
11242 int id = muzzle_owner.GetMuzzleID();
11243 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11244
11245 if (WPOOH_array)
11246 {
11247 for (int i = 0; i < WPOOH_array.Count(); i++)
11248 {
11249 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11250
11251 if (WPOOH)
11252 {
11253 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11254 }
11255 }
11256 }
11257 }
11258
11259
11261 {
11262 int id = muzzle_owner.GetMuzzleID();
11263 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11264
11265 if (WPOOH_array)
11266 {
11267 for (int i = 0; i < WPOOH_array.Count(); i++)
11268 {
11269 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11270
11271 if (WPOOH)
11272 {
11273 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11274 }
11275 }
11276 }
11277 }
11278
11279
11281 {
11282 int id = muzzle_owner.GetMuzzleID();
11283 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11284
11285 if (WPOOH_array)
11286 {
11287 for (int i = 0; i < WPOOH_array.Count(); i++)
11288 {
11289 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11290
11291 if (WPOOH)
11292 {
11293 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11294 }
11295 }
11296 }
11297 }
11298
11299
11300
11302 {
11304 {
11305 return true;
11306 }
11307
11308 return false;
11309 }
11310
11312 {
11314 {
11315 return true;
11316 }
11317
11318 return false;
11319 }
11320
11322 {
11324 {
11325 return true;
11326 }
11327
11328 return false;
11329 }
11330
11332 {
11333 return false;
11334 }
11335
11338 {
11339 return UATimeSpent.DEFAULT_DEPLOY;
11340 }
11341
11342
11343
11344
11346 {
11348 SetSynchDirty();
11349 }
11350
11352 {
11354 }
11355
11356
11358 {
11359 return false;
11360 }
11361
11364 {
11365 string att_type = "None";
11366
11367 if (ConfigIsExisting("soundAttType"))
11368 {
11369 att_type = ConfigGetString("soundAttType");
11370 }
11371
11373 }
11374
11376 {
11378 }
11379
11380
11381
11382
11383
11389
11391 {
11394
11396 }
11397
11398
11400 {
11402 return;
11403
11405
11408
11411
11412 SoundParameters params = new SoundParameters();
11416 }
11417
11418
11420 {
11422 return;
11423
11425 SetSynchDirty();
11426
11429 }
11430
11431
11433 {
11435 return;
11436
11438 SetSynchDirty();
11439
11442 }
11443
11445 {
11447 }
11448
11450 {
11452 }
11453
11456 {
11457 if (!
GetGame().IsDedicatedServer())
11458 {
11459 if (ConfigIsExisting("attachSoundSet"))
11460 {
11461 string cfg_path = "";
11462 string soundset = "";
11463 string type_name =
GetType();
11464
11467 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11468 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11469
11470 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11471 {
11472 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11473 {
11474 if (cfg_slot_array[i] == slot_type)
11475 {
11476 soundset = cfg_soundset_array[i];
11477 break;
11478 }
11479 }
11480 }
11481
11482 if (soundset != "")
11483 {
11484 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11486 }
11487 }
11488 }
11489 }
11490
11492 {
11493
11494 }
11495
11496 void OnApply(PlayerBase player);
11497
11499 {
11500 return 1.0;
11501 };
11502
11504 {
11506 }
11507
11509 {
11511 }
11512
11514
11516 {
11517 SetDynamicPhysicsLifeTime(0.01);
11519 }
11520
11522 {
11523 array<string> zone_names = new array<string>;
11524 GetDamageZones(zone_names);
11525 for (int i = 0; i < zone_names.Count(); i++)
11526 {
11527 SetHealthMax(zone_names.Get(i),"Health");
11528 }
11529 SetHealthMax("","Health");
11530 }
11531
11534 {
11535 float global_health = GetHealth01("","Health");
11536 array<string> zones = new array<string>;
11537 GetDamageZones(zones);
11538
11539 for (int i = 0; i < zones.Count(); i++)
11540 {
11541 SetHealth01(zones.Get(i),"Health",global_health);
11542 }
11543 }
11544
11547 {
11548 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11549 }
11550
11552 {
11553 if (!hasRootAsPlayer)
11554 {
11555 if (refParentIB)
11556 {
11557
11558 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11559 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11560
11561 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11562 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11563
11566 }
11567 else
11568 {
11569
11572 }
11573 }
11574 }
11575
11577 {
11579 {
11580 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11581 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
11582 {
11583 float heatPermCoef = 1.0;
11585 while (ent)
11586 {
11587 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11588 ent = ent.GetHierarchyParent();
11589 }
11590
11591 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11592 }
11593 }
11594 }
11595
11597 {
11598
11599 EntityAI parent = GetHierarchyParent();
11600 if (!parent)
11601 {
11602 hasParent = false;
11603 hasRootAsPlayer = false;
11604 }
11605 else
11606 {
11607 hasParent = true;
11608 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11609 refParentIB =
ItemBase.Cast(parent);
11610 }
11611 }
11612
11613 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11614 {
11615
11616 }
11617
11619 {
11620
11621 return false;
11622 }
11623
11625 {
11626
11627
11628 return false;
11629 }
11630
11632 {
11633
11634 return false;
11635 }
11636
11639 {
11640 return !GetIsFrozen() &&
IsOpen();
11641 }
11642
11644 {
11645 bool hasParent = false, hasRootAsPlayer = false;
11647
11648 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11649 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11650
11651 if (wwtu || foodDecay)
11652 {
11656
11657 if (processWetness || processTemperature || processDecay)
11658 {
11660
11661 if (processWetness)
11662 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11663
11664 if (processTemperature)
11666
11667 if (processDecay)
11668 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11669 }
11670 }
11671 }
11672
11675 {
11677 }
11678
11680 {
11683
11684 return super.GetTemperatureFreezeThreshold();
11685 }
11686
11688 {
11691
11692 return super.GetTemperatureThawThreshold();
11693 }
11694
11696 {
11699
11700 return super.GetItemOverheatThreshold();
11701 }
11702
11704 {
11706 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11707
11708 return super.GetTemperatureFreezeTime();
11709 }
11710
11712 {
11714 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11715
11716 return super.GetTemperatureThawTime();
11717 }
11718
11723
11725 {
11726 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11727 }
11728
11730 {
11731 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11732 }
11733
11736 {
11738 }
11739
11741 {
11743 }
11744
11746 {
11748 }
11749
11752 {
11753 return null;
11754 }
11755
11758 {
11759 return false;
11760 }
11761
11763 {
11765 {
11768 if (!trg)
11769 {
11771 explosive = this;
11772 }
11773
11774 explosive.PairRemote(trg);
11776
11777 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
11778 trg.SetPersistentPairID(persistentID);
11779 explosive.SetPersistentPairID(persistentID);
11780
11781 return true;
11782 }
11783 return false;
11784 }
11785
11788 {
11789 float ret = 1.0;
11792 ret *= GetHealth01();
11793
11794 return ret;
11795 }
11796
11797 #ifdef DEVELOPER
11798 override void SetDebugItem()
11799 {
11800 super.SetDebugItem();
11801 _itemBase = this;
11802 }
11803
11805 {
11806 string text = super.GetDebugText();
11807
11809 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
11810
11811 return text;
11812 }
11813 #endif
11814
11816 {
11817 return true;
11818 }
11819
11821
11823
11825 {
11828 }
11829
11830
11838
11854}
11855
11857{
11859 if (entity)
11860 {
11861 bool is_item = entity.IsInherited(
ItemBase);
11862 if (is_item && full_quantity)
11863 {
11866 }
11867 }
11868 else
11869 {
11871 return NULL;
11872 }
11873 return entity;
11874}
11875
11877{
11878 if (item)
11879 {
11880 if (health > 0)
11881 item.SetHealth("", "", health);
11882
11883 if (item.CanHaveTemperature())
11884 {
11886 if (item.CanFreeze())
11887 item.SetFrozen(false);
11888 }
11889
11890 if (item.HasEnergyManager())
11891 {
11892 if (quantity >= 0)
11893 {
11894 item.GetCompEM().SetEnergy0To1(quantity);
11895 }
11896 else
11897 {
11899 }
11900 }
11901 else if (item.IsMagazine())
11902 {
11903 Magazine mag = Magazine.Cast(item);
11904 if (quantity >= 0)
11905 {
11906 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11907 }
11908 else
11909 {
11911 }
11912
11913 }
11914 else
11915 {
11916 if (quantity >= 0)
11917 {
11918 item.SetQuantityNormalized(quantity, false);
11919 }
11920 else
11921 {
11923 }
11924
11925 }
11926 }
11927}
11928
11929#ifdef DEVELOPER
11931#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.