示例#1
0
        private static double ServerGetLowestEquipmentDurabilityFraction(IEnumerable <IItem> items)
        {
            var lowestDurabilityFraction = 1.0;

            foreach (var item in items)
            {
                if (!(item.ProtoItem is IProtoItemEquipment protoItemEquipment))
                {
                    // not an equipment
                    continue;
                }

                switch (protoItemEquipment.EquipmentType)
                {
                case EquipmentType.FullBody:
                case EquipmentType.Head:
                case EquipmentType.Chest:
                case EquipmentType.Legs:
                    // consider these equipment item types for the durability check
                    break;

                default:
                    // don't consider implants, devices and other (future?) slots
                    continue;
                }

                var durabilityFraction = ItemDurabilitySystem.SharedGetDurabilityFraction(item);
                if (durabilityFraction < lowestDurabilityFraction)
                {
                    lowestDurabilityFraction = durabilityFraction;
                }
            }

            return(lowestDurabilityFraction);
        }
示例#2
0
        private static bool SharedTryFindItemsOfType(
            IItemsContainerProvider containers,
            IProtoItem requiredProtoItem,
            uint count,
            out List <IItem> result,
            double minQualityFraction)
        {
            var countToFindRemains = (int)count;

            result = new List <IItem>();
            foreach (var container in containers.ItemsContainers)
            {
                foreach (var item in container.Items)
                {
                    if (item.ProtoItem != requiredProtoItem)
                    {
                        continue;
                    }

                    if (requiredProtoItem is IProtoItemWithDurability &&
                        ItemDurabilitySystem.SharedGetDurabilityFraction(item) < minQualityFraction)
                    {
                        // not enough durability
                        continue;
                    }

                    if (requiredProtoItem is IProtoItemWithFreshness &&
                        ItemFreshnessSystem.SharedGetFreshnessFraction(item) < minQualityFraction)
                    {
                        // not enough durability
                        continue;
                    }

                    result.Add(item);
                    countToFindRemains -= item.Count;
                    if (countToFindRemains <= 0)
                    {
                        break;
                    }
                }

                if (countToFindRemains <= 0)
                {
                    break;
                }
            }

            return(countToFindRemains <= 0);
        }
示例#3
0
        private void TrySendDrone()
        {
            var targetsList =
                Api.Client.World.GetStaticWorldObjectsOfProto <IProtoStaticWorldObject>()
                .Where(IsValidObject)
                .OrderBy(o => CurrentCharacter.Position.DistanceTo(o.TilePosition.ToVector2D()))
                .ToList();

            if (targetsList.Count == 0)
            {
                return;
            }
            int targetN           = 0;
            int droneControlLimit = ((IProtoItemDroneControl)SelectedItem.ProtoGameObject).MaxDronesToControl;
            int droneNumberToSend = Math.Min(
                droneControlLimit - CurrentCharacter.SharedGetCurrentControlledDronesNumber(),
                targetsList.Count);

            using var tempExceptDrones = Api.Shared.GetTempList <IItem>();
            for (var index = 0; index < droneNumberToSend; index++)
            {
                IItem itemDrone;
                do
                {
                    itemDrone = CharacterDroneControlSystem.ClientSelectNextDrone(tempExceptDrones.AsList());
                    if (itemDrone is null)
                    {
                        return;
                    }
                    tempExceptDrones.Add(itemDrone);
                } while (ItemDurabilitySystem.SharedGetDurabilityFraction(itemDrone) < DroneDurabilityThreshold);

                if (!CharacterDroneControlSystem.ClientTryStartDrone(itemDrone,
                                                                     targetsList[targetN].TilePosition,
                                                                     showErrorNotification: false))
                {
                    return;
                }
                targetN++;
            }
        }
        private void CheckItemDurability([NotNull] IItem item)
        {
            double itemDurabilityFraction = ItemDurabilitySystem.SharedGetDurabilityFraction(item);

            if (IsUnequipEnabled &&
                itemDurabilityFraction <= UnequipThreshold)
            {
                if (TryToMoveItem(
                        item: item,
                        toContainer: CurrentCharacter.SharedGetPlayerContainerInventory()))
                {
                    if (item != null)
                    {
                        itemAlerts.Remove(item);
                    }
                    return;
                }
            }

            if (!itemAlerts.ContainsKey(item))
            {
                itemAlerts.Add(item, new AlertDetails());
            }

            if (IsAlertNotificationEnabled &&
                itemDurabilityFraction <= AlertThreshold &&
                (itemAlerts[item].Durability - itemDurabilityFraction >= AlertStep ||
                 (AlertTimeout > 0 &&
                  itemAlerts[item].Time + AlertTimeout < Api.Client.Core.ClientRealTime)))
            {
                itemAlerts[item].Durability = itemDurabilityFraction;
                itemAlerts[item].Time       = Api.Client.Core.ClientRealTime;

                NotificationSystem.ClientShowNotification(
                    title: "Item durability low!",
                    color: NotificationColor.Bad,
                    icon: item.ProtoItem.Icon);
            }
        }
示例#5
0
        public static bool ValidateCanRepair(
            ICharacter character,
            IStaticWorldObject tinkerTableObject,
            out string errorMessage)
        {
            var worldObjectPrivateState = GetPrivateState(tinkerTableObject);
            var containerInput          = worldObjectPrivateState.ContainerInput;
            var containerOutput         = worldObjectPrivateState.ContainerOutput;

            var inputItem1 = containerInput.GetItemAtSlot(0);
            var inputItem2 = containerInput.GetItemAtSlot(1);

            if (inputItem1 == null ||
                inputItem2 == null ||
                inputItem1.ProtoItem != inputItem2.ProtoItem)
            {
                errorMessage = ErrorMessage_Input;
                return(false);
            }

            var resultItemProto = (IProtoItemWithDurablity)inputItem1.ProtoGameObject;

            if (!resultItemProto.IsRepairable)
            {
                throw new Exception("Cannot repair: the input items prototype is not repairable");
            }

            var durabilityItem1 = ItemDurabilitySystem.SharedGetDurabilityFraction(inputItem1);
            var durabilityItem2 = ItemDurabilitySystem.SharedGetDurabilityFraction(inputItem2);

            if (durabilityItem1 >= 1.0 ||
                durabilityItem2 >= 1.0)
            {
                // one of the items is 100% green
                errorMessage = ErrorMessage_NoRepairNecessary;
                return(false);
            }

            var thresholdGreen = ItemDurabilitySystem.ThresholdFractionGreenStatus;

            if (durabilityItem1 >= thresholdGreen &&
                durabilityItem2 >= thresholdGreen)
            {
                // both items are green
                errorMessage = ErrorMessage_NoRepairNecessary;
                return(false);
            }

            if (!SharedValidateHasRequiredComponentItems(character))
            {
                errorMessage = ErrorMessage_ComponentItemsRequried;
                return(false);
            }

            if (containerOutput.GetItemAtSlot(0) != null)
            {
                errorMessage = ErrorMessage_OutputIsFull;
                return(false);
            }

            errorMessage = null;
            return(true);
        }