Example #1
0
        static void Craft(long entityId, CraftModule craft)
        {
            if (craft.type == ModuleType.None || craft.type == ModuleType.Count)
            {
                return;
            }

            var properties = craft.propertyLevels;

            if (!Helpers.CheckCraftingAccess(components[entityId].propertiesUnlocked[craft.type].BackingArray, properties.BackingArray))
            {
                return;
            }

            var requirements = Helpers.GetRequirements(craft.type, properties.BackingArray);

            var resourceIds   = new byte[requirements.Count];
            var resourceInfos = new ResourceInfo[requirements.Count];

            for (int i = 0; i < requirements.Count; i++)
            {
                var resourceId  = (byte)craft.resourceIds[i];
                var requirement = requirements[i];

                if (!ResourcesInventorySystem.TryGetResourceInfo(entityId, resourceId, out var resourceInfo))
                {
                    return;
                }

                if (resourceInfo.type != requirement.Type)
                {
                    return;
                }

                if (resourceInfo.quantity < requirement.Quantity)
                {
                    return;
                }

                resourceInfo.quantity = requirement.Quantity;

                resourceIds[i]   = resourceId;
                resourceInfos[i] = resourceInfo;
            }

            for (int i = 0; i < resourceInfos.Length; i++)
            {
                ResourcesInventorySystem.QueueResourceQuantityDeltaOp(entityId, resourceIds[i], -resourceInfos[i].quantity);
            }

            var userDBId = IdentificationsSystem.GetUserDBId(entityId);

            var moduleFullName    = craft.name.HasValue ? craft.name.Value + craft.type.ToString() : "Prototype " + craft.type.ToString();
            var craftedModuleDBId = Helpers.GenerateCloudFireStoreRandomDocumentId(random);
            var craftedModule     = new Module(moduleFullName, craft.type, userDBId, properties, false);

            ModulesInventorySystem.QueueAddModuleOp(entityId, craftedModuleDBId, craftedModule, resourceInfos);
        }