From 2629cd484afea5d1727c158ed4d0ed75b0f0f01f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 16 Aug 2023 08:48:30 -0400 Subject: [PATCH 01/25] Add runes/ to legacy texture folder list --- .../dynamicresources/ModelBakeryHelpers.java | 26 +++++++++++++++++++ .../dynamic_resources/ModelBakeryMixin.java | 20 +------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java index 2a16fc0c..c4b4a197 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java @@ -57,6 +57,32 @@ public class ModelBakeryHelpers { */ public static final int MAX_MODEL_LIFETIME_SECS = 300; + /** + * These folders will have all textures stitched onto the atlas when dynamic resources is enabled. + */ + public static String[] getExtraTextureFolders() { + return new String[] { + "attachment", + "bettergrass", + "block", + "blocks", + "cape", + "entity/bed", + "entity/chest", + "item", + "items", + "model", + "models", + "part", + "pipe", + "ropebridge", + "runes", + "solid_block", + "spell_effect", + "spell_projectile" + }; + } + private static JsonElement parseStream(InputStream stream) { JsonParser parser = new JsonParser(); JsonReader jsonReader = new JsonReader(new InputStreamReader(stream, StandardCharsets.UTF_8)); diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java index f8d9211f..d39cb1ff 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -254,25 +254,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { blockStateFiles, modelFiles, this.missingModel, json -> BlockModel.GSON.fromJson(json, BlockModel.class), this::getModel); /* take every texture from these folders (1.19.3+ emulation) */ - String[] extraFolders = new String[] { - "attachment", - "bettergrass", - "block", - "blocks", - "cape", - "entity/bed", - "entity/chest", - "item", - "items", - "model", - "models", - "part", - "pipe", - "ropebridge", - "solid_block", - "spell_effect", - "spell_projectile" - }; + String[] extraFolders = ModelBakeryHelpers.getExtraTextureFolders(); for(String folder : extraFolders) { Collection textureLocations = this.resourceManager.listResources("textures/" + folder, p -> p.endsWith(".png")); for(ResourceLocation rl : textureLocations) { From 12aa14cc5464b4b08879aabe9a9a93219d9a4f61 Mon Sep 17 00:00:00 2001 From: TheBossMagnus <92474350+TheBossMagnus@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:04:09 +0100 Subject: [PATCH 02/25] Italian Localization (#217) --- .../assets/modernfix/lang/it_it.json | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 common/src/main/resources/assets/modernfix/lang/it_it.json diff --git a/common/src/main/resources/assets/modernfix/lang/it_it.json b/common/src/main/resources/assets/modernfix/lang/it_it.json new file mode 100644 index 00000000..1d7384a4 --- /dev/null +++ b/common/src/main/resources/assets/modernfix/lang/it_it.json @@ -0,0 +1,117 @@ +{ + "key.modernfix": "ModernFix", + "key.modernfix.config": "Apri la schermata configurazione", + "modernfix.jei_load": "Caricamento JEI in corso, potrebbe richiedere un po' di tempo", + "modernfix.no_lazydfu": "LazyDFU non è installato. Se Minecraft deve aggiornare i dati di gioco da una versione precedente, potrebbe esserci un notevole lag.", + "modernfix.no_ferritecore": "FerriteCore non è installato. L'uso della memoria sarà molto elevato.", + "modernfix.connectedness_dynresoruces": "Connectedness e l'opzione risorse dinamiche di ModernFix non sono compatibili. Rimuovi Connectedness o disabilita le risorse dinamiche nella configurazione di ModernFix.", + "modernfix.perf_mod_warning": "Si consiglia di installare le mod, ma gli avvertimenti possono essere disabilitati nella configurazione di ModernFix.", + "modernfix.config": "Configurazione mixin ModernFix", + "modernfix.config.done_restart": "Fatto (riavvio richiesto)", + "modernfix.message.reload_config": "È stata rilevata una modifica al file di configurazione. Per evitare di caricare file che non sono ancora stati salvati, è necessario avviare nuovamente il caricamento eseguendo /mfrc.", + "modernfix.option.on": "attivo", + "modernfix.option.off": "disattivo", + "modernfix.option.disabled": "disabilitato", + "modernfix.option.enabled": "abilitato", + "modernfix.option.mod_override": " da mod [%s]", + "modernfix.config.not_default": " (modificato)", + "asynclocator.map.locating": "Mappa (Ricerca in corso...)", + "asynclocator.map.none": "Mappa (Nessuna caratteristica vicina trovata)", + "modernfix.option.category.performance": "Prestazioni", + "modernfix.option.category.performance.description": "Funzionalità che aiutano a migliorare le prestazioni di gioco/avvio", + "modernfix.option.category.bugfixes": "Risoluzione errori", + "modernfix.option.category.bugfixes.description": "Correzioni di bug di base per migliorare la stabilità del gioco", + "modernfix.option.category.troubleshooting": "Risoluzione di problemi/Strumenti", + "modernfix.option.category.troubleshooting.description": "Funzionalità pensate per assistere nella diagnosi dei problemi", + "modernfix.option.category.expert_only": "Solo per esperti", + "modernfix.option.category.expert_only.description": "Non modificare a meno che tu sappia cosa stai facendo", + "modernfix.option.name.mixin.perf.async_jei": "Caricamento JEI in background", + "modernfix.option.mixin.perf.async_jei": "Solo per la versione 1.16. **Un'ottimizzazione fondamentale.** Parcheggia JEI per eseguire il ricaricamento su un thread in background, eliminando completamente il lungo ritardo che aggiunge al caricamento del mondo.", + "modernfix.option.mixin.perf.async_locator": "Solo per la versione 1.16. Riporta le patch di Async Locator mod per eliminare i blocchi del server associati a `/locate`, generazione di tabelle del bottino, ecc.", + "modernfix.option.mixin.perf.biome_zoomer": "Solo per la versione 1.16. Ottimizzazione minore per migliorare le prestazioni del zoom sulla biome usando la logica dalla versione 1.18.", + "modernfix.option.mixin.perf.blast_search_trees": "Tutte le versioni. Se sono installate REI o JEI, la costruzione delle tabelle di ricerca vanilla per la ricerca creativa viene disabilitata e la ricerca viene invece effettuata utilizzando le implementazioni di ricerca di queste mod. Questo risparmia alcuni secondi durante il caricamento del mondo e probabilmente risparmia anche un po' di RAM (sebbene non sia stato misurato).", + "modernfix.option.mixin.perf.boost_worker_count": "Solo per la versione 1.16. Rimuove il limite codificato sul conteggio dei thread dei lavoratori, simile a quanto fatto da Mojang nella versione 1.18.", + "modernfix.option.mixin.perf.cache_blockstate_cache_arrays": "Tutte le versioni. Evita di creare copie nuove di array enumerativi ogni volta che viene inizializzata una cache di blockstate. Ottimizzazione minore, ma semplice da fare.", + "modernfix.option.mixin.perf.cache_model_materials": "Tutte le versioni. Memorizza la collezione `RenderMaterial` (texture) e la lista delle dipendenze che i modelli restituiscono invece di richiederne il calcolo ad ogni richiesta. Aiuta ad accelerare il processo di caricamento/modellazione dei modelli.", + "modernfix.option.mixin.perf.cache_strongholds": "Tutte le versioni. Salva l'elenco generato delle posizioni delle fortezze con il mondo, invece di rigenerarlo ad ogni caricamento del mondo. Risparmia un po' di tempo nella versione 1.16, e molto di più nelle versioni 1.18 e 1.19.", + "modernfix.option.mixin.perf.cache_upgraded_structures": "Tutte le versioni. Molti mod includono file di strutture obsoleti, il che richiede al gioco di aggiornarli utilizzando DFU ogni volta che vengono caricati. Questo può essere piuttosto lento. Questa patch aggiunge una logica per invece salvare la versione aggiornata della struttura e riutilizzarla al caricamento successivo. Per gestire il caso in cui il mod cambia un file di struttura ma non il nome, l'hash del file originale viene confrontato con la versione in cache e se non corrispondono la struttura verrà nuovamente aggiornata.", + "modernfix.option.mixin.perf.compress_biome_container": "Solo per la versione 1.16. Ottimizzazione minore presa in prestito da Hydrogen, che cerca di risparmiare spazio nel contenitore della biome quando possibile. Questo viene disabilitato automaticamente se sono installati mod in conflitto come BetterEnd o Chocolate.", + "modernfix.option.mixin.perf.datapack_reload_exceptions": "Tutte le versioni. Riduce lo spam nei log e potrebbe migliorare leggermente la velocità di caricamento evitando di stampare le tracce dello stack per alcune eccezioni comunemente generate durante il ricaricamento dei datapack (ad esempio, oggetti mancanti nelle tabelle di bottino/ricette). Il messaggio verrà comunque stampato.", + "modernfix.option.mixin.perf.dedicated_reload_executor": "Tutte le versioni. Sposta il ricaricamento dei resource pack e dei datapack in un pool di thread dedicato anziché utilizzare i thread predefiniti `Worker-Main`. Questo consente ai mod Smooth Boot di potenzialmente migliorare le prestazioni in modalità singleplayer durante l'esecuzione, senza rallentare l'avvio a causa di un conteggio limitato di thread.", + "modernfix.option.mixin.perf.deduplicate_location": "Tutte le versioni, ma disabilitato per impostazione predefinita a causa dell'impatto sui tempi di caricamento. Duplica i namespace e i percorsi delle risorse. Questo risparmia memoria, ma aumenta anche il costo di costruzione di una nuova `ResourceLocation` in modo significativo.", + "modernfix.option.mixin.perf.dynamic_dfu": "Tutte le versioni. Modifica l'inizializzazione di DFU in modo che avvenga la prima volta che è necessario eseguire un aggiornamento. Questo è simile a LazyDFU, ma si differenzia in quanto evita di caricare *qualsiasi* classe/struttura dati DFU, mentre LazyDFU disabilita solo l'ottimizzazione delle regole. Fondamentalmente, questa opzione è una versione più sicura di DataFixerSlayer, in quanto caricherà comunque DFU quando necessario.\n\nIn genere dovresti continuare a utilizzare LazyDFU anche con questa opzione abilitata, in quanto l'ottimizzazione delle regole DFU altrimenti causerà lag.", + "modernfix.option.mixin.perf.dynamic_resources": "Tutte le versioni. Vedi https://github.com/embeddedt/ModernFix/wiki/Dynamic-Resources-FAQ.", + "modernfix.option.mixin.perf.dynamic_structure_manager": "Tutte le versioni. Consente al gioco di scaricare i file delle strutture dopo la generazione, anziché mantenerli caricati per sempre.", + "modernfix.option.mixin.perf.fast_registry_validation": "Tutte le versioni. Forge cerca inutilmente un metodo tramite riflessione ogni volta che viene convalidato un registro. Questa patch semplicemente memorizza nella cache il valore restituito poiché sarà lo stesso ogni volta.", + "modernfix.option.mixin.perf.faster_font_loading": "Tutte le versioni. Ottimizza il renderer dei font per caricare i font più velocemente, velocizzando il ricaricamento delle risorse.", + "modernfix.option.mixin.perf.faster_item_rendering": "Tutte le versioni. Evita di renderizzare i lati degli oggetti nelle interfacce utente (GUI). (Sì, sembra che anche il gioco di base lo faccia.)\n\nQuesto può triplicare il frame rate (FPS) con un mod come REI/JEI installato su GPU meno potenti, se sono visibili abbastanza oggetti. Disabilitato per impostazione predefinita poiché è una funzionalità nuova e non testata molto, ma dovrebbe essere sicuro. Il problema più probabile è che gli oggetti siano completamente invisibili nelle interfacce utente (GUI) o che appaiano piatti nel mondo.", + "modernfix.option.mixin.perf.faster_texture_loading": "Tutte le versioni precedenti alla 1.19.4. Evita di leggere le texture due volte (la prima volta utilizzando un percorso di codice molto lento) e invece ne effettua un caricamento più veloce (simile a 1.19.3+).", + "modernfix.option.mixin.perf.faster_texture_stitching": "Tutte le versioni. Consente al gioco di utilizzare un sistema di cucitura delle texture più veloce, originariamente sviluppato da SuperCoder79 per lwjgl3ify su 1.7.10, che può risparmiare tempo durante il caricamento. Raramente si è riscontrato che causi artefatti strani su blocchi o interfacce utente (GUI), potrebbe essere un errore di Sodium.", + "modernfix.option.mixin.perf.jeresources_startup": "Solo 1.16. Ottimizza Just Enough Resources in modo da non ricreare inutilmente le entità dei villaggi molte volte per la stessa professione, risparmiando tempo durante l'avvio di JEI.", + "modernfix.option.mixin.perf.kubejs": "Solo 1.16. Ottimizzazioni per KubeJS per evitare copie inutili di `ItemStack`, ecc., riducendo il tempo richiesto per caricare i datapack.", + "modernfix.option.mixin.perf.model_optimizations": "Tutte le versioni. Implementa ottimizzazioni per velocizzare il processo di caricamento dei modelli.", + "modernfix.option.mixin.perf.nbt_memory_usage": "Tutte le versioni. Utilizza una mappa di supporto più efficiente per i tag NBT composti che deduplica i nomi chiave e utilizza anche una mappa di array per i composti molto piccoli. Ciò riduce l'onere di memorizzare molti tag composti in memoria.", + "modernfix.option.mixin.perf.nuke_empty_chunk_sections": "Solo 1.16, ispirato a Hydrogen. Evita di memorizzare in memoria le sezioni di chunk piene di aria, segnalandole invece come vuote.", + "modernfix.option.mixin.perf.remove_biome_temperature_cache": "Tutte le versioni. Rimuove la cache delle temperature dei biome come fa Lithium nelle versioni moderne.", + "modernfix.option.mixin.perf.resourcepacks": "Tutte le versioni. **Un'ottimizzazione fondamentale.** I lanci nelle versioni moderne sono fortemente rallentati dall'accesso al filesystem. Molte richieste vengono fatte frequentemente ai pacchetti di risorse per elencare le risorse o verificare se esiste una risorsa specifica, e ognuna di queste richieste produce una chiamata API al file molto lenta.\n\nModernFix elimina completamente la maggior parte del collo di bottiglia semplicemente memorizzando in cache un elenco di tutte le risorse presenti nei pacchetti di risorse forniti dai mod e in quelli vanilla. La cache viene ricostruita alla ricarica delle risorse (ad eccezione delle risorse vanilla, poiché non dovrebbero mai cambiare mentre il gioco è in esecuzione).\n\nNon ci sono problemi di compatibilità noti con questa patch, ad eccezione di OptiFine (le sue risorse CTM non vengono caricate correttamente). Tuttavia, non consiglio di utilizzare OptiFine in nessuno scenario, poiché aggiunge diversi minuti all'avvio da solo e non è testato con ModernFix.", + "modernfix.option.mixin.perf.reuse_datapacks": "Solo versione 1.16. Tenta di velocizzare il passaggio tra mondi in giocatore singolo saltando il riavvio dei datapack quando possibile. Potrebbe causare problemi di compatibilità con alcuni mod, ma è abilitato per impostazione predefinita.", + "modernfix.option.mixin.perf.rewrite_registry": "Tutte le versioni. **Attualmente semi-rotto.** Sostituisce aggressivamente alcune parti interne del sistema di registro di Forge con versioni più veloci, tuttavia attualmente causa blocchi durante il caricamento di alcuni modpack. Disabilitato per impostazione predefinita per ovvi motivi.", + "modernfix.option.mixin.perf.skip_first_datapack_reload": "Solo versioni 1.16 e 1.19. **Un'ottimizzazione fondamentale.**\n\nNel mezzo del ciclo di sviluppo 1.16, Forge ha patchato il gioco per ricaricare i datapack due volte quando si caricava un mondo esistente, al fine di risolvere un problema di spostamento dell'ID dei biome. Purtroppo, le ricariche dei datapack richiedono spesso più di 30 secondi e quindi questo influisce molto sui tempi di caricamento del mondo.\n\nModernFix apporta le modifiche necessarie per evitare questa ricarica, basandosi sulla pull request incompiuta di Forge #8163.\n\nQuesta modifica è stata rimossa da Forge nella versione 1.18, ma poi una patch simile è stata aggiunta *nuovamente* nella versione 1.19 per risolvere il problema dei datapack dei mod che non venivano caricati durante la creazione di nuovi mondi in giocatore singolo. Fortunatamente, il problema è limitato alla schermata di creazione del mondo nella versione 1.19, e i mondi esistenti richiedono solo una ricarica. Tuttavia, questo raddoppia comunque la durata della lag spike quando si fa clic su \"Crea nuovo mondo\" nella versione 1.19, quindi ModernFix apporta nuovamente modifiche per evitare una ricarica ridondante.", + "modernfix.option.mixin.perf.state_definition_construct": "Tutte le versioni. Abilitato solo se è installato FerriteCore. Sfrutta la gestione dei blockstate di FerriteCore per accelerarne la creazione. Questo può aiutare ad accelerare l'avvio con mod che aggiungono molti blockstate, come ad esempio le mod di mobili.", + "modernfix.option.mixin.perf.sync_executor_sleep": "Tutte le versioni. Evita che il thread principale giri inutilmente consumando un core della CPU mentre aspetta che i lavoratori di caricamento dei mod finiscano.", + "modernfix.option.mixin.perf.thread_priorities": "Tutte le versioni. Regola le priorità dei thread dei lavoratori e del server in modo che siano inferiori al thread del client. Questo aiuta a migliorare la stabilità degli FPS su macchine con pochi core della CPU, purché l'implementazione Java in uso rispetti le priorità.", + "modernfix.option.mixin.perf.use_integrated_resources": "Principalmente per la versione 1.16. Corregge JEResources affinché utilizzi i dati delle tabelle del bottino del server integrato se si gioca in giocatore singolo, anziché ricaricare inutilmente le tabelle del bottino. Risparmia alcuni secondi in più durante l'avvio di JEI.", + "modernfix.option.mixin.bugfix.concurrency": "Le patch in questo gruppo risolvono problemi legati alla concorrenza in Minecraft e/o Forge. La maggior parte di esse provoca crash rari e difficili da diagnosticare durante il caricamento.", + "modernfix.option.mixin.bugfix.edge_chunk_not_saved": "Questa opzione è un porting della mod Chunk Saving Fix di SuperCoder (perché non mi sono reso conto che era già disponibile per Forge all'epoca).", + "modernfix.option.mixin.bugfix.mc218112": "Questa opzione risolve un deadlock che può verificarsi se viene lanciata un'eccezione durante l'elaborazione dei dati dell'entità. Vanilla non sblocca correttamente il gestore dei dati quando dovrebbe farlo. Questo è tracciato come MC-218112 nel bug tracker ed è stato corretto da Mojang nella versione 1.17.", + "modernfix.option.mixin.bugfix.packet_leak": "**Sperimentale**, non abilitato per impostazione predefinita. Un tentativo di correzione per il problema di perdita di memoria che si verifica dopo aver giocato abbastanza a lungo nella versione 1.16.", + "modernfix.option.mixin.bugfix.paper_chunk_patches": "Versioni 1.18 e successive. **Un'ottimizzazione fondamentale.** Porta una patch da Paper che risolve i problemi nella versione 1.17 con il caricamento dei chunk che richiede enormi quantità di memoria e genera molte istanze di `CompletableFuture`. Le versioni 1.18+ ora possono caricare mondi con soli 400MB di memoria come poteva fare la 1.16.", + "modernfix.option.mixin.bugfix.tf_cme_on_load": "Modifica Twilight Forest per eseguire la configurazione client non thread-safe utilizzando il thread principale, come dovrebbe fare, anziché il thread worker FML.", + "modernfix.option.mixin.feature.branding": "Aggiunge ModernFix all'elenco del marchio nella schermata dei titoli e anche alla schermata F3.", + "modernfix.option.mixin.feature.direct_stack_trace": "Di solito disabilitato, può essere abilitato per forzare la traccia dello stack grezzo da registrare quando si verifica un crash. Occasionalmente, il sistema di report dei crash di Vanilla non funziona correttamente e fornisce una traccia/report dello stack completamente irrilevante.", + "modernfix.option.mixin.feature.measure_time": "Utilizza alcune iniezioni per misurare il tempo di caricamento del mondo, il tempo di ricarica dei datapack, il tempo di ricarica delle risorse, il tempo di avvio e aggiunge i ganci necessari per abilitare la logica del profiler inutilizzata di Vanilla per la ricarica delle risorse, se configurato.", + "modernfix.option.mixin.feature.spam_thread_dump": "**Da utilizzare solo per scopi di debug.** Fa sì che venga registrato un thread dump nel registro ogni 60 secondi. Questo può aiutare a diagnosticare i blocchi inspiegabili durante il caricamento/gioco.", + "modernfix.option.mixin.bugfix.chunk_deadlock": "Tenta di prevenire i blocchi del sistema di chunk o fornisce informazioni di debug aggiuntive nel registro quando si verificano. Questi blocchi di solito si manifestano come il server che si blocca indefinitamente (ad esempio, le entità non si muovono), mentre il client continua a funzionare normalmente.", + "modernfix.option.mixin.bugfix.chunk_deadlock.valhesia": "Modifica Valhesia Structures per risolvere un problema nel suo codice che causa blocchi frequenti del worldgen/caricamento dei chunk.", + "modernfix.option.mixin.bugfix.cofh_core_crash": "Corregge un problema di multithreading in CoFH Core che può causare crash rari durante l'avvio.", + "modernfix.option.mixin.bugfix.ctm_resourceutil_cme": "Corregge un problema di multithreading in ConnectedTexturesMod che può causare crash rari durante l'avvio.", + "modernfix.option.mixin.bugfix.ender_dragon_leak": "Corregge una perdita di memoria in Vanilla causata dal drago dell'End che mantiene un riferimento al mondo client precedente.", + "modernfix.option.mixin.bugfix.entity_load_deadlock": "Corregge molti problemi in cui EntityJoinWorldEvent/EntityJoinLevelEvent causano un blocco del worldgen, ritardando leggermente il caricamento dell'entità. Non dovrebbe, tuttavia, causare cambiamenti di comportamento visibili in gioco.", + "modernfix.option.mixin.bugfix.fix_config_crashes": "Corregge il problema di Forge delle configurazioni che occasionalmente diventano corrotte durante il lancio del gioco.", + "modernfix.option.mixin.bugfix.item_cache_flag": "Corregge MC-258939", + "modernfix.option.mixin.bugfix.preserve_early_window_pos": "Fa sì che la finestra di gioco mantenga le sue dimensioni esistenti quando il controllo passa dal caricamento anticipato di Forge al codice di Minecraft. Corregge il problema della finestra che torna al centro dello schermo dopo essere stata trascinata, ecc.", + "modernfix.option.mixin.bugfix.refinedstorage.te_bug": "Corregge i blocchi di archiviazione esterna di Refined Storage che occasionalmente non mostrano i contenuti dei cassetti, ecc. quando vengono caricati. Backport di Refined Storage PR #3435, che è stato applicato solo alla versione 1.18 e successive.", + "modernfix.option.mixin.bugfix.remove_block_chunkloading": "Corregge il fatto che i maiali zombie tengano perpetuamente caricato il chunk 0, 0 su Forge. Backport di Forge PR #8583.", + "modernfix.option.mixin.bugfix.starlight_emptiness": "Corregge un crash occasionale di Starlight dovuto all'inizializzazione non corretta delle mappe di vuoto. Backport della stessa correzione in Starlight per la versione 1.18.x.", + "modernfix.option.mixin.core": "Patch di base necessarie per far funzionare ModernFix", + "modernfix.option.mixin.perf.reduce_blockstate_cache_rebuilds": "Tutte le versioni. **Un'ottimizzazione fondamentale.** Le versioni più recenti di Minecraft (dopo la 1.12) hanno implementato un sistema di cache dei blockstate che memorizza le informazioni frequentemente utilizzate su un blockstate, come ad esempio se è solido, la sua forma di collisione, ecc. Ricostruire questa cache è abbastanza veloce nella versione standard (richiede solo uno o due secondi), ma è molto lento con molti mod installati, poiché sono presenti molti più blockstate nel gioco che devono tutti avere le loro cache ricostruite.\n\nQuesto problema viene esacerbato da Forge poiché la cache viene ricostruita in molti punti quando i dati sarebbero quasi certamente inutilizzati prima della successiva ricostruzione. Esempi includono subito prima di raggiungere il menu principale (durante la fase \"Freezing data\"), nonché più volte (!) quando viene caricato un mondo.\n\nModernFix risolve questo collo di bottiglia delle prestazioni rendendo invece le ricostruzioni della cache pigre. Ogni blockstate ricostruisce la sua cache la prima volta che i dati vengono acceduti. In qualsiasi momento in cui Vanilla o Forge tenterebbero di ricostruire le cache per tutti i blockstate, questo viene ridirezionato per invalidare semplicemente la cache su ciascun blockstate.\n\nQuesto non dovrebbe avere alcun impatto sul TPS dopo che l'avvio è concluso.", + "modernfix.option.mixin.devenv": "Patch utilizzate durante l'esecuzione in un ambiente di sviluppo, per miglioramenti di velocità e/o test", + "modernfix.option.mixin.safety": "Patch di concorrenza per prevenire crash durante il lancio", + "modernfix.option.mixin.feature.integrated_server_watchdog": "Aggiunge il watchdog vanilla anche ai mondi in giocatore singolo, ma stampa solo le tracce dello stack anziché terminare forzatamente il mondo. Questa versione include la funzionalità di Fullstack Watchdog, ma quest'ultimo è comunque necessario per il multiplayer.", + "modernfix.option.mixin.feature.snapshot_easter_egg": "Aggiunge funzionalità easter egg (non influisce su alcuna visualizzazione o comportamento vanilla) quando si esegue una versione snapshot.", + "modernfix.option.mixin.feature.spark_profile_launch": "Se abilitato e installata una versione compatibile di Spark, l'intera sequenza di avvio verrà profilata fino al menu principale.", + "modernfix.option.mixin.feature.warn_missing_perf_mods": "Mostra un avviso all'avvio se altri mod per le prestazioni considerati essenziali e altamente compatibili non sono presenti", + "modernfix.option.mixin.launch.class_search_cache": "Sostituisce il risolutore delle risorse di Forge (usato per trovare il codice del gioco e di un mod) con una versione significativamente più veloce, accelerando l'avvio", + "modernfix.option.mixin.perf.clear_fabric_mapping_tables": "Riduce l'utilizzo della memoria cancellando le strutture di dati di mappatura in Fabric Loader che sono ridondanti o raramente utilizzate dai mod. Disabilitato per impostazione predefinita per motivi di compatibilità.", + "modernfix.option.mixin.perf.clear_mixin_classinfo": "Carica forzatamente tutti i mixin quando il lancio termina e quindi cancella le strutture di dati di mixin per rimuovere gran parte della memoria di Mixin. Disabilitato per impostazione predefinita per motivi di compatibilità.", + "modernfix.option.mixin.perf.deduplicate_wall_shapes": "Rende la maggior parte dei blocchi murari condividere lo stesso oggetto forma anziché avere ognuno la propria copia. Può ridurre notevolmente l'utilizzo della memoria quando vengono aggiunti molti blocchi murari dai mod.", + "modernfix.option.mixin.perf.dynamic_resources.ae2": "Patch di compatibilità AE2 per le risorse dinamiche", + "modernfix.option.mixin.perf.dynamic_resources.ctm": "Patch di compatibilità CTM per le risorse dinamiche", + "modernfix.option.mixin.perf.dynamic_resources.rs": "Patch di compatibilità Refined Storage per le risorse dinamiche", + "modernfix.option.mixin.perf.dynamic_resources.supermartijncore": "Patch di compatibilità SuperMartijn642CoreLib per le risorse dinamiche", + "modernfix.option.mixin.perf.dynamic_resources.diagonalfences": "Patch di compatibilità Diagonal Fences per le risorse dinamiche", + "modernfix.option.mixin.perf.faster_advancements": "Riscrive la logica di controllo degli avanzamenti per renderla più veloce e per evitare StackOverflowError in pacchetti grandi. Porting di Advancements Debug da Fabric.", + "modernfix.option.mixin.perf.patchouli_deduplicate_books": "Risolve il problema dei libri di Patchouli che memorizzano molti oggetti vuoti con tag NBT, riducendo l'utilizzo della memoria.", + "modernfix.option.mixin.perf.remove_spawn_chunks": "Rimuove completamente i chunk di spawn dal gioco. Non vengono più caricati affatto, a differenza di Ksyxis.", + "modernfix.option.mixin.perf.use_integrated_resources.jepb": "", + "modernfix.option.mixin.perf.use_integrated_resources.jeresources": "", + "modernfix.option.mixin.bugfix.blueprint_modif_memory_leak": "Risolve la perdita di risorse vaniglia di ObjectModificationManager in Blueprint, riducendo l'utilizzo della memoria. Nonostante la correzione sia stata contribuita in PR #195, non è ancora stata rilasciata.", + "modernfix.option.mixin.bugfix.removed_dimensions": "Risolve il problema del gioco che non riesce a caricare i mondi se vengono rimossi i mod delle dimensioni. Backport di Forge PR #8959.", + "modernfix.option.mixin.perf.compact_bit_storage": "Corregge lo spreco di memoria causato da alcuni server legacy (ad esempio Hypixel) che inviano chunk vuoti come se contenessero blocchi. Riduce notevolmente l'utilizzo della memoria su questi server.", + "modernfix.option.mixin.perf.deduplicate_climate_parameters": "Deduplica gli oggetti parametro del clima utilizzati dal nuovo sistema di biome, può risparmiare ~2MB ma rallenta leggermente la ricarica dei datapack.", + "modernfix.option.mixin.perf.dynamic_entity_renderers": "Costruisce i modelli delle entità la prima volta che vengono visti anziché durante l'avvio. Alcuni mod non sono compatibili con questa opzione e causeranno crash di EntityRenderer.", + "modernfix.option.mixin.perf.twilightforest.structure_spawn_fix": "Risolve il lag causato dal worldgen di Twilight Forest che controlla le strutture in modo molto inefficiente", + "modernfix.option.mixin.perf.fast_forge_dummies": "Velocizza il congelamento del registro di Forge durante l'avvio utilizzando un percorso del codice più veloce", + "modernfix.option.mixin.perf.tag_id_caching": "Velocizza l'uso delle voci dei tag memorizzando nella cache l'oggetto di posizione anziché ricrearlo ogni volta", + "modernfix.option.mixin.feature.disable_unihex_font": "Rimuove il font Unicode, risparmiando 10MB ma causando la mancata visualizzazione dei caratteri speciali" + } From 744622b81d8ca77688ea1227e3be9668ef4af4d0 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:58:26 -0400 Subject: [PATCH 03/25] Create FUNDING.yml [skip ci] --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..9c89146b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +ko_fi: embeddedt From 672ca92aabc94f5cccec563bc42f28b665236563 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:35:01 -0400 Subject: [PATCH 04/25] Show time to bootstrap stage on Forge --- .../modernfix/util/TimeFormatter.java | 67 +++++++++++++++++++ .../forge/mixin/core/BootstrapMixin.java | 5 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/util/TimeFormatter.java diff --git a/common/src/main/java/org/embeddedt/modernfix/util/TimeFormatter.java b/common/src/main/java/org/embeddedt/modernfix/util/TimeFormatter.java new file mode 100644 index 00000000..11356f77 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/util/TimeFormatter.java @@ -0,0 +1,67 @@ +package org.embeddedt.modernfix.util; + +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import static java.util.concurrent.TimeUnit.*; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + +/** + * All code here is derived from Guava's Stopwatch and Platform classes. + * Too bad it's not a public method call indeed... + */ +public class TimeFormatter { + static String formatCompact4Digits(double value) { + return String.format(Locale.ROOT, "%.4g", value); + } + + public static String formatNanos(long nanos) { + TimeUnit unit = chooseUnit(nanos); + double value = (double) nanos / NANOSECONDS.convert(1, unit); + + return formatCompact4Digits(value) + " " + abbreviate(unit); + } + + private static TimeUnit chooseUnit(long nanos) { + if (DAYS.convert(nanos, NANOSECONDS) > 0) { + return DAYS; + } + if (HOURS.convert(nanos, NANOSECONDS) > 0) { + return HOURS; + } + if (MINUTES.convert(nanos, NANOSECONDS) > 0) { + return MINUTES; + } + if (SECONDS.convert(nanos, NANOSECONDS) > 0) { + return SECONDS; + } + if (MILLISECONDS.convert(nanos, NANOSECONDS) > 0) { + return MILLISECONDS; + } + if (MICROSECONDS.convert(nanos, NANOSECONDS) > 0) { + return MICROSECONDS; + } + return NANOSECONDS; + } + + private static String abbreviate(TimeUnit unit) { + switch (unit) { + case NANOSECONDS: + return "ns"; + case MICROSECONDS: + return "\u03bcs"; // μs + case MILLISECONDS: + return "ms"; + case SECONDS: + return "s"; + case MINUTES: + return "min"; + case HOURS: + return "h"; + case DAYS: + return "d"; + default: + throw new AssertionError(); + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index c80304af..27ec520b 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.forge.mixin.core; import net.minecraft.server.Bootstrap; import org.apache.logging.log4j.Logger; import org.embeddedt.modernfix.forge.load.ModWorkManagerQueue; +import org.embeddedt.modernfix.util.TimeFormatter; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,6 +11,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.lang.management.ManagementFactory; + @Mixin(Bootstrap.class) public class BootstrapMixin { @Shadow private static boolean isBootstrapped; @@ -19,7 +22,7 @@ public class BootstrapMixin { @Inject(method = "bootStrap", at = @At("HEAD")) private static void doModernFixBootstrap(CallbackInfo ci) { if(!isBootstrapped) { - LOGGER.info("ModernFix bootstrap"); + LOGGER.info("ModernFix reached bootstrap stage ({} after launch)", TimeFormatter.formatNanos(ManagementFactory.getRuntimeMXBean().getUptime() * 1000L)); ModWorkManagerQueue.replace(); } } From fa9103fb06884a93c82656d87df1c9fd157522a6 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:39:07 -0400 Subject: [PATCH 05/25] Convert milliseconds to nanoseconds correctly --- .../embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index 27ec520b..ab7be02d 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -22,7 +22,7 @@ public class BootstrapMixin { @Inject(method = "bootStrap", at = @At("HEAD")) private static void doModernFixBootstrap(CallbackInfo ci) { if(!isBootstrapped) { - LOGGER.info("ModernFix reached bootstrap stage ({} after launch)", TimeFormatter.formatNanos(ManagementFactory.getRuntimeMXBean().getUptime() * 1000L)); + LOGGER.info("ModernFix reached bootstrap stage ({} after launch)", TimeFormatter.formatNanos(ManagementFactory.getRuntimeMXBean().getUptime() * 1000L * 1000L)); ModWorkManagerQueue.replace(); } } From 45f92f7fce304c0056b466467dc113e7c183dd54 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:16:20 -0400 Subject: [PATCH 06/25] Disable config reload message for now There isn't a good way to print this in a way that will catch the modification in all scenarios, and that doesn't annoy the user --- .../org/embeddedt/modernfix/forge/config/NightConfigFixer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java b/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java index 8155f186..ec27916e 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java @@ -79,7 +79,7 @@ public class NightConfigFixer { private static boolean couldShowMessage = true; private static void triggerConfigMessage() { - if(couldShowMessage && Minecraft.getInstance().level != null && ModernFixClient.recipesUpdated && ModernFixClient.tagsUpdated) { + if(false && couldShowMessage && Minecraft.getInstance().level != null && ModernFixClient.recipesUpdated && ModernFixClient.tagsUpdated) { Minecraft.getInstance().execute(() -> { if(Minecraft.getInstance().level != null) { couldShowMessage = false; From ec66fbc05c43a54dd3ce0836376a3b23856446ca Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:31:31 -0400 Subject: [PATCH 07/25] Add wiki button Related: #202 --- .../modernfix/screen/ModernFixConfigScreen.java | 13 ++++++++----- .../main/resources/assets/modernfix/lang/en_us.json | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java b/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java index f97ef7a2..a0cc441c 100644 --- a/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java +++ b/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java @@ -1,11 +1,10 @@ package org.embeddedt.modernfix.screen; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.Util; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Style; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.chat.*; import org.jetbrains.annotations.Nullable; public class ModernFixConfigScreen extends Screen { @@ -13,7 +12,7 @@ public class ModernFixConfigScreen extends Screen { private Screen lastScreen; public boolean madeChanges = false; - private Button doneButton; + private Button doneButton, wikiButton; public ModernFixConfigScreen(Screen lastScreen) { super(new TranslatableComponent("modernfix.config")); this.lastScreen = lastScreen; @@ -23,9 +22,13 @@ public class ModernFixConfigScreen extends Screen { protected void init() { this.optionList = new OptionList(this, this.minecraft); this.children.add(this.optionList); - this.doneButton = new Button(this.width / 2 - 100, this.height - 29, 200, 20, CommonComponents.GUI_DONE, (arg) -> { + this.wikiButton = new Button(this.width / 2 - 155, this.height - 29, 150, 20, new TranslatableComponent("modernfix.config.wiki"), (arg) -> { + Util.getPlatform().openUri("https://github.com/embeddedt/ModernFix/wiki/Summary-of-Patches"); + }); + this.doneButton = new Button(this.width / 2 - 155 + 160, this.height - 29, 150, 20, CommonComponents.GUI_DONE, (arg) -> { this.onClose(); }); + this.addButton(this.wikiButton); this.addButton(this.doneButton); } diff --git a/common/src/main/resources/assets/modernfix/lang/en_us.json b/common/src/main/resources/assets/modernfix/lang/en_us.json index 3afbc788..29d2e454 100644 --- a/common/src/main/resources/assets/modernfix/lang/en_us.json +++ b/common/src/main/resources/assets/modernfix/lang/en_us.json @@ -8,6 +8,7 @@ "modernfix.perf_mod_warning": "It is recommended to install the mods, but the warning(s) can be disabled in the ModernFix config.", "modernfix.config": "ModernFix mixin config", "modernfix.config.done_restart": "Done (restart required)", + "modernfix.config.wiki": "Open wiki", "modernfix.message.reload_config": "A mod config file change was detected. To prevent loading files that aren't done saving, reloading must be triggered by running /mfrc.", "modernfix.option.on": "on", "modernfix.option.off": "off", From 2a1685a2cbce49fc8de720b2fee354e497806583 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:36:50 -0400 Subject: [PATCH 08/25] Fix merge error --- .../org/embeddedt/modernfix/screen/ModernFixConfigScreen.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java b/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java index 66025f39..7cfe384e 100644 --- a/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java +++ b/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java @@ -21,9 +21,6 @@ public class ModernFixConfigScreen extends Screen { @Override protected void init() { this.optionList = new OptionList(this, this.minecraft); - this.doneButton = new Button(this.width / 2 - 100, this.height - 29, 200, 20, CommonComponents.GUI_DONE, (arg) -> { - this.onClose(); - }); this.addWidget(this.optionList); this.wikiButton = new Button(this.width / 2 - 155, this.height - 29, 150, 20, new TranslatableComponent("modernfix.config.wiki"), (arg) -> { Util.getPlatform().openUri("https://github.com/embeddedt/ModernFix/wiki/Summary-of-Patches"); From 37724d76966f54691cc3a86c60c766add006435a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BE=8A=E7=BE=BD=E3=81=A1=E3=82=83=E3=82=93?= <108245985+u7f8au7fbd@users.noreply.github.com> Date: Sat, 19 Aug 2023 11:08:17 +0900 Subject: [PATCH 09/25] Update Japanese (#221) --- common/src/main/resources/assets/modernfix/lang/ja_jp.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/src/main/resources/assets/modernfix/lang/ja_jp.json b/common/src/main/resources/assets/modernfix/lang/ja_jp.json index 81103546..e50c1689 100644 --- a/common/src/main/resources/assets/modernfix/lang/ja_jp.json +++ b/common/src/main/resources/assets/modernfix/lang/ja_jp.json @@ -4,9 +4,12 @@ "modernfix.jei_load": "JEIを読み込み中... しばらく時間がかかる可能性があります。", "modernfix.no_lazydfu": "LazyDFUがインストールされていません。Minecraftが古いバージョンのゲームデータを更新する必要がある場合、目立つラグが発生する可能性があります。", "modernfix.no_ferritecore": "FerriteCoreがインストールされていません。メモリ使用量は非常に高くなります。", + "modernfix.connectedness_dynresoruces": "ConnectednessとModernFixのダイナミックリソースオプションは互換性がありません。ModernFixの設定でConnectednessを削除するか、ダイナミックリソースを無効にしてください。", "modernfix.perf_mod_warning": "Modをインストールすることをお勧めしますが、警告はModernFixの設定で無効にできます。", "modernfix.config": "ModernFixによるmixinの設定", "modernfix.config.done_restart": "完了 (再起動が必要)", + "modernfix.config.wiki": "wikiを開く", + "modernfix.message.reload_config": "MODコンフィグファイルの変更が検出されました。保存が完了していないファイルのロードを防ぐため、/mfrc を実行してリロードをトリガーする必要があります。", "modernfix.option.on": "オン", "modernfix.option.off": "オフ", "modernfix.option.disabled": "無効", From 383d40e42067252ac2c9ec84f3cea1840d31c398 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 19 Aug 2023 14:58:07 -0400 Subject: [PATCH 10/25] Detect mixins with calls to other merged methods Related: #222 --- .../modernfix/core/ModernFixMixinPlugin.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index c61492a3..9e0354d5 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -166,11 +166,13 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin { "getFluidState", "method_26227", "m_60819_", "func_204520_s" ); Map injectorMethodNames = new HashMap<>(); + Map allMethods = new HashMap<>(); Map injectorMixinSource = new HashMap<>(); String descriptor = Type.getDescriptor(MixinMerged.class); for(MethodNode m : targetClass.methods) { if((m.access & Opcodes.ACC_STATIC) != 0) continue; + allMethods.put(m.name, m); Set seenNodes = new HashSet<>(); if(m.invisibleAnnotations != null) { for(AnnotationNode ann : m.invisibleAnnotations) { @@ -217,8 +219,35 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin { } } Set accessedFieldNames = new HashSet<>(); - // We now know all methods that have been injected into initCache. See what fields they write to - injectorMethodNames.forEach((name, method) -> { + + // Make a map of all injected methods called by initCache + Map writingMethods = new HashMap<>(injectorMethodNames); + writingMethods.keySet().retainAll(cacheCalledInjectors); + + // Recursively check the injected methods for any methods they may call + int previousSize = 0; + Set checkedCalls = new HashSet<>(); + while(writingMethods.size() > previousSize) { + previousSize = writingMethods.size(); + List keysToCheck = new ArrayList<>(writingMethods.keySet()); + for(String name : keysToCheck) { + if(!checkedCalls.add(name)) + continue; + for(AbstractInsnNode n : writingMethods.get(name).instructions) { + if(n instanceof MethodInsnNode) { + MethodInsnNode invokeNode = (MethodInsnNode)n; + if(invokeNode.owner.equals(targetClass.name)) { + MethodNode theMethod = allMethods.get(invokeNode.name); + if(theMethod != null) + writingMethods.put(invokeNode.name, theMethod); + } + } + } + } + } + + // We now know all methods that have been injected into initCache, and their callers. See what fields they write to + writingMethods.forEach((name, method) -> { if(cacheCalledInjectors.contains(name)) { for(AbstractInsnNode n : method.instructions) { if(n instanceof FieldInsnNode) { From 58b7b0da0f3653eb6f80fb2530bbf825da2c6f86 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 19 Aug 2023 19:18:52 -0400 Subject: [PATCH 11/25] Fix MI pipes being invisible when faster_item_rendering is enabled --- .../mixin/perf/faster_item_rendering/ItemRendererMixin.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java index 4ca3ff51..20f4fdcc 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java @@ -23,10 +23,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public abstract class ItemRendererMixin { private ItemTransforms.TransformType transformType; private final SimpleItemModelView modelView = new SimpleItemModelView(); + private boolean mfix$isTopLevelSimpleModel; @Inject(method = "render", at = @At("HEAD")) private void markRenderingType(ItemStack itemStack, ItemTransforms.TransformType transformType, boolean leftHand, PoseStack matrixStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model, CallbackInfo ci) { this.transformType = transformType; + // used as renderModelLists may be called by custom model renderers + this.mfix$isTopLevelSimpleModel = model != null && model.getClass() == SimpleBakedModel.class; } /** @@ -39,7 +42,7 @@ public abstract class ItemRendererMixin { */ @ModifyVariable(method = "renderModelLists", at = @At("HEAD"), index = 1, argsOnly = true) private BakedModel useSimpleWrappedItemModel(BakedModel model, BakedModel arg, ItemStack stack, int combinedLight, int combinedOverlay, PoseStack matrixStack, VertexConsumer buffer) { - if(!RenderState.IS_RENDERING_LEVEL && !stack.isEmpty() && model.getClass() == SimpleBakedModel.class && transformType == ItemTransforms.TransformType.GUI) { + if(!RenderState.IS_RENDERING_LEVEL && !stack.isEmpty() && mfix$isTopLevelSimpleModel && model.getClass() == SimpleBakedModel.class && transformType == ItemTransforms.TransformType.GUI) { FastItemRenderType type; ItemTransform transform = model.getTransforms().gui; if(transform == ItemTransform.NO_TRANSFORM) From dcbc3e033a519be56d8a3050955e1bcfa873299a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 19 Aug 2023 19:30:30 -0400 Subject: [PATCH 12/25] Tweak injection point of faster_item_rendering --- .../perf/faster_item_rendering/ItemRendererMixin.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java index 20f4fdcc..fdae3775 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java @@ -16,20 +16,17 @@ import org.embeddedt.modernfix.render.SimpleItemModelView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = ItemRenderer.class, priority = 600) public abstract class ItemRendererMixin { private ItemTransforms.TransformType transformType; private final SimpleItemModelView modelView = new SimpleItemModelView(); - private boolean mfix$isTopLevelSimpleModel; @Inject(method = "render", at = @At("HEAD")) private void markRenderingType(ItemStack itemStack, ItemTransforms.TransformType transformType, boolean leftHand, PoseStack matrixStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model, CallbackInfo ci) { this.transformType = transformType; - // used as renderModelLists may be called by custom model renderers - this.mfix$isTopLevelSimpleModel = model != null && model.getClass() == SimpleBakedModel.class; } /** @@ -40,9 +37,9 @@ public abstract class ItemRendererMixin { * we do not need to go through the process of rendering every quad. Just render the south ones (the ones facing the * camera). */ - @ModifyVariable(method = "renderModelLists", at = @At("HEAD"), index = 1, argsOnly = true) - private BakedModel useSimpleWrappedItemModel(BakedModel model, BakedModel arg, ItemStack stack, int combinedLight, int combinedOverlay, PoseStack matrixStack, VertexConsumer buffer) { - if(!RenderState.IS_RENDERING_LEVEL && !stack.isEmpty() && mfix$isTopLevelSimpleModel && model.getClass() == SimpleBakedModel.class && transformType == ItemTransforms.TransformType.GUI) { + @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/ItemRenderer;renderModelLists(Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/item/ItemStack;IILcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;)V"), index = 0) + private BakedModel useSimpleWrappedItemModel(BakedModel model, ItemStack stack, int combinedLight, int combinedOverlay, PoseStack matrixStack, VertexConsumer buffer) { + if(!RenderState.IS_RENDERING_LEVEL && !stack.isEmpty() && model.getClass() == SimpleBakedModel.class && transformType == ItemTransforms.TransformType.GUI) { FastItemRenderType type; ItemTransform transform = model.getTransforms().gui; if(transform == ItemTransform.NO_TRANSFORM) From 1f7da1d65086be2242f028d09e85d48ce5bb886e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 20 Aug 2023 13:15:22 -0400 Subject: [PATCH 13/25] Fix mixin scanning fix not actually working due to typo when backporting --- .../modernfix/core/ModernFixMixinPlugin.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index 9e0354d5..5fbe1c36 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -248,13 +248,11 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin { // We now know all methods that have been injected into initCache, and their callers. See what fields they write to writingMethods.forEach((name, method) -> { - if(cacheCalledInjectors.contains(name)) { - for(AbstractInsnNode n : method.instructions) { - if(n instanceof FieldInsnNode) { - FieldInsnNode fieldAcc = (FieldInsnNode)n; - if(fieldAcc.getOpcode() == Opcodes.PUTFIELD && fieldAcc.owner.equals(targetClass.name)) { - accessedFieldNames.add(fieldAcc.name); - } + for(AbstractInsnNode n : method.instructions) { + if(n instanceof FieldInsnNode) { + FieldInsnNode fieldAcc = (FieldInsnNode)n; + if(fieldAcc.getOpcode() == Opcodes.PUTFIELD && fieldAcc.owner.equals(targetClass.name)) { + accessedFieldNames.add(fieldAcc.name); } } } From e1ea900ffbd95edfddf2c8c2049e164f94951561 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:21:11 -0400 Subject: [PATCH 14/25] Disable compress_biome_container when Modern Beta is installed Related: #224 --- .../embeddedt/modernfix/core/config/ModernFixEarlyConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index ddbf0f7b..18a4391d 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -210,7 +210,7 @@ public class ModernFixEarlyConfig { disableIfModPresent("mixin.perf.thread_priorities", "smoothboot", "threadtweak"); disableIfModPresent("mixin.perf.boost_worker_count", "smoothboot", "threadtweak"); disableIfModPresent("mixin.perf.async_jei", "modernui"); - disableIfModPresent("mixin.perf.compress_biome_container", "chocolate", "betterendforge" ,"skyblockbuilder"); + disableIfModPresent("mixin.perf.compress_biome_container", "chocolate", "betterendforge" ,"skyblockbuilder", "modern_beta"); disableIfModPresent("mixin.bugfix.mc218112", "performant"); disableIfModPresent("mixin.bugfix.remove_block_chunkloading", "performant"); disableIfModPresent("mixin.bugfix.paper_chunk_patches", "c2me"); From 54625c1a40e423fb325377dab096c2f3e8e0a5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B6=E6=99=BA=E4=B9=83=E5=8F=8D=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=8F=8A?= <100760086+qznfbnj@users.noreply.github.com> Date: Mon, 21 Aug 2023 02:24:58 +0800 Subject: [PATCH 15/25] Update zh_cn.json (#223) --- common/src/main/resources/assets/modernfix/lang/zh_cn.json | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/resources/assets/modernfix/lang/zh_cn.json b/common/src/main/resources/assets/modernfix/lang/zh_cn.json index f0686d62..11eba3e2 100644 --- a/common/src/main/resources/assets/modernfix/lang/zh_cn.json +++ b/common/src/main/resources/assets/modernfix/lang/zh_cn.json @@ -8,6 +8,7 @@ "modernfix.perf_mod_warning": "推荐安装这些模组,但你也可以在现代化修复的配置中禁用此警告。", "modernfix.config": "现代化修复Mixin配置", "modernfix.config.done_restart": "完成(生效需重启)", + "modernfix.config.wiki": "打开英文wiki", "modernfix.message.reload_config": "检测到模组配置文件的更改。为了避免加载尚未保存完毕的文件,重载过程必须通过使用§b/mfrc§r命令来触发。", "modernfix.option.on": "开启", "modernfix.option.off": "关闭", From f7097ec3940edd8fdbabb7cb3a8107cad89801ee Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 20 Aug 2023 19:58:07 -0400 Subject: [PATCH 16/25] Update Forge target to 47.1.3 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9fb1fa97..73e07a28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ mixinextras_version=0.2.0-beta.9 mod_id=modernfix minecraft_version=1.20.1 enabled_platforms=fabric,forge -forge_version=1.20.1-47.0.14 +forge_version=1.20.1-47.1.3 parchment_version=2023.07.09 refined_storage_version=4392788 jei_version=13.1.0.2 From 8081e0db02d973a68c72a6d939ddacfef3251cc8 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:01:09 -0400 Subject: [PATCH 17/25] BLS compat improvement --- .../embeddedt/modernfix/core/config/ModernFixEarlyConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 18a4391d..c1eed340 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -214,6 +214,7 @@ public class ModernFixEarlyConfig { disableIfModPresent("mixin.bugfix.mc218112", "performant"); disableIfModPresent("mixin.bugfix.remove_block_chunkloading", "performant"); disableIfModPresent("mixin.bugfix.paper_chunk_patches", "c2me"); + disableIfModPresent("mixin.bugfix.preserve_early_window_pos", "better_loading_screen"); disableIfModPresent("mixin.perf.cache_strongholds", "littletiles"); // content overlap disableIfModPresent("mixin.perf.deduplicate_wall_shapes", "dashloader"); From 4418dd2eabae4e697ade618238d1bc5078958c8c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 24 Aug 2023 21:46:23 -0400 Subject: [PATCH 18/25] Fix misapplied Forge patch that no longer checks currently loading chunk --- .../ServerChunkCache_CurrentLoadingMixin.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java new file mode 100644 index 00000000..15b3c4c1 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java @@ -0,0 +1,57 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.chunk_deadlock; + +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; + +@Mixin(ServerChunkCache.class) +public abstract class ServerChunkCache_CurrentLoadingMixin { + @Shadow @Nullable protected abstract ChunkHolder getVisibleChunkIfPresent(long l); + + private static final MethodHandle CURRENTLY_LOADING; + + static { + try { + Field currentlyLoadingField = ObfuscationReflectionHelper.findField(ChunkHolder.class, "currentlyLoading"); + currentlyLoadingField.setAccessible(true); + CURRENTLY_LOADING = MethodHandles.lookup().unreflectGetter(currentlyLoadingField); + } catch(Exception e) { + throw new RuntimeException("Failed to get currentlyLoading field", e); + } + } + + /** + * Check the currentlyLoading field before going to the future chain, as was done in 1.16. In 1.18 upstream seems + * to have only applied this to getChunkNow(). + */ + @Inject(method = "getChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;getChunkFutureMainThread(IILnet/minecraft/world/level/chunk/ChunkStatus;Z)Ljava/util/concurrent/CompletableFuture;"), cancellable = true) + private void checkCurrentlyLoading(int chunkX, int chunkZ, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable cir) { + long i = ChunkPos.asLong(chunkX, chunkZ); + ChunkHolder holder = this.getVisibleChunkIfPresent(i); + if(holder != null) { + LevelChunk c; + try { + c = (LevelChunk)CURRENTLY_LOADING.invokeExact(holder); + } catch(Throwable e) { + e.printStackTrace(); + c = null; + } + if(c != null) + cir.setReturnValue(c); + } + } +} \ No newline at end of file From eadb19d386df91d1be031db954d9457fe404aecf Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:00:21 -0400 Subject: [PATCH 19/25] Allow Model Loading API to inject and load extra models --- .../perf/dynamic_resources/ModelBakeryMixin.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java index ae3cbeca..a43c58b8 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -87,7 +87,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { // we can handle recursion in getModel without issues fabric_enableGetOrLoadModelGuard = false; this.blockColors = val; - this.ignoreModelLoad = true; this.loadedBakedModels = CacheBuilder.newBuilder() .expireAfterAccess(ModelBakeryHelpers.MAX_MODEL_LIFETIME_SECS, TimeUnit.SECONDS) .maximumSize(ModelBakeryHelpers.MAX_BAKED_MODEL_COUNT) @@ -119,6 +118,11 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache); } + @Inject(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", ordinal = 0)) + private void ignoreFutureModelLoads(CallbackInfo ci) { + this.ignoreModelLoad = true; + } + private void onModelRemoved(RemovalNotification notification) { if(!debugDynamicModelLoading) return; @@ -193,7 +197,10 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { @Redirect(method = "bakeModels", at = @At(value = "INVOKE", target = "Ljava/util/Map;keySet()Ljava/util/Set;")) private Set skipBake(Map instance) { - return Collections.emptySet(); + Set modelSet = new HashSet<>(instance.keySet()); + if(modelSet.size() > 0) + ModernFix.LOGGER.info("Early baking {} models", modelSet.size()); + return modelSet; } /** From ec996877022331c659681cda8d1a18332f9265a6 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 29 Aug 2023 15:08:50 -0400 Subject: [PATCH 20/25] Fix Canary compat --- .../chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java index 15b3c4c1..200f98be 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java @@ -38,7 +38,7 @@ public abstract class ServerChunkCache_CurrentLoadingMixin { * Check the currentlyLoading field before going to the future chain, as was done in 1.16. In 1.18 upstream seems * to have only applied this to getChunkNow(). */ - @Inject(method = "getChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;getChunkFutureMainThread(IILnet/minecraft/world/level/chunk/ChunkStatus;Z)Ljava/util/concurrent/CompletableFuture;"), cancellable = true) + @Inject(method = "getChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;getChunkFutureMainThread(IILnet/minecraft/world/level/chunk/ChunkStatus;Z)Ljava/util/concurrent/CompletableFuture;"), cancellable = true, require = 0) private void checkCurrentlyLoading(int chunkX, int chunkZ, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable cir) { long i = ChunkPos.asLong(chunkX, chunkZ); ChunkHolder holder = this.getVisibleChunkIfPresent(i); From 987c5dc321bdcea751f2245a5b005eafe858ac30 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 29 Aug 2023 15:16:54 -0400 Subject: [PATCH 21/25] Change mixin priority --- .../chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java index 200f98be..6553f291 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/chunk_deadlock/ServerChunkCache_CurrentLoadingMixin.java @@ -18,7 +18,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; -@Mixin(ServerChunkCache.class) +@Mixin(value = ServerChunkCache.class, priority = 1100) public abstract class ServerChunkCache_CurrentLoadingMixin { @Shadow @Nullable protected abstract ChunkHolder getVisibleChunkIfPresent(long l); From 20a15a587cfb1066aa22f0deff5de26546101308 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 30 Aug 2023 19:22:15 -0400 Subject: [PATCH 22/25] Create CONTRIBUTING.md [skip ci] --- CONTRIBUTING.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..bc3b5c91 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,22 @@ +ModernFix is a standard Minecraft-style Gradle project powered by Architectury Loom. To build the mod for all platforms, +run the `build` task (e.g. via `./gradlew build`). You can also use `./gradlew forge:build` or `./gradlew fabric:build` +to build for just one loader (e.g. when debugging and wanting to rebuild quickly). + +You must use Java 17 to develop ModernFix as the toolchain requires it. Nonetheless, the 1.16 mod JARs will work on +a Minecraft instance with Java 8. + +## Submitting pull requests + +Code or documentation contributions are welcome. Please keep the following points in mind: + +* This project supports many Minecraft versions. Ideally, contributions should be made to the oldest relevant MC version. +For instance, a PR optimizing new worldgen should be made to 1.18 (not 1.19 or 1.20) while a PR optimizing something +like recipes should be made to 1.16 (the oldest supported version). + + This somewhat unconventional policy ensures that all supported versions are treated equal when it comes to development, +rather than the onus being on other modders and players to backport changes that are needed. Changes to older versions are +quickly ported up to the latest one as part of the regular development cycle. You are still welcome to open PRs against +a newer branch if desired - but the change will likely be applied manually and not merged as a regular PR. + +* Please ensure your code is reasonably neat and sufficiently documented. Remember that self-documenting code is always +better. From fcde6104eb774acce18747ed75dd6130544986cf Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:49:25 -0400 Subject: [PATCH 23/25] Possible NPE fixes for KubeJS --- .../forge/mixin/perf/kubejs/IDFilterMixin.java | 7 +++++-- .../forge/mixin/perf/kubejs/TagWrapperMixin.java | 15 +++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/IDFilterMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/IDFilterMixin.java index 1278203b..98ccf9a8 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/IDFilterMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/IDFilterMixin.java @@ -24,8 +24,11 @@ public class IDFilterMixin { @Overwrite(remap = false) public boolean test(RecipeJS recipe) { if(!_targetSearched) { - _target = KubeUtil.originalRecipesByHash.get(this.id); - _targetSearched = true; + if(KubeUtil.originalRecipesByHash.size() > 0) { + _target = KubeUtil.originalRecipesByHash.get(this.id); + _targetSearched = true; + } else + return recipe.getOrCreateId().equals(this.id); // fallback } return recipe == _target; } diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/TagWrapperMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/TagWrapperMixin.java index ada7a4e2..bfc23bf8 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/TagWrapperMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/TagWrapperMixin.java @@ -4,6 +4,7 @@ import dev.latvian.kubejs.server.TagEventJS; import dev.latvian.kubejs.util.UtilsJS; import me.shedaniel.architectury.registry.Registry; import net.minecraft.resources.ResourceLocation; +import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.RequiresMod; import org.embeddedt.modernfix.forge.util.KubeUtil; import org.spongepowered.asm.mixin.Mixin; @@ -29,15 +30,21 @@ public class TagWrapperMixin { @Redirect(method = "add", at = @At(value = "INVOKE", target = "Lme/shedaniel/architectury/registry/Registry;getIds()Ljava/util/Set;", ordinal = 0), remap = false) private Set getCachedIds(Registry registryIn) { + String currentPatternStr = this.currentPatternStr; if(currentPatternStr == null) throw new AssertionError(); Set cachedSet = KubeUtil.matchedIdsForRegex.get(currentPatternStr); if(cachedSet == null) { Pattern thePattern = UtilsJS.parseRegex(currentPatternStr); - ArrayList locations = new ArrayList<>(registryIn.getIds()); - cachedSet = locations.parallelStream() - .filter(rLoc -> thePattern.matcher(rLoc.toString()).find()) - .collect(Collectors.toSet()); + if(thePattern != null) { + ArrayList locations = new ArrayList<>(registryIn.getIds()); + cachedSet = locations.parallelStream() + .filter(rLoc -> thePattern.matcher(rLoc.toString()).find()) + .collect(Collectors.toSet()); + } else { + ModernFix.LOGGER.error("Empty pattern for '{}' somehow... ignoring...", currentPatternStr); + cachedSet = new HashSet<>(); + } KubeUtil.matchedIdsForRegex.put(currentPatternStr, cachedSet); } return cachedSet; From 5fef7dc66b0c0018a8995d5e152ed05e296f7897 Mon Sep 17 00:00:00 2001 From: Phoenix-Starlight <64714532+Phoenix-Starlight@users.noreply.github.com> Date: Thu, 31 Aug 2023 04:56:38 -0700 Subject: [PATCH 24/25] Fix dynamic resources ModelManager leak (#231) The opened BufferedReader was not being closed, and apparently the cleaner/finalize mechanism doesn't exist for it --- .../perf/dynamic_resources/ModelManagerMixin.java | 9 +++++---- .../perf/dynamic_resources/ModelManagerMixin.java | 13 ++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelManagerMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelManagerMixin.java index ce620eed..62179e16 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelManagerMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelManagerMixin.java @@ -16,6 +16,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import java.io.BufferedReader; import java.io.IOException; import java.util.List; import java.util.Map; @@ -43,8 +44,8 @@ public class ModelManagerMixin { private BlockModel loadSingleBlockModel(ResourceManager manager, ResourceLocation location) { return manager.getResource(location).map(resource -> { - try { - return BlockModel.fromStream(resource.openAsReader()); + try (BufferedReader reader = resource.openAsReader()) { + return BlockModel.fromStream(reader); } catch(IOException e) { ModernFix.LOGGER.error("Couldn't load model", e); return null; @@ -54,8 +55,8 @@ public class ModelManagerMixin { private List loadSingleBlockState(ResourceManager manager, ResourceLocation location) { return manager.getResourceStack(location).stream().map(resource -> { - try { - return new ModelBakery.LoadedJson(resource.sourcePackId(), GsonHelper.parse(resource.openAsReader())); + try (BufferedReader reader = resource.openAsReader()) { + return new ModelBakery.LoadedJson(resource.sourcePackId(), GsonHelper.parse(reader)); } catch(IOException e) { ModernFix.LOGGER.error("Couldn't load blockstate", e); return null; diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelManagerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelManagerMixin.java index 4e7cbfd3..98066097 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelManagerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelManagerMixin.java @@ -16,8 +16,11 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import java.io.BufferedReader; import java.io.IOException; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.stream.Collectors; @@ -41,8 +44,8 @@ public class ModelManagerMixin { private BlockModel loadSingleBlockModel(ResourceManager manager, ResourceLocation location) { return manager.getResource(location).map(resource -> { - try { - return BlockModel.fromStream(resource.openAsReader()); + try (BufferedReader reader = resource.openAsReader()) { + return BlockModel.fromStream(reader); } catch(IOException e) { ModernFix.LOGGER.error("Couldn't load model", e); return null; @@ -52,8 +55,8 @@ public class ModelManagerMixin { private List loadSingleBlockState(ResourceManager manager, ResourceLocation location) { return manager.getResourceStack(location).stream().map(resource -> { - try { - return new ModelBakery.LoadedJson(resource.sourcePackId(), GsonHelper.parse(resource.openAsReader())); + try (BufferedReader reader = resource.openAsReader()) { + return new ModelBakery.LoadedJson(resource.sourcePackId(), GsonHelper.parse(reader)); } catch(IOException e) { ModernFix.LOGGER.error("Couldn't load blockstate", e); return null; From dc42bda09dc94115533da21f15f64b3eda85f0b3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 31 Aug 2023 11:09:56 -0400 Subject: [PATCH 25/25] Move shared build code out of rootProject build.gradle --- build.gradle | 204 +----------------- buildSrc/build.gradle | 3 + buildSrc/settings.gradle | 0 .../modernfix.common-conventions.gradle | 81 +++++++ .../modernfix.mod-common-conventions.gradle | 52 +++++ .../modernfix.platform-conventions.gradle | 69 ++++++ common/build.gradle | 8 +- fabric/build.gradle | 6 +- fabric/testmod/build.gradle | 4 +- forge/build.gradle | 7 +- test_agent/build.gradle | 1 + 11 files changed, 221 insertions(+), 214 deletions(-) create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/settings.gradle create mode 100644 buildSrc/src/main/groovy/modernfix.common-conventions.gradle create mode 100644 buildSrc/src/main/groovy/modernfix.mod-common-conventions.gradle create mode 100644 buildSrc/src/main/groovy/modernfix.platform-conventions.gradle diff --git a/build.gradle b/build.gradle index 6e8b099b..95e3d5b8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.2-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.3-SNAPSHOT" apply false id "maven-publish" id 'com.matthewprenger.cursegradle' version '1.4.0' apply false id 'com.palantir.git-version' version '1.0.0' @@ -8,6 +8,7 @@ plugins { id 'se.bjurr.gitchangelog.git-changelog-gradle-plugin' version '1.79.0' id "com.modrinth.minotaur" version "2.+" apply false id("com.diffplug.spotless") version "6.18.0" apply false + id 'modernfix.common-conventions' apply false } architectury { @@ -16,136 +17,7 @@ architectury { ext.archives_base_name = 'modernfix' -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - apply plugin: "com.diffplug.spotless" - - spotless { - java { - removeUnusedImports() - } - } - - architectury { - compileOnly() - } - - group = 'org.embeddedt' - // extract base version from tag, generate other metadata ourselves - def details = versionDetails() - def plusIndex = details.lastTag.indexOf("+") - if(plusIndex == -1) { - plusIndex = details.lastTag.length() - } - def baseVersion = details.lastTag.substring(0, plusIndex) - def dirtyMarker = grgit.status().clean ? "" : ".dirty" - def commitHashMarker = details.commitDistance > 0 ? ("." + details.gitHash.substring(0, Math.min(4, details.gitHash.length()))) : "" - def preMarker = (details.commitDistance > 0 || !details.isCleanTag) ? ("-beta." + details.commitDistance) : "" - if(preMarker.length() > 0) { - // bump to next patch release - def versionParts = baseVersion.tokenize(".") - baseVersion = "${versionParts[0]}.${versionParts[1]}.${versionParts[2].toInteger() + 1}" - } - def versionString = "${baseVersion}${preMarker}+mc${minecraft_version}${commitHashMarker}${dirtyMarker}" - version = versionString - archivesBaseName = rootProject.archives_base_name + '-' + project.name - - sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 - - repositories { - maven { url 'https://modmaven.dev/' } - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } - maven { - name = 'ParchmentMC' - url = 'https://maven.parchmentmc.org' - } - maven { - // Shedaniel's maven (Architectury API) - url = "https://maven.architectury.dev" - content { - includeGroup "me.shedaniel" - } - } - - maven { - // saps.dev Maven (KubeJS and Rhino) - url = "https://maven.saps.dev/minecraft" - content { - includeGroup "dev.latvian.mods" - } - } - maven { // CTM - url "https://maven.tterrag.com/" - } - maven { url 'https://maven.blamejared.com' } - repositories { - maven { - name = "Fuzs Mod Resources" - url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" - } - } - maven { - url 'https://maven.terraformersmc.com/releases' - } - maven { url = "https://jitpack.io" } - } -} - -configure(subprojects.findAll {it.name == "common" || it.name == "forge" || it.name == "fabric"}) { - apply plugin: "dev.architectury.loom" - - loom { - silentMojangMappingsLicense() - } - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered() { - officialMojangMappings() - if(rootProject.hasProperty("parchment_version")) { - parchment("org.parchmentmc.data:parchment-${minecraft_version}:${parchment_version}@zip") - } - } - } - - processResources { - def mixinFileList = [] - def mixinDirectory = file("src/main/java/org/embeddedt/modernfix/" + project.name + "/mixin") - fileTree(mixinDirectory).visit { FileVisitDetails details -> - if(details.file.isFile()) { - def fileName = mixinDirectory.relativePath(details.file).toString().replaceFirst(/\.java$/, "").replace('/', '.') - mixinFileList << fileName - } - } - - def mixinClassesStringB = new StringBuilder() - for(int i = 0; i < mixinFileList.size(); i++) { - mixinClassesStringB.append(" \"") - mixinClassesStringB.append(mixinFileList.get(i)) - mixinClassesStringB.append('"') - if(i < (mixinFileList.size() - 1)) - mixinClassesStringB.append(',') - mixinClassesStringB.append('\n') - } - - def replacements = [ - mixin_classes: mixinClassesStringB.toString() - ] - - inputs.properties replacements - def filePattern = "modernfix-" + project.name + ".mixins.json" - filesMatching(filePattern) { - expand replacements - } - } -} +apply plugin: 'modernfix.common-conventions' tasks.withType(JavaCompile).configureEach { // ensure that the encoding is set to UTF-8, no matter what the system default is @@ -192,74 +64,4 @@ tasks.register('checkCleanTag') { } } -configure(subprojects.findAll {it.name == "forge" || it.name == "fabric"}) { - apply plugin: 'com.matthewprenger.cursegradle' - apply plugin: 'com.modrinth.minotaur' - - loom { - mods { - main { // to match the default mod generated for Forge - sourceSet project.sourceSets.main - sourceSet project(':common').sourceSets.main - } - } - runs { - client { - vmArgs "-Xmx1G" - vmArgs "-Xms1G" - property("mixin.debug.export", "true") - } - } - } - - def copyJarNameConsistent = tasks.register('copyJarNameConsistent', Copy) { - from remapJar // shortcut for createJar.outputs.files - into project.file("build/libs") - rename { name -> "modernfix-" + project.name + "-latest.jar" } - } - - def copyJarToBin = tasks.register('copyJarToBin', Copy) { - from remapJar // shortcut for createJar.outputs.files - into rootProject.file("bin") - mustRunAfter "copyJarNameConsistent" - } - - tasks.build.dependsOn(copyJarToBin, copyJarNameConsistent) - - def isBeta = project.version.toString().contains("beta") - - curseforge { - if (System.getenv("CURSEFORGE_TOKEN") != null) { - apiKey = System.getenv("CURSEFORGE_TOKEN") - project { - id = "790626" - changelog = file('../CHANGELOG.md') - changelogType = "markdown" - releaseType = isBeta ? "beta" : "release" - addGameVersion project.name.capitalize() - gameVersionStrings.addAll(supported_minecraft_versions.tokenize(",")) - mainArtifact remapJar - } - } - } - - modrinth { - token = System.getenv("MODRINTH_TOKEN") - projectId = "modernfix" // This can be the project ID or the slug. Either will work! - versionType = isBeta ? "beta" : "release" // This is the default -- can also be `beta` or `alpha` - uploadFile = remapJar - gameVersions = supported_minecraft_versions.tokenize(",") - loaders = [project.name] - changelog.set(provider { file("CHANGELOG.md").getText('UTF-8') }) - } - - tasks.curseforge.dependsOn(rootProject.generateChangelog) - tasks.modrinth.dependsOn(rootProject.generateChangelog) - - tasks.register('publishToModSites') { - publishToModSites.dependsOn(tasks.modrinth) - publishToModSites.dependsOn(tasks.curseforge) - } -} - println "ModernFix: " + version \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 00000000..1957c339 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'groovy-gradle-plugin' +} \ No newline at end of file diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle new file mode 100644 index 00000000..e69de29b diff --git a/buildSrc/src/main/groovy/modernfix.common-conventions.gradle b/buildSrc/src/main/groovy/modernfix.common-conventions.gradle new file mode 100644 index 00000000..ebce0241 --- /dev/null +++ b/buildSrc/src/main/groovy/modernfix.common-conventions.gradle @@ -0,0 +1,81 @@ +plugins { + id 'java' + id 'architectury-plugin' + id 'maven-publish' + id 'com.diffplug.spotless' +} + +spotless { + java { + removeUnusedImports() + } +} + +architectury { + compileOnly() +} + +group = 'org.embeddedt' +// extract base version from tag, generate other metadata ourselves +def details = versionDetails() +def plusIndex = details.lastTag.indexOf("+") +if(plusIndex == -1) { + plusIndex = details.lastTag.length() +} +def baseVersion = details.lastTag.substring(0, plusIndex) +def dirtyMarker = grgit.status().clean ? "" : ".dirty" +def commitHashMarker = details.commitDistance > 0 ? ("." + details.gitHash.substring(0, Math.min(4, details.gitHash.length()))) : "" +def preMarker = (details.commitDistance > 0 || !details.isCleanTag) ? ("-beta." + details.commitDistance) : "" +if(preMarker.length() > 0) { + // bump to next patch release + def versionParts = baseVersion.tokenize(".") + baseVersion = "${versionParts[0]}.${versionParts[1]}.${versionParts[2].toInteger() + 1}" +} +def versionString = "${baseVersion}${preMarker}+mc${minecraft_version}${commitHashMarker}${dirtyMarker}" +version = versionString +archivesBaseName = rootProject.archives_base_name + '-' + project.name + +sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 + +repositories { + maven { url 'https://modmaven.dev/' } + maven { + url "https://cursemaven.com" + content { + includeGroup "curse.maven" + } + } + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org' + } + maven { + // Shedaniel's maven (Architectury API) + url = "https://maven.architectury.dev" + content { + includeGroup "me.shedaniel" + } + } + + maven { + // saps.dev Maven (KubeJS and Rhino) + url = "https://maven.saps.dev/minecraft" + content { + includeGroup "dev.latvian.mods" + } + } + maven { // CTM + url "https://maven.tterrag.com/" + } + maven { url 'https://maven.blamejared.com' } + repositories { + maven { + name = "Fuzs Mod Resources" + url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" + } + } + maven { + url 'https://maven.terraformersmc.com/releases' + } + maven { url = "https://jitpack.io" } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/modernfix.mod-common-conventions.gradle b/buildSrc/src/main/groovy/modernfix.mod-common-conventions.gradle new file mode 100644 index 00000000..3362ce37 --- /dev/null +++ b/buildSrc/src/main/groovy/modernfix.mod-common-conventions.gradle @@ -0,0 +1,52 @@ +plugins { + id 'modernfix.common-conventions' + id 'dev.architectury.loom' +} + +loom { + silentMojangMappingsLicense() + accessWidenerPath = file("${rootDir}/common/src/main/resources/modernfix.accesswidener") +} + +dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.layered() { + officialMojangMappings() + if(rootProject.hasProperty("parchment_version")) { + parchment("org.parchmentmc.data:parchment-${minecraft_version}:${parchment_version}@zip") + } + } +} + +tasks { + processResources { + def mixinFileList = [] + def mixinDirectory = file("src/main/java/org/embeddedt/modernfix/" + project.name + "/mixin") + fileTree(mixinDirectory).visit { FileVisitDetails details -> + if(details.file.isFile()) { + def fileName = mixinDirectory.relativePath(details.file).toString().replaceFirst(/\.java$/, "").replace('/', '.') + mixinFileList << fileName + } + } + + def mixinClassesStringB = new StringBuilder() + for(int i = 0; i < mixinFileList.size(); i++) { + mixinClassesStringB.append(" \"") + mixinClassesStringB.append(mixinFileList.get(i)) + mixinClassesStringB.append('"') + if(i < (mixinFileList.size() - 1)) + mixinClassesStringB.append(',') + mixinClassesStringB.append('\n') + } + + def replacements = [ + mixin_classes: mixinClassesStringB.toString() + ] + + inputs.properties replacements + def filePattern = "modernfix-" + project.name + ".mixins.json" + filesMatching(filePattern) { + expand replacements + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/modernfix.platform-conventions.gradle b/buildSrc/src/main/groovy/modernfix.platform-conventions.gradle new file mode 100644 index 00000000..5753965e --- /dev/null +++ b/buildSrc/src/main/groovy/modernfix.platform-conventions.gradle @@ -0,0 +1,69 @@ +plugins { + id 'com.matthewprenger.cursegradle' + id 'com.modrinth.minotaur' +} + +loom { + mods { + main { // to match the default mod generated for Forge + sourceSet project.sourceSets.main + sourceSet project(':common').sourceSets.main + } + } + runs { + client { + vmArgs "-Xmx1G" + vmArgs "-Xms1G" + property("mixin.debug.export", "true") + } + } +} + +def copyJarNameConsistent = tasks.register('copyJarNameConsistent', Copy) { + from remapJar // shortcut for createJar.outputs.files + into project.file("build/libs") + rename { name -> "modernfix-" + project.name + "-latest.jar" } +} + +def copyJarToBin = tasks.register('copyJarToBin', Copy) { + from remapJar // shortcut for createJar.outputs.files + into rootProject.file("bin") + mustRunAfter "copyJarNameConsistent" +} + +tasks.build.dependsOn(copyJarToBin, copyJarNameConsistent) + +def isBeta = project.version.toString().contains("beta") + +curseforge { + if (System.getenv("CURSEFORGE_TOKEN") != null) { + apiKey = System.getenv("CURSEFORGE_TOKEN") + project { + id = "790626" + changelog = file('../CHANGELOG.md') + changelogType = "markdown" + releaseType = isBeta ? "beta" : "release" + addGameVersion project.name.capitalize() + gameVersionStrings.addAll(supported_minecraft_versions.tokenize(",")) + mainArtifact remapJar + } + } +} + +modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = "modernfix" // This can be the project ID or the slug. Either will work! + versionType = isBeta ? "beta" : "release" // This is the default -- can also be `beta` or `alpha` + uploadFile = remapJar + gameVersions = supported_minecraft_versions.tokenize(",") + loaders = [project.name] + changelog.set(provider { file("CHANGELOG.md").getText('UTF-8') }) +} + +tasks.curseforge.dependsOn(rootProject.generateChangelog) +tasks.modrinth.dependsOn(rootProject.generateChangelog) + +tasks.register('publishToModSites') { + publishToModSites.dependsOn(tasks.modrinth) + publishToModSites.dependsOn(tasks.curseforge) +} \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle index ec4d9687..0f40cb30 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,9 +1,9 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) +plugins { + id "modernfix.mod-common-conventions" } -loom { - accessWidenerPath = file("src/main/resources/modernfix.accesswidener") +architectury { + common(rootProject.enabled_platforms.split(",")) } dependencies { diff --git a/fabric/build.gradle b/fabric/build.gradle index e970eace..6eefad32 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,6 +1,8 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.2" id 'com.adarshr.test-logger' version '3.2.0' + id "modernfix.mod-common-conventions" + id "modernfix.platform-conventions" } architectury { @@ -8,10 +10,6 @@ architectury { fabric() } -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - configurations { common shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. diff --git a/fabric/testmod/build.gradle b/fabric/testmod/build.gradle index 7ecb1346..6fd2d983 100644 --- a/fabric/testmod/build.gradle +++ b/fabric/testmod/build.gradle @@ -1,4 +1,6 @@ -apply plugin: "dev.architectury.loom" +plugins { + id 'dev.architectury.loom' +} loom { accessWidenerPath = project(":common").loom.accessWidenerPath diff --git a/forge/build.gradle b/forge/build.gradle index 98886d77..262aac78 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,5 +1,7 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.2" + id "modernfix.mod-common-conventions" + id "modernfix.platform-conventions" } architectury { @@ -8,8 +10,6 @@ architectury { } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath - forge { convertAccessWideners = true extraAccessWideners.add loom.accessWidenerPath.get().asFile.name @@ -116,9 +116,8 @@ jar { //"Specification-Vendor": "modernfix authors", "Specification-Version" : "1", // We are version 1 of ourselves "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, + "Implementation-Version" : project.jar.archiveVersion //"Implementation-Vendor": "modernfix authors", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } } diff --git a/test_agent/build.gradle b/test_agent/build.gradle index 2141b87d..bd589bbd 100644 --- a/test_agent/build.gradle +++ b/test_agent/build.gradle @@ -1,6 +1,7 @@ plugins { //id 'com.github.johnrengelman.shadow' version '7.1.2' id 'java' + id 'modernfix.common-conventions' } group 'org.embeddedt'