Скриптинг курилка

Quote:
Originally Posted by SPAWN_METAL
View Post
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"

Reply

Quote:
Originally Posted by narwn
View Post
неа, не ищет. Ошибок нет. OR видимо только для 2 (true/false)
Что? -_-
"OR" - ИЛИ
"AND" - И
Смотри лог MySQL на предмет ошибок или же смотри какой запрос у тебя получается и пробуй отправлять его прямо из phpMyAdmin
Reply

Кто силён в тригонометрии?
Нужно написать функцию поворота одного игрока к другому, которая будет работать через GetPlayerFaceAngle. Может кто подсказать формулу вычисления угла поворота для второго игрока относительно угла первого игрока?
Вариант, работающий через координаты, не подходит, так как если оба игрока стоят рядом, функция начинает давать серьёзные погрешности (проверено даже на SetPlayerTargetPlayerAngle из библиотеки 3DTryg)
Reply

Quote:
Originally Posted by Eims
View Post
Кто силён в тригонометрии?
Нужно написать функцию поворота одного игрока к другому, которая будет работать через 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);
}
Reply

Quote:
Originally Posted by Romz
View Post
Это?
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 всё нормально реализовано.
Уставший просто и лень самому вникать было
Reply

Таки проблема была не в этом, а в том, что сервер как-то неохотно синхронизирует новые координаты, заданные через SetPlayerPos, если игроки стоят вплотную друг к другу. Это только у меня так или очередная фича сампа?
Reply

Quote:
Originally Posted by Eims
View Post
Таки проблема была не в этом, а в том, что сервер как-то неохотно синхронизирует новые координаты, заданные через SetPlayerPos, если игроки стоят вплотную друг к другу. Это только у меня так или очередная фича сампа?
Фича сампа такая, сам с этим мучился.
Reply

Quote:
Originally Posted by ZiGGi
View Post
Фича сампа такая, сам с этим мучился.
Решение не найдено?
Reply

Quote:
Originally Posted by Eims
View Post
Решение не найдено?
разворачивать, фризить на секунду/пол секунды а только потом юзать новые координаты, в новом потоке.
костыли.
Reply

Quote:
Originally Posted by Eims
View Post
Решение не найдено?
Я немного принцип работы скрипта поменял, стал сразу телепортировать игрока в нужное место. Но если это невозможно, то ты можешь телепортировать игрока за зону стрима, и, после страбатывания OnPlayerStreamOut, телепортировать в нужную точку. Ещё можно попроботвать вместо телепортации менять игроку виртуальный мир.
Reply

Quote:
Originally Posted by ZiGGi
View Post
Я немного принцип работы скрипта поменял, стал сразу телепортировать игрока в нужное место. Но если это невозможно, то ты можешь телепортировать игрока за зону стрима, и, после страбатывания OnPlayerStreamOut, телепортировать в нужную точку. Ещё можно попроботвать вместо телепортации менять игроку виртуальный мир.
Мне нужно это для команды, при вводе которой срабатывает анимация для обоих игроков. Собственно, чтоб она срабатывала нормально, нужно телепортировать в конкретную точку перед игроком, так что телепортация за зону стрима не подойдёт, ибо будет заметно (я думал об этом и пытался уже сделать).
А вот виртуальный мир сейчас попробую, но тоже кажется, что не получится сделать незаметно для игроков это
Reply

Вопрос про таймеры.

Если приблизительно в секунду будет создаваться по 4000 таймеров и это количество планирую увеличить еще раз в 5, как скоро продеться делать рестарт сервера, чтобы они не ушли в минус?

