ایجاد سرور بازی Tremulous و افزودن bot ها

این ادامه نوشته قبلی است؛ بازی Tremulous از دو بخش سرور (سرویس‌دهنده) و سلاینت (سرویس‌گیرنده) تشکیل شده است، برای شروع بازی Tremulous ابتدا یک سرور باید راه‌اندازی و اجرا شود و سپس توسط یک سلاینت به آن سرور وصل شویم تا بتوان بازی کرد. نحوه راه‌اندازی و اجرای سرور بازی Tremulous بسادگی نوشتن دستور tremded یا tremfusionded است تا توسط محیط آشنای بازی با انتخاب نام آن سرور به آن وصل شویم. اما اگر بخواهید در سرور راه‌اندازی شده از bot ها بتوان استفاده کرد، باید کدهای بازی را کامپایل کنید تا در نهایت، فایلی به نام game.qvm را بسازید. همانطور که قبلاً در رابطه با bot های بازی Tremulous نوشته‌ام، PathBot، بهترین bot موجود بوده و بخوبی با TremFusion هماهنگ می‌باشد.

چون می‌خواهیم از bot ها استفاده کنیم، قبل از هر چیز برنامه TremFusion را نصب کنید، روند نصب آنرا قبلاً نوشته‌ام (لطفاً آن را بخوانید). سپس باید کد منبع PathBot را دانلود و کامپایل کنید. البته برای کامپایل اجباری نیست ولی اگر می‌خواهید که تغییرات مورد نیاز خود را اعمال کنید (mode سازی) باید کامپایل کنید. دو نسخه اخیر PathBot عبارتند از 2.8 و 3.0 که متاسفانه نسخه 3.0 علارغم جدیدبودن، دارای تغییر در نوع game play بازی است و مثلاً بینهایت تیر برای اصلحه rifle در نظر گرفته شده است. بنابراین اگر می‌خواهید از PathBot 3.0 استفاده کنید بهتر است تغییرات مورد نظر خود را اعمال و سپس آن را کامپایل کنید ولی اگر می‌خواهید از PathBot 2.8 استفاده کنید احتیاج به تغییر کد منبع و کامپایل آن نخواهید داشت.

  1. با دستور mkdir ~/.tremulous/pbot_base یک دایرکتوری به نام pbot_base را در مسیر مورد نظر ایجاد کنید، دایرکتوری pbot_base می‌تواند هر نام دلخواه دیگری را داشته باشد و برای نگهداری فایل‌های مورد نیاز سرور بکار گرفته می‌شود. دایرکتوری vm را درون دایرکتوری pbot_base ایجاد کنید.
  2. یکی از دو روش زیر:
    می‌خواهم از PathBot 2.8 استفاده کنم یا قصد تغییر آن را ندارم (بدون نیاز به کامپایل).
    از این لینک فایل کامپایل‌شده نهایی را دانلود کنید، یک فایل فشرده است که در آن دو فایل game.qvm pb3 و game.qvm kiwis وجود دارد، اولی فایل کامپایل‌شده نهایی برای نسخه 3.0 و دومی برای نسخه 2.8 است، همانطور که گفتم نسخه 3.0 به شدت mode سازی شده و game play آن با حالت اصلی متفاوت است، بنابراین اگر این حالت متفاوت را دوست ندارید از همان فایل game.qvm kiwis که برای نسخه 2.8 است استفاده کنید. در نهایت از بین این دو فایل فقط باید یکی را انتخاب کنید و غیر فشرده کنید و نام آن را به game.qvm تغییر دهید. این فایل را به دایرکتوری pbot_base/vm که در مرحله قبل ایجاد کردید، انتقال دهید.
    می‌خواهم از PathBot 3.0 استفاده کنم یا قصد تغییر آن را دارم
    (کامپایل و mode سازی).
    برنامه Bazaar را نصب کنید (در دبیان بسته bzr را نصب کنید). با دستور bzr checkout https://code.launchpad.net/pbot فایلهای مربوط به آخرین تغییرات کد منبع را دانلود کنید. به مسیری که فایل‌ها دانلود شده است بروید و تغییرات دلخواه را بدهید، معمولاً تغییر فایل زیر، نیازها را برآورده می‌کند: 

    pbot/src/game/tremulous.h

    پس از اعمال تغییرات، به بالاترین شاخه یعنی pbot بروید و در جایی که فایل Makefile موجود است، دستور make را صادر کنید. فایل زیر تولید و کامپایل شده است:

    pbot/build/release-linux-x86_64/base/vm/game.qvm

    این فایل را به مسیر pbot_base/vm که در مرحله اول ایجاد کردید، انتقال دهید.

  3. از این لینک فایلهای حاوی مسیرهای نقشه‌های بازی را دانلود کنید، bot ها از مسیرهای معرفی شده در این فایلها برای حرکت در نقشه‌های مختلف کمک می‌گیرند. اطلاعات را غیر فشرده کنید و به دایرکتوری pbot_base/paths انتقال دهید. نقشه ATCS بهترین نقشه برای مبارزه با bot هاست. شما می‌توانید فایل حاوی مسیرهای هر نقشه را از داخل بازی ویرایش کنید در PathBot 3.0 گره‌های هر مسیر بصورت گرافیکی نیز نمایش داده می‌شود.
  4. همه چیز آماده است، باید کلمه عبور مدیر سرور را تعیین کنیم، فایل server.cfg را که معمولاً در دایرکتوری etc/tremulous-server قرار دارد، برای ویرایش باز کرده و عبارت set rconPassword PASSWORD را در یک خط مجزا در آن بنویسید، بجای PASSWORD کلمه عبور را مشخص کنید و فقط مدیر سرور باید به آن دسترسی داشته باشد. عبارتی بصورت set sv_maxclients X را بیابید، بجای X تعداد سلاینت‌هایی که می‌توانند به سرور وصل شوند را مشخص کنید. سپس عبارت set sv_privateclients 10 را در یک خط مجزا بنویسید، عدد 10 مشخص می‌کند که چه تعداد bot در این سرور قابل استفاده است. این عدد نباید از X بیشتر باشد و تفاضل X با این عدد، معرف تعداد افرادی است که می‌توانند از طریق شبکه به سرور شما وصل شوند.
  5. اکنون چون از TremFusion استفاده می‌کنیم، با دستور زیر سرور را راه‌اندازی می‌کنیم:
    $ tremfusionded +set fs_game pbot_base +exec server.cfg +set dedicated 1

    مقدار 1 برای متغیر dedicated در نظر گرفته شده است زیرا فرض را بر این گرفته‌ام که نمی‌خواهید سرور شما از طریق اینترنت قابل دسترسی باشد، در غیر اینصورت عدد 2 را بجای آن وارد کنید.

  6. وارد محیط بازی شوید و از قسمت لیست سرورهای local بر روی نام سرور خود (که بطور پیش‌فرض Tremulous 1.1 Server است) کلیک کنید و به آن متصل شوید.
  7. با فشردن کلید «~» کنسول را فعال سازید و دستور زیر را در آن وارد کنید:
    /rcon PASSWORD !setlevel USERNAME 5

    PASSWORD همان کلمه عبوری است که در فایل server.cfg تعیین شد. USERNAME نام مستعار شماست که در بازی تعریف کرده‌اید (برای اختصاص یک نام برای خود، در قسمت Options به تنظیمات Game بروید). با صدور این دستور، شما سطح دسترسی مدیر کل را خواهید داشت. setlevel یک دستور مدیریتی است و همه دستورهای مدیریتی با علامت «!» شروع می‌شوند. هم اکنون می‌توانید بدون احتیاج به واردکردن PASSWORD دستورهای مدیریتی که با علامت «!» شروع می‌شوند را در کنسول وارد کنید.

  8. برای کارکردن با bot ها از دستور مدیریتی bot استفاده کنید. در ادامه، شرحی از نحوه کار با این دستور را خواهید خواند.

