تبلیغات

آموزش برنامه نویسی و ساخت مود GTA V – بخش اول

آموزش برنامه نویسی و ساخت مود GTA V

آموزش برنامه نویسی و ساخت مود GTA V
بخش اول


به جرئت می‌توان گفت که سری بازی‌های GTA و به خصوص GTA V، اولین و یا حتی تنهاترین بازی تا به امروز است که امکان ساخت مود، به این گستردگی را دارد! و البته این احتمالا از سیاست‌های شرکت تولیدکننده‌ی بازی (راک استار) می‌باشد که چنین قابلیتی را برای بازی خود قرار داده است؛ اگرچه در این خصوص اطلاعات زیادی نداریم.

مقدمه‌ای بر برنامه‌نویسی GTA V

ساخت مود GTA V، کار ساده‌ای نیست و نیاز به دانش برنامه‌نویسی بالایی دارد و همچنین روش‌های مختلفی برای ساخت مود GTA V وجود دارند؛ از زبان برنامه‌نویسی C++ گرفته تا LUA و …؛ اما چیزی که ما قصد داریم مودنویسی را در بستر آن آموزش دهیم، در حال حاظر زبان برنامه‌نویسی سی شارپ می‌باشد. ما از سی شارپ و به کمک کتابخانه‌ی «Script Hook V .NET» و …، مودهایمان را توسعه خواهیم داد. بنابراین آشنایی شما به سی‌شارپ از مقدمات این دوره می‌باشد. و همچنین قبل از شروع این دوره، بهتر است ابتدا با روش راه‌اندازی محیط نصب مود در GTA V آشنا شوید. «اینجا کلیک کنید»

کتابخانه‌ی Script Hook V .NET، هم فایل cs یا vb و هم dll اجرا می‌کند. در نتیجه شما به جای کامپایل کد خود در ویژوال استودیو و قرار دادن خروجی dll در پوشه‌ی scripts، می‌توانید مستقیما یک فایل متنی cs در پوشه‌ی scripts و محل نصب بازی ایجاد کرده و با نوت پد ساده و بدون نیاز به ویژوال استودیو، در آن کدتان را بنویسید. که البته در این‌صورت اگر بخواهید مود خودتان را به اشتراک بگذارید، همه می‌توانند با یک نوت‌پد ساده، به کد شما دسترسی داشته و آن را ویرایش کنند که خب باز هم روش‌هایی برای به هم زدن کد و ناخوانا کردن آن وجود دارد. (البته شما فعلا یه مود ساده بسازین تا بعد :D)

پیش نیازها

پیشنهاد ما صددرصد استفاده از ویژوال استودیو بوده و شما می‌توانید نسخه 2015 یا 2017 آن را نصب کنید. و در حال حاظر، آخرین نسخه‌ی «Script Hook V .Net» ازدات نت فریم ورک 7 به بالا استفاده می‌کند. پس این نسخه باید حتما روی سیستم شما نصب شده باشد. و همچنین، در ویژوال استودیو نیز می‌توانید پروژه‌ی خود را برروی این نسخه تنظیم کنید تا به درستی کار کند.

ایجاد اولین پروژه

ایجاد پروژه در ویژوال استودیو به صورت خلاصه

1- ویژوال استودیو را اجرا کنید.

2- یک پروژه‌ی سی شارپ، از نوع «Class Library» ایجاد کنید. (تا یک فایل DLL بسازیم)

3- از بخش «Solution Explorer» روی «References» راست کلیک کرده و سپس «Add Reference» را انتخاب کنید. حالا از بخش «Browse»، فایل‌های «ScriptHookVDotNet2.dll» و «NativeUI.dll» را اضافه و تیکشان را فعال کنید. در نهایت از بخش «Assembilies» نیز فایل «System.Windows.Forms.dll» (که برای خود دات نت فریم ورک می‌باشد) را فعال کنید.

