بنابراین، سایت دارای یک شبکه فوق العاده است. اما در آن، تنها چند خط به راه اندازی و پیکربندی سرور اختصاص داده شده است.
من سعی خواهم کرد به کاربرانی که دوست دارند در محلی خود بازی کنند کمک کنم سروربا دوستان و با تنظیمات خودتان. در این مقاله کوتاه، سعی خواهم کرد کل فرآیند را نشان دهم: از نصب سرور تا پیکربندی آن، از جمله استفاده از مودها.

1. اولین چیزی که نیاز داریم این است که به اجرای Rust از طریق شبکه و دانلودآرشیو حاوی همه ابزار لازمو در هر مکانی از حالت فشرده خارج کنید.

2. حالا بیایید به ادامه مطلب برویم نصب و راه اندازی. فایل را اجرا کنید Update-Rust-Server.batاز یک پوشه SteamCMDو صبر کنید تا سرور ما در حال بارگیری باشد. سرورها در پوشه RustServer بارگذاری می شوند.

همه چیز، ما سرور را نصب کرده ایم، به مراحل بعدی بروید.

3. حالا ما خواهیم کرد سرور را راه اندازی کنید، آن را سفارشی کنید و دوستان را دعوت کنید. برای اتصال به سرور ایجاد شده مراحل زیر را انجام دهید:

به پوشه می روم SteamCMDو فایل را اجرا کنید Run-Rust-Server.bat(این خودش است نه Rust_server). برای راه اندازی سرور آزمایشی Rust، فایل را اجرا کنید Run-Rust-Exp-Server.bat
- پس از شروع، خط فرمان حاوی خطوطی با اطلاعات مربوط به بارگیری خواهد بود، ما منتظر لحظه ای هستیم که کتیبه ظاهر شود. "سرور مقداردهی اولیه شد".
- همه چیز، سرور کار می کند.
- حالا برای ورود به سرور باید آدرس سرور خود را پیدا کنیم. نسخه کلاسیک -
- آی پی خود را در جایی یادداشت کنید فایل متنی(فراموش نکنم).
- بعد بازی را شروع کنید و کلید F1 (کنسول) را فشار دهید و دستور net.connect را در آنجا وارد کنید ip شما: 28015 (که ip شما ip شما است که از قبل یاد گرفته اید). در تئوری نیز باید 127.0.0.1 باشد.

اگر همه چیز به درستی انجام شود، به سرور خود متصل خواهید شد. برای اینکه دوستان بتوانند به شما متصل شوند، البته لازم است که سرور روی کامپیوتر شما در حال اجرا باشد و دوستانتان دستور اتصالی که به آنها می گویید را به درستی وارد کنند.
حالا می توانید شروع به بازی کنید. ولی! اجرای صحیح همه اقدامات در برخی موارد نمی تواند موفقیت شما را تضمین کند. از آنجایی که دلایل زیادی برای عدم موفقیت شما وجود دارد. راه حل رایج ترین مشکلات در نوشته شده است.

4. خوب، حالا، اگر همه چیز برای شما درست شد و دوست داشتید، می توانید با آن بازی کنید تنظیمات سرور.
به عنوان مثال، در آخرین به روز رسانیتوسعه دهندگان این را اضافه کردند نکته جالبچگونه ساییدگی اسلحه ها (من بلافاصله به یاد یک سریال افتادم جزیره مرده) و همچنین فرسودگی لباس و تجهیزات.
این برای بسیاری مناسب نبود و در اینجا فرصتی برای غیرفعال کردن این ویژگی وجود دارد.

