Skip to content

Commit

Permalink
Instead of using instance based Registries, manually initialize them
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim203 committed Oct 23, 2024
1 parent 0eee91f commit 1b7b876
Show file tree
Hide file tree
Showing 45 changed files with 450 additions and 1,021 deletions.
55 changes: 28 additions & 27 deletions core/src/main/java/org/geysermc/geyser/GeyserImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,6 @@
import io.netty.util.NettyRuntime;
import io.netty.util.concurrent.DefaultThreadFactory;
import io.netty.util.internal.SystemPropertyUtil;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.file.Path;
import java.security.Key;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
Expand Down Expand Up @@ -127,6 +103,31 @@
import org.geysermc.geyser.util.WebUtils;
import org.geysermc.mcprotocollib.network.tcp.TcpSession;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.file.Path;
import java.security.Key;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Getter
public class GeyserImpl implements GeyserApi, EventRegistrar {
public static final ObjectMapper JSON_MAPPER = new ObjectMapper()
Expand Down Expand Up @@ -296,7 +297,7 @@ private void startInstance() {

SkinProvider.registerCacheImageTask(this);

Registries.resourcePacks().load();
Registries.RESOURCE_PACKS.load();

String geyserUdpPort = System.getProperty("geyserUdpPort", "");
String pluginUdpPort = geyserUdpPort.isEmpty() ? System.getProperty("pluginUdpPort", "") : geyserUdpPort;
Expand Down Expand Up @@ -722,7 +723,7 @@ public void disable() {
runIfNonNull(newsHandler, NewsHandler::shutdown);
runIfNonNull(erosionUnixListener, UnixSocketClientListener::close);

Registries.resourcePacks().get().clear();
Registries.RESOURCE_PACKS.get().clear();

this.setEnabled(false);
}
Expand Down Expand Up @@ -780,7 +781,7 @@ public CommandRegistry commandRegistry() {
@Override
@SuppressWarnings("unchecked")
public <R extends T, T> @NonNull R provider(@NonNull Class<T> apiClass, @Nullable Object... args) {
ProviderSupplier provider = Registries.providers().get(apiClass);
ProviderSupplier provider = Registries.PROVIDERS.get(apiClass);
if (provider == null) {
throw new IllegalArgumentException("No provider found for " + apiClass);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,10 @@ public EntityDefinition<T> build(boolean register) {
}
EntityDefinition<T> definition = new EntityDefinition<>(factory, type, identifier, width, height, offset, registeredProperties, translators);
if (register && definition.entityType() != null) {
Registries.entityDefinitions().get().putIfAbsent(definition.entityType(), definition);
Registries.javaEntityIdentifiers().get().putIfAbsent("minecraft:" + type.name().toLowerCase(Locale.ROOT), definition);
Registries.ENTITY_DEFINITIONS.get().putIfAbsent(definition.entityType(), definition);
Registries.JAVA_ENTITY_IDENTIFIERS.get().putIfAbsent("minecraft:" + type.name().toLowerCase(Locale.ROOT), definition);
if (definition.registeredProperties() != null) {
Registries.bedrockEntityProperties().get().add(definition.registeredProperties().toNbtMap(identifier));
Registries.BEDROCK_ENTITY_PROPERTIES.get().add(definition.registeredProperties().toNbtMap(identifier));
}
}
return definition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1121,7 +1121,7 @@ public final class EntityDefinitions {
.identifier("minecraft:armor_stand") // Emulated
.build(false); // Never sent over the network

Registries.javaEntityIdentifiers().get().put("minecraft:marker", null); // We don't need an entity definition for this as it is never sent over the network
Registries.JAVA_ENTITY_IDENTIFIERS.get().put("minecraft:marker", null); // We don't need an entity definition for this as it is never sent over the network
}

public static void init() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
import java.util.Map;

/**
* A write-only wrapper for temporarily storing entity metadata that will be sent to Bedrock.
* A wrapper for temporarily storing entity metadata that will be sent to Bedrock.
*/
public final class GeyserDirtyMetadata {
private final Map<EntityDataType<?>, Object> metadata = new Object2ObjectLinkedOpenHashMap<>();
Expand All @@ -53,6 +53,14 @@ public boolean hasEntries() {
return !metadata.isEmpty();
}

/**
* Intended for testing purposes only
*/
public <T> T get(EntityDataType<T> entityData) {
//noinspection unchecked
return (T) metadata.get(entityData);
}

@Override
public String toString() {
return metadata.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

package org.geysermc.geyser.entity.type;

import java.util.UUID;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.ParticleType;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
Expand All @@ -39,6 +38,8 @@
import org.geysermc.mcprotocollib.protocol.data.game.level.particle.EntityEffectParticleData;
import org.geysermc.mcprotocollib.protocol.data.game.level.particle.Particle;

import java.util.UUID;

public class AreaEffectCloudEntity extends Entity {

public AreaEffectCloudEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) {
Expand Down Expand Up @@ -68,7 +69,7 @@ public void setRadius(FloatEntityMetadata entityMetadata) {

public void setParticle(EntityMetadata<Particle, ?> entityMetadata) {
Particle particle = entityMetadata.getValue();
Registries.particles().map(particle.getType(), p -> p.levelEventType() instanceof ParticleType particleType ? particleType : null).ifPresent(type ->
Registries.PARTICLES.map(particle.getType(), p -> p.levelEventType() instanceof ParticleType particleType ? particleType : null).ifPresent(type ->
dirtyMetadata.put(EntityDataTypes.AREA_EFFECT_CLOUD_PARTICLE, type));

if (particle.getData() instanceof EntityEffectParticleData effectParticleData) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@

package org.geysermc.geyser.entity.type;

import java.util.EnumSet;
import java.util.UUID;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
Expand All @@ -42,6 +40,9 @@
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.PotionContents;

import java.util.EnumSet;
import java.util.UUID;

public class ThrownPotionEntity extends ThrowableItemEntity {
private static final EnumSet<Potion> NON_ENCHANTED_POTIONS = EnumSet.of(Potion.WATER, Potion.MUNDANE, Potion.THICK, Potion.AWKWARD);

Expand Down Expand Up @@ -72,7 +73,7 @@ public void setItem(EntityMetadata<ItemStack, ?> entityMetadata) {
}
}

boolean isLingering = Registries.javaItems().get().get(itemStack.getId()) == Items.LINGERING_POTION;
boolean isLingering = Registries.JAVA_ITEMS.get().get(itemStack.getId()) == Items.LINGERING_POTION;
setFlag(EntityFlag.LINGERING, isLingering);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,7 @@

package org.geysermc.geyser.inventory;

import java.util.HashMap;
import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.*;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
Expand All @@ -44,6 +39,8 @@
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;

import java.util.HashMap;

@Data
public class GeyserItemStack {
public static final GeyserItemStack EMPTY = new GeyserItemStack(Items.AIR_ID, 0, null);
Expand Down Expand Up @@ -168,7 +165,7 @@ public ItemMapping getMapping(GeyserSession session) {

public Item asItem() {
if (item == null) {
return (item = Registries.javaItems().get().get(javaId));
return (item = Registries.JAVA_ITEMS.get().get(javaId));
}
return item;
}
Expand Down
44 changes: 6 additions & 38 deletions core/src/main/java/org/geysermc/geyser/item/Items.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,46 +25,14 @@

package org.geysermc.geyser.item;

import static org.geysermc.geyser.item.type.Item.builder;

import org.geysermc.geyser.item.components.Rarity;
import org.geysermc.geyser.item.components.ToolTier;
import org.geysermc.geyser.item.type.ArmorItem;
import org.geysermc.geyser.item.type.ArrowItem;
import org.geysermc.geyser.item.type.AxolotlBucketItem;
import org.geysermc.geyser.item.type.BannerItem;
import org.geysermc.geyser.item.type.BlockItem;
import org.geysermc.geyser.item.type.BoatItem;
import org.geysermc.geyser.item.type.CompassItem;
import org.geysermc.geyser.item.type.CrossbowItem;
import org.geysermc.geyser.item.type.DecoratedPotItem;
import org.geysermc.geyser.item.type.DyeItem;
import org.geysermc.geyser.item.type.DyeableArmorItem;
import org.geysermc.geyser.item.type.ElytraItem;
import org.geysermc.geyser.item.type.EnchantedBookItem;
import org.geysermc.geyser.item.type.FilledMapItem;
import org.geysermc.geyser.item.type.FireworkRocketItem;
import org.geysermc.geyser.item.type.FireworkStarItem;
import org.geysermc.geyser.item.type.FishingRodItem;
import org.geysermc.geyser.item.type.GoatHornItem;
import org.geysermc.geyser.item.type.Item;
import org.geysermc.geyser.item.type.MaceItem;
import org.geysermc.geyser.item.type.MapItem;
import org.geysermc.geyser.item.type.OminousBottleItem;
import org.geysermc.geyser.item.type.PlayerHeadItem;
import org.geysermc.geyser.item.type.PotionItem;
import org.geysermc.geyser.item.type.ShieldItem;
import org.geysermc.geyser.item.type.ShulkerBoxItem;
import org.geysermc.geyser.item.type.SpawnEggItem;
import org.geysermc.geyser.item.type.TieredItem;
import org.geysermc.geyser.item.type.TippedArrowItem;
import org.geysermc.geyser.item.type.TropicalFishBucketItem;
import org.geysermc.geyser.item.type.WolfArmorItem;
import org.geysermc.geyser.item.type.WritableBookItem;
import org.geysermc.geyser.item.type.WrittenBookItem;
import org.geysermc.geyser.item.type.*;
import org.geysermc.geyser.level.block.Blocks;
import org.geysermc.geyser.registry.Registries;

import static org.geysermc.geyser.item.type.Item.builder;

/**
* A list, in order, of all Java items.
*/
Expand Down Expand Up @@ -1407,13 +1375,13 @@ public final class Items {
public static final int AIR_ID = AIR.javaId();

private static <T extends Item> T register(T item) {
return register(item, Registries.javaItems().get().size());
return register(item, Registries.JAVA_ITEMS.get().size());
}

public static <T extends Item> T register(T item, int id) {
item.setJavaId(id);
Registries.javaItems().registerWithAnyIndex(id, item, AIR);
Registries.javaItemIdentifiers().register(item.javaIdentifier(), item);
Registries.JAVA_ITEMS.registerWithAnyIndex(id, item, AIR);
Registries.JAVA_ITEM_IDENTIFIERS.register(item.javaIdentifier(), item);
return item;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,6 @@
package org.geysermc.geyser.item.enchantment;

import it.unimi.dsi.fastutil.ints.IntArrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.ToIntFunction;
import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.nbt.NbtMap;
Expand All @@ -42,6 +37,12 @@
import org.geysermc.geyser.util.MinecraftKey;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.ToIntFunction;

/**
* @param description only populated if {@link #bedrockEnchantment()} is not null.
* @param anvilCost also as a rarity multiplier
Expand All @@ -59,7 +60,7 @@ public static Enchantment read(RegistryEntryContext context) {
NbtMap data = context.data();
Set<EnchantmentComponent> effects = readEnchantmentComponents(data.getCompound("effects"));

HolderSet supportedItems = readHolderSet(data.get("supported_items"), itemId -> Registries.javaItemIdentifiers().getOrDefault(itemId.asString(), Items.AIR).javaId());
HolderSet supportedItems = readHolderSet(data.get("supported_items"), itemId -> Registries.JAVA_ITEM_IDENTIFIERS.getOrDefault(itemId.asString(), Items.AIR).javaId());

int maxLevel = data.getInt("max_level");
int anvilCost = data.getInt("anvil_cost");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,6 @@
package org.geysermc.geyser.network;

import io.netty.buffer.Unpooled;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.OptionalInt;
import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.cloudburstmc.protocol.bedrock.codec.compat.BedrockCompat;
Expand Down Expand Up @@ -76,6 +69,14 @@
import org.geysermc.geyser.util.MathUtils;
import org.geysermc.geyser.util.VersionCheckUtils;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.OptionalInt;

public class UpstreamPacketHandler extends LoggingPacketHandler {

private boolean networkSettingsRequested = false;
Expand All @@ -93,7 +94,7 @@ public UpstreamPacketHandler(GeyserImpl geyser, GeyserSession session) {
}

private PacketSignal translateAndDefault(BedrockPacket packet) {
Registries.bedrockPacketTranslators().translate(packet.getClass(), packet, session);
Registries.BEDROCK_PACKET_TRANSLATORS.translate(packet.getClass(), packet, session);
return PacketSignal.HANDLED; // PacketSignal.UNHANDLED will log a WARN publicly
}

Expand Down Expand Up @@ -181,7 +182,7 @@ public PacketSignal handle(LoginPacket loginPacket) {

// Set the block translation based off of version
session.setBlockMappings(BlockRegistries.BLOCKS.forVersion(loginPacket.getProtocolVersion()));
session.setItemMappings(Registries.items().forVersion(loginPacket.getProtocolVersion()));
session.setItemMappings(Registries.ITEMS.forVersion(loginPacket.getProtocolVersion()));

LoginEncryptionUtils.encryptPlayerConnection(session, loginPacket);

Expand All @@ -199,7 +200,7 @@ public PacketSignal handle(LoginPacket loginPacket) {

geyser.getSessionManager().addPendingSession(session);

this.resourcePackLoadEvent = new SessionLoadResourcePacksEventImpl(session, new HashMap<>(Registries.resourcePacks().get()));
this.resourcePackLoadEvent = new SessionLoadResourcePacksEventImpl(session, new HashMap<>(Registries.RESOURCE_PACKS.get()));
this.geyser.eventBus().fire(this.resourcePackLoadEvent);

ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket();
Expand Down
Loading

0 comments on commit 1b7b876

Please sign in to comment.