برای افزودن یک bot جدید از دستور زیر استفاده کنید:

!bot add BOTNAME aliens|humans [SKILL]

نوشتن عبارت درون [ و ] اختیاری است. BOTNAME نامی برای bot در نظر می‌گیرد، SKILL عددی بین 1 تا 360 است و درجه سختی را معین می‌کند. بطور مثال برای افزودن یک bot به نام BOT1 و قراردادن او در تیم alien ها (بیگانه‌ها) پس از فشردن کلید «~» دستور زیر را وارد کنید:

!bot add BOT1 aliens

برای حذف هر bot بجای add عبارت delete را بنویسید، بطور مثال:

!bot del BOT1

بهرحال روشی خوب برای انجام بازی تمرینی با bot ها بدون نیاز به اتصال به اینترنت است. برای اطلاعات بیشتر و تنظیم bot ها به این صفحه و این صفحه یا این صفحه یا این صفحه یا این صفحه و … مراجعه کنید. برای رسیدن به نتایج دلخواه، باید فایل server.cfg را ویرایش کنید، کلیدهای مناسب را برای خود تنظیم (bind) کنید و یا برای هر نقشه یک آرایش (layout) خاص را آماده کنید.

TremFusion را نصب کنید.

TremFusion را می‌توان یک نسخه جدا از بازی Tremulous دانست، در حقیقت، توسعه‌دهندگان TremFusion نسخه 1.1 بازی Tremulous را به میل خود توسعه می‌دهند. از طرف دیگر، توسعه‌دهندگان بازی Tremulous در حال توسعه نسخه 1.2 هستند. در لحظه‌ای که من این نوشته را می‌نویسم، کد منبع bot های موجود با نسخه 1.2 بازی Tremulous سازگار نیستند و تنها برای نسخه 1.1 آماده شده‌اند. بنابراین اگر می‌خواهید از bot ها در بازی Tremulous استفاده کنید یا باید از نسخه 1.1 بازی Tremulous یا باید از TremFusion استفاده کنید، چون در حال حاضر، هیچ bot قابل استفاده‌ای را برای نسخه 1.2 بازی Tremulous نخواهید یافت.

