PDA

Просмотр полной версии : [Мануал] Выбор скина стандартным способом



nickmate
05.05.2018, 22:23
Внимание: если вы новичок, вам скорее всего будет трудновато разобраться, хотя бы потому что вам придется взаимодействовать с уже имеющимися системами в вашем моде, такими как авторизация/регистрация и т.д.. Я вас предупредил.

Я видел очень много систем выбора скинов. В большинстве случаев они основаны на стандартных меню или textdraw. В то же время очень мало людей используют стандартную систему выбора скинов. Естественно, в обоих случаях есть свои плюсы и минусы. Из плюсов можно отметить: не нужно создавать массив со скинами, все реализовано стандартными методами, да и в целом выглядит это гораздо приятней. Но есть и минусы, один из них - нельзя будет предоставить выбор скинов для какой-либо фракции, только для регистрации. В любом случае, использовать эту систему или нет - решать вам. Я был вдохновлен модом Grand Larceny.

И так, преступим.


Мы имеем массив, в котором хранится список скинов. Так же есть переменная для перебора элементов массива.

Массив, если его представить визуально - будет выглядеть в виде таблицы.


new pedMale[5] = { 78,79,137,200,239 };

Соответственно, выглядеть он будет так:



Ключ массива
Значение


0
78


1
79


2
137


3
200


4
239



В переменной для перебора массива мы храним ключ.


new skinKey;

По умолчанию он равен нулю. Когда игрок нажимает пункт "следующий скин" в меню, переменная skinKey увеличивается на 1. Это называется инкремент.


skinKey++;

Соответственно мы можем обратиться к массиву по ключу:


pedMale[skinKey];

И получим


pedMale[1];

или же



1
79



Установим игроку 79 скин. И, если он нажал сохранить - сохраним. Это все в кратце, подробней посмотреть код и узнать как это все работает вы можете, написав в Google "система выбора скина pawn".

Перейдем к нашей системе.




https://i.imgur.com/pJFtNar.jpg




Для начала определим коодинаты спавна, чтобы потом не искать их по всему моду.
Ко всем #define добавьте следующее:


#define DEFAULT_SPAWN_X 1759.0189
#define DEFAULT_SPAWN_Y -1898.1260
#define DEFAULT_SPAWN_Z 13.5622
#define DEFAULT_SPAWN_ANGLE 266.4503

Соответственно, DEFAULT_SPAWN_X это Х координата, Y - Y, Z - Z, а DEFAULT_SPAWN_ANGLE это угол поворота нашего персонажа.

Идем дальше. Если в игре нажать на кнопку F4, после смерти игрок опять перейдет к выбору персонажа. Чтобы этого не случилось, напишем небольшую проверку.

Ко всем new

new bool:isPlayerLogged[MAX_PLAYERS];

Тут следует оговориться, если у вас уже есть какая-либо переменная, которая проверяет авторизовался игрок или нет - создавать ее не нужно. Так же стоит отметить что в версии SA:MP 0.3.7 константа MAX_PLAYERS по умолчанию равна 1000. Чтобы избежать недоразумений и в последствии и лишней нагрузки на сервер - выполним следующее:



#undef MAX_PLAYERS
#define MAX_PLAYERS 50


Тем самым мы обновили константу и задали ей значение 50. 50 - это количество слотов на вашем сервере, укажите свое число.

Далее нам необходимо определить, какие скины мы хотим предоставить игроку на выбор. Для этого мы будем использовать так называемые "классы персонажа".

В OnGameModeInit() добавьте:



AddPlayerClass(14,DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE,-1,-1,-1,-1,-1,-1);
AddPlayerClass(15,DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE,-1,-1,-1,-1,-1,-1);
AddPlayerClass(101,DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE,-1,-1,-1,-1,-1,-1);
AddPlayerClass(183,DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE,-1,-1,-1,-1,-1,-1);
AddPlayerClass(184,DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE,-1,-1,-1,-1,-1,-1);

AddPlayerClass(14,DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE,-1,-1,-1,-1,-1,-1);

14 - это ID скина. Его вы можете взять тут: http://wiki.sa-mp.com/wiki/Skins:All
DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE - Ваши координаты для спавна, которые мы указывали в начале.

-1,-1,-1,-1,-1,-1 - это оружие и количество патронов к нему. Думаю, что для RP сервера это не понадобится, но все же добавлю ссылку на ID оружия: http://wiki.sa-mp.com/wiki/Weapons

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

