InSim

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 テキストが入力されたときに送信されます 情報

コメントを残す

メールアドレスが公開されることはありません。