From 9273c32d4b02202a190c407d72d9e01b74792330 Mon Sep 17 00:00:00 2001 From: asie <kontakt@asie.pl> Date: Sun, 18 Nov 2018 09:51:12 +0100 Subject: [PATCH] update mappings, fix block registration issue, push prototype HandlerList --- build.gradle | 2 +- .../fabric/mixin/registry/MixinIdList.java | 4 +- .../mixin/registry/MixinIdRegistry.java | 16 ++++++- .../fabric/registry/RegistryListener.java | 1 + .../fabric/registry/RegistrySyncManager.java | 2 +- .../BootstrapBiomeRegistryListener.java | 2 +- .../BootstrapBlockRegistryListener.java | 9 +++- .../BootstrapFluidRegistryListener.java | 4 +- .../BootstrapItemRegistryListener.java | 2 +- .../registry/listeners/IdListUpdater.java | 2 +- .../net/fabricmc/fabric/util/HandlerList.java | 46 +++++++++++++++++++ .../fabricmc/fabric/util/HandlerRegistry.java | 21 +++++++++ 12 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 src/main/java/net/fabricmc/fabric/util/HandlerList.java create mode 100644 src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java diff --git a/build.gradle b/build.gradle index 4daed6d1c..d51188b9b 100644 --- a/build.gradle +++ b/build.gradle @@ -31,7 +31,7 @@ minecraft { dependencies { minecraft "com.mojang:minecraft:18w46a" - mappings "net.fabricmc:pomf:18w46a.4" + mappings "net.fabricmc:pomf:18w46a.6" modCompile "net.fabricmc:fabric-loader:18w44a-0.1.0.46" } diff --git a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java index c64b423f1..6de2144f8 100644 --- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java +++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java @@ -27,7 +27,7 @@ import java.util.List; @Mixin(IdList.class) public class MixinIdList implements ExtendedIdList { @Shadow - private int field_11099; + private int nextId; @Shadow private IdentityHashMap idMap; @Shadow @@ -35,7 +35,7 @@ public class MixinIdList implements ExtendedIdList { @Override public void clear() { - field_11099 = 0; + nextId = 0; idMap.clear(); list.clear(); } diff --git a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java index 69739373b..986788bb6 100644 --- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java +++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java @@ -61,8 +61,9 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab } } + @SuppressWarnings({ "unchecked", "ConstantConditions" }) @Inject(method = "set", at = @At("HEAD")) - public void set(int id, Identifier identifier, Object object, CallbackInfoReturnable info) { + public void setPre(int id, Identifier identifier, Object object, CallbackInfoReturnable info) { IdRegistry<Object> registry = (IdRegistry<Object>) (Object) this; if (listeners != null) { for (RegistryListener listener : listeners) { @@ -71,6 +72,17 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab } } + @SuppressWarnings({ "unchecked", "ConstantConditions" }) + @Inject(method = "set", at = @At("RETURN")) + public void setPost(int id, Identifier identifier, Object object, CallbackInfoReturnable info) { + IdRegistry<Object> registry = (IdRegistry<Object>) (Object) this; + if (listeners != null) { + for (RegistryListener listener : listeners) { + listener.afterRegistryRegistration(registry, id, identifier, object); + } + } + } + @Override public void remap(Object2IntMap<Identifier> idMap, boolean reallocateMissingEntries) throws RemapException { //noinspection unchecked, ConstantConditions @@ -120,7 +132,7 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab } // We don't really need to clear anything but idStore yet. - idStore.method_15229(); + idStore.clear(); nextId = 0; for (Identifier identifier : idMap.keySet()) { diff --git a/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java index 3b246fbb4..976429efb 100644 --- a/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java +++ b/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java @@ -22,4 +22,5 @@ import net.minecraft.util.registry.Registry; public interface RegistryListener<T> { default void beforeRegistryCleared(Registry<T> registry) {} default void beforeRegistryRegistration(Registry<T> registry, int id, Identifier identifier, T object, boolean isNew) {} + default void afterRegistryRegistration(Registry<T> registry, int id, Identifier identifier, T object) {} } diff --git a/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java b/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java index 6101e1119..d5c694010 100644 --- a/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java +++ b/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java @@ -95,7 +95,7 @@ public final class RegistrySyncManager { TagCompound mainTag = tag.getTagCompound("registries"); for (Identifier registryId : Registry.REGISTRIES.keys()) { - if (!mainTag.hasKey(registryId.toString())) { + if (!mainTag.containsKey(registryId.toString())) { continue; } diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java index 7315960ad..f6c034251 100644 --- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java +++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java @@ -34,7 +34,7 @@ public class BootstrapBiomeRegistryListener implements RegistryListener<Biome> { public void beforeRegistryRegistration(Registry<Biome> registry, int id, Identifier identifier, Biome object, boolean isNew) { // refer net.minecraft.biome.Biomes if (object.hasParent()) { - Biome.PARENT_BIOME_ID_MAP.add(object, id); + Biome.PARENT_BIOME_ID_MAP.set(object, id); } } } diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java index 099dc085a..622220246 100644 --- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java +++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java @@ -27,7 +27,7 @@ import net.minecraft.util.registry.Registry; public class BootstrapBlockRegistryListener implements RegistryListener<Block> { @Override public void beforeRegistryCleared(Registry<Block> registry) { - ((ExtendedIdList) Block.BLOCKSTATE_ID_LIST).clear(); + ((ExtendedIdList) Block.STATE_IDS).clear(); } @Override @@ -35,9 +35,14 @@ public class BootstrapBlockRegistryListener implements RegistryListener<Block> { // refer net.minecraft.block.Blocks for (BlockState state : object.getStateFactory().getStates()) { state.method_11590(); - Block.BLOCKSTATE_ID_LIST.method_10205(state); + Block.STATE_IDS.add(state); } + } + @Override + public void afterRegistryRegistration(Registry<Block> registry, int id, Identifier identifier, Block object) { + System.out.println(identifier); + // refer net.minecraft.block.Blocks object.getDropTableId(); } } diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java index 16d3467ec..24ab9295f 100644 --- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java +++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java @@ -28,14 +28,14 @@ import net.minecraft.util.registry.Registry; public class BootstrapFluidRegistryListener implements RegistryListener<Fluid> { @Override public void beforeRegistryCleared(Registry<Fluid> registry) { - ((ExtendedIdList) Block.BLOCKSTATE_ID_LIST).clear(); + ((ExtendedIdList) Fluid.STATE_IDS).clear(); } @Override public void beforeRegistryRegistration(Registry<Fluid> registry, int id, Identifier identifier, Fluid object, boolean isNew) { // refer net.minecraft.fluid.Fluids for (FluidState state : object.getStateFactory().getStates()) { - Fluid.field_15904.method_10205(state); + Fluid.STATE_IDS.add(state); } } } diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java index b09a42151..7451b8261 100644 --- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java +++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java @@ -33,7 +33,7 @@ public class BootstrapItemRegistryListener implements RegistryListener<Item> { public void beforeRegistryRegistration(Registry<Item> registry, int id, Identifier identifier, Item object, boolean isNew) { // refer net.minecraft.item.Items if (object instanceof ItemBlock) { - ((ItemBlock) object).method_7713(Item.BLOCK_ITEM_MAP, object); + ((ItemBlock) object).registerBlockItemMap(Item.BLOCK_ITEM_MAP, object); } } } diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java b/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java index 14eac4b89..b9472ac57 100644 --- a/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java +++ b/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java @@ -58,7 +58,7 @@ public class IdListUpdater<K, V> implements RegistryListener<K> { @Override public void beforeRegistryRegistration(Registry<K> registry, int id, Identifier identifier, K object, boolean isNew) { if (mapperCache.containsKey(identifier)) { - mappers.add(mapperCache.get(identifier), id); + mappers.set(mapperCache.get(identifier), id); } } } diff --git a/src/main/java/net/fabricmc/fabric/util/HandlerList.java b/src/main/java/net/fabricmc/fabric/util/HandlerList.java new file mode 100644 index 000000000..fb9b676b6 --- /dev/null +++ b/src/main/java/net/fabricmc/fabric/util/HandlerList.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.util; + +public class HandlerList<T> implements HandlerRegistry<T> { + private static final Object[] EMPTY = new Object[0]; + private T[] array; + + @SuppressWarnings("unchecked") + public HandlerList() { + this.array = (T[]) EMPTY; + } + + @Override + public void register(T handler) { + for (int i = 0; i < array.length; i++) { + if (array[i] == handler) { + throw new RuntimeException("Handler " + handler + " already registered!"); + } + } + + //noinspection unchecked + T[] newArray = (T[]) new Object[array.length + 1]; + System.arraycopy(array, 0, newArray, 0, array.length); + newArray[array.length] = handler; + array = newArray; + } + + public T[] getBackingArray() { + return array; + } +} diff --git a/src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java b/src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java new file mode 100644 index 000000000..618708bc1 --- /dev/null +++ b/src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.util; + +public interface HandlerRegistry<T> { + void register(T handler); +}