4- همانطور که باید بدانید، پس از «Run» کردن پروژه (یا کلیک روی گزینه‌ی Build Solusion در منوی Build)، بایستی خروجی «dll» در مسیر «bin» پروژه و سپس «Debug» یا «Release» قرار گرفته باشد؛ که این بستگی به حالت خروجی پروژه شما دارد.

5- شما پس از نوشتن کد خود بایستی فایل «dll» را به پوشه «scripts» در محل نصب بازی انتقال دهید.


ایجاد پروژه در نوت پد

  • به پوشه‌ی «scripts» در مسیر نصب بازی «GTA V» بروید.
  • یک فایل با فرمت «cs» و با نام دلخواه ایجاد کنید.
  • آن را با «Notepad++» باز کنید.
این موارد را طبیعتا باید در پیش‌نیازهای خود داشته باشید و وظیفه‌ی ما نیست که آن‌ها را آموزش دهیم! چرا که هدف این مقاله آموزش ساخت مود با زبان سی‌شارپ بوده و خود زبان سی‌‍‌شارپ برای خود مبحث جدایی می‌باشد.

یک کلاس GTA V

موارد مهم یک کلاس مختص GTA V را در ادامه شرح خواهیم داد.

در هر پروژه‌ای، ابتدا بایستی فضاهای نامی زیر را وارد کنید:


کلاسی که در بازی اجرا می‌شود، باید از کلاس «Script» داخل «GTA.Script» ارث‌بری کند. در واقع ما باید حداقل یک کلاس داشته باشیم که از «Script» ارث‌بری کرده باشد و آن کلاس، نقطه‌ی شروع مود ما خواهد بود و به هنگام اجرای بازی، نمونه‌ای از آن کلاس ساخته خواهد شد. و البته ممکن است ما کلاس‌های دیگری نیز داشته باشیم که از آن‌ها در همین کلاس ارث‌بری شده از «Script» استفاده کنیم و طبیعتا آن‌ها نیازی به ارث‌بری کردن از «Script» ندارند!

کلاس «Script»، سه رویداد «Tick» و «KeyDown» و «KeyUp» را برایمان فراهم می‌کند. که هرکدام را نیاز داشتیم، می‌توانیم داخل متد سازنده‌ی کلاسمان پیاده‌سازی کنیم. و حالا فرض کنید اسم کلاس ما، «FuLLKade» می‌باشد؛ بنابراین به صورت زیر، قالب اصلی خود را می‌نویسیم:

رویداد Tick: این رویداد در هر فریم از بازی اجرا می‌شود! (چنانچه با موتور بازی سازی یونیتی کار کرده باشید، درک این رویداد کار ساده‌ای است و این رویداد حکم رویداد «Update» در یونیتی را دارد.)


رویداد KeyDown: این رویداد زمانی که دکمه‌ای از روی کیبورد فشرده شود، اجرا خواهد شد. البته احتمالا دکمه‌های «Gamepad» را نیز پردازش کند که تست نکرده‌ایم. همچنین اگر انگشت خود را روی کلیدی نگه داشته و رها نکنید، رویداد «KeyDown»  پشت سرهم اجرا خواهد شد تا زمانی که انگشت خود را رها کنیم!


رویداد KeyUp: این رویداد زمانی که دکمه‌ای از روی کیبورد فشرده و سپس رها شود اجرا خواهد شد. (یعنی دکمه‌ی پایین رفته، بالا بیاید و از حالت فشرده شده رها شود)! البته احتمالا دکمه‌های «Gamepad» را نیز پردازش کند که تست نکرده‌ایم. حالت رها شدن کلید تنها یک بار رخ می‌دهد و برای دوباره رخ دادن آن بایستی کلید را فشرده و رها کنیم! بنابراین انتظار نمی‌رود که این رویداد پشت سرهم و همانند «KeyDown» اجرا شود.

بنابراین بدیهی است که اولویت اجرایی رویداد KeyDown، نسبت به KeyUp بالاتر است. اما نکته مهم این است که اولویت اجرایی هردو نسبت به Tick بالاتر است.

یک مثال ساده‌ی ساده

در این مثال، با فشار دادن کلید 0 ، می‌توانید یک ماشین ظاهر کنید.

