Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 20 из 20
  1. #11
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    А как тогда узнать, ускоряется ли автомобиль? Создать еще одну переменную oldspeed и хранить в ней скорость предыдущего обновления?

    Это нормальная реализация?

    1. @_UpdateSpeed(playerid, vehicleid);
    2. @_UpdateSpeed(playerid, vehicleid)
    3. {
    4. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    5. {
    6. for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
    7. return false;
    8. }
    9. new
    10. getspeed = GetVehicleSpeed(vehicleid),
    11. oldspeed = GetPVarInt(playerid, "OldSpeed"),
    12. Float:carhp,
    13. engine,
    14. lights,
    15. alarm,
    16. bonnet,
    17. boot,
    18. objective,
    19. doors;
    20. GetVehicleHealth(vehicleid, carhp);
    21. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    22. if(carhp < 300.0)
    23. {
    24. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    25. SetVehicleHealth(vehicleid, 300.0);
    26. if(is_veh_dmg_first_time{vehicleid} == true)
    27. {
    28. SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
    29. is_veh_dmg_first_time{vehicleid} = false;
    30. }
    31. }
    32. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    33. {
    34. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    35. else if(getspeed >= 1)
    36. {
    37. if(getspeed <= oldspeed)
    38. {
    39. if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
    40. else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
    41. else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
    42. else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
    43. else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
    44. }
    45. else used_fuel_veh[vehicleid] += 1;
    46. }
    47. }
    48. if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
    49. {
    50. veh[vehicleid][v_fuel] -= 1;
    51. used_fuel_veh[vehicleid] = 0;
    52. if(veh[vehicleid][v_fuel] == 0)
    53. {
    54. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    55. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    56. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    57. }
    58. if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
    59. {
    60. new
    61. str[128+1];
    62. format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
    63. mysql_function_query(connect_mysql, str, false, "", "");
    64. }
    65. }
    66. new
    67. string[16];
    68. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    69. PlayerTextDrawSetString(playerid, td_speed[1], string);
    70. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    71. PlayerTextDrawSetString(playerid, td_speed[2], string);
    72. format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    73. PlayerTextDrawSetString(playerid, td_speed[3], string);
    74. for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
    75. SetPVarInt(playerid, "OldSpeed", getspeed);
    76. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    77. return true;
    78. }
    Можно просто передавать в параметр @_UpdateSpeed скорость...
    Да и вообще, зачем тебе знать старую скорость? Смысла никакого нет.

  2. #12
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Да и вообще, зачем тебе знать старую скорость? Смысла никакого нет.
    Чтобы знать, ускоряется/держит скорость ли авто, или останавливается. Если авто стоит/останавливается, потребление бензина ниже, чем при разгоне/движении. Да и с коробкой передач это сочетается (в плане реализма).

  3. #13
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Чтобы знать, ускоряется/держит скорость ли авто, или останавливается. Если авто стоит/останавливается, потребление бензина ниже, чем при разгоне/движении. Да и с коробкой передач это сочетается (в плане реализма).
    Далеко не идеальный вариант, но как-то так:

    1. @_UpdateSpeed(playerid, vehicleid, oldspeed);
    2. @_UpdateSpeed(playerid, vehicleid, oldspeed)
    3. {
    4. static
    5. string[128 + 1],
    6. getspeed = GetVehicleSpeed(vehicleid),
    7. Float:carhp,
    8. engine,
    9. lights,
    10. alarm,
    11. bonnet,
    12. boot,
    13. objective,
    14. doors;
    15. GetVehicleHealth(vehicleid, carhp);
    16. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    17. if(carhp < 300.0)
    18. {
    19. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    20. SetVehicleHealth(vehicleid, 300.0);
    21. if(is_veh_dmg_first_time{vehicleid} == true)
    22. {
    23. SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
    24. is_veh_dmg_first_time{vehicleid} = false;
    25. }
    26. }
    27. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    28. {
    29. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    30. else if(getspeed >= 1)
    31. {
    32. if(getspeed <= oldspeed)
    33. {
    34. if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
    35. else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
    36. else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
    37. else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
    38. else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
    39. }
    40. else used_fuel_veh[vehicleid] += 1;
    41. }
    42. }
    43.  
    44. if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
    45. {
    46. veh[vehicleid][v_fuel] -= 1;
    47. used_fuel_veh[vehicleid] = 0;
    48. if(veh[vehicleid][v_fuel] == 0)
    49. {
    50. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    51. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    52. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    53. }
    54. }
    55.  
    56. static const
    57. status_doors[][] =
    58. {
    59. "UNLOCKED",
    60. "LOCKED"
    61. };
    62.  
    63. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    64. PlayerTextDrawSetString(playerid, td_speed[1], string);
    65. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    66. PlayerTextDrawSetString(playerid, td_speed[2], string);
    67. format(string, sizeof(string), "LOCK: %s", status_doors[_:lock_veh{vehicleid}]);
    68. PlayerTextDrawSetString(playerid, td_speed[3], string);
    69.  
    70. for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
    71.  
    72. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid, getspeed);
    73. return true;
    74. }


    Это, мне кажется, можно при удалении автомобиля запихнуть:
    1. if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
    2. {
    3. new
    4. str[128+1];
    5. format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
    6. mysql_function_query(connect_mysql, str, false, "", "");
    7. }


    Это можно поместить в OnPlayerState, если oldstate == PLAYER_STATE_DRIVER

    1. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    2. {
    3. for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
    4. return false;
    5. }


    - - - Добавлено - - -

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

  4. #14
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Ну начнем с того, что у меня уже есть такой вариант, и я просто забыл обновить:

    1. @_UpdateSpeed(playerid, vehicleid, oldspeed);
    2. @_UpdateSpeed(playerid, vehicleid, oldspeed)
    3. {
    4. new
    5. getspeed = GetVehicleSpeed(vehicleid),
    6. Float:carhp,
    7. string[16],
    8. engine,
    9. lights,
    10. alarm,
    11. bonnet,
    12. boot,
    13. objective,
    14. doors;
    15. GetVehicleHealth(vehicleid, carhp);
    16. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    17. if(carhp <= 300.0)
    18. {
    19. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    20. SetVehicleHealth(vehicleid, 300.0);
    21. if(is_veh_dmg_first_time{vehicleid} == true)
    22. {
    23. SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
    24. is_veh_dmg_first_time{vehicleid} = false;
    25. }
    26. }
    27. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    28. {
    29. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    30. else if(getspeed >= 1)
    31. {
    32. if(getspeed <= oldspeed)
    33. {
    34. if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
    35. else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
    36. else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
    37. else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
    38. else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
    39. }
    40. else used_fuel_veh[vehicleid] += 1;
    41. }
    42. }
    43. if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
    44. {
    45. veh[vehicleid][v_fuel] -= 1;
    46. used_fuel_veh[vehicleid] = 0;
    47. if(veh[vehicleid][v_fuel] == 0)
    48. {
    49. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    50. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    51. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    52. }
    53. }
    54. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    55. PlayerTextDrawSetString(playerid, td_speed[1], string);
    56. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    57. PlayerTextDrawSetString(playerid, td_speed[2], string);
    58. format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    59. PlayerTextDrawSetString(playerid, td_speed[3], string);
    60. for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
    61. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "ddd", playerid, vehicleid, getspeed);
    62. return true;
    63. }


    P.S. Подредактировал свою версию, учтя все замечания execution

    Цитата Сообщение от execution Посмотреть сообщение
    1. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid, getspeed);
    Ошибочка у тебя вышла, тут должно быть "ddd", т.к. передаваемых аргументов в паблик не два, а три.

    Цитата Сообщение от execution Посмотреть сообщение
    У тебя есть массив с хранением данных автомобиля, но используешь другие массивы для хранения отдельной информации, которые могли спокойно фигурировать в основном.
    Приведи пример.
    Последний раз редактировалось SteveStage; 27.01.2020 в 23:46.

  5. #15
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение


    Ошибочка у тебя вышла, тут должно быть "ddd", т.к. передаваемых аргументов в паблик не два, а три.



    Приведи пример.
    1. lock_veh{vehicleid}

  6. Пользователь сказал cпасибо:
    SteveStage (28.01.2020)
  7. #16
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Всем спасибо за помощь) Если появятся какие-либо недочеты и вопросы - отпишу сюда.

  8. #17
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Чтобы знать, ускоряется/держит скорость ли авто, или останавливается. Если авто стоит/останавливается, потребление бензина ниже, чем при разгоне/движении. Да и с коробкой передач это сочетается (в плане реализма).
    Тебе стоит получше почитать про то, как работают автомобили, если ты действительно хочешь реалистичную систему :) Не хочу сам расписывать всё, поэтому вот тебе первая статья из гугла на тему потребления топлива при разгоне :)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #18
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Тебе стоит получше почитать про то, как работают автомобили, если ты действительно хочешь реалистичную систему :) Не хочу сам расписывать всё, поэтому вот тебе первая статья из гугла на тему потребления топлива при разгоне :)
    Ууу, так это еще большая пища для размышлений. Тогда получается, что надо судить потребление по разности новой скорости и старой скорости, в зависимости от количества. Чем разность больше, чем меньше потребление.

    Пока что додумался до такого, что думаете насчет такой реализации?

    1. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    2. {
    3. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    4. else if(getspeed >= 1)
    5. {
    6. if(getspeed >= oldspeed)
    7. {
    8. new
    9. diff = getspeed - oldspeed;
    10. if(diff >= 1 && diff <= 10) used_fuel_veh[vehicleid] += 8;
    11. else if(diff >= 11 && diff <= 20) used_fuel_veh[vehicleid] += 6;
    12. else if(diff >= 21 && diff <= 25) used_fuel_veh[vehicleid] += 4;
    13. else if(diff >= 26 && diff <= 30) used_fuel_veh[vehicleid] += 2;
    14. else used_fuel_veh[vehicleid] += 1;
    15. }
    16. else used_fuel_veh[vehicleid] += 1;
    17. }
    18. }
    Последний раз редактировалось SteveStage; 30.01.2020 в 23:20.

  10. #19
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Ууу, так это еще большая пища для размышлений. Тогда получается, что надо судить потребление по разности новой скорости и старой скорости, в зависимости от количества. Чем разность больше, чем меньше потребление.

    Пока что додумался до такого, что думаете насчет такой реализации?

    1. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    2. {
    3. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    4. else if(getspeed >= 1)
    5. {
    6. if(getspeed >= oldspeed)
    7. {
    8. new
    9. diff = getspeed - oldspeed;
    10. if(diff >= 1 && diff <= 10) used_fuel_veh[vehicleid] += 8;
    11. else if(diff >= 11 && diff <= 20) used_fuel_veh[vehicleid] += 6;
    12. else if(diff >= 21 && diff <= 25) used_fuel_veh[vehicleid] += 4;
    13. else if(diff >= 26 && diff <= 30) used_fuel_veh[vehicleid] += 2;
    14. else used_fuel_veh[vehicleid] += 1;
    15. }
    16. else used_fuel_veh[vehicleid] += 1;
    17. }
    18. }
    И вновь не совсем так :) Дело не в разгоне, а в набранной скорости, ибо, грубо говоря, энергия вращение колёс начинает передаваться двигателю, помогая компенсировать механическое трение, которое при более меньшей скорости компенсируется путём горения топлива.
    Повторюсь, что тема оптимизации потребления топлива гораздо более сложная и тут нужно не по одной краткой статье делать выводы, а вникать в тему более подробно. Как минимум, потому что у разных моделей автомобилей эти системы работают по разному. Так же есть разные виды двигателей, которые по разному обогащают топливо кислородом, из-за чего и разнится количество потребления топлива. И есть ещё множество подобных мелких деталей, которые нужно учитывать, если ты хочешь прямо реализм.

    Только, опять же, не уверен, что кто-то из игроков обратит на это внимание и оценит. Точнее, оценить-то могут, но вот в геймплейном плане это не сделает игру интереснее (особенно с учётом того, какая в игре физика автомобилей). Так что сомневаюсь, что все эти трудозатраты хоть как-то окупятся.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. #20
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    И вновь не совсем так :) Дело не в разгоне, а в набранной скорости, ибо, грубо говоря, энергия вращение колёс начинает передаваться двигателю, помогая компенсировать механическое трение, которое при более меньшей скорости компенсируется путём горения топлива.
    Повторюсь, что тема оптимизации потребления топлива гораздо более сложная и тут нужно не по одной краткой статье делать выводы, а вникать в тему более подробно. Как минимум, потому что у разных моделей автомобилей эти системы работают по разному. Так же есть разные виды двигателей, которые по разному обогащают топливо кислородом, из-за чего и разнится количество потребления топлива. И есть ещё множество подобных мелких деталей, которые нужно учитывать, если ты хочешь прямо реализм.

    Только, опять же, не уверен, что кто-то из игроков обратит на это внимание и оценит. Точнее, оценить-то могут, но вот в геймплейном плане это не сделает игру интереснее (особенно с учётом того, какая в игре физика автомобилей). Так что сомневаюсь, что все эти трудозатраты хоть как-то окупятся.
    Я понял - не стоят нюансы своего. Это как те же мелкие детали в сингле, например закрывающийся магазин на ночь - никто не заметил, никто не оценил. Или тема с майками OG Loc'а/Mad Dog'а и изменение их цен по ходу продвижения сюжета (дада, поляк) - это заметили только через 13-15 лет после выхода игры, и на это почти никто во время игры не обращал внимания.

 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •