Re: Скриптинг курилка -
pawnoholic - 26.10.2017
Quote:
Originally Posted by SPAWN_METAL
Code:
{
"version": "0.1.0",
"command": "${workspaceRoot}/pawno/pawncc.exe",
"args": ["${file}","-D${fileDirname}","-O1","-;+","-(+"],
"showOutput": "always"
}
|
Спасибо, кое что взял из вашего примера и разобрался со всеми проблемами.
1. За место
${relativeFile} - лучше указывать полный путь к файлу (
${file}).
2. Если использовать оболочку
shell, то аргументы лучше передавать в
command или указывать
process и передавать аргументы в
args.
Рабочая задача для компиляции проекта в VS Code:
PHP Code:
{
"version": "2.0.0",
"type": "process",
"args": [
"${file}",
"-;+",
"-(+"
],
"command": "${workspaceRoot}\\pawno\\pawncc.exe"
}
Re: Скриптинг курилка -
Eims - 26.10.2017
Quote:
Originally Posted by narwn
неа, не ищет. Ошибок нет. OR видимо только для 2 (true/false)
|
Что? -_-
"OR" - ИЛИ
"AND" - И
Смотри лог MySQL на предмет ошибок или же смотри какой запрос у тебя получается и пробуй отправлять его прямо из phpMyAdmin
Re: Скриптинг курилка -
Eims - 26.10.2017
Кто силён в тригонометрии?
Нужно написать функцию поворота одного игрока к другому, которая будет работать через GetPlayerFaceAngle. Может кто подсказать формулу вычисления угла поворота для второго игрока относительно угла первого игрока?
Вариант, работающий через координаты, не подходит, так как если оба игрока стоят рядом, функция начинает давать серьёзные погрешности (проверено даже на SetPlayerTargetPlayerAngle из библиотеки
3DTryg)
Re: Скриптинг курилка -
Romz - 26.10.2017
Quote:
Originally Posted by Eims
Кто силён в тригонометрии?
Нужно написать функцию поворота одного игрока к другому, которая будет работать через GetPlayerFaceAngle. Может кто подсказать формулу вычисления угла поворота для второго игрока относительно угла первого игрока?
Вариант, работающий через координаты, не подходит, так как если оба игрока стоят рядом, функция начинает давать серьёзные погрешности (проверено даже на SetPlayerTargetPlayerAngle из библиотеки 3DTryg)
|
Это?
Code:
stock SetPlayerFacingPos(playerid, Float:x, Float:y) {
new Float:Pos[3];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
return SetPlayerFacingAngle(playerid, atan2(y-Pos[1], x-Pos[0])-90.0);
}
Re: Скриптинг курилка -
Eims - 26.10.2017
Quote:
Originally Posted by Romz
Это?
Code:
stock SetPlayerFacingPos(playerid, Float:x, Float:y) {
new Float:Pos[3];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
return SetPlayerFacingAngle(playerid, atan2(y-Pos[1], x-Pos[0])-90.0);
}
|
Уже отбой. Эт я криворукий просто. В 3DTryg всё нормально реализовано.
Уставший просто и лень самому вникать было
Re: Скриптинг курилка -
Eims - 27.10.2017
Таки проблема была не в этом, а в том, что сервер как-то неохотно синхронизирует новые координаты, заданные через SetPlayerPos, если игроки стоят вплотную друг к другу. Это только у меня так или очередная фича сампа?
Re: Скриптинг курилка -
ZiGGi - 27.10.2017
Quote:
Originally Posted by Eims
Таки проблема была не в этом, а в том, что сервер как-то неохотно синхронизирует новые координаты, заданные через SetPlayerPos, если игроки стоят вплотную друг к другу. Это только у меня так или очередная фича сампа?
|
Фича сампа такая, сам с этим мучился.
Re: Скриптинг курилка -
Eims - 27.10.2017
Quote:
Originally Posted by ZiGGi
Фича сампа такая, сам с этим мучился.
|
Решение не найдено?
Re: Скриптинг курилка -
Mcc - 27.10.2017
Quote:
Originally Posted by Eims
Решение не найдено?
|
разворачивать, фризить на секунду/пол секунды а только потом юзать новые координаты, в новом потоке.
костыли.
Re: Скриптинг курилка -
ZiGGi - 27.10.2017
Quote:
Originally Posted by Eims
Решение не найдено?
|
Я немного принцип работы скрипта поменял, стал сразу телепортировать игрока в нужное место. Но если это невозможно, то ты можешь телепортировать игрока за зону стрима, и, после страбатывания OnPlayerStreamOut, телепортировать в нужную точку. Ещё можно попроботвать вместо телепортации менять игроку виртуальный мир.
Re: Скриптинг курилка -
Eims - 27.10.2017
Quote:
Originally Posted by ZiGGi
Я немного принцип работы скрипта поменял, стал сразу телепортировать игрока в нужное место. Но если это невозможно, то ты можешь телепортировать игрока за зону стрима, и, после страбатывания OnPlayerStreamOut, телепортировать в нужную точку. Ещё можно попроботвать вместо телепортации менять игроку виртуальный мир.
|
Мне нужно это для команды, при вводе которой срабатывает анимация для обоих игроков. Собственно, чтоб она срабатывала нормально, нужно телепортировать в конкретную точку перед игроком, так что телепортация за зону стрима не подойдёт, ибо будет заметно (я думал об этом и пытался уже сделать).
А вот виртуальный мир сейчас попробую, но тоже кажется, что не получится сделать незаметно для игроков это
Re: Скриптинг курилка -
pawnoholic - 27.10.2017
Вопрос про таймеры.
Если приблизительно в секунду будет создаваться по 4000 таймеров и это количество планирую увеличить еще раз в 5, как скоро продеться делать рестарт сервера, чтобы они не ушли в минус?
PHP Code:
public OnGameModeInit()
{
for (new i; i < MAX_VEHICLES; i++)
{
SetTimerEx("OnVehicleTickRate", 500, false, "d", i);
}
return 1;
}
forward OnVehicleTickRate(vehicle);
public OnVehicleTickRate(vehicle)
{
if (Vehicle::Data[vehicle][vehicleExists])
{
CallLocalFunction("OnVehicleUpdate", "d", vehicle);
}
return SetTimerEx("OnVehicleTickRate", 500, false, "d", vehicle);
}
Или эффективнее и лучше сделать так?
PHP Code:
public OnGameModeInit()
{
SetTimer("OnVehiclesTickRate", 500, true);
return 1;
}
forward OnVehiclesTickRate();
public OnVehiclesTickRate()
{
for (new i; i < MAX_VEHICLES; i++) if (Vehicle::Data[vehicle][vehicleExists])
{
CallLocalFunction("OnVehicleUpdate", "d", vehicle);
}
return 1;
}
Re: Скриптинг курилка -
Kaperstone - 27.10.2017
Quote:
Originally Posted by pawnoholic
Или эффективнее и лучше сделать так?
PHP Code:
public OnGameModeInit()
{
SetTimer("OnVehiclesTickRate", 500, true);
return 1;
}
forward OnVehiclesTickRate();
public OnVehiclesTickRate()
{
for (new i; i < MAX_VEHICLES; i++) if (Vehicle::Data[vehicle][vehicleExists])
{
CallLocalFunction("OnVehicleUpdate", "d", vehicle);
}
return 1;
}
|
да.
А если ты их будешь уничтожать то рекомендую использовать y_iterate
Re: Скриптинг курилка -
eakwarp - 27.10.2017
Quote:
Originally Posted by pawnoholic
Вопрос про таймеры.
Если приблизительно в секунду будет создаваться по 4000 таймеров и это количество планирую увеличить еще раз в 5, как скоро продеться делать рестарт сервера, чтобы они не ушли в минус?
PHP Code:
public OnGameModeInit()
{
for (new i; i < MAX_VEHICLES; i++)
{
SetTimerEx("OnVehicleTickRate", 500, false, "d", i);
}
return 1;
}
forward OnVehicleTickRate(vehicle);
public OnVehicleTickRate(vehicle)
{
if (Vehicle::Data[vehicle][vehicleExists])
{
CallLocalFunction("OnVehicleUpdate", "d", vehicle);
}
return SetTimerEx("OnVehicleTickRate", 500, false, "d", vehicle);
}
Или эффективнее и лучше сделать так?
PHP Code:
public OnGameModeInit()
{
SetTimer("OnVehiclesTickRate", 500, true);
return 1;
}
forward OnVehiclesTickRate();
public OnVehiclesTickRate()
{
for (new i; i < MAX_VEHICLES; i++) if (Vehicle::Data[vehicle][vehicleExists])
{
CallLocalFunction("OnVehicleUpdate", "d", vehicle);
}
return 1;
}
|
Тут двояко на тему эффективности, в однопоточном программировании есть понятие прерывания, так вот, первый вариант - в плане скорости и использования процессорного времени - шикарен, ибо каждый таймер, не занимает единовременно все процессорное время на себя. Второй случай имеет смысл использовать только если онвехиклапдейт очень легкая функция, ибо в противном случае, каждые пол секунды ты будешь прилично единовременно забирать процессорное время, и пока твой цикл не обработается, ничего другого выполнятся не будет.
Как быстро переполнится? Ну давай приблизительно, 2 000 000 000 / 4000 / 60 / 60 =138 часов ~
Re: Скриптинг курилка -
pawnoholic - 27.10.2017
Quote:
Originally Posted by eakwarp
Тут двояко на тему эффективности, в однопоточном программировании есть понятие прерывания, так вот, первый вариант - в плане скорости и использования процессорного времени - шикарен, ибо каждый таймер, не занимает единовременно все процессорное время на себя. Второй случай имеет смысл использовать только если онвехиклапдейт очень легкая функция, ибо в противном случае, каждые пол секунды ты будешь прилично единовременно забирать процессорное время, и пока твой цикл не обработается, ничего другого выполнятся не будет.
Как быстро переполнится? Ну давай приблизительно, 2 000 000 000 / 4000 / 60 / 60 =138 часов ~
|
Спасибо за разъяснение, буду придерживаться первого варианта, т.к. ранее планировал возможность настройки скорости обновления для каждого ТС.
PHP Code:
public OnGameModeInit()
{
for (new i; i < MAX_VEHICLES; i++)
{
Vehicle::Data[i][vehicleTickRate] = DEFAULT_VEHICLE_TICK_RATE;
SetTimerEx("OnVehicleTickRate", Vehicle::Data[i][vehicleTickRate], false, "d", i);
}
#if defined vehicle_OnGameModeInit
return vehicle_OnGameModeInit();
#else
return true;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit vehicle_OnGameModeInit
#if defined vehicle_OnGameModeInit
forward vehicle_OnGameModeInit();
#endif
forward OnVehicleTickRate(vehicle);
public OnVehicleTickRate(vehicle)
{
if (Vehicle::Data[vehicle][vehicleExists])
{
CallLocalFunction("OnVehicleUpdate", "d", vehicle);
}
return SetTimerEx("OnVehicleTickRate", Vehicle::Data[vehicle][vehicleTickRate], false, "d", vehicle);
}
Re: Скриптинг курилка -
][Noname][ - 28.10.2017
1й вариант создаёт цикл в 2к каждый тик
это эквивалентно циклу до 200*2к=400к в секунду
Re: Скриптинг курилка -
narwn - 29.10.2017
у меня в моде примерно 100 переменных. При входе и при выходе я их обнуляю.
Но есть же перменные которые всё равно перезапишутся после:
cache_get_value_int;
cache_get_value_name;
cache_get_value_float;
Вопрос: как лучше обнулять их?
Re: Скриптинг курилка -
Eims - 29.10.2017
Quote:
Originally Posted by narwn
у меня в моде примерно 100 переменных. При входе и при выходе я их обнуляю.
Но есть же перменные которые всё равно перезапишутся после:
cache_get_value_int;
cache_get_value_name;
cache_get_value_float;
Вопрос: как лучше обнулять их?
|
Зачем обнулять и при входе, и при выходе?
То, что может использоваться до загрузки данных аккаунта (данные авторизации, например), обнуляй после сохранения аккаунта. То, что не используется до загрузки и обновляется данными из базы, можешь вообще не обновлять, ибо незачем. Всё остальное обнуляй когда данные уже не требуются или после сохранения аккаунта.
Re: Скриптинг курилка -
Mcc - 30.10.2017
Давно использую инвентарь на MySQL. С повышением онлайна, задумался о том, чтобы перевести всё на SQL. Что будет быстрее? MYSQL или SQLite (встроенный в сервер) ? Записи инвентаря регулярно обрабатываются запросами UPDATE и SELECT.
На ру-хосте, с нагрузкой в 70-80% (200 игроков) запросы обрабатывались без ощутимых задержек, да и сервер не лагал.
В добавок к убогости - я с 2011 года использую однопоточный плагин MySQL от стрикленда, а не многопоточный от BlueG.
Сомневаюсь я что то насчет пригодности SQL. Те же файлы, только теперь под боком у сервера. По моему, MySQL установленный на машине где установлен сервер, будет все операции производить не оказывая влияния на игровой сервер, и конце выдавать просто готовый результат.
Может куда продуктивнее было бы заняться переводом всех скриптов на MySQL от BlueG?
Re: Скриптинг курилка -
Stepashka - 01.11.2017
Quote:
Originally Posted by eakwarp
Куда копать?
|
В любой другой код который был добавлен и после которого стало "моргать".