کلید «0» نامپد (کلیدهای سمت راست کیبورد) را از طریق آبجکت «e» و همانند خود دات‌نت فریم ورک، در رویداد «KeyDown» دریافت و پردازش می‌کنیم. در واقع هر برنامه‌نویس دات‌‎نتی با این نکته آشنا است که آبجکت «KeyEventArgs» که به داخل رویداد ارسال می‌شود، شامل اطلاعات دکمه‌ی فشرده شد می‌باشد.


حالا از آنجایی که می‌خواهیم یک ماشین در محیط بازی ایجاد کنیم، بنابراین کلاسی با نام «World» وجود دارد که به جهان بازی یا دنیای بازی اشاره می‌کند. و این کلاس، متد استاتیکی به نام «CreateVehicle» دارد که برای ایجاد یک وسیله‌ی نقلیه در دنیای بازی از آن استفاده می‌شود. خروجی این متد نیز از نوع کلاس «Vehicle» (وسیله‌ی نقلیه) خواهد بود. و اما ورودی‌های این متد:

  • پارامتر اول (model از جنس Model) مدل وسیله‌‌ی نقلیه‌ای که می‌خواهیم در محیط بازی ایجاد شود؛ همچنین همه‌ی مدل‌های بازی داخل کلاس «VehicleHash» قرار دارند.
    ما در این مثال، وسیله‌ی نقلیه‌ی «Adder» را انتخاب کرده‌ایم.
  • پارامتر دوم (position از جنس Vector3) مکانی که ماشین در آن‌جا ظاهر می‌شود. این مکان، از نوع کلاس «Vector3» بوده که مربوط به یک بردار سه‌بعدی می‌باشد و شامل نقاط x، y و z است! یعنی محل نقطه از نظر بردار x,y,z؛ و همچنین واحد آن نیز برابر متر است.
    ما در این مثال گفته‌ایم که ماشین، سه متر جلوتر از مکان فعلی کاراکتر ظاهر شود. البته در مورد کلاس «Game» و ادامه‌ی آن در بند بعدی توضیح خواهیم داد که چطور این سه متر جلوتر از مکان فعلی کاراکتر را نوشته‌ایم.
  • پارامتر سوم (heading از جنس float) در مورد این ورودی در آینده توضیح خواهم داد.

کلاس «Game» که از نام آن پیداست، مربوط به مواردی در بازی فعلی می‌باشد. ما از طریق این کلاس، می‌توانیم به آبجکت «بازیکن فعلی» که گیمر در حال کنترل آن بوده و از جنس کلاس «Player» می‌باشد، دسترسی داشته باشیم. و سپس از طریق بازیکن می‌توانیم به کاراکتر بازیکن که می‌تواند یکی از شخصیت‌های مایکل، فرانکلین، ترور و … که از جنس کلاس «Ped» هست دسترسی داشته باشیم. توجه داشته باشید که «Player» ماهیت بازیکن بوده و «Character» نیز جسم و فیزیک آن می‌باشد. و بدین دلیل در ورودی دوم متد «CreateVehicle»، از «Game.Player.Character» استفاده کرده‌ایم تا به ویژگی «Position» آن دسترسی داشته باشیم. همچنین ویژگی «Position» نیز از جنس کلاس «Vector3» بوده و دربرگیرنده‌ی محل فعلی (موقعیت مکانی) کاراکتر در محیط بازی می‌باشد.

لازم به ذکر است که گفته شود کلاس Ped، یک کلاسی مربوط به ماهیت موجودات زنده می‌باشد.

