問題タブ [crysis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - メッセージのフォーマットが間違っている
テキスト ブロックをユーザーのゲーム コンソール (Crysis Wars) に送信する次のコードがあります。
しかし、私はこの結果を得ます:
この問題は Crysis Wars の開発者コミュニティを実質的に悩ませており、これに対する実際の解決策はありませんでした。Lua から C++ へではなく、C++ から直接実行した場合、コードの形式は問題ないため、これは Lua 側の問題に違いありません。
メッセージの間隔を 1 ミリ秒に設定しようとしましたが、その結果、いくつかのメッセージが失われました (おそらく、最近のメッセージが古いメッセージを上書きするためです)。この問題に対する提案や解決策はありますか? 実用的なソリューションを提供すれば、Crysis Wars 開発者コミュニティ内でかなり有名になるでしょう。かなり厄介なバグを解決したことになるからです :)。私の評判の一部を提供したいと思いますが、残念ながら今朝、別の問題を解決した人に報奨金を授与しました。
メッセージを送信するための関数コード:
これが何かに役立つ場合は、C++ SendConsoleMessage コードを次に示します。
編集:
これは、中央揃えに使用されるテキストとは関係がないこと、および以下の画像とテキスト ブロックは例としてのみ提供されていることに注意してください。この問題は、送信されるすべてのコードで発生します。
lua - コンテンツを追加するときにテーブルが空です
テーブル (Lua) にコンテンツを追加すると、テーブル内のすべてのコンテンツが突然消えるという大きな問題が発生します。問題のテーブルは禁止リスト (現在 608 エントリ) のデータを保持し、 table.insert を使用してテーブル内に配置されますが、ユーザーのリード エントリはUmbra.Banlist[profileId] = {};として行われます。. Umbra.Banlist [profileId] = {}; テーブルのみは、Umbra.Banlist テーブル内にコンテンツがあることを意味する必要があります。コードの実行時および使用時にエラーは発生しません
私はこれを得る:
Webやこちらのサイトで調べましたが、関連する質問がないようですので、こちらに投稿させていただきます。
このコードは Crysis Wars のサーバー mod の一部ですが (以下の関数全体を参照)、手元に Lua ライブラリ全体があります (したがって、あなたの答えが問題を解決しないと思われる場合でも心配しないでください)。
コード:
編集:
プロファイルがテーブルに存在しない場合、以下のコードを出力する必要があるというメッセージが表示されないため、プロファイルは実際に存在します。
別の編集:
システムが実際に「ID」変数を取得できることの証明:
c++ - メッセージから文字列を取得する
私は Crysis Wars 用に最初の公開サーバーの変更を行っており、誰も私のコードを盗まないようにするために、可能な限り C++ ベースの DLL (代替手段は Lua) 内に配置しています。これを行うには、コマンドを DLL に入れる必要があり、その一部には追加の変数が必要です。次に例を示します。
!ban [プレイヤー名] [時間] [理由]
変数 playername、time、および reason を取得するにはどうすればよいでしょうか。これらはすべて文字の長さが異なります。reason 変数には、ピックアップする必要がある複数の単語 (「攻撃的なメッセージと不正行為」など) が含まれる場合もあります。
Lua では、これは単純な「string.match」で行われます。いつでも Lua でメッセージの並べ替えを行って、それを C++ に送り返すことができると思いますが、これにより、chatcommand システム全体が混乱する可能性があります。
「const char *msg」から変数を抽出する必要があります。これは、送信されるすべてのメッセージでシステムによって分析されます。コマンドメッセージ(「!」で始まるもの)についてはすでに分析しています。これを行う最善の方法は何ですか?
例: !ban Con 5 スパム- これにより、プレイヤー 'Confl!ct' が 5 分間キックされます (部分的な名前を識別するための部分スキャン コードは既にあります)。
!ban Con spam - プレイヤーを永久に追放します 'Confl!ct'
c++ - アプリケーションの再起動: 遅延
サーバーをリモートで再起動する再起動機能を最新の Crysis Wars サーバーの変更にコーディングしています。これは、サーバーに問題があり、単純なシステムのリロードでは解決しない場合に役立ちます。また、メモリを解放するために指定された時間にサーバーを再起動するように指示する場合にも役立ちます。
これを実現するために必要な機能をコーディングしましたが、アプリケーション自体は再起動に問題はありません。問題は、ポートがすぐに閉じられず、アプリケーションの新しいインスタンスが正しく機能しないことです。
これに対する理想的な解決策を探しています。プログラムがシャットダウンされ、すぐにではなく2秒後に起動されます。これを行うと、サーバーが使用していたポートを解放し、既存のメモリをクリーンアップするのに十分な時間が Windows に与えられます。
注意してください:他の(関連する)質問を削除しました。明らかに、プログラムポートを閉じることは、ポートが割り当てられたときにそうするように指示せずに不可能であるためです。ポートにバインドするコード。
コード (必要な場合)
c++ - 自動メール送信者
ゲームサーバーのミリ秒統計を送信する自動電子メール送信者を構築しようとしています。また、潜在的な詐欺師や問題についてサーバー管理者に通知するためにも使用されます。サーバーの変更は現在 C++ DLL ですが、経験を積んだ後、GUI 専用のサーバー アプリケーションを作成するつもりです。
電子メールは 5 時間ごとに 1 回送信されます (サーバー管理者は構成設定でこれを変更できます)。また、プレイヤーが報告され、メンバーが追加されたとき (サーバー内の権限を取得するため) に送信されます。
Google で簡単に調べてみましたが、このための外部ライブラリしか見つかりません。サードパーティのライブラリを追加せずにメールを送信することはできますか? また、要件はどうなりますか?DLL を使用するアプリケーションは、Windows Server 2008 (または Windows 7) 以降で実行され、さまざまな種類のインターネットで実行できます。
これは、SMTP サーバーがインストールされていなくても実行できますか?
c++ - 文字セットの出現回数をカウントし、文字列からスペースを減算します
問題については、下の最初の画像を参照してください。テキストの 1 行目は正しく配置されていますが、2 行目は正しく配置されていません。
数か月前、ゲームサーバーの変更のためにテキストをコンソール上で適切に処理するために、テキストを文字列の中央に配置するコードを書きました。このコードは非常にうまく機能しますが、2 つの大きな問題があります。
実際のコンソールの 112 文字の制限を超えると、ゲームサーバーがクラッシュします (この問題は、通常のコンソール メッセージでは発生しません)。
テキストで色を使用すると、文字列がカラー コードごとに 2 文字ずつ右にシフトします。
私は 2 番目の問題を解決しようとしています (ただし、最初の問題を解決すると大きなメリットがあります) が、これを行う方法がわかりません。これはテキストに色を付けるために必要なため、単純に色分けを取り除くことはできません。
選択できる 9 つの色の種類がなければ、このコードは単純かもしれません。
場合によっては通常の文字として使用されるため、「$」も単純に探したくありません。
スペースを挿入するときに $1-$9 を無視することは可能ですか? もしそうなら、私はこれにどのようにアプローチしますか?
コード
例
仕事をしているため、現在開発用 PC にアクセスできません。この問題が解決されていない場合は、数時間後に戻ってきたときにスクリーンショットを投稿します。
Lua からの発信者:
これは、どのように見えるべきかを示しています。メッセージは、長さが 80 文字未満の場合にのみ適切に機能します。
c++ - プロセス保護
私は Crysis Wars と呼ばれる PC ゲームのプログラムを作成していますが、最近、プレイヤーから、かなり皮肉なスクリプト エラーを含む問題を修正するために、新しいゲームの更新 (コミュニティ パッチ) を求める声が絶えず寄せられています。
Infinium、Gamg、Annihilator、Longpoke として知られるいくつかのゲーム ハックがあり、DLL インジェクション メソッドに依存して、内部のアンチチート システムに気づかれることなくゲーム内にハックとチートを配置します。これらのハッキングは非常に単純で、16 進値の変更を通じてメイン ゲーム DLL のコードを悪用します。一部 (Gamg など) はゲーム エンジン独自の SDK で作成されます (このハックの作成者を知っています)。
他の人たちと同じように、私は CryEngine 2 (ゲーム エンジン) SDK (メイン ゲーム dll のソース コードを含む) にアクセスでき、すべてのゲーム機能 (クライアントとサーバーの両方) の名前と場所を変更して、既存のハックはもう機能しません。
これは、メイン ゲームの dll の 16 進値を変更するハッキングを阻止するために機能しますか? SDKで作ったハックが機能しなくなることは確認していますが、手間がかかるので他の人に確認したいです。
基本的に、私が求めていること:
ハッカーはソース コードを変更することでゲーム内の DLL を悪用しています。ソース コード内のすべての関数を変更し、(新しいソース コードをリリースせずに) ゲームの (コミュニティ) アップデートを発行した場合、ハッカーは問題なく同じハック?
これが紛らわしいと思われる場合はお詫び申し上げます。より明確にする必要がある場合は、おっしゃってください。
c++ - CLI からの GUI ウィンドウ
コマンドラインで実行するサーバー アプリケーションがありますが、ユーザーがサーバー プログラムと対話しやすくするために、GUI フロントエンドを作成したいと考えています。実際のメイン アプリケーション *.exe ファイルのソース コードがないため、サーバー DLL (これはゲームサーバー用です) を使用するしか方法がありません。この DLL はホスト アプリケーションによってサポートされています。
私が考えている GUI は、診断メッセージ、プレイヤー名 (および統計)、およびサーバーのメモリ使用量を表示します。多くのユーザーは、CLI は難しすぎると言っており、このゲームサーバー アプリケーションを使用してサーバーをホストするのは難しすぎると感じています。
DLL からだけで、CLI サーバー アプリケーション用のインタラクティブなフロントエンドを作成することは可能ですか? それとも、サーバー アプリケーションから何らかの方法で統計情報を読み取るまったく新しいプログラムを作成する必要がありますか?
Google を簡単に調べたところ、GUI ウィンドウ内に CLI を配置する方法しか見つかりませんでした。その逆ではありません。明確にするために、サーバー アプリケーションを制御するための 2 つ目のウィンドウを生成したいと考えています。CLI を完全になくしたくはありません。