Skip to content

Commit ddce101

Browse files
committed
Merge branch 'master' of https://github.com/GeyserMC/Geyser
2 parents 7d5c4a3 + 96f0098 commit ddce101

File tree

6 files changed

+243
-111
lines changed

6 files changed

+243
-111
lines changed

core/src/main/java/org/geysermc/geyser/GeyserImpl.java

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@
5555
import org.geysermc.geyser.api.command.CommandSource;
5656
import org.geysermc.geyser.api.event.EventBus;
5757
import org.geysermc.geyser.api.event.EventRegistrar;
58-
import org.geysermc.geyser.api.event.lifecycle.*;
58+
import org.geysermc.geyser.api.event.lifecycle.GeyserPostInitializeEvent;
59+
import org.geysermc.geyser.api.event.lifecycle.GeyserPostReloadEvent;
60+
import org.geysermc.geyser.api.event.lifecycle.GeyserPreInitializeEvent;
61+
import org.geysermc.geyser.api.event.lifecycle.GeyserPreReloadEvent;
62+
import org.geysermc.geyser.api.event.lifecycle.GeyserShutdownEvent;
5963
import org.geysermc.geyser.api.network.AuthType;
6064
import org.geysermc.geyser.api.network.BedrockListener;
6165
import org.geysermc.geyser.api.network.RemoteServer;
@@ -85,7 +89,13 @@
8589
import org.geysermc.geyser.text.GeyserLocale;
8690
import org.geysermc.geyser.text.MinecraftLocale;
8791
import org.geysermc.geyser.translator.text.MessageTranslator;
88-
import org.geysermc.geyser.util.*;
92+
import org.geysermc.geyser.util.AssetUtils;
93+
import org.geysermc.geyser.util.CooldownUtils;
94+
import org.geysermc.geyser.util.DimensionUtils;
95+
import org.geysermc.geyser.util.Metrics;
96+
import org.geysermc.geyser.util.NewsHandler;
97+
import org.geysermc.geyser.util.VersionCheckUtils;
98+
import org.geysermc.geyser.util.WebUtils;
8999
import org.geysermc.mcprotocollib.network.tcp.TcpSession;
90100

91101
import java.io.File;
@@ -97,11 +107,19 @@
97107
import java.nio.file.Path;
98108
import java.security.Key;
99109
import java.text.DecimalFormat;
100-
import java.util.*;
110+
import java.util.ArrayList;
111+
import java.util.Collections;
112+
import java.util.HashMap;
113+
import java.util.List;
114+
import java.util.Locale;
115+
import java.util.Map;
116+
import java.util.Objects;
117+
import java.util.UUID;
101118
import java.util.concurrent.CompletableFuture;
102119
import java.util.concurrent.ConcurrentHashMap;
103120
import java.util.concurrent.Executors;
104121
import java.util.concurrent.ScheduledExecutorService;
122+
import java.util.function.Consumer;
105123
import java.util.regex.Matcher;
106124
import java.util.regex.Pattern;
107125

@@ -645,16 +663,11 @@ public void disable() {
645663
bootstrap.getGeyserLogger().info(GeyserLocale.getLocaleStringLog("geyser.core.shutdown.kick.done"));
646664
}
647665

648-
scheduledThread.shutdown();
649-
geyserServer.shutdown();
650-
if (skinUploader != null) {
651-
skinUploader.close();
652-
}
653-
newsHandler.shutdown();
654-
655-
if (this.erosionUnixListener != null) {
656-
this.erosionUnixListener.close();
657-
}
666+
runIfNonNull(scheduledThread, ScheduledExecutorService::shutdown);
667+
runIfNonNull(geyserServer, GeyserServer::shutdown);
668+
runIfNonNull(skinUploader, FloodgateSkinUploader::close);
669+
runIfNonNull(newsHandler, NewsHandler::shutdown);
670+
runIfNonNull(erosionUnixListener, UnixSocketClientListener::close);
658671

659672
Registries.RESOURCE_PACKS.get().clear();
660673

@@ -833,6 +846,12 @@ public void saveRefreshToken(@NonNull String bedrockName, @NonNull String refres
833846
}
834847
}
835848

