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); }
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, }); } }