برای نصب بازی TremFusion در گنو/لینوکس دبیان، ابتدا بسته‌های زیر را نصب کنید:

# apt-get install tremulous-data tremulous-server

بسته نرم‌افزاری tremulous-data حاوی داده‌ها (نقشه‌ها، محیط‌ها، texture ها، صداها و …) است که حجم این بسته بیش از ۱۰۰ مگابایت است. اما بسته نرم‌افزاری tremulous-server بسیار کم حجم بوده و چون می‌خواهیم از TremFusion استفاده کنیم، کاربرد چندانی ندارد، پس فقط آن را بخاطر فایل تنظیمات نصب می‌کنیم، اگر شما می‌دانید که چگونه سرور (سرویس‌دهنده) بازی را پیکربندی کنید، نیاز به نصب بسته tremulous-server ندارید.

اکنون به سایت رسمی TremFusion بروید و از قسمت دانلودها، نسخه 0.99r3 را برای گنو/لینوکس دبیان ۳۲بیت یا ۶۴بیت دانلود کنید. به مسیری که فایل دانلود شده است، بروید و دستور زیر را وارد کنید:

# dpkg -i tremfusion*.deb

یک مرحله دیگر باقی مانده است، دایرکتوری داده‌های بازی Tremulous که همراه با بسته نرم‌افزاری tremulous-data نصب شده است در مسیر زیر قرار دارد:

/usr/share/games/tremulous/base

و دایرکتوری داده‌های بازی TremFusion در مسیر زیر قرار دارد:

/usr/share/games/tremfusion/base

ما باید مسیر اول و مسیر دوم را به طریقی به یکدیگر ربط دهیم تا بتوان از دایرکتوری داده‌های بازی Tremulous در بازی TremFusion استفاده کرد، بنابراین دستورات زیر را وارد کنید:

