InSim

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.