Чем rust отличается от «плюсов»: откровение ветерана с++

Placing Structures

Valid building placement

Invalid building placement

To place a structure, a Building Plan must be crafted. Building plans costs 50 Wood. When the Building Plan is crafted, place it in the hotbar and select it. By default, the foundation object is selected, and you will see a «ghost» of it as you look around. To select other building objects, hold right mouse button, move your mouse in a circle to the object you want, and left click. To begin building, choose either a foundation or a triangular foundation, look at an area suitable for a house, and left click. This will create a foundation. To place walls, select them and aim at the edge of a foundation. Floors must be placed at the top edge of a wall, and doors must be placed inside door frames. Be careful, because as you build up, you have to keep track of the building’s stability. If too many floors are built too far away from a wall, it will collapse.

Структуры

Rust не является объектно-ориентированным языком, но у него есть некоторые функциональные средства, которые могут имитировать поведение, характерное для такого рода языков. Когда мы работаем с классами в JavaScript, то имеем дело с данными и методами в одном и том же месте. В Rust мы будем отделять представление данных от методов, которые с ними работают. Вот как это происходит:

struct Dog {    name: String,    score: i32}impl Dog {    fn say_something(self: &Dog) {        println!("Hey, my name is {}... I mean WOOF!", self.name);    }}fn main() {    let dog = Dog { name: String::from("Boira"), score: 13 };    dog.say_something();}

Структура очень похожа на объект JavaScript, но она отличается от него. Структура — это форма каких-то данных, которые будут иметь два именованных поля: и . Ниже структуры располагается блок реализации (сокращённо ). Вот так мы можем объявлять методы, которые будут работать с данными. И заметьте: если понадобится связать функцию с этими данными, нам нужно будет передать в качестве первого аргумента. Напоминает Python, не находите?

Опуская значение , мы объявляем метод, который не связан с какими-то конкретными данными. Можно провести аналогию со статическим методом в классе JavaScript.

Что нужно, чтобы начать использовать Rust?

Первым делом нужно установить Rust. Нет ничего проще: заходите на сайт https://rustup.rs и загружаете официальный установщик набора инструментальных средств. Это то же, что и nvm, который обычно используется с JavaScript.

Затем вам понадобятся библиотеки — не начинать же всё совсем с нуля. Поэтому точно так же, как мы обзаводимся пакетами Node на JavaScript, мы будем поступать и с пакетами Rust. Зайдите на crates.io, официальное хранилище крейтов, чтобы подробнее разузнать о пакетах на Rust.

Rust универсален, поэтому существует множество ситуаций, где его можно использовать. Есть и сообщество, которое не покладая рук работает, отслеживая их на разных сайтах:

www.arewewebyet.org: несмотря на то, что платформы не достигли пока такой зрелости, как Ruby on Rails, кое-что сделать с их помощью вы бы могли! Рекомендую обратить внимание на платформу Rocket, если вы желаете заняться веб-разработкой. Вы даже можете создавать GraphQL API с помощью Juniper!

www.arewegameyet.com: полностью освоив управление памятью, можно переходить к созданию игр, Rust отлично для этого подходит! Если вас манит разработка игр, рекомендую игровой движок Amethyst.

www.arewelearningyet.com: машинное обучение

Это ещё одна тема, которая сейчас очень популярна. Экосистема Rust пока ещё не укомплектована полностью и прямо сейчас не может на равных конкурировать с Python в том, что касается машинного обучения, но если вам интересна эта тема, зайдите на сайт!

А если вы занимаетесь веб-разработкой, можно сказать, что вам повезло! Вы можете создавать программы, компилировать их и использовать всё это вместе с тем кодом, который у вас на JavaScript. WebAssembly — вот технология, которая сделала это реальным, и её прямо сейчас во всех современных браузерах.

Если хотите её опробовать, рекомендую почитать официальную книгу с документацией по Rust и WebAssembly.

Заключение

Rust — это нереально крутой язык, который стоит освоить, ведь с его помощью столько всего можно сделать! Если вы веб-разработчик, как и я, то вам будет очень интересно читать о WebAssembly, и я надеюсь, что смогу сделать ещё статьи об этом.

Если вы хотите приступить к освоению Rust, рекомендую начать с этого официального ресурса и попробовать написать имеющиеся программы на JavaScript с помощью Rust. Как и во многом другом, практика — это ключ к успеху!

