package com.example.soundmod.client.screen; import com.example.soundmod.client.audio.AudioPlaybackService; import com.example.soundmod.common.ActivationMode; import com.example.soundmod.common.AttenuationMode; import com.example.soundmod.common.PitchModulationMode; import com.example.soundmod.common.RedstoneMode; import com.example.soundmod.common.ScenarioQueue; import com.example.soundmod.common.SoundManifestEntry; import com.example.soundmod.common.SoundSettings; import com.example.soundmod.common.ZoneIntersectionPolicy; import com.example.soundmod.common.ZoneShape; import com.example.soundmod.core.SoundDebug; import com.example.soundmod.gameplay.container.SoundPlayerContainer; import com.example.soundmod.gameplay.tile.SoundPlayerTileEntity; import com.example.soundmod.net.ClientTransferManager; import com.example.soundmod.net.NetworkHandler; import com.example.soundmod.net.packet.C2SUpdateConfigPacket; import com.example.soundmod.sounddata.client.ClientSoundCache; import com.mojang.blaze3d.matrix.MatrixStack; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; import java.util.Collections; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.gui.widget.Widget; import net.minecraft.client.gui.widget.button.Button; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.nbt.JsonToNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; public class SoundPlayerScreen extends ContainerScreen { // Palette private static final int COLOR_BG_SHADOW = 0x90000000; private static final int COLOR_BG_MAIN = 0xEE161B22; private static final int COLOR_BG_INNER = 0xEE1F242C; private static final int COLOR_BG_BOX = 0xCC11141B; private static final int COLOR_BORDER = 0xFF30363D; private static final int COLOR_ACCENT = 0xFF388BFD; private static final int COLOR_TEXT_TITLE = 0xFFFFFF; private static final int COLOR_TEXT_LABEL = 0xFFA0A6B2; private static final int COLOR_TEXT_MUTED = 0xFF767F8D; private static final int COLOR_GREEN = 0xFF3FB950; private static final int COLOR_YELLOW = 0xFFD29922; private static final int COLOR_RED = 0xFFF85149; private static final String[] CATEGORIES = new String[]{"music", "ambient", "effect", "voice"}; private static final int SOUND_LIST_ROWS = 4; private static final int ROW_HEIGHT = 12; public static SoundPlayerScreen activeScreen; public static boolean showZoneVisualizer = true; private Tab activeTab = Tab.BASIC; private SoundSettings localSettings = new SoundSettings(); private final List sourceScenarioSteps = new ArrayList<>(); private final List zoneScenarioSteps = new ArrayList<>(); private boolean sourceScenarioLoop; private boolean zoneScenarioLoop; private boolean sourceScenarioShuffle; private boolean zoneScenarioShuffle; private boolean editingZoneScenario; private boolean sourceEnabled = true; private boolean zoneEnabled = true; private boolean wizardCompleted = true; private ZoneShape zoneShape = ZoneShape.SPHERE; private float zoneRadius = 12.0f; private float zoneBoxX = 8.0f; private float zoneBoxY = 4.0f; private float zoneBoxZ = 8.0f; private boolean zoneAutoStartOnEnter = true; private boolean zoneStopOnExit = true; private ZoneIntersectionPolicy zonePolicy = ZoneIntersectionPolicy.HIGHEST_PRIORITY; private boolean zoneUseCustomCoords; private int zoneSourceX; private int zoneSourceY; private int zoneSourceZ; // Controls - Basic private TextFieldWidget soundIdField; private TextFieldWidget searchField; private Button previewButton; private Button clearFilterButton; private Button volMinusBtn; private TextFieldWidget volumeField; private Button volPlusBtn; private Button pitchMinusBtn; private TextFieldWidget pitchField; private Button pitchPlusBtn; private TextFieldWidget radiusField; private TextFieldWidget priorityField; private Button loopButton; private Button categoryButton; // Controls - Effects private Button use3dButton; private Button attenuationButton; private Button occlusionButton; private TextFieldWidget occlusionStrengthField; private Button reverbButton; private TextFieldWidget reverbStrengthField; private Button dopplerButton; private Button crossfadeButton; private TextFieldWidget fadeInField; private TextFieldWidget fadeOutField; private Button pitchModeButton; private TextFieldWidget pitchModSpeedField; private TextFieldWidget pitchModDepthField; // Controls - Trigger private Button activationModeButton; private Button redstoneModeButton; private Button sourceEnabledButton; private Button zoneEnabledButton; private TextFieldWidget startDelayField; private TextFieldWidget repeatDelayField; // Controls - Zone private Button zoneShapeButton; private Button zonePolicyButton; private Button zoneVisualizerButton; private TextFieldWidget zoneRadiusField; private TextFieldWidget zoneBoxXField; private TextFieldWidget zoneBoxYField; private TextFieldWidget zoneBoxZField; private Button zoneAutoStartButton; private Button zoneStopOnExitButton; private Button zoneUseCustomCoordsButton; private Button myPosButton; private TextFieldWidget zoneSourceXField; private TextFieldWidget zoneSourceYField; private TextFieldWidget zoneSourceZField; // Controls - Scenario private Button scenarioTargetButton; private Button scenarioLoopButton; private Button scenarioShuffleButton; private TextFieldWidget scenarioSoundField; private TextFieldWidget scenarioDelayField; private Button scenarioUseCurrentBtn; private Button scenarioSetButton; private Button scenarioAddButton; private Button scenarioRemoveButton; private Button scenarioUpButton; private Button scenarioDownButton; // Fixed bottom bar controls private Button saveButton; private Button copyConfigButton; private Button pasteConfigButton; private Button playNowButton; private Button stopNowButton; // Tab buttons private final List