5947{
5949 {
5950 return true;
5951 }
5952};
5953
5954
5955
5957{
5961
5963
5966
5967
5968
5969
5970
5979
5985
5990
5995
6016 protected bool m_IsResultOfSplit
6017
6019
6024
6025
6026
6028
6032
6033
6034
6036
6039
6040
6041
6047
6048
6056
6059
6060
6062
6063
6065
6066
6071
6072
6077
6078
6080
6081
6083 {
6088
6089 if (!
GetGame().IsDedicatedServer())
6090 {
6092 {
6094
6096 {
6098 }
6099 }
6100
6103 }
6104
6105 m_OldLocation = null;
6106
6108 {
6110 }
6111
6112 if (ConfigIsExisting("headSelectionsToHide"))
6113 {
6116 }
6117
6119 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
6120 {
6122 }
6123
6125
6126 m_IsResultOfSplit = false;
6127
6129 }
6130
6132 {
6133 super.InitItemVariables();
6134
6140 m_Count = ConfigGetInt(
"count");
6141
6144
6149
6152
6157
6169
6173
6174
6177 if (ConfigIsExisting("canBeSplit"))
6178 {
6181 }
6182
6184 if (ConfigIsExisting("itemBehaviour"))
6186
6187
6190 RegisterNetSyncVariableInt("m_VarLiquidType");
6191 RegisterNetSyncVariableInt("m_Cleanness",0,1);
6192
6193 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
6194 RegisterNetSyncVariableFloat("m_ImpactSpeed");
6195 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
6196
6197 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
6198 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
6199 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
6200 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
6201
6202 RegisterNetSyncVariableBool("m_IsBeingPlaced");
6203 RegisterNetSyncVariableBool("m_IsTakeable");
6204 RegisterNetSyncVariableBool("m_IsHologram");
6205
6208 {
6211 }
6212
6214
6216 if (ConfigIsExisting("temperaturePerQuantityWeight"))
6218
6219 }
6220
6222 {
6224 }
6225
6227 {
6230 {
6235 }
6236 }
6237
6238 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
6239 {
6241 {
6244 }
6245
6247 }
6248
6250 {
6256 }
6257
6259
6261 {
6263
6264 if (!action)
6265 {
6266 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6267 return;
6268 }
6269
6271 if (!ai)
6272 {
6274 return;
6275 }
6276
6278 if (!action_array)
6279 {
6280 action_array = new array<ActionBase_Basic>;
6282 }
6283 if (LogManager.IsActionLogEnable())
6284 {
6285 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6286 }
6287
6288 if (action_array.Find(action) != -1)
6289 {
6290 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6291 }
6292 else
6293 {
6294 action_array.Insert(action);
6295 }
6296 }
6297
6299 {
6301 ActionBase action = player.GetActionManager().GetAction(actionName);
6304
6305 if (action_array)
6306 {
6307 action_array.RemoveItem(action);
6308 }
6309 }
6310
6311
6312
6314 {
6315 ActionOverrideData overrideData = new ActionOverrideData();
6319
6321 if (!actionMap)
6322 {
6325 }
6326
6327 actionMap.Insert(this.
Type(), overrideData);
6328
6329 }
6330
6332
6334
6335
6337 {
6340
6343
6344 string config_to_search = "CfgVehicles";
6345 string muzzle_owner_config;
6346
6348 {
6349 if (IsInherited(Weapon))
6350 config_to_search = "CfgWeapons";
6351
6352 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6353
6354 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6355
6357
6358 if (config_OnFire_subclass_count > 0)
6359 {
6360 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6361
6362 for (int i = 0; i < config_OnFire_subclass_count; i++)
6363 {
6364 string particle_class = "";
6366 string config_OnFire_entry = config_OnFire_class + particle_class;
6367 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6368 WPOF_array.Insert(WPOF);
6369 }
6370
6371
6373 }
6374 }
6375
6377 {
6378 config_to_search = "CfgWeapons";
6379 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6380
6381 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6382
6384
6385 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6386 {
6387 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6388
6389 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6390 {
6391 string particle_class2 = "";
6393 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6394 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6395 WPOBE_array.Insert(WPOBE);
6396 }
6397
6398
6400 }
6401 }
6402 }
6403
6404
6406 {
6409
6411 {
6412 string config_to_search = "CfgVehicles";
6413
6414 if (IsInherited(Weapon))
6415 config_to_search = "CfgWeapons";
6416
6417 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6418 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6419
6420 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
6421 {
6422
6424
6426 {
6428 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6430 return;
6431 }
6432
6435
6436
6437
6439 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6440
6441 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6442 {
6443 string particle_class = "";
6445 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6447
6448 if (entry_type == CT_CLASS)
6449 {
6450 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6451 WPOOH_array.Insert(WPOF);
6452 }
6453 }
6454
6455
6457 }
6458 }
6459 }
6460
6462 {
6464 }
6465
6467 {
6469 {
6471
6474
6477
6478 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6479 }
6480 }
6481
6483 {
6485 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6486
6488 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6489
6491 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6492
6494 {
6496 }
6497 }
6498
6500 {
6502 }
6503
6505 {
6508 else
6510
6512 {
6515 }
6516 else
6517 {
6520
6523 }
6524
6526 }
6527
6529 {
6531 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6532 }
6533
6535 {
6537 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6539 }
6540
6542 {
6544 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6545 }
6546
6548 {
6551
6552 OverheatingParticle OP = new OverheatingParticle();
6557
6559 }
6560
6562 {
6565
6566 return -1;
6567 }
6568
6570 {
6572 {
6575
6576 for (int i = count; i > 0; --i)
6577 {
6578 int id = i - 1;
6581
6584
6585 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6586 {
6587 if (p)
6588 {
6591 }
6592 }
6593 }
6594 }
6595 }
6596
6598 {
6600 {
6602 {
6603 int id = i - 1;
6605
6606 if (OP)
6607 {
6609
6610 if (p)
6611 {
6613 }
6614
6615 delete OP;
6616 }
6617 }
6618
6621 }
6622 }
6623
6626 {
6627 return 0.0;
6628 }
6629
6630
6632 {
6633 return 250;
6634 }
6635
6637 {
6638 return 0;
6639 }
6640
6643 {
6645 return true;
6646
6647 return false;
6648 }
6649
6652 {
6655
6657 {
6659 }
6660 else
6661 {
6662
6664 }
6665
6667 }
6668
6675 {
6676 return -1;
6677 }
6678
6679
6680
6681
6683 {
6685 {
6687 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6688
6689 if (r_index >= 0)
6690 {
6691 InventoryLocation r_il = new InventoryLocation;
6692 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6693
6694 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6697 {
6698 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6699 }
6701 {
6702 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6703 }
6704
6705 }
6706
6707 player.GetHumanInventory().ClearUserReservedLocation(this);
6708 }
6709
6712 }
6713
6714
6715
6716
6718 {
6719 return ItemBase.m_DebugActionsMask;
6720 }
6721
6723 {
6724 return ItemBase.m_DebugActionsMask & mask;
6725 }
6726
6728 {
6729 ItemBase.m_DebugActionsMask = mask;
6730 }
6731
6733 {
6734 ItemBase.m_DebugActionsMask |= mask;
6735 }
6736
6738 {
6739 ItemBase.m_DebugActionsMask &= ~mask;
6740 }
6741
6743 {
6745 {
6747 }
6748 else
6749 {
6751 }
6752 }
6753
6754
6756 {
6757 if (GetEconomyProfile())
6758 {
6759 float q_max = GetEconomyProfile().GetQuantityMax();
6760 if (q_max > 0)
6761 {
6762 float q_min = GetEconomyProfile().GetQuantityMin();
6763 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6764
6766 {
6767 ComponentEnergyManager comp = GetCompEM();
6769 {
6771 }
6772 }
6774 {
6776
6777 }
6778
6779 }
6780 }
6781 }
6782
6785 {
6786 EntityAI parent = GetHierarchyParent();
6787
6788 if (parent)
6789 {
6790 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6791 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6792 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6793 }
6794 }
6795
6798 {
6799 EntityAI parent = GetHierarchyParent();
6800
6801 if (parent)
6802 {
6803 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6804 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6805 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6806 }
6807 }
6808
6810 {
6811
6812
6813
6814
6816
6818 {
6819 if (ScriptInputUserData.CanStoreInputUserData())
6820 {
6821 ScriptInputUserData ctx = new ScriptInputUserData;
6827 ctx.
Write(use_stack_max);
6830
6832 {
6833 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6834 }
6835 }
6836 }
6837 else if (!
GetGame().IsMultiplayer())
6838 {
6840 }
6841 }
6842
6844 {
6846 }
6847
6849 {
6851 }
6852
6854 {
6856 }
6857
6859 {
6860
6861 return false;
6862 }
6863
6865 {
6866 return false;
6867 }
6868
6872 {
6873 return false;
6874 }
6875
6877 {
6878 return "";
6879 }
6880
6882
6884 {
6885 return false;
6886 }
6887
6889 {
6890 return true;
6891 }
6892
6893
6894
6896 {
6897 return true;
6898 }
6899
6901 {
6902 return true;
6903 }
6904
6906 {
6907 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6909 }
6910
6912 {
6914 }
6915
6917 {
6919 if (!is_being_placed)
6921 SetSynchDirty();
6922 }
6923
6924
6926
6928 {
6930 }
6931
6933 {
6935 }
6936
6938 {
6939 return 1;
6940 }
6941
6943 {
6944 return false;
6945 }
6946
6948 {
6950 SetSynchDirty();
6951 }
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6988 {
6989 super.OnMovedInsideCargo(container);
6990
6991 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6992 }
6993
6994 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6995 {
6996 super.EEItemLocationChanged(oldLoc,newLoc);
6997
6998 PlayerBase new_player = null;
6999 PlayerBase old_player = null;
7000
7001 if (newLoc.GetParent())
7002 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
7003
7004 if (oldLoc.GetParent())
7005 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
7006
7008 {
7009 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
7010
7011 if (r_index >= 0)
7012 {
7013 InventoryLocation r_il = new InventoryLocation;
7014 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7015
7016 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7019 {
7020 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7021 }
7023 {
7024 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7025 }
7026
7027 }
7028 }
7029
7031 {
7032 if (new_player)
7033 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
7034
7035 if (new_player == old_player)
7036 {
7037
7038 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
7039 {
7041 {
7042 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
7043 {
7044 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7045 }
7046 }
7047 else
7048 {
7049 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7050 }
7051 }
7052
7053 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
7054 {
7055 int type = oldLoc.GetType();
7057 {
7058 oldLoc.GetParent().GetOnSetLock().Invoke(this);
7059 }
7061 {
7062 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
7063 }
7064 }
7065 if (!m_OldLocation)
7066 {
7067 m_OldLocation = new InventoryLocation;
7068 }
7069 m_OldLocation.Copy(oldLoc);
7070 }
7071 else
7072 {
7073 if (m_OldLocation)
7074 {
7075 m_OldLocation.Reset();
7076 }
7077 }
7078
7080 }
7081 else
7082 {
7083 if (new_player)
7084 {
7085 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
7086 if (res_index >= 0)
7087 {
7088 InventoryLocation il = new InventoryLocation;
7089 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
7091 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
7094 {
7095 il.
GetParent().GetOnReleaseLock().Invoke(it);
7096 }
7098 {
7100 }
7101
7102 }
7103 }
7105 {
7106
7108 }
7109
7110 if (m_OldLocation)
7111 {
7112 m_OldLocation.Reset();
7113 }
7114 }
7115 }
7116
7117 override void EOnContact(IEntity other, Contact extra)
7118 {
7120 {
7121 int liquidType = -1;
7123 if (impactSpeed > 0.0)
7124 {
7126 #ifndef SERVER
7128 #else
7130 SetSynchDirty();
7131 #endif
7133 }
7134 }
7135
7136 #ifdef SERVER
7137 if (GetCompEM() && GetCompEM().IsPlugged())
7138 {
7139 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
7140 GetCompEM().UnplugThis();
7141 }
7142 #endif
7143 }
7144
7146
7148 {
7150 }
7151
7153 {
7154
7155 }
7156
7158 {
7159 super.OnItemLocationChanged(old_owner, new_owner);
7160
7161 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7162 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7163
7164 if (!relatedPlayer && playerNew)
7165 relatedPlayer = playerNew;
7166
7167 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7168 {
7170 if (actionMgr)
7171 {
7172 ActionBase currentAction = actionMgr.GetRunningAction();
7173 if (currentAction)
7175 }
7176 }
7177
7178 Man ownerPlayerOld = null;
7179 Man ownerPlayerNew = null;
7180
7181 if (old_owner)
7182 {
7183 if (old_owner.
IsMan())
7184 {
7185 ownerPlayerOld = Man.Cast(old_owner);
7186 }
7187 else
7188 {
7189 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
7190 }
7191 }
7192 else
7193 {
7195 {
7197
7198 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
7199 {
7200 GetCompEM().UnplugThis();
7201 }
7202 }
7203 }
7204
7205 if (new_owner)
7206 {
7207 if (new_owner.
IsMan())
7208 {
7209 ownerPlayerNew = Man.Cast(new_owner);
7210 }
7211 else
7212 {
7213 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
7214 }
7215 }
7216
7217 if (ownerPlayerOld != ownerPlayerNew)
7218 {
7219 if (ownerPlayerOld)
7220 {
7221 array<EntityAI> subItemsExit = new array<EntityAI>;
7223 for (int i = 0; i < subItemsExit.Count(); i++)
7224 {
7227 }
7228 }
7229
7230 if (ownerPlayerNew)
7231 {
7232 array<EntityAI> subItemsEnter = new array<EntityAI>;
7234 for (int j = 0; j < subItemsEnter.Count(); j++)
7235 {
7238 }
7239 }
7240 }
7241 else if (ownerPlayerNew != null)
7242 {
7243 PlayerBase nplayer;
7244 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7245 {
7246 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7248 for (int k = 0; k < subItemsUpdate.Count(); k++)
7249 {
7251 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7252 }
7253 }
7254 }
7255
7256 if (old_owner)
7257 old_owner.OnChildItemRemoved(this);
7258 if (new_owner)
7259 new_owner.OnChildItemReceived(this);
7260 }
7261
7262
7264 {
7265 super.EEDelete(parent);
7266 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7267 if (player)
7268 {
7270
7271 if (player.IsAlive())
7272 {
7273 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7274 if (r_index >= 0)
7275 {
7276 InventoryLocation r_il = new InventoryLocation;
7277 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7278
7279 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7282 {
7283 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7284 }
7286 {
7287 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7288 }
7289
7290 }
7291
7292 player.RemoveQuickBarEntityShortcut(this);
7293 }
7294 }
7295 }
7296
7298 {
7299 super.EEKilled(killer);
7300
7303 {
7304 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7305 {
7306 if (IsMagazine())
7307 {
7308 if (Magazine.Cast(this).GetAmmoCount() > 0)
7309 {
7311 }
7312 }
7313 else
7314 {
7316 }
7317 }
7318 }
7319 }
7320
7322 {
7323 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7324
7325 super.OnWasAttached(parent, slot_id);
7326
7329
7331 }
7332
7334 {
7335 super.OnWasDetached(parent, slot_id);
7336
7339 }
7340
7342 {
7343 int idx;
7346
7347 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7348 if (inventory_slots.Count() < 1)
7349 {
7350 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7351 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7352 }
7353 else
7354 {
7355 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7356 }
7357
7358 idx = inventory_slots.Find(slot);
7359 if (idx < 0)
7360 return "";
7361
7362 return attach_types.Get(idx);
7363 }
7364
7366 {
7367 int idx = -1;
7368 string slot;
7369
7372
7373 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7374 if (inventory_slots.Count() < 1)
7375 {
7376 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7377 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7378 }
7379 else
7380 {
7381 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7382 if (detach_types.Count() < 1)
7383 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7384 }
7385
7386 for (int i = 0; i < inventory_slots.Count(); i++)
7387 {
7388 slot = inventory_slots.Get(i);
7389 }
7390
7391 if (slot != "")
7392 {
7393 if (detach_types.Count() == 1)
7394 idx = 0;
7395 else
7396 idx = inventory_slots.Find(slot);
7397 }
7398 if (idx < 0)
7399 return "";
7400
7401 return detach_types.Get(idx);
7402 }
7403
7405 {
7406
7408
7409
7410 float min_time = 1;
7411 float max_time = 3;
7412 float delay = Math.RandomFloat(min_time, max_time);
7413
7414 explode_timer.Run(delay, this, "DoAmmoExplosion");
7415 }
7416
7418 {
7419 Magazine magazine = Magazine.Cast(this);
7420 int pop_sounds_count = 6;
7421 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7422
7423
7424 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7425 string sound_name = pop_sounds[ sound_idx ];
7427
7428
7429 magazine.ServerAddAmmoCount(-1);
7430
7431
7432 float min_temp_to_explode = 100;
7433
7434 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
7435 {
7437 }
7438 }
7439
7440
7441 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7442 {
7443 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7444
7445 const int CHANCE_DAMAGE_CARGO = 4;
7446 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7447 const int CHANCE_DAMAGE_NOTHING = 2;
7448
7450 {
7451 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7452 int chances;
7453 int rnd;
7454
7455 if (GetInventory().GetCargo())
7456 {
7457 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7458 rnd = Math.RandomInt(0,chances);
7459
7460 if (rnd < CHANCE_DAMAGE_CARGO)
7461 {
7463 }
7464 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7465 {
7467 }
7468 }
7469 else
7470 {
7471 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7472 rnd = Math.RandomInt(0,chances);
7473
7474 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7475 {
7477 }
7478 }
7479 }
7480 }
7481
7483 {
7484 if (GetInventory().GetCargo())
7485 {
7486 int item_count = GetInventory().GetCargo().GetItemCount();
7487 if (item_count > 0)
7488 {
7489 int random_pick = Math.RandomInt(0, item_count);
7491 if (!item.IsExplosive())
7492 {
7493 item.AddHealth("","",damage);
7494 return true;
7495 }
7496 }
7497 }
7498 return false;
7499 }
7500
7502 {
7503 int attachment_count = GetInventory().AttachmentCount();
7504 if (attachment_count > 0)
7505 {
7506 int random_pick = Math.RandomInt(0, attachment_count);
7507 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7508 if (!attachment.IsExplosive())
7509 {
7510 attachment.AddHealth("","",damage);
7511 return true;
7512 }
7513 }
7514 return false;
7515 }
7516
7518 {
7520 }
7521
7523 {
7525 return GetInventory().CanRemoveEntity();
7526
7527 return false;
7528 }
7529
7531 {
7533 return;
7534
7536 {
7537 if (ScriptInputUserData.CanStoreInputUserData())
7538 {
7539 ScriptInputUserData ctx = new ScriptInputUserData;
7544 ctx.
Write(destination_entity);
7548 }
7549 }
7550 else if (!
GetGame().IsMultiplayer())
7551 {
7553 }
7554 }
7555
7557 {
7559 return;
7560
7561 float split_quantity_new;
7565 InventoryLocation loc = new InventoryLocation;
7566
7567 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7568 {
7570 split_quantity_new = stack_max;
7571 else
7573
7574 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7575 if (new_item)
7576 {
7577 new_item.SetResultOfSplit(true);
7578 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7580 new_item.SetQuantity(split_quantity_new);
7581 }
7582 }
7583 else if (destination_entity && slot_id == -1)
7584 {
7585 if (quantity > stack_max)
7586 split_quantity_new = stack_max;
7587 else
7588 split_quantity_new = quantity;
7589
7591 {
7594 }
7595
7596 if (new_item)
7597 {
7598 new_item.SetResultOfSplit(true);
7599 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7601 new_item.SetQuantity(split_quantity_new);
7602 }
7603 }
7604 else
7605 {
7606 if (stack_max != 0)
7607 {
7609 {
7611 }
7612
7613 if (split_quantity_new == 0)
7614 {
7615 if (!
GetGame().IsMultiplayer())
7616 player.PhysicalPredictiveDropItem(this);
7617 else
7618 player.ServerDropEntity(this);
7619 return;
7620 }
7621
7623
7624 if (new_item)
7625 {
7626 new_item.SetResultOfSplit(true);
7627 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7629 new_item.SetQuantity(stack_max);
7630 new_item.PlaceOnSurface();
7631 }
7632 }
7633 }
7634 }
7635
7637 {
7639 return;
7640
7641 float split_quantity_new;
7645 InventoryLocation loc = new InventoryLocation;
7646
7647 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7648 {
7650 split_quantity_new = stack_max;
7651 else
7653
7654 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7655 if (new_item)
7656 {
7657 new_item.SetResultOfSplit(true);
7658 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7660 new_item.SetQuantity(split_quantity_new);
7661 }
7662 }
7663 else if (destination_entity && slot_id == -1)
7664 {
7665 if (quantity > stack_max)
7666 split_quantity_new = stack_max;
7667 else
7668 split_quantity_new = quantity;
7669
7671 {
7674 }
7675
7676 if (new_item)
7677 {
7678 new_item.SetResultOfSplit(true);
7679 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7681 new_item.SetQuantity(split_quantity_new);
7682 }
7683 }
7684 else
7685 {
7686 if (stack_max != 0)
7687 {
7689 {
7691 }
7692
7694
7695 if (new_item)
7696 {
7697 new_item.SetResultOfSplit(true);
7698 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7700 new_item.SetQuantity(stack_max);
7701 new_item.PlaceOnSurface();
7702 }
7703 }
7704 }
7705 }
7706
7708 {
7710 return;
7711
7713 {
7714 if (ScriptInputUserData.CanStoreInputUserData())
7715 {
7716 ScriptInputUserData ctx = new ScriptInputUserData;
7721 dst.WriteToContext(ctx);
7723 }
7724 }
7725 else if (!
GetGame().IsMultiplayer())
7726 {
7728 }
7729 }
7730
7732 {
7734 return;
7735
7737 {
7738 if (ScriptInputUserData.CanStoreInputUserData())
7739 {
7740 ScriptInputUserData ctx = new ScriptInputUserData;
7745 ctx.
Write(destination_entity);
7751 }
7752 }
7753 else if (!
GetGame().IsMultiplayer())
7754 {
7756 }
7757 }
7758
7760 {
7762 }
7763
7765 {
7767 return this;
7768
7770 float split_quantity_new;
7772 if (dst.IsValid())
7773 {
7774 int slot_id = dst.GetSlot();
7776
7777 if (quantity > stack_max)
7778 split_quantity_new = stack_max;
7779 else
7780 split_quantity_new = quantity;
7781
7783
7784 if (new_item)
7785 {
7786 new_item.SetResultOfSplit(true);
7787 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7790 }
7791
7792 return new_item;
7793 }
7794
7795 return null;
7796 }
7797
7799 {
7801 return;
7802
7804 float split_quantity_new;
7806 if (destination_entity)
7807 {
7809 if (quantity > stackable)
7810 split_quantity_new = stackable;
7811 else
7812 split_quantity_new = quantity;
7813
7814 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7815 if (new_item)
7816 {
7817 new_item.SetResultOfSplit(true);
7818 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7820 new_item.SetQuantity(split_quantity_new);
7821 }
7822 }
7823 }
7824
7826 {
7828 return;
7829
7831 {
7832 if (ScriptInputUserData.CanStoreInputUserData())
7833 {
7834 ScriptInputUserData ctx = new ScriptInputUserData;
7839 ItemBase destination_entity =
this;
7840 ctx.
Write(destination_entity);
7844 }
7845 }
7846 else if (!
GetGame().IsMultiplayer())
7847 {
7849 }
7850 }
7851
7853 {
7855 return;
7856
7858 float split_quantity_new;
7860 if (player)
7861 {
7863 if (quantity > stackable)
7864 split_quantity_new = stackable;
7865 else
7866 split_quantity_new = quantity;
7867
7868 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7869 new_item =
ItemBase.Cast(in_hands);
7870 if (new_item)
7871 {
7872 new_item.SetResultOfSplit(true);
7873 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7875 new_item.SetQuantity(split_quantity_new);
7876 }
7877 }
7878 }
7879
7881 {
7883 return;
7884
7886 float split_quantity_new = Math.Floor(quantity * 0.5);
7887
7889
7890 if (new_item)
7891 {
7892 if (new_item.GetQuantityMax() < split_quantity_new)
7893 {
7894 split_quantity_new = new_item.GetQuantityMax();
7895 }
7896
7897 new_item.SetResultOfSplit(true);
7898 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7899
7901 {
7904 }
7905 else
7906 {
7909 }
7910 }
7911 }
7912
7914 {
7916 return;
7917
7919 float split_quantity_new = Math.Floor(quantity / 2);
7920
7921 InventoryLocation invloc = new InventoryLocation;
7923
7925 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7926
7927 if (new_item)
7928 {
7929 if (new_item.GetQuantityMax() < split_quantity_new)
7930 {
7931 split_quantity_new = new_item.GetQuantityMax();
7932 }
7934 {
7937 }
7938 else
7939 {
7942 }
7943 }
7944 }
7945
7948 {
7949 SetWeightDirty();
7951
7952 if (parent)
7953 parent.OnAttachmentQuantityChangedEx(this, delta);
7954
7956 {
7958 {
7960 }
7962 {
7963 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7965 }
7966 }
7967
7968 }
7969
7972 {
7973
7974 }
7975
7978 {
7980 }
7981
7983 {
7984 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7985
7987 {
7988 if (newLevel == GameConstants.STATE_RUINED)
7989 {
7991 EntityAI parent = GetHierarchyParent();
7992 if (parent && parent.IsFireplace())
7993 {
7994 CargoBase cargo = GetInventory().GetCargo();
7995 if (cargo)
7996 {
7998 {
8000 }
8001 }
8002 }
8003 }
8004
8006 {
8007
8009 return;
8010 }
8011
8012 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
8013 {
8015 }
8016 }
8017 }
8018
8019
8021 {
8022 super.OnRightClick();
8023
8025 {
8027 {
8028 if (ScriptInputUserData.CanStoreInputUserData())
8029 {
8030 vector m4[4];
8032
8033 EntityAI root = GetHierarchyRoot();
8034
8035 InventoryLocation dst = new InventoryLocation;
8037 {
8038 if (root)
8039 {
8040 root.GetTransform(m4);
8042 }
8043 else
8044 GetInventory().GetCurrentInventoryLocation(dst);
8045 }
8046 else
8047 {
8049
8050
8051 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
8052 {
8053 if (root)
8054 {
8055 root.GetTransform(m4);
8057 }
8058 else
8059 GetInventory().GetCurrentInventoryLocation(dst);
8060 }
8061 else
8062 {
8063 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
8064 }
8065 }
8066
8067 ScriptInputUserData ctx = new ScriptInputUserData;
8075 }
8076 }
8077 else if (!
GetGame().IsMultiplayer())
8078 {
8080 }
8081 }
8082 }
8083
8084 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
8085 {
8086
8087 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
8088 return false;
8089
8090 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8091 return false;
8092
8093
8095 return false;
8096
8097
8098 Magazine mag = Magazine.Cast(this);
8099 if (mag)
8100 {
8101 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8102 return false;
8103
8104 if (stack_max_limit)
8105 {
8106 Magazine other_mag = Magazine.Cast(other_item);
8107 if (other_item)
8108 {
8109 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8110 return false;
8111 }
8112
8113 }
8114 }
8115 else
8116 {
8117
8119 return false;
8120
8122 return false;
8123 }
8124
8125 PlayerBase player = null;
8126 if (CastTo(player, GetHierarchyRootPlayer()))
8127 {
8128 if (player.GetInventory().HasAttachment(this))
8129 return false;
8130
8131 if (player.IsItemsToDelete())
8132 return false;
8133 }
8134
8135 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8136 return false;
8137
8138 int slotID;
8140 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8141 return false;
8142
8143 return true;
8144 }
8145
8147 {
8149 }
8150
8152 {
8153 return m_IsResultOfSplit;
8154 }
8155
8157 {
8158 m_IsResultOfSplit = value;
8159 }
8160
8162 {
8164 }
8165
8167 {
8168 float other_item_quantity = other_item.GetQuantity();
8169 float this_free_space;
8170
8172
8174
8175 if (other_item_quantity > this_free_space)
8176 {
8177 return this_free_space;
8178 }
8179 else
8180 {
8181 return other_item_quantity;
8182 }
8183 }
8184
8186 {
8188 }
8189
8191 {
8193 return;
8194
8195 if (!IsMagazine() && other_item)
8196 {
8198 if (quantity_used != 0)
8199 {
8200 float hp1 = GetHealth01("","");
8201 float hp2 = other_item.GetHealth01("","");
8202 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
8203 hpResult = hpResult / (
GetQuantity() + quantity_used);
8204
8205 hpResult *= GetMaxHealth();
8206 Math.Round(hpResult);
8207 SetHealth("", "Health", hpResult);
8208
8210 other_item.AddQuantity(-quantity_used);
8211 }
8212 }
8214 }
8215
8217 {
8218 #ifdef SERVER
8219 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8220 GetHierarchyParent().IncreaseLifetimeUp();
8221 #endif
8222 };
8223
8225 {
8226 PlayerBase p = PlayerBase.Cast(player);
8227
8228 array<int> recipesIds = p.m_Recipes;
8229 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8230 if (moduleRecipesManager)
8231 {
8232 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
8233 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8234 }
8235
8236 for (int i = 0;i < recipesIds.Count(); i++)
8237 {
8238 int key = recipesIds.Get(i);
8239 string recipeName = moduleRecipesManager.GetRecipeName(key);
8241 }
8242 }
8243
8244
8245 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8246 {
8247 super.GetDebugActions(outputList);
8248
8249
8254
8255
8259
8263
8264
8267
8268
8270 {
8273 }
8274
8276
8279
8283 }
8284
8285
8286
8287
8289 {
8290 super.OnAction(action_id, player, ctx);
8291 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8292 {
8293 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8294 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8295 PlayerBase p = PlayerBase.Cast(player);
8296 if (
EActions.RECIPES_RANGE_START < 1000)
8297 {
8298 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8299 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8300 }
8301 }
8302 #ifndef SERVER
8303 else if (action_id ==
EActions.WATCH_PLAYER)
8304 {
8305 PluginDeveloper.SetDeveloperItemClientEx(player);
8306 }
8307 #endif
8309 {
8310 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8311 {
8312 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8313 OnDebugButtonPressServer(id + 1);
8314 }
8315
8316 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8317 {
8318 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8320 }
8321
8322 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8323 {
8324 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8326 }
8327
8328 else if (action_id ==
EActions.ADD_QUANTITY)
8329 {
8330 if (IsMagazine())
8331 {
8332 Magazine mag = Magazine.Cast(this);
8333 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8334 }
8335 else
8336 {
8338 }
8339
8340 if (m_EM)
8341 {
8342 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8343 }
8344
8345 }
8346
8347 else if (action_id ==
EActions.REMOVE_QUANTITY)
8348 {
8349 if (IsMagazine())
8350 {
8351 Magazine mag2 = Magazine.Cast(this);
8352 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8353 }
8354 else
8355 {
8357 }
8358 if (m_EM)
8359 {
8360 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8361 }
8362
8363 }
8364
8365 else if (action_id ==
EActions.SET_QUANTITY_0)
8366 {
8368
8369 if (m_EM)
8370 {
8371 m_EM.SetEnergy(0);
8372 }
8373 }
8374
8375 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8376 {
8378
8379 if (m_EM)
8380 {
8381 m_EM.SetEnergy(m_EM.GetEnergyMax());
8382 }
8383 }
8384
8385 else if (action_id ==
EActions.ADD_HEALTH)
8386 {
8387 AddHealth("","",GetMaxHealth("","Health")/5);
8388 }
8389 else if (action_id ==
EActions.REMOVE_HEALTH)
8390 {
8391 AddHealth("","",-GetMaxHealth("","Health")/5);
8392 }
8393 else if (action_id ==
EActions.DESTROY_HEALTH)
8394 {
8395 SetHealth01("","",0);
8396 }
8397 else if (action_id ==
EActions.WATCH_ITEM)
8398 {
8400 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8401 #ifdef DEVELOPER
8402 SetDebugDeveloper_item(this);
8403 #endif
8404 }
8405
8406 else if (action_id ==
EActions.ADD_TEMPERATURE)
8407 {
8408 AddTemperature(20);
8409
8410 }
8411
8412 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8413 {
8414 AddTemperature(-20);
8415
8416 }
8417
8418 else if (action_id ==
EActions.FLIP_FROZEN)
8419 {
8420 SetFrozen(!GetIsFrozen());
8421
8422 }
8423
8424 else if (action_id ==
EActions.ADD_WETNESS)
8425 {
8427
8428 }
8429
8430 else if (action_id ==
EActions.REMOVE_WETNESS)
8431 {
8433
8434 }
8435
8436 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8437 {
8440
8441
8442 }
8443
8444 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8445 {
8448 }
8449
8450 else if (action_id ==
EActions.MAKE_SPECIAL)
8451 {
8452 auto debugParams = DebugSpawnParams.WithPlayer(player);
8453 OnDebugSpawnEx(debugParams);
8454 }
8455
8456 else if (action_id ==
EActions.DELETE)
8457 {
8458 Delete();
8459 }
8460
8461 }
8462
8463
8464 return false;
8465 }
8466
8467
8468
8469
8473
8476
8477
8478
8480 {
8481 return false;
8482 }
8483
8484
8486 {
8487 return true;
8488 }
8489
8490
8492 {
8493 return true;
8494 }
8495
8496
8497
8499 {
8500 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8502 }
8503
8506 {
8507 return null;
8508 }
8509
8511 {
8512 return false;
8513 }
8514
8516 {
8517 return false;
8518 }
8519
8523
8524
8526 {
8527 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8528 return module_repairing.CanRepair(this, item_repair_kit);
8529 }
8530
8531
8532 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8533 {
8534 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8535 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8536 }
8537
8538
8540 {
8541
8542
8543
8544
8545
8546
8547
8548
8549 return 1;
8550 }
8551
8552
8553
8555 {
8557 }
8558
8559
8560
8562 {
8564 }
8565
8566
8575 {
8576 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8577
8578 if (player)
8579 {
8580 player.MessageStatus(text);
8581 }
8582 }
8583
8584
8593 {
8594 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8595
8596 if (player)
8597 {
8598 player.MessageAction(text);
8599 }
8600 }
8601
8602
8611 {
8612 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8613
8614 if (player)
8615 {
8616 player.MessageFriendly(text);
8617 }
8618 }
8619
8620
8629 {
8630 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8631
8632 if (player)
8633 {
8634 player.MessageImportant(text);
8635 }
8636 }
8637
8639 {
8640 return true;
8641 }
8642
8643
8644 override bool KindOf(
string tag)
8645 {
8646 bool found = false;
8647 string item_name = this.
GetType();
8650
8651 int array_size = item_tag_array.Count();
8652 for (int i = 0; i < array_size; i++)
8653 {
8654 if (item_tag_array.Get(i) == tag)
8655 {
8656 found = true;
8657 break;
8658 }
8659 }
8660 return found;
8661 }
8662
8663
8665 {
8666
8667 super.OnRPC(sender, rpc_type,ctx);
8668
8669
8670 switch (rpc_type)
8671 {
8672 #ifndef SERVER
8673 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8674 Param2<bool, string> p = new Param2<bool, string>(false, "");
8675
8677 return;
8678
8679 bool play = p.param1;
8680 string soundSet = p.param2;
8681
8682 if (play)
8683 {
8685 {
8687 {
8689 }
8690 }
8691 else
8692 {
8694 }
8695 }
8696 else
8697 {
8699 }
8700
8701 break;
8702 #endif
8703
8704 }
8705
8707 {
8709 }
8710 }
8711
8712
8713
8714
8716 {
8717 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8718 return plugin.GetID(
name);
8719 }
8720
8722 {
8723 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8724 return plugin.GetName(id);
8725 }
8726
8729 {
8730
8731
8732 int varFlags;
8733 if (!ctx.
Read(varFlags))
8734 return;
8735
8736 if (varFlags & ItemVariableFlags.FLOAT)
8737 {
8739 }
8740 }
8741
8743 {
8744
8745 super.SerializeNumericalVars(floats_out);
8746
8747
8748
8750 {
8752 }
8753
8755 {
8757 }
8758
8760 {
8762 }
8763
8765 {
8770 }
8771
8773 {
8775 }
8776 }
8777
8779 {
8780
8781 super.DeSerializeNumericalVars(floats);
8782
8783
8784 int index = 0;
8785 int mask = Math.Round(floats.Get(index));
8786
8787 index++;
8788
8790 {
8792 {
8794 }
8795 else
8796 {
8797 float quantity = floats.Get(index);
8799 }
8800 index++;
8801 }
8802
8804 {
8805 float wet = floats.Get(index);
8807 index++;
8808 }
8809
8811 {
8812 int liquidtype = Math.Round(floats.Get(index));
8814 index++;
8815 }
8816
8818 {
8820 index++;
8822 index++;
8824 index++;
8826 index++;
8827 }
8828
8830 {
8831 int cleanness = Math.Round(floats.Get(index));
8833 index++;
8834 }
8835 }
8836
8838 {
8839 super.WriteVarsToCTX(ctx);
8840
8841
8843 {
8845 }
8846
8848 {
8850 }
8851
8853 {
8855 }
8856
8858 {
8859 int r,g,b,a;
8865 }
8866
8868 {
8870 }
8871 }
8872
8874 {
8875 if (!super.ReadVarsFromCTX(ctx,version))
8876 return false;
8877
8878 int intValue;
8879 float value;
8880
8881 if (version < 140)
8882 {
8883 if (!ctx.
Read(intValue))
8884 return false;
8885
8886 m_VariablesMask = intValue;
8887 }
8888
8890 {
8891 if (!ctx.
Read(value))
8892 return false;
8893
8895 {
8897 }
8898 else
8899 {
8901 }
8902 }
8903
8904 if (version < 140)
8905 {
8907 {
8908 if (!ctx.
Read(value))
8909 return false;
8910 SetTemperatureDirect(value);
8911 }
8912 }
8913
8915 {
8916 if (!ctx.
Read(value))
8917 return false;
8919 }
8920
8922 {
8923 if (!ctx.
Read(intValue))
8924 return false;
8926 }
8927
8929 {
8930 int r,g,b,a;
8932 return false;
8934 return false;
8936 return false;
8938 return false;
8939
8941 }
8942
8944 {
8945 if (!ctx.
Read(intValue))
8946 return false;
8948 }
8949
8950 if (version >= 138 && version < 140)
8951 {
8953 {
8954 if (!ctx.
Read(intValue))
8955 return false;
8956 SetFrozen(intValue);
8957 }
8958 }
8959
8960 return true;
8961 }
8962
8963
8965 {
8968 {
8970 }
8971
8972 if (!super.OnStoreLoad(ctx, version))
8973 {
8975 return false;
8976 }
8977
8978 if (version >= 114)
8979 {
8980 bool hasQuickBarIndexSaved;
8981
8982 if (!ctx.
Read(hasQuickBarIndexSaved))
8983 {
8985 return false;
8986 }
8987
8988 if (hasQuickBarIndexSaved)
8989 {
8990 int itmQBIndex;
8991
8992
8993 if (!ctx.
Read(itmQBIndex))
8994 {
8996 return false;
8997 }
8998
8999 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
9000 if (itmQBIndex != -1 && parentPlayer)
9001 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
9002 }
9003 }
9004 else
9005 {
9006
9007 PlayerBase player;
9008 int itemQBIndex;
9009 if (version ==
int.
MAX)
9010 {
9011 if (!ctx.
Read(itemQBIndex))
9012 {
9014 return false;
9015 }
9016 }
9017 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
9018 {
9019
9020 if (!ctx.
Read(itemQBIndex))
9021 {
9023 return false;
9024 }
9025 if (itemQBIndex != -1 && player)
9026 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
9027 }
9028 }
9029
9030 if (version < 140)
9031 {
9032
9033 if (!LoadVariables(ctx, version))
9034 {
9036 return false;
9037 }
9038 }
9039
9040
9042 {
9044 return false;
9045 }
9046 if (version >= 132)
9047 {
9049 if (raib)
9050 {
9052 {
9054 return false;
9055 }
9056 }
9057 }
9058
9060 return true;
9061 }
9062
9063
9064
9066 {
9067 super.OnStoreSave(ctx);
9068
9069 PlayerBase player;
9070 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9071 {
9073
9074 int itemQBIndex = -1;
9075 itemQBIndex = player.FindQuickBarEntityIndex(this);
9076 ctx.
Write(itemQBIndex);
9077 }
9078 else
9079 {
9081 }
9082
9084
9086 if (raib)
9087 {
9089 }
9090 }
9091
9092
9094 {
9095 super.AfterStoreLoad();
9096
9098 {
9100 }
9101
9103 {
9106 }
9107 }
9108
9110 {
9111 super.EEOnAfterLoad();
9112
9114 {
9116 }
9117
9120 }
9121
9123 {
9124 return false;
9125 }
9126
9127
9128
9130 {
9132 {
9133 #ifdef PLATFORM_CONSOLE
9134
9136 {
9138 if (menu)
9139 {
9141 }
9142 }
9143 #endif
9144 }
9145
9147 {
9150 }
9151
9153 {
9154 SetWeightDirty();
9156 }
9158 {
9161 }
9162
9164 {
9167 }
9169 {
9172 }
9173
9174 super.OnVariablesSynchronized();
9175 }
9176
9177
9178
9180 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9181 {
9182 if (!IsServerCheck(allow_client))
9183 return false;
9184
9186 return false;
9187
9190
9191 if (value <= (min + 0.001))
9192 value = min;
9193
9194 if (value == min)
9195 {
9196 if (destroy_config)
9197 {
9198 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9199 if (dstr)
9200 {
9202 this.Delete();
9203 return true;
9204 }
9205 }
9206 else if (destroy_forced)
9207 {
9209 this.Delete();
9210 return true;
9211 }
9212
9214 }
9215
9218
9220 {
9222
9223 if (delta)
9225 }
9226
9228
9229 return false;
9230 }
9231
9232
9234 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9235 {
9237 }
9238
9240 {
9243 }
9244
9246 {
9249 }
9250
9253 {
9254 float value_clamped = Math.Clamp(value, 0, 1);
9256 SetQuantity(result, destroy_config, destroy_forced);
9257 }
9258
9259
9262 {
9264 }
9265
9267 {
9269 }
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9281 {
9282 int slot = -1;
9283 if (GetInventory())
9284 {
9285 InventoryLocation il = new InventoryLocation;
9286 GetInventory().GetCurrentInventoryLocation(il);
9288 }
9289
9291 }
9292
9294 {
9295 float quantity_max = 0;
9296
9298 {
9299 if (attSlotID != -1)
9300 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9301
9302 if (quantity_max <= 0)
9304 }
9305
9306 if (quantity_max <= 0)
9308
9309 return quantity_max;
9310 }
9311
9313 {
9315 }
9316
9318 {
9320 }
9321
9322
9324 {
9326 }
9327
9329 {
9331 }
9332
9334 {
9336 }
9337
9338
9340 {
9341
9342 float weightEx = GetWeightEx();
9343 float special = GetInventoryAndCargoWeight();
9344 return weightEx - special;
9345 }
9346
9347
9349 {
9351 }
9352
9354 {
9356 {
9357 #ifdef DEVELOPER
9358 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9359 {
9360 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9362 }
9363 #endif
9364
9366 }
9367 else if (HasEnergyManager())
9368 {
9369 #ifdef DEVELOPER
9370 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9371 {
9372 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9373 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9374 }
9375 #endif
9376 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
9377 }
9378 else
9379 {
9380 #ifdef DEVELOPER
9381 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9382 {
9383 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9384 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9385 }
9386 #endif
9387 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
9388 }
9389 }
9390
9393 {
9394 int item_count = 0;
9396
9397 if (GetInventory().GetCargo() != NULL)
9398 {
9399 item_count = GetInventory().GetCargo().GetItemCount();
9400 }
9401
9402 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
9403 {
9404 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
9405 if (item)
9406 item_count += item.GetNumberOfItems();
9407 }
9408 return item_count;
9409 }
9410
9413 {
9414 float weight = 0;
9415 float wetness = 1;
9416 if (include_wetness)
9419 {
9420 weight = wetness * m_ConfigWeight;
9421 }
9423 {
9424 weight = 1;
9425 }
9426 return weight;
9427 }
9428
9429
9430
9432 {
9433 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
9434 {
9435 GameInventory inv = GetInventory();
9436 array<EntityAI> items = new array<EntityAI>;
9438 for (int i = 0; i < items.Count(); i++)
9439 {
9441 if (item)
9442 {
9444 }
9445 }
9446 }
9447 }
9448
9449
9450
9451
9453 {
9454 float energy = 0;
9455 if (HasEnergyManager())
9456 {
9457 energy = GetCompEM().GetEnergy();
9458 }
9459 return energy;
9460 }
9461
9462
9464 {
9465 super.OnEnergyConsumed();
9466
9468 }
9469
9471 {
9472 super.OnEnergyAdded();
9473
9475 }
9476
9477
9479 {
9480 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9481 {
9483 {
9484 float energy_0to1 = GetCompEM().GetEnergy0To1();
9486 }
9487 }
9488 }
9489
9490
9492 {
9493 return ConfigGetFloat("heatIsolation");
9494 }
9495
9497 {
9499 }
9500
9502 {
9503 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9504 if (
GetGame().ConfigIsExisting(paramPath))
9506
9507 return 0.0;
9508 }
9509
9511 {
9512 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9513 if (
GetGame().ConfigIsExisting(paramPath))
9515
9516 return 0.0;
9517 }
9518
9519 override void SetWet(
float value,
bool allow_client =
false)
9520 {
9521 if (!IsServerCheck(allow_client))
9522 return;
9523
9526
9528
9529 m_VarWet = Math.Clamp(value, min, max);
9530
9532 {
9535 }
9536 }
9537
9538 override void AddWet(
float value)
9539 {
9541 }
9542
9544 {
9546 }
9547
9549 {
9551 }
9552
9554 {
9556 }
9557
9559 {
9561 }
9562
9564 {
9566 }
9567
9569 {
9572 if (newLevel != oldLevel)
9573 {
9575 }
9576 }
9577
9579 {
9580 SetWeightDirty();
9581 }
9582
9584 {
9585 return GetWetLevelInternal(
m_VarWet);
9586 }
9587
9588
9589
9591 {
9593 }
9594
9596 {
9598 }
9599
9601 {
9603 }
9604
9606 {
9608 }
9609
9610
9611
9613 {
9614 if (ConfigIsExisting("itemModelLength"))
9615 {
9616 return ConfigGetFloat("itemModelLength");
9617 }
9618 return 0;
9619 }
9620
9622 {
9623 if (ConfigIsExisting("itemAttachOffset"))
9624 {
9625 return ConfigGetFloat("itemAttachOffset");
9626 }
9627 return 0;
9628 }
9629
9630 override void SetCleanness(
int value,
bool allow_client =
false)
9631 {
9632 if (!IsServerCheck(allow_client))
9633 return;
9634
9636
9638
9641 }
9642
9644 {
9646 }
9647
9649 {
9650 return true;
9651 }
9652
9653
9654
9655
9657 {
9659 }
9660
9662 {
9664 }
9665
9666
9667
9668
9669 override void SetColor(
int r,
int g,
int b,
int a)
9670 {
9676 }
9678 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9679 {
9684 }
9685
9687 {
9689 }
9690
9693 {
9694 int r,g,b,a;
9696 r = r/255;
9697 g = g/255;
9698 b = b/255;
9699 a = a/255;
9700 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9701 }
9702
9703
9704
9705 override void SetLiquidType(
int value,
bool allow_client =
false)
9706 {
9707 if (!IsServerCheck(allow_client))
9708 return;
9709
9714 }
9715
9717 {
9718 return ConfigGetInt("varLiquidTypeInit");
9719 }
9720
9722 {
9724 }
9725
9727 {
9729 SetFrozen(false);
9730 }
9731
9734 {
9735 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9736 }
9737
9738
9741 {
9742 PlayerBase nplayer;
9743 if (PlayerBase.CastTo(nplayer, player))
9744 {
9746
9747 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9748 }
9749 }
9750
9751
9754 {
9755 PlayerBase nplayer;
9756 if (PlayerBase.CastTo(nplayer,player))
9757 {
9758
9759 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9760
9761 }
9762
9763
9764 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9765
9766
9767 if (HasEnergyManager())
9768 {
9769 GetCompEM().UpdatePlugState();
9770 }
9771 }
9772
9773
9775 {
9776 super.OnPlacementStarted(player);
9777
9779 }
9780
9781 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9782 {
9784 {
9785 m_AdminLog.OnPlacementComplete(player,
this);
9786 }
9787
9788 super.OnPlacementComplete(player, position, orientation);
9789 }
9790
9791
9792
9793
9794
9796 {
9798 {
9799 return true;
9800 }
9801 else
9802 {
9803 return false;
9804 }
9805 }
9806
9807
9809 {
9811 {
9813 }
9814 }
9815
9816
9818 {
9820 }
9821
9823 {
9825 }
9826
9827 override void InsertAgent(
int agent,
float count = 1)
9828 {
9829 if (count < 1)
9830 return;
9831
9833 }
9834
9837 {
9839 }
9840
9841
9843 {
9845 }
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9889 {
9891 return false;
9892 return true;
9893 }
9894
9896 {
9897
9899 }
9900
9901
9904 {
9905 super.CheckForRoofLimited(timeTresholdMS);
9906
9908 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9909 {
9910 m_PreviousRoofTestTime = time;
9911 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9912 }
9913 }
9914
9915
9917 {
9919 {
9920 return 0;
9921 }
9922
9923 if (GetInventory().GetAttachmentSlotsCount() != 0)
9924 {
9925 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9926 if (filter)
9927 return filter.GetProtectionLevel(type, false, system);
9928 else
9929 return 0;
9930 }
9931
9932 string subclassPath, entryName;
9933
9934 switch (type)
9935 {
9937 entryName = "biological";
9938 break;
9940 entryName = "chemical";
9941 break;
9942 default:
9943 entryName = "biological";
9944 break;
9945 }
9946
9947 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9948
9950 }
9951
9952
9953
9956 {
9957 if (!IsMagazine())
9959
9961 }
9962
9963
9964
9965
9966
9971 {
9972 return true;
9973 }
9974
9976 {
9978 }
9979
9980
9981
9982
9983
9985 {
9986 if (parent)
9987 {
9988 if (parent.IsInherited(DayZInfected))
9989 return true;
9990
9991 if (!parent.IsRuined())
9992 return true;
9993 }
9994
9995 return true;
9996 }
9997
9999 {
10000 if (!super.CanPutAsAttachment(parent))
10001 {
10002 return false;
10003 }
10004
10005 if (!IsRuined() && !parent.IsRuined())
10006 {
10007 return true;
10008 }
10009
10010 return false;
10011 }
10012
10014 {
10015
10016
10017
10018
10019 return super.CanReceiveItemIntoCargo(item);
10020 }
10021
10023 {
10024
10025
10026
10027
10028 GameInventory attachmentInv = attachment.GetInventory();
10030 {
10031 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10032 return false;
10033 }
10034
10035 InventoryLocation loc = new InventoryLocation();
10036 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10037 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
10038 return false;
10039
10040 return super.CanReceiveAttachment(attachment, slotId);
10041 }
10042
10044 {
10045 if (!super.CanReleaseAttachment(attachment))
10046 return false;
10047
10048 return GetInventory().AreChildrenAccessible();
10049 }
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10072 {
10073 int id = muzzle_owner.GetMuzzleID();
10074 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
10075
10076 if (WPOF_array)
10077 {
10078 for (int i = 0; i < WPOF_array.Count(); i++)
10079 {
10080 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10081
10082 if (WPOF)
10083 {
10084 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10085 }
10086 }
10087 }
10088 }
10089
10090
10092 {
10093 int id = muzzle_owner.GetMuzzleID();
10095
10096 if (WPOBE_array)
10097 {
10098 for (int i = 0; i < WPOBE_array.Count(); i++)
10099 {
10100 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10101
10102 if (WPOBE)
10103 {
10104 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10105 }
10106 }
10107 }
10108 }
10109
10110
10112 {
10113 int id = muzzle_owner.GetMuzzleID();
10114 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10115
10116 if (WPOOH_array)
10117 {
10118 for (int i = 0; i < WPOOH_array.Count(); i++)
10119 {
10120 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10121
10122 if (WPOOH)
10123 {
10124 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10125 }
10126 }
10127 }
10128 }
10129
10130
10132 {
10133 int id = muzzle_owner.GetMuzzleID();
10134 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10135
10136 if (WPOOH_array)
10137 {
10138 for (int i = 0; i < WPOOH_array.Count(); i++)
10139 {
10140 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10141
10142 if (WPOOH)
10143 {
10144 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10145 }
10146 }
10147 }
10148 }
10149
10150
10152 {
10153 int id = muzzle_owner.GetMuzzleID();
10154 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10155
10156 if (WPOOH_array)
10157 {
10158 for (int i = 0; i < WPOOH_array.Count(); i++)
10159 {
10160 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10161
10162 if (WPOOH)
10163 {
10164 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10165 }
10166 }
10167 }
10168 }
10169
10170
10171
10173 {
10175 {
10176 return true;
10177 }
10178
10179 return false;
10180 }
10181
10183 {
10185 {
10186 return true;
10187 }
10188
10189 return false;
10190 }
10191
10193 {
10195 {
10196 return true;
10197 }
10198
10199 return false;
10200 }
10201
10203 {
10204 return false;
10205 }
10206
10209 {
10210 return UATimeSpent.DEFAULT_DEPLOY;
10211 }
10212
10213
10214
10215
10217 {
10219 SetSynchDirty();
10220 }
10221
10223 {
10225 }
10226
10227
10229 {
10230 return false;
10231 }
10232
10235 {
10236 string att_type = "None";
10237
10238 if (ConfigIsExisting("soundAttType"))
10239 {
10240 att_type = ConfigGetString("soundAttType");
10241 }
10242
10244 }
10245
10247 {
10249 }
10250
10251
10252
10253
10254
10258
10260 {
10263
10265 }
10266
10267
10269 {
10271 return;
10272
10274
10277
10280
10281 SoundParameters params = new SoundParameters();
10285 }
10286
10287
10289 {
10291 return;
10292
10294 SetSynchDirty();
10295
10298 }
10299
10300
10302 {
10304 return;
10305
10307 SetSynchDirty();
10308
10311 }
10312
10314 {
10316 }
10317
10319 {
10321 }
10322
10325 {
10326 if (!
GetGame().IsDedicatedServer())
10327 {
10328 if (ConfigIsExisting("attachSoundSet"))
10329 {
10330 string cfg_path = "";
10331 string soundset = "";
10332 string type_name =
GetType();
10333
10336 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10337 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10338
10339 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10340 {
10341 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10342 {
10343 if (cfg_slot_array[i] == slot_type)
10344 {
10345 soundset = cfg_soundset_array[i];
10346 break;
10347 }
10348 }
10349 }
10350
10351 if (soundset != "")
10352 {
10353 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10355 }
10356 }
10357 }
10358 }
10359
10361 {
10362
10363 }
10364
10365 void OnApply(PlayerBase player);
10366
10368 {
10369 return 1.0;
10370 };
10371
10373 {
10375 }
10376
10378 {
10380 }
10381
10383
10385 {
10386 SetDynamicPhysicsLifeTime(0.01);
10388 }
10389
10391 {
10392 array<string> zone_names = new array<string>;
10393 GetDamageZones(zone_names);
10394 for (int i = 0; i < zone_names.Count(); i++)
10395 {
10396 SetHealthMax(zone_names.Get(i),"Health");
10397 }
10398 SetHealthMax("","Health");
10399 }
10400
10403 {
10404 float global_health = GetHealth01("","Health");
10405 array<string> zones = new array<string>;
10406 GetDamageZones(zones);
10407
10408 for (int i = 0; i < zones.Count(); i++)
10409 {
10410 SetHealth01(zones.Get(i),"Health",global_health);
10411 }
10412 }
10413
10416 {
10417 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10418 }
10419
10421 {
10422 if (!hasRootAsPlayer)
10423 {
10424 if (refParentIB)
10425 {
10426
10427 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10428 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10429
10430 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10431 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10432
10435 }
10436 else
10437 {
10438
10441 }
10442 }
10443 }
10444
10446 {
10448 {
10449 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10450 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
10451 {
10452 float heatPermCoef = 1.0;
10454 while (ent)
10455 {
10456 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10457 ent = ent.GetHierarchyParent();
10458 }
10459
10460 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10461 }
10462 }
10463 }
10464
10466 {
10467
10468 EntityAI parent = GetHierarchyParent();
10469 if (!parent)
10470 {
10471 hasParent = false;
10472 hasRootAsPlayer = false;
10473 }
10474 else
10475 {
10476 hasParent = true;
10477 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10478 refParentIB =
ItemBase.Cast(parent);
10479 }
10480 }
10481
10482 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10483 {
10484
10485 }
10486
10488 {
10489
10490 return false;
10491 }
10492
10494 {
10495
10496
10497 return false;
10498 }
10499
10501 {
10502
10503 return false;
10504 }
10505
10508 {
10509 return !GetIsFrozen() &&
IsOpen();
10510 }
10511
10513 {
10514 bool hasParent = false, hasRootAsPlayer = false;
10516
10517 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10518 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10519
10520 if (wwtu || foodDecay)
10521 {
10525
10526 if (processWetness || processTemperature || processDecay)
10527 {
10529
10530 if (processWetness)
10531 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10532
10533 if (processTemperature)
10535
10536 if (processDecay)
10537 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10538 }
10539 }
10540 }
10541
10544 {
10546 }
10547
10549 {
10552
10553 return super.GetTemperatureFreezeThreshold();
10554 }
10555
10557 {
10560
10561 return super.GetTemperatureThawThreshold();
10562 }
10563
10565 {
10568
10569 return super.GetItemOverheatThreshold();
10570 }
10571
10573 {
10575 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10576
10577 return super.GetTemperatureFreezeTime();
10578 }
10579
10581 {
10583 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10584
10585 return super.GetTemperatureThawTime();
10586 }
10587
10592
10594 {
10595 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10596 }
10597
10599 {
10600 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10601 }
10602
10605 {
10607 }
10608
10610 {
10612 }
10613
10615 {
10617 }
10618
10621 {
10622 return null;
10623 }
10624
10627 {
10628 return false;
10629 }
10630
10632 {
10634 {
10637 if (!trg)
10638 {
10640 explosive = this;
10641 }
10642
10643 explosive.PairRemote(trg);
10645
10646 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10647 trg.SetPersistentPairID(persistentID);
10648 explosive.SetPersistentPairID(persistentID);
10649
10650 return true;
10651 }
10652 return false;
10653 }
10654
10657 {
10658 float ret = 1.0;
10661 ret *= GetHealth01();
10662
10663 return ret;
10664 }
10665
10666 #ifdef DEVELOPER
10667 override void SetDebugItem()
10668 {
10669 super.SetDebugItem();
10670 _itemBase = this;
10671 }
10672
10674 {
10675 string text = super.GetDebugText();
10676
10678 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10679
10680 return text;
10681 }
10682 #endif
10683
10685 {
10686 return true;
10687 }
10688
10690
10692
10694 {
10697 }
10698
10699
10707
10723}
10724
10726{
10728 if (entity)
10729 {
10730 bool is_item = entity.IsInherited(
ItemBase);
10731 if (is_item && full_quantity)
10732 {
10735 }
10736 }
10737 else
10738 {
10740 return NULL;
10741 }
10742 return entity;
10743}
10744
10746{
10747 if (item)
10748 {
10749 if (health > 0)
10750 item.SetHealth("", "", health);
10751
10752 if (item.CanHaveTemperature())
10753 {
10755 if (item.CanFreeze())
10756 item.SetFrozen(false);
10757 }
10758
10759 if (item.HasEnergyManager())
10760 {
10761 if (quantity >= 0)
10762 {
10763 item.GetCompEM().SetEnergy0To1(quantity);
10764 }
10765 else
10766 {
10768 }
10769 }
10770 else if (item.IsMagazine())
10771 {
10772 Magazine mag = Magazine.Cast(item);
10773 if (quantity >= 0)
10774 {
10775 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10776 }
10777 else
10778 {
10780 }
10781
10782 }
10783 else
10784 {
10785 if (quantity >= 0)
10786 {
10787 item.SetQuantityNormalized(quantity, false);
10788 }
10789 else
10790 {
10792 }
10793
10794 }
10795 }
10796}
10797
10798#ifdef DEVELOPER
10800#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.