В заключение отметим, что эта статья написана по мотивам доклада, представленного автором на семинаре разработчиков JS Coders meetup event. Со слайдами вы можете ознакомиться здесь.

  • 3 фундаментальных постулата JS, приближающих вас к Pro-статусу
  • Добро пожаловать в ад…зависимостей JavaScript
  • Rust и разработка кроссплатформенных решений для мобильных устройств

Читайте нас в телеграмме, vk и

Building

Building in Legacy was very different to the current version of Experimental Rust. In many ways, the building mechanics were a lot simpler but were also unforgiving of error. To name a few differences; there were no Tool Cupboards, Building Plans or Hammers. This meant that players could not set Building Privilege around their bases which lead to the emergence of many unique raiding strategies. In order to counter these raiding strategies, a widely accepted method was developed by players which involved surrounding their bases with Wood Foundations and Wood Pillars. Because foundations and pillars were almost indestructible, this method worked quite effectively. The metal variants also worked for this.

The only way players could demolish structural items that they had placed themselves was to manually destroy them using explosive items such as F1 Grenades or Explosive Charges. However, they were quite expensive and were best used to raid other player’s bases. It should be noted that foundations and pillars could not be destroyed without access to admin controls. Additionally, structural items could not be rotated once placed, however, this did not matter as both sides of structural items were equally strong.

A player looking towards an extremely tall base, presumably still under construction.

Because there was no height limit on how high players could build, many players proceeded to build extremely tall bases. This created numerous problems for raiders trying to raid extremely tall base designs. However, most players who still wanted to collect and store loot had to have a staircase up to the top, therefore meaning that the base could be raided if the raiders had enough Explosive Charges to get to the top. One clever player also managed to invent a so-called ‘unraidable base’ design, but fortunately, these bases could still be raided (although it was very difficult).

One of the most significant building changes, when compared with Experimental, was the fact that all players had to manually craft and place individual structural items. This meant that there was an increased risk to the building process as structural items that were crafted but not placed were at risk of being stolen during raids. This forced players to be smart when planning their builds as they needed to ensure that they had enough (but not too much), of every structural item needed to build their desired base.

Construction

Construction items have a separate rendered model when placed.

Armored Door Armored Double Door Barbed Wooden Barricade
Building Plan Chainlink Fence Chainlink Fence Gate
Code Lock Concrete Barricade Floor Grill
High External Stone Gate High External Stone Wall High External Wooden Gate
High External Wooden Wall Ladder Hatch Large Water Catcher
Lock Metal Barricade Metal horizontal embrasure
Metal Shop Front Metal Vertical embrasure Metal Window Bars
Mining Quarry Netting Prison Cell Gate
Prison Cell Wall Pump Jack Reinforced Window Bars
Sandbag Barricade Sheet Metal Door Sheet Metal Double Door
Shop Front Small Water Catcher Stone Barricade
Tool Cupboard Wood Double Door Wood Shutters
Wooden Barricade Wooden Door Wooden Ladder
Wooden Window Bars Reinforced Glass Window Garage Door

У Rust настоящая zero-cost abstraction

Помимо Rust, я присматривался и к другим языкам. Три года назад, когда впервые сменил работу, думал погрузиться в светлый мир JVM и написать что-нибудь на Kotlin. Но языки вроде Scala, Java и Kotlin можно применять далеко не везде. Виртуальные машины создают дополнительную нагрузку и для встраиваемого ПО в микрокомпьютерах не подходят. В таких системах пишут на чистом С, С++ или совсем страшных штуках вроде MISRA C.

У Rust, скомпилированного в native, нет дополнительного рантайма. RAII, деструкторы, конструкторы как в «плюсах». Только у Rust линейные типы и zero-cost с ними настоящий, а у C++ — нетривиальный деструктор у типа, и хоть убейтесь, но не получится передать его значение через регистры.

Ещё есть Zig — он очень похож на Rust. Там, например, тоже есть проверка lifetime, но организована она иначе, и то, как это сделано в Rust, мне нравится больше. Других языков с проверкой lifetime я не знаю, а в языках со сборщиками мусора она не нужна: если есть ссылка на объект, значит, он точно живой.

В Go механизм похожий, но там есть сборщик мусора. Мне предлагали перейти на него четыре года назад. Я попробовал, и синтаксис меня рассмешил. Стоит автоформатеру неправильно перенести строки, и программа не скомпилируется. А всё из-за неявной расстановки точек с запятой.

Code-assistant rust-analyzer отлично работает с шаблонами