# mv -i /usr/share/games/tremfusion/base /usr/share/games/tremulous/base
# rmdir /usr/share/games/tremfusion/base
# ln -s /usr/share/games/tremulous/base /usr/share/games/tremfusion

بازی TremFusion به خوبی باید کار کند، باید بتوانید به راحتی سرور (سرویس‌دهنده) بسازید یا به عنوان سرویس‌گیرنده از آن استفاده کنید.

ایجاد اتصال VPN در خط فرمان

VPN (شبکه خصوصی مجازی) امکان ایجاد یک شبکه خصوصی راه دور را میسر می‌سازد و در مقایسه با روش قدیمی پراکسی (proxy)، بسیار امن‌تر بوده و امکان شنود شخص ثالث را بسیار کمتر (تقریباً محال) می‌کند. یکی از کاربردهای VPN عبور از تحریم‌هاست. VPN ها همانگونه که می‌توانند محیط امنی را ایجاد کنند، همانگونه نیز می‌توانند محیط بسیار ناامنی باشند، بنابراین، استفاده از VPN های ناشناس می‌تواند امنیت شما را به شدت به خطر بیاندازد، بنابراین برای ورود به حساب بانکی خود (از طریق اینترنت)، به شدت محتاط باشید و هیچگاه از VPN های ناشناس استفاده نکنید، اما درصورت اجبار، به جای پروتوکل http از پروتوکل https استفاده کنید که ارتباط بسیار امن‌تری را با سایت مقصد برقرار می‌کند.

نحوه راه‌اندازی و ایجاد اتصال VPN در گنو/لینوکس و از طریق خط فرمان ساده است، قبل از هر چیز باید بسته‌های نرم‌افزاری مورد نیاز را نصب کنید:

# apt-get install pptp-linux

سپس با دستور زیر، اتصال VPN را پیکربندی کنید:

# pptpsetup --create PROVIDER --server SERVER --username USER --password PASS

PROVIDER نامی است که شما به آن اختصاص می‌دهید، هر نامی را می‌توانید به دلخواه به جای آن بنویسید.
SERVER آدرس سرویس‌دهنده VPN است، این آدرس می‌تواند بصورت آدرس IP یا بصورت نام domain نوشته شود.
USER نام کاربری شماست تا خودتان را به سرویس‌دهنده VPN شناسایی کنید.
PASS پسوردی است که بتوانید با نام کاربری USER به سرویس‌دهنده VPN متصل شوید.

مقادیر SERVER و USER و PASS را باید از سرویس‌دهنده VPN دریافت کنید. پس از اجرای دستور قبل:

  1. فایل chap-secrets با اطلاعات مورد نظر بروزرسانی می‌شود.
  2. در دایرکتوری /etc/ppp/peers/ فایلی به نام PROVIDER با همه تنظیمات مورد نیاز ایجاد می‌شود که برای استفاده از بعضی سرویس‌دهنده‌های VPN لازم است تا تنظیمات درون این فایل را نیز ویرایش کنید، اما معمولاً نیازی به این کار نیست.

هم اکنون، فایلی به نام PROVIDER را در دایرکتوری /etc/ppp/ip-up.d/ ایجاد کنید، مجوز اجرا (execution permission) به آن بدهید و خطوط زیر را در آن قرار دهید:

#!/bin/sh

if test "$PPP_IPPARAM" = "PROVIDER"
then
	route add default dev $PPP_IFACE &
fi

.
تمام! هر زمان که به اینترنت وصل هستید، با دستور pon PROVIDER ارتباط با سرویس‌دهنده VPN را برقرار کنید و با دستور poff این ارتباط را قطع کنید.

مشکل شماره ۱: من در گروه dip قرار دارم اما دستورات pon و poff فقط برای کاربر root کار می‌کنند.
حل: فایل ‪/etc/sudoers‬ را ویرایش کنید و خط زیر را در آن بنویسید:

