5863{
5865 {
5866 return true;
5867 }
5868};
5869
5871{
5872
5873};
5874
5875
5876
5878{
5882
5884
5887
5888
5889
5890
5891
5900
5906
5911
5916
5937 protected bool m_IsResultOfSplit
5938
5940
5945
5946
5947
5949
5953
5954
5955
5957
5960
5961
5962
5968
5969
5977
5980
5981
5983
5984
5986
5987
5992
5993
5998
6000
6001
6003
6004
6006 {
6011
6012 if (!
g_Game.IsDedicatedServer())
6013 {
6015 {
6017
6019 {
6021 }
6022 }
6023
6026 }
6027
6028 m_OldLocation = null;
6029
6031 {
6033 }
6034
6035 if (ConfigIsExisting("headSelectionsToHide"))
6036 {
6039 }
6040
6042 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
6043 {
6045 }
6046
6048
6049 m_IsResultOfSplit = false;
6050
6052 }
6053
6055 {
6056 super.InitItemVariables();
6057
6063 m_Count = ConfigGetInt(
"count");
6064
6067
6072
6075
6080
6092
6096
6097
6100 if (ConfigIsExisting("canBeSplit"))
6101 {
6104 }
6105
6107 if (ConfigIsExisting("itemBehaviour"))
6109
6110
6113 RegisterNetSyncVariableInt("m_VarLiquidType");
6114 RegisterNetSyncVariableInt("m_Cleanness",0,1);
6115
6116 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
6117 RegisterNetSyncVariableFloat("m_ImpactSpeed");
6118 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
6119
6120 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
6121 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
6122 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
6123 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
6124
6125 RegisterNetSyncVariableBool("m_IsBeingPlaced");
6126 RegisterNetSyncVariableBool("m_IsTakeable");
6127 RegisterNetSyncVariableBool("m_IsHologram");
6128
6131 {
6134 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
6135 }
6136
6138
6140 if (ConfigIsExisting("temperaturePerQuantityWeight"))
6142
6144 }
6145
6147 {
6149 }
6150
6152 {
6155 {
6160 }
6161 }
6162
6163 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
6164 {
6166 {
6169 }
6170
6172 }
6173
6175 {
6181 }
6182
6184
6186 {
6188
6189 if (!action)
6190 {
6191 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6192 return;
6193 }
6194
6196 if (!ai)
6197 {
6199 return;
6200 }
6201
6203 if (!action_array)
6204 {
6205 action_array = new array<ActionBase_Basic>;
6207 }
6208 if (LogManager.IsActionLogEnable())
6209 {
6210 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6211 }
6212
6213 if (action_array.Find(action) != -1)
6214 {
6215 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6216 }
6217 else
6218 {
6219 action_array.Insert(action);
6220 }
6221 }
6222
6224 {
6225 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6226 ActionBase action = player.GetActionManager().GetAction(actionName);
6229
6230 if (action_array)
6231 {
6232 action_array.RemoveItem(action);
6233 }
6234 }
6235
6236
6237
6239 {
6240 ActionOverrideData overrideData = new ActionOverrideData();
6244
6246 if (!actionMap)
6247 {
6250 }
6251
6252 actionMap.Insert(this.
Type(), overrideData);
6253
6254 }
6255
6257
6259
6260
6262 {
6265
6268
6269 string config_to_search = "CfgVehicles";
6270 string muzzle_owner_config;
6271
6273 {
6274 if (IsInherited(Weapon))
6275 config_to_search = "CfgWeapons";
6276
6277 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6278
6279 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6280
6281 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6282
6283 if (config_OnFire_subclass_count > 0)
6284 {
6285 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6286
6287 for (int i = 0; i < config_OnFire_subclass_count; i++)
6288 {
6289 string particle_class = "";
6290 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6291 string config_OnFire_entry = config_OnFire_class + particle_class;
6292 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6293 WPOF_array.Insert(WPOF);
6294 }
6295
6296
6298 }
6299 }
6300
6302 {
6303 config_to_search = "CfgWeapons";
6304 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6305
6306 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6307
6308 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6309
6310 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6311 {
6312 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6313
6314 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6315 {
6316 string particle_class2 = "";
6317 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6318 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6319 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6320 WPOBE_array.Insert(WPOBE);
6321 }
6322
6323
6325 }
6326 }
6327 }
6328
6329
6331 {
6334
6336 {
6337 string config_to_search = "CfgVehicles";
6338
6339 if (IsInherited(Weapon))
6340 config_to_search = "CfgWeapons";
6341
6342 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6343 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6344
6345 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6346 {
6347
6349
6351 {
6353 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6355 return;
6356 }
6357
6360
6361
6362
6363 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6364 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6365
6366 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6367 {
6368 string particle_class = "";
6369 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6370 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6371 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6372
6373 if (entry_type == CT_CLASS)
6374 {
6375 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6376 WPOOH_array.Insert(WPOF);
6377 }
6378 }
6379
6380
6382 }
6383 }
6384 }
6385
6387 {
6389 }
6390
6392 {
6394 {
6396
6399
6402
6403 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6404 }
6405 }
6406
6408 {
6410 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6411
6413 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6414
6416 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6417
6419 {
6421 }
6422 }
6423
6425 {
6427 }
6428
6430 {
6433 else
6435
6437 {
6440 }
6441 else
6442 {
6445
6448 }
6449
6451 }
6452
6454 {
6456 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6457 }
6458
6460 {
6462 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6464 }
6465
6467 {
6469 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6470 }
6471
6473 {
6476
6477 OverheatingParticle OP = new OverheatingParticle();
6482
6484 }
6485
6487 {
6490
6491 return -1;
6492 }
6493
6495 {
6497 {
6500
6501 for (int i = count; i > 0; --i)
6502 {
6503 int id = i - 1;
6506
6509
6510 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6511 {
6512 if (p)
6513 {
6516 }
6517 }
6518 }
6519 }
6520 }
6521
6523 {
6525 {
6527 {
6528 int id = i - 1;
6530
6531 if (OP)
6532 {
6534
6535 if (p)
6536 {
6538 }
6539
6540 delete OP;
6541 }
6542 }
6543
6546 }
6547 }
6548
6551 {
6552 return 0.0;
6553 }
6554
6555
6557 {
6558 return 250;
6559 }
6560
6562 {
6563 return 0;
6564 }
6565
6568 {
6570 return true;
6571
6572 return false;
6573 }
6574
6577 {
6580
6582 {
6584 }
6585 else
6586 {
6587
6589 }
6590
6592 }
6593
6600 {
6601 return -1;
6602 }
6603
6604
6605
6606
6608 {
6610 {
6611 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6612 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6613
6614 if (r_index >= 0)
6615 {
6616 InventoryLocation r_il = new InventoryLocation;
6617 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6618
6619 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6622 {
6623 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6624 }
6626 {
6627 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6628 }
6629
6630 }
6631
6632 player.GetHumanInventory().ClearUserReservedLocation(this);
6633 }
6634
6637 }
6638
6639
6640
6641
6643 {
6644 return ItemBase.m_DebugActionsMask;
6645 }
6646
6648 {
6649 return ItemBase.m_DebugActionsMask & mask;
6650 }
6651
6653 {
6654 ItemBase.m_DebugActionsMask = mask;
6655 }
6656
6658 {
6659 ItemBase.m_DebugActionsMask |= mask;
6660 }
6661
6663 {
6664 ItemBase.m_DebugActionsMask &= ~mask;
6665 }
6666
6668 {
6670 {
6672 }
6673 else
6674 {
6676 }
6677 }
6678
6679
6681 {
6682 if (GetEconomyProfile())
6683 {
6684 float q_max = GetEconomyProfile().GetQuantityMax();
6685 if (q_max > 0)
6686 {
6687 float q_min = GetEconomyProfile().GetQuantityMin();
6688 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6689
6691 {
6692 ComponentEnergyManager comp = GetCompEM();
6694 {
6696 }
6697 }
6699 {
6701
6702 }
6703
6704 }
6705 }
6706 }
6707
6710 {
6711 EntityAI parent = GetHierarchyParent();
6712
6713 if (parent)
6714 {
6715 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6716 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6717 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6718 }
6719 }
6720
6723 {
6724 EntityAI parent = GetHierarchyParent();
6725
6726 if (parent)
6727 {
6728 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6729 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6730 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6731 }
6732 }
6733
6735 {
6736
6737
6738
6739
6741
6743 {
6744 if (ScriptInputUserData.CanStoreInputUserData())
6745 {
6746 ScriptInputUserData ctx = new ScriptInputUserData;
6752 ctx.
Write(use_stack_max);
6755
6757 {
6758 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6759 }
6760 }
6761 }
6762 else if (!
g_Game.IsMultiplayer())
6763 {
6765 }
6766 }
6767
6769 {
6771 }
6772
6774 {
6776 }
6777
6779 {
6781 }
6782
6784 {
6785
6786 return false;
6787 }
6788
6790 {
6791 return false;
6792 }
6793
6797 {
6798 return false;
6799 }
6800
6802 {
6803 return "";
6804 }
6805
6807
6809 {
6810 return false;
6811 }
6812
6814 {
6815 return true;
6816 }
6817
6818
6819
6821 {
6822 return true;
6823 }
6824
6826 {
6827 return true;
6828 }
6829
6831 {
6832 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6834 }
6835
6837 {
6839 }
6840
6842 {
6844 if (!is_being_placed)
6846 SetSynchDirty();
6847 }
6848
6849
6851
6853 {
6855 }
6856
6858 {
6860 }
6861
6863 {
6864 return 1;
6865 }
6866
6868 {
6869 return false;
6870 }
6871
6873 {
6875 SetSynchDirty();
6876 }
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
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
6913 {
6914 super.OnMovedInsideCargo(container);
6915
6916 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6917 }
6918
6919 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6920 {
6921 super.EEItemLocationChanged(oldLoc, newLoc);
6922
6923 PlayerBase newPlayer = null;
6924 PlayerBase oldPlayer = null;
6925
6926 if (newLoc.GetParent())
6927 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6928
6929 if (oldLoc.GetParent())
6930 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6931
6933 {
6934 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6935
6936 if (rIndex >= 0)
6937 {
6938 InventoryLocation rIl = new InventoryLocation;
6939 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6940
6941 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6944 {
6945 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6946 }
6948 {
6950 }
6951
6952 }
6953 }
6954
6956 {
6957 if (newPlayer)
6958 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6959
6960 if (newPlayer == oldPlayer)
6961 {
6962 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6963 {
6965 {
6966 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6967 {
6968 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6969 }
6970 }
6971 else
6972 {
6973 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6974 }
6975 }
6976
6977 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6978 {
6979 int type = oldLoc.GetType();
6981 {
6982 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6983 }
6985 {
6986 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6987 }
6988 }
6989 if (!m_OldLocation)
6990 {
6991 m_OldLocation = new InventoryLocation;
6992 }
6993 m_OldLocation.Copy(oldLoc);
6994 }
6995 else
6996 {
6997 if (m_OldLocation)
6998 {
6999 m_OldLocation.Reset();
7000 }
7001 }
7002
7003 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
7004 }
7005 else
7006 {
7007 if (newPlayer)
7008 {
7009 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
7010 if (resIndex >= 0)
7011 {
7012 InventoryLocation il = new InventoryLocation;
7013 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
7015 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
7018 {
7019 il.
GetParent().GetOnReleaseLock().Invoke(it);
7020 }
7022 {
7024 }
7025
7026 }
7027 }
7029 {
7030
7032 }
7033
7034 if (m_OldLocation)
7035 {
7036 m_OldLocation.Reset();
7037 }
7038 }
7039
7041 {
7042 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
7043 }
7044
7046 {
7047 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
7048 }
7049 }
7050
7051 override void EOnContact(IEntity other, Contact extra)
7052 {
7054 {
7055 int liquidType = -1;
7057 if (impactSpeed > 0.0)
7058 {
7060 #ifndef SERVER
7062 #else
7064 SetSynchDirty();
7065 #endif
7067 }
7068 }
7069
7070 #ifdef SERVER
7071 if (GetCompEM() && GetCompEM().IsPlugged())
7072 {
7073 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
7074 GetCompEM().UnplugThis();
7075 }
7076 #endif
7077 }
7078
7080
7082 {
7084 }
7085
7087 {
7088
7089 }
7090
7092 {
7093 super.OnItemLocationChanged(old_owner, new_owner);
7094
7095 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7096 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7097
7098 if (!relatedPlayer && playerNew)
7099 relatedPlayer = playerNew;
7100
7101 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7102 {
7104 if (actionMgr)
7105 {
7106 ActionBase currentAction = actionMgr.GetRunningAction();
7107 if (currentAction)
7109 }
7110 }
7111
7112 Man ownerPlayerOld = null;
7113 Man ownerPlayerNew = null;
7114
7115 if (old_owner)
7116 {
7117 if (old_owner.
IsMan())
7118 {
7119 ownerPlayerOld = Man.Cast(old_owner);
7120 }
7121 else
7122 {
7123 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
7124 }
7125 }
7126 else
7127 {
7129 {
7131
7132 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
7133 {
7134 GetCompEM().UnplugThis();
7135 }
7136 }
7137 }
7138
7139 if (new_owner)
7140 {
7141 if (new_owner.
IsMan())
7142 {
7143 ownerPlayerNew = Man.Cast(new_owner);
7144 }
7145 else
7146 {
7147 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
7148 }
7149 }
7150
7151 if (ownerPlayerOld != ownerPlayerNew)
7152 {
7153 if (ownerPlayerOld)
7154 {
7155 array<EntityAI> subItemsExit = new array<EntityAI>;
7157 for (int i = 0; i < subItemsExit.Count(); i++)
7158 {
7161 }
7162 }
7163
7164 if (ownerPlayerNew)
7165 {
7166 array<EntityAI> subItemsEnter = new array<EntityAI>;
7168 for (int j = 0; j < subItemsEnter.Count(); j++)
7169 {
7172 }
7173 }
7174 }
7175 else if (ownerPlayerNew != null)
7176 {
7177 PlayerBase nplayer;
7178 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7179 {
7180 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7182 for (int k = 0; k < subItemsUpdate.Count(); k++)
7183 {
7185 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7186 }
7187 }
7188 }
7189
7190 if (old_owner)
7191 old_owner.OnChildItemRemoved(this);
7192 if (new_owner)
7193 new_owner.OnChildItemReceived(this);
7194 }
7195
7196
7198 {
7199 super.EEDelete(parent);
7200 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7201 if (player)
7202 {
7204
7205 if (player.IsAlive())
7206 {
7207 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7208 if (r_index >= 0)
7209 {
7210 InventoryLocation r_il = new InventoryLocation;
7211 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7212
7213 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7216 {
7217 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7218 }
7220 {
7221 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7222 }
7223
7224 }
7225
7226 player.RemoveQuickBarEntityShortcut(this);
7227 }
7228 }
7229 }
7230
7232 {
7233 super.EEKilled(killer);
7234
7237 {
7238 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7239 {
7240 if (IsMagazine())
7241 {
7242 if (Magazine.Cast(this).GetAmmoCount() > 0)
7243 {
7245 }
7246 }
7247 else
7248 {
7250 }
7251 }
7252 }
7253 }
7254
7256 {
7257 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7258
7259 super.OnWasAttached(parent, slot_id);
7260
7263
7266 }
7267
7269 {
7270 super.OnWasDetached(parent, slot_id);
7271
7274
7277 }
7278
7280 {
7281 int idx;
7284
7285 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7286 if (inventory_slots.Count() < 1)
7287 {
7288 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7289 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7290 }
7291 else
7292 {
7293 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7294 }
7295
7296 idx = inventory_slots.Find(slot);
7297 if (idx < 0)
7298 return "";
7299
7300 return attach_types.Get(idx);
7301 }
7302
7304 {
7305 int idx = -1;
7306 string slot;
7307
7310
7311 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7312 if (inventory_slots.Count() < 1)
7313 {
7314 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7315 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7316 }
7317 else
7318 {
7319 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7320 if (detach_types.Count() < 1)
7321 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7322 }
7323
7324 for (int i = 0; i < inventory_slots.Count(); i++)
7325 {
7326 slot = inventory_slots.Get(i);
7327 }
7328
7329 if (slot != "")
7330 {
7331 if (detach_types.Count() == 1)
7332 idx = 0;
7333 else
7334 idx = inventory_slots.Find(slot);
7335 }
7336 if (idx < 0)
7337 return "";
7338
7339 return detach_types.Get(idx);
7340 }
7341
7343 {
7344
7346
7347
7348 float min_time = 1;
7349 float max_time = 3;
7350 float delay = Math.RandomFloat(min_time, max_time);
7351
7352 explode_timer.Run(delay, this, "DoAmmoExplosion");
7353 }
7354
7356 {
7357 Magazine magazine = Magazine.Cast(this);
7358 int pop_sounds_count = 6;
7359 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7360
7361
7362 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7363 string sound_name = pop_sounds[ sound_idx ];
7364 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7365
7366
7367 magazine.ServerAddAmmoCount(-1);
7368
7369
7370 float min_temp_to_explode = 100;
7371
7372 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7373 {
7375 }
7376 }
7377
7378
7379 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7380 {
7381 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7382
7383 const int CHANCE_DAMAGE_CARGO = 4;
7384 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7385 const int CHANCE_DAMAGE_NOTHING = 2;
7386
7388 {
7389 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7390 int chances;
7391 int rnd;
7392
7393 if (GetInventory().GetCargo())
7394 {
7395 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7396 rnd = Math.RandomInt(0,chances);
7397
7398 if (rnd < CHANCE_DAMAGE_CARGO)
7399 {
7401 }
7402 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7403 {
7405 }
7406 }
7407 else
7408 {
7409 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7410 rnd = Math.RandomInt(0,chances);
7411
7412 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7413 {
7415 }
7416 }
7417 }
7418 }
7419
7421 {
7422 CargoBase cargo = GetInventory().GetCargo();
7423 if (cargo)
7424 {
7426 if (item_count > 0)
7427 {
7428 int random_pick = Math.RandomInt(0, item_count);
7430 if (!item.IsExplosive())
7431 {
7432 item.AddHealth("","",damage);
7433 return true;
7434 }
7435 }
7436 }
7437 return false;
7438 }
7439
7441 {
7442 GameInventory inventory = GetInventory();
7444 if (attachment_count > 0)
7445 {
7446 int random_pick = Math.RandomInt(0, attachment_count);
7448 if (!attachment.IsExplosive())
7449 {
7450 attachment.AddHealth("","",damage);
7451 return true;
7452 }
7453 }
7454 return false;
7455 }
7456
7458 {
7460 }
7461
7463 {
7465 return GetInventory().CanRemoveEntity();
7466
7467 return false;
7468 }
7469
7471 {
7472
7474 return false;
7475
7476
7478 return false;
7479
7480
7481
7483 if (delta == 0)
7484 return false;
7485
7486
7487 return true;
7488 }
7489
7491 {
7493 {
7494 if (ScriptInputUserData.CanStoreInputUserData())
7495 {
7496 ScriptInputUserData ctx = new ScriptInputUserData;
7501 ctx.
Write(destination_entity);
7505 }
7506 }
7507 else if (!
g_Game.IsMultiplayer())
7508 {
7510 }
7511 }
7512
7514 {
7515 float split_quantity_new;
7519 InventoryLocation loc = new InventoryLocation;
7520
7521 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7522 {
7524 split_quantity_new = stack_max;
7525 else
7527
7529 {
7530 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7531 if (new_item)
7532 {
7533 new_item.SetResultOfSplit(true);
7534 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7536 new_item.
SetQuantity(split_quantity_new,
false,
true);
7537 }
7538 }
7539 }
7540 else if (destination_entity && slot_id == -1)
7541 {
7542 if (quantity > stack_max)
7543 split_quantity_new = stack_max;
7544 else
7545 split_quantity_new = quantity;
7546
7548 {
7549 GameInventory destinationInventory = destination_entity.GetInventory();
7551 {
7554 }
7555
7556 if (new_item)
7557 {
7558 new_item.SetResultOfSplit(true);
7559 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7561 new_item.
SetQuantity(split_quantity_new,
false,
true);
7562 }
7563 }
7564 }
7565 else
7566 {
7567 if (stack_max != 0)
7568 {
7570 {
7572 }
7573
7574 if (split_quantity_new == 0)
7575 {
7576 if (!
g_Game.IsMultiplayer())
7577 player.PhysicalPredictiveDropItem(this);
7578 else
7579 player.ServerDropEntity(this);
7580 return;
7581 }
7582
7584 {
7586
7587 if (new_item)
7588 {
7589 new_item.SetResultOfSplit(true);
7590 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7593 new_item.PlaceOnSurface();
7594 }
7595 }
7596 }
7597 }
7598 }
7599
7601 {
7602 float split_quantity_new;
7606 InventoryLocation loc = new InventoryLocation;
7607
7608 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7609 {
7611 split_quantity_new = stack_max;
7612 else
7614
7616 {
7617 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7618 if (new_item)
7619 {
7620 new_item.SetResultOfSplit(true);
7621 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7623 new_item.
SetQuantity(split_quantity_new,
false,
true);
7624 }
7625 }
7626 }
7627 else if (destination_entity && slot_id == -1)
7628 {
7629 if (quantity > stack_max)
7630 split_quantity_new = stack_max;
7631 else
7632 split_quantity_new = quantity;
7633
7635 {
7636 GameInventory destinationInventory = destination_entity.GetInventory();
7638 {
7641 }
7642
7643 if (new_item)
7644 {
7645 new_item.SetResultOfSplit(true);
7646 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7648 new_item.
SetQuantity(split_quantity_new,
false,
true);
7649 }
7650 }
7651 }
7652 else
7653 {
7654 if (stack_max != 0)
7655 {
7657 {
7659 }
7660
7662 {
7664
7665 if (new_item)
7666 {
7667 new_item.SetResultOfSplit(true);
7668 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7671 new_item.PlaceOnSurface();
7672 }
7673 }
7674 }
7675 }
7676 }
7677
7679 {
7681 {
7682 if (ScriptInputUserData.CanStoreInputUserData())
7683 {
7684 ScriptInputUserData ctx = new ScriptInputUserData;
7689 dst.WriteToContext(ctx);
7691 }
7692 }
7693 else if (!
g_Game.IsMultiplayer())
7694 {
7696 }
7697 }
7698
7700 {
7702 {
7703 if (ScriptInputUserData.CanStoreInputUserData())
7704 {
7705 ScriptInputUserData ctx = new ScriptInputUserData;
7710 ctx.
Write(destination_entity);
7716 }
7717 }
7718 else if (!
g_Game.IsMultiplayer())
7719 {
7721 }
7722 }
7723
7725 {
7727 }
7728
7730 {
7732 float split_quantity_new;
7734 if (dst.IsValid())
7735 {
7736 int slot_id = dst.GetSlot();
7738
7739 if (quantity > stack_max)
7740 split_quantity_new = stack_max;
7741 else
7742 split_quantity_new = quantity;
7743
7745 {
7747
7748 if (new_item)
7749 {
7750 new_item.SetResultOfSplit(true);
7751 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7753 new_item.
SetQuantity(split_quantity_new,
false,
true);
7754 }
7755
7756 return new_item;
7757 }
7758 }
7759
7760 return null;
7761 }
7762
7764 {
7766 float split_quantity_new;
7768 if (destination_entity)
7769 {
7771 if (quantity > stackable)
7772 split_quantity_new = stackable;
7773 else
7774 split_quantity_new = quantity;
7775
7777 {
7778 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7779 if (new_item)
7780 {
7781 new_item.SetResultOfSplit(true);
7782 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7784 new_item.
SetQuantity(split_quantity_new,
false,
true);
7785 }
7786 }
7787 }
7788 }
7789
7791 {
7793 {
7794 if (ScriptInputUserData.CanStoreInputUserData())
7795 {
7796 ScriptInputUserData ctx = new ScriptInputUserData;
7801 ItemBase destination_entity =
this;
7802 ctx.
Write(destination_entity);
7806 }
7807 }
7808 else if (!
g_Game.IsMultiplayer())
7809 {
7811 }
7812 }
7813
7815 {
7817 float split_quantity_new;
7819 if (player)
7820 {
7822 if (quantity > stackable)
7823 split_quantity_new = stackable;
7824 else
7825 split_quantity_new = quantity;
7826
7828 {
7829 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7830 new_item =
ItemBase.Cast(in_hands);
7831 if (new_item)
7832 {
7833 new_item.SetResultOfSplit(true);
7834 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7836 new_item.SetQuantity(split_quantity_new, false, true);
7837 }
7838 }
7839 }
7840 }
7841
7843 {
7845 float split_quantity_new = Math.Floor(quantity * 0.5);
7846
7848 return;
7849
7851
7852 if (new_item)
7853 {
7854 if (new_item.GetQuantityMax() < split_quantity_new)
7855 {
7856 split_quantity_new = new_item.GetQuantityMax();
7857 }
7858
7859 new_item.SetResultOfSplit(true);
7860 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7861
7863 {
7866 }
7867 else
7868 {
7870 new_item.
SetQuantity(split_quantity_new,
false,
true);
7871 }
7872 }
7873 }
7874
7876 {
7878 float split_quantity_new = Math.Floor(quantity / 2);
7879
7881 return;
7882
7883 InventoryLocation invloc = new InventoryLocation;
7885
7887 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7888
7889 if (new_item)
7890 {
7891 if (new_item.GetQuantityMax() < split_quantity_new)
7892 {
7893 split_quantity_new = new_item.GetQuantityMax();
7894 }
7896 {
7899 }
7900 else if (split_quantity_new > 1)
7901 {
7903 new_item.
SetQuantity(split_quantity_new,
false,
true);
7904 }
7905 }
7906 }
7907
7910 {
7911 SetWeightDirty();
7913
7914 if (parent)
7915 parent.OnAttachmentQuantityChangedEx(this, delta);
7916
7918 {
7920 {
7922 }
7924 {
7925 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7927 }
7928 }
7929 }
7930
7933 {
7934
7935 }
7936
7939 {
7941 }
7942
7944 {
7945 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7946
7948 {
7949 if (newLevel == GameConstants.STATE_RUINED)
7950 {
7952 EntityAI parent = GetHierarchyParent();
7953 if (parent && parent.IsFireplace())
7954 {
7955 CargoBase cargo = GetInventory().GetCargo();
7956 if (cargo)
7957 {
7959 {
7961 }
7962 }
7963 }
7964 }
7965
7967 {
7968
7970 return;
7971 }
7972
7973 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7974 {
7976 }
7977 }
7978 }
7979
7980
7982 {
7983 super.OnRightClick();
7984
7986 {
7988 {
7989 if (ScriptInputUserData.CanStoreInputUserData())
7990 {
7991 EntityAI root = GetHierarchyRoot();
7992 Man playerOwner = GetHierarchyRootPlayer();
7993 InventoryLocation dst = new InventoryLocation;
7994
7995
7996 if (!playerOwner && root && root == this)
7997 {
7999 }
8000 else
8001 {
8002
8003 GetInventory().GetCurrentInventoryLocation(dst);
8005 {
8006 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8008 {
8010 }
8011 else
8012 {
8014
8015
8016 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
8017 {
8019 }
8020 else
8021 {
8022 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
8023 }
8024 }
8025 }
8026 }
8027
8028 ScriptInputUserData ctx = new ScriptInputUserData;
8036 }
8037 }
8038 else if (!
g_Game.IsMultiplayer())
8039 {
8041 }
8042 }
8043 }
8044
8046 {
8047 if (root)
8048 {
8049 vector m4[4];
8050 root.GetTransform(m4);
8051 dst.SetGround(this, m4);
8052 }
8053 else
8054 {
8055 GetInventory().GetCurrentInventoryLocation(dst);
8056 }
8057 }
8058
8059 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
8060 {
8061
8062 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
8063 return false;
8064
8065 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8066 return false;
8067
8068
8070 return false;
8071
8072
8073 Magazine mag = Magazine.Cast(this);
8074 if (mag)
8075 {
8076 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8077 return false;
8078
8079 if (stack_max_limit)
8080 {
8081 Magazine other_mag = Magazine.Cast(other_item);
8082 if (other_item)
8083 {
8084 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8085 return false;
8086 }
8087
8088 }
8089 }
8090 else
8091 {
8092
8094 return false;
8095
8097 return false;
8098 }
8099
8100 PlayerBase player = null;
8101 if (CastTo(player, GetHierarchyRootPlayer()))
8102 {
8103 if (player.GetInventory().HasAttachment(this))
8104 return false;
8105
8106 if (player.IsItemsToDelete())
8107 return false;
8108 }
8109
8110 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8111 return false;
8112
8113 int slotID;
8115 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8116 return false;
8117
8118 return true;
8119 }
8120
8122 {
8124 }
8125
8127 {
8128 return m_IsResultOfSplit;
8129 }
8130
8132 {
8133 m_IsResultOfSplit = value;
8134 }
8135
8137 {
8139 }
8140
8142 {
8143 float other_item_quantity = other_item.GetQuantity();
8144 float this_free_space;
8145
8147
8149
8150 if (other_item_quantity > this_free_space)
8151 {
8152 return this_free_space;
8153 }
8154 else
8155 {
8156 return other_item_quantity;
8157 }
8158 }
8159
8161 {
8163 }
8164
8166 {
8168 return;
8169
8170 if (!IsMagazine() && other_item)
8171 {
8173 if (quantity_used != 0)
8174 {
8175 float hp1 = GetHealth01("","");
8176 float hp2 = other_item.GetHealth01("","");
8177 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
8178 hpResult = hpResult / (
GetQuantity() + quantity_used);
8179
8180 hpResult *= GetMaxHealth();
8181 Math.Round(hpResult);
8182 SetHealth("", "Health", hpResult);
8183
8185 other_item.AddQuantity(-quantity_used);
8186 }
8187 }
8189 }
8190
8192 {
8193 #ifdef SERVER
8194 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8195 GetHierarchyParent().IncreaseLifetimeUp();
8196 #endif
8197 };
8198
8200 {
8201 PlayerBase p = PlayerBase.Cast(player);
8202
8203 array<int> recipesIds = p.m_Recipes;
8204 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8205 if (moduleRecipesManager)
8206 {
8207 EntityAI itemInHands = player.GetEntityInHands();
8208 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8209 }
8210
8211 for (int i = 0;i < recipesIds.Count(); i++)
8212 {
8213 int key = recipesIds.Get(i);
8214 string recipeName = moduleRecipesManager.GetRecipeName(key);
8216 }
8217 }
8218
8219
8220 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8221 {
8222 super.GetDebugActions(outputList);
8223
8224
8230
8231
8236
8241
8242
8246
8247
8249 {
8253 }
8254
8257
8258
8262
8264
8265 InventoryLocation loc = new InventoryLocation();
8266 GetInventory().GetCurrentInventoryLocation(loc);
8268 {
8269 if (Gizmo_IsSupported())
8272 }
8273
8275 }
8276
8277
8278
8279
8281 {
8282 super.OnAction(action_id, player, ctx);
8283
8285 {
8286 switch (action_id)
8287 {
8291 return true;
8295 return true;
8296 }
8297 }
8298
8300 {
8301 switch (action_id)
8302 {
8304 Delete();
8305 return true;
8306 }
8307 }
8308
8309 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8310 {
8311 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8312 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8313 PlayerBase p = PlayerBase.Cast(player);
8314 if (
EActions.RECIPES_RANGE_START < 1000)
8315 {
8316 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8317 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8318 }
8319 }
8320 #ifndef SERVER
8321 else if (action_id ==
EActions.WATCH_PLAYER)
8322 {
8323 PluginDeveloper.SetDeveloperItemClientEx(player);
8324 }
8325 #endif
8327 {
8328 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8329 {
8330 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8331 OnDebugButtonPressServer(id + 1);
8332 }
8333
8334 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8335 {
8336 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8338 }
8339
8340 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8341 {
8342 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8344 }
8345
8346 else if (action_id ==
EActions.ADD_QUANTITY)
8347 {
8348 if (IsMagazine())
8349 {
8350 Magazine mag = Magazine.Cast(this);
8351 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8352 }
8353 else
8354 {
8356 }
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.REMOVE_QUANTITY)
8366 {
8367 if (IsMagazine())
8368 {
8369 Magazine mag2 = Magazine.Cast(this);
8370 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8371 }
8372 else
8373 {
8375 }
8376 if (m_EM)
8377 {
8378 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8379 }
8380
8381 }
8382
8383 else if (action_id ==
EActions.SET_QUANTITY_0)
8384 {
8386
8387 if (m_EM)
8388 {
8389 m_EM.SetEnergy(0);
8390 }
8391 }
8392
8393 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8394 {
8396
8397 if (m_EM)
8398 {
8399 m_EM.SetEnergy(m_EM.GetEnergyMax());
8400 }
8401 }
8402
8403 else if (action_id ==
EActions.ADD_HEALTH)
8404 {
8405 AddHealth("","",GetMaxHealth("","Health")/5);
8406 }
8407 else if (action_id ==
EActions.REMOVE_HEALTH)
8408 {
8409 AddHealth("","",-GetMaxHealth("","Health")/5);
8410 }
8411 else if (action_id ==
EActions.DESTROY_HEALTH)
8412 {
8413 SetHealth01("","",0);
8414 }
8415 else if (action_id ==
EActions.WATCH_ITEM)
8416 {
8418 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8419 #ifdef DEVELOPER
8420 SetDebugDeveloper_item(this);
8421 #endif
8422 }
8423
8424 else if (action_id ==
EActions.ADD_TEMPERATURE)
8425 {
8426 AddTemperature(20);
8427
8428 }
8429
8430 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8431 {
8432 AddTemperature(-20);
8433
8434 }
8435
8436 else if (action_id ==
EActions.FLIP_FROZEN)
8437 {
8438 SetFrozen(!GetIsFrozen());
8439
8440 }
8441
8442 else if (action_id ==
EActions.ADD_WETNESS)
8443 {
8445
8446 }
8447
8448 else if (action_id ==
EActions.REMOVE_WETNESS)
8449 {
8451
8452 }
8453
8454 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8455 {
8458
8459
8460 }
8461
8462 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8463 {
8466 }
8467
8468 else if (action_id ==
EActions.MAKE_SPECIAL)
8469 {
8470 auto debugParams = DebugSpawnParams.WithPlayer(player);
8471 OnDebugSpawnEx(debugParams);
8472 }
8473
8474 }
8475
8476
8477 return false;
8478 }
8479
8480
8481
8482
8486
8489
8490
8491
8493 {
8494 return false;
8495 }
8496
8497
8499 {
8500 return true;
8501 }
8502
8503
8505 {
8506 return true;
8507 }
8508
8509
8510
8512 {
8513 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8514 return g_Game.ConfigIsExisting(config_path);
8515 }
8516
8519 {
8520 return null;
8521 }
8522
8524 {
8525 return false;
8526 }
8527
8529 {
8530 return false;
8531 }
8532
8536
8537
8539 {
8540 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8541 return module_repairing.CanRepair(this, item_repair_kit);
8542 }
8543
8544
8545 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8546 {
8547 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8548 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8549 }
8550
8551
8553 {
8554
8555
8556
8557
8558
8559
8560
8561
8562 return 1;
8563 }
8564
8565
8566
8568 {
8570 }
8571
8572
8573
8575 {
8577 }
8578
8579
8588 {
8589 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8590
8591 if (player)
8592 {
8593 player.MessageStatus(text);
8594 }
8595 }
8596
8597
8606 {
8607 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8608
8609 if (player)
8610 {
8611 player.MessageAction(text);
8612 }
8613 }
8614
8615
8624 {
8625 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8626
8627 if (player)
8628 {
8629 player.MessageFriendly(text);
8630 }
8631 }
8632
8633
8642 {
8643 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8644
8645 if (player)
8646 {
8647 player.MessageImportant(text);
8648 }
8649 }
8650
8652 {
8653 return true;
8654 }
8655
8656
8657 override bool KindOf(
string tag)
8658 {
8659 bool found = false;
8660 string item_name = this.
GetType();
8662 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8663
8664 int array_size = item_tag_array.Count();
8665 for (int i = 0; i < array_size; i++)
8666 {
8667 if (item_tag_array.Get(i) == tag)
8668 {
8669 found = true;
8670 break;
8671 }
8672 }
8673 return found;
8674 }
8675
8676
8678 {
8679
8680 super.OnRPC(sender, rpc_type,ctx);
8681
8682
8683 switch (rpc_type)
8684 {
8685 #ifndef SERVER
8686 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8687 Param2<bool, string> p = new Param2<bool, string>(false, "");
8688
8690 return;
8691
8692 bool play = p.param1;
8693 string soundSet = p.param2;
8694
8695 if (play)
8696 {
8698 {
8700 {
8702 }
8703 }
8704 else
8705 {
8707 }
8708 }
8709 else
8710 {
8712 }
8713
8714 break;
8715 #endif
8716
8717 }
8718
8720 {
8722 }
8723 }
8724
8725
8726
8727
8729 {
8730 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8731 return plugin.GetID(
name);
8732 }
8733
8735 {
8736 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8737 return plugin.GetName(id);
8738 }
8739
8742 {
8743
8744
8745 int varFlags;
8746 if (!ctx.
Read(varFlags))
8747 return;
8748
8749 if (varFlags & ItemVariableFlags.FLOAT)
8750 {
8752 }
8753 }
8754
8756 {
8757
8758 super.SerializeNumericalVars(floats_out);
8759
8760
8761
8763 {
8765 }
8766
8768 {
8770 }
8771
8773 {
8775 }
8776
8778 {
8783 }
8784
8786 {
8788 }
8789 }
8790
8792 {
8793
8794 super.DeSerializeNumericalVars(floats);
8795
8796
8797 int index = 0;
8798 int mask = Math.Round(floats.Get(index));
8799
8800 index++;
8801
8803 {
8805 {
8807 }
8808 else
8809 {
8810 float quantity = floats.Get(index);
8812 }
8813 index++;
8814 }
8815
8817 {
8818 float wet = floats.Get(index);
8820 index++;
8821 }
8822
8824 {
8825 int liquidtype = Math.Round(floats.Get(index));
8827 index++;
8828 }
8829
8831 {
8833 index++;
8835 index++;
8837 index++;
8839 index++;
8840 }
8841
8843 {
8844 int cleanness = Math.Round(floats.Get(index));
8846 index++;
8847 }
8848 }
8849
8851 {
8852 super.WriteVarsToCTX(ctx);
8853
8854
8856 {
8858 }
8859
8861 {
8863 }
8864
8866 {
8868 }
8869
8871 {
8872 int r,g,b,a;
8878 }
8879
8881 {
8883 }
8884 }
8885
8887 {
8888 if (!super.ReadVarsFromCTX(ctx,version))
8889 return false;
8890
8891 int intValue;
8892 float value;
8893
8894 if (version < 140)
8895 {
8896 if (!ctx.
Read(intValue))
8897 return false;
8898
8899 m_VariablesMask = intValue;
8900 }
8901
8903 {
8904 if (!ctx.
Read(value))
8905 return false;
8906
8908 {
8910 }
8911 else
8912 {
8914 }
8915 }
8916
8917 if (version < 140)
8918 {
8920 {
8921 if (!ctx.
Read(value))
8922 return false;
8923 SetTemperatureDirect(value);
8924 }
8925 }
8926
8928 {
8929 if (!ctx.
Read(value))
8930 return false;
8932 }
8933
8935 {
8936 if (!ctx.
Read(intValue))
8937 return false;
8939 }
8940
8942 {
8943 int r,g,b,a;
8945 return false;
8947 return false;
8949 return false;
8951 return false;
8952
8954 }
8955
8957 {
8958 if (!ctx.
Read(intValue))
8959 return false;
8961 }
8962
8963 if (version >= 138 && version < 140)
8964 {
8966 {
8967 if (!ctx.
Read(intValue))
8968 return false;
8969 SetFrozen(intValue);
8970 }
8971 }
8972
8973 return true;
8974 }
8975
8976
8978 {
8981 {
8983 }
8984
8985 if (!super.OnStoreLoad(ctx, version))
8986 {
8988 return false;
8989 }
8990
8991 if (version >= 114)
8992 {
8993 bool hasQuickBarIndexSaved;
8994
8995 if (!ctx.
Read(hasQuickBarIndexSaved))
8996 {
8998 return false;
8999 }
9000
9001 if (hasQuickBarIndexSaved)
9002 {
9003 int itmQBIndex;
9004
9005
9006 if (!ctx.
Read(itmQBIndex))
9007 {
9009 return false;
9010 }
9011
9012 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
9013 if (itmQBIndex != -1 && parentPlayer)
9014 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
9015 }
9016 }
9017 else
9018 {
9019
9020 PlayerBase player;
9021 int itemQBIndex;
9022 if (version ==
int.
MAX)
9023 {
9024 if (!ctx.
Read(itemQBIndex))
9025 {
9027 return false;
9028 }
9029 }
9030 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
9031 {
9032
9033 if (!ctx.
Read(itemQBIndex))
9034 {
9036 return false;
9037 }
9038 if (itemQBIndex != -1 && player)
9039 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
9040 }
9041 }
9042
9043 if (version < 140)
9044 {
9045
9046 if (!LoadVariables(ctx, version))
9047 {
9049 return false;
9050 }
9051 }
9052
9053
9055 {
9057 return false;
9058 }
9059 if (version >= 132)
9060 {
9062 if (raib)
9063 {
9065 {
9067 return false;
9068 }
9069 }
9070 }
9071
9073 return true;
9074 }
9075
9076
9077
9079 {
9080 super.OnStoreSave(ctx);
9081
9082 PlayerBase player;
9083 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9084 {
9086
9087 int itemQBIndex = -1;
9088 itemQBIndex = player.FindQuickBarEntityIndex(this);
9089 ctx.
Write(itemQBIndex);
9090 }
9091 else
9092 {
9094 }
9095
9097
9099 if (raib)
9100 {
9102 }
9103 }
9104
9105
9107 {
9108 super.AfterStoreLoad();
9109
9111 {
9113 }
9114
9116 {
9119 }
9120 }
9121
9123 {
9124 super.EEOnAfterLoad();
9125
9127 {
9129 }
9130
9133 }
9134
9136 {
9137 return false;
9138 }
9139
9140
9141
9143 {
9145 {
9146 #ifdef PLATFORM_CONSOLE
9147
9149 {
9151 if (menu)
9152 {
9154 }
9155 }
9156 #endif
9157 }
9158
9160 {
9163 }
9164
9166 {
9167 SetWeightDirty();
9169 }
9171 {
9174 }
9175
9177 {
9180
9183 }
9185 {
9189 }
9190
9191 super.OnVariablesSynchronized();
9192 }
9193
9194
9195
9197 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9198 {
9199 if (!IsServerCheck(allow_client))
9200 return false;
9201
9203 return false;
9204
9207
9208 if (value <= (min + 0.001))
9209 value = min;
9210
9211 if (value == min)
9212 {
9213 if (destroy_config)
9214 {
9215 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9216 if (dstr)
9217 {
9219 this.Delete();
9220 return true;
9221 }
9222 }
9223 else if (destroy_forced)
9224 {
9226 this.Delete();
9227 return true;
9228 }
9229
9231 }
9232
9235
9237 {
9238 EntityAI parent = GetHierarchyRoot();
9239 InventoryLocation iLoc = new InventoryLocation();
9240 GetInventory().GetCurrentInventoryLocation(iLoc);
9242 {
9243 int iLocSlot = iLoc.
GetSlot();
9245 {
9247 }
9249 {
9251 }
9252 }
9253 }
9254
9256 {
9258
9259 if (delta)
9261 }
9262
9264
9265 return false;
9266 }
9267
9268
9270 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9271 {
9273 }
9274
9276 {
9279 }
9280
9282 {
9285 }
9286
9288 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9289 {
9290 float value_clamped = Math.Clamp(value, 0, 1);
9292 SetQuantity(result, destroy_config, destroy_forced);
9293 }
9294
9295
9298 {
9300 }
9301
9303 {
9305 }
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9317 {
9318 int slot = -1;
9319 GameInventory inventory = GetInventory();
9320 if (inventory)
9321 {
9322 InventoryLocation il = new InventoryLocation;
9325 }
9326
9328 }
9329
9331 {
9332 float quantity_max = 0;
9333
9335 {
9336 if (attSlotID != -1)
9337 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9338
9339 if (quantity_max <= 0)
9341 }
9342
9343 if (quantity_max <= 0)
9345
9346 return quantity_max;
9347 }
9348
9350 {
9352 }
9353
9355 {
9357 }
9358
9359
9361 {
9363 }
9364
9366 {
9368 }
9369
9371 {
9373 }
9374
9375
9377 {
9378
9379 float weightEx = GetWeightEx();
9380 float special = GetInventoryAndCargoWeight();
9381 return weightEx - special;
9382 }
9383
9384
9386 {
9388 }
9389
9391 {
9393 {
9394 #ifdef DEVELOPER
9395 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9396 {
9397 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9399 }
9400 #endif
9401
9403 }
9404 else if (HasEnergyManager())
9405 {
9406 #ifdef DEVELOPER
9407 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9408 {
9409 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9410 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9411 }
9412 #endif
9413 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9414 }
9415 else
9416 {
9417 #ifdef DEVELOPER
9418 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9419 {
9420 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9421 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9422 }
9423 #endif
9424 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9425 }
9426 }
9427
9430 {
9431 int item_count = 0;
9433
9434 GameInventory inventory = GetInventory();
9435 CargoBase cargo = inventory.
GetCargo();
9436 if (cargo != NULL)
9437 {
9439 }
9440
9442 for (int i = 0; i < nAttachments; ++i)
9443 {
9445 if (item)
9446 item_count += item.GetNumberOfItems();
9447 }
9448 return item_count;
9449 }
9450
9453 {
9454 float weight = 0;
9455 float wetness = 1;
9456 if (include_wetness)
9459 {
9460 weight = wetness * m_ConfigWeight;
9461 }
9463 {
9464 weight = 1;
9465 }
9466 return weight;
9467 }
9468
9469
9470
9472 {
9473 GameInventory inventory = GetInventory();
9474 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9475 {
9476 array<EntityAI> items = new array<EntityAI>;
9478 for (int i = 0; i < items.Count(); ++i)
9479 {
9481 if (item)
9482 {
9483 g_Game.ObjectDelete(item);
9484 }
9485 }
9486 }
9487 }
9488
9489
9490
9491
9493 {
9494 float energy = 0;
9495 if (HasEnergyManager())
9496 {
9497 energy = GetCompEM().GetEnergy();
9498 }
9499 return energy;
9500 }
9501
9502
9504 {
9505 super.OnEnergyConsumed();
9506
9508 }
9509
9511 {
9512 super.OnEnergyAdded();
9513
9515 }
9516
9517
9519 {
9520 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9521 {
9523 {
9524 float energy_0to1 = GetCompEM().GetEnergy0To1();
9526 }
9527 }
9528 }
9529
9530
9532 {
9533 return ConfigGetFloat("heatIsolation");
9534 }
9535
9537 {
9539 }
9540
9542 {
9543 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9544 if (
g_Game.ConfigIsExisting(paramPath))
9545 return g_Game.ConfigGetFloat(paramPath);
9546
9547 return 0.0;
9548 }
9549
9551 {
9552 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9553 if (
g_Game.ConfigIsExisting(paramPath))
9554 return g_Game.ConfigGetFloat(paramPath);
9555
9556 return 0.0;
9557 }
9558
9559 override void SetWet(
float value,
bool allow_client =
false)
9560 {
9561 if (!IsServerCheck(allow_client))
9562 return;
9563
9566
9568
9569 m_VarWet = Math.Clamp(value, min, max);
9570
9572 {
9575 }
9576 }
9577
9578 override void AddWet(
float value)
9579 {
9581 }
9582
9584 {
9586 }
9587
9589 {
9591 }
9592
9594 {
9596 }
9597
9599 {
9601 }
9602
9604 {
9606 }
9607
9609 {
9612 if (newLevel != oldLevel)
9613 {
9615 }
9616 }
9617
9619 {
9620 SetWeightDirty();
9621 }
9622
9624 {
9625 return GetWetLevelInternal(
m_VarWet);
9626 }
9627
9628
9629
9631 {
9633 }
9634
9636 {
9638 }
9639
9641 {
9643 }
9644
9646 {
9648 }
9649
9650
9651
9653 {
9654 if (ConfigIsExisting("itemModelLength"))
9655 {
9656 return ConfigGetFloat("itemModelLength");
9657 }
9658 return 0;
9659 }
9660
9662 {
9663 if (ConfigIsExisting("itemAttachOffset"))
9664 {
9665 return ConfigGetFloat("itemAttachOffset");
9666 }
9667 return 0;
9668 }
9669
9670 override void SetCleanness(
int value,
bool allow_client =
false)
9671 {
9672 if (!IsServerCheck(allow_client))
9673 return;
9674
9676
9678
9681 }
9682
9684 {
9686 }
9687
9689 {
9690 return true;
9691 }
9692
9693
9694
9695
9697 {
9699 }
9700
9702 {
9704 }
9705
9706
9707
9708
9709 override void SetColor(
int r,
int g,
int b,
int a)
9710 {
9716 }
9718 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9719 {
9724 }
9725
9727 {
9729 }
9730
9733 {
9734 int r,g,b,a;
9736 r = r/255;
9737 g = g/255;
9738 b = b/255;
9739 a = a/255;
9740 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9741 }
9742
9743
9744
9745 override void SetLiquidType(
int value,
bool allow_client =
false)
9746 {
9747 if (!IsServerCheck(allow_client))
9748 return;
9749
9754 }
9755
9757 {
9758 return ConfigGetInt("varLiquidTypeInit");
9759 }
9760
9762 {
9764 }
9765
9767 {
9769 SetFrozen(false);
9770 }
9771
9774 {
9775 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9776 }
9777
9778
9781 {
9782 PlayerBase nplayer;
9783 if (PlayerBase.CastTo(nplayer, player))
9784 {
9786 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9787 }
9788 }
9789
9790
9793 {
9794 PlayerBase nplayer;
9795 if (PlayerBase.CastTo(nplayer,player))
9796 {
9797 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9798 }
9799
9800 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9801
9802 if (HasEnergyManager())
9803 {
9804 GetCompEM().UpdatePlugState();
9805 }
9806 }
9807
9808
9810 {
9811 super.OnPlacementStarted(player);
9812
9814 }
9815
9816 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9817 {
9819 {
9820 m_AdminLog.OnPlacementComplete(player,
this);
9821 }
9822
9823 super.OnPlacementComplete(player, position, orientation);
9824 }
9825
9826
9827
9828
9829
9831 {
9833 {
9834 return true;
9835 }
9836 else
9837 {
9838 return false;
9839 }
9840 }
9841
9842
9844 {
9846 {
9848 }
9849 }
9850
9851
9853 {
9855 }
9856
9858 {
9860 }
9861
9862 override void InsertAgent(
int agent,
float count = 1)
9863 {
9864 if (count < 1)
9865 return;
9866
9868 }
9869
9872 {
9874 }
9875
9876
9878 {
9880 }
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
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
9924 {
9926 return false;
9927 return true;
9928 }
9929
9931 {
9932
9934 }
9935
9936
9939 {
9940 super.CheckForRoofLimited(timeTresholdMS);
9941
9942 float time =
g_Game.GetTime();
9943 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9944 {
9945 m_PreviousRoofTestTime = time;
9946 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9947 }
9948 }
9949
9950
9952 {
9954 {
9955 return 0;
9956 }
9957
9958 if (GetInventory().GetAttachmentSlotsCount() != 0)
9959 {
9960 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9961 if (filter)
9962 return filter.GetProtectionLevel(type, false, system);
9963 else
9964 return 0;
9965 }
9966
9967 string subclassPath, entryName;
9968
9969 switch (type)
9970 {
9972 entryName = "biological";
9973 break;
9975 entryName = "chemical";
9976 break;
9977 default:
9978 entryName = "biological";
9979 break;
9980 }
9981
9982 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9983
9984 return g_Game.ConfigGetFloat(subclassPath + entryName);
9985 }
9986
9987
9988
9991 {
9992 if (!IsMagazine())
9994
9996 }
9997
9998
9999
10000
10001
10006 {
10007 return true;
10008 }
10009
10011 {
10013 }
10014
10015
10016
10017
10018
10020 {
10021 if (parent)
10022 {
10023 if (parent.IsInherited(DayZInfected))
10024 return true;
10025
10026 if (!parent.IsRuined())
10027 return true;
10028 }
10029
10030 return true;
10031 }
10032
10034 {
10035 if (!super.CanPutAsAttachment(parent))
10036 {
10037 return false;
10038 }
10039
10040 if (!IsRuined() && !parent.IsRuined())
10041 {
10042 return true;
10043 }
10044
10045 return false;
10046 }
10047
10049 {
10050
10051
10052
10053
10054 return super.CanReceiveItemIntoCargo(item);
10055 }
10056
10058 {
10059
10060
10061
10062
10063 GameInventory attachmentInv = attachment.GetInventory();
10065 {
10066 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10067 return false;
10068 }
10069
10070 InventoryLocation loc = new InventoryLocation();
10071 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10072 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
10073 return false;
10074
10075 return super.CanReceiveAttachment(attachment, slotId);
10076 }
10077
10079 {
10080 if (!super.CanReleaseAttachment(attachment))
10081 return false;
10082
10083 return GetInventory().AreChildrenAccessible();
10084 }
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10107 {
10108 int id = muzzle_owner.GetMuzzleID();
10109 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
10110
10111 if (WPOF_array)
10112 {
10113 for (int i = 0; i < WPOF_array.Count(); i++)
10114 {
10115 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10116
10117 if (WPOF)
10118 {
10119 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10120 }
10121 }
10122 }
10123 }
10124
10125
10127 {
10128 int id = muzzle_owner.GetMuzzleID();
10130
10131 if (WPOBE_array)
10132 {
10133 for (int i = 0; i < WPOBE_array.Count(); i++)
10134 {
10135 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10136
10137 if (WPOBE)
10138 {
10139 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10140 }
10141 }
10142 }
10143 }
10144
10145
10147 {
10148 int id = muzzle_owner.GetMuzzleID();
10149 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10150
10151 if (WPOOH_array)
10152 {
10153 for (int i = 0; i < WPOOH_array.Count(); i++)
10154 {
10155 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10156
10157 if (WPOOH)
10158 {
10159 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10160 }
10161 }
10162 }
10163 }
10164
10165
10167 {
10168 int id = muzzle_owner.GetMuzzleID();
10169 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10170
10171 if (WPOOH_array)
10172 {
10173 for (int i = 0; i < WPOOH_array.Count(); i++)
10174 {
10175 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10176
10177 if (WPOOH)
10178 {
10179 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10180 }
10181 }
10182 }
10183 }
10184
10185
10187 {
10188 int id = muzzle_owner.GetMuzzleID();
10189 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10190
10191 if (WPOOH_array)
10192 {
10193 for (int i = 0; i < WPOOH_array.Count(); i++)
10194 {
10195 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10196
10197 if (WPOOH)
10198 {
10199 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10200 }
10201 }
10202 }
10203 }
10204
10205
10206
10208 {
10210 {
10211 return true;
10212 }
10213
10214 return false;
10215 }
10216
10218 {
10220 {
10221 return true;
10222 }
10223
10224 return false;
10225 }
10226
10228 {
10230 {
10231 return true;
10232 }
10233
10234 return false;
10235 }
10236
10238 {
10239 return false;
10240 }
10241
10244 {
10245 return UATimeSpent.DEFAULT_DEPLOY;
10246 }
10247
10248
10249
10250
10252 {
10254 SetSynchDirty();
10255 }
10256
10258 {
10260 }
10261
10262
10264 {
10265 return false;
10266 }
10267
10270 {
10271 string att_type = "None";
10272
10273 if (ConfigIsExisting("soundAttType"))
10274 {
10275 att_type = ConfigGetString("soundAttType");
10276 }
10277
10279 }
10280
10282 {
10284 }
10285
10286
10287
10288
10289
10295
10297 {
10300
10302 }
10303
10304
10306 {
10308 return;
10309
10311
10314
10317
10318 SoundParameters params = new SoundParameters();
10322 }
10323
10324
10326 {
10328 {
10331
10332 SetSynchDirty();
10333
10336 }
10337 }
10338
10340 {
10342 }
10343
10344
10346 {
10348 return;
10349
10351 SetSynchDirty();
10352
10355 }
10356
10358 {
10361 }
10362
10364 {
10366 }
10367
10368 void OnApply(PlayerBase player);
10369
10371 {
10372 return 1.0;
10373 };
10374
10376 {
10378 }
10379
10381 {
10383 }
10384
10386
10388 {
10389 SetDynamicPhysicsLifeTime(0.01);
10391 }
10392
10394 {
10395 array<string> zone_names = new array<string>;
10396 GetDamageZones(zone_names);
10397 for (int i = 0; i < zone_names.Count(); i++)
10398 {
10399 SetHealthMax(zone_names.Get(i),"Health");
10400 }
10401 SetHealthMax("","Health");
10402 }
10403
10406 {
10407 float global_health = GetHealth01("","Health");
10408 array<string> zones = new array<string>;
10409 GetDamageZones(zones);
10410
10411 for (int i = 0; i < zones.Count(); i++)
10412 {
10413 SetHealth01(zones.Get(i),"Health",global_health);
10414 }
10415 }
10416
10419 {
10420 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10421 }
10422
10424 {
10425 if (!hasRootAsPlayer)
10426 {
10427 if (refParentIB)
10428 {
10429
10430 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10431 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10432
10433 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10434 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10435
10438 }
10439 else
10440 {
10441
10444 }
10445 }
10446 }
10447
10449 {
10451 {
10452 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10453 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10454 {
10455 float heatPermCoef = 1.0;
10457 while (ent)
10458 {
10459 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10460 ent = ent.GetHierarchyParent();
10461 }
10462
10463 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10464 }
10465 }
10466 }
10467
10469 {
10470
10471 EntityAI parent = GetHierarchyParent();
10472 if (!parent)
10473 {
10474 hasParent = false;
10475 hasRootAsPlayer = false;
10476 }
10477 else
10478 {
10479 hasParent = true;
10480 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10481 refParentIB =
ItemBase.Cast(parent);
10482 }
10483 }
10484
10485 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10486 {
10487
10488 }
10489
10491 {
10492
10493 return false;
10494 }
10495
10497 {
10498
10499
10500 return false;
10501 }
10502
10504 {
10505
10506 return false;
10507 }
10508
10511 {
10512 return !GetIsFrozen() &&
IsOpen();
10513 }
10514
10516 {
10517 bool hasParent = false, hasRootAsPlayer = false;
10519
10520 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10521 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10522
10523 if (wwtu || foodDecay)
10524 {
10528
10529 if (processWetness || processTemperature || processDecay)
10530 {
10532
10533 if (processWetness)
10534 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10535
10536 if (processTemperature)
10538
10539 if (processDecay)
10540 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10541 }
10542 }
10543 }
10544
10547 {
10549 }
10550
10552 {
10555
10556 return super.GetTemperatureFreezeThreshold();
10557 }
10558
10560 {
10563
10564 return super.GetTemperatureThawThreshold();
10565 }
10566
10568 {
10571
10572 return super.GetItemOverheatThreshold();
10573 }
10574
10576 {
10578 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10579
10580 return super.GetTemperatureFreezeTime();
10581 }
10582
10584 {
10586 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10587
10588 return super.GetTemperatureThawTime();
10589 }
10590
10595
10597 {
10598 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10599 }
10600
10602 {
10603 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10604 }
10605
10608 {
10610 }
10611
10613 {
10615 }
10616
10618 {
10620 }
10621
10624 {
10625 return null;
10626 }
10627
10630 {
10631 return false;
10632 }
10633
10635 {
10637 {
10640 if (!trg)
10641 {
10643 explosive = this;
10644 }
10645
10646 explosive.PairRemote(trg);
10648
10649 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10650 trg.SetPersistentPairID(persistentID);
10651 explosive.SetPersistentPairID(persistentID);
10652
10653 return true;
10654 }
10655 return false;
10656 }
10657
10660 {
10661 float ret = 1.0;
10664 ret *= GetHealth01();
10665
10666 return ret;
10667 }
10668
10669 #ifdef DEVELOPER
10670 override void SetDebugItem()
10671 {
10672 super.SetDebugItem();
10673 _itemBase = this;
10674 }
10675
10677 {
10678 string text = super.GetDebugText();
10679
10681 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10682
10683 return text;
10684 }
10685 #endif
10686
10688 {
10689 return true;
10690 }
10691
10693
10695
10697 {
10700 }
10701
10702
10710
10726
10727 [
Obsolete(
"Use ItemSoundHandler instead")]
10730 {
10731 if (!
g_Game.IsDedicatedServer())
10732 {
10733 if (ConfigIsExisting("attachSoundSet"))
10734 {
10735 string cfg_path = "";
10736 string soundset = "";
10737 string type_name =
GetType();
10738
10741 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10742 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10743
10744 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10745 {
10746 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10747 {
10748 if (cfg_slot_array[i] == slot_type)
10749 {
10750 soundset = cfg_soundset_array[i];
10751 break;
10752 }
10753 }
10754 }
10755
10756 if (soundset != "")
10757 {
10758 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10760 }
10761 }
10762 }
10763 }
10764
10766}
10767
10769{
10771 if (entity)
10772 {
10773 bool is_item = entity.IsInherited(
ItemBase);
10774 if (is_item && full_quantity)
10775 {
10778 }
10779 }
10780 else
10781 {
10783 return NULL;
10784 }
10785 return entity;
10786}
10787
10789{
10790 if (item)
10791 {
10792 if (health > 0)
10793 item.SetHealth("", "", health);
10794
10795 if (item.CanHaveTemperature())
10796 {
10798 if (item.CanFreeze())
10799 item.SetFrozen(false);
10800 }
10801
10802 if (item.HasEnergyManager())
10803 {
10804 if (quantity >= 0)
10805 {
10806 item.GetCompEM().SetEnergy0To1(quantity);
10807 }
10808 else
10809 {
10811 }
10812 }
10813 else if (item.IsMagazine())
10814 {
10815 Magazine mag = Magazine.Cast(item);
10816 if (quantity >= 0)
10817 {
10818 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10819 }
10820 else
10821 {
10823 }
10824
10825 }
10826 else
10827 {
10828 if (quantity >= 0)
10829 {
10830 item.SetQuantityNormalized(quantity, false);
10831 }
10832 else
10833 {
10835 }
10836
10837 }
10838 }
10839}
10840
10841#ifdef DEVELOPER
10843#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.