package com.cardshifter.modapi.resources; import java.util.Objects; import java.util.Optional; import com.cardshifter.modapi.base.Component; import com.cardshifter.modapi.base.Entity; public class ResourceRetriever { private final ECSResource resource; ResourceRetriever(ECSResource resource) { this.resource = resource; } public static ResourceRetriever forResource(ECSResource resource) { return new ResourceRetriever(resource); } public int getFor(Entity entity) { return getOrDefault(entity, 0); } private ECSResourceMap resMap(Entity entity) { Objects.requireNonNull(entity, "Cannot retrieve resource map for null entity"); if (entity.isRemoved()) { throw new IllegalArgumentException(entity + " has been marked for removal."); } ECSResourceMap map = entity.getComponent(ECSResourceMap.class); return Objects.requireNonNull(map, entity + " does not have a resource component: " + entity.getSuperComponents(Component.class)); } public boolean has(Entity entity) { Objects.requireNonNull(entity, "Cannot retrieve resource map for null entity"); ECSResourceMap map = entity.getComponent(ECSResourceMap.class); return map != null && map.get(resource).isPresent(); } public ECSResourceData resFor(Entity entity) { return resMap(entity).getResource(resource); } public void set(Entity entity, int value) { ECSResourceMap.createOrGetFor(entity).set(resource, value); } public ECSResource getResource() { return resource; } public int getOrDefault(Entity entity, int defaultValue) { Objects.requireNonNull(entity, "Cannot retrieve resource map for null entity"); ECSResourceMap map = entity.getComponent(ECSResourceMap.class); if (map == null) { return defaultValue; } Optional<ECSResourceData> resData = map.get(resource); return !resData.isPresent() ? defaultValue : resData.get().get(); } }