Plugin

TrainCarts-plugin

 

MineartMania on kuollut, eläköön MinecartMania! Tuon pluginin käyttö muuttui suureksi osaksi Mojangin kakan koodin takia mahdottomaksi, ja otimme käyttöön loppusyksystä 2012 TrainCarts-pluginin, joka on oikeastaan kaikilta osin paljon paremmin tehty ja paljon monipuolisempi.

 

2.1.2013 [Etsija] – All hail TrainCarts!

TrainCarts on valtavan monipuolinen plugin ja sisältää huikean määrän mahdollisuuksia. Sillä voi rakentaa vaikka pitkiä, usean vaunun junia, jotka saa jopa säädettyä kulkemaan ”itsekseen” tietyin väliajoin radoilla, kuten oikeat junat. Käytämme sitä kuitenkin edelleen samalla tavoin kuin ennenkin pääverkostossamme. Suunnitelmissa on rakentaa erityiset kehäradat, joilla metro kiertäisi oikean metron tavoin, koko ajan tunnelissa ja LUJAA vauhtia. Näillä kehäradoilla olisi oikeat metroasemat, joiden välillä kulkevat usean vaunun mittaiset junat säännöllisin (muutaman minuutin) väliajoin. Kehäradat olisi tarkoitettu nopeaan maailman laidalta toiselle matkustamiseen.

TrainCartsiin saa pultattua myös toisen pluginin, jolla asemille pystyy tekemään infokyltit, joissa lasketaan aikaa alaspäin seuraavan junan saapumiseen. How cool is that?

Etsijalla oli melkoisen hikiset paikat loppuvuodesta 2012, kun pluginin tekijä suuttui Bukkitille eräästä kieltämättä yliampuvasta koodimuutoksesta, joka tuottaa paljon lisätyötä kaikille pluginien tekijöille, ja päätti lopettaa itse oman plugininsa ylläpidon. Onneksi plugin on niin erinomainen ja tärkeä monelle, että sille löytyivät uudet tekijät melko nopeasti.

Plugin oli myöskin muutamalta osiltaan pahasti rikki pitkän aikaa, mutta nyt se on fiksattu, ja esim. reitinhaku toimii loistavasti, eikä plugin havaintojeni mukaan aiheuta edes ylimääräistä lagia serverille.

Olen melko innostunut kehärata-ajatuksesta. Entäs te, hyvät pelaajat? Saisinko serverillä suunnittelu- ja rakennusapua tälle massiiviselle projektille?

 

21.2.2012 [Etsija] – MinecartMania vs. Minecraft 1.2

Minecraftin 1.2 päivityksen myötä Bukkitin koodia tullaan yksinkertaistamaan roimasti, ja sieltä karsitaan paljon vanhaa käyttämätöntä ja bugittavaa sälää pois jne. Tämä on toivottavasti hyvä asia ja johtaa lopun viimeksi serverin tehokkaampaan toimintaan ja parempaan vakauteen – mutta ylläpidolle tämä valitettavasti tarkoittaa sitä, että osa käyttämistämme plugineista tulisi menemään 1.2 päivityksen myötä rikki, joten päänsärkyä kaikille on luvassa.

Valitettavasti tämä muutos tarkoittaa erityisesti sitä, että fiksaamani MinecartMania-plugin ei tule enää toimimaan 1.2:ssa, ennen kuin minä (tai joku muu) muuttaa sen event-systeemin uuteen (isohko remontti, jota en ehkä osaa itse edes tehdä, eikä minulla ole siihen aikaa).

MinecartManiaa tehdään ”virallisemminkin”, mutta kaikkia tekemiäni muutoksia ei tuohon ”viralliseen” puuhun ole tehty. Olen tehnyt pluginin tekijälle pull requestit tänä aamuna, mutta saa nähdä, ottaako hän niitä mukaan omiin buildeihinsä.

Niinpä luultavasti 1.2-päivitys tulee viivästymään epämääräisen ajan. Mikäli viivästys meinaa kasvaa liian suureksi, sitten ”rikomme” väliaikaisesti metrotoiminnallisuuden, siirrymme 1.2:een ja toivomme, että metro-plugin joskus taas tulee kuntoon, tavalla tai toisella.

 

