До сих пор много вопросов возникает на тему замены текстур на объектах. Всё это было размусолено стопицот раз, поэтому рассмотрим на конкретном примере.
Одним из нововведений моего 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. Начнём написание ФС. В первую очередь нужно создать массив переменных для обозначения объектов, текстуры которых мы можем менять. Поскольку где-то, скорее всего, нужно будет менять несколько слоёв, замена текстуры в одну строку, как я обычно делаю с однослойными объектами, не пойдёт. Но я покажу, как это может выглядеть.
В начало ФС пишем:
В OnPlayerConnect прописываем удаление стандартных объектов:
В OnFilterScriptInit прописываем создание такого же объекта, но с заменённой текстурой. Координаты берём из кода удаления объектов:
Рекомендую удалять объекты поштучно, чтобы не запутаться в ID и координатах. Постепенное экспериментируя с объектами и со слоями текстур, мы получим это:
ВНИМАНИЕ: на деревьях текстуры с альфа-каналом по модели, поэтому простая замена текстуры, типа:
приведёт лишь к этому (кто помнит ухудшение графики в Counter-Strike в версиях 1.3-1.5, тот помнит фиолетовый фон у деревьев):
Оперируя дальше с текстурами вы сможете сделать и протоптанные в снегу дорожки. Всё ограничивается лишь вашей фантазей. Пользуйтесь.
P.S. Полный листинг примера со скринов:
Автор: OKStyle
Одним из нововведений моего 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];
PHP:
RemoveBuildingForPlayer(playerid, 9284, -2907.9375, 2195.7109, -12.2891, 0.25); // сам объект
RemoveBuildingForPlayer(playerid, 9469, -2907.9375, 2195.7109, -12.2891, 0.25); // его LOD
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, из которого наложены слои, и посмотреть текстуры, чтобы понимать, какую нужно менять
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
ВНИМАНИЕ: на деревьях текстуры с альфа-каналом по модели, поэтому простая замена текстуры, типа:
PHP:
SetObjectMaterial(CreateObject(698, -2823.8594, 2245.2578, 114.4063, 0.0, 0.0, 0.0), 1, 3890, "libertygen", "mp_snow"); // вот она, однострочная замена одного слоя
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Оперируя дальше с текстурами вы сможете сделать и протоптанные в снегу дорожки. Всё ограничивается лишь вашей фантазей. Пользуйтесь.
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;
}