برای این شما نیاز دارید:
> با حقوق مدیریت وارد سرور شوید. برای این کار کنسول را در بازی با کلید F1 باز کنید و دستور Rcon.login رمز عبور خود را وارد کنید (رمز عبور شما در فایل server.cfg تنظیم شده است و به صورت پیش فرض شبیه 123456 است). پس از ورود باید یک کتیبه ظاهر شود (در کنسول) "ورود به عنوان مدیر"،یعنی شما به عنوان ادمین وارد شده اید. حالا دستورات را وارد کنید:
- برای غیرفعال کردن پوشیدن لباس: conditionloss.armorhealthmult "0.0"
- برای غیرفعال کردن سایش سلاح/موجودی: conditionloss.damagemultiplier "0.0"

با کمک حالت های مختلف می توانید موارد مختلف را نیز غیرفعال یا فعال کنید. به عنوان مثال، از هم پاشیدگی در سرور را غیرفعال کنید یا فاصله پرواز را برای هواپیماها تنظیم کنید. این شبکه در حال حاضر دارای مودهای مقرون به صرفه و نه چندان مقرون به صرفه است. توصیه می کنم از یک مد رایگان استفاده کنید ماگما،به دلیل سهولت سفارشی سازی و تعداد زیاد افزونه.

بهینه سازی بازی Rust به سادگی "بی ارزش" است، که در طی آن مشکلاتی ایجاد می کند گیم پلیبرای برخی از کاربران در برخی موارد حتی کامپیوتر قدرتمندقادر به مقابله با وظایف مستقیم خود، یعنی ارائه یک تصویر عالی بدون تاخیر در رابط "زنگ" هستند. البته، به لطف برخی دستکاری ها، می توانید فریم در ثانیه بازی را کمی افزایش دهید، اما این کار با وارد کردن انواع مختلف دستورات در خط کنسول که جلوه های خاص را غیرفعال می کند، بهتر انجام می شود. اما چگونه آن را تصور می کنید؟ هر بار که به سرور وصل می شوید، حدود 30 دستور را در کنسول وارد کنید - این مقدار زمان تلف می شود ... اما راهی وجود دارد و این فایل کانفیگ Rust است که می توانید تمام این دستورات را در آن وارد کنید. ، و فقط آن را در یک فهرست خاص قرار دهید.

اما از کجا می توانم این cfg را برای Rust تهیه کنم؟ در واقع دو راه برای دریافت آن وجود دارد. می توانید کارهای زیر را انجام دهید ...

ایجاد کانفیگ برای بازی Rust

1. به دایرکتوری اصلی بازی بروید.
2. پوشه CFG را در آنجا پیدا کنید.
3. دو فایل را در آن پیدا کنید: client.cfg و config.cfg.
4. اگر هیچکدام وجود ندارد، فقط باید موارد جدید ایجاد کنید و بر اساس آن نامگذاری کنید.
5. در اینجا دستورات مناسب برای , shadows, wind و غیره را وارد کنید.

و شما می توانید آن را متفاوت انجام دهید.

cfg را برای بازی دانلود کنید

1. می توانید کانفیگ آماده Rust (با تمام دستورات لازم) را مستقیماً از وب سایت ما از اینجا دانلود کنید.
2. دو فایل موجود در آرشیو را در دایرکتوری مناسب (مشخص شده در روش اول) کپی کنید.
3. اگر این فایل ها از قبل وجود دارند، با جایگزینی کپی کنید، اگر نه، پس فقط Paste کنید.

اصولاً فرقی نمی کند که از کدام طرف بروید. پس از آن فقط:

وارد بازی شوید
روی تب "گزینه ها" کلیک کنید
علامت «Water Reflectins» و «VSync» را بردارید
و نوار لغزنده «کیفیت رندر» را تا انتها به سمت چپ بکشید

لازم به ذکر است که پیکربندی Rust تأثیر بسیار مثبتی دارد، حتی می توان گفت که پیکربندی Rust (البته با پیکربندی صحیح) مزایای بسیار بیشتری نسبت به 512 مگابایت حافظه ویدیویی اضافی به همراه خواهد داشت.