Для регистрации.

Если игрок на сервере первый раз, при входе включаем для него режим наблюдения, соответственно стрелок и кнопки "Spawn" он не видит. Показываем ему окно с регистрацией, записываем его данные в базу данных/файл и отключаем режим наблюдения. Сразу же будет вызван коллбэк public OnPlayerRequestClass(playerid, classid) . Здесь нам необходимо задать позицию персонажа и позицию а так же направление камеры. Так же этот коллбэк вызовется после смерти, если до этого игрок нажал F4. Тут то нам и пригодится проверка, описанная выше.

Позицию персонажа и направление камеры, а так же интерьер я взял из мода Grand Larceny.



public OnPlayerRequestClass(playerid, classid)
{
if(isPlayerLogged[playerid]) return SpawnPlayer(playerid); // Если игрок нажал F4, но уже авторизован, не дадим ему выбрать персонажа еще раз
SetPlayerInterior(playerid,11); // Интерьер бара
SetPlayerPos(playerid, 508.7362,-87.4335,998.9609); // Позиция игрока
SetPlayerFacingAngle(playerid, 0); // Угол поворота игрока
SetPlayerCameraPos(playerid, 508.7362,-83.4335,998.9609); // Позиция камеры
SetPlayerCameraLookAt(playerid, 508.7362,-87.4335,998.9609); // Координаты, на которую будет смотреть камера
SetPlayerVirtualWorld(playerid, playerid+1); // Установим виртуальный мир с ID равным ID игрока + 1, ниже объясню зачем это
return 1;
}


Виртуальный мир мы устанавливаем для того, чтобы игроки не видели друг друга при выборе персонажа. У каждого игрока будет свой виртуальный мир. Почему +1? Если зайдет игрок с ID 0, ему присвоится виртуальный мир с ID 0, а это виртуальный мир по умолчанию для всех, его нет смысла использовать. Поэтому мы прибавим 1 к 0 и получим 1, чтобы установить виртуальный мир с ID 1.

Теперь допустим, что игрок выбрал персонажа и нажал кнопку "Spawn". При нажатии этой кнопки вызываются сразу 2 коллбэка.
public OnPlayerRequestSpawn(playerid) и public OnPlayerSpawn(playerid). Отличие в том, что OnPlayerSpawn(playerid) вызовется позже, т.к. он срабатывает тогда, когда игрок уже заспавнился. Ну и естественно, OnPlayerRequestSpawn(playerid) будет вызван только 1 раз, при регистрации, а OnPlayerSpawn(playerid) будет вызываться постоянно, когда игрок будет спавниться, к примеру после смерти. Уберем интерьер и скажем игроку, что все хорошо. А так же укажем, что игрок уже авторизовался.



public OnPlayerRequestSpawn(playerid)
{
isPlayerLogged[playerid] = true;
SendClientMessage(playerid, -1, "Все хорошо. Приятной игры.");
SetPlayerVirtualWorld(playerid, 0);
return 1;
}


На этом с регистрацией все. В OnPlayerRequestSpawn(playerid) можете сохранить скин игрока в вашу базу данных. Или сделать это при выходе, но тогда есть шанс получить скин CJ, если все пойдет не по плану и сохранение не пройдет.

Для авторизации.
По старой схеме вводим в слежку, показываем диалог авторизации, сверяем данные, отключаем слежку. Тут главное не дать игроку выбрать персонажа. Поэтому загружаем из данных скин игрока и сразу же спавним его. Естественно, если введенный пароль верный.



TogglePlayerSpectating(playerid, 0); // Отключаем слежку
SetSpawnInfo( playerid, 255, YOUR_SKIN_HERE, DEFAULT_SPAWN_X, DEFAULT_SPAWN_Y, DEFAULT_SPAWN_Z, DEFAULT_SPAWN_ANGLE, ,-1,-1,-1,-1,-1,-1 ); // Задаем параметры для спавна
SpawnPlayer(playerid); // Спавним
IsPlayerLogged[playerid] = true; // Игрок авторизован


Не забудьте поменять YOUR_SKIN_HERE на скин, загруженный из базы данных. Аргументы функции вы можете посмотреть тут: http://wiki.sa-mp.com/wiki/SetSpawnInfo. 255 - это команда игрока, по умолчанию 255 означает что у игрока нет команды. (команда, в смысле команда из игроков, а не команда, которая делает какое-либо действие).

На этом все. Если будут какие-либо мысли, прошу в комментарии.