use of net.minecraft.recipe.RecipeType in project nbt-crafting by Siphalor.
the class NbtCraftingClient method onInitializeClient.
@Override
public void onInitializeClient() {
ClientLoginNetworking.registerGlobalReceiver(NbtCrafting.PRESENCE_CHANNEL, (client, handler, buf, listenerAdder) -> {
return CompletableFuture.completedFuture(new PacketByteBuf(Unpooled.buffer()));
});
ClientSidePacketRegistry.INSTANCE.register(NbtCrafting.UPDATE_ANVIL_TEXT_S2C_PACKET_ID, (packetContext, packetByteBuf) -> {
if (MinecraftClient.getInstance().currentScreen instanceof AnvilScreen) {
((AnvilScreenAccessor) MinecraftClient.getInstance().currentScreen).getNameField().setText(packetByteBuf.readString());
} else
packetByteBuf.readString();
});
ClientPlayNetworking.registerGlobalReceiver(NbtCrafting.UPDATE_ADVANCED_RECIPES_PACKET_ID, (client, handler, buf, responseSender) -> {
RecipeManager recipeManager = handler.getRecipeManager();
Map<RecipeType<?>, Map<Identifier, Recipe<?>>> recipeMap = ((RecipeManagerAccessor) recipeManager).getRecipes();
recipeMap = new HashMap<>(recipeMap);
int recipeCount = buf.readVarInt();
NbtCrafting.advancedIngredientSerializationEnabled.set(true);
for (int i = 0; i < recipeCount; i++) {
RecipeSerializer<?> serializer = Registry.RECIPE_SERIALIZER.get(buf.readIdentifier());
Identifier id = buf.readIdentifier();
Recipe<?> recipe = serializer.read(id, buf);
Map<Identifier, Recipe<?>> recipeType = recipeMap.computeIfAbsent(recipe.getType(), rt -> new HashMap<>());
recipeType.put(id, recipe);
}
NbtCrafting.advancedIngredientSerializationEnabled.set(false);
((RecipeManagerAccessor) recipeManager).setRecipes(ImmutableMap.copyOf(recipeMap));
});
}
use of net.minecraft.recipe.RecipeType in project Polymorph by TheIllusiveC4.
the class AbstractRecipeData method getRecipe.
@SuppressWarnings("unchecked")
@Override
public <T extends Recipe<C>, C extends Inventory> Optional<T> getRecipe(RecipeType<T> pType, C pInventory, World pWorld, List<T> pRecipes) {
this.getLoadedRecipe().flatMap(id -> pWorld.getRecipeManager().get(id)).ifPresent(selected -> {
try {
if (selected.getType() == pType && (((T) selected).matches(pInventory, pWorld) || isEmpty(pInventory))) {
this.setSelectedRecipe(selected);
}
} catch (ClassCastException e) {
PolymorphMod.LOGGER.error("Recipe {} does not match inventory {}", selected.getId(), pInventory);
}
this.loadedRecipe = null;
});
if (this.isEmpty(pInventory)) {
this.setFailing(false);
this.sendRecipesListToListeners(true);
return Optional.empty();
}
AtomicReference<T> ref = new AtomicReference<>(null);
this.getLastRecipe().ifPresent(recipe -> {
try {
if (recipe.getType() == pType && ((T) recipe).matches(pInventory, pWorld)) {
this.getSelectedRecipe().ifPresent(selected -> {
try {
if (selected.getType() == pType && ((T) selected).matches(pInventory, pWorld)) {
ref.set((T) selected);
}
} catch (ClassCastException e) {
PolymorphMod.LOGGER.error("Recipe {} does not match inventory {}", selected.getId(), pInventory);
}
});
}
} catch (ClassCastException e) {
PolymorphMod.LOGGER.error("Recipe {} does not match inventory {}", recipe.getId(), pInventory);
}
});
T result = ref.get();
if (result != null) {
this.setFailing(false);
this.sendRecipesListToListeners(false);
return Optional.of(result);
}
SortedSet<RecipePair> newDataset = new TreeSet<>();
List<T> recipes = pRecipes.isEmpty() ? pWorld.getRecipeManager().getAllMatches(pType, pInventory, pWorld) : pRecipes;
if (recipes.isEmpty()) {
this.setFailing(true);
this.sendRecipesListToListeners(true);
return Optional.empty();
}
for (T entry : recipes) {
Identifier id = entry.getId();
if (ref.get() == null && this.getSelectedRecipe().map(recipe -> recipe.getId().equals(id)).orElse(false)) {
ref.set(entry);
}
newDataset.add(new RecipePairImpl(id, entry.craft(pInventory)));
}
this.setRecipesList(newDataset);
result = ref.get();
result = result != null ? result : recipes.get(0);
this.lastRecipe = result;
this.setSelectedRecipe(result);
this.setFailing(false);
this.sendRecipesListToListeners(false);
return Optional.of(result);
}
use of net.minecraft.recipe.RecipeType in project Polymorph by TheIllusiveC4.
the class AbstractStackRecipeData method getRecipe.
@SuppressWarnings("unchecked")
@Override
public <T extends Recipe<C>, C extends Inventory> Optional<T> getRecipe(RecipeType<T> pType, C pInventory, World pWorld, List<T> pRecipes) {
this.getLoadedRecipe().flatMap(id -> pWorld.getRecipeManager().get(id)).ifPresent(selected -> {
try {
if (selected.getType() == pType && (((T) selected).matches(pInventory, pWorld) || isEmpty(pInventory))) {
this.setSelectedRecipe(selected);
}
} catch (ClassCastException e) {
PolymorphMod.LOGGER.error("Recipe {} does not match inventory {}", selected.getId(), pInventory);
}
this.loadedRecipe = null;
});
if (this.isEmpty(pInventory)) {
this.setFailing(false);
this.sendRecipesListToListeners(true);
return Optional.empty();
}
AtomicReference<T> ref = new AtomicReference<>(null);
this.getLastRecipe().ifPresent(recipe -> {
try {
if (recipe.getType() == pType && ((T) recipe).matches(pInventory, pWorld)) {
this.getSelectedRecipe().ifPresent(selected -> {
try {
if (selected.getType() == pType && ((T) selected).matches(pInventory, pWorld)) {
ref.set((T) selected);
}
} catch (ClassCastException e) {
PolymorphMod.LOGGER.error("Recipe {} does not match inventory {}", selected.getId(), pInventory);
}
});
}
} catch (ClassCastException e) {
PolymorphMod.LOGGER.error("Recipe {} does not match inventory {}", recipe.getId(), pInventory);
}
});
T result = ref.get();
if (result != null) {
this.setFailing(false);
this.sendRecipesListToListeners(false);
return Optional.of(result);
}
SortedSet<RecipePair> newDataset = new TreeSet<>();
List<T> recipes = pRecipes.isEmpty() ? pWorld.getRecipeManager().getAllMatches(pType, pInventory, pWorld) : pRecipes;
if (recipes.isEmpty()) {
this.setFailing(true);
this.sendRecipesListToListeners(true);
return Optional.empty();
}
for (T entry : recipes) {
Identifier id = entry.getId();
if (ref.get() == null && this.getSelectedRecipe().map(recipe -> recipe.getId().equals(id)).orElse(false)) {
ref.set(entry);
}
newDataset.add(new RecipePairImpl(id, entry.craft(pInventory)));
}
this.setRecipesList(newDataset);
result = ref.get();
result = result != null ? result : recipes.get(0);
this.lastRecipe = result;
this.setSelectedRecipe(result);
this.setFailing(false);
this.sendRecipesListToListeners(false);
return Optional.of(result);
}
use of net.minecraft.recipe.RecipeType in project bewitchment by MoriyaShiine.
the class BWRecipeTypes method create.
private static <T extends Recipe<?>> RecipeType<T> create(String name) {
RecipeType<T> type = new RecipeType<>() {
@Override
public String toString() {
return name;
}
};
RECIPE_TYPES.put(type, new Identifier(Bewitchment.MODID, name));
return type;
}
use of net.minecraft.recipe.RecipeType in project WK by witches-kitchen.
the class WKRecipeTypes method register.
private static <T extends Recipe<?>> RecipeType<T> register(String name) {
RecipeType<T> type = new RecipeType<>() {
@Override
public String toString() {
return name;
}
};
RECIPE_TYPES.put(type, new Identifier(WK.MODID, name));
return type;
}
Aggregations