Состояние сценери

Тема в разделе "Техподдержка", создана пользователем Dominus, 8 апр 2017.

  1. Dominus

    Dominus

    Регистрация:
    28 мар 2013
    Здравствуйте.
    Есть функция: bool s_FunctionName(Critter& cr, Scenery& scenery, int skill, Item@ item){}
    которая срабатывает при использовании скилла\предмета на сценери. Так вот, как сохранить количество использования для конкретного сценери? Например как сделано на ТЛАмк2 с деревьями: пару раз "рубишь" дрова и потом говорит что ресурсы дерева уже исчерпались.

    Апд: В Маппере есть Parameter0, Parameter1...можно их как-то програмно использовать?
    Последнее редактирование: 8 апр 2017
  2. Medvedev

    Medvedev

    Регистрация:
    17 сен 2014
    Эти параметры есть только в маппере. На самом деле в scenery есть только положение по x\y, скрипт и прототип.

    Видал такую штуку реализованную костылём - под сценери скрытый итем, на который все действия и футболятся скриптом со сценери. Параметры соответственно принимались оттуда же.

    Чтобы не заморачиваться есть 2 более простых варианта:
    1) Вызывать скриптом со сценери параметр карты: map.SetData(№, значение) и map.GetData(№). Минус - таких параметров в карте согласно учебнику всего 63, и надо следить, чтобы не перезаписать уже используемые под что-либо - например если туда запишется какая-нибудь игровая дата/время - ресурсов можно будет вытащить ооооочень много.
    2) Создавать для каждого сценери свою AnyData - но это очень ресурсоёмко и требует обязательной чистки, а то забьёт бд.
  3. Ametist

    Ametist

    Регистрация:
    22 мар 2014
    А если в структуру MapObject. добавить что-то типа int ValueScenery;
    Потом в фонлай.срр создать 2 штуки EXPORT . По получению и изменению этой переменной.
    Потом в деваинс.фос добавить что-то типа этого:
    # pragma bindfunc "int Scenery::ScenValue(uint16 x) -> fonline_tla.dll Scenery_Value"
    # pragma bindfunc "int Scenery::ScenGetValue() -> fonline_tla.dll Scenery_GetValue"

    а в игре использоваь :
    if (targetScen.ScenGetValue()<=10)
    {
    targetScen.ScenValue(targetScen.ScenGetValue()+Random(1,3));
    }

    Не будет слишком?))
  4. StaleCracker

    StaleCracker

    Регистрация:
    19 фев 2011
    Нельзя так делать, мапОбъект это объект прототипа карты, на разных картах используюших общий прототип будет один мапобъект. Кроме того нельзя просто выделить память добавив переменную в класс, разве что ты разместишь ее в памяти заменив иную переменную. Лучше работай через аниДату, не забывая очищать.
  5. Ametist

    Ametist

    Регистрация:
    22 мар 2014
    Странно, у меня давно уже так работает и проблем не замечал))) Работает, как и планировалось причём (412 ревизия), может на будущее возьму на заметку
  6. StaleCracker

    StaleCracker

    Регистрация:
    19 фев 2011
    Оно может работать только если карта на прототип в единственном экземпляре.
  7. Ametist

    Ametist

    Регистрация:
    22 мар 2014
    Да, я понял, про что )) Я об этом не знал и подумал - в принципе меня всё устраивает. Допустим попалась какому-то игроку карта и он от туда вытащил уже барахло. Другой игрок находит в пустоше такую же карту и увы ничего не находит - Ведь правильно, эту местность уже обшарили )))
    Придется конечно переделать, но чуть позже. Жаль, что идея плохая))
  8. StaleCracker

    StaleCracker

    Регистрация:
    19 фев 2011
    Не так чтобы прям плохая, зависит от задачи.
  9. Ametist

    Ametist

    Регистрация:
    22 мар 2014
    В принципе да. У меня по городам, базам стоит восстановление, а вот на обычные карты на глобале, я не ставил восстановление и оказалось, что на них восстанавливает, только после перезагрузки сервера... А думал, вышел и создалась новая карта с новыми ресурсами)) странно, вроде все тестировалось...

Поделиться этой страницей