From 6d69e87518bb4ab31761046a700dc51e88bd74bd Mon Sep 17 00:00:00 2001 From: Eugene Date: Wed, 7 Aug 2024 21:47:01 +0300 Subject: [PATCH] manual testing 1 --- .../ukrainian_dlight/manual/ManualData.java | 60 -------- .../manual/ManualDataInitializer.java | 16 --- .../ukrainian_dlight/manual/ManualDefine.java | 10 -- .../ukrainian_dlight/manual/ManualItem.java | 29 ---- .../manual/ManualReloadListener.java | 33 ----- .../manual/screen/ManualScreen.java | 133 ------------------ .../manual/screen/ManualScreenHandler.java | 31 ---- .../assets/ukrainian_delight/lang/en_us.json | 5 +- .../manual/en_us/example_note.json | 5 - .../textures/gui/manual_gui.png | Bin 7914 -> 9919 bytes 10 files changed, 1 insertion(+), 321 deletions(-) delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualData.java delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDataInitializer.java delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDefine.java delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualItem.java delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualReloadListener.java delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreen.java delete mode 100644 src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreenHandler.java delete mode 100644 src/main/resources/assets/ukrainian_delight/manual/en_us/example_note.json diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualData.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualData.java deleted file mode 100644 index af63251..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualData.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.resource.Resource; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public class ManualData { - private final Map manualEntries = new HashMap<>(); - private final Map categories = new HashMap<>(); - - public void loadManualEntries(ResourceManager resourceManager) { - String namespace = "ukrainian_delight"; - String path = "manual/en_us/"; - - for (String noteFile : getNoteFileNames()) { - Identifier resourceId = new Identifier(namespace, path + noteFile); - try { - Optional resourceOptional = resourceManager.getResource(resourceId); - if (resourceOptional.isPresent()) { - try (Reader reader = new InputStreamReader(resourceOptional.get().getInputStream())) { - JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject(); - String category = jsonObject.get("category").getAsString(); - String noteName = jsonObject.get("header").getAsString(); // Assuming note name is present - manualEntries.put(noteName, jsonObject); - categories.put(category, noteName); - } - } else { - System.err.println("Resource not found: " + resourceId); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private List getNoteFileNames() { - // This should return a list of note file names; adjust this method based on your file structure - return List.of("example_note.json"); // Example, replace with actual file names or dynamic retrieval - } - - public Map getCategories() { - return categories; - } - - public String getNoteContent(String noteName) { - JsonObject entry = manualEntries.get(noteName); - if (entry != null) { - return entry.get("text").getAsString(); - } - return null; - } -} diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDataInitializer.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDataInitializer.java deleted file mode 100644 index 235ac5c..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDataInitializer.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual; - -import net.minecraft.client.MinecraftClient; - -public class ManualDataInitializer { - - private final ManualData manualData = new ManualData(); - - public void initialize() { - manualData.loadManualEntries(MinecraftClient.getInstance().getResourceManager()); - } - - public ManualData getManualData() { - return manualData; - } -} diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDefine.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDefine.java deleted file mode 100644 index 30a958b..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualDefine.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual; - -import net.minecraft.text.Text; - -public class ManualDefine { - - public static Text getCategoryName(String categoryKey) { - return Text.translatable("manual.category." + categoryKey); - } -} diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualItem.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualItem.java deleted file mode 100644 index 7824435..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualItem.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual; - -import com.megatrex4.ukrainian_dlight.manual.screen.ManualScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; - -public class ManualItem extends Item { - - public ManualItem() { - super(new Item.Settings()); - } - - @Override - public ActionResult useOnBlock(ItemUsageContext context) { - MinecraftClient.getInstance().execute(() -> { - ClientPlayerEntity player = MinecraftClient.getInstance().player; - if (player != null) { - ManualDataInitializer dataInitializer = new ManualDataInitializer(); - dataInitializer.initialize(); - MinecraftClient.getInstance().setScreen(new ManualScreen(Text.of("Manual Title"), dataInitializer.getManualData())); - } - }); - return ActionResult.success(context.getWorld().isClient); - } -} diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualReloadListener.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualReloadListener.java deleted file mode 100644 index 9af1d6f..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/ManualReloadListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual; - -import com.megatrex4.ukrainian_dlight.UkrainianDelight; -import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resource.ResourceType; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; - -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; - -import static com.megatrex4.ukrainian_dlight.UkrainianDelight.LOGGER; -import static com.megatrex4.ukrainian_dlight.UkrainianDelight.MOD_ID; - -public class ManualReloadListener implements IdentifiableResourceReloadListener { - - @Override - public Identifier getFabricId() { - return new Identifier(MOD_ID, "manual_reload_listener"); - } - - @Override - public CompletableFuture reload(Synchronizer synchronizer, ResourceManager resourceManager, - Profiler serverProfiler, Profiler clientProfiler, - Executor serverExecutor, Executor clientExecutor) { - return CompletableFuture.runAsync(() -> { - ManualData manualData = new ManualData(); - manualData.loadManualEntries(resourceManager); - LOGGER.info(MOD_ID + "Manual entries loaded successfully!"); - }, serverExecutor).thenCompose(synchronizer::whenPrepared); - } -} diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreen.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreen.java deleted file mode 100644 index b372c12..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreen.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual.screen; - -import com.megatrex4.ukrainian_dlight.UkrainianDelight; -import com.megatrex4.ukrainian_dlight.manual.ManualData; -import com.megatrex4.ukrainian_dlight.manual.ManualDefine; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.HashMap; -import java.util.Map; - -public class ManualScreen extends Screen { - private static final Identifier TEXTURE = new Identifier(UkrainianDelight.MOD_ID, "textures/gui/manual_gui.png"); - private final ManualData manualData; - private ScreenState currentState = ScreenState.CATEGORY_SELECTION; - private String selectedCategory; - private String selectedNote; - private Map categories; - private Map categoryPositions; // To store category positions - - public ManualScreen(Text title, ManualData manualData) { - super(title); - this.manualData = manualData; - } - - @Override - protected void init() { - super.init(); - categories = manualData.getCategories(); // Load categories from ManualData - categoryPositions = new HashMap<>(); - } - - @Override - public void renderBackground(DrawContext context) { - context.drawTexture(TEXTURE, 0, 0, 0, 0, width, height); - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - renderBackground(context); - super.render(context, mouseX, mouseY, delta); - switch (currentState) { - case CATEGORY_SELECTION: - drawCategorySelection(context, mouseX, mouseY); - break; - case NOTE_SELECTION: - drawNoteSelection(context); - break; - case NOTE_CONTENT: - drawNoteContent(context); - break; - } - } - - private void drawCategorySelection(DrawContext context, int mouseX, int mouseY) { - MatrixStack matrices = context.getMatrices(); - var textRenderer = MinecraftClient.getInstance().textRenderer; - int y = 20; - - for (Map.Entry entry : categories.entrySet()) { - String category = entry.getKey(); - Text categoryText = ManualDefine.getCategoryName(category); - int textWidth = textRenderer.getWidth(categoryText); - int x = (width - textWidth) / 2; - - // Draw category text - textRenderer.draw(categoryText, x, y, 0xFFFFFF, true, matrices.peek().getPositionMatrix(), - MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(), - TextRenderer.TextLayerType.NORMAL, 0x000000, 15728880); - - // Store position for clickable area - categoryPositions.put(category, new Integer[]{x, y, textWidth, 10}); // 10 is the height of the text - - y += 20; // Adjust as needed - } - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (currentState == ScreenState.CATEGORY_SELECTION) { - for (Map.Entry entry : categoryPositions.entrySet()) { - Integer[] pos = entry.getValue(); - String category = entry.getKey(); - if (mouseX >= pos[0] && mouseX <= pos[0] + pos[2] && - mouseY >= pos[1] && mouseY <= pos[1] + pos[3]) { - selectCategory(category); - return true; - } - } - } - return super.mouseClicked(mouseX, mouseY, button); - } - - private void drawNoteSelection(DrawContext context) { - // Implement similar to drawCategorySelection but for notes - } - - private void drawNoteContent(DrawContext context) { - MatrixStack matrices = context.getMatrices(); - var textRenderer = MinecraftClient.getInstance().textRenderer; - if (selectedNote != null) { - String noteContent = manualData.getNoteContent(selectedNote); - Text noteText = Text.of(noteContent); - int textWidth = textRenderer.getWidth(noteText); - int x = (width - textWidth) / 2; - int y = (height - 8) / 2; - textRenderer.draw(noteText, x, y, 0xFFFFFF, true, matrices.peek().getPositionMatrix(), - MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(), - TextRenderer.TextLayerType.NORMAL, 0x000000, 15728880); - } - } - - public void selectCategory(String category) { - this.selectedCategory = category; - this.currentState = ScreenState.NOTE_SELECTION; - } - - public void selectNote(String note) { - this.selectedNote = note; - this.currentState = ScreenState.NOTE_CONTENT; - } - - private enum ScreenState { - CATEGORY_SELECTION, - NOTE_SELECTION, - NOTE_CONTENT - } -} diff --git a/src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreenHandler.java b/src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreenHandler.java deleted file mode 100644 index d970d9d..0000000 --- a/src/main/java/com/megatrex4/ukrainian_dlight/manual/screen/ManualScreenHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.megatrex4.ukrainian_dlight.manual.screen; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.ArrayPropertyDelegate; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.screen.PropertyDelegate; - -public class ManualScreenHandler extends ScreenHandler { - - public ManualScreenHandler(int syncId, PlayerInventory playerInventory, PacketByteBuf buf) { - this(syncId, playerInventory, ScreenHandlerContext.EMPTY, new ArrayPropertyDelegate(0)); - } - - public ManualScreenHandler(int syncId, PlayerInventory playerInventory, ScreenHandlerContext context, PropertyDelegate propertyDelegate) { - super(null, syncId); // `null` as the screen handler type since there's no inventory - } - - @Override - public boolean canUse(PlayerEntity player) { - return true; // Always return true since there's no inventory to check - } - - @Override - public ItemStack quickMove(PlayerEntity player, int slotIndex) { - return ItemStack.EMPTY; - } -} diff --git a/src/main/resources/assets/ukrainian_delight/lang/en_us.json b/src/main/resources/assets/ukrainian_delight/lang/en_us.json index 3343376..09a9413 100644 --- a/src/main/resources/assets/ukrainian_delight/lang/en_us.json +++ b/src/main/resources/assets/ukrainian_delight/lang/en_us.json @@ -92,8 +92,5 @@ "ukrainian_delight.category.general": "General Settings", "ukrainian_delight.option.brewing_keg_capacity": "Brewing Keg Capacity", "tooltip.ukrainian_delight.brewing_keg_capacity": "%s", - "tooltip.ukrainian_delight.brewing_keg_amount": "%s", - - "_comment10":"manual", - "manual.category.main_meals": "Main Meals" + "tooltip.ukrainian_delight.brewing_keg_amount": "%s" } \ No newline at end of file diff --git a/src/main/resources/assets/ukrainian_delight/manual/en_us/example_note.json b/src/main/resources/assets/ukrainian_delight/manual/en_us/example_note.json deleted file mode 100644 index 86ba75a..0000000 --- a/src/main/resources/assets/ukrainian_delight/manual/en_us/example_note.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "category": "example_category", - "header": "Example Note", - "text": "This is an example note." -} diff --git a/src/main/resources/assets/ukrainian_delight/textures/gui/manual_gui.png b/src/main/resources/assets/ukrainian_delight/textures/gui/manual_gui.png index c9007bdae4ba28b9c2cced0b4c8a9140851de0eb..42ba79e3bf555d142c82dc66231b6bed6daf6a1d 100644 GIT binary patch literal 9919 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