コード例 #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);
        }
コード例 #2
0
ファイル: ModularsSystem.cs プロジェクト: SionoiS/ShipWorker
        static void ProcessUpdateOps()
        {
            while (updateOps.TryDequeue(out var op))
            {
                var entityId  = op.EntityId.Id;
                var component = components[entityId];

                var update = new Modular.Update();

                var count = op.Update.uninstallModule.Count;
                for (int i = 0; i < count; i++)
                {
                    var uninstallModule = op.Update.uninstallModule[i];

                    if (component.installedModuleIds.Contains(uninstallModule.moduleId))
                    {
                        component.installedModuleIds.Remove(uninstallModule.moduleId);
                        update.SetInstalledModuleIds(component.installedModuleIds);
                    }
                }

                count = op.Update.installModule.Count;
                for (int i = 0; i < count; i++)
                {
                    var installModule = op.Update.installModule[i];
                    var moduleId      = (byte)installModule.moduleId;

                    if (!ModulesInventorySystem.TryGetModuleInfo(entityId, moduleId, out var moduleInfo))
                    {
                        continue;
                    }

                    var moduleType = moduleInfo.type;

                    var tally = 0;
                    for (int j = 0; j < component.installedModuleIds.Count; j++)
                    {
                        var id   = (byte)component.installedModuleIds[j];
                        var info = ModulesInventorySystem.GetModuleInfo(entityId, id);

                        if (moduleType != info.type)
                        {
                            continue;
                        }

                        tally++;
                    }

                    if (tally >= moduleSlots[moduleType])
                    {
                        continue;
                    }

                    if (!component.installedModuleIds.Contains(moduleId))
                    {
                        component.installedModuleIds.Add(moduleId);
                        update.SetInstalledModuleIds(component.installedModuleIds);
                    }
                }

                components[op.EntityId.Id] = component;

                SpatialOSConnectionSystem.updateModularOps.Enqueue(
                    new ComponentUpdateOp <Modular.Update>
                {
                    EntityId = op.EntityId,
                    Update   = update,
                });
            }
        }