問題タブ [mud]
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.
sockets - select.select() が MUD サーバーでブロックされるべきではないときにブロックされる
非ブロッキング telnet スタイルのソケット プログラミングにminiboa ライブラリを使用しています。
ライブラリには、単純なチャット サーバーのデモが含まれています。
行 809 のpoll()
関数で、システムはselect.select()
関数を使用します。miniboa.py ファイルでデモ サーバーを実行すると、サーバーはこの関数をブロックしません。それは実行され、ビートをスキップすることなく続行されます。
私はまさにそのコードに基づいたネットワーキング コードで MUD を作成していますが、私の MUD サーバー (以下のリンクを参照) では、サーバーはそのまったく同じ呼び出しを毎回ブロックします。
MUD のnetwork.pyライブラリの 68 行目で、サーバーがpoll()
関数を実行します。これは単純なチャット サーバーで実行される関数と同じですが、MUD サーバーで実行される場合はselect.select()
呼び出しがブロックされます。
ブロックしている理由はわかりませんが、ブロックしていて、ユーザーがデータを送信するまでループは繰り返されません。誰も何も送信しない場合、サーバーはただ待機します。
なぜこれが考えられるのか誰にも分かりますか?コードに関する質問には喜んでお答えします。また、コードはオープンソースなので、必要に応じてすべてのコードを確認し、操作することができます。
皆様のご協力をお願いいたします。何年も前に子供の頃に初めて MUD をプレイして以来、私は MUD を作成することを夢見てきました。このバグが解決されるまで、作業を続けることを恐れています。このバグを修正するまで、サーバーは正常に動作しません。
TL;DR:
select.select()
クライアントの入力を待機している間、サーバーが関数内でスタックしますが、そこで一時停止することは想定されていません。ブロックする理由がわかりません。
python - MySQL と Python - ユーザー入力でエントリをチェックする方法は?
基本的な MUD を作成していて、それを MySQL データベースに保存/ロードする必要があります。最初のコマンドとして、「キャラクターはいますか?」というイニシャルが必要です。プロンプト、「いいえ」の部分が整理され、データベースに正常に保存されます。ただし、「はい」の部分に問題があります。具体的には、ユーザー入力に対して特定のエントリがないかDBをチェックして、それが存在することを確認し、結果としてデータをロードします。
これが私の現在のコードです:
エラーはありません。最初のifステートメントから2番目のステートメントに移動し、「新しい」名前を保存します(ただし、エントリが既に存在するため、データベースは変更されません)
javascript - Node.js モジュールのサンドボックス化 - 実行できますか?
私は Node.js を学んでおり (-awesome-)、それを使用して次世代の MUD (オンライン テキスト ベースのゲーム) を作成するというアイデアをいじっています。このようなゲームでは、さまざまなコマンド、スキル、呪文などを使用して悪者を倒し、何百もの部屋や場所を走り回って探索します。一般的に言えば、これらの機能はかなり静的です。通常、新しい呪文を作成したり、新しい部屋を構築したりすることはできません。ただし、スペルや部屋などを定義するコードをユーザーが編集できる MUD を作成したいと考えています。
これには明らかなセキュリティ上の懸念があります。悪意のあるユーザーは、たとえば、子プロセス「rm -r /」をフォークする JS をアップロードする可能性があります。私はゲームの内部を保護することにはあまり関心がありません (可能な限りセキュリティを確保していますが、すべてが公開されている言語でできることは限られています)。私は常にコードの変更を wiki スタイルで追跡し、サーバーをクラッシュさせたり、9000 を超えるパワーを上げたりするユーザーを罰することができます。しかし、サーバーの OS をしっかりと保護したいと考えています。
私は同様の質問に対する他の SO の回答を調べましたが、ほとんどの人はサンドボックス バージョンの Node.js を実行することを提案しています。ファイルシステム、システムコマンド、機密性の高いコアモジュールなどと対話する必要があるMUDのエンジンと対話するためにユーザー定義のJSが必要なため、これは私の状況では機能しません(少なくともうまくいきません)。仮説的には、これらすべてのトランザクションをエンジンで JSON エンコードし、サンドボックス化されたプロセスに送信して処理し、JSON 経由でエンジンに返すことができます。別のプロセスに渡されます。同期であることは言うまでもありませんが、これは避けたいと思います。
したがって、単一の Node モジュールを「サンドボックス化」する方法があるかどうか疑問に思っています。私の考えでは、そのようなサンドボックスは単に「require」機能を無効にする必要があり、すべてが至福になるでしょう。それで、Google/SO で何も見つからなかったので、自分で質問することにしました。
ruby - em-simple_telnet.rb エラー 'pause_and_wait_for_result'
MUDクライアントに対しては、telnet を使用しています。
Apache のように天気を取得しようとしていますが、このエラーはおそらく、em-simple_telnet APIを正しく使用していないことが原因のようです。
エラー:
コード:
以下は、気象サービスとの telnet セッションです。
c++ - 警告: 配列の添え字が配列の範囲を超えています [-Warray-bounds]
警告をスローする次のコードに問題があり、あなたが助けてくれることを願っています:
DICE_NUMBER
私のヘッダーファイルでは0として定義されています。
明らかに、0 は配列のサイズを超えていません。
配列は次のように定義されます。
0 は明らかに配列の境界内にあるため、なぜこれを行うのかまったくわかりません。私のエンジン コードの半分は現在、これらの配列バインド エラーをスローしています。約 30 個ありますが、どれも意味がありません。
make からの出力は次のとおりです。
それも起こります:
と
私のヘッダーファイルの定義:
そうなることはわかっていますが(今になって気づいたのですDICE_BONUS
が)、なぜそうなのかは一生わかりませんDICE_NUMBER
。
ああ。問題は、そこにある 3 番目の整数出力がfprintf
別DICE_BONUS
の行にあることです。コンパイラが について警告していると思いましたがDICE_NUMBER
、BONUS について警告していました。
python - テキストベースの Python ゲームにインターネット経由でユーザーがアクセスできるようにするために、何をする必要がありますか / 学ぶ必要がありますか?
テキストベースのゲームを作ることでPythonを学んでいます。このゲームをオンラインにするにはどうすればよいですか? 明らかに、それは非常に開発が進んでおらず、プレイすることさえできません。しかし、正しい方向に進んで学ぶことができるように、早い段階で知りたかっただけです。
c++ - MySQL データベースとメモリ間のエンティティの永続性
まず、私の実際の質問
マップに共有ポインターがあります。マップ自体に共有ポインター以外の参照がない場合、その共有ポインターをマップから削除したいので、ターゲットが解放されます。これどうやってするの?または、私の問題を解決するためのより良い設計は何ですか?
以下の背景:
懐かしさから、MySQL バックエンドを使用して C++ で MUD エンジンを作成しています。私は現在、エンティティ (このコンテキストではアカウント、キャラクターなど) を永続化する段階にいます。これを実装する最善の方法を見つけるのに少し苦労しており、アドバイスを求めることにしました。
私の現在の永続化アーキテクチャは次のようになります。例としてキャラクターを取り上げます
文字エンティティ -> 文字ストレージ -> 文字永続性 -> MySQL
文字エンティティは文字自体を指し、MVC のモデルに似ています。データ以外は何も持っておらず、他のエンティティについてのみ知っています。
キャラクター ストレージは、現在、キャラクター エンティティのインスタンスをメモリに保持する役割を果たしているコンテナーです。ID または名前で文字を検索する要求が行われると、UUID を含む std::string の std::shared_ptr へのマップとして実装されているメモリがチェックされます。インスタンスがすでにメモリ内にある場合は、共有ポインターを返します。そうでない場合は、永続レイヤーにそれを要求し、それをマップに格納してから共有ポインターを渡します。
永続層は抽象的で、mysql_character_persistence の具体的な実装を持つ character_persistence インターフェイスがあるため、さまざまな形式の永続性に簡単に切り替えることができました。
c++ - C/C++ MUD コードでの asm volatile の問題
私は友人と趣味のプロジェクトとして古い MUD コードベースに取り組んでいますが、debian 以外の OS (具体的には x386) でコードをコンパイルするのに問題があります。この問題は (主に) 私が正直に言って変更するほど十分に理解していないいくつかの asm 行が原因です。VS でコンパイルしようとしたときに受け取るエラーは、「エラー c2059: 構文エラー」29 行目です。これを x64 OS でコンパイルする方法について何か考えはありますか?