InSim
InSim er en protokol, der gør det muligt for et eksternt program at kommunikere med Live for hastighed. Det giver dig mulighed for at oprette en sokkelforbindelse med spillet og til at sende og modtage pakker med data. InSim-protokollen beskriver, hvordan hver af disse pakker er formateret, og ethvert programmeringssprog, der kan oprette en netværksforbindelse og sende og modtage strenge af binære data, kan interface med det.
den officielle dokumentation er inkluderet i filen InSim.tekst, findes i mappen Spil doc. Den består af en C++ header-fil, der indeholder definitionen for hver pakke, samt kommentarer fra Scavenia om, hvordan hver skal bruges. Dokumentationen her er tænkt som et supplement til denne fil.
UDP vs TCP
InSim understøtter både UDP og TCP-forbindelser. I UDP-tilstand kan der kun oprettes en enkelt forbindelse, men der kan oprettes op til otte forbindelser til spillet i TCP. Uanset om det er tilsluttet i TCP eller UDP, er det muligt at angive en separat UDP-stik til modtagelse af bilpositionsopdateringer, såsom IS_MCI og IS_NLP.
InSim eksempel
hvordan du går i gang med at oprette en InSim-forbindelse afhænger naturligvis af hvilket programmeringssprog du bruger, men her forsøger vi at dokumentere processen med nogle eksempler fra det populære Python-programmeringssprog. Som nævnt ovenfor kan ethvert sprog, der er i stand til at oprette en stikkontakt, bruges til at interface med LFS, men princippet forbliver det samme uanset.
oprettelse af en forbindelse
først og fremmest skal vi etablere en sokkelforbindelse med spillet, i dette tilfælde 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 af InSim
efter oprettelse af forbindelsen skal vi initialisere InSim-systemet ved at sende IS_ISI-pakken. Før vi kan gøre dette, skal vi dog først intitailse InSim inden for LFS selv. For at gøre dette skal du starte spillet og indtaste chatkommandoen “/insim 29999”. Det anvendte portnummer kan være en hvilken som helst gyldig port, men 29999 har generelt en tendens til at være den accepterede standard.
her er definitionen for IS_ISI-pakken fra InSim.TST.
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 begynder med en overskrift, der består af 4 byte. Den første byte er størrelsen på pakken efterfulgt af pakketypen fra isp_-tællingen og derefter rekvisitionen (står for anmodning-Id). Når der fremsættes en anmodning til LFS, skal værdien af rekvisitionen indstilles til ikke-nul, hvorved LFS svarer med den samme værdi, der er angivet i rekvisitionen for den anmodede pakke. Endelig varierer den fjerde byte afhængigt af den pågældende pakke, som i dette tilfælde er tom.
som du kan se, indeholder is_isi-pakken forskellige indstillinger og flag, der bruges, når InSim-systemet initialiseres. Vi skal pakke disse data i en binær formateret streng for at sende den til LFS.
# 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)
modtagelse af Data
efter oprettelse af forbindelsen og initialisering af InSim skal vi derefter opsætte pakken modtage loop. Da data i TCP-tilstand sendes som en konstant strøm af data, kan flere pakker ankomme i et enkelt modtagelsesopkald, og nogle pakker kan ankomme ufuldstændige. Det betyder, at vi skal gemme alle indgående data i en buffer og derefter læse hver pakke ud, når vi er sikre på, at den er færdig.
# 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()
udpakning af pakker
når vi har modtaget pakkedataene som en binær formateret streng, skal vi derefter pakke disse data ud i et format, der er nyttigt for os. I vores tidligere eksempel, da vi sendte IS_ISI-initailiseringspakken, satte vi rekvisitionen til ikke-nul, hvilket betyder, at LFS reagerede med en IS_VER-versionspakke, men vi gjorde ikke noget med det. Lad os først se på definitionen for IS_VER-pakken fra InSim.TST.
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};
lad os nu se på, hvordan vi ville udpakke disse data 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 at holde forbindelsen åben sender LFS en “keep alive” – pakke hvert 30.sekund. Denne pakke er en IS_TINY med en SubT (undertype) af TINY_NONE. Vi skal svare på denne pakke hver gang den modtages for at forhindre, at forbindelsen med InSim går ud.
# 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)
yderligere eksempler
du kan se det fulde eksempel på denne kode såvel som andre på insim-eksemplerne.
InSim-biblioteker
selvfølgelig som det gamle ordsprog går, bør du ikke forsøge at genopfinde hjulet (medmindre du forsøger at lære mere om hjul), og der er flere modne InSim-biblioteker til rådighed til brug i din egen kode.
Insim biblioteker | ||||
---|---|---|---|---|
Bibliotek | Platform | Licens | internet | |
LFSLib | . net ramme | GPL | projektside | |
Lfs_ekstern | .NET ramme | gratis vare | lfsforum tråd | |
JInSim | Java | Mosilla | lfsforum tråd | |
pyinsim | Python | LGPL | lfsforum tråd | |
CInSim | C / C++ | gratis vare | lfsforum tråd | |
phplfs | PHP5 | Apache Licens V2.0 | projektside | |
PRISM | PHP7 | MIT | lfsforum sektion | |
InSim.NET | . net ramme | LGPL | lfsforum tråd |
InSim Reference
her er et forsøg på at henvise til den komplette InSim-protokol.
Pakkehenvisning | ||
---|---|---|
pakke | beskrivelse | Type |
initialisering | ||
IS_ISI | insim initialisering | instruktion |
generelle formål | ||
IS_TINY | generelle formål 4 byte pakke | begge |
IS_SMALL | generelle formål 8 byte pakke | begge |
Versionsforespørgsel | ||
IS_VER | versionsinformation | Info |
Statsrapportering og anmodninger | ||
IS_STA | sendt når spillet tilstand ændringer | Info |
IS_SFP | Send for at indstille forskellige tilstandsindstillinger | instruktion |
skærmtilstand | ||
IS_MOD | Send for at ændre skærmtilstand | instruktion |
tekstbeskeder og tastetryk | ||
IS_MSO | system-og brugerbeskeder sendt fra LFS | Info |
IS_III | brugerbeskeder til vært InSim | Info |
IS_MST | Send LFS en besked eller kommando (64 tegn) | instruktion |
Is_msk | udvidet version af IS_MST (96 tegn), ikke for kommandoer | instruktion |
IS_MSL | Send besked til lokal spilklient | instruktion |
IS_MTC | Send besked til specifik forbindelse eller afspiller | instruktion |
IS_SCH | Send enkelt tegn eller tastetryk | instruktion |
Multiplayer anmeldelse | ||
IS_ISM | sendt når du starter eller slutter dig til en vært | Info |
IS_NCI | sendt når host admin adgangskode er indstillet, indeholder bruger IP og sprog data | Info |
afstemning Underret | ||
IS_VTN | Underret om spiller stemme (genstart race, kvalificere etc..) | Info |
Race Tracking | ||
IS_RST | Race Start eller genstart | Info |
IS_NCN | ny forbindelse sammenføjning server | Info |
IS_SLC | at rapportere ændringer i biltilstand (aktuelt start eller stop) | Info |
IS_CSC | rapporterer en forbindelses aktuelt valgte bil | Info |
IS_CNL | tilslutning venstre server | Info |
IS_CPR | spiller ændret navn | Info |
IS_NPL | ny spiller, der deltager i race, eller forlader gruber | Info |
IS_PLP | spiller pits (gået til garage skærm) | Info |
IS_PLL | spiller venstre løb (gået til spectate) | Info |
IS_CRS | bil nulstilling (presset mellemrumstasten) | Info |
IS_JRR | kan bruges til at nulstille eller starte en bil på et bestemt sted | instruktion |
IS_LAP | omgangstid afsluttet | Info |
IS_SP | Split tid afsluttet | Info |
IS_PIT | Pit stop startet (ved pit boks) | Info |
IS_PSF | Pit stop færdig | Info |
IS_PLA | spiller indtastet pit lane (til pit eller tjene straf) | Info |
IS_CHH | kameravisning ændret (chase-visning, brugerdefineret visning osv..) | Info |
IS_PEN | straf givet eller cleated | Info |
IS_TOC | spiller overtog en anden bil (førerbytte) | Info |
IS_FLG | spiller vist flag (gul eller blå) | Info |
IS_PFL | spiller flag ændret (auto-gear, auto-kobling osv..) | Info |
IS_FIN | spiller færdig løb (krydset målstregen) | Info |
IS_RES | spiller resultat tildelt, bekræftet finish | Info |
IS_REO | Omarranger startgitter | begge |
Autocross | ||
IS_AKSI | Autocross layout indlæst | Info |
IS_AKSO | spiller hit autocross objekt | Info |
IS_OCO | kan bruges til at tilsidesætte specifikke eller alle startlys | instruktion |
IS_UCO | sender info om insim checkpoints og cirkler | Info |
bil sporing | ||
IS_NLP | spillere nuværende node, omgang og race position | Info |
IS_MCI | mere detaljeret version af IS_NLP, verden-koordinater, hastighed, vinkel og overskrift | Info |
kamera kontrol | ||
IS_SCC | sæt set bil og vælg Kamera | instruktion |
IS_CPP | Indstil fuld kameraposition | instruktion |
Replay kontrol | ||
IS_RIP | Indlæs afspilning og flyt til bestemt destination | instruktion |
Screenshots | ||
IS_SSH | tag et skærmbillede | instruktion |
Insim knapper | ||
IS_BFN | Slet en knap eller alle knapper | instruktion |
IS_BTN | Send en knap til skærmen | instruktion |
IS_BTC | sendt når der klikkes på en knap | Info |
IS_BTT | sendt når tekst er indtastet | Info |