در مقالات قبلی این مجموعه، مروری کلی بر زبان برنامه نویسی Rust انجام شد، مبانی نحو مورد بحث قرار گرفت: ساده ترین اجزا (متغیرها، انواع داده های ساده، عملگرها و پسوندها)، ساختارهای کنترلی و ساختارهای داده مرکب، توابع و ویرانگرها توصیف شدند. توجه ویژه ای به مدل حافظه به طور کلی، مفهوم مالکیت شی، اصول کلیمدیریت حافظه، استفاده از بلوک های خود و مدیریت شده حافظه مشترکو همچنین نشانگرهای قرض گرفته شده. این مقاله امکانات ورودی/خروجی زبان Rust را مورد بحث قرار می دهد.

در هر زبان برنامه نویسی، زیرسیستم I/O مهم است بخشی جدایی ناپذیر. برخی از ساده‌ترین ابزارهای کار با خروجی استاندارد قبلاً در مقالات قبلی (چاپ، println) استفاده شده‌اند. این توابع بصری هستند و هیچ مشکلی در روند اعمال آنها ایجاد نمی کنند. بنابراین، اکنون ما عمدتاً بر روی ابزارهای دریافت داده های وارد شده توسط کاربر و ابزارهای کار با فایل ها تمرکز خواهیم کرد.

1. ماژول std::io

در Rust، تمامی امکانات I/O در یک ماژول جمع آوری می شوند io.

ویژگی های Reader و Writer حداقل مجموعه ای از بیشترین ها را تعریف می کنند روش های سادهورودی و خروجی. ویژگی های ReaderUtil و WriterUtil انتخاب گسترده تری از روش ها را ارائه می دهند که به کاربر کنترل بیشتری بر ورودی و خروجی می دهد. به عنوان مثال، Reader فقط به شما امکان می دهد تعداد معینی از بایت ها را در یک بافر بخوانید، در حالی که ReaderUtil روش هایی را برای خواندن یک خط کامل، چندین خط، مقادیر عددی و غیره ارائه می دهد. علاوه بر این، یک پیاده سازی (پیاده سازی) ReaderUtil برای وجود دارد ، که امکان دسترسی به تمام متدهای Reader را فراهم می کند.

یک صفت مجموعه ای از روش ها را توصیف می کند که می تواند برای یک نوع خاص یا برای چندین نوع اعمال شود. ویژگی ها در مقالات بعدی این مجموعه با جزئیات بیشتر مورد بررسی قرار خواهند گرفت.

همانطور که در بالا ذکر شد، متداول ترین توابع print() و println() نیز در ماژول تعریف شده اند io، اما در بیشتر موارد نیازی به وارد کردن صریح آنها ندارید، زیرا سیستم کامپایل و پیوند قبلاً به آن رسیدگی کرده است.

علاوه بر این، بسیار ویژگی های مفید stdin() ، stdout() و stderr() که اشاره گرها را به ترتیب به سه توصیفگر فایل استاندارد برمی گرداند: ورودی استاندارد، خروجی استاندارد و خطای استاندارد.

2. دریافت داده از کاربر

در هر صورت، بیشترین به روشی سادهدریافت داده از کاربر استفاده از تابع stdin() است که یک اشاره گر به شی @Reader ایجاد می کند که به شما امکان می دهد داده ها را از جریان ورودی استاندارد بخوانید (توابع مشابهی برای جریان خروجی استاندارد - stdout() وجود دارد. و همچنین برای جریان خطای استاندارد - stderr()). هنگامی که نشانگر @Reader ایجاد شد، می توانید از تابع read_line() برای خواندن ورودی کاربر استفاده کنید، همانطور که در لیست 1 نشان داده شده است.

فهرست 1. خواندن ورودی کاربر
fn main() ( let stdin = std::io::stdin(); print("نام شما چیست؟"); let name_str = stdin.read_line(); println(fmt!("از آشنایی با شما خوشحالم، %s \ n"، name_str)))

