5874{
5876 {
5877 return true;
5878 }
5879};
5880
5882{
5883
5884};
5885
5886
5887
5889{
5893
5895
5898
5899
5900
5901
5902
5911
5917
5922
5927
5948 protected bool m_IsResultOfSplit
5949
5951
5956
5957
5958
5960
5964
5965
5966
5968
5971
5972
5973
5979
5980
5988
5991
5992
5994
5995
5997
5998
6003
6004
6009
6011
6012
6014
6015
6017 {
6022
6023 if (!
g_Game.IsDedicatedServer())
6024 {
6026 {
6028
6030 {
6032 }
6033 }
6034
6037 }
6038
6039 m_OldLocation = null;
6040
6042 {
6044 }
6045
6046 if (ConfigIsExisting("headSelectionsToHide"))
6047 {
6050 }
6051
6053 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
6054 {
6056 }
6057
6059
6060 m_IsResultOfSplit = false;
6061
6063 }
6064
6066 {
6067 super.InitItemVariables();
6068
6074 m_Count = ConfigGetInt(
"count");
6075
6078
6083
6086
6091
6103
6107
6108
6111 if (ConfigIsExisting("canBeSplit"))
6112 {
6115 }
6116
6118 if (ConfigIsExisting("itemBehaviour"))
6120
6121
6124 RegisterNetSyncVariableInt("m_VarLiquidType");
6125 RegisterNetSyncVariableInt("m_Cleanness",0,1);
6126
6127 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
6128 RegisterNetSyncVariableFloat("m_ImpactSpeed");
6129 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
6130
6131 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
6132 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
6133 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
6134 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
6135
6136 RegisterNetSyncVariableBool("m_IsBeingPlaced");
6137 RegisterNetSyncVariableBool("m_IsTakeable");
6138 RegisterNetSyncVariableBool("m_IsHologram");
6139
6142 {
6145 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
6146 }
6147
6149
6151 if (ConfigIsExisting("temperaturePerQuantityWeight"))
6153
6155 }
6156
6158 {
6160 }
6161
6163 {
6166 {
6171 }
6172 }
6173
6174 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
6175 {
6177 {
6180 }
6181
6183 }
6184
6186 {
6192 }
6193
6195
6197 {
6199
6200 if (!action)
6201 {
6202 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6203 return;
6204 }
6205
6207 if (!ai)
6208 {
6210 return;
6211 }
6212
6214 if (!action_array)
6215 {
6216 action_array = new array<ActionBase_Basic>;
6218 }
6219 if (LogManager.IsActionLogEnable())
6220 {
6221 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6222 }
6223
6224 if (action_array.Find(action) != -1)
6225 {
6226 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6227 }
6228 else
6229 {
6230 action_array.Insert(action);
6231 }
6232 }
6233
6235 {
6236 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6237 ActionBase action = player.GetActionManager().GetAction(actionName);
6240
6241 if (action_array)
6242 {
6243 action_array.RemoveItem(action);
6244 }
6245 }
6246
6247
6248
6250 {
6251 ActionOverrideData overrideData = new ActionOverrideData();
6255
6257 if (!actionMap)
6258 {
6261 }
6262
6263 actionMap.Insert(this.
Type(), overrideData);
6264
6265 }
6266
6268
6270
6271
6273 {
6276
6279
6280 string config_to_search = "CfgVehicles";
6281 string muzzle_owner_config;
6282
6284 {
6285 if (IsInherited(Weapon))
6286 config_to_search = "CfgWeapons";
6287
6288 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6289
6290 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6291
6292 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6293
6294 if (config_OnFire_subclass_count > 0)
6295 {
6296 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6297
6298 for (int i = 0; i < config_OnFire_subclass_count; i++)
6299 {
6300 string particle_class = "";
6301 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6302 string config_OnFire_entry = config_OnFire_class + particle_class;
6303 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6304 WPOF_array.Insert(WPOF);
6305 }
6306
6307
6309 }
6310 }
6311
6313 {
6314 config_to_search = "CfgWeapons";
6315 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6316
6317 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6318
6319 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6320
6321 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6322 {
6323 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6324
6325 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6326 {
6327 string particle_class2 = "";
6328 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6329 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6330 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6331 WPOBE_array.Insert(WPOBE);
6332 }
6333
6334
6336 }
6337 }
6338 }
6339
6340
6342 {
6345
6347 {
6348 string config_to_search = "CfgVehicles";
6349
6350 if (IsInherited(Weapon))
6351 config_to_search = "CfgWeapons";
6352
6353 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6354 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6355
6356 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6357 {
6358
6360
6362 {
6364 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6366 return;
6367 }
6368
6371
6372
6373
6374 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6375 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6376
6377 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6378 {
6379 string particle_class = "";
6380 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6381 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6382 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6383
6384 if (entry_type == CT_CLASS)
6385 {
6386 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6387 WPOOH_array.Insert(WPOF);
6388 }
6389 }
6390
6391
6393 }
6394 }
6395 }
6396
6398 {
6400 }
6401
6403 {
6405 {
6407
6410
6413
6414 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6415 }
6416 }
6417
6419 {
6421 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6422
6424 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6425
6427 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6428
6430 {
6432 }
6433 }
6434
6436 {
6438 }
6439
6441 {
6444 else
6446
6448 {
6451 }
6452 else
6453 {
6456
6459 }
6460
6462 }
6463
6465 {
6467 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6468 }
6469
6471 {
6473 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6475 }
6476
6478 {
6480 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6481 }
6482
6484 {
6487
6488 OverheatingParticle OP = new OverheatingParticle();
6493
6495 }
6496
6498 {
6501
6502 return -1;
6503 }
6504
6506 {
6508 {
6511
6512 for (int i = count; i > 0; --i)
6513 {
6514 int id = i - 1;
6517
6520
6521 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6522 {
6523 if (p)
6524 {
6527 }
6528 }
6529 }
6530 }
6531 }
6532
6534 {
6536 {
6538 {
6539 int id = i - 1;
6541
6542 if (OP)
6543 {
6545
6546 if (p)
6547 {
6549 }
6550
6551 delete OP;
6552 }
6553 }
6554
6557 }
6558 }
6559
6562 {
6563 return 0.0;
6564 }
6565
6566
6568 {
6569 return 250;
6570 }
6571
6573 {
6574 return 0;
6575 }
6576
6579 {
6581 return true;
6582
6583 return false;
6584 }
6585
6588 {
6591
6593 {
6595 }
6596 else
6597 {
6598
6600 }
6601
6603 }
6604
6611 {
6612 return -1;
6613 }
6614
6615
6616
6617
6619 {
6621 {
6622 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6623 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6624
6625 if (r_index >= 0)
6626 {
6627 InventoryLocation r_il = new InventoryLocation;
6628 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6629
6630 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6633 {
6634 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6635 }
6637 {
6638 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6639 }
6640
6641 }
6642
6643 player.GetHumanInventory().ClearUserReservedLocation(this);
6644 }
6645
6648 }
6649
6650
6651
6652
6654 {
6655 return ItemBase.m_DebugActionsMask;
6656 }
6657
6659 {
6660 return ItemBase.m_DebugActionsMask & mask;
6661 }
6662
6664 {
6665 ItemBase.m_DebugActionsMask = mask;
6666 }
6667
6669 {
6670 ItemBase.m_DebugActionsMask |= mask;
6671 }
6672
6674 {
6675 ItemBase.m_DebugActionsMask &= ~mask;
6676 }
6677
6679 {
6681 {
6683 }
6684 else
6685 {
6687 }
6688 }
6689
6690
6692 {
6693 if (GetEconomyProfile())
6694 {
6695 float q_max = GetEconomyProfile().GetQuantityMax();
6696 if (q_max > 0)
6697 {
6698 float q_min = GetEconomyProfile().GetQuantityMin();
6699 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6700
6702 {
6703 ComponentEnergyManager comp = GetCompEM();
6705 {
6707 }
6708 }
6710 {
6712
6713 }
6714
6715 }
6716 }
6717 }
6718
6721 {
6722 EntityAI parent = GetHierarchyParent();
6723
6724 if (parent)
6725 {
6726 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6727 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6728 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6729 }
6730 }
6731
6734 {
6735 EntityAI parent = GetHierarchyParent();
6736
6737 if (parent)
6738 {
6739 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6740 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6741 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6742 }
6743 }
6744
6746 {
6747
6748
6749
6750
6752
6754 {
6755 if (ScriptInputUserData.CanStoreInputUserData())
6756 {
6757 ScriptInputUserData ctx = new ScriptInputUserData;
6763 ctx.
Write(use_stack_max);
6766
6768 {
6769 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6770 }
6771 }
6772 }
6773 else if (!
g_Game.IsMultiplayer())
6774 {
6776 }
6777 }
6778
6780 {
6782 }
6783
6785 {
6787 }
6788
6790 {
6792 }
6793
6795 {
6796
6797 return false;
6798 }
6799
6801 {
6802 return false;
6803 }
6804
6808 {
6809 return false;
6810 }
6811
6813 {
6814 return "";
6815 }
6816
6818
6820 {
6821 return false;
6822 }
6823
6825 {
6826 return true;
6827 }
6828
6829
6830
6832 {
6833 return true;
6834 }
6835
6837 {
6838 return true;
6839 }
6840
6842 {
6843 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6845 }
6846
6848 {
6850 }
6851
6853 {
6855 if (!is_being_placed)
6857 SetSynchDirty();
6858 }
6859
6860
6862
6864 {
6866 }
6867
6869 {
6871 }
6872
6874 {
6875 return 1;
6876 }
6877
6879 {
6880 return false;
6881 }
6882
6884 {
6886 SetSynchDirty();
6887 }
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6924 {
6925 super.OnMovedInsideCargo(container);
6926
6927 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6928 }
6929
6930 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6931 {
6932 super.EEItemLocationChanged(oldLoc, newLoc);
6933
6934 PlayerBase newPlayer = null;
6935 PlayerBase oldPlayer = null;
6936
6937 if (newLoc.GetParent())
6938 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6939
6940 if (oldLoc.GetParent())
6941 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6942
6944 {
6945 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6946
6947 if (rIndex >= 0)
6948 {
6949 InventoryLocation rIl = new InventoryLocation;
6950 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6951
6952 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6955 {
6956 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6957 }
6959 {
6961 }
6962
6963 }
6964 }
6965
6967 {
6968 if (newPlayer)
6969 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6970
6971 if (newPlayer == oldPlayer)
6972 {
6973 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6974 {
6976 {
6977 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6978 {
6979 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6980 }
6981 }
6982 else
6983 {
6984 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6985 }
6986 }
6987
6988 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6989 {
6990 int type = oldLoc.GetType();
6992 {
6993 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6994 }
6996 {
6997 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6998 }
6999 }
7000 if (!m_OldLocation)
7001 {
7002 m_OldLocation = new InventoryLocation;
7003 }
7004 m_OldLocation.Copy(oldLoc);
7005 }
7006 else
7007 {
7008 if (m_OldLocation)
7009 {
7010 m_OldLocation.Reset();
7011 }
7012 }
7013
7014 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
7015 }
7016 else
7017 {
7018 if (newPlayer)
7019 {
7020 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
7021 if (resIndex >= 0)
7022 {
7023 InventoryLocation il = new InventoryLocation;
7024 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
7026 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
7029 {
7030 il.
GetParent().GetOnReleaseLock().Invoke(it);
7031 }
7033 {
7035 }
7036
7037 }
7038 }
7040 {
7041
7043 }
7044
7045 if (m_OldLocation)
7046 {
7047 m_OldLocation.Reset();
7048 }
7049 }
7050
7052 {
7053 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
7054 }
7055
7057 {
7058 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
7059 }
7060 }
7061
7062 override void EOnContact(IEntity other, Contact extra)
7063 {
7065 {
7066 int liquidType = -1;
7068 if (impactSpeed > 0.0)
7069 {
7071 #ifndef SERVER
7073 #else
7075 SetSynchDirty();
7076 #endif
7078 }
7079 }
7080
7081 #ifdef SERVER
7082 if (GetCompEM() && GetCompEM().IsPlugged())
7083 {
7084 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
7085 GetCompEM().UnplugThis();
7086 }
7087 #endif
7088 }
7089
7091
7093 {
7095 }
7096
7098 {
7099
7100 }
7101
7103 {
7104 super.OnItemLocationChanged(old_owner, new_owner);
7105
7106 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7107 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7108
7109 if (!relatedPlayer && playerNew)
7110 relatedPlayer = playerNew;
7111
7112 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7113 {
7115 if (actionMgr)
7116 {
7117 ActionBase currentAction = actionMgr.GetRunningAction();
7118 if (currentAction)
7120 }
7121 }
7122
7123 Man ownerPlayerOld = null;
7124 Man ownerPlayerNew = null;
7125
7126 if (old_owner)
7127 {
7128 if (old_owner.
IsMan())
7129 {
7130 ownerPlayerOld = Man.Cast(old_owner);
7131 }
7132 else
7133 {
7134 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
7135 }
7136 }
7137 else
7138 {
7140 {
7142
7143 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
7144 {
7145 GetCompEM().UnplugThis();
7146 }
7147 }
7148 }
7149
7150 if (new_owner)
7151 {
7152 if (new_owner.
IsMan())
7153 {
7154 ownerPlayerNew = Man.Cast(new_owner);
7155 }
7156 else
7157 {
7158 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
7159 }
7160 }
7161
7162 if (ownerPlayerOld != ownerPlayerNew)
7163 {
7164 if (ownerPlayerOld)
7165 {
7166 array<EntityAI> subItemsExit = new array<EntityAI>;
7168 for (int i = 0; i < subItemsExit.Count(); i++)
7169 {
7172 }
7173 }
7174
7175 if (ownerPlayerNew)
7176 {
7177 array<EntityAI> subItemsEnter = new array<EntityAI>;
7179 for (int j = 0; j < subItemsEnter.Count(); j++)
7180 {
7183 }
7184 }
7185 }
7186 else if (ownerPlayerNew != null)
7187 {
7188 PlayerBase nplayer;
7189 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7190 {
7191 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7193 for (int k = 0; k < subItemsUpdate.Count(); k++)
7194 {
7196 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7197 }
7198 }
7199 }
7200
7201 if (old_owner)
7202 old_owner.OnChildItemRemoved(this);
7203 if (new_owner)
7204 new_owner.OnChildItemReceived(this);
7205 }
7206
7207
7209 {
7210 super.EEDelete(parent);
7211 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7212 if (player)
7213 {
7215
7216 if (player.IsAlive())
7217 {
7218 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7219 if (r_index >= 0)
7220 {
7221 InventoryLocation r_il = new InventoryLocation;
7222 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7223
7224 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7227 {
7228 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7229 }
7231 {
7232 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7233 }
7234
7235 }
7236
7237 player.RemoveQuickBarEntityShortcut(this);
7238 }
7239 }
7240 }
7241
7243 {
7244 super.EEKilled(killer);
7245
7248 {
7249 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7250 {
7251 if (IsMagazine())
7252 {
7253 if (Magazine.Cast(this).GetAmmoCount() > 0)
7254 {
7256 }
7257 }
7258 else
7259 {
7261 }
7262 }
7263 }
7264 }
7265
7267 {
7268 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7269
7270 super.OnWasAttached(parent, slot_id);
7271
7274
7277 }
7278
7280 {
7281 super.OnWasDetached(parent, slot_id);
7282
7285
7288 }
7289
7291 {
7292 int idx;
7295
7296 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7297 if (inventory_slots.Count() < 1)
7298 {
7299 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7300 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7301 }
7302 else
7303 {
7304 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7305 }
7306
7307 idx = inventory_slots.Find(slot);
7308 if (idx < 0)
7309 return "";
7310
7311 return attach_types.Get(idx);
7312 }
7313
7315 {
7316 int idx = -1;
7317 string slot;
7318
7321
7322 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7323 if (inventory_slots.Count() < 1)
7324 {
7325 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7326 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7327 }
7328 else
7329 {
7330 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7331 if (detach_types.Count() < 1)
7332 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7333 }
7334
7335 for (int i = 0; i < inventory_slots.Count(); i++)
7336 {
7337 slot = inventory_slots.Get(i);
7338 }
7339
7340 if (slot != "")
7341 {
7342 if (detach_types.Count() == 1)
7343 idx = 0;
7344 else
7345 idx = inventory_slots.Find(slot);
7346 }
7347 if (idx < 0)
7348 return "";
7349
7350 return detach_types.Get(idx);
7351 }
7352
7354 {
7355
7357
7358
7359 float min_time = 1;
7360 float max_time = 3;
7361 float delay = Math.RandomFloat(min_time, max_time);
7362
7363 explode_timer.Run(delay, this, "DoAmmoExplosion");
7364 }
7365
7367 {
7368 Magazine magazine = Magazine.Cast(this);
7369 int pop_sounds_count = 6;
7370 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7371
7372
7373 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7374 string sound_name = pop_sounds[ sound_idx ];
7375 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7376
7377
7378 magazine.ServerAddAmmoCount(-1);
7379
7380
7381 float min_temp_to_explode = 100;
7382
7383 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7384 {
7386 }
7387 }
7388
7389
7390 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7391 {
7392 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7393
7394 const int CHANCE_DAMAGE_CARGO = 4;
7395 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7396 const int CHANCE_DAMAGE_NOTHING = 2;
7397
7399 {
7400 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7401 int chances;
7402 int rnd;
7403
7404 if (GetInventory().GetCargo())
7405 {
7406 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7407 rnd = Math.RandomInt(0,chances);
7408
7409 if (rnd < CHANCE_DAMAGE_CARGO)
7410 {
7412 }
7413 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7414 {
7416 }
7417 }
7418 else
7419 {
7420 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7421 rnd = Math.RandomInt(0,chances);
7422
7423 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7424 {
7426 }
7427 }
7428 }
7429 }
7430
7432 {
7433 CargoBase cargo = GetInventory().GetCargo();
7434 if (cargo)
7435 {
7437 if (item_count > 0)
7438 {
7439 int random_pick = Math.RandomInt(0, item_count);
7441 if (!item.IsExplosive())
7442 {
7443 item.AddHealth("","",damage);
7444 return true;
7445 }
7446 }
7447 }
7448 return false;
7449 }
7450
7452 {
7453 GameInventory inventory = GetInventory();
7455 if (attachment_count > 0)
7456 {
7457 int random_pick = Math.RandomInt(0, attachment_count);
7459 if (!attachment.IsExplosive())
7460 {
7461 attachment.AddHealth("","",damage);
7462 return true;
7463 }
7464 }
7465 return false;
7466 }
7467
7469 {
7471 }
7472
7474 {
7476 return GetInventory().CanRemoveEntity();
7477
7478 return false;
7479 }
7480
7482 {
7483
7485 return false;
7486
7487
7489 return false;
7490
7491
7492
7494 if (delta == 0)
7495 return false;
7496
7497
7498 return true;
7499 }
7500
7502 {
7504 {
7505 if (ScriptInputUserData.CanStoreInputUserData())
7506 {
7507 ScriptInputUserData ctx = new ScriptInputUserData;
7512 ctx.
Write(destination_entity);
7516 }
7517 }
7518 else if (!
g_Game.IsMultiplayer())
7519 {
7521 }
7522 }
7523
7525 {
7526 float split_quantity_new;
7530 InventoryLocation loc = new InventoryLocation;
7531
7532 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7533 {
7535 split_quantity_new = stack_max;
7536 else
7538
7540 {
7541 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7542 if (new_item)
7543 {
7544 new_item.SetResultOfSplit(true);
7545 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7547 new_item.
SetQuantity(split_quantity_new,
false,
true);
7548 }
7549 }
7550 }
7551 else if (destination_entity && slot_id == -1)
7552 {
7553 if (quantity > stack_max)
7554 split_quantity_new = stack_max;
7555 else
7556 split_quantity_new = quantity;
7557
7559 {
7560 GameInventory destinationInventory = destination_entity.GetInventory();
7562 {
7565 }
7566
7567 if (new_item)
7568 {
7569 new_item.SetResultOfSplit(true);
7570 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7572 new_item.
SetQuantity(split_quantity_new,
false,
true);
7573 }
7574 }
7575 }
7576 else
7577 {
7578 if (stack_max != 0)
7579 {
7581 {
7583 }
7584
7585 if (split_quantity_new == 0)
7586 {
7587 if (!
g_Game.IsMultiplayer())
7588 player.PhysicalPredictiveDropItem(this);
7589 else
7590 player.ServerDropEntity(this);
7591 return;
7592 }
7593
7595 {
7597
7598 if (new_item)
7599 {
7600 new_item.SetResultOfSplit(true);
7601 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7604 new_item.PlaceOnSurface();
7605 }
7606 }
7607 }
7608 }
7609 }
7610
7612 {
7613 float split_quantity_new;
7617 InventoryLocation loc = new InventoryLocation;
7618
7619 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7620 {
7622 split_quantity_new = stack_max;
7623 else
7625
7627 {
7628 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7629 if (new_item)
7630 {
7631 new_item.SetResultOfSplit(true);
7632 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7634 new_item.
SetQuantity(split_quantity_new,
false,
true);
7635 }
7636 }
7637 }
7638 else if (destination_entity && slot_id == -1)
7639 {
7640 if (quantity > stack_max)
7641 split_quantity_new = stack_max;
7642 else
7643 split_quantity_new = quantity;
7644
7646 {
7647 GameInventory destinationInventory = destination_entity.GetInventory();
7649 {
7652 }
7653
7654 if (new_item)
7655 {
7656 new_item.SetResultOfSplit(true);
7657 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7659 new_item.
SetQuantity(split_quantity_new,
false,
true);
7660 }
7661 }
7662 }
7663 else
7664 {
7665 if (stack_max != 0)
7666 {
7668 {
7670 }
7671
7673 {
7675
7676 if (new_item)
7677 {
7678 new_item.SetResultOfSplit(true);
7679 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7682 new_item.PlaceOnSurface();
7683 }
7684 }
7685 }
7686 }
7687 }
7688
7690 {
7692 {
7693 if (ScriptInputUserData.CanStoreInputUserData())
7694 {
7695 ScriptInputUserData ctx = new ScriptInputUserData;
7700 dst.WriteToContext(ctx);
7702 }
7703 }
7704 else if (!
g_Game.IsMultiplayer())
7705 {
7707 }
7708 }
7709
7711 {
7713 {
7714 if (ScriptInputUserData.CanStoreInputUserData())
7715 {
7716 ScriptInputUserData ctx = new ScriptInputUserData;
7721 ctx.
Write(destination_entity);
7727 }
7728 }
7729 else if (!
g_Game.IsMultiplayer())
7730 {
7732 }
7733 }
7734
7736 {
7738 }
7739
7741 {
7743 float split_quantity_new;
7745 if (dst.IsValid())
7746 {
7747 int slot_id = dst.GetSlot();
7749
7750 if (quantity > stack_max)
7751 split_quantity_new = stack_max;
7752 else
7753 split_quantity_new = quantity;
7754
7756 {
7758
7759 if (new_item)
7760 {
7761 new_item.SetResultOfSplit(true);
7762 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7764 new_item.
SetQuantity(split_quantity_new,
false,
true);
7765 }
7766
7767 return new_item;
7768 }
7769 }
7770
7771 return null;
7772 }
7773
7775 {
7777 float split_quantity_new;
7779 if (destination_entity)
7780 {
7782 if (quantity > stackable)
7783 split_quantity_new = stackable;
7784 else
7785 split_quantity_new = quantity;
7786
7788 {
7789 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7790 if (new_item)
7791 {
7792 new_item.SetResultOfSplit(true);
7793 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7795 new_item.
SetQuantity(split_quantity_new,
false,
true);
7796 }
7797 }
7798 }
7799 }
7800
7802 {
7804 {
7805 if (ScriptInputUserData.CanStoreInputUserData())
7806 {
7807 ScriptInputUserData ctx = new ScriptInputUserData;
7812 ItemBase destination_entity =
this;
7813 ctx.
Write(destination_entity);
7817 }
7818 }
7819 else if (!
g_Game.IsMultiplayer())
7820 {
7822 }
7823 }
7824
7826 {
7828 float split_quantity_new;
7830 if (player)
7831 {
7833 if (quantity > stackable)
7834 split_quantity_new = stackable;
7835 else
7836 split_quantity_new = quantity;
7837
7839 {
7840 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7841 new_item =
ItemBase.Cast(in_hands);
7842 if (new_item)
7843 {
7844 new_item.SetResultOfSplit(true);
7845 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7847 new_item.SetQuantity(split_quantity_new, false, true);
7848 }
7849 }
7850 }
7851 }
7852
7854 {
7856 float split_quantity_new = Math.Floor(quantity * 0.5);
7857
7859 return;
7860
7862
7863 if (new_item)
7864 {
7865 if (new_item.GetQuantityMax() < split_quantity_new)
7866 {
7867 split_quantity_new = new_item.GetQuantityMax();
7868 }
7869
7870 new_item.SetResultOfSplit(true);
7871 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7872
7874 {
7877 }
7878 else
7879 {
7881 new_item.
SetQuantity(split_quantity_new,
false,
true);
7882 }
7883 }
7884 }
7885
7887 {
7889 float split_quantity_new = Math.Floor(quantity / 2);
7890
7892 return;
7893
7894 InventoryLocation invloc = new InventoryLocation;
7896
7898 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7899
7900 if (new_item)
7901 {
7902 if (new_item.GetQuantityMax() < split_quantity_new)
7903 {
7904 split_quantity_new = new_item.GetQuantityMax();
7905 }
7907 {
7910 }
7911 else if (split_quantity_new > 1)
7912 {
7914 new_item.
SetQuantity(split_quantity_new,
false,
true);
7915 }
7916 }
7917 }
7918
7921 {
7922 SetWeightDirty();
7924
7925 if (parent)
7926 parent.OnAttachmentQuantityChangedEx(this, delta);
7927
7929 {
7931 {
7933 }
7935 {
7936 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7938 }
7939 }
7940 }
7941
7944 {
7945
7946 }
7947
7950 {
7952 }
7953
7955 {
7956 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7957
7959 {
7960 if (newLevel == GameConstants.STATE_RUINED)
7961 {
7963 EntityAI parent = GetHierarchyParent();
7964 if (parent && parent.IsFireplace())
7965 {
7966 CargoBase cargo = GetInventory().GetCargo();
7967 if (cargo)
7968 {
7970 {
7972 }
7973 }
7974 }
7975 }
7976
7978 {
7979
7981 return;
7982 }
7983
7984 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7985 {
7987 }
7988 }
7989 }
7990
7991
7993 {
7994 super.OnRightClick();
7995
7997 {
7999 {
8000 if (ScriptInputUserData.CanStoreInputUserData())
8001 {
8002 EntityAI root = GetHierarchyRoot();
8003 Man playerOwner = GetHierarchyRootPlayer();
8004 InventoryLocation dst = new InventoryLocation;
8005
8006
8007 if (!playerOwner && root && root == this)
8008 {
8010 }
8011 else
8012 {
8013
8014 GetInventory().GetCurrentInventoryLocation(dst);
8016 {
8017 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8019 {
8021 }
8022 else
8023 {
8025
8026
8027 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
8028 {
8030 }
8031 else
8032 {
8033 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
8034 }
8035 }
8036 }
8037 }
8038
8039 ScriptInputUserData ctx = new ScriptInputUserData;
8047 }
8048 }
8049 else if (!
g_Game.IsMultiplayer())
8050 {
8052 }
8053 }
8054 }
8055
8057 {
8058 if (root)
8059 {
8060 vector m4[4];
8061 root.GetTransform(m4);
8062 dst.SetGround(this, m4);
8063 }
8064 else
8065 {
8066 GetInventory().GetCurrentInventoryLocation(dst);
8067 }
8068 }
8069
8070 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
8071 {
8072
8073 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
8074 return false;
8075
8076 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8077 return false;
8078
8079
8081 return false;
8082
8083
8084 Magazine mag = Magazine.Cast(this);
8085 if (mag)
8086 {
8087 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8088 return false;
8089
8090 if (stack_max_limit)
8091 {
8092 Magazine other_mag = Magazine.Cast(other_item);
8093 if (other_item)
8094 {
8095 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8096 return false;
8097 }
8098
8099 }
8100 }
8101 else
8102 {
8103
8105 return false;
8106
8108 return false;
8109 }
8110
8111 PlayerBase player = null;
8112 if (CastTo(player, GetHierarchyRootPlayer()))
8113 {
8114 if (player.GetInventory().HasAttachment(this))
8115 return false;
8116
8117 if (player.IsItemsToDelete())
8118 return false;
8119 }
8120
8121 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8122 return false;
8123
8124 int slotID;
8126 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8127 return false;
8128
8129 return true;
8130 }
8131
8133 {
8135 }
8136
8138 {
8139 return m_IsResultOfSplit;
8140 }
8141
8143 {
8144 m_IsResultOfSplit = value;
8145 }
8146
8148 {
8150 }
8151
8153 {
8154 float other_item_quantity = other_item.GetQuantity();
8155 float this_free_space;
8156
8158
8160
8161 if (other_item_quantity > this_free_space)
8162 {
8163 return this_free_space;
8164 }
8165 else
8166 {
8167 return other_item_quantity;
8168 }
8169 }
8170
8172 {
8174 }
8175
8177 {
8179 return;
8180
8181 if (!IsMagazine() && other_item)
8182 {
8184 if (quantity_used != 0)
8185 {
8186 float hp1 = GetHealth01("","");
8187 float hp2 = other_item.GetHealth01("","");
8188 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
8189 hpResult = hpResult / (
GetQuantity() + quantity_used);
8190
8191 hpResult *= GetMaxHealth();
8192 Math.Round(hpResult);
8193 SetHealth("", "Health", hpResult);
8194
8196 other_item.AddQuantity(-quantity_used);
8197 }
8198 }
8200 }
8201
8203 {
8204 #ifdef SERVER
8205 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8206 GetHierarchyParent().IncreaseLifetimeUp();
8207 #endif
8208 };
8209
8211 {
8212 PlayerBase p = PlayerBase.Cast(player);
8213
8214 array<int> recipesIds = p.m_Recipes;
8215 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8216 if (moduleRecipesManager)
8217 {
8218 EntityAI itemInHands = player.GetEntityInHands();
8219 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8220 }
8221
8222 for (int i = 0;i < recipesIds.Count(); i++)
8223 {
8224 int key = recipesIds.Get(i);
8225 string recipeName = moduleRecipesManager.GetRecipeName(key);
8227 }
8228 }
8229
8230
8231 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8232 {
8233 super.GetDebugActions(outputList);
8234
8235
8241
8242
8247
8252
8253
8257
8258
8260 {
8264 }
8265
8268
8269
8273
8275
8276 InventoryLocation loc = new InventoryLocation();
8277 GetInventory().GetCurrentInventoryLocation(loc);
8279 {
8280 if (Gizmo_IsSupported())
8283 }
8284
8286 }
8287
8288
8289
8290
8292 {
8293 super.OnAction(action_id, player, ctx);
8294
8296 {
8297 switch (action_id)
8298 {
8302 return true;
8306 return true;
8307 }
8308 }
8309
8311 {
8312 switch (action_id)
8313 {
8315 Delete();
8316 return true;
8317 }
8318 }
8319
8320 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8321 {
8322 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8323 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8324 PlayerBase p = PlayerBase.Cast(player);
8325 if (
EActions.RECIPES_RANGE_START < 1000)
8326 {
8327 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8328 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8329 }
8330 }
8331 #ifndef SERVER
8332 else if (action_id ==
EActions.WATCH_PLAYER)
8333 {
8334 PluginDeveloper.SetDeveloperItemClientEx(player);
8335 }
8336 #endif
8338 {
8339 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8340 {
8341 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8342 OnDebugButtonPressServer(id + 1);
8343 }
8344
8345 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8346 {
8347 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8349 }
8350
8351 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8352 {
8353 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8355 }
8356
8357 else if (action_id ==
EActions.ADD_QUANTITY)
8358 {
8359 if (IsMagazine())
8360 {
8361 Magazine mag = Magazine.Cast(this);
8362 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8363 }
8364 else
8365 {
8367 }
8368
8369 if (m_EM)
8370 {
8371 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8372 }
8373
8374 }
8375
8376 else if (action_id ==
EActions.REMOVE_QUANTITY)
8377 {
8378 if (IsMagazine())
8379 {
8380 Magazine mag2 = Magazine.Cast(this);
8381 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8382 }
8383 else
8384 {
8386 }
8387 if (m_EM)
8388 {
8389 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8390 }
8391
8392 }
8393
8394 else if (action_id ==
EActions.SET_QUANTITY_0)
8395 {
8397
8398 if (m_EM)
8399 {
8400 m_EM.SetEnergy(0);
8401 }
8402 }
8403
8404 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8405 {
8407
8408 if (m_EM)
8409 {
8410 m_EM.SetEnergy(m_EM.GetEnergyMax());
8411 }
8412 }
8413
8414 else if (action_id ==
EActions.ADD_HEALTH)
8415 {
8416 AddHealth("","",GetMaxHealth("","Health")/5);
8417 }
8418 else if (action_id ==
EActions.REMOVE_HEALTH)
8419 {
8420 AddHealth("","",-GetMaxHealth("","Health")/5);
8421 }
8422 else if (action_id ==
EActions.DESTROY_HEALTH)
8423 {
8424 SetHealth01("","",0);
8425 }
8426 else if (action_id ==
EActions.WATCH_ITEM)
8427 {
8429 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8430 #ifdef DEVELOPER
8431 SetDebugDeveloper_item(this);
8432 #endif
8433 }
8434
8435 else if (action_id ==
EActions.ADD_TEMPERATURE)
8436 {
8437 AddTemperature(20);
8438
8439 }
8440
8441 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8442 {
8443 AddTemperature(-20);
8444
8445 }
8446
8447 else if (action_id ==
EActions.FLIP_FROZEN)
8448 {
8449 SetFrozen(!GetIsFrozen());
8450
8451 }
8452
8453 else if (action_id ==
EActions.ADD_WETNESS)
8454 {
8456
8457 }
8458
8459 else if (action_id ==
EActions.REMOVE_WETNESS)
8460 {
8462
8463 }
8464
8465 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8466 {
8469
8470
8471 }
8472
8473 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8474 {
8477 }
8478
8479 else if (action_id ==
EActions.MAKE_SPECIAL)
8480 {
8481 auto debugParams = DebugSpawnParams.WithPlayer(player);
8482 OnDebugSpawnEx(debugParams);
8483 }
8484
8485 }
8486
8487
8488 return false;
8489 }
8490
8491
8492
8493
8497
8500
8501
8502
8504 {
8505 return false;
8506 }
8507
8508
8510 {
8511 return true;
8512 }
8513
8514
8516 {
8517 return true;
8518 }
8519
8520
8521
8523 {
8524 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8525 return g_Game.ConfigIsExisting(config_path);
8526 }
8527
8530 {
8531 return null;
8532 }
8533
8535 {
8536 return false;
8537 }
8538
8540 {
8541 return false;
8542 }
8543
8547
8548
8550 {
8551 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8552 return module_repairing.CanRepair(this, item_repair_kit);
8553 }
8554
8555
8556 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8557 {
8558 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8559 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8560 }
8561
8562
8564 {
8565
8566
8567
8568
8569
8570
8571
8572
8573 return 1;
8574 }
8575
8576
8577
8579 {
8581 }
8582
8583
8584
8586 {
8588 }
8589
8590
8599 {
8600 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8601
8602 if (player)
8603 {
8604 player.MessageStatus(text);
8605 }
8606 }
8607
8608
8617 {
8618 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8619
8620 if (player)
8621 {
8622 player.MessageAction(text);
8623 }
8624 }
8625
8626
8635 {
8636 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8637
8638 if (player)
8639 {
8640 player.MessageFriendly(text);
8641 }
8642 }
8643
8644
8653 {
8654 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8655
8656 if (player)
8657 {
8658 player.MessageImportant(text);
8659 }
8660 }
8661
8663 {
8664 return true;
8665 }
8666
8667
8668 override bool KindOf(
string tag)
8669 {
8670 bool found = false;
8671 string item_name = this.
GetType();
8673 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8674
8675 int array_size = item_tag_array.Count();
8676 for (int i = 0; i < array_size; i++)
8677 {
8678 if (item_tag_array.Get(i) == tag)
8679 {
8680 found = true;
8681 break;
8682 }
8683 }
8684 return found;
8685 }
8686
8687
8689 {
8690
8691 super.OnRPC(sender, rpc_type,ctx);
8692
8693
8694 switch (rpc_type)
8695 {
8696 #ifndef SERVER
8697 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8698 Param2<bool, string> p = new Param2<bool, string>(false, "");
8699
8701 return;
8702
8703 bool play = p.param1;
8704 string soundSet = p.param2;
8705
8706 if (play)
8707 {
8709 {
8711 {
8713 }
8714 }
8715 else
8716 {
8718 }
8719 }
8720 else
8721 {
8723 }
8724
8725 break;
8726 #endif
8727
8728 }
8729
8731 {
8733 }
8734 }
8735
8736
8737
8738
8740 {
8741 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8742 return plugin.GetID(
name);
8743 }
8744
8746 {
8747 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8748 return plugin.GetName(id);
8749 }
8750
8753 {
8754
8755
8756 int varFlags;
8757 if (!ctx.
Read(varFlags))
8758 return;
8759
8760 if (varFlags & ItemVariableFlags.FLOAT)
8761 {
8763 }
8764 }
8765
8767 {
8768
8769 super.SerializeNumericalVars(floats_out);
8770
8771
8772
8774 {
8776 }
8777
8779 {
8781 }
8782
8784 {
8786 }
8787
8789 {
8794 }
8795
8797 {
8799 }
8800 }
8801
8803 {
8804
8805 super.DeSerializeNumericalVars(floats);
8806
8807
8808 int index = 0;
8809 int mask = Math.Round(floats.Get(index));
8810
8811 index++;
8812
8814 {
8816 {
8818 }
8819 else
8820 {
8821 float quantity = floats.Get(index);
8823 }
8824 index++;
8825 }
8826
8828 {
8829 float wet = floats.Get(index);
8831 index++;
8832 }
8833
8835 {
8836 int liquidtype = Math.Round(floats.Get(index));
8838 index++;
8839 }
8840
8842 {
8844 index++;
8846 index++;
8848 index++;
8850 index++;
8851 }
8852
8854 {
8855 int cleanness = Math.Round(floats.Get(index));
8857 index++;
8858 }
8859 }
8860
8862 {
8863 super.WriteVarsToCTX(ctx);
8864
8865
8867 {
8869 }
8870
8872 {
8874 }
8875
8877 {
8879 }
8880
8882 {
8883 int r,g,b,a;
8889 }
8890
8892 {
8894 }
8895 }
8896
8898 {
8899 if (!super.ReadVarsFromCTX(ctx,version))
8900 return false;
8901
8902 int intValue;
8903 float value;
8904
8905 if (version < 140)
8906 {
8907 if (!ctx.
Read(intValue))
8908 return false;
8909
8910 m_VariablesMask = intValue;
8911 }
8912
8914 {
8915 if (!ctx.
Read(value))
8916 return false;
8917
8919 {
8921 }
8922 else
8923 {
8925 }
8926 }
8927
8928 if (version < 140)
8929 {
8931 {
8932 if (!ctx.
Read(value))
8933 return false;
8934 SetTemperatureDirect(value);
8935 }
8936 }
8937
8939 {
8940 if (!ctx.
Read(value))
8941 return false;
8943 }
8944
8946 {
8947 if (!ctx.
Read(intValue))
8948 return false;
8950 }
8951
8953 {
8954 int r,g,b,a;
8956 return false;
8958 return false;
8960 return false;
8962 return false;
8963
8965 }
8966
8968 {
8969 if (!ctx.
Read(intValue))
8970 return false;
8972 }
8973
8974 if (version >= 138 && version < 140)
8975 {
8977 {
8978 if (!ctx.
Read(intValue))
8979 return false;
8980 SetFrozen(intValue);
8981 }
8982 }
8983
8984 return true;
8985 }
8986
8987
8989 {
8992 {
8994 }
8995
8996 if (!super.OnStoreLoad(ctx, version))
8997 {
8999 return false;
9000 }
9001
9002 if (version >= 114)
9003 {
9004 bool hasQuickBarIndexSaved;
9005
9006 if (!ctx.
Read(hasQuickBarIndexSaved))
9007 {
9009 return false;
9010 }
9011
9012 if (hasQuickBarIndexSaved)
9013 {
9014 int itmQBIndex;
9015
9016
9017 if (!ctx.
Read(itmQBIndex))
9018 {
9020 return false;
9021 }
9022
9023 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
9024 if (itmQBIndex != -1 && parentPlayer)
9025 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
9026 }
9027 }
9028 else
9029 {
9030
9031 PlayerBase player;
9032 int itemQBIndex;
9033 if (version ==
int.
MAX)
9034 {
9035 if (!ctx.
Read(itemQBIndex))
9036 {
9038 return false;
9039 }
9040 }
9041 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
9042 {
9043
9044 if (!ctx.
Read(itemQBIndex))
9045 {
9047 return false;
9048 }
9049 if (itemQBIndex != -1 && player)
9050 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
9051 }
9052 }
9053
9054 if (version < 140)
9055 {
9056
9057 if (!LoadVariables(ctx, version))
9058 {
9060 return false;
9061 }
9062 }
9063
9064
9066 {
9068 return false;
9069 }
9070 if (version >= 132)
9071 {
9073 if (raib)
9074 {
9076 {
9078 return false;
9079 }
9080 }
9081 }
9082
9084 return true;
9085 }
9086
9087
9088
9090 {
9091 super.OnStoreSave(ctx);
9092
9093 PlayerBase player;
9094 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9095 {
9097
9098 int itemQBIndex = -1;
9099 itemQBIndex = player.FindQuickBarEntityIndex(this);
9100 ctx.
Write(itemQBIndex);
9101 }
9102 else
9103 {
9105 }
9106
9108
9110 if (raib)
9111 {
9113 }
9114 }
9115
9116
9118 {
9119 super.AfterStoreLoad();
9120
9122 {
9124 }
9125
9127 {
9130 }
9131 }
9132
9134 {
9135 super.EEOnAfterLoad();
9136
9138 {
9140 }
9141
9144 }
9145
9147 {
9148 return false;
9149 }
9150
9151
9152
9154 {
9156 {
9157 #ifdef PLATFORM_CONSOLE
9158
9160 {
9162 if (menu)
9163 {
9165 }
9166 }
9167 #endif
9168 }
9169
9171 {
9174 }
9175
9177 {
9178 SetWeightDirty();
9180 }
9182 {
9185 }
9186
9188 {
9191
9194 }
9196 {
9200 }
9201
9202 super.OnVariablesSynchronized();
9203 }
9204
9205
9206
9208 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9209 {
9210 if (!IsServerCheck(allow_client))
9211 return false;
9212
9214 return false;
9215
9218
9219 if (value <= (min + 0.001))
9220 value = min;
9221
9222 if (value == min)
9223 {
9224 if (destroy_config)
9225 {
9226 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9227 if (dstr)
9228 {
9230 this.Delete();
9231 return true;
9232 }
9233 }
9234 else if (destroy_forced)
9235 {
9237 this.Delete();
9238 return true;
9239 }
9240
9242 }
9243
9246
9248 {
9249 EntityAI parent = GetHierarchyRoot();
9250 InventoryLocation iLoc = new InventoryLocation();
9251 GetInventory().GetCurrentInventoryLocation(iLoc);
9253 {
9254 int iLocSlot = iLoc.
GetSlot();
9256 {
9258 }
9260 {
9262 }
9263 }
9264 }
9265
9267 {
9269
9270 if (delta)
9272 }
9273
9275
9276 return false;
9277 }
9278
9279
9281 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9282 {
9284 }
9285
9287 {
9290 }
9291
9293 {
9296 }
9297
9299 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9300 {
9301 float value_clamped = Math.Clamp(value, 0, 1);
9303 SetQuantity(result, destroy_config, destroy_forced);
9304 }
9305
9306
9309 {
9311 }
9312
9314 {
9316 }
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9328 {
9329 int slot = -1;
9330 GameInventory inventory = GetInventory();
9331 if (inventory)
9332 {
9333 InventoryLocation il = new InventoryLocation;
9336 }
9337
9339 }
9340
9342 {
9343 float quantity_max = 0;
9344
9346 {
9347 if (attSlotID != -1)
9348 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9349
9350 if (quantity_max <= 0)
9352 }
9353
9354 if (quantity_max <= 0)
9356
9357 return quantity_max;
9358 }
9359
9361 {
9363 }
9364
9366 {
9368 }
9369
9370
9372 {
9374 }
9375
9377 {
9379 }
9380
9382 {
9384 }
9385
9386
9388 {
9389
9390 float weightEx = GetWeightEx();
9391 float special = GetInventoryAndCargoWeight();
9392 return weightEx - special;
9393 }
9394
9395
9397 {
9399 }
9400
9402 {
9404 {
9405 #ifdef DEVELOPER
9406 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9407 {
9408 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9410 }
9411 #endif
9412
9414 }
9415 else if (HasEnergyManager())
9416 {
9417 #ifdef DEVELOPER
9418 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9419 {
9420 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9421 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9422 }
9423 #endif
9424 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9425 }
9426 else
9427 {
9428 #ifdef DEVELOPER
9429 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9430 {
9431 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9432 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9433 }
9434 #endif
9435 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9436 }
9437 }
9438
9441 {
9442 int item_count = 0;
9444
9445 GameInventory inventory = GetInventory();
9446 CargoBase cargo = inventory.
GetCargo();
9447 if (cargo != NULL)
9448 {
9450 }
9451
9453 for (int i = 0; i < nAttachments; ++i)
9454 {
9456 if (item)
9457 item_count += item.GetNumberOfItems();
9458 }
9459 return item_count;
9460 }
9461
9464 {
9465 float weight = 0;
9466 float wetness = 1;
9467 if (include_wetness)
9470 {
9471 weight = wetness * m_ConfigWeight;
9472 }
9474 {
9475 weight = 1;
9476 }
9477 return weight;
9478 }
9479
9480
9481
9483 {
9484 GameInventory inventory = GetInventory();
9485 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9486 {
9487 array<EntityAI> items = new array<EntityAI>;
9489 for (int i = 0; i < items.Count(); ++i)
9490 {
9492 if (item)
9493 {
9494 g_Game.ObjectDelete(item);
9495 }
9496 }
9497 }
9498 }
9499
9500
9501
9502
9504 {
9505 float energy = 0;
9506 if (HasEnergyManager())
9507 {
9508 energy = GetCompEM().GetEnergy();
9509 }
9510 return energy;
9511 }
9512
9513
9515 {
9516 super.OnEnergyConsumed();
9517
9519 }
9520
9522 {
9523 super.OnEnergyAdded();
9524
9526 }
9527
9528
9530 {
9531 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9532 {
9534 {
9535 float energy_0to1 = GetCompEM().GetEnergy0To1();
9537 }
9538 }
9539 }
9540
9541
9543 {
9544 return ConfigGetFloat("heatIsolation");
9545 }
9546
9548 {
9550 }
9551
9553 {
9554 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9555 if (
g_Game.ConfigIsExisting(paramPath))
9556 return g_Game.ConfigGetFloat(paramPath);
9557
9558 return 0.0;
9559 }
9560
9562 {
9563 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9564 if (
g_Game.ConfigIsExisting(paramPath))
9565 return g_Game.ConfigGetFloat(paramPath);
9566
9567 return 0.0;
9568 }
9569
9570 override void SetWet(
float value,
bool allow_client =
false)
9571 {
9572 if (!IsServerCheck(allow_client))
9573 return;
9574
9577
9579
9580 m_VarWet = Math.Clamp(value, min, max);
9581
9583 {
9586 }
9587 }
9588
9589 override void AddWet(
float value)
9590 {
9592 }
9593
9595 {
9597 }
9598
9600 {
9602 }
9603
9605 {
9607 }
9608
9610 {
9612 }
9613
9615 {
9617 }
9618
9620 {
9623 if (newLevel != oldLevel)
9624 {
9626 }
9627 }
9628
9630 {
9631 SetWeightDirty();
9632 }
9633
9635 {
9636 return GetWetLevelInternal(
m_VarWet);
9637 }
9638
9639
9640
9642 {
9644 }
9645
9647 {
9649 }
9650
9652 {
9654 }
9655
9657 {
9659 }
9660
9661
9662
9664 {
9665 if (ConfigIsExisting("itemModelLength"))
9666 {
9667 return ConfigGetFloat("itemModelLength");
9668 }
9669 return 0;
9670 }
9671
9673 {
9674 if (ConfigIsExisting("itemAttachOffset"))
9675 {
9676 return ConfigGetFloat("itemAttachOffset");
9677 }
9678 return 0;
9679 }
9680
9681 override void SetCleanness(
int value,
bool allow_client =
false)
9682 {
9683 if (!IsServerCheck(allow_client))
9684 return;
9685
9687
9689
9692 }
9693
9695 {
9697 }
9698
9700 {
9701 return true;
9702 }
9703
9704
9705
9706
9708 {
9710 }
9711
9713 {
9715 }
9716
9717
9718
9719
9720 override void SetColor(
int r,
int g,
int b,
int a)
9721 {
9727 }
9729 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9730 {
9735 }
9736
9738 {
9740 }
9741
9744 {
9745 int r,g,b,a;
9747 r = r/255;
9748 g = g/255;
9749 b = b/255;
9750 a = a/255;
9751 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9752 }
9753
9754
9755
9756 override void SetLiquidType(
int value,
bool allow_client =
false)
9757 {
9758 if (!IsServerCheck(allow_client))
9759 return;
9760
9765 }
9766
9768 {
9769 return ConfigGetInt("varLiquidTypeInit");
9770 }
9771
9773 {
9775 }
9776
9778 {
9780 SetFrozen(false);
9781 }
9782
9785 {
9786 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9787 }
9788
9789
9792 {
9793 PlayerBase nplayer;
9794 if (PlayerBase.CastTo(nplayer, player))
9795 {
9797 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9798 }
9799 }
9800
9801
9804 {
9805 PlayerBase nplayer;
9806 if (PlayerBase.CastTo(nplayer,player))
9807 {
9808 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9809 }
9810
9811 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9812
9813 if (HasEnergyManager())
9814 {
9815 GetCompEM().UpdatePlugState();
9816 }
9817 }
9818
9819
9821 {
9822 super.OnPlacementStarted(player);
9823
9825 }
9826
9827 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9828 {
9830 {
9831 m_AdminLog.OnPlacementComplete(player,
this);
9832 }
9833
9834 super.OnPlacementComplete(player, position, orientation);
9835 }
9836
9837
9838
9839
9840
9842 {
9844 {
9845 return true;
9846 }
9847 else
9848 {
9849 return false;
9850 }
9851 }
9852
9853
9855 {
9857 {
9859 }
9860 }
9861
9862
9864 {
9866 }
9867
9869 {
9871 }
9872
9873 override void InsertAgent(
int agent,
float count = 1)
9874 {
9875 if (count < 1)
9876 return;
9877
9879 }
9880
9883 {
9885 }
9886
9887
9889 {
9891 }
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9935 {
9937 return false;
9938 return true;
9939 }
9940
9942 {
9943
9945 }
9946
9947
9950 {
9951 super.CheckForRoofLimited(timeTresholdMS);
9952
9953 float time =
g_Game.GetTime();
9954 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9955 {
9956 m_PreviousRoofTestTime = time;
9957 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9958 }
9959 }
9960
9961
9963 {
9965 {
9966 return 0;
9967 }
9968
9969 if (GetInventory().GetAttachmentSlotsCount() != 0)
9970 {
9971 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9972 if (filter)
9973 return filter.GetProtectionLevel(type, false, system);
9974 else
9975 return 0;
9976 }
9977
9978 string subclassPath, entryName;
9979
9980 switch (type)
9981 {
9983 entryName = "biological";
9984 break;
9986 entryName = "chemical";
9987 break;
9988 default:
9989 entryName = "biological";
9990 break;
9991 }
9992
9993 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9994
9995 return g_Game.ConfigGetFloat(subclassPath + entryName);
9996 }
9997
9998
9999
10002 {
10003 if (!IsMagazine())
10005
10007 }
10008
10009
10010
10011
10012
10017 {
10018 return true;
10019 }
10020
10022 {
10024 }
10025
10026
10027
10028
10029
10031 {
10032 if (parent)
10033 {
10034 if (parent.IsInherited(DayZInfected))
10035 return true;
10036
10037 if (!parent.IsRuined())
10038 return true;
10039 }
10040
10041 return true;
10042 }
10043
10045 {
10046 if (!super.CanPutAsAttachment(parent))
10047 {
10048 return false;
10049 }
10050
10051 if (!IsRuined() && !parent.IsRuined())
10052 {
10053 return true;
10054 }
10055
10056 return false;
10057 }
10058
10060 {
10061
10062
10063
10064
10065 return super.CanReceiveItemIntoCargo(item);
10066 }
10067
10069 {
10070
10071
10072
10073
10074 GameInventory attachmentInv = attachment.GetInventory();
10076 {
10077 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10078 return false;
10079 }
10080
10081 InventoryLocation loc = new InventoryLocation();
10082 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10083 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
10084 return false;
10085
10086 return super.CanReceiveAttachment(attachment, slotId);
10087 }
10088
10090 {
10091 if (!super.CanReleaseAttachment(attachment))
10092 return false;
10093
10094 return GetInventory().AreChildrenAccessible();
10095 }
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10118 {
10119 int id = muzzle_owner.GetMuzzleID();
10120 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
10121
10122 if (WPOF_array)
10123 {
10124 for (int i = 0; i < WPOF_array.Count(); i++)
10125 {
10126 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10127
10128 if (WPOF)
10129 {
10130 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10131 }
10132 }
10133 }
10134 }
10135
10136
10138 {
10139 int id = muzzle_owner.GetMuzzleID();
10141
10142 if (WPOBE_array)
10143 {
10144 for (int i = 0; i < WPOBE_array.Count(); i++)
10145 {
10146 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10147
10148 if (WPOBE)
10149 {
10150 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10151 }
10152 }
10153 }
10154 }
10155
10156
10158 {
10159 int id = muzzle_owner.GetMuzzleID();
10160 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10161
10162 if (WPOOH_array)
10163 {
10164 for (int i = 0; i < WPOOH_array.Count(); i++)
10165 {
10166 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10167
10168 if (WPOOH)
10169 {
10170 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10171 }
10172 }
10173 }
10174 }
10175
10176
10178 {
10179 int id = muzzle_owner.GetMuzzleID();
10180 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10181
10182 if (WPOOH_array)
10183 {
10184 for (int i = 0; i < WPOOH_array.Count(); i++)
10185 {
10186 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10187
10188 if (WPOOH)
10189 {
10190 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10191 }
10192 }
10193 }
10194 }
10195
10196
10198 {
10199 int id = muzzle_owner.GetMuzzleID();
10200 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10201
10202 if (WPOOH_array)
10203 {
10204 for (int i = 0; i < WPOOH_array.Count(); i++)
10205 {
10206 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10207
10208 if (WPOOH)
10209 {
10210 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10211 }
10212 }
10213 }
10214 }
10215
10216
10217
10219 {
10221 {
10222 return true;
10223 }
10224
10225 return false;
10226 }
10227
10229 {
10231 {
10232 return true;
10233 }
10234
10235 return false;
10236 }
10237
10239 {
10241 {
10242 return true;
10243 }
10244
10245 return false;
10246 }
10247
10249 {
10250 return false;
10251 }
10252
10255 {
10256 return UATimeSpent.DEFAULT_DEPLOY;
10257 }
10258
10259
10260
10261
10263 {
10265 SetSynchDirty();
10266 }
10267
10269 {
10271 }
10272
10273
10275 {
10276 return false;
10277 }
10278
10281 {
10282 string att_type = "None";
10283
10284 if (ConfigIsExisting("soundAttType"))
10285 {
10286 att_type = ConfigGetString("soundAttType");
10287 }
10288
10290 }
10291
10293 {
10295 }
10296
10297
10298
10299
10300
10306
10308 {
10311
10313 }
10314
10315
10317 {
10319 return;
10320
10322
10325
10328
10329 SoundParameters params = new SoundParameters();
10333 }
10334
10335
10337 {
10339 {
10342
10343 SetSynchDirty();
10344
10347 }
10348 }
10349
10351 {
10353 }
10354
10355
10357 {
10359 return;
10360
10362 SetSynchDirty();
10363
10366 }
10367
10369 {
10372 }
10373
10375 {
10377 }
10378
10379 void OnApply(PlayerBase player);
10380
10382 {
10383 return 1.0;
10384 };
10385
10387 {
10389 }
10390
10392 {
10394 }
10395
10397
10399 {
10400 SetDynamicPhysicsLifeTime(0.01);
10402 }
10403
10405 {
10406 array<string> zone_names = new array<string>;
10407 GetDamageZones(zone_names);
10408 for (int i = 0; i < zone_names.Count(); i++)
10409 {
10410 SetHealthMax(zone_names.Get(i),"Health");
10411 }
10412 SetHealthMax("","Health");
10413 }
10414
10417 {
10418 float global_health = GetHealth01("","Health");
10419 array<string> zones = new array<string>;
10420 GetDamageZones(zones);
10421
10422 for (int i = 0; i < zones.Count(); i++)
10423 {
10424 SetHealth01(zones.Get(i),"Health",global_health);
10425 }
10426 }
10427
10430 {
10431 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10432 }
10433
10435 {
10436 if (!hasRootAsPlayer)
10437 {
10438 if (refParentIB)
10439 {
10440
10441 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10442 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10443
10444 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10445 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10446
10449 }
10450 else
10451 {
10452
10455 }
10456 }
10457 }
10458
10460 {
10462 {
10463 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10464 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10465 {
10466 float heatPermCoef = 1.0;
10468 while (ent)
10469 {
10470 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10471 ent = ent.GetHierarchyParent();
10472 }
10473
10474 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10475 }
10476 }
10477 }
10478
10480 {
10481
10482 EntityAI parent = GetHierarchyParent();
10483 if (!parent)
10484 {
10485 hasParent = false;
10486 hasRootAsPlayer = false;
10487 }
10488 else
10489 {
10490 hasParent = true;
10491 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10492 refParentIB =
ItemBase.Cast(parent);
10493 }
10494 }
10495
10496 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10497 {
10498
10499 }
10500
10502 {
10503
10504 return false;
10505 }
10506
10508 {
10509
10510
10511 return false;
10512 }
10513
10515 {
10516
10517 return false;
10518 }
10519
10522 {
10523 return !GetIsFrozen() &&
IsOpen();
10524 }
10525
10527 {
10528 bool hasParent = false, hasRootAsPlayer = false;
10530
10531 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10532 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10533
10534 if (wwtu || foodDecay)
10535 {
10539
10540 if (processWetness || processTemperature || processDecay)
10541 {
10543
10544 if (processWetness)
10545 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10546
10547 if (processTemperature)
10549
10550 if (processDecay)
10551 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10552 }
10553 }
10554 }
10555
10558 {
10560 }
10561
10563 {
10566
10567 return super.GetTemperatureFreezeThreshold();
10568 }
10569
10571 {
10574
10575 return super.GetTemperatureThawThreshold();
10576 }
10577
10579 {
10582
10583 return super.GetItemOverheatThreshold();
10584 }
10585
10587 {
10589 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10590
10591 return super.GetTemperatureFreezeTime();
10592 }
10593
10595 {
10597 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10598
10599 return super.GetTemperatureThawTime();
10600 }
10601
10606
10608 {
10609 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10610 }
10611
10613 {
10614 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10615 }
10616
10619 {
10621 }
10622
10624 {
10626 }
10627
10629 {
10631 }
10632
10635 {
10636 return null;
10637 }
10638
10641 {
10642 return false;
10643 }
10644
10646 {
10648 {
10651 if (!trg)
10652 {
10654 explosive = this;
10655 }
10656
10657 explosive.PairRemote(trg);
10659
10660 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10661 trg.SetPersistentPairID(persistentID);
10662 explosive.SetPersistentPairID(persistentID);
10663
10664 return true;
10665 }
10666 return false;
10667 }
10668
10671 {
10672 float ret = 1.0;
10675 ret *= GetHealth01();
10676
10677 return ret;
10678 }
10679
10680 #ifdef DEVELOPER
10681 override void SetDebugItem()
10682 {
10683 super.SetDebugItem();
10684 _itemBase = this;
10685 }
10686
10688 {
10689 string text = super.GetDebugText();
10690
10692 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10693
10694 return text;
10695 }
10696 #endif
10697
10699 {
10700 return true;
10701 }
10702
10704
10706
10708 {
10711 }
10712
10713
10721
10737
10738 [
Obsolete(
"Use ItemSoundHandler instead")]
10741 {
10742 if (!
g_Game.IsDedicatedServer())
10743 {
10744 if (ConfigIsExisting("attachSoundSet"))
10745 {
10746 string cfg_path = "";
10747 string soundset = "";
10748 string type_name =
GetType();
10749
10752 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10753 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10754
10755 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10756 {
10757 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10758 {
10759 if (cfg_slot_array[i] == slot_type)
10760 {
10761 soundset = cfg_soundset_array[i];
10762 break;
10763 }
10764 }
10765 }
10766
10767 if (soundset != "")
10768 {
10769 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10771 }
10772 }
10773 }
10774 }
10775
10777}
10778
10780{
10782 if (entity)
10783 {
10784 bool is_item = entity.IsInherited(
ItemBase);
10785 if (is_item && full_quantity)
10786 {
10789 }
10790 }
10791 else
10792 {
10794 return NULL;
10795 }
10796 return entity;
10797}
10798
10800{
10801 if (item)
10802 {
10803 if (health > 0)
10804 item.SetHealth("", "", health);
10805
10806 if (item.CanHaveTemperature())
10807 {
10809 if (item.CanFreeze())
10810 item.SetFrozen(false);
10811 }
10812
10813 if (item.HasEnergyManager())
10814 {
10815 if (quantity >= 0)
10816 {
10817 item.GetCompEM().SetEnergy0To1(quantity);
10818 }
10819 else
10820 {
10822 }
10823 }
10824 else if (item.IsMagazine())
10825 {
10826 Magazine mag = Magazine.Cast(item);
10827 if (quantity >= 0)
10828 {
10829 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10830 }
10831 else
10832 {
10834 }
10835
10836 }
10837 else
10838 {
10839 if (quantity >= 0)
10840 {
10841 item.SetQuantityNormalized(quantity, false);
10842 }
10843 else
10844 {
10846 }
10847
10848 }
10849 }
10850}
10851
10852#ifdef DEVELOPER
10854#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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 IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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)
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()
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)
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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.