101 lines
4.3 KiB
Java
101 lines
4.3 KiB
Java
package com.hypixel.hytale.builtin.asseteditor;
|
|
|
|
import com.hypixel.hytale.component.Ref;
|
|
import com.hypixel.hytale.component.Store;
|
|
import com.hypixel.hytale.logger.HytaleLogger;
|
|
import com.hypixel.hytale.protocol.packets.asseteditor.AssetEditorAuthorization;
|
|
import com.hypixel.hytale.protocol.packets.asseteditor.AssetEditorInitialize;
|
|
import com.hypixel.hytale.protocol.packets.asseteditor.AssetEditorUpdateJsonAsset;
|
|
import com.hypixel.hytale.server.core.entity.entities.Player;
|
|
import com.hypixel.hytale.server.core.io.handlers.IPacketHandler;
|
|
import com.hypixel.hytale.server.core.io.handlers.SubPacketHandler;
|
|
import com.hypixel.hytale.server.core.universe.PlayerRef;
|
|
import com.hypixel.hytale.server.core.universe.world.World;
|
|
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.logging.Level;
|
|
import javax.annotation.Nonnull;
|
|
|
|
public class AssetEditorGamePacketHandler implements SubPacketHandler {
|
|
private static final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
|
|
private final IPacketHandler packetHandler;
|
|
|
|
public AssetEditorGamePacketHandler(IPacketHandler packetHandler) {
|
|
this.packetHandler = packetHandler;
|
|
}
|
|
|
|
@Override
|
|
public void registerHandlers() {
|
|
if (AssetEditorPlugin.get().isDisabled()) {
|
|
this.packetHandler.registerNoOpHandlers(302);
|
|
this.packetHandler.registerNoOpHandlers(325);
|
|
} else {
|
|
this.packetHandler.registerHandler(302, p -> this.handle((AssetEditorInitialize)p));
|
|
this.packetHandler.registerHandler(323, p -> this.handle((AssetEditorUpdateJsonAsset)p));
|
|
}
|
|
}
|
|
|
|
public void handle(AssetEditorInitialize packet) {
|
|
PlayerRef playerRef = this.packetHandler.getPlayerRef();
|
|
Ref<EntityStore> ref = playerRef.getReference();
|
|
if (ref != null && ref.isValid()) {
|
|
Store<EntityStore> store = ref.getStore();
|
|
World world = store.getExternalData().getWorld();
|
|
world.execute(() -> {
|
|
Player playerComponent = store.getComponent(ref, Player.getComponentType());
|
|
|
|
assert playerComponent != null;
|
|
|
|
if (this.lacksPermission(playerComponent, false)) {
|
|
this.packetHandler.getPlayerRef().getPacketHandler().write(new AssetEditorAuthorization(false));
|
|
} else {
|
|
this.packetHandler.getPlayerRef().getPacketHandler().write(new AssetEditorAuthorization(true));
|
|
AssetEditorPlugin.get().handleInitializeEditor(ref, store);
|
|
}
|
|
});
|
|
} else {
|
|
throw new RuntimeException("Unable to process AssetEditorInitialize packet. Player ref is invalid!");
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public void handle(@Nonnull AssetEditorUpdateJsonAsset packet) {
|
|
PlayerRef playerRef = this.packetHandler.getPlayerRef();
|
|
Ref<EntityStore> ref = playerRef.getReference();
|
|
if (ref != null && ref.isValid()) {
|
|
Store<EntityStore> store = ref.getStore();
|
|
World world = store.getExternalData().getWorld();
|
|
CompletableFuture.runAsync(() -> {
|
|
Player playerComponent = store.getComponent(ref, Player.getComponentType());
|
|
if (!this.lacksPermission(playerComponent, true)) {
|
|
;
|
|
}
|
|
}, world)
|
|
.thenRunAsync(
|
|
() -> {
|
|
LOGGER.at(Level.INFO).log("%s updating json asset at %s", this.packetHandler.getPlayerRef().getUsername(), packet.path);
|
|
EditorClient mockClient = new EditorClient(playerRef);
|
|
AssetEditorPlugin.get()
|
|
.handleJsonAssetUpdate(
|
|
mockClient, packet.path != null ? new AssetPath(packet.path) : null, packet.assetType, packet.assetIndex, packet.commands, packet.token
|
|
);
|
|
}
|
|
);
|
|
} else {
|
|
throw new RuntimeException("Unable to process AssetEditorUpdateJsonAsset packet. Player ref is invalid!");
|
|
}
|
|
}
|
|
|
|
private boolean lacksPermission(@Nonnull Player player, boolean shouldShowDenialMessage) {
|
|
if (!player.hasPermission("hytale.editor.asset")) {
|
|
if (shouldShowDenialMessage) {
|
|
player.sendMessage(Messages.USAGE_DENIED_MESSAGE);
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|