9057{
9059 {
9060 return true;
9061 }
9062};
9063
9065{
9066
9067};
9068
9069
9070
9072{
9076
9078
9081
9082
9083
9084
9085
9094
9100
9105
9110
9131 protected bool m_IsResultOfSplit
9132
9134
9139
9140
9141
9143
9147
9148
9149
9151
9154
9155
9156
9162
9163
9171
9174
9175
9177
9178
9180
9181
9186
9187
9192
9194
9195
9197
9198
9200 {
9205
9206 if (!
g_Game.IsDedicatedServer())
9207 {
9209 {
9211
9213 {
9215 }
9216 }
9217
9220 }
9221
9222 m_OldLocation = null;
9223
9225 {
9227 }
9228
9229 if (ConfigIsExisting("headSelectionsToHide"))
9230 {
9233 }
9234
9236 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9237 {
9239 }
9240
9242
9243 m_IsResultOfSplit = false;
9244
9246 }
9247
9249 {
9250 super.InitItemVariables();
9251
9257 m_Count = ConfigGetInt(
"count");
9258
9261
9266
9269
9274
9286
9290
9291
9294 if (ConfigIsExisting("canBeSplit"))
9295 {
9298 }
9299
9301 if (ConfigIsExisting("itemBehaviour"))
9303
9304
9307 RegisterNetSyncVariableInt("m_VarLiquidType");
9308 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9309
9310 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9311 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9312 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9313
9314 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9315 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9316 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9317 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9318
9319 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9320 RegisterNetSyncVariableBool("m_IsTakeable");
9321 RegisterNetSyncVariableBool("m_IsHologram");
9322
9325 {
9328 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9329 }
9330
9332
9334 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9336
9338 }
9339
9341 {
9343 }
9344
9346 {
9349 {
9354 }
9355 }
9356
9357 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9358 {
9360 {
9363 }
9364
9366 }
9367
9369 {
9375 }
9376
9378
9380 {
9382
9383 if (!action)
9384 {
9385 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9386 return;
9387 }
9388
9390 if (!ai)
9391 {
9393 return;
9394 }
9395
9397 if (!action_array)
9398 {
9399 action_array = new array<ActionBase_Basic>;
9401 }
9402 if (LogManager.IsActionLogEnable())
9403 {
9404 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9405 }
9406
9407 if (action_array.Find(action) != -1)
9408 {
9409 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9410 }
9411 else
9412 {
9413 action_array.Insert(action);
9414 }
9415 }
9416
9418 {
9419 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9420 ActionBase action = player.GetActionManager().GetAction(actionName);
9423
9424 if (action_array)
9425 {
9426 action_array.RemoveItem(action);
9427 }
9428 }
9429
9430
9431
9433 {
9434 ActionOverrideData overrideData = new ActionOverrideData();
9438
9440 if (!actionMap)
9441 {
9444 }
9445
9446 actionMap.Insert(this.
Type(), overrideData);
9447
9448 }
9449
9451
9453
9454
9456 {
9459
9462
9463 string config_to_search = "CfgVehicles";
9464 string muzzle_owner_config;
9465
9467 {
9468 if (IsInherited(Weapon))
9469 config_to_search = "CfgWeapons";
9470
9471 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9472
9473 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9474
9475 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9476
9477 if (config_OnFire_subclass_count > 0)
9478 {
9479 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9480
9481 for (int i = 0; i < config_OnFire_subclass_count; i++)
9482 {
9483 string particle_class = "";
9484 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9485 string config_OnFire_entry = config_OnFire_class + particle_class;
9486 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9487 WPOF_array.Insert(WPOF);
9488 }
9489
9490
9492 }
9493 }
9494
9496 {
9497 config_to_search = "CfgWeapons";
9498 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9499
9500 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9501
9502 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9503
9504 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9505 {
9506 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9507
9508 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9509 {
9510 string particle_class2 = "";
9511 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9512 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9513 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9514 WPOBE_array.Insert(WPOBE);
9515 }
9516
9517
9519 }
9520 }
9521 }
9522
9523
9525 {
9528
9530 {
9531 string config_to_search = "CfgVehicles";
9532
9533 if (IsInherited(Weapon))
9534 config_to_search = "CfgWeapons";
9535
9536 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9537 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9538
9539 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9540 {
9541
9543
9545 {
9547 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9549 return;
9550 }
9551
9554
9555
9556
9557 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9558 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9559
9560 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9561 {
9562 string particle_class = "";
9563 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9564 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9565 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9566
9567 if (entry_type == CT_CLASS)
9568 {
9569 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9570 WPOOH_array.Insert(WPOF);
9571 }
9572 }
9573
9574
9576 }
9577 }
9578 }
9579
9581 {
9583 }
9584
9586 {
9588 {
9590
9593
9596
9597 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9598 }
9599 }
9600
9602 {
9604 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9605
9607 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9608
9610 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9611
9613 {
9615 }
9616 }
9617
9619 {
9621 }
9622
9624 {
9627 else
9629
9631 {
9634 }
9635 else
9636 {
9639
9642 }
9643
9645 }
9646
9648 {
9650 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9651 }
9652
9654 {
9656 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9658 }
9659
9661 {
9663 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9664 }
9665
9667 {
9670
9671 OverheatingParticle OP = new OverheatingParticle();
9676
9678 }
9679
9681 {
9684
9685 return -1;
9686 }
9687
9689 {
9691 {
9694
9695 for (int i = count; i > 0; --i)
9696 {
9697 int id = i - 1;
9700
9703
9704 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9705 {
9706 if (p)
9707 {
9710 }
9711 }
9712 }
9713 }
9714 }
9715
9717 {
9719 {
9721 {
9722 int id = i - 1;
9724
9725 if (OP)
9726 {
9728
9729 if (p)
9730 {
9732 }
9733
9734 delete OP;
9735 }
9736 }
9737
9740 }
9741 }
9742
9745 {
9746 return 0.0;
9747 }
9748
9749
9751 {
9752 return 250;
9753 }
9754
9756 {
9757 return 0;
9758 }
9759
9762 {
9764 return true;
9765
9766 return false;
9767 }
9768
9771 {
9774
9776 {
9778 }
9779 else
9780 {
9781
9783 }
9784
9786 }
9787
9794 {
9795 return -1;
9796 }
9797
9798
9799
9800
9802 {
9804 {
9805 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9806 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9807
9808 if (r_index >= 0)
9809 {
9810 InventoryLocation r_il = new InventoryLocation;
9811 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9812
9813 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9816 {
9817 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9818 }
9820 {
9821 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9822 }
9823
9824 }
9825
9826 player.GetHumanInventory().ClearUserReservedLocation(this);
9827 }
9828
9831 }
9832
9833
9834
9835
9837 {
9838 return ItemBase.m_DebugActionsMask;
9839 }
9840
9842 {
9843 return ItemBase.m_DebugActionsMask & mask;
9844 }
9845
9847 {
9848 ItemBase.m_DebugActionsMask = mask;
9849 }
9850
9852 {
9853 ItemBase.m_DebugActionsMask |= mask;
9854 }
9855
9857 {
9858 ItemBase.m_DebugActionsMask &= ~mask;
9859 }
9860
9862 {
9864 {
9866 }
9867 else
9868 {
9870 }
9871 }
9872
9873
9875 {
9876 if (GetEconomyProfile())
9877 {
9878 float q_max = GetEconomyProfile().GetQuantityMax();
9879 if (q_max > 0)
9880 {
9881 float q_min = GetEconomyProfile().GetQuantityMin();
9882 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9883
9885 {
9886 ComponentEnergyManager comp = GetCompEM();
9888 {
9890 }
9891 }
9893 {
9895
9896 }
9897
9898 }
9899 }
9900 }
9901
9904 {
9905 EntityAI parent = GetHierarchyParent();
9906
9907 if (parent)
9908 {
9909 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9910 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9911 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9912 }
9913 }
9914
9917 {
9918 EntityAI parent = GetHierarchyParent();
9919
9920 if (parent)
9921 {
9922 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9923 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9924 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9925 }
9926 }
9927
9929 {
9930
9931
9932
9933
9935
9937 {
9938 if (ScriptInputUserData.CanStoreInputUserData())
9939 {
9940 ScriptInputUserData ctx = new ScriptInputUserData;
9946 ctx.
Write(use_stack_max);
9949
9951 {
9952 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9953 }
9954 }
9955 }
9956 else if (!
g_Game.IsMultiplayer())
9957 {
9959 }
9960 }
9961
9963 {
9965 }
9966
9968 {
9970 }
9971
9973 {
9975 }
9976
9978 {
9979
9980 return false;
9981 }
9982
9984 {
9985 return false;
9986 }
9987
9991 {
9992 return false;
9993 }
9994
9996 {
9997 return "";
9998 }
9999
10001
10003 {
10004 return false;
10005 }
10006
10008 {
10009 return true;
10010 }
10011
10012
10013
10015 {
10016 return true;
10017 }
10018
10020 {
10021 return true;
10022 }
10023
10025 {
10026 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10028 }
10029
10031 {
10033 }
10034
10036 {
10038 if (!is_being_placed)
10040 SetSynchDirty();
10041 }
10042
10043
10045
10047 {
10049 }
10050
10052 {
10054 }
10055
10057 {
10058 return 1;
10059 }
10060
10062 {
10063 return false;
10064 }
10065
10067 {
10069 SetSynchDirty();
10070 }
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10107 {
10108 super.OnMovedInsideCargo(container);
10109
10110 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10111 }
10112
10113 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10114 {
10115 super.EEItemLocationChanged(oldLoc, newLoc);
10116
10117 PlayerBase newPlayer = null;
10118 PlayerBase oldPlayer = null;
10119
10120 if (newLoc.GetParent())
10121 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10122
10123 if (oldLoc.GetParent())
10124 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10125
10127 {
10128 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10129
10130 if (rIndex >= 0)
10131 {
10132 InventoryLocation rIl = new InventoryLocation;
10133 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10134
10135 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10138 {
10139 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10140 }
10142 {
10144 }
10145
10146 }
10147 }
10148
10150 {
10151 if (newPlayer)
10152 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10153
10154 if (newPlayer == oldPlayer)
10155 {
10156 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10157 {
10159 {
10160 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10161 {
10162 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10163 }
10164 }
10165 else
10166 {
10167 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10168 }
10169 }
10170
10171 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10172 {
10173 int type = oldLoc.GetType();
10175 {
10176 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10177 }
10179 {
10180 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10181 }
10182 }
10183 if (!m_OldLocation)
10184 {
10185 m_OldLocation = new InventoryLocation;
10186 }
10187 m_OldLocation.Copy(oldLoc);
10188 }
10189 else
10190 {
10191 if (m_OldLocation)
10192 {
10193 m_OldLocation.Reset();
10194 }
10195 }
10196
10197 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10198 }
10199 else
10200 {
10201 if (newPlayer)
10202 {
10203 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10204 if (resIndex >= 0)
10205 {
10206 InventoryLocation il = new InventoryLocation;
10207 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10209 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10212 {
10213 il.
GetParent().GetOnReleaseLock().Invoke(it);
10214 }
10216 {
10218 }
10219
10220 }
10221 }
10223 {
10224
10226 }
10227
10228 if (m_OldLocation)
10229 {
10230 m_OldLocation.Reset();
10231 }
10232 }
10233
10235 {
10236 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10237 }
10238
10240 {
10241 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10242 }
10243 }
10244
10245 override void EOnContact(IEntity other, Contact extra)
10246 {
10248 {
10249 int liquidType = -1;
10251 if (impactSpeed > 0.0)
10252 {
10254 #ifndef SERVER
10256 #else
10258 SetSynchDirty();
10259 #endif
10261 }
10262 }
10263
10264 #ifdef SERVER
10265 if (GetCompEM() && GetCompEM().IsPlugged())
10266 {
10267 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10268 GetCompEM().UnplugThis();
10269 }
10270 #endif
10271 }
10272
10274
10276 {
10278 }
10279
10281 {
10282
10283 }
10284
10286 {
10287 super.OnItemLocationChanged(old_owner, new_owner);
10288
10289 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10290 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10291
10292 if (!relatedPlayer && playerNew)
10293 relatedPlayer = playerNew;
10294
10295 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10296 {
10298 if (actionMgr)
10299 {
10300 ActionBase currentAction = actionMgr.GetRunningAction();
10301 if (currentAction)
10303 }
10304 }
10305
10306 Man ownerPlayerOld = null;
10307 Man ownerPlayerNew = null;
10308
10309 if (old_owner)
10310 {
10311 if (old_owner.
IsMan())
10312 {
10313 ownerPlayerOld = Man.Cast(old_owner);
10314 }
10315 else
10316 {
10317 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10318 }
10319 }
10320 else
10321 {
10323 {
10325
10326 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10327 {
10328 GetCompEM().UnplugThis();
10329 }
10330 }
10331 }
10332
10333 if (new_owner)
10334 {
10335 if (new_owner.
IsMan())
10336 {
10337 ownerPlayerNew = Man.Cast(new_owner);
10338 }
10339 else
10340 {
10341 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10342 }
10343 }
10344
10345 if (ownerPlayerOld != ownerPlayerNew)
10346 {
10347 if (ownerPlayerOld)
10348 {
10349 array<EntityAI> subItemsExit = new array<EntityAI>;
10351 for (int i = 0; i < subItemsExit.Count(); i++)
10352 {
10355 }
10356 }
10357
10358 if (ownerPlayerNew)
10359 {
10360 array<EntityAI> subItemsEnter = new array<EntityAI>;
10362 for (int j = 0; j < subItemsEnter.Count(); j++)
10363 {
10366 }
10367 }
10368 }
10369 else if (ownerPlayerNew != null)
10370 {
10371 PlayerBase nplayer;
10372 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10373 {
10374 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10376 for (int k = 0; k < subItemsUpdate.Count(); k++)
10377 {
10379 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10380 }
10381 }
10382 }
10383
10384 if (old_owner)
10385 old_owner.OnChildItemRemoved(this);
10386 if (new_owner)
10387 new_owner.OnChildItemReceived(this);
10388 }
10389
10390
10392 {
10393 super.EEDelete(parent);
10394 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10395 if (player)
10396 {
10398
10399 if (player.IsAlive())
10400 {
10401 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10402 if (r_index >= 0)
10403 {
10404 InventoryLocation r_il = new InventoryLocation;
10405 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10406
10407 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10410 {
10411 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10412 }
10414 {
10415 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10416 }
10417
10418 }
10419
10420 player.RemoveQuickBarEntityShortcut(this);
10421 }
10422 }
10423 }
10424
10426 {
10427 super.EEKilled(killer);
10428
10431 {
10432 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10433 {
10434 if (IsMagazine())
10435 {
10436 if (Magazine.Cast(this).GetAmmoCount() > 0)
10437 {
10439 }
10440 }
10441 else
10442 {
10444 }
10445 }
10446 }
10447 }
10448
10450 {
10451 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10452
10453 super.OnWasAttached(parent, slot_id);
10454
10457
10460 }
10461
10463 {
10464 super.OnWasDetached(parent, slot_id);
10465
10468
10471 }
10472
10474 {
10475 int idx;
10478
10479 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10480 if (inventory_slots.Count() < 1)
10481 {
10482 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10483 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10484 }
10485 else
10486 {
10487 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10488 }
10489
10490 idx = inventory_slots.Find(slot);
10491 if (idx < 0)
10492 return "";
10493
10494 return attach_types.Get(idx);
10495 }
10496
10498 {
10499 int idx = -1;
10500 string slot;
10501
10504
10505 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10506 if (inventory_slots.Count() < 1)
10507 {
10508 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10509 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10510 }
10511 else
10512 {
10513 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10514 if (detach_types.Count() < 1)
10515 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10516 }
10517
10518 for (int i = 0; i < inventory_slots.Count(); i++)
10519 {
10520 slot = inventory_slots.Get(i);
10521 }
10522
10523 if (slot != "")
10524 {
10525 if (detach_types.Count() == 1)
10526 idx = 0;
10527 else
10528 idx = inventory_slots.Find(slot);
10529 }
10530 if (idx < 0)
10531 return "";
10532
10533 return detach_types.Get(idx);
10534 }
10535
10537 {
10538
10540
10541
10542 float min_time = 1;
10543 float max_time = 3;
10544 float delay = Math.RandomFloat(min_time, max_time);
10545
10546 explode_timer.Run(delay, this, "DoAmmoExplosion");
10547 }
10548
10550 {
10551 Magazine magazine = Magazine.Cast(this);
10552 int pop_sounds_count = 6;
10553 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10554
10555
10556 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10557 string sound_name = pop_sounds[ sound_idx ];
10558 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10559
10560
10561 magazine.ServerAddAmmoCount(-1);
10562
10563
10564 float min_temp_to_explode = 100;
10565
10566 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10567 {
10569 }
10570 }
10571
10572
10573 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10574 {
10575 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10576
10577 const int CHANCE_DAMAGE_CARGO = 4;
10578 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10579 const int CHANCE_DAMAGE_NOTHING = 2;
10580
10582 {
10583 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10584 int chances;
10585 int rnd;
10586
10587 if (GetInventory().GetCargo())
10588 {
10589 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10590 rnd = Math.RandomInt(0,chances);
10591
10592 if (rnd < CHANCE_DAMAGE_CARGO)
10593 {
10595 }
10596 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10597 {
10599 }
10600 }
10601 else
10602 {
10603 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10604 rnd = Math.RandomInt(0,chances);
10605
10606 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10607 {
10609 }
10610 }
10611 }
10612 }
10613
10615 {
10616 CargoBase cargo = GetInventory().GetCargo();
10617 if (cargo)
10618 {
10620 if (item_count > 0)
10621 {
10622 int random_pick = Math.RandomInt(0, item_count);
10624 if (!item.IsExplosive())
10625 {
10626 item.AddHealth("","",damage);
10627 return true;
10628 }
10629 }
10630 }
10631 return false;
10632 }
10633
10635 {
10636 GameInventory inventory = GetInventory();
10638 if (attachment_count > 0)
10639 {
10640 int random_pick = Math.RandomInt(0, attachment_count);
10642 if (!attachment.IsExplosive())
10643 {
10644 attachment.AddHealth("","",damage);
10645 return true;
10646 }
10647 }
10648 return false;
10649 }
10650
10652 {
10654 }
10655
10657 {
10659 return GetInventory().CanRemoveEntity();
10660
10661 return false;
10662 }
10663
10665 {
10666
10668 return false;
10669
10670
10672 return false;
10673
10674
10675
10677 if (delta == 0)
10678 return false;
10679
10680
10681 return true;
10682 }
10683
10685 {
10687 {
10688 if (ScriptInputUserData.CanStoreInputUserData())
10689 {
10690 ScriptInputUserData ctx = new ScriptInputUserData;
10695 ctx.
Write(destination_entity);
10697 ctx.
Write(slot_id);
10699 }
10700 }
10701 else if (!
g_Game.IsMultiplayer())
10702 {
10704 }
10705 }
10706
10708 {
10709 float split_quantity_new;
10713 InventoryLocation loc = new InventoryLocation;
10714
10715 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10716 {
10718 split_quantity_new = stack_max;
10719 else
10721
10723 {
10724 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10725 if (new_item)
10726 {
10727 new_item.SetResultOfSplit(true);
10728 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10730 new_item.
SetQuantity(split_quantity_new,
false,
true);
10731 }
10732 }
10733 }
10734 else if (destination_entity && slot_id == -1)
10735 {
10736 if (quantity > stack_max)
10737 split_quantity_new = stack_max;
10738 else
10739 split_quantity_new = quantity;
10740
10742 {
10743 GameInventory destinationInventory = destination_entity.GetInventory();
10745 {
10748 }
10749
10750 if (new_item)
10751 {
10752 new_item.SetResultOfSplit(true);
10753 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10755 new_item.
SetQuantity(split_quantity_new,
false,
true);
10756 }
10757 }
10758 }
10759 else
10760 {
10761 if (stack_max != 0)
10762 {
10764 {
10766 }
10767
10768 if (split_quantity_new == 0)
10769 {
10770 if (!
g_Game.IsMultiplayer())
10771 player.PhysicalPredictiveDropItem(this);
10772 else
10773 player.ServerDropEntity(this);
10774 return;
10775 }
10776
10778 {
10780
10781 if (new_item)
10782 {
10783 new_item.SetResultOfSplit(true);
10784 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10787 new_item.PlaceOnSurface();
10788 }
10789 }
10790 }
10791 }
10792 }
10793
10795 {
10796 float split_quantity_new;
10800 InventoryLocation loc = new InventoryLocation;
10801
10802 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10803 {
10805 split_quantity_new = stack_max;
10806 else
10808
10810 {
10811 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10812 if (new_item)
10813 {
10814 new_item.SetResultOfSplit(true);
10815 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10817 new_item.
SetQuantity(split_quantity_new,
false,
true);
10818 }
10819 }
10820 }
10821 else if (destination_entity && slot_id == -1)
10822 {
10823 if (quantity > stack_max)
10824 split_quantity_new = stack_max;
10825 else
10826 split_quantity_new = quantity;
10827
10829 {
10830 GameInventory destinationInventory = destination_entity.GetInventory();
10832 {
10835 }
10836
10837 if (new_item)
10838 {
10839 new_item.SetResultOfSplit(true);
10840 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10842 new_item.
SetQuantity(split_quantity_new,
false,
true);
10843 }
10844 }
10845 }
10846 else
10847 {
10848 if (stack_max != 0)
10849 {
10851 {
10853 }
10854
10856 {
10858
10859 if (new_item)
10860 {
10861 new_item.SetResultOfSplit(true);
10862 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10865 new_item.PlaceOnSurface();
10866 }
10867 }
10868 }
10869 }
10870 }
10871
10873 {
10875 {
10876 if (ScriptInputUserData.CanStoreInputUserData())
10877 {
10878 ScriptInputUserData ctx = new ScriptInputUserData;
10883 dst.WriteToContext(ctx);
10885 }
10886 }
10887 else if (!
g_Game.IsMultiplayer())
10888 {
10890 }
10891 }
10892
10894 {
10896 {
10897 if (ScriptInputUserData.CanStoreInputUserData())
10898 {
10899 ScriptInputUserData ctx = new ScriptInputUserData;
10904 ctx.
Write(destination_entity);
10910 }
10911 }
10912 else if (!
g_Game.IsMultiplayer())
10913 {
10915 }
10916 }
10917
10919 {
10921 }
10922
10924 {
10926 float split_quantity_new;
10928 if (dst.IsValid())
10929 {
10930 int slot_id = dst.GetSlot();
10932
10933 if (quantity > stack_max)
10934 split_quantity_new = stack_max;
10935 else
10936 split_quantity_new = quantity;
10937
10939 {
10941
10942 if (new_item)
10943 {
10944 new_item.SetResultOfSplit(true);
10945 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10947 new_item.
SetQuantity(split_quantity_new,
false,
true);
10948 }
10949
10950 return new_item;
10951 }
10952 }
10953
10954 return null;
10955 }
10956
10958 {
10960 float split_quantity_new;
10962 if (destination_entity)
10963 {
10965 if (quantity > stackable)
10966 split_quantity_new = stackable;
10967 else
10968 split_quantity_new = quantity;
10969
10971 {
10972 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10973 if (new_item)
10974 {
10975 new_item.SetResultOfSplit(true);
10976 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10978 new_item.
SetQuantity(split_quantity_new,
false,
true);
10979 }
10980 }
10981 }
10982 }
10983
10985 {
10987 {
10988 if (ScriptInputUserData.CanStoreInputUserData())
10989 {
10990 ScriptInputUserData ctx = new ScriptInputUserData;
10995 ItemBase destination_entity =
this;
10996 ctx.
Write(destination_entity);
11000 }
11001 }
11002 else if (!
g_Game.IsMultiplayer())
11003 {
11005 }
11006 }
11007
11009 {
11011 float split_quantity_new;
11013 if (player)
11014 {
11016 if (quantity > stackable)
11017 split_quantity_new = stackable;
11018 else
11019 split_quantity_new = quantity;
11020
11022 {
11023 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11024 new_item =
ItemBase.Cast(in_hands);
11025 if (new_item)
11026 {
11027 new_item.SetResultOfSplit(true);
11028 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11030 new_item.SetQuantity(split_quantity_new, false, true);
11031 }
11032 }
11033 }
11034 }
11035
11037 {
11039 float split_quantity_new = Math.Floor(quantity * 0.5);
11040
11042 return;
11043
11045
11046 if (new_item)
11047 {
11048 if (new_item.GetQuantityMax() < split_quantity_new)
11049 {
11050 split_quantity_new = new_item.GetQuantityMax();
11051 }
11052
11053 new_item.SetResultOfSplit(true);
11054 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11055
11057 {
11060 }
11061 else
11062 {
11064 new_item.
SetQuantity(split_quantity_new,
false,
true);
11065 }
11066 }
11067 }
11068
11070 {
11072 float split_quantity_new = Math.Floor(quantity / 2);
11073
11075 return;
11076
11077 InventoryLocation invloc = new InventoryLocation;
11079
11081 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11082
11083 if (new_item)
11084 {
11085 if (new_item.GetQuantityMax() < split_quantity_new)
11086 {
11087 split_quantity_new = new_item.GetQuantityMax();
11088 }
11090 {
11093 }
11094 else if (split_quantity_new > 1)
11095 {
11097 new_item.
SetQuantity(split_quantity_new,
false,
true);
11098 }
11099 }
11100 }
11101
11104 {
11105 SetWeightDirty();
11107
11108 if (parent)
11109 parent.OnAttachmentQuantityChangedEx(this, delta);
11110
11112 {
11114 {
11116 }
11118 {
11119 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11121 }
11122 }
11123 }
11124
11127 {
11128
11129 }
11130
11133 {
11135 }
11136
11138 {
11139 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11140
11142 {
11143 if (newLevel == GameConstants.STATE_RUINED)
11144 {
11146 EntityAI parent = GetHierarchyParent();
11147 if (parent && parent.IsFireplace())
11148 {
11149 CargoBase cargo = GetInventory().GetCargo();
11150 if (cargo)
11151 {
11153 {
11155 }
11156 }
11157 }
11158 }
11159
11161 {
11162
11164 return;
11165 }
11166
11167 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11168 {
11170 }
11171 }
11172 }
11173
11174
11176 {
11177 super.OnRightClick();
11178
11180 {
11182 {
11183 if (ScriptInputUserData.CanStoreInputUserData())
11184 {
11185 EntityAI root = GetHierarchyRoot();
11186 Man playerOwner = GetHierarchyRootPlayer();
11187 InventoryLocation dst = new InventoryLocation;
11188
11189
11190 if (!playerOwner && root && root == this)
11191 {
11193 }
11194 else
11195 {
11196
11197 GetInventory().GetCurrentInventoryLocation(dst);
11199 {
11200 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11202 {
11204 }
11205 else
11206 {
11208
11209
11210 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11211 {
11213 }
11214 else
11215 {
11216 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11217 }
11218 }
11219 }
11220 }
11221
11222 ScriptInputUserData ctx = new ScriptInputUserData;
11230 }
11231 }
11232 else if (!
g_Game.IsMultiplayer())
11233 {
11235 }
11236 }
11237 }
11238
11240 {
11241 if (root)
11242 {
11243 vector m4[4];
11244 root.GetTransform(m4);
11245 dst.SetGround(this, m4);
11246 }
11247 else
11248 {
11249 GetInventory().GetCurrentInventoryLocation(dst);
11250 }
11251 }
11252
11253 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11254 {
11255
11256 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11257 return false;
11258
11259 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11260 return false;
11261
11262
11264 return false;
11265
11266
11267 Magazine mag = Magazine.Cast(this);
11268 if (mag)
11269 {
11270 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11271 return false;
11272
11273 if (stack_max_limit)
11274 {
11275 Magazine other_mag = Magazine.Cast(other_item);
11276 if (other_item)
11277 {
11278 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11279 return false;
11280 }
11281
11282 }
11283 }
11284 else
11285 {
11286
11288 return false;
11289
11291 return false;
11292 }
11293
11294 PlayerBase player = null;
11295 if (CastTo(player, GetHierarchyRootPlayer()))
11296 {
11297 if (player.GetInventory().HasAttachment(this))
11298 return false;
11299
11300 if (player.IsItemsToDelete())
11301 return false;
11302 }
11303
11304 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11305 return false;
11306
11307 int slotID;
11309 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11310 return false;
11311
11312 return true;
11313 }
11314
11316 {
11318 }
11319
11321 {
11322 return m_IsResultOfSplit;
11323 }
11324
11326 {
11327 m_IsResultOfSplit = value;
11328 }
11329
11331 {
11333 }
11334
11336 {
11337 float other_item_quantity = other_item.GetQuantity();
11338 float this_free_space;
11339
11341
11343
11344 if (other_item_quantity > this_free_space)
11345 {
11346 return this_free_space;
11347 }
11348 else
11349 {
11350 return other_item_quantity;
11351 }
11352 }
11353
11355 {
11357 }
11358
11360 {
11362 return;
11363
11364 if (!IsMagazine() && other_item)
11365 {
11367 if (quantity_used != 0)
11368 {
11369 float hp1 = GetHealth01("","");
11370 float hp2 = other_item.GetHealth01("","");
11371 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11372 hpResult = hpResult / (
GetQuantity() + quantity_used);
11373
11374 hpResult *= GetMaxHealth();
11375 Math.Round(hpResult);
11376 SetHealth("", "Health", hpResult);
11377
11379 other_item.AddQuantity(-quantity_used);
11380 }
11381 }
11383 }
11384
11386 {
11387 #ifdef SERVER
11388 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11389 GetHierarchyParent().IncreaseLifetimeUp();
11390 #endif
11391 };
11392
11394 {
11395 PlayerBase p = PlayerBase.Cast(player);
11396
11397 array<int> recipesIds = p.m_Recipes;
11398 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11399 if (moduleRecipesManager)
11400 {
11401 EntityAI itemInHands = player.GetEntityInHands();
11402 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11403 }
11404
11405 for (int i = 0;i < recipesIds.Count(); i++)
11406 {
11407 int key = recipesIds.Get(i);
11408 string recipeName = moduleRecipesManager.GetRecipeName(key);
11410 }
11411 }
11412
11413
11414 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11415 {
11416 super.GetDebugActions(outputList);
11417
11418
11424
11425
11430
11435
11436
11440
11441
11443 {
11447 }
11448
11451
11452
11456
11458
11459 InventoryLocation loc = new InventoryLocation();
11460 GetInventory().GetCurrentInventoryLocation(loc);
11462 {
11463 if (Gizmo_IsSupported())
11466 }
11467
11469 }
11470
11471
11472
11473
11475 {
11476 super.OnAction(action_id, player, ctx);
11477
11479 {
11480 switch (action_id)
11481 {
11485 return true;
11489 return true;
11490 }
11491 }
11492
11494 {
11495 switch (action_id)
11496 {
11498 Delete();
11499 return true;
11500 }
11501 }
11502
11503 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11504 {
11505 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11506 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11507 PlayerBase p = PlayerBase.Cast(player);
11508 if (
EActions.RECIPES_RANGE_START < 1000)
11509 {
11510 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11511 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11512 }
11513 }
11514 #ifndef SERVER
11515 else if (action_id ==
EActions.WATCH_PLAYER)
11516 {
11517 PluginDeveloper.SetDeveloperItemClientEx(player);
11518 }
11519 #endif
11521 {
11522 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11523 {
11524 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11525 OnDebugButtonPressServer(id + 1);
11526 }
11527
11528 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11529 {
11530 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11532 }
11533
11534 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11535 {
11536 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11538 }
11539
11540 else if (action_id ==
EActions.ADD_QUANTITY)
11541 {
11542 if (IsMagazine())
11543 {
11544 Magazine mag = Magazine.Cast(this);
11545 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11546 }
11547 else
11548 {
11550 }
11551
11552 if (m_EM)
11553 {
11554 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11555 }
11556
11557 }
11558
11559 else if (action_id ==
EActions.REMOVE_QUANTITY)
11560 {
11561 if (IsMagazine())
11562 {
11563 Magazine mag2 = Magazine.Cast(this);
11564 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11565 }
11566 else
11567 {
11569 }
11570 if (m_EM)
11571 {
11572 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11573 }
11574
11575 }
11576
11577 else if (action_id ==
EActions.SET_QUANTITY_0)
11578 {
11580
11581 if (m_EM)
11582 {
11583 m_EM.SetEnergy(0);
11584 }
11585 }
11586
11587 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11588 {
11590
11591 if (m_EM)
11592 {
11593 m_EM.SetEnergy(m_EM.GetEnergyMax());
11594 }
11595 }
11596
11597 else if (action_id ==
EActions.ADD_HEALTH)
11598 {
11599 AddHealth("","",GetMaxHealth("","Health")/5);
11600 }
11601 else if (action_id ==
EActions.REMOVE_HEALTH)
11602 {
11603 AddHealth("","",-GetMaxHealth("","Health")/5);
11604 }
11605 else if (action_id ==
EActions.DESTROY_HEALTH)
11606 {
11607 SetHealth01("","",0);
11608 }
11609 else if (action_id ==
EActions.WATCH_ITEM)
11610 {
11612 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11613 #ifdef DEVELOPER
11614 SetDebugDeveloper_item(this);
11615 #endif
11616 }
11617
11618 else if (action_id ==
EActions.ADD_TEMPERATURE)
11619 {
11620 AddTemperature(20);
11621
11622 }
11623
11624 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11625 {
11626 AddTemperature(-20);
11627
11628 }
11629
11630 else if (action_id ==
EActions.FLIP_FROZEN)
11631 {
11632 SetFrozen(!GetIsFrozen());
11633
11634 }
11635
11636 else if (action_id ==
EActions.ADD_WETNESS)
11637 {
11639
11640 }
11641
11642 else if (action_id ==
EActions.REMOVE_WETNESS)
11643 {
11645
11646 }
11647
11648 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11649 {
11652
11653
11654 }
11655
11656 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11657 {
11660 }
11661
11662 else if (action_id ==
EActions.MAKE_SPECIAL)
11663 {
11664 auto debugParams = DebugSpawnParams.WithPlayer(player);
11665 OnDebugSpawnEx(debugParams);
11666 }
11667
11668 }
11669
11670
11671 return false;
11672 }
11673
11674
11675
11676
11680
11683
11684
11685
11687 {
11688 return false;
11689 }
11690
11691
11693 {
11694 return true;
11695 }
11696
11697
11699 {
11700 return true;
11701 }
11702
11703
11704
11706 {
11707 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11708 return g_Game.ConfigIsExisting(config_path);
11709 }
11710
11713 {
11714 return null;
11715 }
11716
11718 {
11719 return false;
11720 }
11721
11723 {
11724 return false;
11725 }
11726
11730
11731
11733 {
11734 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11735 return module_repairing.CanRepair(this, item_repair_kit);
11736 }
11737
11738
11739 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11740 {
11741 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11742 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11743 }
11744
11745
11747 {
11748
11749
11750
11751
11752
11753
11754
11755
11756 return 1;
11757 }
11758
11759
11760
11762 {
11764 }
11765
11766
11767
11769 {
11771 }
11772
11773
11782 {
11783 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11784
11785 if (player)
11786 {
11787 player.MessageStatus(text);
11788 }
11789 }
11790
11791
11800 {
11801 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11802
11803 if (player)
11804 {
11805 player.MessageAction(text);
11806 }
11807 }
11808
11809
11818 {
11819 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11820
11821 if (player)
11822 {
11823 player.MessageFriendly(text);
11824 }
11825 }
11826
11827
11836 {
11837 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11838
11839 if (player)
11840 {
11841 player.MessageImportant(text);
11842 }
11843 }
11844
11846 {
11847 return true;
11848 }
11849
11850
11851 override bool KindOf(
string tag)
11852 {
11853 bool found = false;
11854 string item_name = this.
GetType();
11856 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11857
11858 int array_size = item_tag_array.Count();
11859 for (int i = 0; i < array_size; i++)
11860 {
11861 if (item_tag_array.Get(i) == tag)
11862 {
11863 found = true;
11864 break;
11865 }
11866 }
11867 return found;
11868 }
11869
11870
11872 {
11873
11874 super.OnRPC(sender, rpc_type,ctx);
11875
11876
11877 switch (rpc_type)
11878 {
11879 #ifndef SERVER
11880 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11881 Param2<bool, string> p = new Param2<bool, string>(false, "");
11882
11884 return;
11885
11886 bool play = p.param1;
11887 string soundSet = p.param2;
11888
11889 if (play)
11890 {
11892 {
11894 {
11896 }
11897 }
11898 else
11899 {
11901 }
11902 }
11903 else
11904 {
11906 }
11907
11908 break;
11909 #endif
11910
11911 }
11912
11914 {
11916 }
11917 }
11918
11919
11920
11921
11923 {
11924 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11925 return plugin.GetID(
name);
11926 }
11927
11929 {
11930 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11931 return plugin.GetName(id);
11932 }
11933
11936 {
11937
11938
11939 int varFlags;
11940 if (!ctx.
Read(varFlags))
11941 return;
11942
11943 if (varFlags & ItemVariableFlags.FLOAT)
11944 {
11946 }
11947 }
11948
11950 {
11951
11952 super.SerializeNumericalVars(floats_out);
11953
11954
11955
11957 {
11959 }
11960
11962 {
11964 }
11965
11967 {
11969 }
11970
11972 {
11977 }
11978
11980 {
11982 }
11983 }
11984
11986 {
11987
11988 super.DeSerializeNumericalVars(floats);
11989
11990
11991 int index = 0;
11992 int mask = Math.Round(floats.Get(index));
11993
11994 index++;
11995
11997 {
11999 {
12001 }
12002 else
12003 {
12004 float quantity = floats.Get(index);
12005 SetQuantity(quantity,
true,
false,
false,
false);
12006 }
12007 index++;
12008 }
12009
12011 {
12012 float wet = floats.Get(index);
12014 index++;
12015 }
12016
12018 {
12019 int liquidtype = Math.Round(floats.Get(index));
12021 index++;
12022 }
12023
12025 {
12027 index++;
12029 index++;
12031 index++;
12033 index++;
12034 }
12035
12037 {
12038 int cleanness = Math.Round(floats.Get(index));
12040 index++;
12041 }
12042 }
12043
12045 {
12046 super.WriteVarsToCTX(ctx);
12047
12048
12050 {
12052 }
12053
12055 {
12057 }
12058
12060 {
12062 }
12063
12065 {
12066 int r,g,b,a;
12072 }
12073
12075 {
12077 }
12078 }
12079
12081 {
12082 if (!super.ReadVarsFromCTX(ctx,version))
12083 return false;
12084
12085 int intValue;
12086 float value;
12087
12088 if (version < 140)
12089 {
12090 if (!ctx.
Read(intValue))
12091 return false;
12092
12093 m_VariablesMask = intValue;
12094 }
12095
12097 {
12098 if (!ctx.
Read(value))
12099 return false;
12100
12102 {
12104 }
12105 else
12106 {
12108 }
12109 }
12110
12111 if (version < 140)
12112 {
12114 {
12115 if (!ctx.
Read(value))
12116 return false;
12117 SetTemperatureDirect(value);
12118 }
12119 }
12120
12122 {
12123 if (!ctx.
Read(value))
12124 return false;
12126 }
12127
12129 {
12130 if (!ctx.
Read(intValue))
12131 return false;
12133 }
12134
12136 {
12137 int r,g,b,a;
12139 return false;
12141 return false;
12143 return false;
12145 return false;
12146
12148 }
12149
12151 {
12152 if (!ctx.
Read(intValue))
12153 return false;
12155 }
12156
12157 if (version >= 138 && version < 140)
12158 {
12160 {
12161 if (!ctx.
Read(intValue))
12162 return false;
12163 SetFrozen(intValue);
12164 }
12165 }
12166
12167 return true;
12168 }
12169
12170
12172 {
12175 {
12177 }
12178
12179 if (!super.OnStoreLoad(ctx, version))
12180 {
12182 return false;
12183 }
12184
12185 if (version >= 114)
12186 {
12187 bool hasQuickBarIndexSaved;
12188
12189 if (!ctx.
Read(hasQuickBarIndexSaved))
12190 {
12192 return false;
12193 }
12194
12195 if (hasQuickBarIndexSaved)
12196 {
12197 int itmQBIndex;
12198
12199
12200 if (!ctx.
Read(itmQBIndex))
12201 {
12203 return false;
12204 }
12205
12206 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12207 if (itmQBIndex != -1 && parentPlayer)
12208 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12209 }
12210 }
12211 else
12212 {
12213
12214 PlayerBase player;
12215 int itemQBIndex;
12216 if (version ==
int.
MAX)
12217 {
12218 if (!ctx.
Read(itemQBIndex))
12219 {
12221 return false;
12222 }
12223 }
12224 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12225 {
12226
12227 if (!ctx.
Read(itemQBIndex))
12228 {
12230 return false;
12231 }
12232 if (itemQBIndex != -1 && player)
12233 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12234 }
12235 }
12236
12237 if (version < 140)
12238 {
12239
12240 if (!LoadVariables(ctx, version))
12241 {
12243 return false;
12244 }
12245 }
12246
12247
12249 {
12251 return false;
12252 }
12253 if (version >= 132)
12254 {
12256 if (raib)
12257 {
12259 {
12261 return false;
12262 }
12263 }
12264 }
12265
12267 return true;
12268 }
12269
12270
12271
12273 {
12274 super.OnStoreSave(ctx);
12275
12276 PlayerBase player;
12277 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12278 {
12280
12281 int itemQBIndex = -1;
12282 itemQBIndex = player.FindQuickBarEntityIndex(this);
12283 ctx.
Write(itemQBIndex);
12284 }
12285 else
12286 {
12288 }
12289
12291
12293 if (raib)
12294 {
12296 }
12297 }
12298
12299
12301 {
12302 super.AfterStoreLoad();
12303
12305 {
12307 }
12308
12310 {
12313 }
12314 }
12315
12317 {
12318 super.EEOnAfterLoad();
12319
12321 {
12323 }
12324
12327 }
12328
12330 {
12331 return false;
12332 }
12333
12334
12335
12337 {
12339 {
12340 #ifdef PLATFORM_CONSOLE
12341
12343 {
12345 if (menu)
12346 {
12348 }
12349 }
12350 #endif
12351 }
12352
12354 {
12357 }
12358
12360 {
12361 SetWeightDirty();
12363 }
12365 {
12368 }
12369
12371 {
12374
12377 }
12379 {
12383 }
12384
12385 super.OnVariablesSynchronized();
12386 }
12387
12388
12389
12391 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12392 {
12393 if (!IsServerCheck(allow_client))
12394 return false;
12395
12397 return false;
12398
12401
12402 if (value <= (min + 0.001))
12403 value = min;
12404
12405 if (value == min)
12406 {
12407 if (destroy_config)
12408 {
12409 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12410 if (dstr)
12411 {
12413 this.Delete();
12414 return true;
12415 }
12416 }
12417 else if (destroy_forced)
12418 {
12420 this.Delete();
12421 return true;
12422 }
12423
12425 }
12426
12429
12431 {
12432 EntityAI parent = GetHierarchyRoot();
12433 InventoryLocation iLoc = new InventoryLocation();
12434 GetInventory().GetCurrentInventoryLocation(iLoc);
12436 {
12437 int iLocSlot = iLoc.
GetSlot();
12439 {
12441 }
12443 {
12445 }
12446 }
12447 }
12448
12450 {
12452
12453 if (delta)
12455 }
12456
12458
12459 return false;
12460 }
12461
12462
12464 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12465 {
12467 }
12468
12470 {
12473 }
12474
12476 {
12479 }
12480
12482 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12483 {
12484 float value_clamped = Math.Clamp(value, 0, 1);
12486 SetQuantity(result, destroy_config, destroy_forced);
12487 }
12488
12489
12492 {
12494 }
12495
12497 {
12499 }
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12511 {
12512 int slot = -1;
12513 GameInventory inventory = GetInventory();
12514 if (inventory)
12515 {
12516 InventoryLocation il = new InventoryLocation;
12519 }
12520
12522 }
12523
12525 {
12526 float quantity_max = 0;
12527
12529 {
12530 if (attSlotID != -1)
12531 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12532
12533 if (quantity_max <= 0)
12535 }
12536
12537 if (quantity_max <= 0)
12539
12540 return quantity_max;
12541 }
12542
12544 {
12546 }
12547
12549 {
12551 }
12552
12553
12555 {
12557 }
12558
12560 {
12562 }
12563
12565 {
12567 }
12568
12569
12571 {
12572
12573 float weightEx = GetWeightEx();
12574 float special = GetInventoryAndCargoWeight();
12575 return weightEx - special;
12576 }
12577
12578
12580 {
12582 }
12583
12585 {
12587 {
12588 #ifdef DEVELOPER
12589 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12590 {
12591 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12593 }
12594 #endif
12595
12596 return GetQuantity() * GetConfigWeightModified();
12597 }
12598 else if (HasEnergyManager())
12599 {
12600 #ifdef DEVELOPER
12601 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12602 {
12603 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12604 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12605 }
12606 #endif
12607 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12608 }
12609 else
12610 {
12611 #ifdef DEVELOPER
12612 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12613 {
12614 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12615 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12616 }
12617 #endif
12618 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12619 }
12620 }
12621
12624 {
12625 int item_count = 0;
12627
12628 GameInventory inventory = GetInventory();
12629 CargoBase cargo = inventory.
GetCargo();
12630 if (cargo != NULL)
12631 {
12633 }
12634
12636 for (int i = 0; i < nAttachments; ++i)
12637 {
12639 if (item)
12640 item_count += item.GetNumberOfItems();
12641 }
12642 return item_count;
12643 }
12644
12647 {
12648 float weight = 0;
12649 float wetness = 1;
12650 if (include_wetness)
12653 {
12654 weight = wetness * m_ConfigWeight;
12655 }
12657 {
12658 weight = 1;
12659 }
12660 return weight;
12661 }
12662
12663
12664
12666 {
12667 GameInventory inventory = GetInventory();
12668 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12669 {
12670 array<EntityAI> items = new array<EntityAI>;
12672 for (int i = 0; i < items.Count(); ++i)
12673 {
12675 if (item)
12676 {
12677 g_Game.ObjectDelete(item);
12678 }
12679 }
12680 }
12681 }
12682
12683
12684
12685
12687 {
12688 float energy = 0;
12689 if (HasEnergyManager())
12690 {
12691 energy = GetCompEM().GetEnergy();
12692 }
12693 return energy;
12694 }
12695
12696
12698 {
12699 super.OnEnergyConsumed();
12700
12702 }
12703
12705 {
12706 super.OnEnergyAdded();
12707
12709 }
12710
12711
12713 {
12714 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12715 {
12717 {
12718 float energy_0to1 = GetCompEM().GetEnergy0To1();
12720 }
12721 }
12722 }
12723
12724
12726 {
12727 return ConfigGetFloat("heatIsolation");
12728 }
12729
12731 {
12733 }
12734
12736 {
12737 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12738 if (
g_Game.ConfigIsExisting(paramPath))
12739 return g_Game.ConfigGetFloat(paramPath);
12740
12741 return 0.0;
12742 }
12743
12745 {
12746 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12747 if (
g_Game.ConfigIsExisting(paramPath))
12748 return g_Game.ConfigGetFloat(paramPath);
12749
12750 return 0.0;
12751 }
12752
12753 override void SetWet(
float value,
bool allow_client =
false)
12754 {
12755 if (!IsServerCheck(allow_client))
12756 return;
12757
12760
12762
12763 m_VarWet = Math.Clamp(value, min, max);
12764
12766 {
12769 }
12770 }
12771
12772 override void AddWet(
float value)
12773 {
12775 }
12776
12778 {
12780 }
12781
12783 {
12785 }
12786
12788 {
12790 }
12791
12793 {
12795 }
12796
12798 {
12800 }
12801
12802 override void OnWetChanged(
float newVal,
float oldVal)
12803 {
12806 if (newLevel != oldLevel)
12807 {
12809 }
12810 }
12811
12813 {
12814 SetWeightDirty();
12815 }
12816
12818 {
12819 return GetWetLevelInternal(
m_VarWet);
12820 }
12821
12822
12823
12825 {
12827 }
12828
12830 {
12832 }
12833
12835 {
12837 }
12838
12840 {
12842 }
12843
12844
12845
12847 {
12848 if (ConfigIsExisting("itemModelLength"))
12849 {
12850 return ConfigGetFloat("itemModelLength");
12851 }
12852 return 0;
12853 }
12854
12856 {
12857 if (ConfigIsExisting("itemAttachOffset"))
12858 {
12859 return ConfigGetFloat("itemAttachOffset");
12860 }
12861 return 0;
12862 }
12863
12864 override void SetCleanness(
int value,
bool allow_client =
false)
12865 {
12866 if (!IsServerCheck(allow_client))
12867 return;
12868
12870
12872
12875 }
12876
12878 {
12880 }
12881
12883 {
12884 return true;
12885 }
12886
12887
12888
12889
12891 {
12893 }
12894
12896 {
12898 }
12899
12900
12901
12902
12903 override void SetColor(
int r,
int g,
int b,
int a)
12904 {
12910 }
12912 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12913 {
12918 }
12919
12921 {
12923 }
12924
12927 {
12928 int r,g,b,a;
12930 r = r/255;
12931 g = g/255;
12932 b = b/255;
12933 a = a/255;
12934 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12935 }
12936
12937
12938
12939 override void SetLiquidType(
int value,
bool allow_client =
false)
12940 {
12941 if (!IsServerCheck(allow_client))
12942 return;
12943
12948 }
12949
12951 {
12952 return ConfigGetInt("varLiquidTypeInit");
12953 }
12954
12956 {
12958 }
12959
12961 {
12963 SetFrozen(false);
12964 }
12965
12968 {
12969 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12970 }
12971
12972
12975 {
12976 PlayerBase nplayer;
12977 if (PlayerBase.CastTo(nplayer, player))
12978 {
12980 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12981 }
12982 }
12983
12984
12987 {
12988 PlayerBase nplayer;
12989 if (PlayerBase.CastTo(nplayer,player))
12990 {
12991 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12992 }
12993
12994 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12995
12996 if (HasEnergyManager())
12997 {
12998 GetCompEM().UpdatePlugState();
12999 }
13000 }
13001
13002
13004 {
13005 super.OnPlacementStarted(player);
13006
13008 }
13009
13010 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13011 {
13013 {
13014 m_AdminLog.OnPlacementComplete(player,
this);
13015 }
13016
13017 super.OnPlacementComplete(player, position, orientation);
13018 }
13019
13020
13021
13022
13023
13025 {
13027 {
13028 return true;
13029 }
13030 else
13031 {
13032 return false;
13033 }
13034 }
13035
13036
13038 {
13040 {
13042 }
13043 }
13044
13045
13047 {
13049 }
13050
13052 {
13054 }
13055
13056 override void InsertAgent(
int agent,
float count = 1)
13057 {
13058 if (count < 1)
13059 return;
13060
13062 }
13063
13066 {
13068 }
13069
13070
13072 {
13074 }
13075
13076
13077
13078
13079
13080
13081
13082
13083
13084
13085
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13118 {
13120 return false;
13121 return true;
13122 }
13123
13125 {
13126
13128 }
13129
13130
13133 {
13134 super.CheckForRoofLimited(timeTresholdMS);
13135
13136 float time =
g_Game.GetTime();
13137 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13138 {
13139 m_PreviousRoofTestTime = time;
13140 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13141 }
13142 }
13143
13144
13146 {
13148 {
13149 return 0;
13150 }
13151
13152 if (GetInventory().GetAttachmentSlotsCount() != 0)
13153 {
13154 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13155 if (filter)
13156 return filter.GetProtectionLevel(type, false, system);
13157 else
13158 return 0;
13159 }
13160
13161 string subclassPath, entryName;
13162
13163 switch (type)
13164 {
13166 entryName = "biological";
13167 break;
13169 entryName = "chemical";
13170 break;
13171 default:
13172 entryName = "biological";
13173 break;
13174 }
13175
13176 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13177
13178 return g_Game.ConfigGetFloat(subclassPath + entryName);
13179 }
13180
13181
13182
13185 {
13186 if (!IsMagazine())
13188
13190 }
13191
13192
13193
13194
13195
13200 {
13201 return true;
13202 }
13203
13205 {
13207 }
13208
13209
13210
13211
13212
13214 {
13215 if (parent)
13216 {
13217 if (parent.IsInherited(DayZInfected))
13218 return true;
13219
13220 if (!parent.IsRuined())
13221 return true;
13222 }
13223
13224 return true;
13225 }
13226
13228 {
13229 if (!super.CanPutAsAttachment(parent))
13230 {
13231 return false;
13232 }
13233
13234 if (!IsRuined() && !parent.IsRuined())
13235 {
13236 return true;
13237 }
13238
13239 return false;
13240 }
13241
13243 {
13244
13245
13246
13247
13248 return super.CanReceiveItemIntoCargo(item);
13249 }
13250
13252 {
13253
13254
13255
13256
13257 GameInventory attachmentInv = attachment.GetInventory();
13259 {
13260 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13261 return false;
13262 }
13263
13264 InventoryLocation loc = new InventoryLocation();
13265 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13266 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13267 return false;
13268
13269 return super.CanReceiveAttachment(attachment, slotId);
13270 }
13271
13273 {
13274 if (!super.CanReleaseAttachment(attachment))
13275 return false;
13276
13277 return GetInventory().AreChildrenAccessible();
13278 }
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13301 {
13302 int id = muzzle_owner.GetMuzzleID();
13303 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13304
13305 if (WPOF_array)
13306 {
13307 for (int i = 0; i < WPOF_array.Count(); i++)
13308 {
13309 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13310
13311 if (WPOF)
13312 {
13313 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13314 }
13315 }
13316 }
13317 }
13318
13319
13321 {
13322 int id = muzzle_owner.GetMuzzleID();
13324
13325 if (WPOBE_array)
13326 {
13327 for (int i = 0; i < WPOBE_array.Count(); i++)
13328 {
13329 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13330
13331 if (WPOBE)
13332 {
13333 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13334 }
13335 }
13336 }
13337 }
13338
13339
13341 {
13342 int id = muzzle_owner.GetMuzzleID();
13343 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13344
13345 if (WPOOH_array)
13346 {
13347 for (int i = 0; i < WPOOH_array.Count(); i++)
13348 {
13349 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13350
13351 if (WPOOH)
13352 {
13353 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13354 }
13355 }
13356 }
13357 }
13358
13359
13361 {
13362 int id = muzzle_owner.GetMuzzleID();
13363 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13364
13365 if (WPOOH_array)
13366 {
13367 for (int i = 0; i < WPOOH_array.Count(); i++)
13368 {
13369 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13370
13371 if (WPOOH)
13372 {
13373 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13374 }
13375 }
13376 }
13377 }
13378
13379
13381 {
13382 int id = muzzle_owner.GetMuzzleID();
13383 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13384
13385 if (WPOOH_array)
13386 {
13387 for (int i = 0; i < WPOOH_array.Count(); i++)
13388 {
13389 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13390
13391 if (WPOOH)
13392 {
13393 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13394 }
13395 }
13396 }
13397 }
13398
13399
13400
13402 {
13404 {
13405 return true;
13406 }
13407
13408 return false;
13409 }
13410
13412 {
13414 {
13415 return true;
13416 }
13417
13418 return false;
13419 }
13420
13422 {
13424 {
13425 return true;
13426 }
13427
13428 return false;
13429 }
13430
13432 {
13433 return false;
13434 }
13435
13438 {
13439 return UATimeSpent.DEFAULT_DEPLOY;
13440 }
13441
13442
13443
13444
13446 {
13448 SetSynchDirty();
13449 }
13450
13452 {
13454 }
13455
13456
13458 {
13459 return false;
13460 }
13461
13464 {
13465 string att_type = "None";
13466
13467 if (ConfigIsExisting("soundAttType"))
13468 {
13469 att_type = ConfigGetString("soundAttType");
13470 }
13471
13473 }
13474
13476 {
13478 }
13479
13480
13481
13482
13483
13489
13491 {
13494
13496 }
13497
13498
13500 {
13502 return;
13503
13505
13508
13511
13512 SoundParameters params = new SoundParameters();
13516 }
13517
13518
13520 {
13522 {
13525
13526 SetSynchDirty();
13527
13530 }
13531 }
13532
13534 {
13536 }
13537
13538
13540 {
13542 return;
13543
13545 SetSynchDirty();
13546
13549 }
13550
13552 {
13555 }
13556
13558 {
13560 }
13561
13562 void OnApply(PlayerBase player);
13563
13565 {
13566 return 1.0;
13567 };
13568
13570 {
13572 }
13573
13575 {
13577 }
13578
13580
13582 {
13583 SetDynamicPhysicsLifeTime(0.01);
13585 }
13586
13588 {
13589 array<string> zone_names = new array<string>;
13590 GetDamageZones(zone_names);
13591 for (int i = 0; i < zone_names.Count(); i++)
13592 {
13593 SetHealthMax(zone_names.Get(i),"Health");
13594 }
13595 SetHealthMax("","Health");
13596 }
13597
13600 {
13601 float global_health = GetHealth01("","Health");
13602 array<string> zones = new array<string>;
13603 GetDamageZones(zones);
13604
13605 for (int i = 0; i < zones.Count(); i++)
13606 {
13607 SetHealth01(zones.Get(i),"Health",global_health);
13608 }
13609 }
13610
13613 {
13614 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13615 }
13616
13618 {
13619 if (!hasRootAsPlayer)
13620 {
13621 if (refParentIB)
13622 {
13623
13624 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13625 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13626
13627 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13628 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13629
13632 }
13633 else
13634 {
13635
13638 }
13639 }
13640 }
13641
13643 {
13645 {
13646 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13647 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13648 {
13649 float heatPermCoef = 1.0;
13651 while (ent)
13652 {
13653 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13654 ent = ent.GetHierarchyParent();
13655 }
13656
13657 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13658 }
13659 }
13660 }
13661
13663 {
13664
13665 EntityAI parent = GetHierarchyParent();
13666 if (!parent)
13667 {
13668 hasParent = false;
13669 hasRootAsPlayer = false;
13670 }
13671 else
13672 {
13673 hasParent = true;
13674 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13675 refParentIB =
ItemBase.Cast(parent);
13676 }
13677 }
13678
13679 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13680 {
13681
13682 }
13683
13685 {
13686
13687 return false;
13688 }
13689
13691 {
13692
13693
13694 return false;
13695 }
13696
13698 {
13699
13700 return false;
13701 }
13702
13705 {
13706 return !GetIsFrozen() &&
IsOpen();
13707 }
13708
13710 {
13711 bool hasParent = false, hasRootAsPlayer = false;
13713
13714 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13715 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13716
13717 if (wwtu || foodDecay)
13718 {
13722
13723 if (processWetness || processTemperature || processDecay)
13724 {
13726
13727 if (processWetness)
13728 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13729
13730 if (processTemperature)
13732
13733 if (processDecay)
13734 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13735 }
13736 }
13737 }
13738
13741 {
13743 }
13744
13746 {
13749
13750 return super.GetTemperatureFreezeThreshold();
13751 }
13752
13754 {
13757
13758 return super.GetTemperatureThawThreshold();
13759 }
13760
13762 {
13765
13766 return super.GetItemOverheatThreshold();
13767 }
13768
13770 {
13772 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13773
13774 return super.GetTemperatureFreezeTime();
13775 }
13776
13778 {
13780 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13781
13782 return super.GetTemperatureThawTime();
13783 }
13784
13789
13791 {
13792 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13793 }
13794
13796 {
13797 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13798 }
13799
13802 {
13804 }
13805
13807 {
13809 }
13810
13812 {
13814 }
13815
13818 {
13819 return null;
13820 }
13821
13824 {
13825 return false;
13826 }
13827
13829 {
13831 {
13834 if (!trg)
13835 {
13837 explosive = this;
13838 }
13839
13840 explosive.PairRemote(trg);
13842
13843 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13844 trg.SetPersistentPairID(persistentID);
13845 explosive.SetPersistentPairID(persistentID);
13846
13847 return true;
13848 }
13849 return false;
13850 }
13851
13854 {
13855 float ret = 1.0;
13858 ret *= GetHealth01();
13859
13860 return ret;
13861 }
13862
13863 #ifdef DEVELOPER
13864 override void SetDebugItem()
13865 {
13866 super.SetDebugItem();
13867 _itemBase = this;
13868 }
13869
13871 {
13872 string text = super.GetDebugText();
13873
13875 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13876
13877 return text;
13878 }
13879 #endif
13880
13882 {
13883 return true;
13884 }
13885
13887
13889
13891 {
13894 }
13895
13896
13904
13920
13921 [
Obsolete(
"Use ItemSoundHandler instead")]
13924 {
13925 if (!
g_Game.IsDedicatedServer())
13926 {
13927 if (ConfigIsExisting("attachSoundSet"))
13928 {
13929 string cfg_path = "";
13930 string soundset = "";
13931 string type_name =
GetType();
13932
13935 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13936 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13937
13938 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13939 {
13940 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13941 {
13942 if (cfg_slot_array[i] == slot_type)
13943 {
13944 soundset = cfg_soundset_array[i];
13945 break;
13946 }
13947 }
13948 }
13949
13950 if (soundset != "")
13951 {
13952 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13954 }
13955 }
13956 }
13957 }
13958
13960}
13961
13963{
13965 if (entity)
13966 {
13967 bool is_item = entity.IsInherited(
ItemBase);
13968 if (is_item && full_quantity)
13969 {
13972 }
13973 }
13974 else
13975 {
13977 return NULL;
13978 }
13979 return entity;
13980}
13981
13983{
13984 if (item)
13985 {
13986 if (health > 0)
13987 item.SetHealth("", "", health);
13988
13989 if (item.CanHaveTemperature())
13990 {
13992 if (item.CanFreeze())
13993 item.SetFrozen(false);
13994 }
13995
13996 if (item.HasEnergyManager())
13997 {
13998 if (quantity >= 0)
13999 {
14000 item.GetCompEM().SetEnergy0To1(quantity);
14001 }
14002 else
14003 {
14005 }
14006 }
14007 else if (item.IsMagazine())
14008 {
14009 Magazine mag = Magazine.Cast(item);
14010 if (quantity >= 0)
14011 {
14012 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14013 }
14014 else
14015 {
14017 }
14018
14019 }
14020 else
14021 {
14022 if (quantity >= 0)
14023 {
14024 item.SetQuantityNormalized(quantity, false);
14025 }
14026 else
14027 {
14029 }
14030
14031 }
14032 }
14033}
14034
14035#ifdef DEVELOPER
14037#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.