Make SkinApplyEvent a ConnectionEvent

This commit is contained in:
rtm516 2024-03-19 20:27:30 +00:00
parent f1dfe1ae24
commit 2c8e4fefff
No known key found for this signature in database
GPG Key ID: 331715B8B007C67A
4 changed files with 14 additions and 12 deletions

View File

@ -23,10 +23,11 @@
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.api.event.lifecycle;
package org.geysermc.geyser.api.event.bedrock;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.event.Event;
import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.event.connection.ConnectionEvent;
import org.geysermc.geyser.api.skin.Cape;
import org.geysermc.geyser.api.skin.Skin;
import org.geysermc.geyser.api.skin.SkinData;
@ -39,7 +40,7 @@ import java.util.UUID;
* <p>
* Won't be called when a fake player is spawned for a player skull.
*/
public abstract class SkinApplyEvent implements Event {
public abstract class SessionSkinApplyEvent extends ConnectionEvent {
private final String username;
private final UUID uuid;
@ -47,7 +48,8 @@ public abstract class SkinApplyEvent implements Event {
private final boolean isBedrock;
private final SkinData skinData;
public SkinApplyEvent(String username, UUID uuid, boolean slim, boolean isBedrock, SkinData skinData) {
public SessionSkinApplyEvent(@NonNull GeyserConnection connection, String username, UUID uuid, boolean slim, boolean isBedrock, SkinData skinData) {
super(connection);
this.username = username;
this.uuid = uuid;
this.slim = slim;

View File

@ -63,7 +63,7 @@ public class FakeHeadProvider {
.build(new CacheLoader<>() {
@Override
public SkinData load(@NonNull FakeHeadEntry fakeHeadEntry) throws Exception {
SkinData skinData = SkinProvider.getOrDefault(SkinProvider.requestSkinData(fakeHeadEntry.getEntity()), null, 5);
SkinData skinData = SkinProvider.getOrDefault(SkinProvider.requestSkinData(fakeHeadEntry.getEntity(), fakeHeadEntry.getSession()), null, 5);
if (skinData == null) {
throw new Exception("Couldn't load player's original skin");
@ -140,7 +140,7 @@ public class FakeHeadProvider {
String texturesProperty = entity.getTexturesProperty();
SkinProvider.getExecutorService().execute(() -> {
try {
SkinData mergedSkinData = MERGED_SKINS_LOADING_CACHE.get(new FakeHeadEntry(texturesProperty, fakeHeadSkinUrl, entity));
SkinData mergedSkinData = MERGED_SKINS_LOADING_CACHE.get(new FakeHeadEntry(texturesProperty, fakeHeadSkinUrl, entity, session));
SkinManager.sendSkinPacket(session, entity, mergedSkinData);
} catch (ExecutionException e) {
GeyserImpl.getInstance().getLogger().error("Couldn't merge skin of " + entity.getUsername() + " with head skin url " + fakeHeadSkinUrl, e);
@ -157,7 +157,7 @@ public class FakeHeadProvider {
return;
}
SkinProvider.requestSkinData(entity).whenCompleteAsync((skinData, throwable) -> {
SkinProvider.requestSkinData(entity, session).whenCompleteAsync((skinData, throwable) -> {
if (throwable != null) {
GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.skin.fail", entity.getUuid()), throwable);
return;
@ -174,6 +174,7 @@ public class FakeHeadProvider {
private final String texturesProperty;
private final String fakeHeadSkinUrl;
private PlayerEntity entity;
private GeyserSession session;
@Override
public boolean equals(Object o) {

View File

@ -173,7 +173,7 @@ public class SkinManager {
public static void requestAndHandleSkinAndCape(PlayerEntity entity, GeyserSession session,
Consumer<SkinProvider.SkinAndCape> skinAndCapeConsumer) {
SkinProvider.requestSkinData(entity).whenCompleteAsync((skinData, throwable) -> {
SkinProvider.requestSkinData(entity, session).whenCompleteAsync((skinData, throwable) -> {
if (skinData == null) {
if (skinAndCapeConsumer != null) {
skinAndCapeConsumer.accept(null);

View File

@ -35,7 +35,7 @@ import lombok.NoArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.event.lifecycle.SkinApplyEvent;
import org.geysermc.geyser.api.event.bedrock.SessionSkinApplyEvent;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.api.skin.Cape;
import org.geysermc.geyser.api.skin.Skin;
@ -232,7 +232,7 @@ public class SkinProvider {
return CACHED_JAVA_CAPES.getIfPresent(capeUrl);
}
static CompletableFuture<SkinData> requestSkinData(PlayerEntity entity) {
static CompletableFuture<SkinData> requestSkinData(PlayerEntity entity, GeyserSession session) {
SkinManager.GameProfileData data = SkinManager.GameProfileData.from(entity);
if (data == null) {
// This player likely does not have a textures property
@ -257,8 +257,7 @@ public class SkinProvider {
// Call event to allow extensions to modify the skin, cape and geo
boolean isBedrock = GeyserImpl.getInstance().connectionByUuid(entity.getUuid()) != null;
final SkinData[] skinData = {new SkinData(skin, cape, geometry)};
GeyserImpl.getInstance().eventBus().fire(new SkinApplyEvent(entity.getUsername(), entity.getUuid(), data.isAlex(), isBedrock, skinData[0]) {
GeyserImpl.getInstance().eventBus().fire(new SessionSkinApplyEvent(session, entity.getUsername(), entity.getUuid(), data.isAlex(), isBedrock, skinData[0]) {
@Override
public void skin(@NonNull Skin newSkin) {
skinData[0] = new SkinData(newSkin, skinData[0].cape(), skinData[0].geometry());