В последнее время я оборачиваю небезопасные библиотеки языка С, чтобы подцепиться к каноническому Rust API. Если бы сразу начал писать на «плюсах», уже давно бы закончил и общался с железом, к которому эта библиотека поставляется. А так как пишу на Rust, то пришлось целую неделю аккуратно оборачивать код в канонические Rust-структуры. Столкнулся с тонкостями системы типов: вариантностью ссылок, контравариантностью типов. Если не обращать на них внимания, то safe-обёртка над C API будет некорректной.

Оборачивать низкоуровневый unsafe-код в safe на Rust довольно долго, но оно того стоит. «Плюсовой» IntelliSense вряд ли сравнится с мощным rust-analyzer и справится далеко не со всем кодом, особенно с шаблонами.

Переменные и их изменяемость

Переменные — это точки данных, которые сохраняются и помечаются для последующего использования. Формат объявлений переменных таков:

let  = ;

Имя переменной должно быть информативным, т. е. описывать, чем является ее значение. Например:

let my_name = "Ryan";

Здесь создана переменная со значением .

Совет Всегда давайте переменным названия, начинающиеся со строчной буквы, а новое слово начинайте с заглавной.

В Rust переменные неизменяемы по умолчанию, т. е. их значение нельзя изменить после того, как они заданы.

Например, вот этот код выдаст ошибку во время компиляции:

fn main() {    let x = 5;    println!("The value of x is: {}", x);    x = 6;    println!("The value of x is: {}", x);}

Ошибка в строке 4, где мы попытались установить значение . Но значение уже задано в строке 2 и изменить его нельзя.

На первый взгляд такое свойство языка Rust кажется неудобным, но оно помогает применять лучшие практики минимизации изменяемых данных. Ведь наличие изменяемых данных часто приводит к появлению багов, если как минимум две функции ссылаются на одну и ту же переменную.

Представьте, что у вас есть две функции: , которая использует переменную, имеющую значение , и функция , которая изменяет эту же переменную. Выполнение функции будет прервано!

Чем больше у вас становится переменных и функций, тем легче случайно изменить их значения. Такого рода ошибки поддаются отладке с трудом, поэтому в Rust предпочитают избегать их в принципе.

Чтобы переопределить это значение по умолчанию и создать изменяемую переменную, объявим ее вот так:

let mut x = 5;

Изменяемые переменные чаще всего используются как переменные-итераторы или как переменные в структурах цикла .

Система типов в Rust защищает от ошибок

Бизнес-логика — именно то, что нужно писать на Rust, потому что с ним тяжело ошибиться. Ещё на прошлой работе мы запилили плагин — в качестве proof of concept того, что на Rust вообще можно создавать плагины к большому SDK. Логика была примитивная: принять список слов и проверить, совпадает ли с ним input.

Почему такой простой плагин? Потому что больше никто в команде не знал Rust. Язык молодой, и пока на нём мало кто пишет. Создавать проекты, которые может поддерживать только один разработчик, невыгодно. Проще найти «плюсовиков», поэтому C++ никуда не исчезнет.


Исследование команды Rust «Почему программисты не пишут на Rust». Главная причина — компания не использует Rust. Изображение: Rust Blog

На новой работе я перевожу часть проекта с «плюсов» на Rust. Язык подкупил меня мощной системой типов, которая позволяет выразить зависимости между временами жизни объектов. В языках с ещё более мощными системами типов, например с зависимыми типами, можно проверять статически рантаймовые ограничения. Например, запретить функции принимать пустые строки — компилятор проверит.

Antihack команды

Команды управления, встроенной в игру antihack системы.

Команда Тип Значение по умолчанию Описание
antihack.debuglevel C, S 1 Оповещение нарушений в консоль сервера:

0 = Ничего не выводить
1 = Выводить сообщения о серьёзных нарушениях
2 = Выводить все замечания

antihack.enabled C, S true Команда включает или выключает Antihack на сервере.
antihack.enforcementlevel C, S 1 Автоматическое принятие сервером решения о судьбе игрока:

0 = Ничего не делать
1 = Выкинуть игрока
2 = Забанить игрока

antihack.maxviolation C, S 5 Количество нарушений, которое приведёт игрока к бану на сервере.
antihack.relaxationpause C, S 5 Откатит изменения назад до момента обнаружения нарушения.
antihack.relaxationrate C, S 0.1 Скорость, с которой значение нарушения будет снижаться.
antihack.userlevel C, S На кого будет реагировать Antihack:

0 = Игроки
1 = Администраторы
2 = Разработчики

