ConsumeItemList (#9947)

* ConsumeItemList

* Add to ContentParser

* Add efficiency multipliers

* Untested adding to ObjectIntMap and ObjectFloatMap

* Use a single map
This commit is contained in:
MEEPofFaith
2024-07-07 08:38:21 -07:00
committed by GitHub
parent 41aea39a80
commit 4a456645d3
2 changed files with 45 additions and 3 deletions

View File

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