XXX ALL=(ALL) NOPASSWD:/usr/bin/pon, (ALL) NOPASSWD:/usr/bin/poff

به جای XXX نام کاربری خود را بنویسید. ALL و NOPASSWD همانطور که هستند باید نوشته شوند.
از این به بعد با دستور sudo pon PROVIDER ارتباط با سرویس‌دهنده VPN را برقرار کنید…
… و با دستور sudo poff این ارتباط را قطع کنید.

مشکل شماره ۲: پس از اجرای دستور pon من از کجا بفهمم که به سرویس‌دهنده VPN وصل هستم؟
حل: قبلاً روش انجام اینکار را در اینجا نوشته‌ام، خوشحال می‌شوم که آن را نیز بخوانید.

نمایش سایه اجسام بر روی یک جسم نامرئی

می‌خواهم روش «نمایش سایه اجسام بر روی یک جسم نامرئی» را در برنامه بلندر توضیح بدهم اما متاسفانه عنوان گیج‌کننده‌ای شد. با یک مثال و بصورت tutorial شروع می‌کنم، در برنامه بلندر (نسخه 2.46 یا 2.49)، کلید Ctrl+X را فشار دهید تا یک پروژه جدید را آغاز کنیم. بطور پیش‌فرض یک مکعب در فضای سه‌بعدی قرار گرفته است، به چیزی دست نزنید و فقط گزینه Add -> Mesh -> Plane را انتخاب کنید تا یک صفحه در فضای سه‌بعدی اضافه شود، هم‌اکنون آن صفحه را نمی‌توانیم ببینیم زیرا در پشت مکعب مخفی‌شده است اما چون به تازگی آن را اضافه کرده‌ایم پس انتخاب شده است، بنابراین کلید S و سپس Shift+Z را فشار دهید و عدد ۲ را (به انگلیسی) وارد کنید و Enter بزنید. یکبار کلید F5 را فشار دهید، در قسمت پائین بر روی Add New کلیک کنید، سپس تنظیم مربوط به Material را بصورت زیر تغییر دهید:

با انجام اینکار، رنگ صفحه کاملاً سفید خواهد شد. در ادامه، کلید 1 از کلیدهای ماشین‌حسابی را فشار دهید تا از نمای روبرو آنها را مشاهده کنیم. سپس با کلیک راست، مکعب را انتخاب کنید و کلید G و سپس Z را فشار دهید و عدد ۱ را وارد کنید و Enter بزنید. کلید F12 را بزنید و نتیجه کار را مشاهده کنید. پس از مشاهده، آن را ببندید.

کلید F5 را دقیقاً ۳ بار فشار دهید تا پنل World buttons را مشاهده کنید، در اینجا قسمت World را بصورت زیر تنظیم کنید:

دوباره کلید F12 را فشار دهید و همانطور که ملاحظه می‌گردد، سایه مکعب بر روی صفحه زیرین قرار گرفته است اما ابعاد صفحه مضحک است:

ادامهٔ این نوشته را بخوانید

جلوگیری از integer overflow

هر نوع عددی در زبان ‪C++‬ دارای محدوده خاصی است، بطور مثال برای نوع short int اعداد می‌توانند در بازه‌ای بین ‪-32768‬ و 32767 ذخیره شوند، ولی اگر عددی از این بازه فراتر رفت؟ در اینحالت integer overflow رخ خواهد داد. بطور مثال:

short int x = 32767;
x = x + 1; //x = -32768

با توجه به این مثال، مقدار x حداکثر مقداری است که نوع short int می‌تواند ذخیره کند، اگر عدد ۱ را به این مقدار اضافه کنیم از بازه قابل قبول فراتر خواهد رفت و integer overflow رخ خواهد داد. در نتیجه مقدار x تغییر علامت داده و برابر منفی 32768 می‌گردد. برای جلوگیری از چنین تغییر علامت‌های ناگهانی و برای جلوگیری از محاسبات غلط، باید از integer overflow جلوگیری نمود. روش‌های متفاوتی برای جلوگیری از integer overflow می‌تواند مورد استفاده قرار گیرد.