antihack.flyhack_protection C, S 1 Включить защиту от flyhack:

0 = Выключен
1 = Включён
2 = Расширенные настройки

antihack.flyhack_forgiveness C, S 2 Преодолённая дистанция в полёте, после которой Antihack начинает реагировать на игрока.Примечание: Чем меньше значение, тем больше ложных срабатываний.
antihack.flyhack_penalty C, S 4 Количество предполагаемого использования Flyhack, после которого автоматически будет выдан бан.
antihack.flyhack_reject C, S При обнаружении Flyhack, сервер может игнорировать перемещение игрока, фактически замораживая его положение на сервере в том месте, где был обнаружен хак.Примечание: Перемещение игрока останавливается только на сервере. Это видят все игроки, кроме нарушителя. На клиенте нарушителя он продолжит двигаться, но после остановки его откатит на позицию, сохранённую на сервере. Всё это произойдёт в том случае, если не настроены жёсткие правила автоматического бана.
antihack.noclip_protection C, S 2 Включить защиту от noclip:

0 = Выключен
1 = Включён
2 = Расширенные настройки

antihack.noclip_penalty C, S 4 Количество предполагаемого использования Noclip, после которого автоматически будет выдан бан.
antihack.noclip_reject C, S При обнаружении Noclip, сервер может игнорировать перемещение игрока, фактически замораживая его положение на сервере в том месте, где был обнаружен хак.Примечание: Перемещение игрока останавливается только на сервере. Это видят все игроки кроме нарушителя. На клиенте нарушителя он продолжит двигаться, но после остановки его откатит на позицию, сохранённую на сервере. Всё это произойдёт в том случае, если не настроены жёсткие правила автоматического бана.
antihack.speedhack_protection C, S true Включить защиту от speedhack.
antihack.speedhack_deltatime C, S 0.2 Интервал времени для проверки скорости. Чем ниже значение, тем выше шанс ложных срабатываний.Примечание: Чем меньше значение, тем больше ложных срабатываний
antihack.speedhack_forgiveness C, S 2 Предполагаемая минимальная скорость при использовании speedhack.
antihack.speedhack_history C, S 20 Преодолённое расстояние с использованием speedhack, при котором будет выдано нарушение.
antihack.speedhack_penalty C, S 4 Количество предполагаемого использования speedhack, после которого автоматически будет выдан бан.
antihack.speedhack_reject C, S При обнаружении speedhack, сервер может игнорировать перемещение игрока, фактически замораживая его положение на сервере в том месте, где был обнаружен хак. Примечание: Перемещение игрока останавливается только на сервере. Это видят все игроки, кроме нарушителя. На клиенте нарушителя он продолжит двигаться, но после остановки его откатит на позицию, сохранённую на сервере. Всё это произойдёт в том случае, если не настроены жёсткие правила автоматического бана.

Базовая игровая механика

На вашем экране в правом нижнем углу расположены три разные колонки, вы увидите,что-то похожее на это:

  • Здоровье (Health): 100​
  • Еда/Вода/Калории (Food/Water/Calories): 1500
  • РАД (Rads): 0

Здоровье — показывает какое количество урона вы сможете пережить. Вы можете сократить это урон ношением брони. Здоровье можно восстановить если съесть приготовленную пищу, постоять у зажженного костра, либо просто подождать.

Калории — это ваши очки голода. Калории можно восполнить при помощи еды. Когда калории достигают нуля вы начинаете терять здоровье.

РАД показывает количество полученной радиации. Уведомление о радиации можно услышать как быстрые клики. При получении радиации вы услышите счетчик гейгера . Радиация будет быстро уничтожать калории. Если вы получили дозу радиации более 500 РАД, ваш персонаж начнет терять здоровье из-за радиационного излучения. Вы будете терять очки здоровья до отметки 1. Вы можете уменьшать уровень радиации, если отойдете от зон радиационного заражения и подождете или примете анти-радиационные таблетки или еду с анти-радиационными свойствами.

Когда начнется ночь и у Вас не будет никакого типа одежды, Вы получите эффект замерзания. Если у вас эффект замерзания, вы будете терять калории быстрее, чем обычно и не сможете регенерировать здоровье. Чтобы избавиться от этого эффекта есть два варианта:

1) Подойдите близко к костру или работающей печи и согрейтесь. Это добавит эффект «Комфорт». Когда действует этот эффект, Ваши калории будет исчезать медленнее, но вам все равно нужно будет есть.

2) Добудьте одежду. Одежда может быть создана или может выпасть из мутировавших врагов.

