Skip to content

কমান্ড রেকর্ড ও রিপ্লে (Command Record / Replay) ​

cmclient কমান্ড রিপ্লে পোর্ট (পঞ্চম ব্যাচ, কমিট f113acce28)। cmclient-এর কমান্ড অবজেক্ট লেয়ার পোর্ট করা হয়নি——সরাসরি jrpm-এর নিজস্ব কমান্ড সিরিয়ালাইজেশন পরিকাঠামো (DynBaseCommandContainer) ব্যবহার করে, "কমান্ড অবজেক্ট লেয়ার" পুরোপুরি বাইপাস করা হয়েছে।

কনসোল কমান্ড ​

cmdrecord [start [file]]    # রেকর্ডিং শুরু (ডিফল্ট ফাইল cmdrecord.jrcm, ব্যক্তিগত ডিরেক্টরিতে সংরক্ষিত)
cmdrecord stop              # বন্ধ (১০ টিক দেরি করে কমান্ড কিউ খালি হওয়ার পর ডিস্কে লেখে)
cmdreplay <file>            # রিপ্লে: ডিসিরিয়ালাইজ করে প্রতিটি কমান্ড তাৎক্ষণিকভাবে নির্বাহ করে

বাস্তবায়ন পয়েন্ট ​

  • রেকর্ডিং হুক: CommandRecordLog DoCommandPInternal-এর কমান্ড নির্বাহের পরে সংযুক্ত——এটি লোকাল, নেটওয়ার্ক ও রিপ্লে কমান্ডের একমাত্র প্রকৃত নির্বাহ বিন্দু, পুনরাবৃত্তি রেকর্ডিং হবে না।
  • সিরিয়ালাইজেশন: cmd / tile / error_msg / payload / company DynBaseCommandContainer::Serialise ব্যবহার করে ক্ষতিহীন সিরিয়ালাইজড; ফাইল ফরম্যাট JRCM magic + version + count + এন্ট্রি।
  • বিলম্বিত বন্ধ: cmdrecord stop ১০ টিক বিলম্ব চিহ্নিত করে, StateGameLoop প্রতি ফ্রেমে চেক করে (CommandRecordTick) নিশ্চিত করে যে ইতিমধ্যে সারিবদ্ধ কমান্ডও ক্যাপচার হয়েছে তারপর ফ্লাশ।
  • রিপ্লে নির্বাহ: প্রতিটি কমান্ড সার্ভার কমান্ড পাথ (DCIF_NETWORK_COMMAND) দিয়ে তাৎক্ষণিকভাবে নির্বাহ করা হয়, রিপ্লে ফাইলের কাউন্ট হেডার আপডেট না হলেও প্রকৃত ডেটা অনুযায়ী পড়া যায়।

যাচাইকরণ ​

ডেডিকেটেড সার্ভার E2E: রেকর্ড pause → ২৬ বাইট রেকর্ড ফাইল → নতুন ম্যাপে রিপ্লে → Game paused (manual) + Replay finished: 1 executed, 0 failed।

সাধারণ ব্যবহার ​

cmdrecord start build1     # রেকর্ডিং শুরু
# ... গেমে রেল铺设, স্টেশন নির্মাণ ...
cmdrecord stop             # বন্ধ ও ডিস্কে লেখা
# ম্যাপ পরিবর্তন বা ক্র্যাশ পুনরুদ্ধারের পর:
cmdreplay build1           # এক ক্লিকে সব অপারেশন পুনর্নির্মাণ