diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index 8e9f759ffb..05198c401e 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -467,6 +467,7 @@ public class ContentParser{ case "itemFlammable" -> block.consume((Consume)parser.readValue(ConsumeItemFlammable.class, child)); case "itemRadioactive" -> block.consume((Consume)parser.readValue(ConsumeItemRadioactive.class, child)); case "itemExplosive" -> block.consume((Consume)parser.readValue(ConsumeItemExplosive.class, child)); + case "itemList" -> block.consume((Consume)parser.readValue(ConsumeItemList.class, child)); case "itemExplode" -> block.consume((Consume)parser.readValue(ConsumeItemExplode.class, child)); case "items" -> block.consume(child.isArray() ? new ConsumeItems(parser.readValue(ItemStack[].class, child)) : @@ -1061,17 +1062,25 @@ public class ContentParser{ } Field field = metadata.field; try{ - boolean mergeMap = ObjectMap.class.isAssignableFrom(field.getType()) && child.has("add") && child.get("add").isBoolean() && child.getBoolean("add", false); + boolean isMap = ObjectMap.class.isAssignableFrom(field.getType()) || ObjectIntMap.class.isAssignableFrom(field.getType()) || ObjectFloatMap.class.isAssignableFrom(field.getType()); + boolean mergeMap = isMap && child.has("add") && child.get("add").isBoolean() && child.getBoolean("add", false); if(mergeMap){ child.remove("add"); } Object readField = parser.readValue(field.getType(), metadata.elementType, child, metadata.keyType); + Object fieldObj = field.get(object); //if a map has add: true, add its contents to the map instead - if(mergeMap && field.get(object) instanceof ObjectMap baseMap){ - baseMap.putAll((ObjectMap)readField); + if(mergeMap && (fieldObj instanceof ObjectMap || fieldObj instanceof ObjectIntMap || fieldObj instanceof ObjectFloatMap)){ + if(field.get(object) instanceof ObjectMap baseMap){ + baseMap.putAll((ObjectMap)readField); + }else if(field.get(object) instanceof ObjectIntMap baseMap){ + baseMap.putAll((ObjectIntMap)readField); + }else if(field.get(object) instanceof ObjectFloatMap baseMap){ + baseMap.putAll((ObjectFloatMap)readField); + } }else{ field.set(object, readField); } diff --git a/core/src/mindustry/world/consumers/ConsumeItemList.java b/core/src/mindustry/world/consumers/ConsumeItemList.java new file mode 100644 index 0000000000..7dea4e7a3e --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeItemList.java @@ -0,0 +1,33 @@ +package mindustry.world.consumers; + +import arc.struct.*; +import mindustry.gen.*; +import mindustry.type.*; + +public class ConsumeItemList extends ConsumeItemFilter{ + public ObjectFloatMap itemMultipliers = new ObjectFloatMap<>(); + + public ConsumeItemList(Item... items){ + this(); + for(Item i : items){ + itemMultipliers.put(i, 1f); + } + } + + public ConsumeItemList(){ + filter = item -> itemMultipliers.containsKey(item); + } + + /** Initializes item efficiency multiplier map. Format: [item1, mult1, item2, mult2...] */ + public void setMultipliers(Object... objects){ + for(int i = 0; i < objects.length; i += 2){ + itemMultipliers.put((Item)objects[i], (Float)objects[i + 1]); + } + } + + @Override + public float efficiencyMultiplier(Building build){ + var item = getConsumed(build); + return itemMultipliers.get(item, 1f); + } +}