Цель игры это ВЫЖИТЬ. Как Вы будете выживать — решать Вам.

Огнестрельное оружие

Название Рецепт Боеприпасы Урон Скорострельность Разлёт снаряда Размер магазина Перезарядка
Самодельный пистолет (Eoka Pistol) Очень простой пистолет, стреляет по одному патрону.

x150

x35

180 30 RPM 1 2.0s
Гвоздомёт (Nailgun)A construction tool turned deadly 18 400 RPM 0.75° 16 3.4s
Револьвер (Revolver) Шестизарядный револьвер.

x200

x100

x25

35 343 RPM 0.75° 8 3.4s
Полуавтоматический пистолет (Semi-Automatic Pistol) Полуавтоматический пистолет. Стреляет быстро и с высокой точностью.

x15

x25

40 400 RPM 0.75° 10 2.9s
Револьвер Питон (Python Revolver) A High Powered six-shooter. 45 400 RPM 0.5° 6 3.75s
Пистоле М92 (M92 Pistol) A semi-automatic Pistol. Fires rapidly and with good accuracy. Military Grade 45 600 RPM 15 2.2s
Самодельный дробовик (Waterpipe Shotgun) Дробовик из водопроводной трубы. Однозарядный.

x300

x100

180 13 RPM 1 2.4s
Винтовка (Bolt Action Rifle) Очень мощная и точная винтовка.

x300

x30

x100

80 35 RPM 4 5.0s
Помповый дробовик (Pump Shotgun) Помповый дробовик. Вмещает 6 патронов.

x300

x30

x40

210 55 RPM 6 5.5s
Пистолет-пулемёт Томпсона (Thompson)Пистолет-пулемёт Томпсона. Наносит урон средней силы.

x100

x35

37 462 RPM 0.5° 20 4.0s
Винтовка M39 (M39 Rifle)Военная полуавтоматическая винтовка. 50 300 RPM 0.1° 20 3.25s
Штурмовая винтовка (Assault Rifle)Автомат Калашникова — никаких компромиссов. 50 450 RPM 0.2° 30 4.4s
Самодельный пистолет-пулемёт (Custom SMG)Очень скорострельный пулемёт. Точность и дальность принесены в жертву скорости.

x100

x30

x10

30 600 RPM 0.5° 24 4.0s
MP5A4Очень скорострельный пулемёт. Точность и дальность принесены в жертву скорости. 35 600 RPM 0.5° 30 4.0s
Пулемёт M249 (M249)Ручной пулемёт с высоким темпом стрельбы и хорошим уроном. Невозможно создать 65 500 RPM 0.2° 100 7.5s
Полуавтоматическая винтовка (Semi-Automatic Rifle)Полуавтоматическая винтовка.

x450

x60

40 343 RPM 0.25° 16 4.4s
Огнемёт (Flame Thrower)Огнемёт, отличное средство для любителей позажигать.

x100

x250

x8

8 240 RPM 100 3.5s
Двухствольный дробовик (Double Barrel Shotgun) 180 120 RPM 0.5° 2 5.5s
LR-300 штурмовая винтовка (LR-300 Assault Rifle)Преследуйте своих врагов с этой мощной штурмовой винтовкой. 40 500 RPM 0.2° 30 4.0s
Винтовка L96 (L96 Rifle)A military issue high powered rifle. Extremely long range and accuracy. 40 500 RPM 0.2° 30 4.0s
Дробовик Spas-12 (Spas-12 Shotgun)A semi automatic military issue shotgun. 136 180 RPM 6 5.8s

First Spawn

First 5 minutes of the game
Assuming that you have spawned in the day time, here is what I would recommend that you do. First off, you use:

W, A, S, D
to move. You have in your tool bar (The bar at the bottom) a Rock, torch, bandages (ADDMORE), unless you are playing the updated version of rust, not legacy, you will only spawn with a rock. no bandages or torch.

You will want to use the rock to gather some wood. Some people have trouble finding rock on the first day, so they make the mistake of running around until they find some. I have a theory that rock is constantly spawning, and thus when you move around, it makes it hard to spawn ‘near’ you (While this is true, rock can spawn more frequently in some areas). My solution to said theory, is to find other players, chop some wood, and then look around for the rock nodes.

