InSim

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

Vastaa

Sähköpostiosoitettasi ei julkaista.