از یک تابع یا کلاس کمکی استفاده کنید. تابعی ایجاد کنید تا قبل از محاسبات بررسی کند که آیا integer overflow صورت می‌گیرد یا خیر. بطور مثال تابع is_safe_add این کار را انجام می‌دهد:

short int x = 32767, y = 32767, z;
if(is_safe_add(x, y)) z = x + y;

تابع is_safe_add بررسی می‌کند که آیا نتیجهٔ جمع دو عدد x و y بدون integer overflow خواهد بود یا خیر. بنابراین در مثال قبل، هیچگاه عمل جمع صورت نخواهد گرفت زیرا این تابع، مقدار false را برخواهد گرداند. برای پیاده‌سازی تابع is_safe_add می‌توانید از چند شرط ساده برای کنترل بازه‌های اعداد x و y استفاده کنید. به جای ایجاد تابعی به نام is_safe_add می‌توانید یک کلاس جدید برای کار با نوع short int ایجاد کنید:

ShortInt x = 32767;
x = x + 1; //throw an exception

در این نمونه مثال، «عملگر +» در کلاس ShortInt سربارگذاری و پیاده‌سازی شده است تا در صورتیکه integer overflow رخ می‌دهد، یک استثناء برای توقف اجرای کدها، صادر گردد.

مقادیری که در متغیر ذخیره می‌شوند را محدود کنید. ورودی‌های کاربر را محدود کنید، تا زمانیکه مقادیر بزرگی در متغیرها ذخیره نشوند، احتمال رخ‌دادن integer overflow ممکن نیست. این روش یک مزیت نسبت به روش قبل دارد و آن این است که قبل از هر محاسبه‌ای، نیاز به بررسی احتمال وقوع integer overflow نیست. بنابراین سرعت محاسبات در این روش بیشتر از روش قبل خواهد بود. با توجه به اینکه معمولاً کاربر با اعداد بزرگ سر و کار ندارد و عملاً این روش بر روی  نیازهای کاربر تأثیر منفی نخواهد گذاشت. به عنوان یک نکته، تشخیص احتمال integer overflow ساده و قابل جلوگیری خواهد بود اگر هوشیار باشید و این احتمال را نادیده نگیرید. پس اگر محدودیت‌ها بر روی کاربر اعمال‌شده و فقط اشتباه برنامه‌نویس ممکن است علت integer overflow باشد، برای کمک به برنامه‌نویس (خود شما) بررسی امکان وقوع integer overflow را در ماکروی assert قرار دهید، تا درصورتیکه برنامه‌نویس (خود شما) سهواً اشتباه کرد، در مرحله تست و اشکال‌زدایی به او کمک شود تا ایراد را راحت‌تر پیدا کند، برای انتشار نهایی برنامه با تعریف ماکروی NDEBUG همهٔ شرطهای درون ماکروی assert نادیده گرفته خواهند شد.

نادیده‌گیری احتمال وقوع integer overflow می‌تواند صدمات امنیتی جدی را بر روی برنامه‌های مهم و بحرانی وارد کند، همانطور که شما دسترسی به اعضای آرایه را کنترل می‌کنید تا از محدودهٔ آرایه‌ها فراتر نروید، محدوده انواع عددی را نیز نباید فراموش کنید تا از صحت درستی محاسبات انجام‌شده اطمینان حاصل کنید.

ویرایش: بهرحال قبل از هر چیز بهتر است ابتدا محاسبات را طوری تغییر دهید که integer overflow رخ ندهد، اگر ممکن نبود، آنوقت از روشهای قبل استفاده کنید. ویرایش: جناب آقای توکلی، مثال بسیار خوبی را برای این حالت در قسمت دیدگاهها نوشته‌اند.

دنبال‌کردن

هر نوشتهٔ تازه‌ای را در نامه‌دان خود دریافت نمایید.