Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79952c3f65 | ||
|
|
0f918899fb | ||
|
|
94fefc0442 | ||
|
|
5ea7950f23 |
@@ -6,6 +6,17 @@ Créer un monde **Sanctuary** en Petit, Moyen ou Grand, puis activer les ancres
|
||||
correspondantes. Le module Sanctuary Test n’est pas requis.
|
||||
[Intégration et vérification du pack beta.224](docs/four-islands-base224.md).
|
||||
|
||||
## Essai de carte derrière Pause — annulé
|
||||
|
||||
[L'essai plein écran](docs/pause-map-layer-beta236.md) est annulé à la demande
|
||||
du créateur. Pause retrouve la disposition beta.235, avec la carte au centre
|
||||
et une colonne de navigation à gauche lorsque l'Atlas est déverrouillé.
|
||||
Story et **M**, configurable dans les contrôles, sont conservés.
|
||||
Parcours client Vulkan FR/EN GUI 2/3/4 et `check build` de l'annulation réussis.
|
||||
L'ancien pack d'essai beta.236 est retiré des artefacts actifs ; aucune nouvelle
|
||||
livraison n'est créée par cette annulation. La future livraison commune avec
|
||||
les aptitudes et Forgerie beta.238 devra utiliser le prochain compteur global.
|
||||
|
||||
## beta.235 — Essai réversible du menu Pause
|
||||
|
||||
[Disposition adaptative](docs/pause-columns-beta235.md) : avant Atlas, Aventure
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# Backlog Sanctuary
|
||||
|
||||
## PAUSE-236 — Atlas plein écran derrière Pause — essai annulé
|
||||
|
||||
Le créateur annule uniquement la carte derrière le menu. Le commit de
|
||||
disposition `5ea7950` est inversé ; affichage beta.235 restauré, Story et
|
||||
raccourci M (`94fefc0`) conservés. [Historique et annulation](pause-map-layer-beta236.md).
|
||||
L'ancien pack local est retiré des artefacts actifs. Cette annulation ne publie
|
||||
aucune nouvelle version et ne modifie pas la branche des aptitudes/Forgerie.
|
||||
|
||||
## PAUSE-235 — groupes côte à côte avant Atlas — essai livré localement
|
||||
|
||||
Branche `codex/pause-columns-beta235`, base beta.234. Avant Atlas : Aventure à
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
# PAUSE-236 — Atlas plein écran derrière le menu
|
||||
|
||||
## Statut : essai annulé le 6 octobre 2026
|
||||
|
||||
Le créateur demande d'annuler **uniquement la carte derrière Pause**.
|
||||
Le patch de disposition `5ea7950` est inversé, sans réécrire l'historique :
|
||||
carte centrale et colonne Communauté → Aventure → Game à gauche lorsque
|
||||
l'Atlas est déverrouillé, comme en beta.235. Story, la disposition sans Atlas
|
||||
et le raccourci M (`94fefc0`) restent présents. Le Nord retrouve sa position
|
||||
dans le panneau de carte. Aucun changement sur les autres branches.
|
||||
|
||||
Les vérifications et la livraison ci-dessous décrivent l'essai historique,
|
||||
avant annulation. Son pack est déplacé dans
|
||||
`build/withdrawn/Sanctuary-beta.236.mrpack` pour ne pas le proposer comme résultat
|
||||
actuel ; le staging packwiz de cet essai et son JAR d'origine sont également
|
||||
archivés dans `build/withdrawn/`. Le numéro beta.236 était également utilisé par la branche des aptitudes,
|
||||
qui a depuis atteint beta.238 avec Forgerie : cette branche d'essai ne constitue
|
||||
pas la livraison commune. Aucun nouvel artefact de distribution n'est livré
|
||||
par l'annulation ; la consolidation et son prochain compteur global restent
|
||||
un travail distinct.
|
||||
|
||||
Le parcours client Vulkan du retour réussit en 46 s : FR/EN GUI 2/3/4, géométrie
|
||||
beta.235 avec/sans Atlas, Story et ses 100 entrées, recherche, filtres, retours,
|
||||
focus et redimensionnement. M depuis le jeu et Pause, verrou de progression,
|
||||
réaffectation et désactivation passent également. Log :
|
||||
`build/pause-map-layer-cancel-client-vulkan.log`.
|
||||
Comparaison Git : les deux fichiers de disposition/carte et leurs assertions
|
||||
Pause/Solo sont identiques à beta.235 ; implémentation du raccourci et libellés
|
||||
FR/EN identiques au commit `94fefc0`.
|
||||
|
||||
`./gradlew check build -PsanctuaryFocusedTests=menus -PsanctuaryAtlasOnly=true`
|
||||
réussit en 2 min 34 s : quatre GameTests requis et contrôles purs du dépôt.
|
||||
Log : `build/pause-map-layer-cancel-check-build.log`. Aucun nouvel assemblage
|
||||
de distribution : il s'agit de l'annulation ciblée des sources de l'essai.
|
||||
|
||||
## Historique de l'essai
|
||||
|
||||
Branche d'essai `codex/pause-map-layer-beta236`, base beta.235, commit `00d175c`,
|
||||
Minecraft 26.3. Le rendu reste à apprécier par le créateur.
|
||||
|
||||
## Résultat
|
||||
|
||||
Gazette reste à gauche et Notice Board à droite, sur toute la hauteur du corps
|
||||
de Pause, avec ou sans Atlas. Au centre, Aventure (Discovery, Progression,
|
||||
Story) et Communauté (Habitant, Faction, Battle) sont côte à côte ; Partie /
|
||||
Game suit juste dessous. Reprendre la partie garde le pied de page natif.
|
||||
|
||||
Avec Atlas, la carte occupe littéralement tout l'écran sur le calque derrière
|
||||
les contrôles. Le terrain est légèrement assombri pour lire les libellés. Le
|
||||
Nord `N ↑` se trouve au centre horizontal, juste sous le bandeau du message
|
||||
serveur ; un espace réservé le sépare du menu. Les boutons et espacements
|
||||
s'adaptent aux petites hauteurs.
|
||||
|
||||
La carte est rendue avant les widgets de premier plan, puis reçoit les entrées
|
||||
après eux. Un clic dans une zone libre ouvre l'Atlas complet ; les boutons,
|
||||
les fils, l'en-tête et le pied de page gardent leur priorité. Les infobulles
|
||||
et les marqueurs de la carte ne capturent pas le survol derrière un contrôle.
|
||||
Les marqueurs suivis restent accessibles lorsqu'ils sont exposés. Tab après
|
||||
Quit atteint la carte ; Entrée ouvre l'Atlas, Échap ou Terminé revient à la
|
||||
même Pause. Redimensionner reconstruit le calque aux dimensions de l'écran.
|
||||
|
||||
Seul le terrain personnel déjà cartographié est affiché. Ce changement ne
|
||||
révèle ni ne génère de nouveaux chunks. Les contrats serveur, sauvegardes,
|
||||
progression, données communautaires et contenus Story restent identiques.
|
||||
Les libellés FR/EN existants sont réutilisés pour la disposition.
|
||||
|
||||
## Raccourci carte
|
||||
|
||||
La lettre **M** ouvre l'Atlas complet depuis le jeu et depuis Pause, une fois
|
||||
la carte déverrouillée dans Progression. Avant ce déblocage, elle affiche le
|
||||
message existant rappelant cette condition. Depuis le jeu, Échap et Terminé
|
||||
reviennent au jeu ; depuis Pause, ils reviennent à la même Pause.
|
||||
|
||||
Le raccourci figure dans les contrôles natifs, catégorie Sanctuary, sous
|
||||
« Ouvrir la carte » / « Open world map ». Il suit la lettre M de la disposition
|
||||
du clavier, y compris AZERTY, et préserve une affectation sauvegardée ou
|
||||
désactivée. Les écrans de saisie conservent leurs touches. Aucun nouveau
|
||||
protocole, fichier persistant ou déblocage serveur n'est ajouté.
|
||||
|
||||
## Réversibilité
|
||||
|
||||
Le code de l'essai et ses assertions sont isolés du raccourci M et du commit de
|
||||
livraison contenant les versions et la documentation : `git revert 5ea7950` annule le
|
||||
calque et sa disposition. Après ajout du raccourci (`94fefc0`), l'application
|
||||
inverse du patch a été vérifiée avec `git apply --reverse --3way --cached`
|
||||
dans un index temporaire : aucun conflit et raccourci M conservé, sans modifier
|
||||
les fichiers de travail. La branche
|
||||
`codex/pause-columns-beta235` conserve la variante précédente. Annuler le
|
||||
commit de disposition ramène à cette variante ; une livraison suivante prend
|
||||
le prochain numéro beta, sans diminuer le compteur.
|
||||
|
||||
## Vérifications
|
||||
|
||||
```sh
|
||||
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true -PsanctuaryStory234ClientTests=true -PsanctuaryClientGraphicsBackend=vulkan
|
||||
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true -PsanctuaryPause233ClientTests=true -PsanctuaryClientGraphicsBackend=vulkan
|
||||
./gradlew check build assemblePack -PsanctuaryFocusedTests=menus -PsanctuaryAtlasOnly=true
|
||||
```
|
||||
|
||||
Parcours Story et raccourci réussi en 42 s (`STORY234_PASS`) : Vulkan FR/EN GUI 2/3/4,
|
||||
fenêtre 1280 × 960, avec et sans Atlas, puis redimensionnement à 1344 × 1008.
|
||||
Nord centré sous le message serveur, terrain réellement reçu, calque aux
|
||||
dimensions de l'écran, boutons et titres des fils prioritaires pour les clics
|
||||
et le survol. Clic natif sur une zone libre et Entrée ouvrent l'Atlas ; Échap
|
||||
et Terminé reviennent à la même Pause. Le clic natif sur Story traverse bien
|
||||
le premier plan, ses 100 entrées, recherche et filtres restent disponibles.
|
||||
Saisie continue, focus, défilement, retours et progression serveur conservés.
|
||||
Événements clavier natifs M depuis le jeu et Pause avant/après déblocage,
|
||||
réaffectation à J, suppression de l'ancienne affectation, désactivation et
|
||||
restauration de la touche testées. La saisie de M dans Story garde le texte,
|
||||
le focus et son écran ; les intitulés du raccourci sont vérifiés en FR/EN.
|
||||
Log : `build/pause236-story-client-vulkan-final.log`.
|
||||
|
||||
21 captures copiées dans `build/pause236-story-screenshots/`. Captures inspectées :
|
||||
avec Atlas FR/2 et EN/4, sans Atlas FR/2. La fixture du monde plat neuf
|
||||
cartographie explicitement 25 chunks : la majorité du fond reste inconnue.
|
||||
Ce terrain limité ne représente pas une sauvegarde personnelle explorée.
|
||||
Aux GUI étroits, les longs libellés natifs et titres des fils gardent leur
|
||||
défilement ou découpage ; les actions Sanctuary restent lisibles en entier.
|
||||
Validation macOS/Vulkan uniquement, aucun essai OpenGL ou Windows revendiqué.
|
||||
|
||||
Le parcours Pause final réussit en 42 s (`PAUSE233_PASS`), avec les mêmes
|
||||
langues, GUI et états Atlas. Les fils restent de part et d'autre du menu ;
|
||||
publication, photo, retours des sélecteurs, brouillons et ancienne catégorie
|
||||
sont conservés. Inventaire réel et fichier communautaire restent inchangés
|
||||
pendant les lectures ; configuration temporaire restaurée à la fin.
|
||||
Log : `build/pause236-client-vulkan-final.log` ; 38 captures copiées dans
|
||||
`build/pause236-screenshots/`. Captures inspectées : Pause avec Atlas et posts
|
||||
FR/2 et EN/4. Vulkan confirmé : MoltenVK 1.4.2, Apple M1.
|
||||
|
||||
Le contrôle `check build assemblePack` réussit en 2 min 31 s : quatre GameTests
|
||||
requis et contrôles purs du dépôt, dont fichier communautaire, photos,
|
||||
demandes et recherche. Log : `build/pause236-check-build-pack-final.log`.
|
||||
La sélection menus/Atlas reste celle du banc existant ; le conflit du générateur
|
||||
sur le chemin natif par défaut, documenté en beta.232, reste hors de ce ticket.
|
||||
La compilation des sources finales du banc client passe également.
|
||||
|
||||
## Livraison locale
|
||||
|
||||
`mod_version`, `pack_version` et `packwiz/pack.toml` sont alignés sur beta.236.
|
||||
Les commits `5ea7950` (disposition) et `94fefc0` (raccourci) restent séparés
|
||||
des métadonnées de livraison.
|
||||
|
||||
Export historique [Sanctuary-beta.236.mrpack](../build/withdrawn/Sanctuary-beta.236.mrpack),
|
||||
12 779 209 octets : intégrité ZIP, Minecraft 26.3 et Fabric Loader 0.19.5,
|
||||
un seul JAR Sanctuary embarqué, identique au JAR construit, sans monde ni module
|
||||
de test. Les 3 303 fichiers d'assets, données et resourcepacks sont identiques
|
||||
à beta.235, sauf un nouveau libellé de raccourci dans chaque langue ; toutes
|
||||
les traductions existantes sont conservées. Story reste dans le JAR de production
|
||||
et les classes des bancs client en sont absentes.
|
||||
Reçu : `build/pause236-mrpack-receipt.json`.
|
||||
|
||||
- JAR : `74a8be9a078e9ecdc17b8cf332254cdb4a6dca4c37e4fb728d98632d2e8c3918`.
|
||||
- MRpack : `0fac46765a4430df8f90398471dedd2c2636d6b120482cc78466011fdd7574c2`.
|
||||
|
||||
Aucune publication distante, modification du canal packwiz, synchronisation
|
||||
Prism ou ouverture d'un monde personnel effectuée.
|
||||
+2
-2
@@ -9,8 +9,8 @@ loom_version=1.17.20
|
||||
fabric_api_version=0.160.5+26.3
|
||||
|
||||
# Release counter: beta.001, .002, .003, ... (see docs/versioning.md).
|
||||
mod_version=beta.235
|
||||
pack_version=beta.235
|
||||
mod_version=beta.236
|
||||
pack_version=beta.236
|
||||
resource_pack_version=beta.121
|
||||
maven_group=fr.koka.sanctuary
|
||||
jei_version=30.32.0-sanctuary.3
|
||||
|
||||
+35
@@ -10,6 +10,7 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.fabricmc.fabric.api.client.gametest.v1.FabricClientGameTest;
|
||||
import net.fabricmc.fabric.api.client.gametest.v1.context.ClientGameTestContext;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.client.KeyMapping;
|
||||
import net.minecraft.client.gui.components.*;
|
||||
import net.minecraft.client.gui.screens.*;
|
||||
import net.minecraft.client.gui.screens.worldselection.WorldCreationUiState;
|
||||
@@ -37,6 +38,7 @@ public final class Story234ClientChecks implements FabricClientGameTest {
|
||||
server.runOnServer(s->{var p=s.getPlayerList().getPlayers().getFirst();var r=ProgressRecord.INITIAL;if(unlocked)r=r.buy("atlas",r.cost("atlas",ProgressionService.session(s).config));p.setAttached(ProgressionService.RECORD,r.json());ProgressEffects.apply(p,r);ProgressionService.send(p,"");});
|
||||
c.waitFor(m->ProgressionClient.progress.atlas()==unlocked,200);
|
||||
String before=server.computeOnServer(s->s.getPlayerList().getPlayers().getFirst().getAttached(ProgressionService.RECORD));
|
||||
shortcut(c,unlocked);
|
||||
for(String language:List.of("fr_fr","en_us"))for(int scale:List.of(2,3,4)) {
|
||||
c.runOnClient(m->{m.getWindow().setWindowed(1280,960);m.options.guiScale().set(scale);m.resizeGui();m.getLanguageManager().setSelected(language);m.getLanguageManager().onResourceManagerReload(m.getResourceManager());m.gui.setScreen(new PauseScreen(true));});
|
||||
c.waitTicks(3);
|
||||
@@ -44,6 +46,10 @@ public final class Story234ClientChecks implements FabricClientGameTest {
|
||||
shot(c,"pause-"+unlocked+"-"+language+"-"+scale);
|
||||
c.runOnClient(m->{var pause=m.gui.screen();press(pause,"sanctuary.story.title");check(m.gui.screen() instanceof StoryScreen,"Story opens from Pause without Atlas gating");check(m.gui.screen().isPauseScreen(),"Story retains solo pause");check(m.gui.screen().getTitle().getString().equals("Story"),"Story has its own accessible screen title");check(edit(m.gui.screen()).getValue().isEmpty()&&cycle(m.gui.screen()).getValue().toString().equals("ALL"),"Empty search and All on opening");assertEntries(m.gui.screen(),100);layout(m.gui.screen());});
|
||||
shot(c,"story-"+language+"-"+scale);
|
||||
c.runOnClient(m->{var s=m.gui.screen();var search=edit(s);s.setFocused(search);
|
||||
s.keyPressed(new KeyEvent(mapKey().getDefaultKey().getValue(),InputConstants.KEYCODE_M,0));
|
||||
check(s.charTyped(new CharacterEvent('m'))&&m.gui.screen()==s&&search.getValue().equals("m")&&search.isFocused(),"Typing M in Story keeps its screen, text and focus");
|
||||
check(net.minecraft.network.chat.Component.translatable("sanctuary.atlas.key").getString().equals(language.equals("fr_fr")?"Ouvrir la carte":"Open world map"),"Map shortcut has a localized Controls label");search.setValue("");});
|
||||
c.runOnClient(m->{var s=m.gui.screen();var search=edit(s);s.setFocused(search);for(int codepoint:"100".codePoints().toArray()){check(s.charTyped(new CharacterEvent(codepoint)),"Native typing handled");check(s.getFocused()==search&&search.isFocused(),"List refresh retains search focus");}check(search.getValue().equals("100")&&search.getCursorPosition()==3,"Continuous typing retains cursor");assertEntries(s,1);check(entries(s).getFirst().getMessage().getString().equals(StoryScreen.label("unknown_entry",100).getString()),"Search selects story 100");search.setValue(" 100 ");assertEntries(s,1);cycle(s).onPress(enter());check(has(s,"sanctuary.story.no_discoveries")&&!has(s,"sanctuary.story.no_results")&&entries(s).isEmpty(),"Discovered has a distinct empty state");cycle(s).onPress(enter());check(cycle(s).getValue().toString().equals("UNKNOWN"),"Third filter is Unknown");assertEntries(s,1);search.setValue("absent-story");check(has(s,"sanctuary.story.no_results")&&!has(s,"sanctuary.story.no_discoveries"),"Search empty state is distinct");search.setValue(language.equals("fr_fr")?"INCONNUE":"UNKNOWN");assertEntries(s,100);var area=area(s);check(s.mouseScrolled(area.getX()+5,area.getY()+5,0,-5)&&area.scrollAmount()>0,"Native wheel scrolls Story");area.setScrollAmount(area.maxScrollAmount());check(entries(s).getLast().getBottom()<=area.getBottom(),"Story 100 can be reached at the end");area.setScrollAmount(100);});
|
||||
c.runOnClient(m->{m.getWindow().setWindowed(1344,1008);m.resizeGui();});c.waitTicks(3);
|
||||
c.runOnClient(m->{var s=m.gui.screen();check(edit(s).getValue().equals(language.equals("fr_fr")?"INCONNUE":"UNKNOWN")&&cycle(s).getValue().toString().equals("UNKNOWN"),"Resize retains query and filter");check(area(s).scrollAmount()==100,"Resize retains scroll position");layout(s);edit(s).setValue("100");check(area(s).scrollAmount()==0,"Search resets scroll");edit(s).setValue("");area(s).setScrollAmount(100);cycle(s).onPress(enter());check(cycle(s).getValue().toString().equals("ALL")&&area(s).scrollAmount()==0,"Filter resets scroll and cycles back to All");assertEntries(s,100);});
|
||||
@@ -62,6 +68,35 @@ public final class Story234ClientChecks implements FabricClientGameTest {
|
||||
}finally{intro.set(false);}
|
||||
}
|
||||
|
||||
private static KeyMapping mapKey(){return KeyMapping.get("sanctuary.atlas.key");}
|
||||
private static void shortcut(ClientGameTestContext c,boolean unlocked) {
|
||||
var saved=c.computeOnClient(m->InputConstants.getKey(mapKey().saveString()));
|
||||
int scan=c.computeOnClient(m->{var key=mapKey();check(key!=null,"Map is registered in native Controls");
|
||||
int nativeScan=org.lwjgl.sdl.SDLKeyboard.SDL_GetScancodeFromKey(InputConstants.KEYCODE_M,(java.nio.ShortBuffer)null);
|
||||
check(nativeScan>0&&key.getDefaultKey().getValue()==nativeScan,"Default follows the keyboard layout's M letter");
|
||||
key.setKey(key.getDefaultKey());KeyMapping.resetMapping();m.gui.setScreen(null);return nativeScan;});
|
||||
try {
|
||||
c.getInput().pressKey(scan);c.waitTicks(5);
|
||||
c.runOnClient(m->{check(unlocked?m.gui.screen() instanceof SanctuaryAtlasScreen:m.gui.screen()==null,"Game M respects Atlas unlock");});
|
||||
if(unlocked){c.getInput().pressKey(InputConstants.KEY_ESCAPE);c.waitTicks(3);c.runOnClient(m->check(m.gui.screen()==null,"Atlas opened from game returns to game"));}
|
||||
var pause=c.computeOnClient(m->{var screen=new PauseScreen(true);m.gui.setScreen(screen);return screen;});
|
||||
c.getInput().pressKey(scan);c.waitTicks(3);
|
||||
c.runOnClient(m->{check(unlocked?m.gui.screen() instanceof SanctuaryAtlasScreen:m.gui.screen()==pause,"Pause M respects Atlas unlock");
|
||||
if(unlocked){press(m.gui.screen(),"gui.done");check(m.gui.screen()==pause,"M from Pause keeps original parent");}m.gui.setScreen(null);});
|
||||
if(unlocked) {
|
||||
c.runOnClient(m->{mapKey().setKey(InputConstants.Type.KEYBOARD.getOrCreate(InputConstants.KEY_J));KeyMapping.resetMapping();});
|
||||
c.getInput().pressKey(scan);c.waitTicks(3);c.runOnClient(m->check(m.gui.screen()==null,"Old M binding stops opening the map"));
|
||||
c.getInput().pressKey(InputConstants.KEY_J);c.waitTicks(3);c.runOnClient(m->check(m.gui.screen() instanceof SanctuaryAtlasScreen,"Remapped J opens map from game"));
|
||||
c.getInput().pressKey(InputConstants.KEY_ESCAPE);c.waitTicks(3);
|
||||
c.runOnClient(m->m.gui.setScreen(pause));c.getInput().pressKey(scan);c.waitTicks(3);c.runOnClient(m->check(m.gui.screen()==pause,"Pause respects removed M binding"));
|
||||
c.getInput().pressKey(InputConstants.KEY_J);c.waitTicks(3);c.runOnClient(m->check(m.gui.screen() instanceof SanctuaryAtlasScreen,"Pause respects remapped J"));
|
||||
c.getInput().pressKey(InputConstants.KEY_ESCAPE);c.waitTicks(3);c.runOnClient(m->{check(m.gui.screen()==pause,"Remapped shortcut retains Pause parent");mapKey().setKey(InputConstants.UNKNOWN);KeyMapping.resetMapping();});
|
||||
c.getInput().pressKey(scan);c.getInput().pressKey(InputConstants.KEY_J);c.waitTicks(3);c.runOnClient(m->check(m.gui.screen()==pause,"Unbound disables map shortcut"));
|
||||
}
|
||||
System.out.println("ATLAS236_SHORTCUT_PASS: native layout-aware M, game/Pause returns, unlock="+unlocked+", configurable key and Unbound, binding restored");
|
||||
}finally{c.getInput().releaseKey(scan);c.getInput().releaseKey(InputConstants.KEY_J);c.runOnClient(m->{m.gui.setScreen(null);mapKey().setKey(saved);KeyMapping.resetMapping();});}
|
||||
}
|
||||
|
||||
private static List<Button> entries(Screen s){return widgets(s).filter(Button.class::isInstance).map(Button.class::cast).filter(b->key(b).equals("sanctuary.story.unknown_entry")).toList();}
|
||||
private static String key(AbstractWidget w){return w.getMessage().getContents() instanceof TranslatableContents t?t.getKey():"";}
|
||||
private static CycleButton<?> cycle(Screen s){return widgets(s).filter(CycleButton.class::isInstance).map(CycleButton.class::cast).findFirst().orElseThrow();}
|
||||
|
||||
@@ -1,11 +1,20 @@
|
||||
package fr.koka.sanctuary.client;
|
||||
|
||||
import com.mojang.blaze3d.platform.InputConstants;
|
||||
import fr.koka.sanctuary.atlas.AtlasPayloads;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper;
|
||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
||||
import net.minecraft.client.KeyMapping;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.client.input.KeyEvent;
|
||||
|
||||
/** No cross-server atlas cache: responses belong only to the currently open screen/token. */
|
||||
public final class AtlasClient {
|
||||
private static int sequence;
|
||||
private static KeyMapping mapKey;
|
||||
private AtlasClient() { }
|
||||
public static void register() {
|
||||
ClientPlayNetworking.registerGlobalReceiver(fr.koka.sanctuary.atlas.AtlasMarkerPayload.TYPE,(p,c) -> c.client().execute(() -> {
|
||||
@@ -19,6 +28,49 @@ public final class AtlasClient {
|
||||
else if (c.client().gui.screen() instanceof PauseAtlasAccess pause && pause.sanctuary$pauseMap()!=null) pause.sanctuary$pauseMap().accept(p);
|
||||
}));
|
||||
}
|
||||
public static void registerShortcut(KeyMapping.Category category) {
|
||||
var shortcut=new MapKey(category);
|
||||
mapKey=KeyMappingHelper.registerKeyMapping(shortcut);
|
||||
ClientLifecycleEvents.CLIENT_STARTED.register(client->shortcut.resolveLayout());
|
||||
ClientTickEvents.END_CLIENT_TICK.register(client->{
|
||||
while(mapKey.consumeClick())if(client.gui.screen()==null)openFromShortcut(null);
|
||||
});
|
||||
}
|
||||
public static boolean openFromKey(Screen parent,KeyEvent event) {
|
||||
return mapKey!=null && mapKey.matches(event) && openFromShortcut(parent);
|
||||
}
|
||||
private static boolean openFromShortcut(Screen parent) {
|
||||
var client=Minecraft.getInstance();
|
||||
if(client.player==null || client.level==null || !client.player.isAlive() || !ProgressionClient.active())return false;
|
||||
if(!ProgressionClient.progress.atlas())client.player.sendOverlayMessage(SanctuaryAtlasScreen.label("locked"));
|
||||
else ProgressionClient.open(parent,"history");
|
||||
return true;
|
||||
}
|
||||
private static final class MapKey extends KeyMapping {
|
||||
private InputConstants.Key layoutDefault;
|
||||
private final boolean savedBinding;
|
||||
MapKey(Category category) {
|
||||
super("sanctuary.atlas.key",InputConstants.Type.KEYBOARD,InputConstants.KEY_M,category);
|
||||
layoutDefault=super.getDefaultKey();
|
||||
// An explicit saved binding, including Unbound, takes precedence over the layout default.
|
||||
var options=net.fabricmc.loader.api.FabricLoader.getInstance().getGameDir().resolve("options.txt");
|
||||
boolean saved=false;
|
||||
if(java.nio.file.Files.exists(options))try(var lines=java.nio.file.Files.lines(options)) {
|
||||
saved=lines.anyMatch(line->line.startsWith("key_"+getName()+":"));
|
||||
}catch(java.io.IOException error){saved=true;}
|
||||
savedBinding=saved;
|
||||
}
|
||||
void resolveLayout() {
|
||||
// Resolve the letter M after native startup: KEY_M is only its QWERTY position.
|
||||
boolean useDefault=!savedBinding && isDefault();
|
||||
int scan=org.lwjgl.sdl.SDLKeyboard.SDL_GetScancodeFromKey(InputConstants.KEYCODE_M,(java.nio.ShortBuffer)null);
|
||||
if(scan>0)layoutDefault=InputConstants.Type.KEYBOARD.getOrCreate(scan);
|
||||
if(useDefault)setKey(layoutDefault);
|
||||
KeyMapping.resetMapping();
|
||||
}
|
||||
@Override public InputConstants.Key getDefaultKey(){return layoutDefault;}
|
||||
@Override public boolean isDefault(){return key.equals(layoutDefault);}
|
||||
}
|
||||
public static int nextToken() {sequence=sequence==Integer.MAX_VALUE ? 1 : sequence+1;return sequence;}
|
||||
public static void send(AtlasPayloads.Request request) {
|
||||
if (ClientPlayNetworking.canSend(AtlasPayloads.Request.TYPE)) ClientPlayNetworking.send(request);
|
||||
|
||||
@@ -53,6 +53,7 @@ public final class SanctuaryKnowledgeClient implements ClientModInitializer {
|
||||
GraveInventoryScreen.register();
|
||||
TutorialClient.register();
|
||||
var category=KeyMapping.Category.register(SanctuaryMod.id("sanctuary"));
|
||||
AtlasClient.registerShortcut(category);
|
||||
DynamicLightClient.register(category);
|
||||
ZoomClient.register(category);
|
||||
LyingClient.register(category);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package fr.koka.sanctuary.mixin.client;
|
||||
|
||||
import fr.koka.sanctuary.client.ProgressionClient;
|
||||
import fr.koka.sanctuary.client.AtlasClient;
|
||||
import fr.koka.sanctuary.client.PauseAtlasAccess;
|
||||
import fr.koka.sanctuary.client.PauseAtlasWidget;
|
||||
import net.minecraft.client.gui.components.Button;
|
||||
@@ -8,6 +9,7 @@ import fr.koka.sanctuary.client.CommunityPausePanels;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.client.gui.screens.PauseScreen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.client.input.KeyEvent;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
@@ -30,6 +32,10 @@ public abstract class CommunityPauseMixin extends Screen implements PauseAtlasAc
|
||||
}
|
||||
@Inject(method="tick",at=@At("TAIL"))
|
||||
private void sanctuary$communityTick(CallbackInfo callback) { if(sanctuary$community!=null)sanctuary$community.tick(); }
|
||||
@Override public boolean keyPressed(KeyEvent event) {
|
||||
if(sanctuary$community!=null && AtlasClient.openFromKey(this,event))return true;
|
||||
return super.keyPressed(event);
|
||||
}
|
||||
@Override public PauseAtlasWidget sanctuary$pauseMap() {return sanctuary$community==null?null:sanctuary$community.map();}
|
||||
@Inject(method="removed",at=@At("HEAD"))
|
||||
private void sanctuary$communityRemoved(CallbackInfo callback) {if(sanctuary$community!=null)sanctuary$community.close();}
|
||||
|
||||
@@ -2452,6 +2452,7 @@
|
||||
"sanctuary.community.actions_for": "Actions · %s",
|
||||
"sanctuary.community.reply_hint": "Write a reply…",
|
||||
"sanctuary.pause.map": "World map",
|
||||
"sanctuary.atlas.key": "Open world map",
|
||||
"sanctuary.pause.map_hint": "Open the map and explore",
|
||||
"sanctuary.community.more": "Load more",
|
||||
"sanctuary.community.browse": "All publications",
|
||||
|
||||
@@ -2452,6 +2452,7 @@
|
||||
"sanctuary.community.actions_for": "Actions · %s",
|
||||
"sanctuary.community.reply_hint": "Écrire une réponse…",
|
||||
"sanctuary.pause.map": "Carte du monde",
|
||||
"sanctuary.atlas.key": "Ouvrir la carte",
|
||||
"sanctuary.pause.map_hint": "Ouvrir la carte et explorer",
|
||||
"sanctuary.community.more": "Charger la suite",
|
||||
"sanctuary.community.browse": "Toutes les publications",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
name = "Sanctuary"
|
||||
author = "KOKA99CAB"
|
||||
version = "beta.235"
|
||||
version = "beta.236"
|
||||
pack-format = "packwiz:1.1.0"
|
||||
|
||||
[index]
|
||||
|
||||
Reference in New Issue
Block a user