در صفت ReaderUtil علاوه بر توابع سادهخواندن بایت‌ها و تک‌خط‌ها همچنین مجموعه‌ای غنی از ابزارها را برای خواندن داده‌ها در شرایط مختلف تعریف می‌کند: خواندن بایت‌ها تا زمانی که با علامت پایان فایل مواجه شود - read_until()، خواندن یک رشته نوشته شده به سبک C (با یک کاراکتر پایان‌دهنده تهی). ) - read_c_str() ، خواندن کل جریان داده - read_whole_stream() ، خواندن تمام خطوط از جریان داده - read_lines() ، و همچنین مجموعه بزرگی از توابع که به شما امکان می دهد مقادیر عددی را اعم از صحیح و ممیز شناور بخوانید.

3. خواندن داده ها از یک فایل

تمام ابزارهای لازم برای کار با فایل ها نیز در ماژول قرار دارد std::io. اول از همه، باید به عملکردهای زیر توجه کنید:

fn FILE_reader(f: *libc::FILE، پاکسازی: bool) -> @Reader fn FILE_writer(f: *libc::FILE، پاکسازی: bool) -> @Writer fn file_reader(مسیر: &مسیر) -> نتیجه<@Reader, ~str>fn file_writer(مسیر: &مسیر، پرچم‌ها: &) -> نتیجه<@Writer, ~str>fn mk_file_writer(مسیر: &مسیر، پرچم‌ها: &) -> نتیجه<@Writer, ~str>

گزینه‌های FILE_* فایل‌های به سبک C را می‌خوانند و می‌نویسند، در حالی که گزینه‌های file_* در سبک Rust استفاده می‌شوند. از آنجایی که بدیهی است که دو عملکرد اول نقش ابزارهای کمکی برای کارهای خاص را ایفا می کنند و علاوه بر این، این زبان Rust است که مورد توجه قرار می گیرد، باید سبک Rust را ترجیح داد. بنابراین، فقط توابع file_reader و file_writer بیشتر در نظر گرفته خواهند شد. هر دو تابع یک مسیر فایل از نوع ~str را به عنوان پارامتر اول خود می گیرند و هر دو مقداری از نوع Result را برمی گردانند. بنابراین، برای درک فایل I/O در Rust، باید نوع Result را نیز به درستی درک و ارزیابی کنید.

3.1. نوع برگردان Result

این نوع به عنوان ابزاری در Rust برای جلوگیری از خطاهای زمان اجرا عمل می کند. نتیجه یک عدد است که حاوی مقادیر زیر است (نگاه کنید به src/libstd/result.rs):

