• Een Minecraft server voor thuis

    Minecraft is al jaren een populaire game bij jong en oud. Eén van de redenen daarvoor is dat het volledig aan te passen is; iets wat ook de Doom en Unreal engines geen windeieren heeft gelegd. Het is vrij eenvoudig om zelf een Minecraft-server te draaien en je eigen aanpassingen toe te voegen. Omdat ik wel houd van een beetje aanklooien met dit soort dingen, heb ik dat dus ook gedaan.

    Lokale netwerkserver

    Op het hoogste niveau zijn er twee edities van Minecraft; Java Edition en Bedrock Edition. Java Edition was de originele Minecraft en draait op alle platformen waar Java beschikbaar is (Windows, Mac, Linux). Dit artikel gaat over Bedrock Edition, de versie die je op Windows, Android, iOS en zo’n beetje alle consoles kunt spelen, maar dus niet op je Mac en ook niet in Linux.

    Voor Java Edition is er officiële server software van Mojang, maar voor Bedrock Edition is deze er (nog) niet. Er is alleen een alpha-versie die sinds 2018 niet meer is bijgewerkt. Waarschijnlijk wil Mojang voorkomen dat mensen hun eigen servers gaan draaien en dan niet meer betalen voor Minecraft Realms, hun private game hosting service.

    Daardoor zijn er echter wel verschillende server software projecten, de meeste zijn Open Source. Het landschap is een beetje onoverzichtelijk door alle forks en specialisaties, maar uiteindelijk heb ik voor mijn eigen server heb ik voor Cloudburst Nukkit gekozen, omdat deze op Java is gebaseerd en een plugin-systeem heeft waarmee je de functionaliteit dus kan uitbreiden zonder in de server zelf veranderingen te hoeven aanbrengen.

    Nukkit setup

    Om te beginnen, volg eerst de intallatie-instructies van Cloudburst Nukkit. Nu heb je een lege server, waarop je kan inloggen en doen wat je wil. Enige probleem is… er zijn geen dieren en monsters. Dus installeer ook meteen de MobPlugin.

    Nu lijkt het al heel veel op het “echte” Minecraft. Sommige blokken zijn niet beschikbaar, dieren gedragen zich niet helemaal zoals op een officiële server en circuits op basis van Redstone werken niet. Desalniettemin heb je een leuke omgeving om te minen, farmen en ontdekken.

    Aanpassingen maken: lievere Creeper explosies

    De jongens waren erg ongelukkig dat hun huis steeds weer kapot werd gemaakt door ontploffende Creepers. Dus ging ik op zoek naar een oplossing.

    Ik speurde wat rond in de MobPlugin code en vond de explode() method in de Creeper class:

    @Override
    public void explode() {
        if (this.closed) return;
    
        EntityExplosionPrimeEvent ev = new EntityExplosionPrimeEvent(this, this.isPowered() ? 6 : 3);
        this.server.getPluginManager().callEvent(ev);
    
        if (!ev.isCancelled()) {
            Explosion explosion = new Explosion(this, (float) ev.getForce(), this);
    
            if (ev.isBlockBreaking() && this.level.getGameRules().getBoolean(GameRule.MOB_GRIEFING)) {
                explosion.explodeA();
            }
    
            explosion.explodeB();
            this.level.addParticle(new HugeExplodeSeedParticle(this));
        }
    
        this.close();
    }
    

    Vóórdat een explosie echt wordt getriggerd, wordt er een EntityExplosionPrimeEvent event gestuurd naar alle plugins. Daarna wordt gekeken of het event gecanceld is, dus dat is het haakje waar we onze plugin aan gaan ophangen. Als we luisteren naar EntityExplosionPrimeEvent, en vervolgens het event cancelen, dan ontplot de Creeper niet meer.

    @EventHandler(ignoreCancelled = true)
    public void EntityExplosionPrimeEvent(EntityExplosionPrimeEvent ev) {
        if (ev.getEntity() instanceof Creeper) {
            ev.setCancelled();
        }
    }
    

    Dat is wel een beetje saai, want nu verdwijnt de Creeper gewoon “poef” in het niets! Laten we in plaats van de explosie wat hartjes verspreiden:

    @EventHandler(ignoreCancelled = true)
    public void EntityExplosionPrimeEvent(EntityExplosionPrimeEvent ev) {
        if (ev.getEntity() instanceof Creeper) {
            ev.setCancelled();
            Entity entity = ev.getEntity();
            Level level = entity.level;
            for (int i = 0; i < 10; i++) {
                level.addParticle(new HeartParticle(entity.add(Utils.rand(-1.0, 1.0), (entity.getHeight() * 0.75F) + Utils.rand(-1.0, 1.0), Utils.rand(-1.0, 1.0))));
            }
        }
    }
    

    Zo, dat is beter:

    Code

    De complete code voor de plugin vind je op GitHub.

    Nieuwe serie?

    Zou dit een nieuwe serie blogposts kunnen worden? Wie weet, ik wilde eigenlijk al wat gaan schrijven toen ik begon met de setup, dus er is wel wat materiaal.

    Lees verder
  • Stop motion met LEGO

    Jaren geleden of beter gezegd, in de vorige eeuw, speelde ik veel met LEGO. Ik maakte hele verhalen van straten met huizen en mensen en autootjes. We hadden thuis ook een Super 8 camera, die ook beeldje voor beeldje kon belichten. Het zijn de ingrediënten voor een fantastische stop-motion blockbuster.

    Helaas waren de Super 8 films niet goedkoop en het ontwikkelen werd begin jaren 90 ook al lastiger. Die filmcarrière is dus aan mij voorbij gegaan.

    Zo fijn dat de huidige generatie zich daar geen zorgen meer over hoeft te maken en gewoon lekker kan creëren met alle digitale hulpmiddelen in één enkel apparaat. Ontzettend leuk!

    De Spokende School

    Jasper heeft deze film helemaal zelf gemaakt:

    Het Spooklab

    En ik heb Noud wat geholpen met deze:

    Lees verder
  • Thuis inloggen

    Ik heb thuis een NAS van Synology, die deels bereikbaar is vanaf het internet. Soms wil ik een van de apparaten op mijn thuisnetwerk bereiken die dat niet zijn. Ze kunnen zelf wel verbinding maken met het internet, maar andersom is niet direct mogelijk.

    Een van de oplossingen die je vooral in zakelijke netwerken ziet is de VPN. Je logt in op de VPN server van je bedrijf en vervolgens kun je gebruikmaken van alle diensten alsof je direct op kantoor met het interne netwerk bent verbonden.

    Voor de thuisgebruiker is dat niet altijd een optie. Niet alle (routers van) providers laten de benodigde protocollen zomaar door en de configuratie is ook redelijk complex.

    Gelukkig is er een “eenvoudige” ad-hoc methode die voor nu-en-dan-gebruik meer dan volstaat. Door gebruik te maken van een van de features van OpenSSH, wat je wellicht al gebruikt om in te loggen op je NAS of je router.

    Het is mogelijk om een SSH-verbinding te openen en over die verbinding een TCP-verbinding te tunnelen. Je geeft een poortnummer op voor je lokale machine en het poortnummer waarmee je wil verbinden. Vervolgens maak je verbinding op de lokale poort, waardoor al het verkeer door de tunnel gaat en er aan de andere kant weer uit komt.

    Dit is allemaal een beetje abstract, dus laten we het concreter maken.

    Zoals gezegd heb ik een NAS van Synology, die bereikbaar is via luijten.mysyno.info. De enige bereikbare poort is 22 voor SSH; hiervoor heb ik in mijn router een port-forward ingesteld.

    Verbinden met een HTTP server op je NAS

    Op mijn NAS staat ook een installatie van OpenHAB - een home automation systeem. Dit heeft een HTTP user interface op poort 8080 (dus localhost:8080 vanaf de NAS gezien). Deze poort is vanaf het internet (gelukkig!) niet bereikbaar.

    Stel ik ben op kantoor, dan kan ik die OpenHAB dus niet bereiken en dus ook niet het licht uitzetten als ik dat vergeten was. Omdat ik echter wel kan verbinden met SSH, zet ik een lokale tunnel (-L) op van een vrije poort op mijn machine, zoals 8000 naar localhost:8080 op het andere eindpunt (bezien vanaf dat eindpunt!).

    ssh -L 8000:localhost:8080 islandsvinur@luijten.mysyno.info
    

    Nu open ik mijn browser naar http://localhost:8000/ en krijg ik de interface van OpenHAB thuis te zien! Niemand anders dan mijn machine kan die verbinding maken en zodra ik het commando afsluit is de tunnel ook verdwenen en werkt bovenstaande link meteen niet meer. Dit is dus een veel veiligere manier om een dienst beschikbaar te maken dan om de poort permanent en voor iedereen te forwarden in je router.

    Het scherm van een computer in je netwerk overnemen

    In het vorige voorbeeld staat OpenHAB op dezelfde machine als de SSH server, namelijk de NAS. Het is echter ook mogelijk om te verbinden met andere machines in het netwerk, bijvoorbeeld met VNC, Screen Sharing of Remote Desktop naar je andere computer.

    Ik heb een laptop genaamd Skaftafell en een desktop genaamd Þingvellir. Die namen zijn in te stellen in de “Sharing” Preferences of “Delen” Voorkeuren van macOS, zie hieronder. Een soortgelijk scherm is er ook in Windows.

    Onder de computernaam zie je ook de “hostname” van de computer in het netwerk. Die gaan we zometeen nodig hebben.

    In dit scherm kan je ook de Schermdeling inschakelen, zodat je verbinding kan maken met Apple’s Remote Desktop of met een algemene VNC tool.

    Ik start weer een tunnel, dit keer op de lokale poort 5900 naar skaftafell.local:5900. Waarom 5900? Dat is de poort waarop VNC normaalgesproken luistert.

    ssh -L 5900:skaftafell.local:5900 islandsvinur@luijten.mysyno.info
    

    Nu kan ik verbinden met <vnc://localhost> en voila, de verbinding met Skaftafell wordt opgebouwd. Vervang het doel van de tunnel:

    ssh -L 5900:thingvellir.local:5900 islandsvinur@luijten.mysyno.info
    

    En nu gaat <vnc://localhost> opeens naar Þingvellir.

    Conclusie

    Voor nu en dan inloggen op je thuisnetwerk is een VPN server overkill en kan je gebruikmaken van de tools die je al op je apparaten hebt staan, of die vrij beschikbaar zijn.

    Deze post is vooral bedoeld als een aantekening voor mezelf, en een samenvatting van een antwoord op Unix & Linux Stack Exchange.

    Lees verder
  • 24 december: Kertasníkir

    Kertasníkir

    De dertiende was Kaarsenbietser,
    - het was koud,
    als hij niet de laatste was
    op kerstavond.

    Hij achtervolgde de kleintjes
    lachend zo blij en fijntjes,
    terwijl ze door de tuin
    dartelden met hun kaarsjes.

    In de kerstnacht zelf,
    - zo zegt een wijs man, -
    hielden de jongens zich in
    en staarden ze naar de lichtjes.

    Daarna, een voor een, vertrokken ze weer,
    dwars door vrieskou en sneeuw.
    Met Driekoningen1 ging
    de laatste van het stel.

    Al lang geleden heeft de sneeuw
    hun voetafdrukken laten vervagen.
    Maar uit de herinneringen
    ontstaan beelden en liederen.

    Fijne kerstdagen en zorg ervoor dat je nieuwe kleren krijgt vóór het eind van Kerstavond, want anders komt Jólakötturinn de Kerstkat je opeten!

    1. Driekoningen heet Þrettándin - “de Dertiende” - in het IJslands. 

    Lees verder
  • 22 december: Gáttaþefur

    Gáttaþefur

    De elfde was Deursnuffelaar
    - nooit was hij verkouden,
    ook al had hij zo’n gevoelige
    en lachwekkend grote neus.

    Hij ving al van verre
    de geur op van bladbrood,
    en licht als rook,
    rende hij erheen.

    Lees verder
  • 21 december: Gluggagægir

    Gluggagægir

    De tiende was Glazengluurder,
    een grijze gluiperd,
    die naar de ramen sloop
    en naar binnen loert.

    Als er binnen iets was
    wat hem beviel,
    kwam hij meestal later
    terug om het te halen.

    Lees verder
  • 20 december: Bjúgnakrækir

    Bjúgnakrækir

    De negende was Worstensnaaier,
    een sluw en snel.
    Hij klom op de spanten
    en begon z’n plundering.

    Op een dwarsbalk in de keuken,
    in roet en rook
    at hij de hangende worsten,
    alsof er niets aan de hand is.

    Lees verder
  • 19 december: Skyrjarmur

    Skyrjarmur

    Skyrschrokker, de achtste,
    was een enge bul.
    Hij beukte op het skyr-vat,
    totdat het deksel erop brak.

    Toen boog hij zich erover
    en begon te schrokken,
    totdat kreunend en zuchtend
    alles schoon op was.

    Lees verder
  • 18 december: Hurðaskellir

    Hurðaskellir

    De zevende was Deurenknaller.
    Zo was behoorlijk duidelijk,
    dat wanneer in de schemering
    de mensen een dutje wilden doen,

    hij er niet bijzonder
    overstuur van was,
    hoe hard de deur kraakte
    in de scharnieren.

    Lees verder