Vores community imponerer altid med smarte, kreative og sjove konstruktioner – og denne her tager måske prisen (blokken?). For nylig har vi talt om, hvordan Stream Deck dukker op flere steder end nogensinde før: med Stream Deck-moduler og Virtual Stream Deck på din computer. Men nu? Nu er det i Minecraft.
For omkring en måned siden offentliggjorde en Elgato-communityspecialist en Minecraft-version af et Stream Deck med 15 taster på Elgatos Twitter. Besat af en ivrig konkurrenceånd begyndte jeg at finde ud af, hvordan jeg kunne omdanne dette koncept til en faktisk funktionel realitet. Selvom det, jeg har lavet, langt fra er perfekt, og har en tendens til at gå i stykker, hvis man kigger forkert på det, er jeg mere end tilfreds med resultatet!
Denne build er drevet af et Virtual Stream Deck med seks taster, der er skjult på min anden skærm, med et meget hacket Node.js-script, der håndterer de svære dele af at trykke på SD-knapperne baseret på, hvad der er aktiveret i spillet, samt konvertere VSD-displayet til noget, der kan vises i Minecraft.
I Minecraft er redstone-mekanismen utrolig enkel. Bag skærmen bruger hver knap et par kalibrerede sculk-sensorer (lydsensorer i spillet) til at overvåge inputbegivenheder, som i dette tilfælde enten er snebolde, der lander på knappen (signalstyrke 2), eller lyden af en vindladning, der eksploderer (signalstyrke 15). Hvert par fører til en enkelt kommandoblok, der, når den udløses, indsætter mellem 1 og 8 mellemrum i spillet. Knapperne til at gå frem og tilbage i siderne har også en lille ekstra kredsløb, der styrer indikatorlamperne, men ellers fungerer de på samme måde.
Det meste af magien foregår i det brugerdefinerede Node.js-script, jeg har skrevet til dette projekt. Når programmet starter, får jeg nogle specielle oplysninger, der giver mig mulighed for at vælge enten et Virtual Stream Deck (VSD)-vindue eller Minecraft-spilvinduet og derefter også få koordinaterne for VSD-vinduet. Når al opsætningen er færdig, kører der to sløjfer sideløbende: input og display.
Den første halvdel af programmet er den nemmeste at forstå. Når Minecraft kører, gemmer det en logfil med de vigtigste ting, der sker, i en tekstfil med det passende navn latest.log. Det er vigtigt at bemærke, at denne logfil også indeholder alle beskeder, der modtages i chatten, hvilket betyder, at vi med lidt smart kode kun kan se de logposter, der indeholder vores beskeder, der kun består af mellemrum. Når en sådan besked ankommer, tæller vi antallet af mellemrum og bruger det til at bestemme, hvilken knap der skal trykkes på. Jeg har ordnet knapperne fra top til bund, fra venstre mod højre (der er også to ekstra knapper til at gå tilbage/fremad i siden). Når vi har valgt knappen, bruger jeg et specialiseret desktop-automatiseringsbibliotek til meget hurtigt at flytte musen ud af Minecraft-vinduet, klikke på den tilsvarende knap på Virtual Stream Deck, der styrer det hele, og returnere den til Minecrafts kontrol (du skal trykke på F3+P for at få dette til at fungere; ellers vil spillet gå i pause, når det mister fokus). Hvis du ikke bevæger musen, når disse bevægelser finder sted, er det ret problemfrit! Hvis du er, har det en tendens til at gå i stykker på en forfærdelig måde lol
Det fungerer fint til at trykke på knapper, men det virkelig fantastiske ved Stream Deck er, at du har en programmerbar skærm under hver tast. Hvordan viser man det i Minecraft? Den løsning, jeg valgte, er måske ikke den mest elegante, men den virker, og det er det vigtigste for mig! Fire gange i sekundet tager scriptet et screenshot af VSD-vinduet. Forudsat at knapperne har en bestemt størrelse (standardstørrelsen på 52x52 px fungerer ganske godt), beskærer det screenshot til kun knapstørrelsen og ændrer derefter størrelsen til 8x8 px. Når det er gjort, gennemgår det hver pixel i det beskårne billede og kører dem gennem en smart kode for at finde ud af, hvilken blok der matcher farven bedst. (Mange tak til kult0922 på GitHub, der har lavet en hjemmeside, der konverterer billeder til Minecraft-pixelkunst og offentliggjort kildekoden til det! Uden den kode ville dette projekt sandsynligvis have taget meget længere tid at finde ud af). Sørg bare for at gentage det for de andre fem knapper.
Det er et godt skridt at få en liste over de blokke, du har brug for, men det er stadig et problem at få dem ind i spillet. Hvis du har mulighed for at køre chat-kommandoer, kan du bruge kommandoen /setblock flere gange for at opdatere hver pixel én ad gangen, men det er meget langsomt og ineffektivt. Et bedre værktøj at bruge ville være Structure Block, et værktøj i det originale spil, der blandt andet giver dig mulighed for at placere foruddefinerede "skemaer" af strukturer i spilverdenen. Jeg fandt ud af, hvordan jeg kunne få mit script til at oprette skemaer på den måde, Minecraft forventede, og når de er gemt i skema-mappen, kan jeg udstede en chat-kommando, der fortæller Structure Block i spillet at se på det korrekte skema for den aktuelle tilstand på skærmen (hver enkelt ramme skal have et unikt filnavn, hvilket komplicerer tingene lidt). Når det er gjort, skal du bare have et lille redstone-kredsløb, der gentagne gange indsætter den aktive skitse i verden, og så har du en fungerende skærm!
Når alt kommer til alt, har du et stort set brugbart Stream Deck, men i Minecraft! Selvom mit script primært er designet til kun at køre på min maskine, ser jeg ingen grund til, at det ikke kan forbedres, så det måske kan køre på multiplayer-servere! Den oprindelige prototype af dette projekt kørte faktisk på en instans af Stream Deck Mobile, der kørte i Windows Subsystem for Android, hvilket teknisk set betyder, at du kunne køre alt på en helt separat enhed eller i en virtuel maskine. Om det er en god idé, er selvfølgelig en helt anden spørgsmål... men lad ikke bekymringer som "praktisk anvendelighed" afholde dig fra at lege :)
Sjovt faktum: Stream Deck-logoet øverst er lavet ved hjælp af 24 kort. Logoets struktur er placeret i End void, men det er så stort, at det strækker sig næsten fra den ene ende af void til den anden.
Se mere af TheAppleFreaks arbejde:
PRODUKT REGISTRERING