ویژگی «ForwardVector» داخل «Ped» یا کاراکتر نیز از جنس Vector3 است! اما مگر به جز موقعیت مکانی یک کاراکتر، چه چیز دیگری می‌تواند وجود داشته باشد؟! ابتدا توجه داشته باشید که ما نمی‌توانیم ماشین فعلی را در نقطه‌ای که کاراکتر ایستاده است ظاهر کنیم! چرا که منطقی نیست! و در مثال بالا گفته شد که ماشین سه متر جلوتر از کاراکتر ظاهر شود! و با این حساب شاید متوجه شده باشید که «ForwardVector» یعنی چه! بله درست است. این ویژگی، به برداری اطلاق می‌شود که جهت کاراکتر (رو به روی کاراکتر) در آن سمت قرار دارد! بنابراین ما با ضرب عدد سه در این بردار، آن را سه متر جلوتر از روبه‌روی کاراکتر قرار می‌دهیم تا ماشین در آن نقطه ایجاد شود.


طبیعتا با اجرای متد، ماشین در محیط ایجاد خواهد شد! اما ما می‌توانیم خروجی متد را گرفته و تغییراتی روی ماشین انجام دهیم!

ویژگی «CustomPrimaryColor» آبجکت «Vehicle»، شامل رنگ اصلی ماشین می‌باشد که بیشترین قسمت رنگ ماشین را تشکیل می‌دهد. این ویژگی از جنس کلاس «Color» دات‌نت است. و ویژگی «CustomSecondaryColor» نیز شامل رنگ فرعی ماشین می‌باشد که ممکن است به خطوط روی ماشین و برخی قسمت‌های دیگر آن اطلاق شود.

کلاس «Color» که بایستی خودتان از قبل با آن آشنا باشید (چرا که مربوط به دات‌نت فریم‌ورک است)، شامل متدی به نام «FromArgb» می‌باشد و با استفاده از آن می‌توان رنگی را از طریق مقداردهی «RGB» تولید کرد. و البته می‌توان از ویژگی‌های کلاس «Color»، مثل ویژگی «Green»، برای گرفتن رنگ‌های اصلی استفاده کرد.

چنانچه با ویژوال استودیو کار می‌کنید، ممکن است کلاس «Color» شناسایی نشود، در این صورت از «References»، فضای نامی «System.Drawing» را اضافه کنید.

اعمال تغییرات بدون خروج از بازی

طبیعتا این برایتان سوال شده است که آیا باید پس از هربار خروجی گرفتن از کارمان، بازی را بسته و دوباره اجرا کنیم؟! خیر! درمورد مودهایی که در پوشه‌ی «scripts» قرار می‌گیرند این نگرانی وجود ندارد و تنها مودهای «ASI» اینگونه هستند! اما چطور می‌توان بدون اجرای مجدد بازی، تغییرات را اعمال کرد؟!

راه حال آن در «Script Hook V» قرار داده شده است و شما به سادگی می‌توانید این کار را انجام دهید.

  1. در محیط بازی «Alt + Tab» را فشار دهید تا منوی برنامه‌های در حال اجرا نمایش داده شود.
    می‌توانید از دکمه‌ی پرچم نیز برای رفتن به محیط ویندوز استفاده کنید. (چنانچه دکمه پرچم کار نکرد، «Alt +Enter» را فشار دهید تا پنجره‌ی بازی کوچک شود.)
  2. کدتان را ویرایش کنید.
  3. نسخه جدید کدتان را بعد از خروجی گرفتن به پوشه «scripts» انتقال دهید.
    البته اگر فایل «cs» یا «vb» باشد، می‌توانید در همان مسیری که قبلا کپی کرده‌اید، آن را  ویرایش کنید تا دیگر نیازی به کپی نباشد. (ذخیره کردن کد بعد ویرایش هم یادتان نرود.)
  4. به بازی برگردید.
  5. دکمه «Insert» را از روی کیبورد فشار دهید تا اسکریپت‌ها دوباره بارگزاری شوند.
    در برخی کیبوردها ممکن است دکمه‌ی «Insert» با دکمه‌ی دیگری مثل «Delete» و به عنوان کلید دوم آن دکمه تعیین شده باشد؛ که می‌توانید «Shift» را گرفته و سپس دکمه مورد نظر را فشار دهید.

موفق و پیروز باشید. تا درس بعد… 🙂

درس بعدی
تبلیغات
7 نظر
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس / مدیر فول کده

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده 7 دیدگاه