Compare commits

...
Author SHA1 Message Date
koka 79952c3f65 Revert fullscreen Pause map layer while keeping Story and M shortcut
Build Sanctuary / build (push) Canceled after 0s
Reverts the layout experiment from 5ea7950 at the creator request. Restore beta.235 map presentation, retain 94fefc0, and withdraw the old trial pack without creating a new release.
2026-10-06 23:44:56 +02:00
koka 0f918899fb Deliver beta.236 with fullscreen Pause map and configurable Atlas shortcut 2026-10-06 22:26:18 +02:00
koka 94fefc0442 Add configurable M shortcut for Atlas from game and Pause 2026-10-06 22:22:30 +02:00
koka 5ea7950f23 Render Atlas behind centered Pause controls with a centered North indicator 2026-10-06 22:12:26 +02:00
11 changed files with 275 additions and 3 deletions
+11
View File
@@ -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
+8
View File
@@ -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 à
+157
View File
@@ -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
View File
@@ -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
@@ -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
View File
@@ -1,6 +1,6 @@
name = "Sanctuary"
author = "KOKA99CAB"
version = "beta.235"
version = "beta.236"
pack-format = "packwiz:1.1.0"
[index]