54 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.util.datafix.fixes;
 | |
| 
 | |
| import com.mojang.datafixers.DataFix;
 | |
| import com.mojang.datafixers.OpticFinder;
 | |
| import com.mojang.datafixers.TypeRewriteRule;
 | |
| import com.mojang.datafixers.Typed;
 | |
| import com.mojang.datafixers.schemas.Schema;
 | |
| import com.mojang.datafixers.types.Type;
 | |
| import com.mojang.datafixers.util.Pair;
 | |
| import com.mojang.serialization.Dynamic;
 | |
| import com.mojang.serialization.DynamicOps;
 | |
| import java.util.List;
 | |
| 
 | |
| public class SpawnerDataFix extends DataFix {
 | |
| 	public SpawnerDataFix(Schema outputSchema) {
 | |
| 		super(outputSchema, true);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected TypeRewriteRule makeRule() {
 | |
| 		Type<?> type = this.getInputSchema().getType(References.UNTAGGED_SPAWNER);
 | |
| 		Type<?> type2 = this.getOutputSchema().getType(References.UNTAGGED_SPAWNER);
 | |
| 		OpticFinder<?> opticFinder = type.findField("SpawnData");
 | |
| 		Type<?> type3 = type2.findField("SpawnData").type();
 | |
| 		OpticFinder<?> opticFinder2 = type.findField("SpawnPotentials");
 | |
| 		Type<?> type4 = type2.findField("SpawnPotentials").type();
 | |
| 		return this.fixTypeEverywhereTyped(
 | |
| 			"Fix mob spawner data structure",
 | |
| 			type,
 | |
| 			type2,
 | |
| 			typed -> typed.updateTyped(opticFinder, type3, typedx -> this.wrapEntityToSpawnData(type3, typedx))
 | |
| 				.updateTyped(opticFinder2, type4, typedx -> this.wrapSpawnPotentialsToWeightedEntries(type4, typedx))
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	private <T> Typed<T> wrapEntityToSpawnData(Type<T> type, Typed<?> typed) {
 | |
| 		DynamicOps<?> dynamicOps = typed.getOps();
 | |
| 		return new Typed<>(type, dynamicOps, (T)Pair.<Object, Dynamic<?>>of(typed.getValue(), new Dynamic<>(dynamicOps)));
 | |
| 	}
 | |
| 
 | |
| 	private <T> Typed<T> wrapSpawnPotentialsToWeightedEntries(Type<T> type, Typed<?> typed) {
 | |
| 		DynamicOps<?> dynamicOps = typed.getOps();
 | |
| 		List<?> list = (List<?>)typed.getValue();
 | |
| 		List<?> list2 = list.stream().map(object -> {
 | |
| 			Pair<Object, Dynamic<?>> pair = (Pair<Object, Dynamic<?>>)object;
 | |
| 			int i = ((Number)pair.getSecond().get("Weight").asNumber().result().orElse(1)).intValue();
 | |
| 			Dynamic<?> dynamic = new Dynamic<>(dynamicOps);
 | |
| 			dynamic = dynamic.set("weight", dynamic.createInt(i));
 | |
| 			Dynamic<?> dynamic2 = pair.getSecond().remove("Weight").remove("Entity");
 | |
| 			return Pair.of(Pair.of(pair.getFirst(), dynamic2), dynamic);
 | |
| 		}).toList();
 | |
| 		return new Typed<>(type, dynamicOps, (T)list2);
 | |
| 	}
 | |
| }
 |