PHP Code:
public OnGameModeInit()
{
    for (new 
iMAX_VEHICLESi++)
    {
        
SetTimerEx("OnVehicleTickRate"500false"d"i);
    }
    return 
1;
}
forward OnVehicleTickRate(vehicle);
public 
OnVehicleTickRate(vehicle)
{
    if (
Vehicle::Data[vehicle][vehicleExists])
    {
        
CallLocalFunction("OnVehicleUpdate""d"vehicle);
    }
    return 
SetTimerEx("OnVehicleTickRate"500false"d"vehicle);

Или эффективнее и лучше сделать так?

PHP Code:
public OnGameModeInit()
{
    
SetTimer("OnVehiclesTickRate"500true);
    
    return 
1;
}
forward OnVehiclesTickRate();
public 
OnVehiclesTickRate()
{
    for (new 
iMAX_VEHICLESi++) if (Vehicle::Data[vehicle][vehicleExists])
    {
        
CallLocalFunction("OnVehicleUpdate""d"vehicle);
    }
    return 
1;

Reply

Quote:
Originally Posted by pawnoholic
View Post
Или эффективнее и лучше сделать так?

PHP Code:
public OnGameModeInit()
{
    
SetTimer("OnVehiclesTickRate"500true);
    
    return 
1;
}
forward OnVehiclesTickRate();
public 
OnVehiclesTickRate()
{
    for (new 
iMAX_VEHICLESi++) if (Vehicle::Data[vehicle][vehicleExists])
    {
        
CallLocalFunction("OnVehicleUpdate""d"vehicle);
    }
    return 
1;

да.

А если ты их будешь уничтожать то рекомендую использовать y_iterate
Reply

Quote:
Originally Posted by pawnoholic
View Post
Вопрос про таймеры.

Если приблизительно в секунду будет создаваться по 4000 таймеров и это количество планирую увеличить еще раз в 5, как скоро продеться делать рестарт сервера, чтобы они не ушли в минус?

PHP Code:
public OnGameModeInit()
{
    for (new 
iMAX_VEHICLESi++)
    {
        
SetTimerEx("OnVehicleTickRate"500false"d"i);
    }
    return 
1;
}
forward OnVehicleTickRate(vehicle);
public 
OnVehicleTickRate(vehicle)
{
    if (
Vehicle::Data[vehicle][vehicleExists])
    {
        
CallLocalFunction("OnVehicleUpdate""d"vehicle);
    }
    return 
SetTimerEx("OnVehicleTickRate"500false"d"vehicle);

Или эффективнее и лучше сделать так?

PHP Code:
public OnGameModeInit()
{
    
SetTimer("OnVehiclesTickRate"500true);
    
    return 
1;
}
forward OnVehiclesTickRate();
public 
OnVehiclesTickRate()
{
    for (new 
iMAX_VEHICLESi++) if (Vehicle::Data[vehicle][vehicleExists])
    {
        
CallLocalFunction("OnVehicleUpdate""d"vehicle);
    }
    return 
1;

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

Как быстро переполнится? Ну давай приблизительно, 2 000 000 000 / 4000 / 60 / 60 =138 часов ~
Reply

Quote:
Originally Posted by eakwarp
View Post
Тут двояко на тему эффективности, в однопоточном программировании есть понятие прерывания, так вот, первый вариант - в плане скорости и использования процессорного времени - шикарен, ибо каждый таймер, не занимает единовременно все процессорное время на себя. Второй случай имеет смысл использовать только если онвехиклапдейт очень легкая функция, ибо в противном случае, каждые пол секунды ты будешь прилично единовременно забирать процессорное время, и пока твой цикл не обработается, ничего другого выполнятся не будет.

Как быстро переполнится? Ну давай приблизительно, 2 000 000 000 / 4000 / 60 / 60 =138 часов ~
Спасибо за разъяснение, буду придерживаться первого варианта, т.к. ранее планировал возможность настройки скорости обновления для каждого ТС.

PHP Code:
public OnGameModeInit()
{
    for (new 
iMAX_VEHICLESi++)
    {
        
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);

Reply

1й вариант создаёт цикл в 2к каждый тик
это эквивалентно циклу до 200*2к=400к в секунду
Reply

у меня в моде примерно 100 переменных. При входе и при выходе я их обнуляю.
Но есть же перменные которые всё равно перезапишутся после:
cache_get_value_int;
cache_get_value_name;
cache_get_value_float;

Вопрос: как лучше обнулять их?
Reply

Quote:
Originally Posted by narwn
View Post
у меня в моде примерно 100 переменных. При входе и при выходе я их обнуляю.
Но есть же перменные которые всё равно перезапишутся после:
cache_get_value_int;
cache_get_value_name;
cache_get_value_float;

Вопрос: как лучше обнулять их?
Зачем обнулять и при входе, и при выходе?
То, что может использоваться до загрузки данных аккаунта (данные авторизации, например), обнуляй после сохранения аккаунта. То, что не используется до загрузки и обновляется данными из базы, можешь вообще не обновлять, ибо незачем. Всё остальное обнуляй когда данные уже не требуются или после сохранения аккаунта.
Reply

Давно использую инвентарь на MySQL. С повышением онлайна, задумался о том, чтобы перевести всё на SQL. Что будет быстрее? MYSQL или SQLite (встроенный в сервер) ? Записи инвентаря регулярно обрабатываются запросами UPDATE и SELECT.

На ру-хосте, с нагрузкой в 70-80% (200 игроков) запросы обрабатывались без ощутимых задержек, да и сервер не лагал.

В добавок к убогости - я с 2011 года использую однопоточный плагин MySQL от стрикленда, а не многопоточный от BlueG.

Сомневаюсь я что то насчет пригодности SQL. Те же файлы, только теперь под боком у сервера. По моему, MySQL установленный на машине где установлен сервер, будет все операции производить не оказывая влияния на игровой сервер, и конце выдавать просто готовый результат.

Может куда продуктивнее было бы заняться переводом всех скриптов на MySQL от BlueG?
Reply

Quote:
Originally Posted by eakwarp
View Post
Куда копать?
В любой другой код который был добавлен и после которого стало "моргать".
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)