نتیجه شماره میخانه ( Ok(T)، /// حاوی مقدار بازگشت موفقیت آمیز از تابع Err(U) /// حاوی مقدار خطای بازگشت از تابع است)

مقادیر از نوع Result باید قبل از استفاده از بسته بندی (تخریب) باز شوند.

برنامه مثال از تابع زیر از ماژول استفاده می کند std:: نتیجه :

fn باز کردن (نتیجه: نتیجه ) -> تی

اگر نتیجه Ok(T) باشد، تابع مقدار T استخراج شده از Ok(T) را برمی گرداند که می تواند بیشتر در برنامه استفاده شود.

البته با این تابع، مجموعه ابزار کتابخانه std:: نتیجهمحدود نیست. توضیحات سایر عملکردها را می توان در مستندات بالا یافت.

3.2. نمونه ای از خواندن داده ها از یک فایل

کد منبع برای مثال در فهرست 2 نشان داده شده است. مثال به سادگی بایت ها را از فایل داده شده می خواند، سپس نتیجه خوانده شده را به یک رشته تبدیل می کند و یک تطابق الگو را انجام می دهد. فرض بر این است که خود برنامه و فایل تست read.txt، که داده ها از آن خوانده می شوند، در همان دایرکتوری قرار دارند.

فهرست 2. خواندن داده ها از یک فایل بایت به بایت.
استفاده از std::io::*; استفاده از std::vec::*; استفاده از std::path::*; fn is_success(fpath: &PosixPath) (بگذارید maybe_test_reader: Result<@Reader, ~str>= file_reader (fpath)؛ اجازه دهید test_reader: @Reader = std::result::unwrap( maybe_test_reader); اجازه دهید بایت های mut شوند: ~ = ~; حلقه (بایت: int = test_reader.read_byte(؛ if test_reader.eof() ( break; ) append_one (بایت، بایت به عنوان u8)؛ ) نمونه: ~str = ~"موفقیت"; اجازه دهید maybe_success: ~str = std::str::from_bytes(bytes); if maybe_success == نمونه ( println("عملیات خواندن فایل با موفقیت انجام شد")؛ ) ) fn main() ( اجازه دهید fpath: ~PosixPath = ~PosixPath("./read.txt"); is_success(fpath); )

در مثال بالا، تابع test ()is_success یک شی test_reader را با استفاده از مسیر فایل ارسال شده به آن ایجاد می کند. برای وضوح، محتوای فایل هر بار یک بایت خوانده می شود و بایت خوانده شده به بردار بایت اضافه می شود. بایت ها به عنوان مقادیر صحیح از نوع int خوانده می شوند، اما زمانی که بایت بعدی در بردار درج می شود، مقداری از نوع u8 انتظار می رود. بنابراین، برای هر بایت درج شده، یک تبدیل واضح به عنوان u8 انجام می شود. این عملیات تا زمانی ادامه می یابد که در هنگام خواندن به انتهای فایل (پایان فایل) برخورد شود.

متد reader.eof () زمانی true را برمی گرداند که بایت خوانده شده فعلی حاوی ویژگی eof باشد. در این حالت، مقدار این بایت -1 است (به همین دلیل است که reader.read_byte() یک int برمی گرداند و نه u8) و نیازی به اضافه شدن به بردار نیست. شرایط بررسی می شود و اگر EOF یافت شود، حلقه خارج می شود.

اعتبار سنجی نتیجه خوانده شده به این واقعیت بستگی دارد که بایت های خوانده شده مقادیر ASCII هستند (و بنابراین با قسمت مربوط به رمزگذاری UTF8 مطابقت دارند)، یعنی کاراکترهایی که کلمه "موفقیت" را تشکیل می دهند.

3.3. چرا حلقه while نیست

هنگام در نظر گرفتن کد در لیست 2، ممکن است یک سوال منطقی پیش بیاید: چرا با بررسی eof در بدنه حلقه از حلقه خارج می شود و قبل از تکرار بعدی از تست شرط رایج تر استفاده نمی شود؟ دلیل آن نحوه عملکرد reader.eof() است. هنگام استفاده از حلقه while با بررسی eof در عبارت شرطی، یک بایت EOF با مقدار -1 (255u8) به بردار هدف اضافه می شود. بنابراین هنگامی که از while استفاده می کنید، باید آخرین مقدار را از بردار خارج کنید، همانطور که در لیست 3 نشان داده شده است.

فهرست 3. قطعه ای از بایت های خواندن با استفاده از حلقه while
اجازه دهید بایت های mut شوند: ~ = ~; در حالی که !reader.eof() ( std::vec::append_one(bytes, reader.read_byte() as u8); ) std::vec::pop(bytes);

البته چنین گزینه پردازش داده ای حق وجود دارد.

نتیجه

در Rust، تقریبا تمام I/O در ماژول متمرکز شده است std::io. برای هر نوع داده ابتدایی، ابزارهایی برای خواندن و ارائه آن در هنگام خروجی ارائه شده است. اجزای اصلی ماژول std::ioصفات Reader، Writer، ReaderUtil و WriterUtil هستند که تمام کنترل لازم را بر ورودی و خروجی ارائه می کنند.


در این تاپیک به شما نشان خواهم داد که چگونه خودتان را بسازید سرور زنگ زدهبا مدها آزمایش کنید. چرا لازم است؟ خوب، حداقل اگر Rust را بازی می کنید، ایده های زیادی دارید که آزمایش آنها در سرور خود با منابع بی پایان و توانایی پرواز بسیار راحت تر است. و اگر جلوتر بروید، می توانید سرور خود را محبوب کنید و برای فروش چیزهای بازی به بازیکنان روی سرور خود پول واقعی دریافت کنید.

پس بیایید شروع کنیم.
بخش اول - ایجاد سرور
1. بایگانی Rust_server.zip را از وب سایت رسمی با استفاده از این دانلود کنید
2. آرشیو را در پوشه ای که برای شما مناسب است از حالت فشرده خارج کنید. مثلا این یکی: C:\Games\Rust_Server\Server
در ادامه نمونه‌هایی از آدرس با این پوشه را می‌آورم.
3. به پوشه C:\Games\Rust_Server\Server بروید و فایل update.bat را اجرا کنید.
یک پنجره سیاه با یک خط فرمان باز می شود و فایل های سرور در آن دانلود می شود، حجم آن حدود 2.15 گیگابایت است. پس از اتمام دانلود، پنجره به طور خودکار بسته می شود.
4. به پوشه C:\Games\Rust_Server\Server\rustds بروید
ایجاد کردن سند متنیدر دفترچه یادداشت، این متن را در داخل کپی کنید:
RustDedicated.exe -batchmode -server.hostname "My Server" -server.port 28015 -server.identity Hello_World -server.maxplayers 5 -server.seed 777 -server.worldsize 4000 -chat.serverlog 1 -server.netlog فاصله زمانی ذخیره 300 -spawn.max_rate 1 -spawn.max_density 1
در مرحله بعد، در notepad روی "ذخیره به عنوان ..." کلیک کنید و فایل را با نام "start server.bat" پسوند "All files" ذخیره کنید.
فایل ظاهر شده "start server.bat" فایل شروع سرور شما است. با کلیک بر روی آن، یک پنجره سیاه دوباره باز می شود. خط فرمانو ایجاد نقشه و راه اندازی سرور انجام خواهد شد. با نگاه کردن به شمارنده فریم در ثانیه در سمت راست پایین پنجره، می توانید متوجه شوید که سرور آماده کار است: هنگام بارگیری 0 فریم در ثانیه را نشان می دهد و پس از پایان ظاهر می شود. ارزش دیجیتالمثلا من 262 فریم بر ثانیه دارم.
5. در مرحله بعد، باید آدرس IP خارجی خود را پیدا کنید.
فرض کنید به یکی از خدمات تعیین آدرس IP مراجعه کرده اید و آدرس شما 213.180.193.11 بوده است.
Rust را باز کنید و دکمه F1 را فشار دهید، در کنسول باز شده دستور client.connect 213.180.193.11:28015 را وارد کنید.

اگر همه چیز به درستی انجام شود، اتصال برقرار می شود و خود را در سرور خود خواهید یافت

P.S.: پوشه حاوی فایل های سرور شما (ذخیره و غیره) در C:\Games\Rust_Server\Server\rustds\server\Hello_World قرار خواهد گرفت.

بخش دوم: مدیر

1. برای اینکه خود (یا یک دوست) در سرور خود ادمین شوید، ابتدا باید Steam ID خود را بدانید. برای انجام این کار، به پروفایل استیم خود و در هر کدام بروید فضای خالی- برای مثال، در سمت چپ آواتار خود، کلیک کنید کلیک راستماوس را انتخاب کنید و "کپی آدرس صفحه" را انتخاب کنید. ما این آدرس را در هر جایی، به عنوان مثال، در یک دفترچه یادداشت یا در مرورگر قرار می دهیم. چیزی مثل )