Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Зима без модпака (снег в SA-MP)

OKStyle

Адвокат по делам семейным
Administrator
Wiki Team
Регистрация
4 Мар 2011
Сообщения
7,092
Лучшие ответы
226
Репутация
2,455
Награды
11
До сих пор много вопросов возникает на тему замены текстур на объектах. Всё это было размусолено стопицот раз, поэтому рассмотрим на конкретном примере.
Одним из нововведений моего Vintage являлись времена года. В данном уроке я научу вас как сделать отключаемую зиму на вашем сервере.

ВНИМАНИЕ: после переключения времён года обязательно нужно перезайти в игру - это связано с особенностями удаления объектов для клиента.

P.S. Предлагаю переключение режимов сделать доступным для пользователей (игроков) по команде. Например, как одну из опций VIP-аккаунта.

Итак, для начала нам нужно найти текстуру снега. В GTA SA снег встречается в Либерти-Сити в миссии Saint Mark's Bistro. Для всего сегодняшнего урока будем использовать SA-MP Map Construction от JernejL, SteveM и KCow. Я буду использовать версию Goulash sandwich edition build 23072014.

1. Скачали, распаковали в директорию GTA SA. Открываем editor.exe и нажимаем "Load", чтобы прогрузилась вся игровая карта GTA SA.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


2. Происходит рендер сцены (также, как и в программе MEd, которую мы рассмотрели в предыдущем уроке), создаются объекты на основании *.ide файлов и расставляются в игровом мире на основании *.ipl файлов в директории игры.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


3. Когда рендер закончится, мы окажемся на военной базе (зона 51). Отправляемся летающей камерой в Либерти-Сити. Примерное положение показано на скриншоте.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


4. Далее нужно найти "донора" для снежной текстуры.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


5. Выбираем объект, полностью обёрнутый в нужную нам снежную текстуру. У меня получился lib_street09 (ID 3890). Видим, что *.txd с текстурой называется "libertygen", а сама текстура внутри - "mp_snow". Запоминаем все эти данные и будем использовать их далее.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


В нашем ФС будем использовать функцию SetObjectMaterial, описание которой есть на нашей Wiki. Для примера я взял район под названием Bayside недалеко от Сан-Фиерро.

6. Отправляемся нашей летающей камерой в ту местность, выбираем нужный объект.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


7. Сразу смотрим его свойства, нажав дважды на нём. Нам нужно понять сколько слоёв каких текстур он имеет. Видим, что у него 5 слоёв текстур из "sfn_sfn.txd": 0 - desertgryard256, 1 - sfn_rocktbrn128, 2 и 3 - rocktbrn128, 4 - sfncn_rockgrass4, 5 - rocktbrn128blndlit.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


8. Удаляем объект, клацнув клавишу "Del". Нажимаем "Show Code", чтобы посмотреть код удаления объекта. Убеждаемся, что LOD (низкополигональная версия объекта, для показа на расстоянии для уменьшения просада FPS) удалился тоже.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


ВНИМАНИЕ: на старых версия Editor'а LOD мог не удаляться, то есть строка с кодом была только одна.

9. Начнём написание ФС. В первую очередь нужно создать массив переменных для обозначения объектов, текстуры которых мы можем менять. Поскольку где-то, скорее всего, нужно будет менять несколько слоёв, замена текстуры в одну строку, как я обычно делаю с однослойными объектами, не пойдёт. Но я покажу, как это может выглядеть.

В начало ФС пишем:
PHP:
new bayside[100];
В OnPlayerConnect прописываем удаление стандартных объектов:
PHP:
RemoveBuildingForPlayer(playerid, 9284, -2907.9375, 2195.7109, -12.2891, 0.25); // сам объект
RemoveBuildingForPlayer(playerid, 9469, -2907.9375, 2195.7109, -12.2891, 0.25); // его LOD
В OnFilterScriptInit прописываем создание такого же объекта, но с заменённой текстурой. Координаты берём из кода удаления объектов:
PHP:
bayside[0] = CreateObject(9284, -2907.9375, 2195.7109, -12.289, 0.0, 0.0, 0.0);
SetObjectMaterial(bayside[0], 0, 3890, "libertygen", "mp_snow"); // указываем данные, полученные в пункте 5, слой подбираем экспериментальным путём, либо можно извлечь и открыть нужный txd, из которого наложены слои, и посмотреть текстуры, чтобы понимать, какую нужно менять
Рекомендую удалять объекты поштучно, чтобы не запутаться в ID и координатах. Постепенное экспериментируя с объектами и со слоями текстур, мы получим это:

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


