InSim
InSim Er en protokoll som lar et eksternt program kommunisere Med Live For Speed. Den lar deg lage en socket-tilkobling med spillet og til å sende og motta pakker med data. InSim-protokollen beskriver hvordan hver av disse pakkene er formatert, og ethvert programmeringsspråk som kan opprette en nettverkstilkobling og sende og motta strenger av binære data, kan grensesnitt med den.
den offisielle dokumentasjonen er inkludert i Filen InSim.txt, funnet i spill doc-mappen. Den består Av En c++ header fil som inneholder definisjonen for hver pakke, samt kommentarer Fra Scawen om hvordan hver skal brukes. Dokumentasjonen her er ment som en hjelpeutstyr til denne filen.
UDP vs TCP
InSim støtter BÅDE UDP-og TCP-tilkoblinger. I UDP-modus kan bare en enkelt tilkobling gjøres, men opptil åtte tilkoblinger kan gjøres til spillet I TCP. Enten tilkoblet I TCP eller UDP, er det mulig å angi en egen UDP-kontakt for mottak av bilposisjonsoppdateringer, FOR EKSEMPEL IS_MCI og IS_NLP.
InSim eksempel
Hvordan du går om å opprette En InSim-tilkobling er selvsagt avhengig av hvilket programmeringsspråk du bruker, men her gjør vi et forsøk på å dokumentere prosessen med noen eksempler fra Det populære Programmeringsspråket Python. Som nevnt ovenfor kan ethvert språk som er i stand til å lage en stikkontakt, brukes til å grensesnitt MED AKU, men prinsippet forblir det samme uansett.
Opprette en tilkobling
Først av alt må vi etablere en socket-tilkobling med spillet, i dette tilfellet I TCP.
# 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))
Initialisering InSim
etter å ha opprettet forbindelsen må Vi initialisere InSim-systemet ved å sende is_isi-pakken. Før vi kan gjøre dette, men vi må først intitailse InSim innenfor AKU selv. For å gjøre dette, start spillet og skriv inn chat-kommandoen «/ insim 29999». Portnummeret som brukes kan være en hvilken som helst gyldig port, men 29999 pleier vanligvis å være akseptert standard.
her er definisjonen FOR IS_ISI-pakken fra InSim.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};
hver InSim-pakke begynner med en overskrift, bestående av 4 byte. Den første byten er størrelsen på pakken, etterfulgt av pakketypen fra isp_-opplistingen, og Deretter ReqI(stående For Request Id). Når en forespørsel er gjort TIL AKU, må verdien Av ReqI settes til ikke-null, hvor AKU vil svare med samme verdi som er angitt I ReqI for den forespurte pakken. Til slutt varierer den fjerde byten avhengig av hvilken type pakke det gjelder, som i dette tilfellet er tomt.
som du kan se, INNEHOLDER is_isi-pakken ulike alternativer og flagg som brukes når Du initialiserer InSim-systemet. Vi må pakke disse dataene inn i en binær formatert streng for å sende DEN til AKU.
# 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)
Motta Data
etter å ha opprettet tilkoblingen og initialisert InSim må vi da sette opp pakkemottaksløyfen. Som data i TCP-modus sendes som en konstant strøm av data, kan flere pakker kommer i en enkelt mottak samtale og noen pakker kan komme ufullstendig. Dette betyr at vi må lagre alle innkommende data i en buffer og deretter lese hver pakke ut når vi er sikre på at den er fullført.
# 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()
Pakke Ut Pakker
Når vi har mottatt pakkedataene som en binærformatert streng, må vi pakke ut disse dataene i et format som er nyttig for oss. I vårt forrige eksempel da VI sendte IS_ISI initailisation-pakken, satte Vi ReqI til ikke-null, noe som betyr AT LFS reagerte MED EN IS_VER-versjonspakke, men vi gjorde ikke noe med det. For det første kan vi se på definisjonen FOR IS_VER-pakken fra 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};
la Oss nå se på hvordan vi ville pakke ut dataene i Python.
# 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
FOR å holde forbindelsen åpen VIL AKU sende en» keep alive » – pakke hvert 30.sekund. Denne pakken er EN IS_TINY med En SubT (sub-type) AV TINY_NONE. Vi ma svare pa denne pakken hver gang den mottas for a hindre at forbindelsen Med InSim fra timing-out.
# 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)
Ytterligere eksempler
du kan se hele eksemplet på denne koden, så vel som andre på InSim eksempler siden.
InSim Libraries
selvfølgelig som det gamle ordtaket går, bør du ikke prøve å gjenoppfinne hjulet (med mindre du prøver å lære mer om hjul) og det finnes flere modne InSim-biblioteker tilgjengelig for bruk i din egen kode.
InSim Biblioteker | ||||
---|---|---|---|---|
Bibliotek | Plattform | Lisens | web | |
LFSLib | . NET Framework | gpl | prosjektside | |
LFS_External | .NET Framework | Freeware | lfsforum tråd | |
JInSim | Java | Mozilla | lfsforum tråd | |
pyinsim | Python | LGPL | lfsforum tråd | |
CInSim | C / C++ | Freeware | lfsforum tråd | |
phplfs | PHP5 | Apache Lisens V2.0 | prosjektside | |
PRISME | PHP7 | MIT | lfsforum seksjon | |
InSim.NETTO | . NET Framework | LGPL | lfsforum tråd |
InSim Reference
Her er et forsøk på å referere til den komplette InSim-protokollen.
Pakke Referanse | ||
---|---|---|
Pakke | Beskrivelse | Type |
Initialisering | ||
IS_ISI | InSim initialisering | Instruksjon |
Generelle Formål | ||
IS_TINY | Generell bruk 4 byte pakke | Begge |
IS_SMALL | Generell bruk 8 byte pakke | Begge |
Versjon forespørsel | ||
IS_VER | Versjonsinformasjon | Info |
Statlig Rapportering og Forespørsler | ||
IS_STA | Sendt når spilltilstanden endres | Info |
IS_SFP | Send for å angi ulike tilstandsalternativer | Instruksjon |
Skjermmodus | ||
IS_MOD | Send for å endre skjermmodus | Instruksjon |
Tekstmeldinger Og Tastetrykk | ||
IS_MSO | System-og brukermeldinger sendt fra AKU | Info |
IS_III | Bruker meldinger til vert InSim | Info |
IS_MST | Send AKU en melding eller kommando (64 tegn) | Instruksjon |
IS_MSX | Utvidet versjon AV IS_MST (96 tegn), ikke for kommandoer | Instruksjon |
IS_MSL | Send melding til lokal spillklient | Instruksjon |
IS_MTC | Send melding til spesifikk tilkobling eller spiller | Instruksjon |
IS_SCH | Send enkelt tegn eller tastetrykk | Instruksjon |
Multiplayer Varsling | ||
IS_ISM | Sendt når du starter eller blir med i en vert | Info |
IS_NCI | Sendt når host admin passord er satt, inneholder bruker IP og språk data | Info |
Stemme Varsle | ||
IS_VTN | Varsle spilleren stemme (restart rase, kvalifisere etc..) | Info |
Race Tracking | ||
IS_RST | Løp starter eller starter på nytt | Info |
IS_NCN | Ny tilkobling bli med server | Info |
IS_SLC | for å rapportere endringer i biltilstand(for øyeblikket start eller stopp) | Info |
IS_CSC | rapporterer en tilkoblingsvalgt bil | Info |
IS_CNL | Tilkobling venstre server | Info |
IS_CPR | Spiller endret navn | Info |
IS_NPL | Ny spiller bli med rase, eller forlate groper | Info |
IS_PLP | Spiller pits (gått til garasje skjermen) | Info |
IS_PLL | Spiller venstre rase(gått til spectate) | Info |
IS_CRS | Tilbakestilling Av Bil (trykket mellomromstast) | Info |
IS_JRR | kan brukes til å tilbakestille eller starte en bil på et bestemt sted | Instruksjon |
IS_LAP | Rundetid fullført | Info |
IS_SPX | Fullført Splitt tid | Info |
IS_PIT | Pitstopp startet (ved pitboks) | Info |
IS_PSF | Pitstopp ferdig | Info |
IS_PLA | Spiller angitt pit lane(til pit eller tjene straff) | Info |
IS_CHH | Kameravisning endret (chase view, tilpasset visning etc..) | Info |
IS_PEN | Straff gitt eller cleated | Info |
IS_TOC | Spiller overtatt en annen bil (sjåførbytte) | Info |
IS_FLG | Spiller vist flagg (gul eller blå) | Info |
IS_PFL | Spiller flagg endret (auto-gir, auto-clutch etc..) | Info |
IS_FIN | Spiller ferdig rase (krysset mållinjen) | Info |
IS_RES | Spiller resultat tildelt, bekreftet finish | Info |
IS_REO | Endre rekkefølge på startnett | Begge |
Autocross | ||
IS_AXI | Autocross layout lastet | Info |
IS_AXO | Spiller treffer autocross objekt | Info |
IS_OCO | kan brukes til å overstyre spesifikke eller alle startlys | Instruksjon |
IS_UCO | sender info om InSim sjekkpunkter og sirkler | Info |
Bil Sporing | ||
IS_NLP | Spillere nåværende node, runde og rase posisjon | Info |
IS_MCI | Mer detaljert versjon AV IS_NLP, verdens koordinater, hastighet, vinkel og overskrift | Info |
Kamerakontroll | ||
IS_SCC | Sett vist bil og velg kamera | Instruksjon |
IS_CPP | Sett full kameraposisjon | Instruksjon |
Replay Control | ||
IS_RIP | Last inn replay og flytt til bestemt destinasjon | Instruksjon |
Skjermbilder | ||
IS_SSH | ta et skjermbilde | Instruksjon |
InSim Knapper | ||
IS_BFN | Slett en knapp eller alle knapper | Instruksjon |
IS_BTN | Send en knapp til skjermen | Instruksjon |
IS_BTC | Sendt når en knapp klikkes | Info |
IS_BTT | Sendt når tekst skrives inn | Info |