InSim
InSim on protokolla, jonka avulla ulkopuolinen ohjelma voi kommunikoida Liven kanssa nopeuden vuoksi. Sen avulla voit luoda socket-yhteyden peliin ja lähettää ja vastaanottaa datapaketteja. InSim-protokolla kuvaa, miten kukin näistä paketeista on muotoiltu, ja mikä tahansa ohjelmointikieli, joka voi luoda verkkoyhteyden ja lähettää ja vastaanottaa binääridatan merkkijonoja, voi liittyä siihen.
virallinen asiakirja sisältyy InSim-asiakirjavihkoon.txt, löytyy pelit doc-kansiosta. Se koostuu C++ – otsikkotiedostosta, joka sisältää kunkin paketin määritelmän sekä scawenin kommentit siitä, miten kutakin tulisi käyttää. Tässä oleva dokumentaatio on tarkoitettu tämän tiedoston liitännäiseksi.
UDP vs TCP
InSim tukee sekä UDP-että TCP-yhteyksiä. UDP-tilassa voi tehdä vain yhden yhteyden, mutta TCP: ssä peliin voi saada jopa kahdeksan yhteyttä. Olipa kytketty TCP tai UDP, on mahdollista määrittää erillinen UDP-pistorasia vastaanottaa auton sijainti päivitykset, kuten IS_MCI ja IS_NLP.
InSim-esimerkki
miten teet InSim-yhteyden, riippuu tietenkin siitä, mitä ohjelmointikieltä käytät, mutta tässä yritämme dokumentoida prosessia muutamilla esimerkeillä suositusta Python-ohjelmointikielestä. Kuten edellä mainittiin, mikä tahansa kieli, joka pystyy tekemään socket-yhteyden, voidaan käyttää käyttöliittymään LFS: n kanssa, mutta periaate pysyy samana riippumatta.
yhteyden luominen
ensin on luotava pistokeyhteys peliin, tässä tapauksessa TCP: hen.
# Import Python's socket module.import socket# Initialise the socket in TCP mode. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# Connect to LFS.sock.connect(('localhost', 29999))
InSim-järjestelmän alustaminen
yhteyden muodostamisen jälkeen meidän on alustettava InSim-järjestelmä lähettämällä is_isi-paketti. Ennen kuin voimme tehdä tämän kuitenkin meidän on ensin intitailse InSim sisällä LFS itse. Voit tehdä tämän aloittamalla pelin ja antamalla chat-komennon ”/ insim 29999”. Käytetty portin numero voi olla mikä tahansa kelvollinen portti, mutta 29999 on yleensä hyväksytty oletusarvo.
tässä on määritelmä Is_isi-paketille Insimistä.txt.
struct IS_ISI // InSim Init - packet to initialise the InSim system{byteSize;// 44byteType;// ISP_ISIbyteReqI;// If non-zero LFS will send an IS_VER packetbyteZero;// 0wordUDPPort;// Port for UDP replies from LFS (0 to 65535)wordFlags;// Bit flags for options (see below)byteSp0;// 0bytePrefix;// Special host message prefix characterwordInterval;// Time in ms between NLP or MCI (0 = none)charAdmin;// Admin password (if set in LFS)charIName;// A short name for your program};
jokainen InSim-paketti alkaa otsikolla, joka koostuu 4 tavusta. Ensimmäinen tavu on paketin koko, jota seuraa paketin tyyppi isp_-arvojoukosta ja sitten reqi (request Id). Kun LFS: lle esitetään pyyntö, ReqI-arvon on oltava muu kuin nolla, jolloin LFS vastaa samalla arvolla, joka on asetettu pyydetyn paketin ReqI-arvoon. Lopuksi neljäs tavu vaihtelee riippuen kyseisen paketin tyypistä, joka tässä tapauksessa on tyhjä.
kuten näette, is_isi-paketti sisältää erilaisia vaihtoehtoja ja lippuja, joita käytetään InSim-järjestelmän alustamisessa. Meidän on pakattava nämä tiedot binäärimuotoiseen merkkijonoon lähettääksemme ne LFS: lle.
# Import Python's struct module, which allows us to pack and unpack strings.import struct# Pack the IS_ISI data into a string.isi = struct.pack('BBBBHHBcH16s16s', 44, # Size 1, # Type 1, # ReqI 0, # Zero 0, # UDPPort 0, # Flags 0, # Sp0 ' ', # Prefix 0, # Interval 'password', # Admin 'MyProgram',) # IName# Send the string to InSimsock.send(isi)
tietojen vastaanottaminen
yhteyden luomisen ja InSim-alustuksen jälkeen meidän on sitten setup-paketti vastaanottaa silmukka. Koska tiedot TCP-tilassa lähetetään jatkuvana datavirtana, useita paketteja voi saapua yhdellä vastaanotetulla puhelulla ja jotkut paketit voivat saapua epätäydellisinä. Tämä tarkoittaa, että meidän on tallennettava kaikki saapuvat tiedot puskuriin ja luettava jokainen paketti, kun olemme varmoja, että se on valmis.
# We use a string as the buffer.buffer = ''while True: # Receive up to 1024 bytes of data. data = sock.recv(1024) # If no data is received the connection has closed. if data: # Append received data onto the buffer. buffer += data # Loop through each completed packet in the buffer. The first byte of # each packet is the packet size, so check that the length of the # buffer is at least the size of the first packet. while len(buffer) > 0 and len(buffer) > ord(buffer): # Copy the packet from the buffer. packet = buffer)] # Remove the packet from the buffer. buffer = buffer):] # The packet is now complete! :) # doSomethingWithPacket(packet) else: break# Release the socket.sock.close()
pakkausten purkaminen
kun olemme saaneet paketin tiedot binäärimuotoisena merkkijonona, meidän on purettava nämä tiedot meille hyödylliseen muotoon. Edellisessä esimerkissämme, kun lähetimme IS_ISI initailisation-paketin, asetimme reqi-arvon ei-nollaan, mikä tarkoittaa, että LFS vastasi is_ver-versiopaketilla, mutta emme tehneet mitään sen kanssa. Ensinnäkin katsotaanpa määritelmä is_ver paketti InSim.txt.
struct IS_VER // VERsion{byteSize;// 20byteType;// ISP_VERSIONbyteReqI;// ReqI as received in the request packetbyteZero;charVersion;// LFS version, e.g. 0.3GcharProduct;// Product : DEMO or S1wordInSimVer;// InSim Version : increased when InSim packets change};
nyt katsotaan, miten purkaisimme tuon tiedon Pythonissa.
# Import Python's struct module.import struct# Unpack the binary formatted packet data into the values we need.size, type, reqi, zero, version, product, insimver = struct.unpack('BBBB8s6sH', packet)# Check the InSim version.if insimver != 4: print 'Invalid InSim version!' sock.close()
Keep Alive
pitääkseen yhteyden auki LFS lähettää ”keep alive” – paketin noin 30 sekunnin välein. Tämä paketti on IS_TINY kanssa SubT (alatyyppi) TINY_NONE. Meidän on vastattava tähän pakettiin joka kerta, kun se vastaanotetaan, jotta estämme yhteyden Insimiin ajoituksen.
# Some constants.ISP_TINY = 3TINY_NONE = 0# Check the packet type.if ord(packet) == ISP_TINY: # Unpack the packet data. tiny = struct.unpack('BBBB', packet) # Check the SubT. if tiny == TINY_NONE: # Send the keep alive packet back to LFS. sock.send(packet)
Lisäesimerkit
tämän koodin ja muiden Koko esimerkin näet InSim examples-sivulta.
InSim-kirjastot
vanhan sanonnan mukaan pyörää ei tietenkään kannata yrittää keksiä uudelleen (ellet yritä oppia lisää pyöristä), ja käytössä on useita kypsiä InSim-kirjastoja.
InSim-kirjastot | ||||
---|---|---|---|---|
kirjasto | laituri | lisenssi | web | |
LFSLib | . NET Framework | GPL | projektisivu | |
Lfs_ulkoinen | .NET Framework | Freeware | lfsforum thread | |
JInSim | Java | Mozilla | lfsforum thread | |
pyinsim | Python | LGPL | lfsforum thread | |
CInSim | C / C++ | Freeware | lfsforum-säie | |
phplfs | PHP5 | Apache License V2. 0 | projektisivu | |
PRISM | PHP7 | MIT | lfsforum section | |
InSim.NET | . NET Framework | LGPL | lfsforum thread |
InSim-viittaus
tässä yritetään viitata täydelliseen InSim-pöytäkirjaan.
Paketin viite | ||
---|---|---|
paketti | kuvaus | Tyyppi |
alustaminen | ||
IS_ISI | InSim initialization | Instruction |
yleinen tarkoitus | ||
IS_TINY | yleiskäyttöinen 4 tavun paketti | molemmat |
IS_PALLO | yleiskäyttöinen 8 tavun paketti | molemmat |
Versiopyyntö | ||
IS_VER | versiotiedot | Info |
Valtion raportointi ja pyynnöt | ||
IS_STA | lähetetty aina kun pelin tila muuttuu | Info |
IS_SFP | lähetä asettamaan erilaisia tilavaihtoehtoja | Ohje |
näyttötila | ||
IS_MOD | lähetä näytön vaihtotilaan | Ohje |
tekstiviestit ja näppäinpainallukset | ||
IS_MSO | LFS: stä lähetetyt järjestelmä-ja käyttäjäviestit | Info |
IS_III | Käyttäjäviestit Insimille | Info |
IS_MST | Send LFS a message or command (64 merkkiä) | Instruction |
IS_MSX | Is_mst: n laajennettu versio (96 merkkiä), ei komennoille | Ohje |
IS_MSL | Lähetä viesti paikallispeliohjelmalle | Ohje |
IS_MTC | Lähetä viesti tietylle yhteydelle tai soittimelle | Ohje |
IS_SCH | lähetä yksittäinen merkki tai näppäin | Ohje |
ilmoitus moninpelistä | ||
IS_ISM | lähetetty aloittaessaan tai liittyessään isäntään | Info |
IS_NCI | lähetetty, kun järjestelmänvalvojan salasana on asetettu, sisältää käyttäjän IP-ja kielitietoja | Info |
äänestä | ||
IS_VTN | ilmoita pelaajan äänistä (uudelleen kisa, karsinta jne..) | Info |
Kisaseuranta | ||
IS_RST | kisan alku-tai uusintakilpailu | Info |
IS_NCN | Uusi Yhteys palvelimeen | Info |
IS_SLC | ilmoittaa muutokset auton tilassa (tällä hetkellä start tai stop) | Info |
IS_CSC | raportoi liittymän tällä hetkellä valitsema auto | Info |
IS_CNL | yhteys vasen palvelin | Info |
IS_CPR | pelaaja vaihtoi nimeä | Info |
IS_NPL | Uusi pelaaja liittyy kisaan tai lähtee varikolta | Info |
IS_PLP | Pelaajapirtti (mennyt autotallin näytölle) | Info |
IS_PLL | pelaaja vasen rotu (mennyt spektaakkeliin) | Info |
IS_CRS | auton palautus (painettu välilyönti) | Info |
IS_JRR | voidaan käyttää auton nollaamiseen tai käynnistämiseen tietyssä paikassa | Ohje |
IS_LAP | kierros suoritettu | Info |
IS_SPX | Split time completed | Info |
IS_PIT | varikkokäynti alkoi (varikkoaitiossa) | Info |
IS_PSF | varikkokäynti päättynyt | Info |
IS_PLA | pelaaja tuli varikkokaistalle (varikolle tai jäähylle) | Info |
IS_CHH | Kameranäkymä muuttunut (chase view, custom view jne..) | Info |
IS_KYNÄ | annettu tai poistettu rangaistus | Info |
IS_TOC | pelaaja otti haltuunsa toisen auton (kuljettajavaihto) | Info |
IS_FLG | pelaaja näytti lippua (keltainen tai sininen) | Info |
IS_PFL | pelaajien liput vaihdettu (Automaattivaihteisto, automaattikytkin jne..) | Info |
IS_FIN | pelaaja sijoittui kisassa (ylitti maaliviivan) | Info |
IS_RES | pelaajatulos myönnetty, vahvistettu sijoitus | Info |
IS_REO | uudelleenjärjestely lähtöruudukossa | molemmat |
Autocross | ||
IS_AXI | Autocross layout loaded | Info |
IS_AXO | pelaajan osuma autocross-objekti | Info |
IS_OCO | voidaan käyttää tiettyjen tai kaikki starttivalot | opetus |
IS_UCO | lähettää tietoa Insimin tarkastuspisteistä ja piireistä | Info |
autojen seuranta | ||
IS_NLP | pelaajat tämänhetkinen solmu, kierros ja kisapaikka | Info |
IS_MCI | tarkempi versio is_nlp: stä, maailmankoordinaatit, nopeus, kulma ja suunta | Info |
kameravalvonta | ||
IS_SCC | Aseta katsottu auto ja valitse kamera | Ohje |
IS_CPP | Aseta koko kameran sijainti | Ohje |
Replay Control | ||
IS_RIP | lataa uusinta ja siirry tiettyyn kohteeseen | Ohje |
kuvakaappauksia | ||
IS_SSH | Ota kuvakaappaus | Ohje |
InSim-painikkeet | ||
IS_BFN | Poista painike tai kaikki painikkeet | Ohje |
IS_BTN | Lähetä painike näytölle | Ohje |
IS_BTC | lähetetty kun nappia napsautetaan | Info |
IS_BTT | lähetetty, kun tekstiä syötetään | Info |