8890{
8892 {
8893 return true;
8894 }
8895};
8896
8898{
8899
8900};
8901
8902
8903
8905{
8909
8911
8914
8915
8916
8917
8918
8927
8933
8938
8943
8964 protected bool m_IsResultOfSplit
8965
8967
8972
8973
8974
8976
8980
8981
8982
8984
8987
8988
8989
8995
8996
9004
9007
9008
9010
9011
9013
9014
9019
9020
9025
9027
9028
9030
9031
9033 {
9038
9039 if (!
g_Game.IsDedicatedServer())
9040 {
9042 {
9044
9046 {
9048 }
9049 }
9050
9053 }
9054
9055 m_OldLocation = null;
9056
9058 {
9060 }
9061
9062 if (ConfigIsExisting("headSelectionsToHide"))
9063 {
9066 }
9067
9069 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9070 {
9072 }
9073
9075
9076 m_IsResultOfSplit = false;
9077
9079 }
9080
9082 {
9083 super.InitItemVariables();
9084
9090 m_Count = ConfigGetInt(
"count");
9091
9094
9099
9102
9107
9119
9123
9124
9127 if (ConfigIsExisting("canBeSplit"))
9128 {
9131 }
9132
9134 if (ConfigIsExisting("itemBehaviour"))
9136
9137
9140 RegisterNetSyncVariableInt("m_VarLiquidType");
9141 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9142
9143 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9144 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9145 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9146
9147 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9148 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9149 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9150 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9151
9152 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9153 RegisterNetSyncVariableBool("m_IsTakeable");
9154 RegisterNetSyncVariableBool("m_IsHologram");
9155
9158 {
9161 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9162 }
9163
9165
9167 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9169
9171 }
9172
9174 {
9176 }
9177
9179 {
9182 {
9187 }
9188 }
9189
9190 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9191 {
9193 {
9196 }
9197
9199 }
9200
9202 {
9208 }
9209
9211
9213 {
9215
9216 if (!action)
9217 {
9218 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9219 return;
9220 }
9221
9223 if (!ai)
9224 {
9226 return;
9227 }
9228
9230 if (!action_array)
9231 {
9232 action_array = new array<ActionBase_Basic>;
9234 }
9235 if (LogManager.IsActionLogEnable())
9236 {
9237 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9238 }
9239
9240 if (action_array.Find(action) != -1)
9241 {
9242 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9243 }
9244 else
9245 {
9246 action_array.Insert(action);
9247 }
9248 }
9249
9251 {
9252 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9253 ActionBase action = player.GetActionManager().GetAction(actionName);
9256
9257 if (action_array)
9258 {
9259 action_array.RemoveItem(action);
9260 }
9261 }
9262
9263
9264
9266 {
9267 ActionOverrideData overrideData = new ActionOverrideData();
9271
9273 if (!actionMap)
9274 {
9277 }
9278
9279 actionMap.Insert(this.
Type(), overrideData);
9280
9281 }
9282
9284
9286
9287
9289 {
9292
9295
9296 string config_to_search = "CfgVehicles";
9297 string muzzle_owner_config;
9298
9300 {
9301 if (IsInherited(Weapon))
9302 config_to_search = "CfgWeapons";
9303
9304 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9305
9306 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9307
9308 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9309
9310 if (config_OnFire_subclass_count > 0)
9311 {
9312 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9313
9314 for (int i = 0; i < config_OnFire_subclass_count; i++)
9315 {
9316 string particle_class = "";
9317 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9318 string config_OnFire_entry = config_OnFire_class + particle_class;
9319 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9320 WPOF_array.Insert(WPOF);
9321 }
9322
9323
9325 }
9326 }
9327
9329 {
9330 config_to_search = "CfgWeapons";
9331 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9332
9333 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9334
9335 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9336
9337 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9338 {
9339 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9340
9341 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9342 {
9343 string particle_class2 = "";
9344 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9345 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9346 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9347 WPOBE_array.Insert(WPOBE);
9348 }
9349
9350
9352 }
9353 }
9354 }
9355
9356
9358 {
9361
9363 {
9364 string config_to_search = "CfgVehicles";
9365
9366 if (IsInherited(Weapon))
9367 config_to_search = "CfgWeapons";
9368
9369 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9370 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9371
9372 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9373 {
9374
9376
9378 {
9380 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9382 return;
9383 }
9384
9387
9388
9389
9390 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9391 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9392
9393 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9394 {
9395 string particle_class = "";
9396 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9397 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9398 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9399
9400 if (entry_type == CT_CLASS)
9401 {
9402 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9403 WPOOH_array.Insert(WPOF);
9404 }
9405 }
9406
9407
9409 }
9410 }
9411 }
9412
9414 {
9416 }
9417
9419 {
9421 {
9423
9426
9429
9430 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9431 }
9432 }
9433
9435 {
9437 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9438
9440 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9441
9443 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9444
9446 {
9448 }
9449 }
9450
9452 {
9454 }
9455
9457 {
9460 else
9462
9464 {
9467 }
9468 else
9469 {
9472
9475 }
9476
9478 }
9479
9481 {
9483 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9484 }
9485
9487 {
9489 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9491 }
9492
9494 {
9496 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9497 }
9498
9500 {
9503
9504 OverheatingParticle OP = new OverheatingParticle();
9509
9511 }
9512
9514 {
9517
9518 return -1;
9519 }
9520
9522 {
9524 {
9527
9528 for (int i = count; i > 0; --i)
9529 {
9530 int id = i - 1;
9533
9536
9537 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9538 {
9539 if (p)
9540 {
9543 }
9544 }
9545 }
9546 }
9547 }
9548
9550 {
9552 {
9554 {
9555 int id = i - 1;
9557
9558 if (OP)
9559 {
9561
9562 if (p)
9563 {
9565 }
9566
9567 delete OP;
9568 }
9569 }
9570
9573 }
9574 }
9575
9578 {
9579 return 0.0;
9580 }
9581
9582
9584 {
9585 return 250;
9586 }
9587
9589 {
9590 return 0;
9591 }
9592
9595 {
9597 return true;
9598
9599 return false;
9600 }
9601
9604 {
9607
9609 {
9611 }
9612 else
9613 {
9614
9616 }
9617
9619 }
9620
9627 {
9628 return -1;
9629 }
9630
9631
9632
9633
9635 {
9637 {
9638 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9639 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9640
9641 if (r_index >= 0)
9642 {
9643 InventoryLocation r_il = new InventoryLocation;
9644 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9645
9646 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9649 {
9650 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9651 }
9653 {
9654 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9655 }
9656
9657 }
9658
9659 player.GetHumanInventory().ClearUserReservedLocation(this);
9660 }
9661
9664 }
9665
9666
9667
9668
9670 {
9671 return ItemBase.m_DebugActionsMask;
9672 }
9673
9675 {
9676 return ItemBase.m_DebugActionsMask & mask;
9677 }
9678
9680 {
9681 ItemBase.m_DebugActionsMask = mask;
9682 }
9683
9685 {
9686 ItemBase.m_DebugActionsMask |= mask;
9687 }
9688
9690 {
9691 ItemBase.m_DebugActionsMask &= ~mask;
9692 }
9693
9695 {
9697 {
9699 }
9700 else
9701 {
9703 }
9704 }
9705
9706
9708 {
9709 if (GetEconomyProfile())
9710 {
9711 float q_max = GetEconomyProfile().GetQuantityMax();
9712 if (q_max > 0)
9713 {
9714 float q_min = GetEconomyProfile().GetQuantityMin();
9715 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9716
9718 {
9719 ComponentEnergyManager comp = GetCompEM();
9721 {
9723 }
9724 }
9726 {
9728
9729 }
9730
9731 }
9732 }
9733 }
9734
9737 {
9738 EntityAI parent = GetHierarchyParent();
9739
9740 if (parent)
9741 {
9742 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9743 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9744 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9745 }
9746 }
9747
9750 {
9751 EntityAI parent = GetHierarchyParent();
9752
9753 if (parent)
9754 {
9755 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9756 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9757 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9758 }
9759 }
9760
9762 {
9763
9764
9765
9766
9768
9770 {
9771 if (ScriptInputUserData.CanStoreInputUserData())
9772 {
9773 ScriptInputUserData ctx = new ScriptInputUserData;
9779 ctx.
Write(use_stack_max);
9782
9784 {
9785 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9786 }
9787 }
9788 }
9789 else if (!
g_Game.IsMultiplayer())
9790 {
9792 }
9793 }
9794
9796 {
9798 }
9799
9801 {
9803 }
9804
9806 {
9808 }
9809
9811 {
9812
9813 return false;
9814 }
9815
9817 {
9818 return false;
9819 }
9820
9824 {
9825 return false;
9826 }
9827
9829 {
9830 return "";
9831 }
9832
9834
9836 {
9837 return false;
9838 }
9839
9841 {
9842 return true;
9843 }
9844
9845
9846
9848 {
9849 return true;
9850 }
9851
9853 {
9854 return true;
9855 }
9856
9858 {
9859 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9861 }
9862
9864 {
9866 }
9867
9869 {
9871 if (!is_being_placed)
9873 SetSynchDirty();
9874 }
9875
9876
9878
9880 {
9882 }
9883
9885 {
9887 }
9888
9890 {
9891 return 1;
9892 }
9893
9895 {
9896 return false;
9897 }
9898
9900 {
9902 SetSynchDirty();
9903 }
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9940 {
9941 super.OnMovedInsideCargo(container);
9942
9943 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9944 }
9945
9946 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9947 {
9948 super.EEItemLocationChanged(oldLoc, newLoc);
9949
9950 PlayerBase newPlayer = null;
9951 PlayerBase oldPlayer = null;
9952
9953 if (newLoc.GetParent())
9954 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9955
9956 if (oldLoc.GetParent())
9957 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9958
9960 {
9961 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9962
9963 if (rIndex >= 0)
9964 {
9965 InventoryLocation rIl = new InventoryLocation;
9966 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9967
9968 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9971 {
9972 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9973 }
9975 {
9977 }
9978
9979 }
9980 }
9981
9983 {
9984 if (newPlayer)
9985 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9986
9987 if (newPlayer == oldPlayer)
9988 {
9989 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9990 {
9992 {
9993 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9994 {
9995 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9996 }
9997 }
9998 else
9999 {
10000 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10001 }
10002 }
10003
10004 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10005 {
10006 int type = oldLoc.GetType();
10008 {
10009 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10010 }
10012 {
10013 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10014 }
10015 }
10016 if (!m_OldLocation)
10017 {
10018 m_OldLocation = new InventoryLocation;
10019 }
10020 m_OldLocation.Copy(oldLoc);
10021 }
10022 else
10023 {
10024 if (m_OldLocation)
10025 {
10026 m_OldLocation.Reset();
10027 }
10028 }
10029
10030 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10031 }
10032 else
10033 {
10034 if (newPlayer)
10035 {
10036 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10037 if (resIndex >= 0)
10038 {
10039 InventoryLocation il = new InventoryLocation;
10040 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10042 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10045 {
10046 il.
GetParent().GetOnReleaseLock().Invoke(it);
10047 }
10049 {
10051 }
10052
10053 }
10054 }
10056 {
10057
10059 }
10060
10061 if (m_OldLocation)
10062 {
10063 m_OldLocation.Reset();
10064 }
10065 }
10066
10068 {
10069 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10070 }
10071
10073 {
10074 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10075 }
10076 }
10077
10078 override void EOnContact(IEntity other, Contact extra)
10079 {
10081 {
10082 int liquidType = -1;
10084 if (impactSpeed > 0.0)
10085 {
10087 #ifndef SERVER
10089 #else
10091 SetSynchDirty();
10092 #endif
10094 }
10095 }
10096
10097 #ifdef SERVER
10098 if (GetCompEM() && GetCompEM().IsPlugged())
10099 {
10100 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10101 GetCompEM().UnplugThis();
10102 }
10103 #endif
10104 }
10105
10107
10109 {
10111 }
10112
10114 {
10115
10116 }
10117
10119 {
10120 super.OnItemLocationChanged(old_owner, new_owner);
10121
10122 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10123 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10124
10125 if (!relatedPlayer && playerNew)
10126 relatedPlayer = playerNew;
10127
10128 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10129 {
10131 if (actionMgr)
10132 {
10133 ActionBase currentAction = actionMgr.GetRunningAction();
10134 if (currentAction)
10136 }
10137 }
10138
10139 Man ownerPlayerOld = null;
10140 Man ownerPlayerNew = null;
10141
10142 if (old_owner)
10143 {
10144 if (old_owner.
IsMan())
10145 {
10146 ownerPlayerOld = Man.Cast(old_owner);
10147 }
10148 else
10149 {
10150 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10151 }
10152 }
10153 else
10154 {
10156 {
10158
10159 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10160 {
10161 GetCompEM().UnplugThis();
10162 }
10163 }
10164 }
10165
10166 if (new_owner)
10167 {
10168 if (new_owner.
IsMan())
10169 {
10170 ownerPlayerNew = Man.Cast(new_owner);
10171 }
10172 else
10173 {
10174 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10175 }
10176 }
10177
10178 if (ownerPlayerOld != ownerPlayerNew)
10179 {
10180 if (ownerPlayerOld)
10181 {
10182 array<EntityAI> subItemsExit = new array<EntityAI>;
10184 for (int i = 0; i < subItemsExit.Count(); i++)
10185 {
10188 }
10189 }
10190
10191 if (ownerPlayerNew)
10192 {
10193 array<EntityAI> subItemsEnter = new array<EntityAI>;
10195 for (int j = 0; j < subItemsEnter.Count(); j++)
10196 {
10199 }
10200 }
10201 }
10202 else if (ownerPlayerNew != null)
10203 {
10204 PlayerBase nplayer;
10205 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10206 {
10207 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10209 for (int k = 0; k < subItemsUpdate.Count(); k++)
10210 {
10212 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10213 }
10214 }
10215 }
10216
10217 if (old_owner)
10218 old_owner.OnChildItemRemoved(this);
10219 if (new_owner)
10220 new_owner.OnChildItemReceived(this);
10221 }
10222
10223
10225 {
10226 super.EEDelete(parent);
10227 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10228 if (player)
10229 {
10231
10232 if (player.IsAlive())
10233 {
10234 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10235 if (r_index >= 0)
10236 {
10237 InventoryLocation r_il = new InventoryLocation;
10238 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10239
10240 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10243 {
10244 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10245 }
10247 {
10248 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10249 }
10250
10251 }
10252
10253 player.RemoveQuickBarEntityShortcut(this);
10254 }
10255 }
10256 }
10257
10259 {
10260 super.EEKilled(killer);
10261
10264 {
10265 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10266 {
10267 if (IsMagazine())
10268 {
10269 if (Magazine.Cast(this).GetAmmoCount() > 0)
10270 {
10272 }
10273 }
10274 else
10275 {
10277 }
10278 }
10279 }
10280 }
10281
10283 {
10284 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10285
10286 super.OnWasAttached(parent, slot_id);
10287
10290
10293 }
10294
10296 {
10297 super.OnWasDetached(parent, slot_id);
10298
10301
10304 }
10305
10307 {
10308 int idx;
10311
10312 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10313 if (inventory_slots.Count() < 1)
10314 {
10315 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10316 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10317 }
10318 else
10319 {
10320 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10321 }
10322
10323 idx = inventory_slots.Find(slot);
10324 if (idx < 0)
10325 return "";
10326
10327 return attach_types.Get(idx);
10328 }
10329
10331 {
10332 int idx = -1;
10333 string slot;
10334
10337
10338 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10339 if (inventory_slots.Count() < 1)
10340 {
10341 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10342 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10343 }
10344 else
10345 {
10346 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10347 if (detach_types.Count() < 1)
10348 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10349 }
10350
10351 for (int i = 0; i < inventory_slots.Count(); i++)
10352 {
10353 slot = inventory_slots.Get(i);
10354 }
10355
10356 if (slot != "")
10357 {
10358 if (detach_types.Count() == 1)
10359 idx = 0;
10360 else
10361 idx = inventory_slots.Find(slot);
10362 }
10363 if (idx < 0)
10364 return "";
10365
10366 return detach_types.Get(idx);
10367 }
10368
10370 {
10371
10373
10374
10375 float min_time = 1;
10376 float max_time = 3;
10377 float delay = Math.RandomFloat(min_time, max_time);
10378
10379 explode_timer.Run(delay, this, "DoAmmoExplosion");
10380 }
10381
10383 {
10384 Magazine magazine = Magazine.Cast(this);
10385 int pop_sounds_count = 6;
10386 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10387
10388
10389 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10390 string sound_name = pop_sounds[ sound_idx ];
10391 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10392
10393
10394 magazine.ServerAddAmmoCount(-1);
10395
10396
10397 float min_temp_to_explode = 100;
10398
10399 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10400 {
10402 }
10403 }
10404
10405
10406 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10407 {
10408 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10409
10410 const int CHANCE_DAMAGE_CARGO = 4;
10411 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10412 const int CHANCE_DAMAGE_NOTHING = 2;
10413
10415 {
10416 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10417 int chances;
10418 int rnd;
10419
10420 if (GetInventory().GetCargo())
10421 {
10422 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10423 rnd = Math.RandomInt(0,chances);
10424
10425 if (rnd < CHANCE_DAMAGE_CARGO)
10426 {
10428 }
10429 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10430 {
10432 }
10433 }
10434 else
10435 {
10436 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10437 rnd = Math.RandomInt(0,chances);
10438
10439 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10440 {
10442 }
10443 }
10444 }
10445 }
10446
10448 {
10449 CargoBase cargo = GetInventory().GetCargo();
10450 if (cargo)
10451 {
10453 if (item_count > 0)
10454 {
10455 int random_pick = Math.RandomInt(0, item_count);
10457 if (!item.IsExplosive())
10458 {
10459 item.AddHealth("","",damage);
10460 return true;
10461 }
10462 }
10463 }
10464 return false;
10465 }
10466
10468 {
10469 GameInventory inventory = GetInventory();
10471 if (attachment_count > 0)
10472 {
10473 int random_pick = Math.RandomInt(0, attachment_count);
10475 if (!attachment.IsExplosive())
10476 {
10477 attachment.AddHealth("","",damage);
10478 return true;
10479 }
10480 }
10481 return false;
10482 }
10483
10485 {
10487 }
10488
10490 {
10492 return GetInventory().CanRemoveEntity();
10493
10494 return false;
10495 }
10496
10498 {
10499
10501 return false;
10502
10503
10505 return false;
10506
10507
10508
10510 if (delta == 0)
10511 return false;
10512
10513
10514 return true;
10515 }
10516
10518 {
10520 {
10521 if (ScriptInputUserData.CanStoreInputUserData())
10522 {
10523 ScriptInputUserData ctx = new ScriptInputUserData;
10528 ctx.
Write(destination_entity);
10530 ctx.
Write(slot_id);
10532 }
10533 }
10534 else if (!
g_Game.IsMultiplayer())
10535 {
10537 }
10538 }
10539
10541 {
10542 float split_quantity_new;
10546 InventoryLocation loc = new InventoryLocation;
10547
10548 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10549 {
10551 split_quantity_new = stack_max;
10552 else
10554
10556 {
10557 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10558 if (new_item)
10559 {
10560 new_item.SetResultOfSplit(true);
10561 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10563 new_item.
SetQuantity(split_quantity_new,
false,
true);
10564 }
10565 }
10566 }
10567 else if (destination_entity && slot_id == -1)
10568 {
10569 if (quantity > stack_max)
10570 split_quantity_new = stack_max;
10571 else
10572 split_quantity_new = quantity;
10573
10575 {
10576 GameInventory destinationInventory = destination_entity.GetInventory();
10578 {
10581 }
10582
10583 if (new_item)
10584 {
10585 new_item.SetResultOfSplit(true);
10586 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10588 new_item.
SetQuantity(split_quantity_new,
false,
true);
10589 }
10590 }
10591 }
10592 else
10593 {
10594 if (stack_max != 0)
10595 {
10597 {
10599 }
10600
10601 if (split_quantity_new == 0)
10602 {
10603 if (!
g_Game.IsMultiplayer())
10604 player.PhysicalPredictiveDropItem(this);
10605 else
10606 player.ServerDropEntity(this);
10607 return;
10608 }
10609
10611 {
10613
10614 if (new_item)
10615 {
10616 new_item.SetResultOfSplit(true);
10617 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10620 new_item.PlaceOnSurface();
10621 }
10622 }
10623 }
10624 }
10625 }
10626
10628 {
10629 float split_quantity_new;
10633 InventoryLocation loc = new InventoryLocation;
10634
10635 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10636 {
10638 split_quantity_new = stack_max;
10639 else
10641
10643 {
10644 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10645 if (new_item)
10646 {
10647 new_item.SetResultOfSplit(true);
10648 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10650 new_item.
SetQuantity(split_quantity_new,
false,
true);
10651 }
10652 }
10653 }
10654 else if (destination_entity && slot_id == -1)
10655 {
10656 if (quantity > stack_max)
10657 split_quantity_new = stack_max;
10658 else
10659 split_quantity_new = quantity;
10660
10662 {
10663 GameInventory destinationInventory = destination_entity.GetInventory();
10665 {
10668 }
10669
10670 if (new_item)
10671 {
10672 new_item.SetResultOfSplit(true);
10673 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10675 new_item.
SetQuantity(split_quantity_new,
false,
true);
10676 }
10677 }
10678 }
10679 else
10680 {
10681 if (stack_max != 0)
10682 {
10684 {
10686 }
10687
10689 {
10691
10692 if (new_item)
10693 {
10694 new_item.SetResultOfSplit(true);
10695 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10698 new_item.PlaceOnSurface();
10699 }
10700 }
10701 }
10702 }
10703 }
10704
10706 {
10708 {
10709 if (ScriptInputUserData.CanStoreInputUserData())
10710 {
10711 ScriptInputUserData ctx = new ScriptInputUserData;
10716 dst.WriteToContext(ctx);
10718 }
10719 }
10720 else if (!
g_Game.IsMultiplayer())
10721 {
10723 }
10724 }
10725
10727 {
10729 {
10730 if (ScriptInputUserData.CanStoreInputUserData())
10731 {
10732 ScriptInputUserData ctx = new ScriptInputUserData;
10737 ctx.
Write(destination_entity);
10743 }
10744 }
10745 else if (!
g_Game.IsMultiplayer())
10746 {
10748 }
10749 }
10750
10752 {
10754 }
10755
10757 {
10759 float split_quantity_new;
10761 if (dst.IsValid())
10762 {
10763 int slot_id = dst.GetSlot();
10765
10766 if (quantity > stack_max)
10767 split_quantity_new = stack_max;
10768 else
10769 split_quantity_new = quantity;
10770
10772 {
10774
10775 if (new_item)
10776 {
10777 new_item.SetResultOfSplit(true);
10778 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10780 new_item.
SetQuantity(split_quantity_new,
false,
true);
10781 }
10782
10783 return new_item;
10784 }
10785 }
10786
10787 return null;
10788 }
10789
10791 {
10793 float split_quantity_new;
10795 if (destination_entity)
10796 {
10798 if (quantity > stackable)
10799 split_quantity_new = stackable;
10800 else
10801 split_quantity_new = quantity;
10802
10804 {
10805 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10806 if (new_item)
10807 {
10808 new_item.SetResultOfSplit(true);
10809 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10811 new_item.
SetQuantity(split_quantity_new,
false,
true);
10812 }
10813 }
10814 }
10815 }
10816
10818 {
10820 {
10821 if (ScriptInputUserData.CanStoreInputUserData())
10822 {
10823 ScriptInputUserData ctx = new ScriptInputUserData;
10828 ItemBase destination_entity =
this;
10829 ctx.
Write(destination_entity);
10833 }
10834 }
10835 else if (!
g_Game.IsMultiplayer())
10836 {
10838 }
10839 }
10840
10842 {
10844 float split_quantity_new;
10846 if (player)
10847 {
10849 if (quantity > stackable)
10850 split_quantity_new = stackable;
10851 else
10852 split_quantity_new = quantity;
10853
10855 {
10856 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10857 new_item =
ItemBase.Cast(in_hands);
10858 if (new_item)
10859 {
10860 new_item.SetResultOfSplit(true);
10861 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10863 new_item.SetQuantity(split_quantity_new, false, true);
10864 }
10865 }
10866 }
10867 }
10868
10870 {
10872 float split_quantity_new = Math.Floor(quantity * 0.5);
10873
10875 return;
10876
10878
10879 if (new_item)
10880 {
10881 if (new_item.GetQuantityMax() < split_quantity_new)
10882 {
10883 split_quantity_new = new_item.GetQuantityMax();
10884 }
10885
10886 new_item.SetResultOfSplit(true);
10887 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10888
10890 {
10893 }
10894 else
10895 {
10897 new_item.
SetQuantity(split_quantity_new,
false,
true);
10898 }
10899 }
10900 }
10901
10903 {
10905 float split_quantity_new = Math.Floor(quantity / 2);
10906
10908 return;
10909
10910 InventoryLocation invloc = new InventoryLocation;
10912
10914 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10915
10916 if (new_item)
10917 {
10918 if (new_item.GetQuantityMax() < split_quantity_new)
10919 {
10920 split_quantity_new = new_item.GetQuantityMax();
10921 }
10923 {
10926 }
10927 else if (split_quantity_new > 1)
10928 {
10930 new_item.
SetQuantity(split_quantity_new,
false,
true);
10931 }
10932 }
10933 }
10934
10937 {
10938 SetWeightDirty();
10940
10941 if (parent)
10942 parent.OnAttachmentQuantityChangedEx(this, delta);
10943
10945 {
10947 {
10949 }
10951 {
10952 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10954 }
10955 }
10956 }
10957
10960 {
10961
10962 }
10963
10966 {
10968 }
10969
10971 {
10972 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10973
10975 {
10976 if (newLevel == GameConstants.STATE_RUINED)
10977 {
10979 EntityAI parent = GetHierarchyParent();
10980 if (parent && parent.IsFireplace())
10981 {
10982 CargoBase cargo = GetInventory().GetCargo();
10983 if (cargo)
10984 {
10986 {
10988 }
10989 }
10990 }
10991 }
10992
10994 {
10995
10997 return;
10998 }
10999
11000 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11001 {
11003 }
11004 }
11005 }
11006
11007
11009 {
11010 super.OnRightClick();
11011
11013 {
11015 {
11016 if (ScriptInputUserData.CanStoreInputUserData())
11017 {
11018 EntityAI root = GetHierarchyRoot();
11019 Man playerOwner = GetHierarchyRootPlayer();
11020 InventoryLocation dst = new InventoryLocation;
11021
11022
11023 if (!playerOwner && root && root == this)
11024 {
11026 }
11027 else
11028 {
11029
11030 GetInventory().GetCurrentInventoryLocation(dst);
11032 {
11033 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11035 {
11037 }
11038 else
11039 {
11041
11042
11043 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11044 {
11046 }
11047 else
11048 {
11049 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11050 }
11051 }
11052 }
11053 }
11054
11055 ScriptInputUserData ctx = new ScriptInputUserData;
11063 }
11064 }
11065 else if (!
g_Game.IsMultiplayer())
11066 {
11068 }
11069 }
11070 }
11071
11073 {
11074 if (root)
11075 {
11076 vector m4[4];
11077 root.GetTransform(m4);
11078 dst.SetGround(this, m4);
11079 }
11080 else
11081 {
11082 GetInventory().GetCurrentInventoryLocation(dst);
11083 }
11084 }
11085
11086 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11087 {
11088
11089 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11090 return false;
11091
11092 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11093 return false;
11094
11095
11097 return false;
11098
11099
11100 Magazine mag = Magazine.Cast(this);
11101 if (mag)
11102 {
11103 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11104 return false;
11105
11106 if (stack_max_limit)
11107 {
11108 Magazine other_mag = Magazine.Cast(other_item);
11109 if (other_item)
11110 {
11111 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11112 return false;
11113 }
11114
11115 }
11116 }
11117 else
11118 {
11119
11121 return false;
11122
11124 return false;
11125 }
11126
11127 PlayerBase player = null;
11128 if (CastTo(player, GetHierarchyRootPlayer()))
11129 {
11130 if (player.GetInventory().HasAttachment(this))
11131 return false;
11132
11133 if (player.IsItemsToDelete())
11134 return false;
11135 }
11136
11137 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11138 return false;
11139
11140 int slotID;
11142 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11143 return false;
11144
11145 return true;
11146 }
11147
11149 {
11151 }
11152
11154 {
11155 return m_IsResultOfSplit;
11156 }
11157
11159 {
11160 m_IsResultOfSplit = value;
11161 }
11162
11164 {
11166 }
11167
11169 {
11170 float other_item_quantity = other_item.GetQuantity();
11171 float this_free_space;
11172
11174
11176
11177 if (other_item_quantity > this_free_space)
11178 {
11179 return this_free_space;
11180 }
11181 else
11182 {
11183 return other_item_quantity;
11184 }
11185 }
11186
11188 {
11190 }
11191
11193 {
11195 return;
11196
11197 if (!IsMagazine() && other_item)
11198 {
11200 if (quantity_used != 0)
11201 {
11202 float hp1 = GetHealth01("","");
11203 float hp2 = other_item.GetHealth01("","");
11204 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11205 hpResult = hpResult / (
GetQuantity() + quantity_used);
11206
11207 hpResult *= GetMaxHealth();
11208 Math.Round(hpResult);
11209 SetHealth("", "Health", hpResult);
11210
11212 other_item.AddQuantity(-quantity_used);
11213 }
11214 }
11216 }
11217
11219 {
11220 #ifdef SERVER
11221 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11222 GetHierarchyParent().IncreaseLifetimeUp();
11223 #endif
11224 };
11225
11227 {
11228 PlayerBase p = PlayerBase.Cast(player);
11229
11230 array<int> recipesIds = p.m_Recipes;
11231 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11232 if (moduleRecipesManager)
11233 {
11234 EntityAI itemInHands = player.GetEntityInHands();
11235 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11236 }
11237
11238 for (int i = 0;i < recipesIds.Count(); i++)
11239 {
11240 int key = recipesIds.Get(i);
11241 string recipeName = moduleRecipesManager.GetRecipeName(key);
11243 }
11244 }
11245
11246
11247 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11248 {
11249 super.GetDebugActions(outputList);
11250
11251
11257
11258
11263
11268
11269
11273
11274
11276 {
11280 }
11281
11284
11285
11289
11291
11292 InventoryLocation loc = new InventoryLocation();
11293 GetInventory().GetCurrentInventoryLocation(loc);
11295 {
11296 if (Gizmo_IsSupported())
11299 }
11300
11302 }
11303
11304
11305
11306
11308 {
11309 super.OnAction(action_id, player, ctx);
11310
11312 {
11313 switch (action_id)
11314 {
11318 return true;
11322 return true;
11323 }
11324 }
11325
11327 {
11328 switch (action_id)
11329 {
11331 Delete();
11332 return true;
11333 }
11334 }
11335
11336 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11337 {
11338 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11339 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11340 PlayerBase p = PlayerBase.Cast(player);
11341 if (
EActions.RECIPES_RANGE_START < 1000)
11342 {
11343 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11344 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11345 }
11346 }
11347 #ifndef SERVER
11348 else if (action_id ==
EActions.WATCH_PLAYER)
11349 {
11350 PluginDeveloper.SetDeveloperItemClientEx(player);
11351 }
11352 #endif
11354 {
11355 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11356 {
11357 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11358 OnDebugButtonPressServer(id + 1);
11359 }
11360
11361 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11362 {
11363 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11365 }
11366
11367 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11368 {
11369 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11371 }
11372
11373 else if (action_id ==
EActions.ADD_QUANTITY)
11374 {
11375 if (IsMagazine())
11376 {
11377 Magazine mag = Magazine.Cast(this);
11378 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11379 }
11380 else
11381 {
11383 }
11384
11385 if (m_EM)
11386 {
11387 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11388 }
11389
11390 }
11391
11392 else if (action_id ==
EActions.REMOVE_QUANTITY)
11393 {
11394 if (IsMagazine())
11395 {
11396 Magazine mag2 = Magazine.Cast(this);
11397 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11398 }
11399 else
11400 {
11402 }
11403 if (m_EM)
11404 {
11405 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11406 }
11407
11408 }
11409
11410 else if (action_id ==
EActions.SET_QUANTITY_0)
11411 {
11413
11414 if (m_EM)
11415 {
11416 m_EM.SetEnergy(0);
11417 }
11418 }
11419
11420 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11421 {
11423
11424 if (m_EM)
11425 {
11426 m_EM.SetEnergy(m_EM.GetEnergyMax());
11427 }
11428 }
11429
11430 else if (action_id ==
EActions.ADD_HEALTH)
11431 {
11432 AddHealth("","",GetMaxHealth("","Health")/5);
11433 }
11434 else if (action_id ==
EActions.REMOVE_HEALTH)
11435 {
11436 AddHealth("","",-GetMaxHealth("","Health")/5);
11437 }
11438 else if (action_id ==
EActions.DESTROY_HEALTH)
11439 {
11440 SetHealth01("","",0);
11441 }
11442 else if (action_id ==
EActions.WATCH_ITEM)
11443 {
11445 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11446 #ifdef DEVELOPER
11447 SetDebugDeveloper_item(this);
11448 #endif
11449 }
11450
11451 else if (action_id ==
EActions.ADD_TEMPERATURE)
11452 {
11453 AddTemperature(20);
11454
11455 }
11456
11457 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11458 {
11459 AddTemperature(-20);
11460
11461 }
11462
11463 else if (action_id ==
EActions.FLIP_FROZEN)
11464 {
11465 SetFrozen(!GetIsFrozen());
11466
11467 }
11468
11469 else if (action_id ==
EActions.ADD_WETNESS)
11470 {
11472
11473 }
11474
11475 else if (action_id ==
EActions.REMOVE_WETNESS)
11476 {
11478
11479 }
11480
11481 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11482 {
11485
11486
11487 }
11488
11489 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11490 {
11493 }
11494
11495 else if (action_id ==
EActions.MAKE_SPECIAL)
11496 {
11497 auto debugParams = DebugSpawnParams.WithPlayer(player);
11498 OnDebugSpawnEx(debugParams);
11499 }
11500
11501 }
11502
11503
11504 return false;
11505 }
11506
11507
11508
11509
11513
11516
11517
11518
11520 {
11521 return false;
11522 }
11523
11524
11526 {
11527 return true;
11528 }
11529
11530
11532 {
11533 return true;
11534 }
11535
11536
11537
11539 {
11540 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11541 return g_Game.ConfigIsExisting(config_path);
11542 }
11543
11546 {
11547 return null;
11548 }
11549
11551 {
11552 return false;
11553 }
11554
11556 {
11557 return false;
11558 }
11559
11563
11564
11566 {
11567 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11568 return module_repairing.CanRepair(this, item_repair_kit);
11569 }
11570
11571
11572 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11573 {
11574 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11575 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11576 }
11577
11578
11580 {
11581
11582
11583
11584
11585
11586
11587
11588
11589 return 1;
11590 }
11591
11592
11593
11595 {
11597 }
11598
11599
11600
11602 {
11604 }
11605
11606
11615 {
11616 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11617
11618 if (player)
11619 {
11620 player.MessageStatus(text);
11621 }
11622 }
11623
11624
11633 {
11634 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11635
11636 if (player)
11637 {
11638 player.MessageAction(text);
11639 }
11640 }
11641
11642
11651 {
11652 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11653
11654 if (player)
11655 {
11656 player.MessageFriendly(text);
11657 }
11658 }
11659
11660
11669 {
11670 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11671
11672 if (player)
11673 {
11674 player.MessageImportant(text);
11675 }
11676 }
11677
11679 {
11680 return true;
11681 }
11682
11683
11684 override bool KindOf(
string tag)
11685 {
11686 bool found = false;
11687 string item_name = this.
GetType();
11689 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11690
11691 int array_size = item_tag_array.Count();
11692 for (int i = 0; i < array_size; i++)
11693 {
11694 if (item_tag_array.Get(i) == tag)
11695 {
11696 found = true;
11697 break;
11698 }
11699 }
11700 return found;
11701 }
11702
11703
11705 {
11706
11707 super.OnRPC(sender, rpc_type,ctx);
11708
11709
11710 switch (rpc_type)
11711 {
11712 #ifndef SERVER
11713 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11714 Param2<bool, string> p = new Param2<bool, string>(false, "");
11715
11717 return;
11718
11719 bool play = p.param1;
11720 string soundSet = p.param2;
11721
11722 if (play)
11723 {
11725 {
11727 {
11729 }
11730 }
11731 else
11732 {
11734 }
11735 }
11736 else
11737 {
11739 }
11740
11741 break;
11742 #endif
11743
11744 }
11745
11747 {
11749 }
11750 }
11751
11752
11753
11754
11756 {
11757 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11758 return plugin.GetID(
name);
11759 }
11760
11762 {
11763 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11764 return plugin.GetName(id);
11765 }
11766
11769 {
11770
11771
11772 int varFlags;
11773 if (!ctx.
Read(varFlags))
11774 return;
11775
11776 if (varFlags & ItemVariableFlags.FLOAT)
11777 {
11779 }
11780 }
11781
11783 {
11784
11785 super.SerializeNumericalVars(floats_out);
11786
11787
11788
11790 {
11792 }
11793
11795 {
11797 }
11798
11800 {
11802 }
11803
11805 {
11810 }
11811
11813 {
11815 }
11816 }
11817
11819 {
11820
11821 super.DeSerializeNumericalVars(floats);
11822
11823
11824 int index = 0;
11825 int mask = Math.Round(floats.Get(index));
11826
11827 index++;
11828
11830 {
11832 {
11834 }
11835 else
11836 {
11837 float quantity = floats.Get(index);
11838 SetQuantity(quantity,
true,
false,
false,
false);
11839 }
11840 index++;
11841 }
11842
11844 {
11845 float wet = floats.Get(index);
11847 index++;
11848 }
11849
11851 {
11852 int liquidtype = Math.Round(floats.Get(index));
11854 index++;
11855 }
11856
11858 {
11860 index++;
11862 index++;
11864 index++;
11866 index++;
11867 }
11868
11870 {
11871 int cleanness = Math.Round(floats.Get(index));
11873 index++;
11874 }
11875 }
11876
11878 {
11879 super.WriteVarsToCTX(ctx);
11880
11881
11883 {
11885 }
11886
11888 {
11890 }
11891
11893 {
11895 }
11896
11898 {
11899 int r,g,b,a;
11905 }
11906
11908 {
11910 }
11911 }
11912
11914 {
11915 if (!super.ReadVarsFromCTX(ctx,version))
11916 return false;
11917
11918 int intValue;
11919 float value;
11920
11921 if (version < 140)
11922 {
11923 if (!ctx.
Read(intValue))
11924 return false;
11925
11926 m_VariablesMask = intValue;
11927 }
11928
11930 {
11931 if (!ctx.
Read(value))
11932 return false;
11933
11935 {
11937 }
11938 else
11939 {
11941 }
11942 }
11943
11944 if (version < 140)
11945 {
11947 {
11948 if (!ctx.
Read(value))
11949 return false;
11950 SetTemperatureDirect(value);
11951 }
11952 }
11953
11955 {
11956 if (!ctx.
Read(value))
11957 return false;
11959 }
11960
11962 {
11963 if (!ctx.
Read(intValue))
11964 return false;
11966 }
11967
11969 {
11970 int r,g,b,a;
11972 return false;
11974 return false;
11976 return false;
11978 return false;
11979
11981 }
11982
11984 {
11985 if (!ctx.
Read(intValue))
11986 return false;
11988 }
11989
11990 if (version >= 138 && version < 140)
11991 {
11993 {
11994 if (!ctx.
Read(intValue))
11995 return false;
11996 SetFrozen(intValue);
11997 }
11998 }
11999
12000 return true;
12001 }
12002
12003
12005 {
12008 {
12010 }
12011
12012 if (!super.OnStoreLoad(ctx, version))
12013 {
12015 return false;
12016 }
12017
12018 if (version >= 114)
12019 {
12020 bool hasQuickBarIndexSaved;
12021
12022 if (!ctx.
Read(hasQuickBarIndexSaved))
12023 {
12025 return false;
12026 }
12027
12028 if (hasQuickBarIndexSaved)
12029 {
12030 int itmQBIndex;
12031
12032
12033 if (!ctx.
Read(itmQBIndex))
12034 {
12036 return false;
12037 }
12038
12039 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12040 if (itmQBIndex != -1 && parentPlayer)
12041 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12042 }
12043 }
12044 else
12045 {
12046
12047 PlayerBase player;
12048 int itemQBIndex;
12049 if (version ==
int.
MAX)
12050 {
12051 if (!ctx.
Read(itemQBIndex))
12052 {
12054 return false;
12055 }
12056 }
12057 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12058 {
12059
12060 if (!ctx.
Read(itemQBIndex))
12061 {
12063 return false;
12064 }
12065 if (itemQBIndex != -1 && player)
12066 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12067 }
12068 }
12069
12070 if (version < 140)
12071 {
12072
12073 if (!LoadVariables(ctx, version))
12074 {
12076 return false;
12077 }
12078 }
12079
12080
12082 {
12084 return false;
12085 }
12086 if (version >= 132)
12087 {
12089 if (raib)
12090 {
12092 {
12094 return false;
12095 }
12096 }
12097 }
12098
12100 return true;
12101 }
12102
12103
12104
12106 {
12107 super.OnStoreSave(ctx);
12108
12109 PlayerBase player;
12110 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12111 {
12113
12114 int itemQBIndex = -1;
12115 itemQBIndex = player.FindQuickBarEntityIndex(this);
12116 ctx.
Write(itemQBIndex);
12117 }
12118 else
12119 {
12121 }
12122
12124
12126 if (raib)
12127 {
12129 }
12130 }
12131
12132
12134 {
12135 super.AfterStoreLoad();
12136
12138 {
12140 }
12141
12143 {
12146 }
12147 }
12148
12150 {
12151 super.EEOnAfterLoad();
12152
12154 {
12156 }
12157
12160 }
12161
12163 {
12164 return false;
12165 }
12166
12167
12168
12170 {
12172 {
12173 #ifdef PLATFORM_CONSOLE
12174
12176 {
12178 if (menu)
12179 {
12181 }
12182 }
12183 #endif
12184 }
12185
12187 {
12190 }
12191
12193 {
12194 SetWeightDirty();
12196 }
12198 {
12201 }
12202
12204 {
12207
12210 }
12212 {
12216 }
12217
12218 super.OnVariablesSynchronized();
12219 }
12220
12221
12222
12224 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12225 {
12226 if (!IsServerCheck(allow_client))
12227 return false;
12228
12230 return false;
12231
12234
12235 if (value <= (min + 0.001))
12236 value = min;
12237
12238 if (value == min)
12239 {
12240 if (destroy_config)
12241 {
12242 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12243 if (dstr)
12244 {
12246 this.Delete();
12247 return true;
12248 }
12249 }
12250 else if (destroy_forced)
12251 {
12253 this.Delete();
12254 return true;
12255 }
12256
12258 }
12259
12262
12264 {
12265 EntityAI parent = GetHierarchyRoot();
12266 InventoryLocation iLoc = new InventoryLocation();
12267 GetInventory().GetCurrentInventoryLocation(iLoc);
12269 {
12270 int iLocSlot = iLoc.
GetSlot();
12272 {
12274 }
12276 {
12278 }
12279 }
12280 }
12281
12283 {
12285
12286 if (delta)
12288 }
12289
12291
12292 return false;
12293 }
12294
12295
12297 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12298 {
12300 }
12301
12303 {
12306 }
12307
12309 {
12312 }
12313
12315 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12316 {
12317 float value_clamped = Math.Clamp(value, 0, 1);
12319 SetQuantity(result, destroy_config, destroy_forced);
12320 }
12321
12322
12325 {
12327 }
12328
12330 {
12332 }
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12344 {
12345 int slot = -1;
12346 GameInventory inventory = GetInventory();
12347 if (inventory)
12348 {
12349 InventoryLocation il = new InventoryLocation;
12352 }
12353
12355 }
12356
12358 {
12359 float quantity_max = 0;
12360
12362 {
12363 if (attSlotID != -1)
12364 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12365
12366 if (quantity_max <= 0)
12368 }
12369
12370 if (quantity_max <= 0)
12372
12373 return quantity_max;
12374 }
12375
12377 {
12379 }
12380
12382 {
12384 }
12385
12386
12388 {
12390 }
12391
12393 {
12395 }
12396
12398 {
12400 }
12401
12402
12404 {
12405
12406 float weightEx = GetWeightEx();
12407 float special = GetInventoryAndCargoWeight();
12408 return weightEx - special;
12409 }
12410
12411
12413 {
12415 }
12416
12418 {
12420 {
12421 #ifdef DEVELOPER
12422 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12423 {
12424 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12426 }
12427 #endif
12428
12429 return GetQuantity() * GetConfigWeightModified();
12430 }
12431 else if (HasEnergyManager())
12432 {
12433 #ifdef DEVELOPER
12434 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12435 {
12436 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12437 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12438 }
12439 #endif
12440 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12441 }
12442 else
12443 {
12444 #ifdef DEVELOPER
12445 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12446 {
12447 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12448 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12449 }
12450 #endif
12451 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12452 }
12453 }
12454
12457 {
12458 int item_count = 0;
12460
12461 GameInventory inventory = GetInventory();
12462 CargoBase cargo = inventory.
GetCargo();
12463 if (cargo != NULL)
12464 {
12466 }
12467
12469 for (int i = 0; i < nAttachments; ++i)
12470 {
12472 if (item)
12473 item_count += item.GetNumberOfItems();
12474 }
12475 return item_count;
12476 }
12477
12480 {
12481 float weight = 0;
12482 float wetness = 1;
12483 if (include_wetness)
12486 {
12487 weight = wetness * m_ConfigWeight;
12488 }
12490 {
12491 weight = 1;
12492 }
12493 return weight;
12494 }
12495
12496
12497
12499 {
12500 GameInventory inventory = GetInventory();
12501 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12502 {
12503 array<EntityAI> items = new array<EntityAI>;
12505 for (int i = 0; i < items.Count(); ++i)
12506 {
12508 if (item)
12509 {
12510 g_Game.ObjectDelete(item);
12511 }
12512 }
12513 }
12514 }
12515
12516
12517
12518
12520 {
12521 float energy = 0;
12522 if (HasEnergyManager())
12523 {
12524 energy = GetCompEM().GetEnergy();
12525 }
12526 return energy;
12527 }
12528
12529
12531 {
12532 super.OnEnergyConsumed();
12533
12535 }
12536
12538 {
12539 super.OnEnergyAdded();
12540
12542 }
12543
12544
12546 {
12547 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12548 {
12550 {
12551 float energy_0to1 = GetCompEM().GetEnergy0To1();
12553 }
12554 }
12555 }
12556
12557
12559 {
12560 return ConfigGetFloat("heatIsolation");
12561 }
12562
12564 {
12566 }
12567
12569 {
12570 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12571 if (
g_Game.ConfigIsExisting(paramPath))
12572 return g_Game.ConfigGetFloat(paramPath);
12573
12574 return 0.0;
12575 }
12576
12578 {
12579 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12580 if (
g_Game.ConfigIsExisting(paramPath))
12581 return g_Game.ConfigGetFloat(paramPath);
12582
12583 return 0.0;
12584 }
12585
12586 override void SetWet(
float value,
bool allow_client =
false)
12587 {
12588 if (!IsServerCheck(allow_client))
12589 return;
12590
12593
12595
12596 m_VarWet = Math.Clamp(value, min, max);
12597
12599 {
12602 }
12603 }
12604
12605 override void AddWet(
float value)
12606 {
12608 }
12609
12611 {
12613 }
12614
12616 {
12618 }
12619
12621 {
12623 }
12624
12626 {
12628 }
12629
12631 {
12633 }
12634
12635 override void OnWetChanged(
float newVal,
float oldVal)
12636 {
12639 if (newLevel != oldLevel)
12640 {
12642 }
12643 }
12644
12646 {
12647 SetWeightDirty();
12648 }
12649
12651 {
12652 return GetWetLevelInternal(
m_VarWet);
12653 }
12654
12655
12656
12658 {
12660 }
12661
12663 {
12665 }
12666
12668 {
12670 }
12671
12673 {
12675 }
12676
12677
12678
12680 {
12681 if (ConfigIsExisting("itemModelLength"))
12682 {
12683 return ConfigGetFloat("itemModelLength");
12684 }
12685 return 0;
12686 }
12687
12689 {
12690 if (ConfigIsExisting("itemAttachOffset"))
12691 {
12692 return ConfigGetFloat("itemAttachOffset");
12693 }
12694 return 0;
12695 }
12696
12697 override void SetCleanness(
int value,
bool allow_client =
false)
12698 {
12699 if (!IsServerCheck(allow_client))
12700 return;
12701
12703
12705
12708 }
12709
12711 {
12713 }
12714
12716 {
12717 return true;
12718 }
12719
12720
12721
12722
12724 {
12726 }
12727
12729 {
12731 }
12732
12733
12734
12735
12736 override void SetColor(
int r,
int g,
int b,
int a)
12737 {
12743 }
12745 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12746 {
12751 }
12752
12754 {
12756 }
12757
12760 {
12761 int r,g,b,a;
12763 r = r/255;
12764 g = g/255;
12765 b = b/255;
12766 a = a/255;
12767 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12768 }
12769
12770
12771
12772 override void SetLiquidType(
int value,
bool allow_client =
false)
12773 {
12774 if (!IsServerCheck(allow_client))
12775 return;
12776
12781 }
12782
12784 {
12785 return ConfigGetInt("varLiquidTypeInit");
12786 }
12787
12789 {
12791 }
12792
12794 {
12796 SetFrozen(false);
12797 }
12798
12801 {
12802 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12803 }
12804
12805
12808 {
12809 PlayerBase nplayer;
12810 if (PlayerBase.CastTo(nplayer, player))
12811 {
12813 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12814 }
12815 }
12816
12817
12820 {
12821 PlayerBase nplayer;
12822 if (PlayerBase.CastTo(nplayer,player))
12823 {
12824 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12825 }
12826
12827 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12828
12829 if (HasEnergyManager())
12830 {
12831 GetCompEM().UpdatePlugState();
12832 }
12833 }
12834
12835
12837 {
12838 super.OnPlacementStarted(player);
12839
12841 }
12842
12843 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12844 {
12846 {
12847 m_AdminLog.OnPlacementComplete(player,
this);
12848 }
12849
12850 super.OnPlacementComplete(player, position, orientation);
12851 }
12852
12853
12854
12855
12856
12858 {
12860 {
12861 return true;
12862 }
12863 else
12864 {
12865 return false;
12866 }
12867 }
12868
12869
12871 {
12873 {
12875 }
12876 }
12877
12878
12880 {
12882 }
12883
12885 {
12887 }
12888
12889 override void InsertAgent(
int agent,
float count = 1)
12890 {
12891 if (count < 1)
12892 return;
12893
12895 }
12896
12899 {
12901 }
12902
12903
12905 {
12907 }
12908
12909
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12951 {
12953 return false;
12954 return true;
12955 }
12956
12958 {
12959
12961 }
12962
12963
12966 {
12967 super.CheckForRoofLimited(timeTresholdMS);
12968
12969 float time =
g_Game.GetTime();
12970 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12971 {
12972 m_PreviousRoofTestTime = time;
12973 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12974 }
12975 }
12976
12977
12979 {
12981 {
12982 return 0;
12983 }
12984
12985 if (GetInventory().GetAttachmentSlotsCount() != 0)
12986 {
12987 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12988 if (filter)
12989 return filter.GetProtectionLevel(type, false, system);
12990 else
12991 return 0;
12992 }
12993
12994 string subclassPath, entryName;
12995
12996 switch (type)
12997 {
12999 entryName = "biological";
13000 break;
13002 entryName = "chemical";
13003 break;
13004 default:
13005 entryName = "biological";
13006 break;
13007 }
13008
13009 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13010
13011 return g_Game.ConfigGetFloat(subclassPath + entryName);
13012 }
13013
13014
13015
13018 {
13019 if (!IsMagazine())
13021
13023 }
13024
13025
13026
13027
13028
13033 {
13034 return true;
13035 }
13036
13038 {
13040 }
13041
13042
13043
13044
13045
13047 {
13048 if (parent)
13049 {
13050 if (parent.IsInherited(DayZInfected))
13051 return true;
13052
13053 if (!parent.IsRuined())
13054 return true;
13055 }
13056
13057 return true;
13058 }
13059
13061 {
13062 if (!super.CanPutAsAttachment(parent))
13063 {
13064 return false;
13065 }
13066
13067 if (!IsRuined() && !parent.IsRuined())
13068 {
13069 return true;
13070 }
13071
13072 return false;
13073 }
13074
13076 {
13077
13078
13079
13080
13081 return super.CanReceiveItemIntoCargo(item);
13082 }
13083
13085 {
13086
13087
13088
13089
13090 GameInventory attachmentInv = attachment.GetInventory();
13092 {
13093 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13094 return false;
13095 }
13096
13097 InventoryLocation loc = new InventoryLocation();
13098 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13099 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13100 return false;
13101
13102 return super.CanReceiveAttachment(attachment, slotId);
13103 }
13104
13106 {
13107 if (!super.CanReleaseAttachment(attachment))
13108 return false;
13109
13110 return GetInventory().AreChildrenAccessible();
13111 }
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13134 {
13135 int id = muzzle_owner.GetMuzzleID();
13136 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13137
13138 if (WPOF_array)
13139 {
13140 for (int i = 0; i < WPOF_array.Count(); i++)
13141 {
13142 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13143
13144 if (WPOF)
13145 {
13146 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13147 }
13148 }
13149 }
13150 }
13151
13152
13154 {
13155 int id = muzzle_owner.GetMuzzleID();
13157
13158 if (WPOBE_array)
13159 {
13160 for (int i = 0; i < WPOBE_array.Count(); i++)
13161 {
13162 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13163
13164 if (WPOBE)
13165 {
13166 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13167 }
13168 }
13169 }
13170 }
13171
13172
13174 {
13175 int id = muzzle_owner.GetMuzzleID();
13176 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13177
13178 if (WPOOH_array)
13179 {
13180 for (int i = 0; i < WPOOH_array.Count(); i++)
13181 {
13182 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13183
13184 if (WPOOH)
13185 {
13186 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13187 }
13188 }
13189 }
13190 }
13191
13192
13194 {
13195 int id = muzzle_owner.GetMuzzleID();
13196 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13197
13198 if (WPOOH_array)
13199 {
13200 for (int i = 0; i < WPOOH_array.Count(); i++)
13201 {
13202 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13203
13204 if (WPOOH)
13205 {
13206 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13207 }
13208 }
13209 }
13210 }
13211
13212
13214 {
13215 int id = muzzle_owner.GetMuzzleID();
13216 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13217
13218 if (WPOOH_array)
13219 {
13220 for (int i = 0; i < WPOOH_array.Count(); i++)
13221 {
13222 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13223
13224 if (WPOOH)
13225 {
13226 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13227 }
13228 }
13229 }
13230 }
13231
13232
13233
13235 {
13237 {
13238 return true;
13239 }
13240
13241 return false;
13242 }
13243
13245 {
13247 {
13248 return true;
13249 }
13250
13251 return false;
13252 }
13253
13255 {
13257 {
13258 return true;
13259 }
13260
13261 return false;
13262 }
13263
13265 {
13266 return false;
13267 }
13268
13271 {
13272 return UATimeSpent.DEFAULT_DEPLOY;
13273 }
13274
13275
13276
13277
13279 {
13281 SetSynchDirty();
13282 }
13283
13285 {
13287 }
13288
13289
13291 {
13292 return false;
13293 }
13294
13297 {
13298 string att_type = "None";
13299
13300 if (ConfigIsExisting("soundAttType"))
13301 {
13302 att_type = ConfigGetString("soundAttType");
13303 }
13304
13306 }
13307
13309 {
13311 }
13312
13313
13314
13315
13316
13322
13324 {
13327
13329 }
13330
13331
13333 {
13335 return;
13336
13338
13341
13344
13345 SoundParameters params = new SoundParameters();
13349 }
13350
13351
13353 {
13355 {
13358
13359 SetSynchDirty();
13360
13363 }
13364 }
13365
13367 {
13369 }
13370
13371
13373 {
13375 return;
13376
13378 SetSynchDirty();
13379
13382 }
13383
13385 {
13388 }
13389
13391 {
13393 }
13394
13395 void OnApply(PlayerBase player);
13396
13398 {
13399 return 1.0;
13400 };
13401
13403 {
13405 }
13406
13408 {
13410 }
13411
13413
13415 {
13416 SetDynamicPhysicsLifeTime(0.01);
13418 }
13419
13421 {
13422 array<string> zone_names = new array<string>;
13423 GetDamageZones(zone_names);
13424 for (int i = 0; i < zone_names.Count(); i++)
13425 {
13426 SetHealthMax(zone_names.Get(i),"Health");
13427 }
13428 SetHealthMax("","Health");
13429 }
13430
13433 {
13434 float global_health = GetHealth01("","Health");
13435 array<string> zones = new array<string>;
13436 GetDamageZones(zones);
13437
13438 for (int i = 0; i < zones.Count(); i++)
13439 {
13440 SetHealth01(zones.Get(i),"Health",global_health);
13441 }
13442 }
13443
13446 {
13447 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13448 }
13449
13451 {
13452 if (!hasRootAsPlayer)
13453 {
13454 if (refParentIB)
13455 {
13456
13457 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13458 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13459
13460 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13461 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13462
13465 }
13466 else
13467 {
13468
13471 }
13472 }
13473 }
13474
13476 {
13478 {
13479 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13480 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13481 {
13482 float heatPermCoef = 1.0;
13484 while (ent)
13485 {
13486 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13487 ent = ent.GetHierarchyParent();
13488 }
13489
13490 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13491 }
13492 }
13493 }
13494
13496 {
13497
13498 EntityAI parent = GetHierarchyParent();
13499 if (!parent)
13500 {
13501 hasParent = false;
13502 hasRootAsPlayer = false;
13503 }
13504 else
13505 {
13506 hasParent = true;
13507 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13508 refParentIB =
ItemBase.Cast(parent);
13509 }
13510 }
13511
13512 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13513 {
13514
13515 }
13516
13518 {
13519
13520 return false;
13521 }
13522
13524 {
13525
13526
13527 return false;
13528 }
13529
13531 {
13532
13533 return false;
13534 }
13535
13538 {
13539 return !GetIsFrozen() &&
IsOpen();
13540 }
13541
13543 {
13544 bool hasParent = false, hasRootAsPlayer = false;
13546
13547 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13548 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13549
13550 if (wwtu || foodDecay)
13551 {
13555
13556 if (processWetness || processTemperature || processDecay)
13557 {
13559
13560 if (processWetness)
13561 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13562
13563 if (processTemperature)
13565
13566 if (processDecay)
13567 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13568 }
13569 }
13570 }
13571
13574 {
13576 }
13577
13579 {
13582
13583 return super.GetTemperatureFreezeThreshold();
13584 }
13585
13587 {
13590
13591 return super.GetTemperatureThawThreshold();
13592 }
13593
13595 {
13598
13599 return super.GetItemOverheatThreshold();
13600 }
13601
13603 {
13605 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13606
13607 return super.GetTemperatureFreezeTime();
13608 }
13609
13611 {
13613 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13614
13615 return super.GetTemperatureThawTime();
13616 }
13617
13622
13624 {
13625 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13626 }
13627
13629 {
13630 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13631 }
13632
13635 {
13637 }
13638
13640 {
13642 }
13643
13645 {
13647 }
13648
13651 {
13652 return null;
13653 }
13654
13657 {
13658 return false;
13659 }
13660
13662 {
13664 {
13667 if (!trg)
13668 {
13670 explosive = this;
13671 }
13672
13673 explosive.PairRemote(trg);
13675
13676 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13677 trg.SetPersistentPairID(persistentID);
13678 explosive.SetPersistentPairID(persistentID);
13679
13680 return true;
13681 }
13682 return false;
13683 }
13684
13687 {
13688 float ret = 1.0;
13691 ret *= GetHealth01();
13692
13693 return ret;
13694 }
13695
13696 #ifdef DEVELOPER
13697 override void SetDebugItem()
13698 {
13699 super.SetDebugItem();
13700 _itemBase = this;
13701 }
13702
13704 {
13705 string text = super.GetDebugText();
13706
13708 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13709
13710 return text;
13711 }
13712 #endif
13713
13715 {
13716 return true;
13717 }
13718
13720
13722
13724 {
13727 }
13728
13729
13737
13753
13754 [
Obsolete(
"Use ItemSoundHandler instead")]
13757 {
13758 if (!
g_Game.IsDedicatedServer())
13759 {
13760 if (ConfigIsExisting("attachSoundSet"))
13761 {
13762 string cfg_path = "";
13763 string soundset = "";
13764 string type_name =
GetType();
13765
13768 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13769 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13770
13771 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13772 {
13773 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13774 {
13775 if (cfg_slot_array[i] == slot_type)
13776 {
13777 soundset = cfg_soundset_array[i];
13778 break;
13779 }
13780 }
13781 }
13782
13783 if (soundset != "")
13784 {
13785 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13787 }
13788 }
13789 }
13790 }
13791
13793}
13794
13796{
13798 if (entity)
13799 {
13800 bool is_item = entity.IsInherited(
ItemBase);
13801 if (is_item && full_quantity)
13802 {
13805 }
13806 }
13807 else
13808 {
13810 return NULL;
13811 }
13812 return entity;
13813}
13814
13816{
13817 if (item)
13818 {
13819 if (health > 0)
13820 item.SetHealth("", "", health);
13821
13822 if (item.CanHaveTemperature())
13823 {
13825 if (item.CanFreeze())
13826 item.SetFrozen(false);
13827 }
13828
13829 if (item.HasEnergyManager())
13830 {
13831 if (quantity >= 0)
13832 {
13833 item.GetCompEM().SetEnergy0To1(quantity);
13834 }
13835 else
13836 {
13838 }
13839 }
13840 else if (item.IsMagazine())
13841 {
13842 Magazine mag = Magazine.Cast(item);
13843 if (quantity >= 0)
13844 {
13845 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13846 }
13847 else
13848 {
13850 }
13851
13852 }
13853 else
13854 {
13855 if (quantity >= 0)
13856 {
13857 item.SetQuantityNormalized(quantity, false);
13858 }
13859 else
13860 {
13862 }
13863
13864 }
13865 }
13866}
13867
13868#ifdef DEVELOPER
13870#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.