Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±

    Алгоритм фиксирования HP автомобиля

    Друзья, мне необходимо составить наиболее эффективный и наименее затратный алгоритм фиксирования HP автомобиля.
    Наверняка многие из вас играли на Role Play серверах и там при повреждении автомобиля до определенного уровня HP, он якобы ломался.
    Я сделал подобную систему через OnVehicleDamageStatusUpdate, но изначально было понятно что она не будет работать как нужно. Так как в колбэке имеются возвращаемые vehicleid and playerid мы сможем узнавать HP автомобиля, но к сожалению не сможем получать урон при ударе об стену (конечно можно использовать глобальную переменную и создать некую формулу).
    Даже если вопрос с уроном решить костыльным (на мой взгляд) способом, то колбэк OnVehicleDamageStatusUpdate кажется не срабатывает когда по автомобилю наносят урон с оружия (но это не точно) следовательно необходимо получать и записывать HP автомобиля в таймере, но опять же возникает следующая проблема, а именно то что когда автомобиль якобы сломался и далее по нему нанесли еще какой-то урон, то автомобиль снова якобы сломается (видно будет на примере мою мысль), то есть он никогда не взорвется, хотя по моей идее он должен уже загореться и взорваться, это можно исправить используя переменную с булевым значением (но это опять костыль...).
    То бишь подведем итог: мне необходимо сделать так, чтобы когда HP автомобиля достигала менее 300 единиц, то автомобиль ломался, а если уже по поломанному автомобилю нанесли еще урон - он взрывался.
    То что было сделано мною ранее:
    Код:
    vehicle_OnVehicleDamageStatusUp(vehicleid, playerid)
    {
        new Float:carhp, engine,lights,alarm,doors,bonnet,boot,objective;
        GetVehicleHealth(vehicleid, carhp);
        if(carhp > 0 && carhp < 300)
        {
        	GameTextForPlayer(playerid,"~r~ENGINE DAMAGED", 3000, 3);
    	GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
    	SetVehicleParamsEx(vehicleid,false,false,alarm,doors,bonnet,boot,objective);
            SetVehicleHealth(vehicleid, 300.0);
        }
    	return 1;
    }

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Немного кривоватый код у тебя. Вот:
    1. vehicle_OnVehicleDamageStatusUp(vehicleid, playerid)
    2. {
    3. static Float:carhp, engine, lights, alarm, doors, bonnet, boot, objective;
    4. GetVehicleHealth(vehicleid, carhp);
    5. if(carhp <= 300.0)
    6. {
    7. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    8. if(engine == VEHICLE_PARAMS_ON)
    9. {
    10. GameTextForPlayer(playerid,"~r~ENGINE DAMAGED", 3000, 3);
    11. SetVehicleParamsEx(vehicleid, false, false, alarm, doors, bonnet, boot, objective);
    12. SetVehicleHealth(vehicleid, 300.0);
    13. }
    14. }
    15. return 1;
    16. }

    Как вариант. Ну либо, как ты сам написал, переменную. По другому тут никак и не сделать.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  3. 2 пользователя(ей) сказали cпасибо:
    L0ndl3m (25.01.2020) punkochel (26.12.2022)
  4. #3
    Аватар для red.inc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.07.2019
    Адрес
    Беларусь, Витебск
    Сообщений
    23
    Репутация:
    0 ±
    DeimoS. static - Они инициализируются только один раз - при первом вызове функции и сохраняют свое значение даже после выхода из функции. В следующий раз при новом вызове функции статические переменные будут иметь то же значение, которое они имели перед выходом из функции в послений раз.

    Я как понял, у него ид транспорта каждый раз меняется. В этом случае, лучше использовать new.
    Последний раз редактировалось red.inc; 24.01.2020 в 10:36.

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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Немного кривоватый код у тебя. Вот:
    1. vehicle_OnVehicleDamageStatusUp(vehicleid, playerid)
    2. {
    3. static Float:carhp, engine, lights, alarm, doors, bonnet, boot, objective;
    4. GetVehicleHealth(vehicleid, carhp);
    5. if(carhp <= 300.0)
    6. {
    7. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    8. if(engine == VEHICLE_PARAMS_ON)
    9. {
    10. GameTextForPlayer(playerid,"~r~ENGINE DAMAGED", 3000, 3);
    11. SetVehicleParamsEx(vehicleid, false, false, alarm, doors, bonnet, boot, objective);
    12. SetVehicleHealth(vehicleid, 300.0);
    13. }
    14. }
    15. return 1;
    16. }

    Как вариант. Ну либо, как ты сам написал, переменную. По другому тут никак и не сделать.
    И в самом деле, все оказалось проще пареной репы) Спасибо за помощь! Я то уже начал какие-то сложно-костыльные способы придумывать))
    А что если по автомобилю будет нанесен урон с оружия, Callback вызовется?


    Цитата Сообщение от red.inc Посмотреть сообщение
    DeimoS. static - Они инициализируются только один раз - при первом вызове функции и сохраняют свое значение даже после выхода из функции. В следующий раз при новом вызове функции статические переменные будут иметь то же значение, которое они имели перед выходом из функции в послений раз.

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

  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от red.inc Посмотреть сообщение
    DeimoS. static - Они инициализируются только один раз - при первом вызове функции и сохраняют свое значение даже после выхода из функции. В следующий раз при новом вызове функции статические переменные будут иметь то же значение, которое они имели перед выходом из функции в послений раз.

    Я как понял, у него ид транспорта каждый раз меняется. В этом случае, лучше использовать new.
    Если ты посмотришь внимательнее, то увидишь, что у него каждая переменная всякий раз сначала записывает определённое значение из функций и только потом используется (а ID авто - это вообще параметр функции, а не переменная). Так что все сохранённые значения от предыдущего вызова функции будут перезаписаны актуальными.
    OnVehicleDamageStatusUpdate вызывается довольно часто на заполненном игроками сервере, ибо постоянно кто-то где-то катается и бьётся. И смысл static, в данном случае, в том, чтоб не тратить лишнее время на инициализацию переменных. Мы тратим чуть больше памяти, но выигрываем немного времени для частовызываемой функции. Как итог, мы получим больше пользы от выигранного времени, нежели если бы мы сократили использование сегмента данных и продолжили использовать стек.

    Цитата Сообщение от punkochel Посмотреть сообщение
    А что если по автомобилю будет нанесен урон с оружия, Callback вызовется?
    Скорее всего нет. Точно не помню, так что перепроверь.
    Вообще гораздо проще поместить этот код в таймер обновления спидометра. Там всё равно обычно бывает вызов функции GetVehicleHealth для отображения состояния авто в спидометре, что можно использовать для реализации этого кода.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    L0ndl3m (25.01.2020)
  8. #6
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Скорее всего нет. Точно не помню, так что перепроверь.
    Вообще гораздо проще поместить этот код в таймер обновления спидометра. Там всё равно обычно бывает вызов функции GetVehicleHealth для отображения состояния авто в спидометре, что можно использовать для реализации этого кода.
    Спасибо за идею!)

  9. #7
    Аватар для red.inc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.07.2019
    Адрес
    Беларусь, Витебск
    Сообщений
    23
    Репутация:
    0 ±
    Хм. static записывает в себе значение car_hp, engine;
    Если выходить из функции, то vehicleid и playerid, будет содержать сохранения hp автомобиля и производить изменения не будет, там самым, игрок получается ударился 1 раз и его ХП сохранится в памятие и изменяться больше не будет, исходя из vehicleid и ид игрока. И после получение второго урона проверка не пройдет. Также в дальнейшем - изменятся он не будет.

    Может я что-то не так понял. Но услышать вариант также хочется.

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

    Хотя. Ты верно говоришь, перечитал твой комментарий

  10. #8
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    DeimoS, почему используется static, вместо new в данном случае?
    Последний раз редактировалось L0ndl3m; 28.01.2020 в 09:48.

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

    Статус
    Оффлайн
    Регистрация
    03.07.2017
    Сообщений
    44
    Репутация:
    5 ±
    L0ndl3m, он уже ответил на этот вопрос выше

  12. Пользователь сказал cпасибо:
    L0ndl3m (25.01.2020)
  13. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от red.inc Посмотреть сообщение
    DeimoS. static - Они инициализируются только один раз - при первом вызове функции
    Не инициализируются они ни при каком вызове функции. Их изначальное значение рассчитывается ещё на этапе компиляции скрипта (и именно поэтому при объявлении к ним можно присвоить только константу или константное выражение, но никак не значение переменной или результат из функции) - проще говоря, они уже инициализированы заранее.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  14. Пользователь сказал cпасибо:
    L0ndl3m (25.01.2020)
 

 

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

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

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

Ваши права

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