Rock nodes come in 2 flavors. White, which is predominately stone (Actually Sulfur) and tan and gray, which is predominately metal and stone. I have yet to see a ‘large’ white stone, but have seen both small and large black metal deposits. I will be referring to these as Stone and Metal in the future.
You interact with items using the ‘E’ key. In the beginning there is not much use for this, however you will learn to love it, and hate it as some things in the current patch can be quite confusing. again, unless you are playing the updated version of rust, all breakable rocks will drop sulfur, stone, and metal fragments.

Server Commands

Syntax Shorthand Description Notes
admin.mutevoice «player»
admin.unmutevoice Unmute a players or admins in-game capability of speaking
admin.mutechat «player» Mute a players in-game capability of speaking in the in-game chat
admin.unmutechat «player» Unmute a players in-game capability of speaking in the in-game chat
global.status status Print out currently connected clients etc Only available for admins nowadays.
global.kick «player» kick «player» Kick a player/Admin
global.kickall kickall «reason» Kick everyone in the game
global.ban «player» ban «player» Banish a player/Admin
global.moderatorid «SteamID» moderatorid «SteamID» Make a player moderator AuthLevel 1, (Moderator)
global.ownerid «SteamID» ownerid «SteamID» Make a player/moderator owner AuthLevel 2, (Admin)
global.removemoderator «SteamID» removemoderator «SteamID» Remove a moderator
global.removeowner «SteamID» removeowner «SteamID» Remove an owner
global.banid «SteamID» banid «SteamID» on description
global.unban «SteamID» unban «SteamID» no description
global.players players Print out currently connected clients etc
global.say «text» say «text» Sends a message in chat
global.users( ) users Show user info for players on server.
global.banlist banlist List of banned users (sourceds compat)
global.banlistex( ) banlistex List of banned users — shows reasons and usernames
global.listid( ) listid List of banned users, by ID (sourceds compat)
chat.say «text» chat.say «text» Prints your text in the chat e.g «t0kenz: Hello»
draft.add( void ) no description
craft.canceltask( void ) no description
craft.cancel( void ) no description
data.export( void ) no description
entity.debug_toggle( void ) no description
entity.nudge( void ) no description
env.addtime( void ) no description
event.run( void ) no description
gc.collect( void ) no description
global.restart( ) restart Restart the server — with 300 seconds warning at 5 second intervals.
global.quit( ) quit Leave the game
global.report( void ) report no description
global.objects( void ) objects no description
global.textures( void ) textures no description
global.colliders( void ) colliders no description
global.error( void ) error no description
global.queue( void ) queue no description
global.setinfo( void ) setinfo no description
global.sleep( void ) sleep no description
global.kill( void ) kill Suicide command Used for respawning
global.respawn( void ) respawn no description
global.injure( void ) injure no description
global.spectate( void ) spectate no description
global.respawn_sleepingbag( void ) no description
global.respawn_sleepingbag_remove( void ) no description
global.teleport( void ) teleport «name» no description
global.teleport2me( void ) teleport2me «name» no description
global.teleportany( void ) teleportany «bear, deer..» no description
global.cleanup( void ) cleanup

on description

hierarchy.ls( void ) no description
hierarchy.cd( void ) no description
hierarchy.del( void ) no description
inventory.endloot( void ) on description
inventory.give( void ) no description
inventory.giveall( void ) no description
inventory.givebpall( void ) no description
inventory.giveto( void ) no description
inventory.giveid( void ) no description
inventory.givearm( void ) no description
inventory.givebp( void ) no description
pool.status( void ) no description
pool.clear( void ) on description
server.start( ) Starts a server
server.stop( string DisconnectMessage ) Stops a server
server.backup( ) Backup server folder
server.writecfg( ) writecfg Writes config files
server.fps( void ) no description
server.save( ) save Force save the current game
server.readcfg( void ) no description
spawn.fill_populations( void ) no description
spawn.fill_groups( void ) no description
weather.clouds( void ) no description
weather.fog( void ) no description
weather.wind( void ) no description
weather.rain Sets the rain factor where 0 is none and 1.0 is 100%. Using anything other than a valid value will set it to «auto».
world.monuments( void ) prints pos of all monuments and caves to console DISABLED
global.dump( void ) dump server diagnostics to
global.find( string Name ) Search for a command
global.echo( string output ) Prints something to the debug output
airdrop.drop( void ) no description
cui.test( void ) no description
global.ent kill ent kill Destroys/kills the entity you’re targeting (looking at) Useful binding for admins:bind q “ent kill”
global.ent lock ent lock locks the sign/painting you’re targeting (looking at)
global.ent unlock ent unlock unlocks the sign/painting you’re targeting (looking at)
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector