9048{
9050 {
9051 return true;
9052 }
9053};
9054
9056{
9057
9058};
9059
9060
9061
9063{
9067
9069
9072
9073
9074
9075
9076
9085
9091
9096
9101
9122 protected bool m_IsResultOfSplit
9123
9125
9130
9131
9132
9134
9138
9139
9140
9142
9145
9146
9147
9153
9154
9162
9165
9166
9168
9169
9171
9172
9177
9178
9183
9185
9186
9188
9189
9191 {
9196
9197 if (!
g_Game.IsDedicatedServer())
9198 {
9200 {
9202
9204 {
9206 }
9207 }
9208
9211 }
9212
9213 m_OldLocation = null;
9214
9216 {
9218 }
9219
9220 if (ConfigIsExisting("headSelectionsToHide"))
9221 {
9224 }
9225
9227 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9228 {
9230 }
9231
9233
9234 m_IsResultOfSplit = false;
9235
9237 }
9238
9240 {
9241 super.InitItemVariables();
9242
9248 m_Count = ConfigGetInt(
"count");
9249
9252
9257
9260
9265
9277
9281
9282
9285 if (ConfigIsExisting("canBeSplit"))
9286 {
9289 }
9290
9292 if (ConfigIsExisting("itemBehaviour"))
9294
9295
9298 RegisterNetSyncVariableInt("m_VarLiquidType");
9299 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9300
9301 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9302 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9303 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9304
9305 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9306 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9307 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9308 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9309
9310 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9311 RegisterNetSyncVariableBool("m_IsTakeable");
9312 RegisterNetSyncVariableBool("m_IsHologram");
9313
9316 {
9319 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9320 }
9321
9323
9325 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9327
9329 }
9330
9332 {
9334 }
9335
9337 {
9340 {
9345 }
9346 }
9347
9348 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9349 {
9351 {
9354 }
9355
9357 }
9358
9360 {
9366 }
9367
9369
9371 {
9373
9374 if (!action)
9375 {
9376 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9377 return;
9378 }
9379
9381 if (!ai)
9382 {
9384 return;
9385 }
9386
9388 if (!action_array)
9389 {
9390 action_array = new array<ActionBase_Basic>;
9392 }
9393 if (LogManager.IsActionLogEnable())
9394 {
9395 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9396 }
9397
9398 if (action_array.Find(action) != -1)
9399 {
9400 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9401 }
9402 else
9403 {
9404 action_array.Insert(action);
9405 }
9406 }
9407
9409 {
9410 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9411 ActionBase action = player.GetActionManager().GetAction(actionName);
9414
9415 if (action_array)
9416 {
9417 action_array.RemoveItem(action);
9418 }
9419 }
9420
9421
9422
9424 {
9425 ActionOverrideData overrideData = new ActionOverrideData();
9429
9431 if (!actionMap)
9432 {
9435 }
9436
9437 actionMap.Insert(this.
Type(), overrideData);
9438
9439 }
9440
9442
9444
9445
9447 {
9450
9453
9454 string config_to_search = "CfgVehicles";
9455 string muzzle_owner_config;
9456
9458 {
9459 if (IsInherited(Weapon))
9460 config_to_search = "CfgWeapons";
9461
9462 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9463
9464 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9465
9466 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9467
9468 if (config_OnFire_subclass_count > 0)
9469 {
9470 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9471
9472 for (int i = 0; i < config_OnFire_subclass_count; i++)
9473 {
9474 string particle_class = "";
9475 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9476 string config_OnFire_entry = config_OnFire_class + particle_class;
9477 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9478 WPOF_array.Insert(WPOF);
9479 }
9480
9481
9483 }
9484 }
9485
9487 {
9488 config_to_search = "CfgWeapons";
9489 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9490
9491 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9492
9493 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9494
9495 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9496 {
9497 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9498
9499 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9500 {
9501 string particle_class2 = "";
9502 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9503 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9504 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9505 WPOBE_array.Insert(WPOBE);
9506 }
9507
9508
9510 }
9511 }
9512 }
9513
9514
9516 {
9519
9521 {
9522 string config_to_search = "CfgVehicles";
9523
9524 if (IsInherited(Weapon))
9525 config_to_search = "CfgWeapons";
9526
9527 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9528 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9529
9530 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9531 {
9532
9534
9536 {
9538 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9540 return;
9541 }
9542
9545
9546
9547
9548 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9549 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9550
9551 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9552 {
9553 string particle_class = "";
9554 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9555 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9556 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9557
9558 if (entry_type == CT_CLASS)
9559 {
9560 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9561 WPOOH_array.Insert(WPOF);
9562 }
9563 }
9564
9565
9567 }
9568 }
9569 }
9570
9572 {
9574 }
9575
9577 {
9579 {
9581
9584
9587
9588 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9589 }
9590 }
9591
9593 {
9595 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9596
9598 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9599
9601 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9602
9604 {
9606 }
9607 }
9608
9610 {
9612 }
9613
9615 {
9618 else
9620
9622 {
9625 }
9626 else
9627 {
9630
9633 }
9634
9636 }
9637
9639 {
9641 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9642 }
9643
9645 {
9647 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9649 }
9650
9652 {
9654 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9655 }
9656
9658 {
9661
9662 OverheatingParticle OP = new OverheatingParticle();
9667
9669 }
9670
9672 {
9675
9676 return -1;
9677 }
9678
9680 {
9682 {
9685
9686 for (int i = count; i > 0; --i)
9687 {
9688 int id = i - 1;
9691
9694
9695 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9696 {
9697 if (p)
9698 {
9701 }
9702 }
9703 }
9704 }
9705 }
9706
9708 {
9710 {
9712 {
9713 int id = i - 1;
9715
9716 if (OP)
9717 {
9719
9720 if (p)
9721 {
9723 }
9724
9725 delete OP;
9726 }
9727 }
9728
9731 }
9732 }
9733
9736 {
9737 return 0.0;
9738 }
9739
9740
9742 {
9743 return 250;
9744 }
9745
9747 {
9748 return 0;
9749 }
9750
9753 {
9755 return true;
9756
9757 return false;
9758 }
9759
9762 {
9765
9767 {
9769 }
9770 else
9771 {
9772
9774 }
9775
9777 }
9778
9785 {
9786 return -1;
9787 }
9788
9789
9790
9791
9793 {
9795 {
9796 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9797 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9798
9799 if (r_index >= 0)
9800 {
9801 InventoryLocation r_il = new InventoryLocation;
9802 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9803
9804 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9807 {
9808 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9809 }
9811 {
9812 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9813 }
9814
9815 }
9816
9817 player.GetHumanInventory().ClearUserReservedLocation(this);
9818 }
9819
9822 }
9823
9824
9825
9826
9828 {
9829 return ItemBase.m_DebugActionsMask;
9830 }
9831
9833 {
9834 return ItemBase.m_DebugActionsMask & mask;
9835 }
9836
9838 {
9839 ItemBase.m_DebugActionsMask = mask;
9840 }
9841
9843 {
9844 ItemBase.m_DebugActionsMask |= mask;
9845 }
9846
9848 {
9849 ItemBase.m_DebugActionsMask &= ~mask;
9850 }
9851
9853 {
9855 {
9857 }
9858 else
9859 {
9861 }
9862 }
9863
9864
9866 {
9867 if (GetEconomyProfile())
9868 {
9869 float q_max = GetEconomyProfile().GetQuantityMax();
9870 if (q_max > 0)
9871 {
9872 float q_min = GetEconomyProfile().GetQuantityMin();
9873 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9874
9876 {
9877 ComponentEnergyManager comp = GetCompEM();
9879 {
9881 }
9882 }
9884 {
9886
9887 }
9888
9889 }
9890 }
9891 }
9892
9895 {
9896 EntityAI parent = GetHierarchyParent();
9897
9898 if (parent)
9899 {
9900 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9901 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9902 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9903 }
9904 }
9905
9908 {
9909 EntityAI parent = GetHierarchyParent();
9910
9911 if (parent)
9912 {
9913 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9914 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9915 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9916 }
9917 }
9918
9920 {
9921
9922
9923
9924
9926
9928 {
9929 if (ScriptInputUserData.CanStoreInputUserData())
9930 {
9931 ScriptInputUserData ctx = new ScriptInputUserData;
9937 ctx.
Write(use_stack_max);
9940
9942 {
9943 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9944 }
9945 }
9946 }
9947 else if (!
g_Game.IsMultiplayer())
9948 {
9950 }
9951 }
9952
9954 {
9956 }
9957
9959 {
9961 }
9962
9964 {
9966 }
9967
9969 {
9970
9971 return false;
9972 }
9973
9975 {
9976 return false;
9977 }
9978
9982 {
9983 return false;
9984 }
9985
9987 {
9988 return "";
9989 }
9990
9992
9994 {
9995 return false;
9996 }
9997
9999 {
10000 return true;
10001 }
10002
10003
10004
10006 {
10007 return true;
10008 }
10009
10011 {
10012 return true;
10013 }
10014
10016 {
10017 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10019 }
10020
10022 {
10024 }
10025
10027 {
10029 if (!is_being_placed)
10031 SetSynchDirty();
10032 }
10033
10034
10036
10038 {
10040 }
10041
10043 {
10045 }
10046
10048 {
10049 return 1;
10050 }
10051
10053 {
10054 return false;
10055 }
10056
10058 {
10060 SetSynchDirty();
10061 }
10062
10063
10064
10065
10066
10067
10068
10069
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
10098 {
10099 super.OnMovedInsideCargo(container);
10100
10101 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10102 }
10103
10104 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10105 {
10106 super.EEItemLocationChanged(oldLoc, newLoc);
10107
10108 PlayerBase newPlayer = null;
10109 PlayerBase oldPlayer = null;
10110
10111 if (newLoc.GetParent())
10112 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10113
10114 if (oldLoc.GetParent())
10115 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10116
10118 {
10119 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10120
10121 if (rIndex >= 0)
10122 {
10123 InventoryLocation rIl = new InventoryLocation;
10124 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10125
10126 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10129 {
10130 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10131 }
10133 {
10135 }
10136
10137 }
10138 }
10139
10141 {
10142 if (newPlayer)
10143 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10144
10145 if (newPlayer == oldPlayer)
10146 {
10147 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10148 {
10150 {
10151 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10152 {
10153 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10154 }
10155 }
10156 else
10157 {
10158 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10159 }
10160 }
10161
10162 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10163 {
10164 int type = oldLoc.GetType();
10166 {
10167 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10168 }
10170 {
10171 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10172 }
10173 }
10174 if (!m_OldLocation)
10175 {
10176 m_OldLocation = new InventoryLocation;
10177 }
10178 m_OldLocation.Copy(oldLoc);
10179 }
10180 else
10181 {
10182 if (m_OldLocation)
10183 {
10184 m_OldLocation.Reset();
10185 }
10186 }
10187
10188 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10189 }
10190 else
10191 {
10192 if (newPlayer)
10193 {
10194 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10195 if (resIndex >= 0)
10196 {
10197 InventoryLocation il = new InventoryLocation;
10198 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10200 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10203 {
10204 il.
GetParent().GetOnReleaseLock().Invoke(it);
10205 }
10207 {
10209 }
10210
10211 }
10212 }
10214 {
10215
10217 }
10218
10219 if (m_OldLocation)
10220 {
10221 m_OldLocation.Reset();
10222 }
10223 }
10224
10226 {
10227 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10228 }
10229
10231 {
10232 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10233 }
10234 }
10235
10236 override void EOnContact(IEntity other, Contact extra)
10237 {
10239 {
10240 int liquidType = -1;
10242 if (impactSpeed > 0.0)
10243 {
10245 #ifndef SERVER
10247 #else
10249 SetSynchDirty();
10250 #endif
10252 }
10253 }
10254
10255 #ifdef SERVER
10256 if (GetCompEM() && GetCompEM().IsPlugged())
10257 {
10258 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10259 GetCompEM().UnplugThis();
10260 }
10261 #endif
10262 }
10263
10265
10267 {
10269 }
10270
10272 {
10273
10274 }
10275
10277 {
10278 super.OnItemLocationChanged(old_owner, new_owner);
10279
10280 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10281 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10282
10283 if (!relatedPlayer && playerNew)
10284 relatedPlayer = playerNew;
10285
10286 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10287 {
10289 if (actionMgr)
10290 {
10291 ActionBase currentAction = actionMgr.GetRunningAction();
10292 if (currentAction)
10294 }
10295 }
10296
10297 Man ownerPlayerOld = null;
10298 Man ownerPlayerNew = null;
10299
10300 if (old_owner)
10301 {
10302 if (old_owner.
IsMan())
10303 {
10304 ownerPlayerOld = Man.Cast(old_owner);
10305 }
10306 else
10307 {
10308 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10309 }
10310 }
10311 else
10312 {
10314 {
10316
10317 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10318 {
10319 GetCompEM().UnplugThis();
10320 }
10321 }
10322 }
10323
10324 if (new_owner)
10325 {
10326 if (new_owner.
IsMan())
10327 {
10328 ownerPlayerNew = Man.Cast(new_owner);
10329 }
10330 else
10331 {
10332 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10333 }
10334 }
10335
10336 if (ownerPlayerOld != ownerPlayerNew)
10337 {
10338 if (ownerPlayerOld)
10339 {
10340 array<EntityAI> subItemsExit = new array<EntityAI>;
10342 for (int i = 0; i < subItemsExit.Count(); i++)
10343 {
10346 }
10347 }
10348
10349 if (ownerPlayerNew)
10350 {
10351 array<EntityAI> subItemsEnter = new array<EntityAI>;
10353 for (int j = 0; j < subItemsEnter.Count(); j++)
10354 {
10357 }
10358 }
10359 }
10360 else if (ownerPlayerNew != null)
10361 {
10362 PlayerBase nplayer;
10363 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10364 {
10365 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10367 for (int k = 0; k < subItemsUpdate.Count(); k++)
10368 {
10370 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10371 }
10372 }
10373 }
10374
10375 if (old_owner)
10376 old_owner.OnChildItemRemoved(this);
10377 if (new_owner)
10378 new_owner.OnChildItemReceived(this);
10379 }
10380
10381
10383 {
10384 super.EEDelete(parent);
10385 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10386 if (player)
10387 {
10389
10390 if (player.IsAlive())
10391 {
10392 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10393 if (r_index >= 0)
10394 {
10395 InventoryLocation r_il = new InventoryLocation;
10396 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10397
10398 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10401 {
10402 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10403 }
10405 {
10406 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10407 }
10408
10409 }
10410
10411 player.RemoveQuickBarEntityShortcut(this);
10412 }
10413 }
10414 }
10415
10417 {
10418 super.EEKilled(killer);
10419
10422 {
10423 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10424 {
10425 if (IsMagazine())
10426 {
10427 if (Magazine.Cast(this).GetAmmoCount() > 0)
10428 {
10430 }
10431 }
10432 else
10433 {
10435 }
10436 }
10437 }
10438 }
10439
10441 {
10442 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10443
10444 super.OnWasAttached(parent, slot_id);
10445
10448
10451 }
10452
10454 {
10455 super.OnWasDetached(parent, slot_id);
10456
10459
10462 }
10463
10465 {
10466 int idx;
10469
10470 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10471 if (inventory_slots.Count() < 1)
10472 {
10473 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10474 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10475 }
10476 else
10477 {
10478 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10479 }
10480
10481 idx = inventory_slots.Find(slot);
10482 if (idx < 0)
10483 return "";
10484
10485 return attach_types.Get(idx);
10486 }
10487
10489 {
10490 int idx = -1;
10491 string slot;
10492
10495
10496 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10497 if (inventory_slots.Count() < 1)
10498 {
10499 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10500 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10501 }
10502 else
10503 {
10504 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10505 if (detach_types.Count() < 1)
10506 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10507 }
10508
10509 for (int i = 0; i < inventory_slots.Count(); i++)
10510 {
10511 slot = inventory_slots.Get(i);
10512 }
10513
10514 if (slot != "")
10515 {
10516 if (detach_types.Count() == 1)
10517 idx = 0;
10518 else
10519 idx = inventory_slots.Find(slot);
10520 }
10521 if (idx < 0)
10522 return "";
10523
10524 return detach_types.Get(idx);
10525 }
10526
10528 {
10529
10531
10532
10533 float min_time = 1;
10534 float max_time = 3;
10535 float delay = Math.RandomFloat(min_time, max_time);
10536
10537 explode_timer.Run(delay, this, "DoAmmoExplosion");
10538 }
10539
10541 {
10542 Magazine magazine = Magazine.Cast(this);
10543 int pop_sounds_count = 6;
10544 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10545
10546
10547 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10548 string sound_name = pop_sounds[ sound_idx ];
10549 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10550
10551
10552 magazine.ServerAddAmmoCount(-1);
10553
10554
10555 float min_temp_to_explode = 100;
10556
10557 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10558 {
10560 }
10561 }
10562
10563
10564 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10565 {
10566 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10567
10568 const int CHANCE_DAMAGE_CARGO = 4;
10569 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10570 const int CHANCE_DAMAGE_NOTHING = 2;
10571
10573 {
10574 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10575 int chances;
10576 int rnd;
10577
10578 if (GetInventory().GetCargo())
10579 {
10580 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10581 rnd = Math.RandomInt(0,chances);
10582
10583 if (rnd < CHANCE_DAMAGE_CARGO)
10584 {
10586 }
10587 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10588 {
10590 }
10591 }
10592 else
10593 {
10594 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10595 rnd = Math.RandomInt(0,chances);
10596
10597 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10598 {
10600 }
10601 }
10602 }
10603 }
10604
10606 {
10607 CargoBase cargo = GetInventory().GetCargo();
10608 if (cargo)
10609 {
10611 if (item_count > 0)
10612 {
10613 int random_pick = Math.RandomInt(0, item_count);
10615 if (!item.IsExplosive())
10616 {
10617 item.AddHealth("","",damage);
10618 return true;
10619 }
10620 }
10621 }
10622 return false;
10623 }
10624
10626 {
10627 GameInventory inventory = GetInventory();
10629 if (attachment_count > 0)
10630 {
10631 int random_pick = Math.RandomInt(0, attachment_count);
10633 if (!attachment.IsExplosive())
10634 {
10635 attachment.AddHealth("","",damage);
10636 return true;
10637 }
10638 }
10639 return false;
10640 }
10641
10643 {
10645 }
10646
10648 {
10650 return GetInventory().CanRemoveEntity();
10651
10652 return false;
10653 }
10654
10656 {
10657
10659 return false;
10660
10661
10663 return false;
10664
10665
10666
10668 if (delta == 0)
10669 return false;
10670
10671
10672 return true;
10673 }
10674
10676 {
10678 {
10679 if (ScriptInputUserData.CanStoreInputUserData())
10680 {
10681 ScriptInputUserData ctx = new ScriptInputUserData;
10686 ctx.
Write(destination_entity);
10688 ctx.
Write(slot_id);
10690 }
10691 }
10692 else if (!
g_Game.IsMultiplayer())
10693 {
10695 }
10696 }
10697
10699 {
10700 float split_quantity_new;
10704 InventoryLocation loc = new InventoryLocation;
10705
10706 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10707 {
10709 split_quantity_new = stack_max;
10710 else
10712
10714 {
10715 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10716 if (new_item)
10717 {
10718 new_item.SetResultOfSplit(true);
10719 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10721 new_item.
SetQuantity(split_quantity_new,
false,
true);
10722 }
10723 }
10724 }
10725 else if (destination_entity && slot_id == -1)
10726 {
10727 if (quantity > stack_max)
10728 split_quantity_new = stack_max;
10729 else
10730 split_quantity_new = quantity;
10731
10733 {
10734 GameInventory destinationInventory = destination_entity.GetInventory();
10736 {
10739 }
10740
10741 if (new_item)
10742 {
10743 new_item.SetResultOfSplit(true);
10744 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10746 new_item.
SetQuantity(split_quantity_new,
false,
true);
10747 }
10748 }
10749 }
10750 else
10751 {
10752 if (stack_max != 0)
10753 {
10755 {
10757 }
10758
10759 if (split_quantity_new == 0)
10760 {
10761 if (!
g_Game.IsMultiplayer())
10762 player.PhysicalPredictiveDropItem(this);
10763 else
10764 player.ServerDropEntity(this);
10765 return;
10766 }
10767
10769 {
10771
10772 if (new_item)
10773 {
10774 new_item.SetResultOfSplit(true);
10775 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10778 new_item.PlaceOnSurface();
10779 }
10780 }
10781 }
10782 }
10783 }
10784
10786 {
10787 float split_quantity_new;
10791 InventoryLocation loc = new InventoryLocation;
10792
10793 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10794 {
10796 split_quantity_new = stack_max;
10797 else
10799
10801 {
10802 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10803 if (new_item)
10804 {
10805 new_item.SetResultOfSplit(true);
10806 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10808 new_item.
SetQuantity(split_quantity_new,
false,
true);
10809 }
10810 }
10811 }
10812 else if (destination_entity && slot_id == -1)
10813 {
10814 if (quantity > stack_max)
10815 split_quantity_new = stack_max;
10816 else
10817 split_quantity_new = quantity;
10818
10820 {
10821 GameInventory destinationInventory = destination_entity.GetInventory();
10823 {
10826 }
10827
10828 if (new_item)
10829 {
10830 new_item.SetResultOfSplit(true);
10831 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10833 new_item.
SetQuantity(split_quantity_new,
false,
true);
10834 }
10835 }
10836 }
10837 else
10838 {
10839 if (stack_max != 0)
10840 {
10842 {
10844 }
10845
10847 {
10849
10850 if (new_item)
10851 {
10852 new_item.SetResultOfSplit(true);
10853 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10856 new_item.PlaceOnSurface();
10857 }
10858 }
10859 }
10860 }
10861 }
10862
10864 {
10866 {
10867 if (ScriptInputUserData.CanStoreInputUserData())
10868 {
10869 ScriptInputUserData ctx = new ScriptInputUserData;
10874 dst.WriteToContext(ctx);
10876 }
10877 }
10878 else if (!
g_Game.IsMultiplayer())
10879 {
10881 }
10882 }
10883
10885 {
10887 {
10888 if (ScriptInputUserData.CanStoreInputUserData())
10889 {
10890 ScriptInputUserData ctx = new ScriptInputUserData;
10895 ctx.
Write(destination_entity);
10901 }
10902 }
10903 else if (!
g_Game.IsMultiplayer())
10904 {
10906 }
10907 }
10908
10910 {
10912 }
10913
10915 {
10917 float split_quantity_new;
10919 if (dst.IsValid())
10920 {
10921 int slot_id = dst.GetSlot();
10923
10924 if (quantity > stack_max)
10925 split_quantity_new = stack_max;
10926 else
10927 split_quantity_new = quantity;
10928
10930 {
10932
10933 if (new_item)
10934 {
10935 new_item.SetResultOfSplit(true);
10936 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10938 new_item.
SetQuantity(split_quantity_new,
false,
true);
10939 }
10940
10941 return new_item;
10942 }
10943 }
10944
10945 return null;
10946 }
10947
10949 {
10951 float split_quantity_new;
10953 if (destination_entity)
10954 {
10956 if (quantity > stackable)
10957 split_quantity_new = stackable;
10958 else
10959 split_quantity_new = quantity;
10960
10962 {
10963 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10964 if (new_item)
10965 {
10966 new_item.SetResultOfSplit(true);
10967 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10969 new_item.
SetQuantity(split_quantity_new,
false,
true);
10970 }
10971 }
10972 }
10973 }
10974
10976 {
10978 {
10979 if (ScriptInputUserData.CanStoreInputUserData())
10980 {
10981 ScriptInputUserData ctx = new ScriptInputUserData;
10986 ItemBase destination_entity =
this;
10987 ctx.
Write(destination_entity);
10991 }
10992 }
10993 else if (!
g_Game.IsMultiplayer())
10994 {
10996 }
10997 }
10998
11000 {
11002 float split_quantity_new;
11004 if (player)
11005 {
11007 if (quantity > stackable)
11008 split_quantity_new = stackable;
11009 else
11010 split_quantity_new = quantity;
11011
11013 {
11014 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11015 new_item =
ItemBase.Cast(in_hands);
11016 if (new_item)
11017 {
11018 new_item.SetResultOfSplit(true);
11019 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11021 new_item.SetQuantity(split_quantity_new, false, true);
11022 }
11023 }
11024 }
11025 }
11026
11028 {
11030 float split_quantity_new = Math.Floor(quantity * 0.5);
11031
11033 return;
11034
11036
11037 if (new_item)
11038 {
11039 if (new_item.GetQuantityMax() < split_quantity_new)
11040 {
11041 split_quantity_new = new_item.GetQuantityMax();
11042 }
11043
11044 new_item.SetResultOfSplit(true);
11045 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11046
11048 {
11051 }
11052 else
11053 {
11055 new_item.
SetQuantity(split_quantity_new,
false,
true);
11056 }
11057 }
11058 }
11059
11061 {
11063 float split_quantity_new = Math.Floor(quantity / 2);
11064
11066 return;
11067
11068 InventoryLocation invloc = new InventoryLocation;
11070
11072 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11073
11074 if (new_item)
11075 {
11076 if (new_item.GetQuantityMax() < split_quantity_new)
11077 {
11078 split_quantity_new = new_item.GetQuantityMax();
11079 }
11081 {
11084 }
11085 else if (split_quantity_new > 1)
11086 {
11088 new_item.
SetQuantity(split_quantity_new,
false,
true);
11089 }
11090 }
11091 }
11092
11095 {
11096 SetWeightDirty();
11098
11099 if (parent)
11100 parent.OnAttachmentQuantityChangedEx(this, delta);
11101
11103 {
11105 {
11107 }
11109 {
11110 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11112 }
11113 }
11114 }
11115
11118 {
11119
11120 }
11121
11124 {
11126 }
11127
11129 {
11130 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11131
11133 {
11134 if (newLevel == GameConstants.STATE_RUINED)
11135 {
11137 EntityAI parent = GetHierarchyParent();
11138 if (parent && parent.IsFireplace())
11139 {
11140 CargoBase cargo = GetInventory().GetCargo();
11141 if (cargo)
11142 {
11144 {
11146 }
11147 }
11148 }
11149 }
11150
11152 {
11153
11155 return;
11156 }
11157
11158 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11159 {
11161 }
11162 }
11163 }
11164
11165
11167 {
11168 super.OnRightClick();
11169
11171 {
11173 {
11174 if (ScriptInputUserData.CanStoreInputUserData())
11175 {
11176 EntityAI root = GetHierarchyRoot();
11177 Man playerOwner = GetHierarchyRootPlayer();
11178 InventoryLocation dst = new InventoryLocation;
11179
11180
11181 if (!playerOwner && root && root == this)
11182 {
11184 }
11185 else
11186 {
11187
11188 GetInventory().GetCurrentInventoryLocation(dst);
11190 {
11191 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11193 {
11195 }
11196 else
11197 {
11199
11200
11201 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11202 {
11204 }
11205 else
11206 {
11207 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11208 }
11209 }
11210 }
11211 }
11212
11213 ScriptInputUserData ctx = new ScriptInputUserData;
11221 }
11222 }
11223 else if (!
g_Game.IsMultiplayer())
11224 {
11226 }
11227 }
11228 }
11229
11231 {
11232 if (root)
11233 {
11234 vector m4[4];
11235 root.GetTransform(m4);
11236 dst.SetGround(this, m4);
11237 }
11238 else
11239 {
11240 GetInventory().GetCurrentInventoryLocation(dst);
11241 }
11242 }
11243
11244 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11245 {
11246
11247 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11248 return false;
11249
11250 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11251 return false;
11252
11253
11255 return false;
11256
11257
11258 Magazine mag = Magazine.Cast(this);
11259 if (mag)
11260 {
11261 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11262 return false;
11263
11264 if (stack_max_limit)
11265 {
11266 Magazine other_mag = Magazine.Cast(other_item);
11267 if (other_item)
11268 {
11269 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11270 return false;
11271 }
11272
11273 }
11274 }
11275 else
11276 {
11277
11279 return false;
11280
11282 return false;
11283 }
11284
11285 PlayerBase player = null;
11286 if (CastTo(player, GetHierarchyRootPlayer()))
11287 {
11288 if (player.GetInventory().HasAttachment(this))
11289 return false;
11290
11291 if (player.IsItemsToDelete())
11292 return false;
11293 }
11294
11295 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11296 return false;
11297
11298 int slotID;
11300 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11301 return false;
11302
11303 return true;
11304 }
11305
11307 {
11309 }
11310
11312 {
11313 return m_IsResultOfSplit;
11314 }
11315
11317 {
11318 m_IsResultOfSplit = value;
11319 }
11320
11322 {
11324 }
11325
11327 {
11328 float other_item_quantity = other_item.GetQuantity();
11329 float this_free_space;
11330
11332
11334
11335 if (other_item_quantity > this_free_space)
11336 {
11337 return this_free_space;
11338 }
11339 else
11340 {
11341 return other_item_quantity;
11342 }
11343 }
11344
11346 {
11348 }
11349
11351 {
11353 return;
11354
11355 if (!IsMagazine() && other_item)
11356 {
11358 if (quantity_used != 0)
11359 {
11360 float hp1 = GetHealth01("","");
11361 float hp2 = other_item.GetHealth01("","");
11362 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11363 hpResult = hpResult / (
GetQuantity() + quantity_used);
11364
11365 hpResult *= GetMaxHealth();
11366 Math.Round(hpResult);
11367 SetHealth("", "Health", hpResult);
11368
11370 other_item.AddQuantity(-quantity_used);
11371 }
11372 }
11374 }
11375
11377 {
11378 #ifdef SERVER
11379 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11380 GetHierarchyParent().IncreaseLifetimeUp();
11381 #endif
11382 };
11383
11385 {
11386 PlayerBase p = PlayerBase.Cast(player);
11387
11388 array<int> recipesIds = p.m_Recipes;
11389 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11390 if (moduleRecipesManager)
11391 {
11392 EntityAI itemInHands = player.GetEntityInHands();
11393 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11394 }
11395
11396 for (int i = 0;i < recipesIds.Count(); i++)
11397 {
11398 int key = recipesIds.Get(i);
11399 string recipeName = moduleRecipesManager.GetRecipeName(key);
11401 }
11402 }
11403
11404
11405 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11406 {
11407 super.GetDebugActions(outputList);
11408
11409
11415
11416
11421
11426
11427
11431
11432
11434 {
11438 }
11439
11442
11443
11447
11449
11450 InventoryLocation loc = new InventoryLocation();
11451 GetInventory().GetCurrentInventoryLocation(loc);
11453 {
11454 if (Gizmo_IsSupported())
11457 }
11458
11460 }
11461
11462
11463
11464
11466 {
11467 super.OnAction(action_id, player, ctx);
11468
11470 {
11471 switch (action_id)
11472 {
11476 return true;
11480 return true;
11481 }
11482 }
11483
11485 {
11486 switch (action_id)
11487 {
11489 Delete();
11490 return true;
11491 }
11492 }
11493
11494 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11495 {
11496 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11497 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11498 PlayerBase p = PlayerBase.Cast(player);
11499 if (
EActions.RECIPES_RANGE_START < 1000)
11500 {
11501 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11502 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11503 }
11504 }
11505 #ifndef SERVER
11506 else if (action_id ==
EActions.WATCH_PLAYER)
11507 {
11508 PluginDeveloper.SetDeveloperItemClientEx(player);
11509 }
11510 #endif
11512 {
11513 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11514 {
11515 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11516 OnDebugButtonPressServer(id + 1);
11517 }
11518
11519 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11520 {
11521 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11523 }
11524
11525 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11526 {
11527 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11529 }
11530
11531 else if (action_id ==
EActions.ADD_QUANTITY)
11532 {
11533 if (IsMagazine())
11534 {
11535 Magazine mag = Magazine.Cast(this);
11536 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11537 }
11538 else
11539 {
11541 }
11542
11543 if (m_EM)
11544 {
11545 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11546 }
11547
11548 }
11549
11550 else if (action_id ==
EActions.REMOVE_QUANTITY)
11551 {
11552 if (IsMagazine())
11553 {
11554 Magazine mag2 = Magazine.Cast(this);
11555 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11556 }
11557 else
11558 {
11560 }
11561 if (m_EM)
11562 {
11563 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11564 }
11565
11566 }
11567
11568 else if (action_id ==
EActions.SET_QUANTITY_0)
11569 {
11571
11572 if (m_EM)
11573 {
11574 m_EM.SetEnergy(0);
11575 }
11576 }
11577
11578 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11579 {
11581
11582 if (m_EM)
11583 {
11584 m_EM.SetEnergy(m_EM.GetEnergyMax());
11585 }
11586 }
11587
11588 else if (action_id ==
EActions.ADD_HEALTH)
11589 {
11590 AddHealth("","",GetMaxHealth("","Health")/5);
11591 }
11592 else if (action_id ==
EActions.REMOVE_HEALTH)
11593 {
11594 AddHealth("","",-GetMaxHealth("","Health")/5);
11595 }
11596 else if (action_id ==
EActions.DESTROY_HEALTH)
11597 {
11598 SetHealth01("","",0);
11599 }
11600 else if (action_id ==
EActions.WATCH_ITEM)
11601 {
11603 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11604 #ifdef DEVELOPER
11605 SetDebugDeveloper_item(this);
11606 #endif
11607 }
11608
11609 else if (action_id ==
EActions.ADD_TEMPERATURE)
11610 {
11611 AddTemperature(20);
11612
11613 }
11614
11615 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11616 {
11617 AddTemperature(-20);
11618
11619 }
11620
11621 else if (action_id ==
EActions.FLIP_FROZEN)
11622 {
11623 SetFrozen(!GetIsFrozen());
11624
11625 }
11626
11627 else if (action_id ==
EActions.ADD_WETNESS)
11628 {
11630
11631 }
11632
11633 else if (action_id ==
EActions.REMOVE_WETNESS)
11634 {
11636
11637 }
11638
11639 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11640 {
11643
11644
11645 }
11646
11647 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11648 {
11651 }
11652
11653 else if (action_id ==
EActions.MAKE_SPECIAL)
11654 {
11655 auto debugParams = DebugSpawnParams.WithPlayer(player);
11656 OnDebugSpawnEx(debugParams);
11657 }
11658
11659 }
11660
11661
11662 return false;
11663 }
11664
11665
11666
11667
11671
11674
11675
11676
11678 {
11679 return false;
11680 }
11681
11682
11684 {
11685 return true;
11686 }
11687
11688
11690 {
11691 return true;
11692 }
11693
11694
11695
11697 {
11698 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11699 return g_Game.ConfigIsExisting(config_path);
11700 }
11701
11704 {
11705 return null;
11706 }
11707
11709 {
11710 return false;
11711 }
11712
11714 {
11715 return false;
11716 }
11717
11721
11722
11724 {
11725 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11726 return module_repairing.CanRepair(this, item_repair_kit);
11727 }
11728
11729
11730 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11731 {
11732 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11733 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11734 }
11735
11736
11738 {
11739
11740
11741
11742
11743
11744
11745
11746
11747 return 1;
11748 }
11749
11750
11751
11753 {
11755 }
11756
11757
11758
11760 {
11762 }
11763
11764
11773 {
11774 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11775
11776 if (player)
11777 {
11778 player.MessageStatus(text);
11779 }
11780 }
11781
11782
11791 {
11792 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11793
11794 if (player)
11795 {
11796 player.MessageAction(text);
11797 }
11798 }
11799
11800
11809 {
11810 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11811
11812 if (player)
11813 {
11814 player.MessageFriendly(text);
11815 }
11816 }
11817
11818
11827 {
11828 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11829
11830 if (player)
11831 {
11832 player.MessageImportant(text);
11833 }
11834 }
11835
11837 {
11838 return true;
11839 }
11840
11841
11842 override bool KindOf(
string tag)
11843 {
11844 bool found = false;
11845 string item_name = this.
GetType();
11847 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11848
11849 int array_size = item_tag_array.Count();
11850 for (int i = 0; i < array_size; i++)
11851 {
11852 if (item_tag_array.Get(i) == tag)
11853 {
11854 found = true;
11855 break;
11856 }
11857 }
11858 return found;
11859 }
11860
11861
11863 {
11864
11865 super.OnRPC(sender, rpc_type,ctx);
11866
11867
11868 switch (rpc_type)
11869 {
11870 #ifndef SERVER
11871 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11872 Param2<bool, string> p = new Param2<bool, string>(false, "");
11873
11875 return;
11876
11877 bool play = p.param1;
11878 string soundSet = p.param2;
11879
11880 if (play)
11881 {
11883 {
11885 {
11887 }
11888 }
11889 else
11890 {
11892 }
11893 }
11894 else
11895 {
11897 }
11898
11899 break;
11900 #endif
11901
11902 }
11903
11905 {
11907 }
11908 }
11909
11910
11911
11912
11914 {
11915 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11916 return plugin.GetID(
name);
11917 }
11918
11920 {
11921 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11922 return plugin.GetName(id);
11923 }
11924
11927 {
11928
11929
11930 int varFlags;
11931 if (!ctx.
Read(varFlags))
11932 return;
11933
11934 if (varFlags & ItemVariableFlags.FLOAT)
11935 {
11937 }
11938 }
11939
11941 {
11942
11943 super.SerializeNumericalVars(floats_out);
11944
11945
11946
11948 {
11950 }
11951
11953 {
11955 }
11956
11958 {
11960 }
11961
11963 {
11968 }
11969
11971 {
11973 }
11974 }
11975
11977 {
11978
11979 super.DeSerializeNumericalVars(floats);
11980
11981
11982 int index = 0;
11983 int mask = Math.Round(floats.Get(index));
11984
11985 index++;
11986
11988 {
11990 {
11992 }
11993 else
11994 {
11995 float quantity = floats.Get(index);
11996 SetQuantity(quantity,
true,
false,
false,
false);
11997 }
11998 index++;
11999 }
12000
12002 {
12003 float wet = floats.Get(index);
12005 index++;
12006 }
12007
12009 {
12010 int liquidtype = Math.Round(floats.Get(index));
12012 index++;
12013 }
12014
12016 {
12018 index++;
12020 index++;
12022 index++;
12024 index++;
12025 }
12026
12028 {
12029 int cleanness = Math.Round(floats.Get(index));
12031 index++;
12032 }
12033 }
12034
12036 {
12037 super.WriteVarsToCTX(ctx);
12038
12039
12041 {
12043 }
12044
12046 {
12048 }
12049
12051 {
12053 }
12054
12056 {
12057 int r,g,b,a;
12063 }
12064
12066 {
12068 }
12069 }
12070
12072 {
12073 if (!super.ReadVarsFromCTX(ctx,version))
12074 return false;
12075
12076 int intValue;
12077 float value;
12078
12079 if (version < 140)
12080 {
12081 if (!ctx.
Read(intValue))
12082 return false;
12083
12084 m_VariablesMask = intValue;
12085 }
12086
12088 {
12089 if (!ctx.
Read(value))
12090 return false;
12091
12093 {
12095 }
12096 else
12097 {
12099 }
12100 }
12101
12102 if (version < 140)
12103 {
12105 {
12106 if (!ctx.
Read(value))
12107 return false;
12108 SetTemperatureDirect(value);
12109 }
12110 }
12111
12113 {
12114 if (!ctx.
Read(value))
12115 return false;
12117 }
12118
12120 {
12121 if (!ctx.
Read(intValue))
12122 return false;
12124 }
12125
12127 {
12128 int r,g,b,a;
12130 return false;
12132 return false;
12134 return false;
12136 return false;
12137
12139 }
12140
12142 {
12143 if (!ctx.
Read(intValue))
12144 return false;
12146 }
12147
12148 if (version >= 138 && version < 140)
12149 {
12151 {
12152 if (!ctx.
Read(intValue))
12153 return false;
12154 SetFrozen(intValue);
12155 }
12156 }
12157
12158 return true;
12159 }
12160
12161
12163 {
12166 {
12168 }
12169
12170 if (!super.OnStoreLoad(ctx, version))
12171 {
12173 return false;
12174 }
12175
12176 if (version >= 114)
12177 {
12178 bool hasQuickBarIndexSaved;
12179
12180 if (!ctx.
Read(hasQuickBarIndexSaved))
12181 {
12183 return false;
12184 }
12185
12186 if (hasQuickBarIndexSaved)
12187 {
12188 int itmQBIndex;
12189
12190
12191 if (!ctx.
Read(itmQBIndex))
12192 {
12194 return false;
12195 }
12196
12197 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12198 if (itmQBIndex != -1 && parentPlayer)
12199 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12200 }
12201 }
12202 else
12203 {
12204
12205 PlayerBase player;
12206 int itemQBIndex;
12207 if (version ==
int.
MAX)
12208 {
12209 if (!ctx.
Read(itemQBIndex))
12210 {
12212 return false;
12213 }
12214 }
12215 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12216 {
12217
12218 if (!ctx.
Read(itemQBIndex))
12219 {
12221 return false;
12222 }
12223 if (itemQBIndex != -1 && player)
12224 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12225 }
12226 }
12227
12228 if (version < 140)
12229 {
12230
12231 if (!LoadVariables(ctx, version))
12232 {
12234 return false;
12235 }
12236 }
12237
12238
12240 {
12242 return false;
12243 }
12244 if (version >= 132)
12245 {
12247 if (raib)
12248 {
12250 {
12252 return false;
12253 }
12254 }
12255 }
12256
12258 return true;
12259 }
12260
12261
12262
12264 {
12265 super.OnStoreSave(ctx);
12266
12267 PlayerBase player;
12268 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12269 {
12271
12272 int itemQBIndex = -1;
12273 itemQBIndex = player.FindQuickBarEntityIndex(this);
12274 ctx.
Write(itemQBIndex);
12275 }
12276 else
12277 {
12279 }
12280
12282
12284 if (raib)
12285 {
12287 }
12288 }
12289
12290
12292 {
12293 super.AfterStoreLoad();
12294
12296 {
12298 }
12299
12301 {
12304 }
12305 }
12306
12308 {
12309 super.EEOnAfterLoad();
12310
12312 {
12314 }
12315
12318 }
12319
12321 {
12322 return false;
12323 }
12324
12325
12326
12328 {
12330 {
12331 #ifdef PLATFORM_CONSOLE
12332
12334 {
12336 if (menu)
12337 {
12339 }
12340 }
12341 #endif
12342 }
12343
12345 {
12348 }
12349
12351 {
12352 SetWeightDirty();
12354 }
12356 {
12359 }
12360
12362 {
12365
12368 }
12370 {
12374 }
12375
12376 super.OnVariablesSynchronized();
12377 }
12378
12379
12380
12382 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12383 {
12384 if (!IsServerCheck(allow_client))
12385 return false;
12386
12388 return false;
12389
12392
12393 if (value <= (min + 0.001))
12394 value = min;
12395
12396 if (value == min)
12397 {
12398 if (destroy_config)
12399 {
12400 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12401 if (dstr)
12402 {
12404 this.Delete();
12405 return true;
12406 }
12407 }
12408 else if (destroy_forced)
12409 {
12411 this.Delete();
12412 return true;
12413 }
12414
12416 }
12417
12420
12422 {
12423 EntityAI parent = GetHierarchyRoot();
12424 InventoryLocation iLoc = new InventoryLocation();
12425 GetInventory().GetCurrentInventoryLocation(iLoc);
12427 {
12428 int iLocSlot = iLoc.
GetSlot();
12430 {
12432 }
12434 {
12436 }
12437 }
12438 }
12439
12441 {
12443
12444 if (delta)
12446 }
12447
12449
12450 return false;
12451 }
12452
12453
12455 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12456 {
12458 }
12459
12461 {
12464 }
12465
12467 {
12470 }
12471
12473 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12474 {
12475 float value_clamped = Math.Clamp(value, 0, 1);
12477 SetQuantity(result, destroy_config, destroy_forced);
12478 }
12479
12480
12483 {
12485 }
12486
12488 {
12490 }
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12502 {
12503 int slot = -1;
12504 GameInventory inventory = GetInventory();
12505 if (inventory)
12506 {
12507 InventoryLocation il = new InventoryLocation;
12510 }
12511
12513 }
12514
12516 {
12517 float quantity_max = 0;
12518
12520 {
12521 if (attSlotID != -1)
12522 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12523
12524 if (quantity_max <= 0)
12526 }
12527
12528 if (quantity_max <= 0)
12530
12531 return quantity_max;
12532 }
12533
12535 {
12537 }
12538
12540 {
12542 }
12543
12544
12546 {
12548 }
12549
12551 {
12553 }
12554
12556 {
12558 }
12559
12560
12562 {
12563
12564 float weightEx = GetWeightEx();
12565 float special = GetInventoryAndCargoWeight();
12566 return weightEx - special;
12567 }
12568
12569
12571 {
12573 }
12574
12576 {
12578 {
12579 #ifdef DEVELOPER
12580 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12581 {
12582 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12584 }
12585 #endif
12586
12587 return GetQuantity() * GetConfigWeightModified();
12588 }
12589 else if (HasEnergyManager())
12590 {
12591 #ifdef DEVELOPER
12592 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12593 {
12594 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12595 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12596 }
12597 #endif
12598 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12599 }
12600 else
12601 {
12602 #ifdef DEVELOPER
12603 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12604 {
12605 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12606 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12607 }
12608 #endif
12609 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12610 }
12611 }
12612
12615 {
12616 int item_count = 0;
12618
12619 GameInventory inventory = GetInventory();
12620 CargoBase cargo = inventory.
GetCargo();
12621 if (cargo != NULL)
12622 {
12624 }
12625
12627 for (int i = 0; i < nAttachments; ++i)
12628 {
12630 if (item)
12631 item_count += item.GetNumberOfItems();
12632 }
12633 return item_count;
12634 }
12635
12638 {
12639 float weight = 0;
12640 float wetness = 1;
12641 if (include_wetness)
12644 {
12645 weight = wetness * m_ConfigWeight;
12646 }
12648 {
12649 weight = 1;
12650 }
12651 return weight;
12652 }
12653
12654
12655
12657 {
12658 GameInventory inventory = GetInventory();
12659 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12660 {
12661 array<EntityAI> items = new array<EntityAI>;
12663 for (int i = 0; i < items.Count(); ++i)
12664 {
12666 if (item)
12667 {
12668 g_Game.ObjectDelete(item);
12669 }
12670 }
12671 }
12672 }
12673
12674
12675
12676
12678 {
12679 float energy = 0;
12680 if (HasEnergyManager())
12681 {
12682 energy = GetCompEM().GetEnergy();
12683 }
12684 return energy;
12685 }
12686
12687
12689 {
12690 super.OnEnergyConsumed();
12691
12693 }
12694
12696 {
12697 super.OnEnergyAdded();
12698
12700 }
12701
12702
12704 {
12705 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12706 {
12708 {
12709 float energy_0to1 = GetCompEM().GetEnergy0To1();
12711 }
12712 }
12713 }
12714
12715
12717 {
12718 return ConfigGetFloat("heatIsolation");
12719 }
12720
12722 {
12724 }
12725
12727 {
12728 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12729 if (
g_Game.ConfigIsExisting(paramPath))
12730 return g_Game.ConfigGetFloat(paramPath);
12731
12732 return 0.0;
12733 }
12734
12736 {
12737 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12738 if (
g_Game.ConfigIsExisting(paramPath))
12739 return g_Game.ConfigGetFloat(paramPath);
12740
12741 return 0.0;
12742 }
12743
12744 override void SetWet(
float value,
bool allow_client =
false)
12745 {
12746 if (!IsServerCheck(allow_client))
12747 return;
12748
12751
12753
12754 m_VarWet = Math.Clamp(value, min, max);
12755
12757 {
12760 }
12761 }
12762
12763 override void AddWet(
float value)
12764 {
12766 }
12767
12769 {
12771 }
12772
12774 {
12776 }
12777
12779 {
12781 }
12782
12784 {
12786 }
12787
12789 {
12791 }
12792
12793 override void OnWetChanged(
float newVal,
float oldVal)
12794 {
12797 if (newLevel != oldLevel)
12798 {
12800 }
12801 }
12802
12804 {
12805 SetWeightDirty();
12806 }
12807
12809 {
12810 return GetWetLevelInternal(
m_VarWet);
12811 }
12812
12813
12814
12816 {
12818 }
12819
12821 {
12823 }
12824
12826 {
12828 }
12829
12831 {
12833 }
12834
12835
12836
12838 {
12839 if (ConfigIsExisting("itemModelLength"))
12840 {
12841 return ConfigGetFloat("itemModelLength");
12842 }
12843 return 0;
12844 }
12845
12847 {
12848 if (ConfigIsExisting("itemAttachOffset"))
12849 {
12850 return ConfigGetFloat("itemAttachOffset");
12851 }
12852 return 0;
12853 }
12854
12855 override void SetCleanness(
int value,
bool allow_client =
false)
12856 {
12857 if (!IsServerCheck(allow_client))
12858 return;
12859
12861
12863
12866 }
12867
12869 {
12871 }
12872
12874 {
12875 return true;
12876 }
12877
12878
12879
12880
12882 {
12884 }
12885
12887 {
12889 }
12890
12891
12892
12893
12894 override void SetColor(
int r,
int g,
int b,
int a)
12895 {
12901 }
12903 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12904 {
12909 }
12910
12912 {
12914 }
12915
12918 {
12919 int r,g,b,a;
12921 r = r/255;
12922 g = g/255;
12923 b = b/255;
12924 a = a/255;
12925 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12926 }
12927
12928
12929
12930 override void SetLiquidType(
int value,
bool allow_client =
false)
12931 {
12932 if (!IsServerCheck(allow_client))
12933 return;
12934
12939 }
12940
12942 {
12943 return ConfigGetInt("varLiquidTypeInit");
12944 }
12945
12947 {
12949 }
12950
12952 {
12954 SetFrozen(false);
12955 }
12956
12959 {
12960 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12961 }
12962
12963
12966 {
12967 PlayerBase nplayer;
12968 if (PlayerBase.CastTo(nplayer, player))
12969 {
12971 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12972 }
12973 }
12974
12975
12978 {
12979 PlayerBase nplayer;
12980 if (PlayerBase.CastTo(nplayer,player))
12981 {
12982 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12983 }
12984
12985 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12986
12987 if (HasEnergyManager())
12988 {
12989 GetCompEM().UpdatePlugState();
12990 }
12991 }
12992
12993
12995 {
12996 super.OnPlacementStarted(player);
12997
12999 }
13000
13001 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13002 {
13004 {
13005 m_AdminLog.OnPlacementComplete(player,
this);
13006 }
13007
13008 super.OnPlacementComplete(player, position, orientation);
13009 }
13010
13011
13012
13013
13014
13016 {
13018 {
13019 return true;
13020 }
13021 else
13022 {
13023 return false;
13024 }
13025 }
13026
13027
13029 {
13031 {
13033 }
13034 }
13035
13036
13038 {
13040 }
13041
13043 {
13045 }
13046
13047 override void InsertAgent(
int agent,
float count = 1)
13048 {
13049 if (count < 1)
13050 return;
13051
13053 }
13054
13057 {
13059 }
13060
13061
13063 {
13065 }
13066
13067
13068
13069
13070
13071
13072
13073
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
13109 {
13111 return false;
13112 return true;
13113 }
13114
13116 {
13117
13119 }
13120
13121
13124 {
13125 super.CheckForRoofLimited(timeTresholdMS);
13126
13127 float time =
g_Game.GetTime();
13128 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13129 {
13130 m_PreviousRoofTestTime = time;
13131 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13132 }
13133 }
13134
13135
13137 {
13139 {
13140 return 0;
13141 }
13142
13143 if (GetInventory().GetAttachmentSlotsCount() != 0)
13144 {
13145 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13146 if (filter)
13147 return filter.GetProtectionLevel(type, false, system);
13148 else
13149 return 0;
13150 }
13151
13152 string subclassPath, entryName;
13153
13154 switch (type)
13155 {
13157 entryName = "biological";
13158 break;
13160 entryName = "chemical";
13161 break;
13162 default:
13163 entryName = "biological";
13164 break;
13165 }
13166
13167 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13168
13169 return g_Game.ConfigGetFloat(subclassPath + entryName);
13170 }
13171
13172
13173
13176 {
13177 if (!IsMagazine())
13179
13181 }
13182
13183
13184
13185
13186
13191 {
13192 return true;
13193 }
13194
13196 {
13198 }
13199
13200
13201
13202
13203
13205 {
13206 if (parent)
13207 {
13208 if (parent.IsInherited(DayZInfected))
13209 return true;
13210
13211 if (!parent.IsRuined())
13212 return true;
13213 }
13214
13215 return true;
13216 }
13217
13219 {
13220 if (!super.CanPutAsAttachment(parent))
13221 {
13222 return false;
13223 }
13224
13225 if (!IsRuined() && !parent.IsRuined())
13226 {
13227 return true;
13228 }
13229
13230 return false;
13231 }
13232
13234 {
13235
13236
13237
13238
13239 return super.CanReceiveItemIntoCargo(item);
13240 }
13241
13243 {
13244
13245
13246
13247
13248 GameInventory attachmentInv = attachment.GetInventory();
13250 {
13251 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13252 return false;
13253 }
13254
13255 InventoryLocation loc = new InventoryLocation();
13256 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13257 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13258 return false;
13259
13260 return super.CanReceiveAttachment(attachment, slotId);
13261 }
13262
13264 {
13265 if (!super.CanReleaseAttachment(attachment))
13266 return false;
13267
13268 return GetInventory().AreChildrenAccessible();
13269 }
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13292 {
13293 int id = muzzle_owner.GetMuzzleID();
13294 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13295
13296 if (WPOF_array)
13297 {
13298 for (int i = 0; i < WPOF_array.Count(); i++)
13299 {
13300 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13301
13302 if (WPOF)
13303 {
13304 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13305 }
13306 }
13307 }
13308 }
13309
13310
13312 {
13313 int id = muzzle_owner.GetMuzzleID();
13315
13316 if (WPOBE_array)
13317 {
13318 for (int i = 0; i < WPOBE_array.Count(); i++)
13319 {
13320 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13321
13322 if (WPOBE)
13323 {
13324 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13325 }
13326 }
13327 }
13328 }
13329
13330
13332 {
13333 int id = muzzle_owner.GetMuzzleID();
13334 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13335
13336 if (WPOOH_array)
13337 {
13338 for (int i = 0; i < WPOOH_array.Count(); i++)
13339 {
13340 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13341
13342 if (WPOOH)
13343 {
13344 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13345 }
13346 }
13347 }
13348 }
13349
13350
13352 {
13353 int id = muzzle_owner.GetMuzzleID();
13354 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13355
13356 if (WPOOH_array)
13357 {
13358 for (int i = 0; i < WPOOH_array.Count(); i++)
13359 {
13360 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13361
13362 if (WPOOH)
13363 {
13364 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13365 }
13366 }
13367 }
13368 }
13369
13370
13372 {
13373 int id = muzzle_owner.GetMuzzleID();
13374 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13375
13376 if (WPOOH_array)
13377 {
13378 for (int i = 0; i < WPOOH_array.Count(); i++)
13379 {
13380 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13381
13382 if (WPOOH)
13383 {
13384 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13385 }
13386 }
13387 }
13388 }
13389
13390
13391
13393 {
13395 {
13396 return true;
13397 }
13398
13399 return false;
13400 }
13401
13403 {
13405 {
13406 return true;
13407 }
13408
13409 return false;
13410 }
13411
13413 {
13415 {
13416 return true;
13417 }
13418
13419 return false;
13420 }
13421
13423 {
13424 return false;
13425 }
13426
13429 {
13430 return UATimeSpent.DEFAULT_DEPLOY;
13431 }
13432
13433
13434
13435
13437 {
13439 SetSynchDirty();
13440 }
13441
13443 {
13445 }
13446
13447
13449 {
13450 return false;
13451 }
13452
13455 {
13456 string att_type = "None";
13457
13458 if (ConfigIsExisting("soundAttType"))
13459 {
13460 att_type = ConfigGetString("soundAttType");
13461 }
13462
13464 }
13465
13467 {
13469 }
13470
13471
13472
13473
13474
13480
13482 {
13485
13487 }
13488
13489
13491 {
13493 return;
13494
13496
13499
13502
13503 SoundParameters params = new SoundParameters();
13507 }
13508
13509
13511 {
13513 {
13516
13517 SetSynchDirty();
13518
13521 }
13522 }
13523
13525 {
13527 }
13528
13529
13531 {
13533 return;
13534
13536 SetSynchDirty();
13537
13540 }
13541
13543 {
13546 }
13547
13549 {
13551 }
13552
13553 void OnApply(PlayerBase player);
13554
13556 {
13557 return 1.0;
13558 };
13559
13561 {
13563 }
13564
13566 {
13568 }
13569
13571
13573 {
13574 SetDynamicPhysicsLifeTime(0.01);
13576 }
13577
13579 {
13580 array<string> zone_names = new array<string>;
13581 GetDamageZones(zone_names);
13582 for (int i = 0; i < zone_names.Count(); i++)
13583 {
13584 SetHealthMax(zone_names.Get(i),"Health");
13585 }
13586 SetHealthMax("","Health");
13587 }
13588
13591 {
13592 float global_health = GetHealth01("","Health");
13593 array<string> zones = new array<string>;
13594 GetDamageZones(zones);
13595
13596 for (int i = 0; i < zones.Count(); i++)
13597 {
13598 SetHealth01(zones.Get(i),"Health",global_health);
13599 }
13600 }
13601
13604 {
13605 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13606 }
13607
13609 {
13610 if (!hasRootAsPlayer)
13611 {
13612 if (refParentIB)
13613 {
13614
13615 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13616 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13617
13618 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13619 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13620
13623 }
13624 else
13625 {
13626
13629 }
13630 }
13631 }
13632
13634 {
13636 {
13637 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13638 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13639 {
13640 float heatPermCoef = 1.0;
13642 while (ent)
13643 {
13644 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13645 ent = ent.GetHierarchyParent();
13646 }
13647
13648 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13649 }
13650 }
13651 }
13652
13654 {
13655
13656 EntityAI parent = GetHierarchyParent();
13657 if (!parent)
13658 {
13659 hasParent = false;
13660 hasRootAsPlayer = false;
13661 }
13662 else
13663 {
13664 hasParent = true;
13665 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13666 refParentIB =
ItemBase.Cast(parent);
13667 }
13668 }
13669
13670 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13671 {
13672
13673 }
13674
13676 {
13677
13678 return false;
13679 }
13680
13682 {
13683
13684
13685 return false;
13686 }
13687
13689 {
13690
13691 return false;
13692 }
13693
13696 {
13697 return !GetIsFrozen() &&
IsOpen();
13698 }
13699
13701 {
13702 bool hasParent = false, hasRootAsPlayer = false;
13704
13705 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13706 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13707
13708 if (wwtu || foodDecay)
13709 {
13713
13714 if (processWetness || processTemperature || processDecay)
13715 {
13717
13718 if (processWetness)
13719 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13720
13721 if (processTemperature)
13723
13724 if (processDecay)
13725 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13726 }
13727 }
13728 }
13729
13732 {
13734 }
13735
13737 {
13740
13741 return super.GetTemperatureFreezeThreshold();
13742 }
13743
13745 {
13748
13749 return super.GetTemperatureThawThreshold();
13750 }
13751
13753 {
13756
13757 return super.GetItemOverheatThreshold();
13758 }
13759
13761 {
13763 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13764
13765 return super.GetTemperatureFreezeTime();
13766 }
13767
13769 {
13771 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13772
13773 return super.GetTemperatureThawTime();
13774 }
13775
13780
13782 {
13783 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13784 }
13785
13787 {
13788 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13789 }
13790
13793 {
13795 }
13796
13798 {
13800 }
13801
13803 {
13805 }
13806
13809 {
13810 return null;
13811 }
13812
13815 {
13816 return false;
13817 }
13818
13820 {
13822 {
13825 if (!trg)
13826 {
13828 explosive = this;
13829 }
13830
13831 explosive.PairRemote(trg);
13833
13834 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13835 trg.SetPersistentPairID(persistentID);
13836 explosive.SetPersistentPairID(persistentID);
13837
13838 return true;
13839 }
13840 return false;
13841 }
13842
13845 {
13846 float ret = 1.0;
13849 ret *= GetHealth01();
13850
13851 return ret;
13852 }
13853
13854 #ifdef DEVELOPER
13855 override void SetDebugItem()
13856 {
13857 super.SetDebugItem();
13858 _itemBase = this;
13859 }
13860
13862 {
13863 string text = super.GetDebugText();
13864
13866 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13867
13868 return text;
13869 }
13870 #endif
13871
13873 {
13874 return true;
13875 }
13876
13878
13880
13882 {
13885 }
13886
13887
13895
13911
13912 [
Obsolete(
"Use ItemSoundHandler instead")]
13915 {
13916 if (!
g_Game.IsDedicatedServer())
13917 {
13918 if (ConfigIsExisting("attachSoundSet"))
13919 {
13920 string cfg_path = "";
13921 string soundset = "";
13922 string type_name =
GetType();
13923
13926 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13927 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13928
13929 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13930 {
13931 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13932 {
13933 if (cfg_slot_array[i] == slot_type)
13934 {
13935 soundset = cfg_soundset_array[i];
13936 break;
13937 }
13938 }
13939 }
13940
13941 if (soundset != "")
13942 {
13943 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13945 }
13946 }
13947 }
13948 }
13949
13951}
13952
13954{
13956 if (entity)
13957 {
13958 bool is_item = entity.IsInherited(
ItemBase);
13959 if (is_item && full_quantity)
13960 {
13963 }
13964 }
13965 else
13966 {
13968 return NULL;
13969 }
13970 return entity;
13971}
13972
13974{
13975 if (item)
13976 {
13977 if (health > 0)
13978 item.SetHealth("", "", health);
13979
13980 if (item.CanHaveTemperature())
13981 {
13983 if (item.CanFreeze())
13984 item.SetFrozen(false);
13985 }
13986
13987 if (item.HasEnergyManager())
13988 {
13989 if (quantity >= 0)
13990 {
13991 item.GetCompEM().SetEnergy0To1(quantity);
13992 }
13993 else
13994 {
13996 }
13997 }
13998 else if (item.IsMagazine())
13999 {
14000 Magazine mag = Magazine.Cast(item);
14001 if (quantity >= 0)
14002 {
14003 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14004 }
14005 else
14006 {
14008 }
14009
14010 }
14011 else
14012 {
14013 if (quantity >= 0)
14014 {
14015 item.SetQuantityNormalized(quantity, false);
14016 }
14017 else
14018 {
14020 }
14021
14022 }
14023 }
14024}
14025
14026#ifdef DEVELOPER
14028#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.