ConsumeItemList (#9947)
* ConsumeItemList * Add to ContentParser * Add efficiency multipliers * Untested adding to ObjectIntMap and ObjectFloatMap * Use a single map
This commit is contained in:
@@ -467,6 +467,7 @@ public class ContentParser{
|
|||||||
case "itemFlammable" -> block.consume((Consume)parser.readValue(ConsumeItemFlammable.class, child));
|
case "itemFlammable" -> block.consume((Consume)parser.readValue(ConsumeItemFlammable.class, child));
|
||||||
case "itemRadioactive" -> block.consume((Consume)parser.readValue(ConsumeItemRadioactive.class, child));
|
case "itemRadioactive" -> block.consume((Consume)parser.readValue(ConsumeItemRadioactive.class, child));
|
||||||
case "itemExplosive" -> block.consume((Consume)parser.readValue(ConsumeItemExplosive.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 "itemExplode" -> block.consume((Consume)parser.readValue(ConsumeItemExplode.class, child));
|
||||||
case "items" -> block.consume(child.isArray() ?
|
case "items" -> block.consume(child.isArray() ?
|
||||||
new ConsumeItems(parser.readValue(ItemStack[].class, child)) :
|
new ConsumeItems(parser.readValue(ItemStack[].class, child)) :
|
||||||
@@ -1061,17 +1062,25 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
Field field = metadata.field;
|
Field field = metadata.field;
|
||||||
try{
|
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){
|
if(mergeMap){
|
||||||
child.remove("add");
|
child.remove("add");
|
||||||
}
|
}
|
||||||
|
|
||||||
Object readField = parser.readValue(field.getType(), metadata.elementType, child, metadata.keyType);
|
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 a map has add: true, add its contents to the map instead
|
||||||
if(mergeMap && field.get(object) instanceof ObjectMap<?,?> baseMap){
|
if(mergeMap && (fieldObj instanceof ObjectMap<?,?> || fieldObj instanceof ObjectIntMap<?> || fieldObj instanceof ObjectFloatMap<?>)){
|
||||||
|
if(field.get(object) instanceof ObjectMap<?,?> baseMap){
|
||||||
baseMap.putAll((ObjectMap)readField);
|
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{
|
}else{
|
||||||
field.set(object, readField);
|
field.set(object, readField);
|
||||||
}
|
}
|
||||||
|
|||||||
33
core/src/mindustry/world/consumers/ConsumeItemList.java
Normal file
33
core/src/mindustry/world/consumers/ConsumeItemList.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package mindustry.world.consumers;
|
||||||
|
|
||||||
|
import arc.struct.*;
|
||||||
|
import mindustry.gen.*;
|
||||||
|
import mindustry.type.*;
|
||||||
|
|
||||||
|
public class ConsumeItemList extends ConsumeItemFilter{
|
||||||
|
public ObjectFloatMap<Item> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user