849+
private <T> void runIfNonNull(T nullable, Consumer<T> consumer) {
850+
if (nullable != null) {
851+
consumer.accept(nullable);
852+
}
853+
}
854+
836855
private void scheduleRefreshTokensWrite() {
837856
scheduledThread.execute(() -> {
838857
// Ensure all writes are handled on the same thread
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2024 GeyserMC. http://geysermc.org
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy
5+
* of this software and associated documentation files (the "Software"), to deal
6+
* in the Software without restriction, including without limitation the rights
7+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
* copies of the Software, and to permit persons to whom the Software is
9+
* furnished to do so, subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in
12+
* all copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
* THE SOFTWARE.
21+
*
22+
* @author GeyserMC
23+
* @link https://github.com/GeyserMC/Geyser
24+
*/
25+
26+
package org.geysermc.geyser.item.type;
27+
28+
import org.checkerframework.checker.nullness.qual.Nullable;
29+
import org.geysermc.geyser.session.GeyserSession;
30+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
31+
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
32+
33+
public interface BedrockRequiresTagItem {
34+
35+
void addRequiredNbt(GeyserSession session, @Nullable DataComponents components, BedrockItemBuilder builder);
36+
}

core/src/main/java/org/geysermc/geyser/item/type/FireworkRocketItem.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import it.unimi.dsi.fastutil.ints.IntArrays;
2929
import org.checkerframework.checker.nullness.qual.NonNull;
30+
import org.checkerframework.checker.nullness.qual.Nullable;
31+
import org.cloudburstmc.nbt.NbtList;
3032
import org.cloudburstmc.nbt.NbtMap;
3133
import org.cloudburstmc.nbt.NbtMapBuilder;
3234
import org.cloudburstmc.nbt.NbtType;
@@ -41,7 +43,7 @@
4143
import java.util.ArrayList;
4244
import java.util.List;
4345

44-
public class FireworkRocketItem extends Item {
46+
public class FireworkRocketItem extends Item implements BedrockRequiresTagItem {
4547
public FireworkRocketItem(String javaIdentifier, Builder builder) {
4648
super(javaIdentifier, builder);
4749
}
@@ -58,14 +60,16 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul
5860
fireworksNbt.putByte("Flight", (byte) fireworks.getFlightDuration());
5961

6062
List<Fireworks.FireworkExplosion> explosions = fireworks.getExplosions();
61-
if (explosions.isEmpty()) {
62-
return;
63-
}
64-
List<NbtMap> explosionNbt = new ArrayList<>();
65-
for (Fireworks.FireworkExplosion explosion : explosions) {
66-
explosionNbt.add(translateExplosionToBedrock(explosion));
63+
if (!explosions.isEmpty()) {
64+
List<NbtMap> explosionNbt = new ArrayList<>();
65+
for (Fireworks.FireworkExplosion explosion : explosions) {
66+
explosionNbt.add(translateExplosionToBedrock(explosion));
67+
}
68+
fireworksNbt.putList("Explosions", NbtType.COMPOUND, explosionNbt);
69+
} else {
70+
// This is the default firework
71+
fireworksNbt.put("Explosions", NbtList.EMPTY);
6772
}
68-
fireworksNbt.putList("Explosions", NbtType.COMPOUND, explosionNbt);
6973
builder.putCompound("Fireworks", fireworksNbt.build());
7074
}
7175

@@ -138,4 +142,20 @@ static Fireworks.FireworkExplosion translateExplosionToJava(NbtMap explosion) {
138142
return null;
139143
}
140144
}
145+
146+
@Override
147+
public void addRequiredNbt(GeyserSession session, @Nullable DataComponents components, BedrockItemBuilder builder) {
148+
if (components != null) {
149+
Fireworks fireworks = components.get(DataComponentType.FIREWORKS);
150+
if (fireworks != null) {
151+
// Already translated
152+
return;
153+
}
154+
}
155+
156+
NbtMapBuilder fireworksNbt = NbtMap.builder();
157+
fireworksNbt.putByte("Flight", (byte) 1);
158+
fireworksNbt.put("Explosions", NbtList.EMPTY);
159+
builder.putCompound("Fireworks", fireworksNbt.build());
160+
}
141161
}

core/src/main/java/org/geysermc/geyser/translator/item/ItemTranslator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.geysermc.geyser.item.Items;
4646
import org.geysermc.geyser.item.components.Rarity;
4747
import org.geysermc.geyser.item.type.Item;
48+
import org.geysermc.geyser.item.type.BedrockRequiresTagItem;
4849
import org.geysermc.geyser.level.block.type.Block;
4950
import org.geysermc.geyser.registry.BlockRegistries;
5051
import org.geysermc.geyser.registry.Registries;
@@ -148,6 +149,12 @@ public static ItemData translateToBedrock(GeyserSession session, ItemStack stack
148149
if (components.get(DataComponentType.HIDE_TOOLTIP) != null) hideTooltips = true;
149150
}
150151

152+
// Fixes fireworks crafting recipe: they always contain a tag
153+
// TODO remove once all items have their default components
154+
if (javaItem instanceof BedrockRequiresTagItem requiresTagItem) {
155+
requiresTagItem.addRequiredNbt(session, components, nbtBuilder);
156+
}
157+
151158
Rarity rarity = javaItem.rarity();
152159
boolean enchantmentGlint = javaItem.glint();
153160
if (components != null) {

0 commit comments

Comments
 (0)