Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/1.20.2' into 1.20.4
Browse files Browse the repository at this point in the history
  • Loading branch information
shedaniel committed Feb 6, 2024
2 parents 907389b + 258f628 commit 93c804f
Show file tree
Hide file tree
Showing 15 changed files with 429 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021, 2022 architectury
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package dev.architectury.registry.client.gui;

import dev.architectury.injectables.annotations.ExpectPlatform;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.world.inventory.tooltip.TooltipComponent;

import java.util.function.Function;

/**
* Registry for {@link ClientTooltipComponent} factories
*/
@Environment(EnvType.CLIENT)
public final class ClientTooltipComponentRegistry {
private ClientTooltipComponentRegistry() {
}

/**
* Allows users to register custom {@link ClientTooltipComponent}
* factories for their {@link TooltipComponent} types.
*
* @param clazz class of {@link T}
* @param factory factory to create instances of {@link ClientTooltipComponent} from {@link T}
* @param <T> the type of {@link TooltipComponent} factory
*/
@ExpectPlatform
public static <T extends TooltipComponent> void register(Class<T> clazz, Function<? super T, ? extends ClientTooltipComponent> factory) {
throw new AssertionError();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021, 2022 architectury
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package dev.architectury.registry.level.entity;

import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.SpawnPlacements;
import net.minecraft.world.level.levelgen.Heightmap;

import java.util.function.Supplier;

public final class SpawnPlacementsRegistry {
/**
* Registers the spawn placement of an entity.
*
* @param type the type of entity
* @param spawnPlacement the type of spawn placement
* @param heightmapType the type of heightmap
* @param spawnPredicate the spawn predicate
* @see net.minecraft.world.entity.SpawnPlacements
*/
@ExpectPlatform
public static <T extends Mob> void register(Supplier<? extends EntityType<T>> type, SpawnPlacements.Type spawnPlacement, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate<T> spawnPredicate) {
throw new AssertionError();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021, 2022 architectury
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package dev.architectury.registry.registries.options;

import net.minecraft.resources.ResourceLocation;

public record DefaultIdRegistrarOption(ResourceLocation defaultId) implements RegistrarOption {
}
2 changes: 1 addition & 1 deletion fabric/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ unifiedPublishing {
releaseType = "$rootProject.artifact_type"
changelog = releaseChangelog()
gameVersions = []
gameLoaders = ["fabric", "quilt"]
gameLoaders = ["fabric"]
mainPublication renameJarForPublication
relations {
depends {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021, 2022 architectury
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package dev.architectury.registry.client.gui.fabric;

import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.rendering.v1.TooltipComponentCallback;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.world.inventory.tooltip.TooltipComponent;
import org.jetbrains.annotations.ApiStatus;

import java.util.function.Function;

@Environment(EnvType.CLIENT)
@ApiStatus.Internal
public class ClientTooltipComponentRegistryImpl {
public static <T extends TooltipComponent> void register(Class<T> clazz, Function<? super T, ? extends ClientTooltipComponent> factory) {
TooltipComponentCallback.EVENT.register((tooltipComponent) -> {
if (clazz.isInstance(tooltipComponent)) {
return factory.apply(clazz.cast(tooltipComponent));
}
return null;
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021, 2022 architectury
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package dev.architectury.registry.level.entity.fabric;

import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.SpawnPlacements;
import net.minecraft.world.level.levelgen.Heightmap;

import java.util.function.Supplier;

public class SpawnPlacementsRegistryImpl {
public static <T extends Mob> void register(Supplier<? extends EntityType<T>> type, SpawnPlacements.Type spawnPlacement, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate<T> spawnPredicate) {
SpawnPlacements.register(type.get(), spawnPlacement, heightmapType, spawnPredicate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import dev.architectury.registry.registries.RegistrarBuilder;
import dev.architectury.registry.registries.RegistrarManager;
import dev.architectury.registry.registries.RegistrySupplier;
import dev.architectury.registry.registries.options.DefaultIdRegistrarOption;
import dev.architectury.registry.registries.options.RegistrarOption;
import dev.architectury.registry.registries.options.StandardRegistrarOption;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
Expand Down Expand Up @@ -92,7 +93,7 @@ public <T> void forRegistry(ResourceKey<Registry<T>> key, Consumer<Registrar<T>>

@Override
public <T> RegistrarBuilder<T> builder(Class<T> type, ResourceLocation registryId) {
return new RegistrarBuilderWrapper<>(modId, FabricRegistryBuilder.createSimple(type, registryId));
return new RegistrarBuilderWrapper<>(modId, type, registryId);
}
}

Expand Down Expand Up @@ -121,22 +122,33 @@ public int hashCode() {

public static class RegistrarBuilderWrapper<T> implements RegistrarBuilder<T> {
private final String modId;
private FabricRegistryBuilder<T, MappedRegistry<T>> builder;
private final Class<T> type;
private final ResourceLocation registryId;
private final List<Consumer<FabricRegistryBuilder<T, ? extends MappedRegistry<T>>>> apply = new ArrayList<>();
@Nullable
private ResourceLocation defaultId;

public RegistrarBuilderWrapper(String modId, FabricRegistryBuilder<T, MappedRegistry<T>> builder) {
public RegistrarBuilderWrapper(String modId, Class<T> type, ResourceLocation registryId) {
this.modId = modId;
this.builder = builder;
this.type = type;
this.registryId = registryId;
}

@Override
public Registrar<T> build() {
final var builder = defaultId == null
? FabricRegistryBuilder.createSimple(type, registryId)
: FabricRegistryBuilder.createDefaulted(type, registryId, defaultId);
apply.forEach(consumer -> consumer.accept(builder));
return RegistrarManager.get(modId).get(builder.buildAndRegister());
}

@Override
public RegistrarBuilder<T> option(RegistrarOption option) {
if (option == StandardRegistrarOption.SYNC_TO_CLIENTS) {
this.builder.attribute(RegistryAttribute.SYNCED);
this.apply.add(builder -> builder.attribute(RegistryAttribute.SYNCED));
} else if (option instanceof DefaultIdRegistrarOption opt) {
this.defaultId = opt.defaultId();
}
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,24 +43,24 @@
import net.minecraftforge.fluids.ForgeFlowingFluid;
import org.jetbrains.annotations.NotNull;

import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;

public abstract class ArchitecturyFlowingFluid extends ForgeFlowingFluid {
private static final Map<ArchitecturyFluidAttributes, FluidType> FLUID_TYPE_MAP = new IdentityHashMap<>();
private final ArchitecturyFluidAttributes attributes;
private final Supplier<FluidType> forgeType;

ArchitecturyFlowingFluid(ArchitecturyFluidAttributes attributes) {
super(toForgeProperties(attributes));
this.attributes = attributes;
this.forgeType = Suppliers.memoize(() -> {
return new ArchitecturyFluidAttributesForge(FluidType.Properties.create(), this, attributes);
});
}

private static Properties toForgeProperties(ArchitecturyFluidAttributes attributes) {
Properties forge = new Properties(Suppliers.memoize(() -> {
return new ArchitecturyFluidAttributesForge(FluidType.Properties.create(), attributes.getSourceFluid(), attributes);
return FLUID_TYPE_MAP.computeIfAbsent(attributes, attr -> {
return new ArchitecturyFluidAttributesForge(FluidType.Properties.create(), attr.getSourceFluid(), attr);
});
}), attributes::getSourceFluid, attributes::getFlowingFluid);
forge.slopeFindDistance(attributes.getSlopeFindDistance());
forge.levelDecreasePerBlock(attributes.getDropOff());
Expand All @@ -71,11 +71,6 @@ private static Properties toForgeProperties(ArchitecturyFluidAttributes attribut
return forge;
}

@Override
public FluidType getFluidType() {
return forgeType.get();
}

@Override
public Fluid getFlowing() {
return attributes.getFlowingFluid();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* This file is part of architectury.
* Copyright (C) 2020, 2021, 2022 architectury
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package dev.architectury.registry.client.gui.forge;

import dev.architectury.platform.hooks.EventBusesHooks;
import dev.architectury.utils.ArchitecturyConstants;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.world.inventory.tooltip.TooltipComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.RegisterClientTooltipComponentFactoriesEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

@OnlyIn(Dist.CLIENT)
@ApiStatus.Internal
public class ClientTooltipComponentRegistryImpl {
@Nullable
private static List<Entry<?>> entries = new ArrayList<>();

static {
EventBusesHooks.whenAvailable(ArchitecturyConstants.MOD_ID, bus -> {
bus.<RegisterClientTooltipComponentFactoriesEvent>addListener(EventPriority.HIGH, event -> {
if (entries != null) {
for (Entry<?> entry : entries) {
Entry<TooltipComponent> casted = (Entry<TooltipComponent>) entry;
event.register(casted.clazz(), casted.factory());
}

entries = null;
}
});
});
}

public static <T extends TooltipComponent> void register(Class<T> clazz, Function<? super T, ? extends ClientTooltipComponent> factory) {
if (entries == null) {
throw new IllegalStateException("Cannot register ClientTooltipComponent factory when factories are already aggregated!");
}
entries.add(new Entry<>(clazz, factory));
}

public record Entry<T extends TooltipComponent>(
Class<T> clazz, Function<? super T, ? extends ClientTooltipComponent> factory
) {
}
}
Loading

0 comments on commit 93c804f

Please sign in to comment.