PDA

Просмотр полной версии : [DM] LLSDM



m1n1vv
10.08.2019, 10:22
http://tscars.narod.ru/llsdm/LLSDM.png
beta

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

P.S. В этой версии нет ТД. Она только для проверки систем. Сейчас активировано где-то 130 билбордов и создано 40 транспортных средств.
Несколько месяцев отдыхал от SA-MP

Разработка:

Спавн (https://youtu.be/RojkwmyyqLI)
Спецтранспорт (https://youtu.be/uxzHirFkpuU):

Полиция (1) (https://youtu.be/EhhsVWExN70)
Полиция (2) (https://youtu.be/gFoKNL7img0)
Инкассаторские фургоны (1) (https://youtu.be/WwaBS6JNnvE)
Инкассаторские фургоны (2) (https://youtu.be/wVc8T0wv3Vo)
Кареты скорой помощи (https://youtu.be/3psv12SiUJc)
Грузовики (https://youtu.be/HWXWfKqGdC8)


Клавиша 'F' (https://youtu.be/hxPs3aOn_e8)
Амуниция (https://youtu.be/AGoS_fV0R0A)
Рюкзак (https://youtu.be/tuHB0MqDD6U)
Билборды (https://youtu.be/nd88Zsk02Tc)
Два основных оружия (https://youtu.be/lrVqKddH37c)


Репозиторий: https://github.com/llsdm/LLSDM
Скачать: https://github.com/llsdm/LLSDM/releases
Вики: https://github.com/llsdm/LLSDM/wiki
Веб настройка: https://github.com/llsdm/llsdm-web-settings

Kovshevoy
10.08.2019, 11:51
Не думал, что ты его выложишь. Однозначно респект, годная задумка.

DeimoS
10.08.2019, 14:15
Вот это всё
mysql_tquery(mysql_connect_ID, !"SET CHARACTER SET 'utf8'", "", "");
mysql_tquery(mysql_connect_ID, !"SET NAMES 'utf8'", "", "");
mysql_tquery(mysql_connect_ID, !"SET character_set_client = 'cp1251'", "", "");
mysql_tquery(mysql_connect_ID, !"SET character_set_connection = 'cp1251'", "", "");
mysql_tquery(mysql_connect_ID, !"SET character_set_results = 'cp1251'", "", "");
mysql_tquery(mysql_connect_ID, !"SET SESSION collation_connection = 'utf8_general_ci'", "", "");

Можно заменить вот этой строчкой :)
mysql_set_charset("cp1251");
Вот тут (http://pro-pawn.ru/showthread.php?13641-%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B-%D1%81-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%BE%D0%B9-%D0%B2-MySQL-R33&p=91293#post91293) подробнее расписывал почему так.



Так как тема соответствует правилам, переношу её в основной раздел.

m1n1vv
10.08.2019, 14:38
Вот это всё
mysql_tquery(mysql_connect_ID, !"SET CHARACTER SET 'utf8'", "", "");
mysql_tquery(mysql_connect_ID, !"SET NAMES 'utf8'", "", "");
mysql_tquery(mysql_connect_ID, !"SET character_set_client = 'cp1251'", "", "");
mysql_tquery(mysql_connect_ID, !"SET character_set_connection = 'cp1251'", "", "");
mysql_tquery(mysql_connect_ID, !"SET character_set_results = 'cp1251'", "", "");
mysql_tquery(mysql_connect_ID, !"SET SESSION collation_connection = 'utf8_general_ci'", "", "");

Можно заменить вот этой строчкой :)
mysql_set_charset("cp1251");
Вот тут (http://pro-pawn.ru/showthread.php?13641-%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B-%D1%81-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%BE%D0%B9-%D0%B2-MySQL-R33&p=91293#post91293) подробнее расписывал почему так.



Так как тема соответствует правилам, переношу её в основной раздел.

Спасибо

Daniel_Cortez
10.08.2019, 21:53
Недочёты, общие для всего мода:

Релиз загружен в RAR-архиве. Этим форматом ещё кто-то пользуется?

В нескольких файлах табы смешаны с пробелами, равно как и есть лишние табы и пробелы в конце строк.

Во многих системах направо и налево используются перехваты коллбэков SA-MP - в таком виде перехваты вызываются только в порядке подключения инклудов и никак иначе. Но что, если понадобится перехваты одного коллбэка вызывать в одном порядке, а другого - в другом?


Ещё несколько недочётов, которые заметил при беглом просмотре кода (вернее, в одном случайно выбранном файле: uiv.inc):

В самом начале файла:

const //vehicleid
AMBULANCE = 416,
COLLECTOR = 428,
TRUCK = 433,
POLICE_VAN = 427,
POLICE_LS = 596,
POLICE_SF = 597,
POLICE_LV = 598,
POLICE_JEEP = 599;

Глобальное пространство имён засоряется константами со слишком простыми названиями. Здесь есть смысл либо в названии констант добавить больше конкретики (например, не "AMBULANCE", а "VEHMODEL_AMBULANCE"), либо использовать static enum.


В функции TrunkOrRearDoorsOfVehicle():

trunk =
uiv_vehicleid[playerid] = 0;

Это намеренно такой стиль для "двойного" присваивания? Спрашиваю потому, что ничего подобного видеть нигде не доводилось и этот код больше похож на ошибку, как будто забыли дописать присваивание к trunk, но по "счастливой" случайности код скомпилировался и ошибка осталась незамеченной.


В функции GetVehTrunk()

new
Float:dis;
dis = dis/2 - distance;

Здесь можно заметить сразу две ошибки: переменная dis используется в выражении, но не инициализирована (см. "warning 210" (http://pro-pawn.ru/showthread.php?16839-warning-210)), и деление происходит на целое число (2) вместо вещественного (2.0), т.е. будет лишняя конверсия из "2" в "2.0" во время каждого выполнения функции GetVehTrunk().

m1n1vv
11.08.2019, 02:01
1. Аналогичных констант для задач не будет. Так что без приставки.
2. Делать из мухи слона? Что ли так сделать:

trunk = uiv_vehicleid[playerid] = 0;

m1n1vv
11.08.2019, 08:01
Первый шаблон TD Hud (https://i.imgur.com/ukAR3Yb.png)

https://i.imgur.com/ukAR3Yb.png

execution
11.08.2019, 11:05
В admin_cmd_say мало выделил ячеек:

new
string[25] = !"Администратор ";

strcat(string, pInfo[playerid][pName]);
strcat(string, !":{FFFFFF} ");
strcat(string, params);
SendClientMessageToAll(COLOR_ADMIN, string);

m1n1vv
11.08.2019, 12:35
В admin_cmd_say мало выделил ячеек:

new
string[25] = !"Администратор ";

strcat(string, pInfo[playerid][pName]);
strcat(string, !":{FFFFFF} ");
strcat(string, params);
SendClientMessageToAll(COLOR_ADMIN, string);

Строка упакована

Daniel_Cortez
13.08.2019, 00:17
1. Аналогичных констант для задач не будет. Так что без приставки.
Ну так я потому и предложил static enum, чтобы хотя бы ограничить область видимости констант до одного инклуда и перестраховаться на случай совпадения имён. Вреда от этого никакого не будет в любом случае.



2. Делать из мухи слона?
Никто в этой теме слона не раздувает, просто указывают на возможные недочёты.



Что ли так сделать:

trunk = uiv_vehicleid[playerid] = 0;
В подобных случаях обычно так и делают (если не всегда, то точно в подавляющем большинстве из тех случаев, что приходилось наблюдать).


В догонку, ещё один бросившийся в глаза недочёт, о котором забыл написать в прошлый раз: функции и переменные названы в разнобой, как будто над кодом работали два разных человека, ни разу не видевшие код друг у друга.
Например, в том же uiv.inc: "SetVehicleDrop", "TrunkOrRearDoorsOfVehicle", но "GetVehTrunk".
Или в billboards.inc: массивы с координатами билбордов названы "billboard_objects", "billboard_objects_logo", "billboard_block_objs_t1" и т.д., но массив с информацией о билбордах почему-то назван "BillboardInfo", в стиле CamelCase, как будто это функция. И это не говоря о "BILLBOARDS_NUMS_LEADER" и "BILLBOARDS_NUMS_LOGO", которые не константы.

Также не совсем понятно на счёт этого коммита:
https://github.com/llsdm/LLSDM/commit/2c6d28bebd2d6082d391f28c3716e54895f59d09
Зачем нужно было в одном месте оставлять "return SendClientMessage(...)" как есть, а в другом переделывать в "SendClientMessage(...);\return 1;" ?

m1n1vv
13.08.2019, 10:09
Ну так я потому и предложил static enum, чтобы хотя бы ограничить область видимости констант до одного инклуда и перестраховаться на случай совпадения имён. Вреда от этого никакого не будет в любом случае.



Никто в этой теме слона не раздувает, просто указывают на возможные недочёты.



В подобных случаях обычно так и делают (если не всегда, то точно в подавляющем большинстве из тех случаев, что приходилось наблюдать).


В догонку, ещё один бросившийся в глаза недочёт, о котором забыл написать в прошлый раз: функции и переменные названы в разнобой, как будто над кодом работали два разных человека, ни разу не видевшие код друг у друга.
Например, в том же uiv.inc: "SetVehicleDrop", "TrunkOrRearDoorsOfVehicle", но "GetVehTrunk".
Или в billboards.inc: массивы с координатами билбордов названы "billboard_objects", "billboard_objects_logo", "billboard_block_objs_t1" и т.д., но массив с информацией о билбордах почему-то назван "BillboardInfo", в стиле CamelCase, как будто это функция. И это не говоря о "BILLBOARDS_NUMS_LEADER" и "BILLBOARDS_NUMS_LOGO", которые не константы.

Также не совсем понятно на счёт этого коммита:
https://github.com/llsdm/LLSDM/commit/2c6d28bebd2d6082d391f28c3716e54895f59d09
Зачем нужно было в одном месте оставлять "return SendClientMessage(...)" как есть, а в другом переделывать в "SendClientMessage(...);\return 1;" ?


1. static enum с какой версии?
2. Да, с названиями функций и переменных есть косяк. Поправлю.
3. Когда создавал файл на gh, return был под SCM. Там это и поправил. Но со временем заметил неправильную табуляцию (4 пробела, а не таб). Поправил ее через сублайм, а сделать return SCM забыл.
4. "BILLBOARDS_NUMS_LEADER" и "BILLBOARDS_NUMS_LOGO" в верхнем регистре, чтобы не копаться, а сразу видеть счетчики.

Пару вопросов.
1. Есть SetTimerEx с двумя параметрами: playerid, vehicleid. Если запустить его у разных игроков, то значения параметров для каждого игрока будут же свои на всей протяженности работы таймера? А то я чет запутался.
2. Что проще? Сделать bodypart и свой урон в WeaponShot, или попытаться ловить фейковые пакеты TakeDamage?

Daniel_Cortez
13.08.2019, 12:48
1. static enum с какой версии?
С версии 3.10.2, которая вышла ещё 2 с половиной года назад.


1. Есть SetTimerEx с двумя параметрами: playerid, vehicleid. Если запустить его у разных игроков, то значения параметров для каждого игрока будут же свои на всей протяженности работы таймера? А то я чет запутался.
В таймерную функцию передаются те значения, которые были переданы в SetTimerEx(). Даже если для двух разных игроков создать два таймера с одной и той же таймерной функцией, это будут два разных таймера и для каждого из них в таймерную функцию будет передаваться свой ID игрока.

m1n1vv
13.08.2019, 13:05
С версии 3.10.2, которая вышла ещё 2 с половиной года назад.


В таймерную функцию передаются те значения, которые были переданы в SetTimerEx(). Даже если для двух разных игроков создать два таймера с одной и той же таймерной функцией, это будут два разных таймера и для каждого из них в таймерную функцию будет передаваться свой ID игрока.

Значит ничего ставить не нужно. Но static enum не подойдет. В uiv_editor используются те константы. А по поводу WeaponShot и TakeDamage?

m1n1vv
13.08.2019, 18:22
Ну так я потому и предложил static enum, чтобы хотя бы ограничить область видимости констант до одного инклуда и перестраховаться на случай совпадения имён. Вреда от этого никакого не будет в любом случае.

То есть мне в каждом инклуде можно все const перенести в static enum?

DeimoS
14.08.2019, 09:49
Вообще, если ты пишешь код в инклудах, хорошим тоном будет вызывать все переменные из инклуда через функции, а не напрямую. Это обеспечит более лучшую зону видимости этих переменных (функции с ними можно будет вызывать даже до кода подключения инклуда) и в коде вне инклудов не появятся какие-то непонятные переменные, место инициализации которых придётся выискивать. И вот там уже static enum будет в тему (как и вообще использование static для всех переменных).
ИМХО

m1n1vv
14.08.2019, 09:59
Вообще, если ты пишешь код в инклудах, хорошим тоном будет вызывать все переменные из инклуда через функции, а не напрямую. Это обеспечит более лучшую зону видимости этих переменных (функции с ними можно будет вызывать даже до кода подключения инклуда) и в коде вне инклудов не появятся какие-то непонятные переменные, место инициализации которых придётся выискивать. И вот там уже static enum будет в тему (как и вообще использование static для всех переменных).
ИМХО

То есть это

stock IsPlayerAFK(playerid) return player_afk{playerid};
будет лучше чем это?

#define IsPlayerAFK(%0) player_afk{%0}

DeimoS
14.08.2019, 10:04
То есть это

stock IsPlayerAFK(playerid) return player_afk{playerid};
будет лучше чем это?

#define IsPlayerAFK(%0) player_afk{%0}

В плане зоны видимости - да, несомненно. От первого ты, возможно, и потеряешь, грубо говоря, пару тиков, но у тебя уже будет уверенность в том, что ты из любой точки скрипта можешь обратиться к функции и не забивать себе голову мыслями о том, находится ли код создания макроса выше твоего текущего кода или нет, что для паблик-мода, как мне кажется, особенно важно.
Для той же системы аккаунта это создаёт дополнительное удобство - можно прописать запрос на сохранение данных в БД прямо внутри функции изменения каждой переменной и, вызывая функцию, у тебя всегда будут актуальные данные в БД.

m1n1vv
14.08.2019, 11:51
В плане зоны видимости - да, несомненно. От первого ты, возможно, и потеряешь, грубо говоря, пару тиков, но у тебя уже будет уверенность в том, что ты из любой точки скрипта можешь обратиться к функции и не забивать себе голову мыслями о том, находится ли код создания макроса выше твоего текущего кода или нет, что для паблик-мода, как мне кажется, особенно важно.
Для той же системы аккаунта это создаёт дополнительное удобство - можно прописать запрос на сохранение данных в БД прямо внутри функции изменения каждой переменной и, вызывая функцию, у тебя всегда будут актуальные данные в БД.

А как мне лучше реализовать свой урон? Через WeaponShot Или GiveDamage? Хочу каждой части тела свой урон, но тут для каждой группы анимаций нужно давать свои координаты. Еще учитывать дистанцию.
АЧ на отключение Give/Take есть.

DeimoS
14.08.2019, 15:14
А как мне лучше реализовать свой урон? Через WeaponShot Или GiveDamage? Хочу каждой части тела свой урон, но тут для каждой группы анимаций нужно давать свои координаты. Еще учитывать дистанцию.
АЧ на отключение Give/Take есть.

Я бы, наверное, через OnPlayerWeaponShot сделал, если интересует урон только от оружия.
Но вообще уже довольно давно не ковырял эти коллбэки, так что не уверен, что мой выбор будет правильным в данном случае.

Можешь просто сделать логирование и провести пару тестов, нанося нужный тебе урон. Ну и прикинуть уже в каком из коллбэков твоя система будет лучше работать и/или проще в реализации.

m1n1vv
14.08.2019, 16:43
Я бы, наверное, через OnPlayerWeaponShot сделал, если интересует урон только от оружия.
Но вообще уже довольно давно не ковырял эти коллбэки, так что не уверен, что мой выбор будет правильным в данном случае.

Можешь просто сделать логирование и провести пару тестов, нанося нужный тебе урон. Ну и прикинуть уже в каком из коллбэков твоя система будет лучше работать и/или проще в реализации.

Конечно в GiveDamage. Так уже есть bodypart. Еще WeaponShot вызывается до нанесения урона и с этим могут возникнуть проблемы.

DeimoS
14.08.2019, 19:23
Конечно в GiveDamage. Так уже есть bodypart.

GiveDamage можно вызывать ложно, насколько помнится. И чтоб более-менее отследить ложное срабатывание, всё равно потребуется использовать OnPlayerWeaponShot, проверяя факт выстрела.


Еще WeaponShot вызывается до нанесения урона и с этим могут возникнуть проблемы.

Какие? Ты же в любом случае будешь блокировать серверный урон и делать свой. Это наоборот сыграет тебе на руку.

m1n1vv
14.08.2019, 21:26
Какие? Ты же в любом случае будешь блокировать серверный урон и делать свой. Это наоборот сыграет тебе на руку.

Так сначала я ставлю здоровье, а только потом наносится урон. Getpllayerhealth будет определять, не то что я установил, а что было нанесено после.

DeimoS
14.08.2019, 23:28
Так сначала я ставлю здоровье, а только потом наносится урон. Getpllayerhealth будет определять, не то что я установил, а что было нанесено после.

Возвращая 0 в OnPlayerWeaponShot, сервер не будет отсылать пакеты с уроном тому, в кого выстрелили. Так что сработает только SetPlayerHealth.
И у TakeDamage схожий принцип работы, если мне память не изменяет.

m1n1vv
15.08.2019, 11:12
Возвращая 0 в OnPlayerWeaponShot, сервер не будет отсылать пакеты с уроном тому, в кого выстрелили. Так что сработает только SetPlayerHealth.
И у TakeDamage схожий принцип работы, если мне память не изменяет.

А точно. Но с bodypart большая возня будет.

DeimoS
15.08.2019, 12:34
А точно. Но с bodypart большая возня будет.

Можно сделать определение части тела по координатам довольно легко. Где-то даже видел готовый скрипт на этот счёт.
Другое дело, что если тебе хватит тех частей тела, которые выдаёт OnPlayerTakeDamage, то особого смысла в OnPlayerWeaponShot и правда нет (хотя с системой серверного урона античит на оружие и фейковые вызовы будет особенно важным, так что OnPlayerWeaponShot в любом случае придётся задействовать).
Просто с OnPlayerWeaponShot можно сделать, например, попадание по внутренним органам, если заморочиться с координатами. Ну и всё в таком духе. В общем, можно более продуманную систему урона реализовать.

m1n1vv
15.08.2019, 15:02
Можно сделать определение части тела по координатам довольно легко. Где-то даже видел готовый скрипт на этот счёт.
Другое дело, что если тебе хватит тех частей тела, которые выдаёт OnPlayerTakeDamage, то особого смысла в OnPlayerWeaponShot и правда нет (хотя с системой серверного урона античит на оружие и фейковые вызовы будет особенно важным, так что OnPlayerWeaponShot в любом случае придётся задействовать).
Просто с OnPlayerWeaponShot можно сделать, например, попадание по внутренним органам, если заморочиться с координатами. Ну и всё в таком духе. В общем, можно более продуманную систему урона реализовать.

Я сделал определение частей тела для анимации стоя. И придется делать так для каждой...
С органами возникнут проблемы. Почему-то когда стреляю в торс игрока вблизи, оно определяет как торс, а издалека уже другие части тела.

Вопрос не по моду. Как научить gh desktop менять кодировку на юфт?

m1n1vv
15.08.2019, 17:54
Было:

const
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
Float:AIR_DISTANCE = 4500.0,
Float:AIR_FLIGHT = 400.0,
Float:AIR_SPEED = 200.0;

Сделал:

static enum
{
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
Float:AIR_DISTANCE = 4500.0,
Float:AIR_FLIGHT = 400.0,
Float:AIR_SPEED = 200.0
}


Спавнюсь с белым экран с выходом за карту. В чем дело?

Daniel_Cortez
15.08.2019, 18:31
Было:

const
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
Float:AIR_DISTANCE = 4500.0,
Float:AIR_FLIGHT = 400.0,
Float:AIR_SPEED = 200.0;

Сделал:

static enum
{
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
Float:AIR_DISTANCE = 4500.0,
Float:AIR_FLIGHT = 400.0,
Float:AIR_SPEED = 200.0
}


Спавнюсь с белым экран с выходом за карту. static enum понимает вещественные значения?
Да, понимает, как и в обычном enum (более того, в компиляторе за обработку enum и static enum отвечает один и тот же код).

Пробовал найти что-то странное на пустом скрипте, безрезультатно. Дело явно не в static enum.

#include <a_samp>

static enum
{
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
Float:AIR_DISTANCE = 4500.0,
Float:AIR_FLIGHT = 400.0,
Float:AIR_SPEED = 200.0
};

main()
{
printf("MAX_AIR_OBJECTS: %d", MAX_AIR_OBJECTS);
printf("SPAWN_DISTANCE_AREA: %.1f", SPAWN_DISTANCE_AREA);
printf("AIR_DISTANCE: %.1f", AIR_DISTANCE);
printf("AIR_FLIGHT: %.1f", AIR_FLIGHT);
printf("AIR_SPEED: %.1f", AIR_SPEED);
}



MAX_AIR_OBJECTS: 4
SPAWN_DISTANCE_AREA: 1500.0
AIR_DISTANCE: 4500.0
AIR_FLIGHT: 400.0
AIR_SPEED: 200.0

m1n1vv
15.08.2019, 18:52
Да, понимает, как и в обычном enum (более того, в компиляторе за обработку enum и static enum отвечает один и тот же код).

Пробовал найти что-то странное на пустом скрипте, безрезультатно. Дело явно не в static enum.

#include <a_samp>

static enum
{
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
Float:AIR_DISTANCE = 4500.0,
Float:AIR_FLIGHT = 400.0,
Float:AIR_SPEED = 200.0
};

main()
{
printf("MAX_AIR_OBJECTS: %d", MAX_AIR_OBJECTS);
printf("SPAWN_DISTANCE_AREA: %.1f", SPAWN_DISTANCE_AREA);
printf("AIR_DISTANCE: %.1f", AIR_DISTANCE);
printf("AIR_FLIGHT: %.1f", AIR_FLIGHT);
printf("AIR_SPEED: %.1f", AIR_SPEED);
}



MAX_AIR_OBJECTS: 4
SPAWN_DISTANCE_AREA: 1500.0
AIR_DISTANCE: 4500.0
AIR_FLIGHT: 400.0
AIR_SPEED: 200.0


Сейчас столкнулся с еще одной ситуацией. Если все константы с инклуда билбордов взять в static enum, то один из типов перестанет создаваться. Можешь сам проверить (https://github.com/llsdm/LLSDM/releases)

Вот функция, которая создает позицию:

stock GetDirectionOfAircraft(&Float:angle, &Float:x, &Float:y, &Float:fpoint_x, &Float:fpoint_y, Float:fault = 0.0)
{
new
Float:distance = AIR_DISTANCE;

angle = floatrandom(360);
x = distance * -floatsin(angle, degrees);
y = distance * floatcos(angle, degrees);

distance *= 2.0;
angle += fault + floatrandom(90) - 60.0;
fpoint_x = x + distance * -floatsin(angle, degrees);
fpoint_y = y + distance * floatcos(angle, degrees);

return 1;

}



#define floatrandom(%0) \
(float(random(%0))+float(random(1000))/1000)

m1n1vv
15.08.2019, 20:52
Сейчас из enum переместил вещественную константу в const, и второй тип билбордов стал создаваться. Видимо оно очень высоко или очень низко создавало.

Daniel_Cortez
15.08.2019, 21:19
Нашёл способ, как можно воспроизвести проблему:

static enum
{
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
};

main()
{
new x, Float:f;
#pragma unused f, x
#assert tagof(MAX_AIR_OBJECTS) == tagof(x)
#assert tagof(SPAWN_DISTANCE_AREA) == tagof(f)
}



test.pwn(12) : fatal error 110: assertion failed: tagof(SPAWN_DISTANCE_AREA) == tagof(f)

Т.е. у константы SPAWN_DISTANCE_AREA тег не "Float", а "_". Иначе говоря, при объявлении констант через enum тег игнорируется. Пока что не уверен, баг это или фича (больше склоняюсь к первому, но мало ли). Завтра попробую разобраться, если будет время.

m1n1vv
15.08.2019, 21:24
Нашёл способ, как можно воспроизвести проблему:

static enum
{
MAX_AIR_OBJECTS = 4,
Float:SPAWN_DISTANCE_AREA = 1500.0,
};

main()
{
new x, Float:f;
#pragma unused f, x
#assert tagof(MAX_AIR_OBJECTS) == tagof(x)
#assert tagof(SPAWN_DISTANCE_AREA) == tagof(f)
}



test.pwn(12) : fatal error 110: assertion failed: tagof(SPAWN_DISTANCE_AREA) == tagof(f)

Т.е. у константы SPAWN_DISTANCE_AREA тег не "Float", а "_". Пока что не уверен, баг это или фича (больше склоняюсь к последнему, но мало ли). Попробую разобраться завтра, если будет время.

Заранее спасибо. А то я уже отписал в репозиторий

m1n1vv
15.08.2019, 22:31
Короче нужно создавать 2 static enum. Для целых и вещественных.


static enum
{
MAX_AIR_OBJECTS = 4
};

static enum Float:
{
SPAWN_DISTANCE_AREA = 1500.0
};

m1n1vv
19.08.2019, 18:46
http://tscars.narod.ru/llsdm/LLSDM.png
v0.2 beta

https://i.imgur.com/O5k4Zq5.png


player:

Изменена подгрузка анимаций;
Добавлена функция проверки AFK;
В инвентарь добавлены 2 функции: GivePlayerKits и GetPlayerKits;
Добавлено вознаграждение на убийство. Функция: GivePlayerExperience;
Сделан TD отображающий версию мода (встречал баг, что первый TD был виден без show);
Сделан TD худ игрока.


uvehicles:

Если игрок в AFK, то деньги с сумки не будут начисляться и через 20 секунд произойдет респавн;
Исправлен баг с сумкой. За работу сервера можно было только один раз взять сумку для одного ида.



Репозиторий: https://github.com/llsdm/LLSDM
Скачать: https://github.com/llsdm/LLSDM/releases
Вики: https://github.com/llsdm/LLSDM/wiki
Веб настройка: https://github.com/llsdm/llsdm-web-settings

m1n1vv
22.08.2019, 17:32
Начал рисовать инвентарь (https://i.imgur.com/NZG2sZ7.png)

https://i.imgur.com/NZG2sZ7.png (https://i.imgur.com/NZG2sZ7.png)

m1n1vv
30.08.2019, 13:47
https://www.youtube.com/watch?v=hoeDy_8lBwA

m1n1vv
06.09.2019, 17:10
http://tscars.narod.ru/llsdm/LLSDM.png
v0.3 beta

https://i.imgur.com/uBPCQFr.png


На клавиши и в сохранения добавлена проверка на авторизацию;
Постепенно изменяются названия переменных для общего вида.




player

Исправлен ТД худа. При сглаживании края размывались
Блок с именем оружия растягивается до края, если у игрока нет в руках оружия
Исправлен поиск лидера
Исправлено сохранение здоровья
Добавлена карта на клавишу N. Ваш маркер красного цвета. У игроков с сумкой желтого


uvehicles

В коллекторы добавлены функции для удобной работы с игроками, у которых есть сумка:

AddPlayerIDInArrayCollector — добавить игрока в спец. массив
ClearPlayerIDFromArrayCollector — удалить игрока из спец. массива
GetPlayerIDInArrayCollector — узнать ID игрока по индексу массива



global

Исправлено отображение билбордов



Репозиторий: https://github.com/llsdm/LLSDM
Скачать: https://github.com/llsdm/LLSDM/releases
Вики: https://github.com/llsdm/LLSDM/wiki
Веб настройка: https://github.com/llsdm/llsdm-web-settings

m1n1vv
05.10.2019, 13:26
http://tscars.narod.ru/llsdm/LLSDM.png
v0.4 beta


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

Теперь любое оружие будет приносить свой опыт за убийство. А деньги - количество убийств за жизнь умноженное на 100, и если это будет лидер, сумма удвоится в 2 раза.

Прокачивать опыт можно будет через карты, которые вы будете получать после убийства. За обычно игрока получите "Карточка опыта оружия", а за лидера "Карточка опыта оружия PRO".

А если вы лидер, за каждое убийство получаете "Карточка опыта оружия PRO" и x2 денег.


Карточка опыта оружия: +100XP
Карточка опыта оружия PRO: +500XP


Для этого создайте varchar поле с именем pWeapoExp на 50 символов.

Помимо этого началась подготовка мода к режиму, где после смерти все остается

Репозиторий: https://github.com/llsdm/LLSDM
Скачать: https://github.com/llsdm/LLSDM/releases
Вики: https://github.com/llsdm/LLSDM/wiki
Веб настройка: https://github.com/llsdm/llsdm-web-settings

DeimoS
05.10.2019, 15:39
Для этого создайте varchar поле с именем pWeapoExp на 50 символов.

А чего автосоздание столбцов не сделаешь?

m1n1vv
05.10.2019, 17:34
А чего автосоздание столбцов не сделаешь?

Как?

tnc
05.10.2019, 23:50
Как?

Вот так. (http://www.mysql.ru/docs/man/ALTER_TABLE.html)

DeimoS
06.10.2019, 00:54
Вывести список существующих столбцов можно так:
SHOW COLUMNS FROM table
А проверить наличие конкретного столбца можно так
SHOW COLUMNS FROM table LIKE 'column_name'

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