Skip to content

Commit 3c92e3e

Browse files
committed
introduce scoped registry holder using PhaseTracker
1 parent b88f2ea commit 3c92e3e

12 files changed

Lines changed: 61 additions & 25 deletions

File tree

SpongeAPI

Submodule SpongeAPI updated 28 files

generator/src/main/java/org/spongepowered/vanilla/generator/RegistryScope.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ void populateRegistryGetter(final Builder builder, final CodeBlock registryType)
6363
SERVER {
6464
@Override
6565
protected CodeBlock registryKeyToReference() {
66-
return CodeBlock.of("asDefaultedReference($T::server)", Types.SPONGE);
66+
return CodeBlock.of("asScopedReference()", Types.SPONGE);
6767
}
6868

6969
@Override

src/main/java/org/spongepowered/common/SpongeCommon.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737
import org.spongepowered.api.Sponge;
3838
import org.spongepowered.api.event.Event;
3939
import org.spongepowered.common.applaunch.config.core.SpongeConfigs;
40+
import org.spongepowered.common.event.tracking.PhaseTracker;
4041
import org.spongepowered.common.launch.Launch;
42+
import org.spongepowered.common.registry.SpongeRegistryHolder;
4143
import org.spongepowered.common.scheduler.AsyncScheduler;
4244
import org.spongepowered.common.scheduler.ServerScheduler;
4345

@@ -100,8 +102,21 @@ public static RegistryAccess.Frozen vanillaRegistryAccess() {
100102
return SpongeCommon.server().registryAccess();
101103
}
102104

105+
public static SpongeRegistryHolder scopedHolder() {
106+
var holder = PhaseTracker.getInstance().currentCause().first(SpongeRegistryHolder.class);
107+
// If we have a holder in scope use it directly unless it is game
108+
if (holder.isEmpty() || holder.get() == SpongeCommon.game()) {
109+
110+
if (SpongeCommon.game().isServerAvailable()) {
111+
return (SpongeRegistryHolder) SpongeCommon.server();
112+
}
113+
return SpongeCommon.game();
114+
}
115+
return holder.get();
116+
}
117+
103118
public static <E> Registry<E> vanillaRegistry(ResourceKey<? extends Registry<? extends E>> key) {
104-
return SpongeCommon.vanillaRegistryAccess().lookupOrThrow(key);
119+
return (Registry<E>) SpongeCommon.scopedHolder().lookupOrThrow(key);
105120
}
106121

107122
public static ServerScheduler serverScheduler() {

src/main/java/org/spongepowered/common/SpongeLifecycle.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,13 +212,16 @@ public void beginEstablishServerRegistries(final RegistryHolder server) {
212212

213213
@Override
214214
public void processServerRegistries(final RegistryHolder server, final Stream<? extends org.spongepowered.api.registry.Registry<?>> registries) {
215-
final Map<RegistryType<?>, org.spongepowered.api.registry.Registry<?>> map =
216-
registries.collect(Collectors.toMap(org.spongepowered.api.registry.Registry::type, Function.identity()));
217-
if (!map.isEmpty()) {
218-
map.values().forEach(r -> ((WritableRegistryBridge<?>) r).bridge$setRegistryHolder(server));
219-
this.game.eventManager().post(AbstractRegisterRegistryValueEvent.EngineScopedImpl.server(Cause.of(EventContext.empty(), this.game), this.game, server, map));
220-
map.values().forEach(r -> ((WritableRegistryBridge<?>) r).bridge$markEventCalled());
221-
((SpongeRegistryHolder) server).registryHolder().freezeSpongeDynamicRegistries(false);
215+
try (var frame = PhaseTracker.getInstance().pushCauseFrame()) {
216+
frame.pushCause(server);
217+
final Map<RegistryType<?>, org.spongepowered.api.registry.Registry<?>> map =
218+
registries.collect(Collectors.toMap(org.spongepowered.api.registry.Registry::type, Function.identity()));
219+
if (!map.isEmpty()) {
220+
map.values().forEach(r -> ((WritableRegistryBridge<?>) r).bridge$setRegistryHolder(server));
221+
this.game.eventManager().post(AbstractRegisterRegistryValueEvent.EngineScopedImpl.server(Cause.of(EventContext.empty(), this.game), this.game, server, map));
222+
map.values().forEach(r -> ((WritableRegistryBridge<?>) r).bridge$markEventCalled());
223+
((SpongeRegistryHolder) server).registryHolder().freezeSpongeDynamicRegistries(false);
224+
}
222225
}
223226
}
224227

src/main/java/org/spongepowered/common/data/provider/entity/PaintingData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static void register(final DataProviderRegistrator registrator) {
5353
.setAnd((h, v) -> {
5454
if (!h.level().isClientSide) {
5555
final Holder<PaintingVariant> oldArt = h.getVariant();
56-
var newArt = SpongeCommon.server().registryAccess().lookupOrThrow(Registries.PAINTING_VARIANT).wrapAsHolder((PaintingVariant) (Object) v);
56+
var newArt = SpongeCommon.vanillaRegistry(Registries.PAINTING_VARIANT).wrapAsHolder((PaintingVariant) (Object) v);
5757
h.setVariant(newArt);
5858
((HangingEntityAccessor) h).invoker$setDirection(h.getDirection());
5959
if (!h.survives()) {

src/main/java/org/spongepowered/common/data/provider/item/stack/BookPagesItemStackData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ private static boolean set(final ItemStack holder, final List<Enchantment> value
7171
if (value.isEmpty()) {
7272
return BookPagesItemStackData.delete(holder, component);
7373
}
74-
final var registry = SpongeCommon.server().registryAccess().lookupOrThrow(Registries.ENCHANTMENT);
74+
final var registry = SpongeCommon.vanillaRegistry(Registries.ENCHANTMENT);
7575
holder.update(component, ItemEnchantments.EMPTY, ench -> {
7676
final ItemEnchantments.Mutable mutable = new ItemEnchantments.Mutable(ench);
7777
mutable.keySet().clear();

src/main/java/org/spongepowered/common/data/provider/item/stack/ItemStackData.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,13 @@ public static void register(final DataProviderRegistrator registrator) {
112112
registrator
113113
.asMutable(ItemStack.class)
114114
.create(Keys.BURN_TIME)
115-
.get(h -> SpongeCommon.server().fuelValues().burnDuration(h))
115+
.get(h -> {
116+
if (SpongeCommon.game().isServerAvailable()) {
117+
return SpongeCommon.server().fuelValues().burnDuration(h);
118+
} else {
119+
return null;
120+
}
121+
})
116122
.create(Keys.CONTAINER_ITEM)
117123
.get(h -> (ItemType) h.getItem().getCraftingRemainder().getItem())
118124
.create(Keys.DISPLAY_NAME)
@@ -395,12 +401,12 @@ private static DataTransactionResult deleteAndTransactUseCooldown(final ItemStac
395401
return DataTransactionResult.successNoData();
396402
}
397403
return cooldown.cooldownGroup()
398-
.map(group -> DataTransactionResult.successRemove(List.of(
399-
Value.immutableOf(Keys.COOLDOWN, Ticks.of(cooldown.ticks())),
400-
Value.immutableOf(Keys.COOLDOWN_GROUP, (ResourceKey) (Object) group)
401-
))).orElseGet(() -> DataTransactionResult.successRemove(List.of(
402-
Value.immutableOf(Keys.COOLDOWN, Ticks.of(cooldown.ticks()))
403-
)));
404+
.map(group -> DataTransactionResult.successRemove(List.of(
405+
Value.immutableOf(Keys.COOLDOWN, Ticks.of(cooldown.ticks())),
406+
Value.immutableOf(Keys.COOLDOWN_GROUP, (ResourceKey) (Object) group)
407+
))).orElseGet(() -> DataTransactionResult.successRemove(List.of(
408+
Value.immutableOf(Keys.COOLDOWN, Ticks.of(cooldown.ticks()))
409+
)));
404410
}
405411

406412
}

src/main/java/org/spongepowered/common/event/cause/entity/damage/SpongeDamageSourceBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public DamageSource build() throws IllegalStateException {
6363

6464
@Override
6565
public DamageSource.Builder type(final DamageType damageType) {
66-
final var registry = SpongeCommon.server().registryAccess().lookupOrThrow(Registries.DAMAGE_TYPE);
66+
final var registry = SpongeCommon.vanillaRegistry(Registries.DAMAGE_TYPE);
6767
this.damageType = registry.wrapAsHolder((net.minecraft.world.damagesource.DamageType) (Object) damageType);
6868
return this;
6969
}

src/main/java/org/spongepowered/common/item/enchantment/SpongeRandomEnchantmentListBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public List<Enchantment> build() throws IllegalStateException {
9393
if (this.pool == null || this.pool.isEmpty()) {
9494
Objects.requireNonNull(this.item, "The item cannot be null");
9595
this.randomSource.setSeed(this.seed + this.option);
96-
final var registry = SpongeCommon.server().registryAccess().lookupOrThrow(Registries.ENCHANTMENT);
96+
final var registry = SpongeCommon.vanillaRegistry(Registries.ENCHANTMENT);
9797
var stream = registry.listElements().map($$0x -> (Holder<net.minecraft.world.item.enchantment.Enchantment>)$$0x);
9898
enchantments = EnchantmentHelper.selectEnchantment(this.randomSource, ItemStackUtil.toNative(this.item), this.level, stream);
9999
} else {
@@ -139,7 +139,7 @@ public static List<Enchantment> fromNative(final List<EnchantmentInstance> list)
139139
}
140140

141141
public static List<EnchantmentInstance> toNative(final List<Enchantment> list) {
142-
final var registry = SpongeCommon.server().registryAccess().lookupOrThrow(Registries.ENCHANTMENT);
142+
final var registry = SpongeCommon.vanillaRegistry(Registries.ENCHANTMENT);
143143
return list.stream().map(ench -> {
144144
var mcEnch = registry.wrapAsHolder((net.minecraft.world.item.enchantment.Enchantment) (Object) ench.type());
145145
return new EnchantmentInstance(mcEnch, ench.level());

src/main/java/org/spongepowered/common/registry/SpongeRegistryKey.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.spongepowered.api.registry.RegistryKey;
3131
import org.spongepowered.api.registry.RegistryReference;
3232
import org.spongepowered.api.registry.RegistryType;
33+
import org.spongepowered.common.SpongeCommon;
3334

3435
import java.util.Objects;
3536
import java.util.StringJoiner;
@@ -65,6 +66,11 @@ public final <V extends T> DefaultedRegistryReference<V> asDefaultedReference(fi
6566
return new SpongeDefaultedRegistryReference<>((RegistryKey<V>) this, defaultHolder);
6667
}
6768

69+
@Override
70+
public final <V extends T> DefaultedRegistryReference<V> asScopedReference() {
71+
return new SpongeDefaultedRegistryReference<>((RegistryKey<V>) this, SpongeCommon::scopedHolder);
72+
}
73+
6874
@Override
6975
public int hashCode() {
7076
return Objects.hash(this.registry, this.location);

0 commit comments

Comments
 (0)