mirror of
https://github.com/FabricMC/fabric.git
synced 2025-09-07 03:39:18 +00:00
23w35a (#3292)
This commit is contained in:
@@ -17,10 +17,6 @@
|
||||
package net.fabricmc.fabric.api.message.v1;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.CompletionException;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.minecraft.network.message.MessageDecorator;
|
||||
import net.minecraft.text.Text;
|
||||
@@ -79,27 +75,17 @@ public final class ServerMessageDecoratorEvent {
|
||||
public static final Identifier STYLING_PHASE = new Identifier("fabric", "styling");
|
||||
|
||||
public static final Event<MessageDecorator> EVENT = EventFactory.createWithPhases(MessageDecorator.class, decorators -> (sender, message) -> {
|
||||
CompletableFuture<Text> future = null;
|
||||
Text decorated = message;
|
||||
|
||||
for (MessageDecorator decorator : decorators) {
|
||||
if (future == null) {
|
||||
future = decorator.decorate(sender, message).handle((decorated, throwable) -> handle(decorated, throwable, decorator));
|
||||
} else {
|
||||
future = future.thenCompose((decorated) -> decorator.decorate(sender, decorated).handle((newlyDecorated, throwable) -> handle(newlyDecorated, throwable, decorator)));
|
||||
}
|
||||
decorated = handle(decorator.decorate(sender, decorated), decorator);
|
||||
}
|
||||
|
||||
return future == null ? CompletableFuture.completedFuture(message) : future;
|
||||
return decorated;
|
||||
}, CONTENT_PHASE, Event.DEFAULT_PHASE, STYLING_PHASE);
|
||||
|
||||
private static <T extends Text> T handle(T decorated, @Nullable Throwable throwable, MessageDecorator decorator) {
|
||||
private static <T extends Text> T handle(T decorated, MessageDecorator decorator) {
|
||||
String decoratorName = decorator.getClass().getName();
|
||||
|
||||
if (throwable != null) {
|
||||
if (throwable instanceof CompletionException) throwable = throwable.getCause();
|
||||
throw new CompletionException("message decorator %s failed".formatted(decoratorName), throwable);
|
||||
}
|
||||
|
||||
return Objects.requireNonNull(decorated, "message decorator %s returned null".formatted(decoratorName));
|
||||
}
|
||||
}
|
||||
|
@@ -30,7 +30,6 @@ import net.fabricmc.fabric.api.message.v1.ServerMessageDecoratorEvent;
|
||||
public class MinecraftServerMixin {
|
||||
@Inject(method = "getMessageDecorator", at = @At("RETURN"), cancellable = true)
|
||||
private void onGetChatDecorator(CallbackInfoReturnable<MessageDecorator> cir) {
|
||||
MessageDecorator originalDecorator = cir.getReturnValue();
|
||||
cir.setReturnValue((sender, message) -> originalDecorator.decorate(sender, message).thenCompose((decorated) -> ServerMessageDecoratorEvent.EVENT.invoker().decorate(sender, decorated)));
|
||||
cir.setReturnValue((sender, message) -> ServerMessageDecoratorEvent.EVENT.invoker().decorate(sender, message));
|
||||
}
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@
|
||||
|
||||
package net.fabricmc.fabric.test.message;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
@@ -41,45 +40,28 @@ public class ChatTest implements ModInitializer {
|
||||
// Basic content phase testing
|
||||
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.CONTENT_PHASE, (sender, message) -> {
|
||||
if (message.getString().contains("tater")) {
|
||||
return CompletableFuture.completedFuture(message.copy().append(" :tiny_potato:"));
|
||||
return message.copy().append(" :tiny_potato:");
|
||||
}
|
||||
|
||||
return CompletableFuture.completedFuture(message);
|
||||
return message;
|
||||
});
|
||||
|
||||
// Content phase testing, with variable info
|
||||
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.CONTENT_PHASE, (sender, message) -> {
|
||||
if (message.getString().contains("random")) {
|
||||
return CompletableFuture.completedFuture(Text.of(String.valueOf(Random.create().nextBetween(0, 100))));
|
||||
return Text.of(String.valueOf(Random.create().nextBetween(0, 100)));
|
||||
}
|
||||
|
||||
return CompletableFuture.completedFuture(message);
|
||||
return message;
|
||||
});
|
||||
|
||||
// Basic styling phase testing
|
||||
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.STYLING_PHASE, (sender, message) -> {
|
||||
if (sender != null && sender.getAbilities().creativeMode) {
|
||||
return CompletableFuture.completedFuture(message.copy().styled(style -> style.withColor(0xFFA500)));
|
||||
return message.copy().styled(style -> style.withColor(0xFFA500));
|
||||
}
|
||||
|
||||
return CompletableFuture.completedFuture(message);
|
||||
});
|
||||
|
||||
// Async testing
|
||||
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.CONTENT_PHASE, (sender, message) -> {
|
||||
if (message.getString().contains("wait")) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
Thread.sleep(Random.create().nextBetween(500, 2000));
|
||||
} catch (InterruptedException ignored) {
|
||||
// Ignore interruption
|
||||
}
|
||||
|
||||
return message;
|
||||
}, ioWorkerExecutor);
|
||||
}
|
||||
|
||||
return CompletableFuture.completedFuture(message);
|
||||
return message;
|
||||
});
|
||||
|
||||
// ServerMessageEvents
|
||||
|
Reference in New Issue
Block a user