InSim
InSimは、外部プログラムがLiveと通信して速度を上げることを可能にするプロトコルです。 それはあなたがゲームとのソケット接続を作成し、データのパケットを送受信することができます。 InSimプロトコルは、これらのパケットのそれぞれがどのようにフォーマットされるかを記述し、ネットワーク接続を作成し、バイナリデータの文字列を送受信することができる任意のプログラミング言語は、それとインターフェイスすることができます。
公式文書はInSimファイルに含まれています。txt、ゲームのdocフォルダにあります。 これは、各パケットの定義を含むC++ヘッダーファイルと、それぞれがどのように使用されるべきかについてのScawenからのコメントで構成されています。 ここでのドキュメントは、このファイルの補助として意図されています。
UDPとTCP
InSimはUDPとTCPの両方の接続をサポートしています。 UDPモードでは、1つの接続のみを作成できますが、TCPでは最大8つの接続をゲームに作成できます。 TCPで接続されているかUDPで接続されているかにかかわらず、IS_MCIやIS_NLPなど、車の位置の更新を受信するための別のUDPソケットを指定することがで
InSim example
InSim接続を作成する方法はもちろん、使用しているプログラミング言語に依存しますが、ここでは一般的なPythonプログラミング言語のいくつかの例 上記のように、ソケット接続を行うことができる任意の言語は、LFSとのインタフェースに使用することができますが、原則は関係なく同じままです。
接続の作成
まず、この場合は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))
InSimの初期化
接続を確立した後、IS_ISIパケットを送信してInSimシステムを初期化する必要があります。 しかし、これを行う前に、まずLFS自体の中でIntitailse InSimする必要があります。 これを行うには、ゲームを開始し、チャットコマンド”/insim29999″を入力します。 使用されるポート番号は任意の有効なポートにすることができますが、一般的には29999が受け入れられるデフォルトになる傾向があります。
InSimからのIS_ISIパケットの定義は次のとおりです。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};
各InSimパケットは、4バイトで構成されるヘッダーで始まります。 最初のバイトはパケットのサイズであり、その後にISP_列挙からのパケットタイプが続き、次にReqI(要求Idを表す)が続きます。 LFSに対して要求がなされるたびに、Reqiの値はゼロ以外に設定されなければならず、それにより、LFSは、要求されたパケットのReqiに設定された同じ値で応答 最後に、4番目のバイトは、問題のパケットのタイプに応じて異なりますが、この場合は空白です。
ご覧のように、Is_ISIパケットには、InSimシステムを初期化するときに使用されるさまざまなオプションとフラグが含まれています。 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)
受信データ
接続を作成し、InSimを初期化した後、パケット受信ループを設定する必要があります。 TCPモードのデータは一定のデータストリームとして送信されるため、単一の受信コールで複数のパケットが到着し、一部のパケットが不完全に到着する可能性 つまり、すべての受信データをバッファに格納し、完了したことが確認されたら各パケットを読み出す必要があります。
# 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()
Unpacking Packets
パケットデータをバイナリ形式の文字列として受け取ったら、このデータを便利な形式に解凍する必要があります。 前の例では、IS_ISI initailisationパケットを送信したときに、ReqIを非ゼロに設定しました。 まず、InSimからのIS_VERパケットの定義を見てみましょう。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};
ここで、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
接続を開いたままにするために、LFSは30秒ほどごとに”keep alive”パケットを送信します。 このパケットは、TINY_NONEのSubT(sub-type)を持つIS_TINYです。 InSimとの接続がタイムアウトするのを防ぐために、このパケットが受信されるたびにこのパケットに応答する必要があります。
# 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)
その他の例
このコードの完全な例とその他の例をInSimの例ページで見ることができます。
InSim Libraries
もちろん、古い格言が行くように、あなたは(あなたが車輪についての詳細を学ぼうとしていない限り)ホイールを再発明しようとすべきではな
InSimライブラリ | |||||
---|---|---|---|---|---|
ライブラリ | プラットフォーム | ライセンス | ウェブ | ||
LFSLIB | .NET Framework | GPL | プロジェクトページ | ||
Lfs_External | .NETフレームワーク | フリーウェア | lfsforumスレッド | ||
JInSim | Java | Mozilla | lfsforumスレッド | ||
pyinsim | Python | LGPL | lfsforumスレッドパソコン | lfsforumスレッドパソコン | Lfsforumスレッド |
CInSim | C/C++ | フリーウェア | lfsforumスレッド | ||
phplfs | PHP5 | Apache License V2.0 | プロジェクトページ | ||
プリズム | PHP7 | MIT | lfsforumセクション | ||
インシムNET | .NET Framework | LGPL | lfsforumスレッド |
InSimリファレンス
ここでは、完全なInSimプロトコルを参照しようとしています。
パケット参照 | ||
---|---|---|
パケット | 説明 | タイプ |
初期化 | ||
IS_ISI | InSim初期化 | 命令 |
汎用 | ||
IS_TINY | 汎用4バイトパケット | 両方 |
IS_SMALL | 汎用8バイトパケット | 両方 |
バージョン要求 | ||
IS_VER | バージョン情報 | |
州の報告と要求 | ||
IS_STA | ゲームの状態が変更されるたびに送信されます | 情報 |
IS_SFP | 各種状態オプションを設定するための送信 | 命令 |
画面モード | ||
IS_MOD | 画面モードを変更するために送信 | 命令 |
テキストメッセージとキー押下 | ||
IS_MSO | LFS | から送信されたシステムメッセージとユーザーメッセージInfo |
IS_III | InSimをホストするためのユーザーメッセージ | 情報 |
IS_MST | LFSにメッセージまたはコマンドを送信する(64文字) | 命令 |
IS_MSX IS_MSTの拡張バージョン(96文字)、コマンド | 命令用ではありません | |
IS_MSL | ローカルゲームクライアントにメッセージを送信 | 命令 |
IS_MTC | 特定の接続またはプレーヤーにメッセージを送信 | 命令 |
IS_SCH | 単一の文字またはキーを送信 | |
マルチプレイヤー通知 | ||
IS_ISM | ホストの起動時または参加時に送信されます | 情報 |
IS_NCI | ホスト管理者パスワードが設定されているときに送信され、ユーザー IPと言語データが含まれています | 情報 |
投票通知 | ||
IS_VTN | プレイヤー投票の通知(再始動レース、予選など。.)<7482><4649> | |
レース追跡 | ||
IS_RST | レースの開始または再起動 | 情報 |
IS_NCN | 新しい接続参加サーバー | 情報 |
IS_SLC | 車の状態の変化(現在開始または停止)を報告する | 情報 |
IS_CSC | は、接続の現在選択されている車 | 情報を報告します |
IS_CNL | 接続左サーバー | 情報 |
IS_CPR | 選手名変更 | 情報 |
IS_NPL | 新しいプレイヤーがレースに参加するか、ピットを離れる | 情報 |
IS_PLP | プレイヤーピット(ガレージ画面に移動) | 情報 |
IS_PLL | プレイヤー左レース(観戦に行って) | 情報 |
IS_CRS | 車のリセット(スペースバーを押した) | 情報 |
IS_JRR | 指定された場所で車をリセットまたは起動するために使用することができます | 命令 |
IS_LAP | ラップタイム完了 | Info |
IS_SPX | 分割時間が完了しました | 情報 |
IS_PIT | ピットストップ開始(ピットボックスで) | Info |
IS_PSF | ピットストップ終了 | 情報 |
IS_PLA | プレイヤーがピットレーンに入った(ピットまたはペナルティを受ける) | 情報 |
IS_CHH | カメラビューが変更されました(チェイスビュー、カスタムビューなど)。.)<7482><4649> | |
IS_PEN | ペナルティが与えられたかクリートされた | 情報 |
IS_TOC | プレイヤーが別の車を引き継いだ(ドライバースワップ) | 情報 |
IS_FLG | プレイヤー表示フラグ(黄色または青) | 情報 |
IS_PFL | プレイヤーフラグが変更されました(オートギア、オートクラッチなど。.)<7482><4649> | |
IS_FIN | 選手フィニッシュレース(クロスフィニッシュライン) | 情報 |
IS_RES | プレイヤーの結果が授与され、完了が確認されました | 情報 |
IS_REO | スタートグリッドの並べ替え | 両方 |
オートクロス | ||
IS_AXI | オートクロスレイアウトがロードされました | 情報 |
IS_AXO | プレイヤーヒットautocrossオブジェクト | 情報 |
IS_OCO | は、特定のorを上書きするために使用できます すべてのスタートライト | 命令 |
IS_UCO | は、InSimチェックポイントとサークルに関する情報を送信します | 情報 |
車の追跡 | ||
IS_NLP | 選手の現在のノード、ラップ、レース位置 | 情報 |
IS_MCI | IS_NLPのより詳細なバージョン、世界座標、速度、角度、見出し | 情報 |
カメラ制御 | ||
IS_SCC | 見た車を設定し、カメラを選択 | 命令 |
IS_CPP | フルカメラ位置を設定 | 命令 |
再生制御 | ||
IS_RIP | リプレイをロードし、特定の宛先 | 命令に移動します |
スクリーンショット | ||
IS_SSH | スクリーンショットを撮る | 命令 |
InSimボタン | ||
IS_BFN | ボタンまたはすべてのボタンを削除する | 命令 |
IS_BTN | ボタンを画面に送信する | 命令 |
IS_BTC | ボタンがクリックされたときに送信されます | 情報 |
IS_BTT | テキストが入力されたときに送信されます | 情報 |