ВНИМАНИЕ: на деревьях текстуры с альфа-каналом по модели, поэтому простая замена текстуры, типа:

PHP:
SetObjectMaterial(CreateObject(698, -2823.8594, 2245.2578, 114.4063, 0.0, 0.0, 0.0), 1, 3890, "libertygen", "mp_snow"); // вот она, однострочная замена одного слоя
приведёт лишь к этому (кто помнит ухудшение графики в Counter-Strike в версиях 1.3-1.5, тот помнит фиолетовый фон у деревьев):

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


Оперируя дальше с текстурами вы сможете сделать и протоптанные в снегу дорожки. Всё ограничивается лишь вашей фантазей. Пользуйтесь.

P.S. Полный листинг примера со скринов:

PHP:
new bayside[5];
public OnFilterScriptInit()
{
    bayside[0] = CreateObject(9284, -2907.9375, 2195.7109, -12.289, 0.0, 0.0, 0.0);
    for(new i; i < 6; i++) SetObjectMaterial(bayside[0], i, 3890, "libertygen", "mp_snow");
    bayside[1] = CreateObject(9207, -2832.1016, 2197.8516, 66.6797, 0.0, 0.0, 0.0);
    for(new i; i < 6; i++) SetObjectMaterial(bayside[1], i, 3890, "libertygen", "mp_snow");
    bayside[2] = CreateObject(9206, -2720.7891, 2226.2969, 27.5547, 0.0, 0.0, 0.0);
    for(new i; i < 8; i++) SetObjectMaterial(bayside[2], i, 3890, "libertygen", "mp_snow");
    bayside[3] = CreateObject(9211, -2739.4766, 2393.6719, 65.7422, 0.0, 0.0, 0.0);
    for(new i; i < 7; i++) SetObjectMaterial(bayside[3], i, 3890, "libertygen", "mp_snow");
    bayside[4] = CreateObject(9210, -2863.2266, 2404.6172, 174.8125, 0.0, 0.0, 0.0);
    for(new i; i < 5; i++) SetObjectMaterial(bayside[4], i, 3890, "libertygen", "mp_snow");
    return 1;
}
public OnPlayerConnect(playerid)
{
    RemoveBuildingForPlayer(playerid, 9284, -2907.9375, 2195.7109, -12.2891, 0.25); // land2_sfn02
    RemoveBuildingForPlayer(playerid, 9469, -2907.9375, 2195.7109, -12.2891, 0.25); // lod_land2_sfn02
    RemoveBuildingForPlayer(playerid, 9207, -2832.1016, 2197.8516, 66.6797, 0.25); // land2_sfn01
    RemoveBuildingForPlayer(playerid, 9468, -2832.1016, 2197.8516, 66.6797, 0.25); // lod_land2_sfn01
    RemoveBuildingForPlayer(playerid, 9206, -2720.7891, 2226.2969, 27.5547, 0.25); // land2_sfn10
    RemoveBuildingForPlayer(playerid, 9467, -2720.7891, 2226.2969, 27.5547, 0.25); // lod_land2_sfn10
    RemoveBuildingForPlayer(playerid, 9211, -2739.4766, 2393.6719, 65.7422, 0.25); // land2_sfn09
    RemoveBuildingForPlayer(playerid, 9466, -2739.4766, 2393.6719, 65.7422, 0.25); // lod_land2_sfn09
    RemoveBuildingForPlayer(playerid, 9210, -2863.2266, 2404.6172, 174.8125, 0.25); // land2_sfn11
    RemoveBuildingForPlayer(playerid, 9465, -2863.2266, 2404.6172, 174.8125, 0.25); // lod_land2_sfn11
    return 1;
}
Автор: OKStyle
 
Сверху Снизу