1.2.2012 [Etsija] – Bugeista ja debuggauksesta

Pahoittelen jo etukäteen kirjoituksen osittain tönkköä kieliasua ja runsasta lainasanojen määrää!

Lähes kaikki tietokoneiden kanssa tekemisissä olevat ovat ainakin joskus kuulleet sanat ”bugi” ja ”debuggaus”. Minecraftin kanssa pitempään tekemisissä olleille termi ”bugi” on jo täysin vakiintunut pelikielenkäyttöön:
mix tää ei toimi?
no se bugaa jotenkin, koska Notch / Bukkit-tiimi / Etsija!

Suosittu tarina kertoo, että softamaailmassa sana bug (ötökkä) olisi syntynyt 9.9.1947 Harvardissa, jossa varhaisen tietokoneprototyyppi Mark II:n parissa työskentelevät operaattorit löysivät perhosen, joka oli kuollut kahden releen väliin ja aiheutti tietokoneessa oikosulun, joka puolestaan oli syy virheelliseen toimintaan. Operaattorit poistivat perhosen, ja tieziga alkoi jälleen toimia. He liittivät perhosen lokikirjaan ja kirjoittivat, että ensimmäinen ”oikea bugi” on löytynyt. Todellisuudessa tuota sanaa käytettiin jo varhaisten lennättimien aikaan, mutta totta lienee se, että tuosta tapahtumasta lähtien bug vakiintui tarkoittamaan tietokoneen toimintahäiriötä, ja termistä debug tuli vähitellen suosittu kuvaamaan tietokonevirheiden korjaamista. Nykyisellään debuggaus siis tarkoittaa yksinkertaisesti virheiden etsimistä ja korjaamista tietokoneohjelmista – ja vastaavasti debuggaajalla voitaisiin kuvailla sitä henkilöä, joka tätä puurtamista harrastaa. ”Etsijä debuggaa MinecartMania-pluginia” on monen mielestä (ja ihan aiheestakin) lausehirviö, mutta kuvaa oikeastaan melko tarkkaan todellisuutta.

Minecraft ja CraftBukkit-moninpelimodit on kokonaisuudessaan kirjoitettu Javalla. Yleisesti ottaen netti tarjoaa lukemattoman määrän ilmaisia Java-debuggaustyökaluja, joille yhteistä on ainakin se, että suoritettavaan tietokoneohjelmaan voidaan asettaa ohjelmoijan haluamiin kohtiin pysäytyspisteitä (breakpoints), ja näissä pisteissä voidaan tarkastella ohjelman haluttujen muuttujien tilaa ja arvoa (watch).

Mikäli CraftBukkitiakin voitaisiin debugata näin, olisi homma aika lailla yksinkertaista – mutta Etsija ei ole vielä valitettavasti löytänyt työkalua, joka näin toimisi. Pelit ovat huomattavasti monimutkaisempia debugata, sillä pelitapahtumat voivat tapahtua liki satunnaisessa järjestyksessä, eikä peli noin vain osaa pysähtyä breakpointeihin. Myöskään muuttujien tilaa ja arvoja ei voi noin vain tarkastella. Käytännössä ainut työkalu, joka minulla on debuggaukseen ollut, on niinsanottu tracing: asetan pluginin koodiin epäilyksenalaisiin kohtiin erillisiä tulostuslauseita, joilla ohjelma tulostaa haluttujen muuttujien arvoja joko serverin konsoliin (PC:ssä komentokehoite) tai erilliseen lokitiedostoon. Sitten käynnistän serverin, liityn peliin ja teen siellä toiminnon (vaikkapa hyppään minecartiin), joka aiheuttaa serveriohjelmiston ajamisen haluttuun kohtaan, ja lopulta tarkastelen konsolilokia ja päättelen, toimivatko tarkastelun alla olevat muuttujat oikein vai ”bugaako” koodi tältä osin!

Tällainen tapa debugata on todella työlästä ja aikaavievää, koska joka kerran kun haluan tarkastella tiettyä ohjelman kohtaa ja tiettyjen muuttujien arvoja, joudun muokkaamaan lähdekoodia ja kääntämään sen uudestaan. Hakusessa olisi siis oikea debuggaustyökalu, jolla pääsisin siirtymään trace-debuggauksesta oikeaan live-debuggaukseen. Mikäli joku satunnainen lukija sattuisi sellaisen tietämään, tulkoon nykäisemään Etsijaa hihasta vaikkapa pelit.fi:n Pelitcraft 2.0 -ketjussa tai itse pelissä!

 

31.1.2012 [Etsija]

MinecartMania on Bukkit-foorumeilla tunnetun nimimerkin Afforess (nykyinen Spout-pluginin ”projektipäällikkö”) aloittama projekti, ja hänen käsissään plugin kasvoi 2011 kevääseen mennessä todella kattavaksi ja suosituksi. Sittemmin Afforess otti Spout-haasteet vastaan ja hylkäsi pluginin omalta osaltaan. Remmiin astui nimimerkki N3X15 (tuttavallisesti Nexis), joka jatkoi pluginin ylläpitoa.

Kesällä Notch pudotti pommin ja meni muuttamaan maailmojen ilmansuuntamääritelmiä. Lyhyesti sanottuna hän kiersi maailman koordinaatistoa 90 astetta, mistä seurasi, että siitä, mikä ennen oli pohjoinen, tuli nyt länsi, idästä tuli pohjoinen, etelästä itä ja lännestä etelä. Syytä älkää kysykö minulta – näen tuollaisen muutoksen täysin mielivaltaisena, ja olen varma,että se rikkoi pelissä paljon muitakin plugineita.

MinecartManialle tuollainen muutos oli täysin tuhoisa, sillä hyvin monia sen ominaisuuksista on tehty juuri ilmansuuntiin perustuvina. Tällaisia ovat vaikkapa minecartin liikesuunnan määrittäminen, käyttäytyminen risteyksissä, minecartin liikkeelle lähettäminen jne. Lista on toivottoman pitkä.

Onneksi on Open Source, joka tässä tapauksessa luetaan: tässä lähdekoodini, jos se on rikki, korjaa se itse! Lähes kaikki Minecraftin CraftBukkit-moninpeliserverimodin päälle rakennettujen pluginien lähdekoodit on jaettu sosiaalisen koodauksen mekassa, GitHubissa. Niinpä Etsija otti lusikan kauniiseen käteensä, kaivoi pölyttyneet Java-oppaansa esiin, kääri hihansa ja rupesi töihin. Pelinimimerkin Semmone_Tammone (tuhannesti kiitoksia pitkistä iltakeskusteluista, Esko – en olisi selvinnyt ilman apuasi!) suosiollisella avustuksella otin alkuperäiset koodit itselleni ja aloin katsella, mikä kaikki on rikki. Oma GitHub-sivustoni, josta myös löytyvät aina omat uusimmat versioni plugineista, löytyy täältä.

Aluksi urakka näytti toivottomalta:

    • risteykset toimivat miten sattuu
    • arkusta spawnatut minecartit lähtivät, milloin edes lähtivät, väärään suuntaan
    • launcherit eivät toimineet asemilla
    • ilmoituskyltit olivat rikki

Eli suunnilleen kaikki käyttämämme toiminnallisuus oli hajalla.

Melko pian kuitenkin huomasin kaikessa toiminnallisuudessa tietyn logiikan ja tajusin, että lähes kaikki bugaaminen johtuu ilmansuuntien kierrosta. No, sitten vain käymään läpi kaikki koodi ja etsimään kohtia, jotka riippuvat ilmansuunnista. Onneksi tajusin melko pian myös, että varsinaista uutta toiminnallista koodia ei juurikaan tarvita; jutut kyllä toimisivat taas, jahka niille kerrottaisiin uusista ilmansuuntien määritelmistä. Piirtelin itselleni muutaman työtä helpottavan koordinaatiston, joiden avulla ensimmäinen bugifiksaus löytyi 15.1.2012, ja siitä homma lähti liikkeelle. Varsinkin tätä piirrosta tuli tuijoteltua useampaan otteeseen:

Kuvassa esimerkiksi ”x–” tarkoittaa, että uudessa koordinaatistossa maailman jonkin paikan x-koordinaatti (se, joka näkyy vaikkapa Minimapista tai F3:sta painettaessa) pienenee matkustettaessa länteen – vanhassa maailmassa sama tapahtui, kun matkustettiin pohjoiseen. Nokkelimmatpokkelimmat huomaavat, että tästä saa melko pian muodostettua itselleen automaation, jolla koodin koordinaattibugeja pääsee fiksailemaan.

MinecartMania koostuu useasta pluginista, emmekä onneksi tarvitse niitä kaikkia, mutta melko useaa kuitenkin. Pluginin korjaustyö (as of 31.1.2012) jakaantui suunnilleen seuraavasti:

MinecartManiaCore– kaikkien osapluginien tarvitsemat ydinluokat ja niiden sisältämät datarakenteet ja menetelmät

    • 14 korjattua funktiota
    • korjattu toiminnallisuus: minecartin kulkusuunnassa edessä olevan blokin tarkastelu; kulkusuunnan laskeminen; minecartin liikkeellelähtönopeuden laskeminen; minecartin nopeusvektorin asetus ja laskeminen; minecartin edessä mahdollisesti kulkevan toisen minecartin etsintä; läheneekö/loittoneeko toinen minecart meistä; onko suunnassa a minecartista katsottuna validi junaradan pätkä; merkkijonon muuntaminen kompassisuunnaksi; onko junarata oikein kytketty tietyssä suunnassa; onko minecart saapunut risteykseen; hae junaradan tiedot suunnasta x; laske oikein kylttien asetussuunnat

MinecartManiaAdminControls– joitakin admin-komentoja, mm. tyhjien ”haamucartien” tuhoaminen, /trucompass jne.

  • 1 korjattu funktio: korjattu /trucompass-toiminto noudattamaan uusia ilmansuuntia

MinecartManiaChestControl– chestit voivat toimia minecartien varastoina mm. juna-asemilla

    • 2 korjattua funktiota
    • korjattu toiminnallisuus: suunnan laskenta arkun paikasta käsin; arkun vieressä olevan minecartien spawnauskomentokyltin oikea käsittely (eli plugin löytää oikean paikan, mihin spawnata minecart arkusta)

MinecartManiaSignCommands– mm. metron Announcement-kylttien toiminta

    • 2 korjattua funktiota
    • korjattu toiminnallisuus: Announcement-kylttien hakeminen ja käsittely junaradan läheisyydestä; hakusäteen kasvatus kahteen blokkiin (kyltit voivat olla joko radan alla, sen vieressä tai sen viereen asetetun blokin radasta päin katsottuna ulommaisessa reunassa kiinni)

MinecartManiaStations– risteysten (brick block) älykäs toiminta

    • 3 korjattua funktiota
    • korjattu toiminnallisuus: sen laskeminen, mihin suuntaan pelaaja klikkaa risteyksessä minecartin reunaa (ilmaistakseen haluavansa kääntyä tiettyyn suuntaan); suunnan muuttaminen liikkeessä; kun pelaaja saapuu minecartilla risteykseen, joka on kylteillä täysin ”ohjattu”, minecart ei pysähdy kyselemään suuntia vaan jatkaa matkaansa ohjausten mukaisesti

Ehdottomasti hankalin vaihe korjaustyössä tuli eteen, kun kaikki ilmeinen oli fiksattu, eikä plugin vieläkään suostunut toimimaan. Tässä jumitin melkein viikon, ennen kuin viimein suostuin uskomaan, että eräs Bukkitin funktio kerta kaikkiaan toimii väärin, ja palauttaa edelleen vanhojen ilmansuuntien mukaisia arvoja. Kun tuon sain fiksattua, alkoi näyttää jo huomattavasti valoisammalta. Älykkäiden risteysten korjaaminen oli hankalinta ja jäi siksi viimeiseksi.

Eilen illalla sitten pääsin toteamaan, että parin viikon melkein jokailtainen puurtaminen tuotti tuloksen, ja pluginissa näyttäisi nyt jälleen toimivan suunnilleen kaikki se, mitä tarvitsemme toimivan ja helppokäyttöisen, Pelitcraftin laajuisen metroverkoston rakentamiseen. Olen varma, että pluginissa on vielä bugeja, jotka eivät omassa testauksessani löytyneet, joten olkaa pelaajat kärsivällisiä: nyt kun jokin metrossa bugaa, olen huomattavasti paremmin varustautunut fiksaamaan sen kuin edellisellä serverillä!