Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

@Wlad777, вариант 1: добавляешь класс для костров, пишешь им биндер, пишешь методы включения/отключения/проверки и сохранение горения до кучи ~ полчаса займет; вариант 2: составляешь массив всех костров в игре, на апдейте их крутишь и проверяешь что горит что нет, там партикл и лампа, ресетишь и делаешь псевдо-метод проверки активности костра ~ не знаю сколько займет, не делал, но массив не маленький будет.

Поделиться этим сообщением


Ссылка на сообщение

@Wlad777, ты прикалываешь или что? смотри particle_object, там есть метод playing(), дальше рассказывать?


только там не партиклы


как делать я выше написал, и какие объекты в костре я тоже сказал, тебе надо манипулировать тремя объектами, партиклом аномалией и лампой, все, больше ничего не требуется

Поделиться этим сообщением


Ссылка на сообщение

@RayTwitty, конкретнее ситуацию можешь обрисовать? Чтобы всегда и везде у меня такого нет, работает как и должно. В коде есть места где используется рудиментарная установка агрессии одного на другого через хит (как раз нулевой), возможно она имеет место быть, но телепатов таки нет. Есть еще глюк самой схемы, но это дебри логики, которые пока не вижу смысла расписывать. Ну а так иди пальни в новичка в деревне, выведи в лог, там все это достаточно наглядно, ну и сразу отсюда идет пойдет вывод что надо подправить в экшнах.

Поделиться этим сообщением


Ссылка на сообщение

@RayTwitty, ну так дурное дело не хитрое ;). Причем тут пострелять в труп я не понял, также как и причем тут движок. Весь вопрос объясняется на уровне скриптов.

Поделиться этим сообщением


Ссылка на сообщение

 

 

А труп это разве не НПС и для него колбек вызываться не может?

Может, и вызывается, и отличий нет. Я не понял зачем ты различаешь вызов хит коллбека на труп и на живого, когда это суть одно и тоже, ну и до кучи причем тут движок я тоже не понял. А вектор куда копать я дал, так как телепатов нет.

Поделиться этим сообщением


Ссылка на сообщение

Хм, коли начинаем говорить о GUI, давайте расскажу про CUITrackBar() в ТЧ.

 

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

Выдержка из хелпера (для демонстрации результатов моей работы):

 

C++ class CUITrackBar : CUIWindow { --// расширения для класса CUITrackBar позволяют создавать и управлять трек-баром (последнее было невозможно)
    function IsChanged(); --// значение изменилось?
    function SetStep(number); --// устанавливает шаг трекинга
    function GetStep(); --// получает шаг трекинга
    function GetValue(); --// текущее значение
    function SetValue(number); --// установить значение (также меняется позиция ползунка в зависимости от значения)
    function GetBackupValue(); --// получить предыдущее значение
    function SetBackupValue(number); --// установить предыдущее значение
    function GetBtn(); --// получить кнопку в виде объекта CUI3Button
    function GetFrame(); --// получить первый фрейм в виде объекта CUIFrameLineWnd
    function GetFrameD(); --// получить второй фрейм в виде объекта CUIFrameLineWnd
};
Видео-демонстрация конечного результата, чтобы всем было понятно о чем я говорю (поясняю: на видео этот ползунок и есть трек-бар):

 

 

 

По окончанию работ я вспомнил про GUI сна в ЗП, и решил обратиться к классу трек-бара в коде ЗП и с радостью обнаружил, что мои функции получились технологичнее. Да, если кто помнит, я тот, кто потащил функционал в ТЧ, но до конкретных редких классов как этот у меня руки не дошли, разбираюсь с ними только когда мне это нужно.


@Kondr48, да, можно, если неизвестно сколько кнопок будет, то делай через цикл while. Кнопка button_1 в твоем случае это поле, а поле можно получить по ключу, а ключом может выступать любой lua тип. Твоя задача весьма проста, и абсолютно точно реализуема.

Изменено пользователем Карлан
  • Спасибо 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, немного не ясно что ты хочешь от кода. Ты собираешься красить кнопку, но красишь текст, текстуру красят другим методом (метки например), а SetHighlightColor красит, очевидно, текст, в случае с кнопкой - на кнопке.

 

По второму вопросу я вообще не понял о чем ты спрашиваешь.

 

Статик можно повернуть методом SetHeading.

 

@SkyLoader, метод называется SetColor (также SetColorAll), а не SetHighlightColor. Например:

void CUITradeWnd::ColorizeItem(CUICellItem* itm, bool 
{
if(!
itm->SetColorAll(color_argb(255,255,100,100));
}

 

Изменено пользователем Карлан
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, это же очевидно:

SetHighlightColor и SetTextColor идентичны, только аргументы принимают по разному, первый жрет GetARGB (в данном контексте совершенно не ясно зачем), а второй напрямую.

SetColor как раз красит сам статик. SetColorAll предполагалось, что должен красить и детей тоже, но не красит, так что методы тоже идентичны  :).

Оговорюсь, что я веду речь о CUIStatic.

 

Второй вопрос: кнопку достаточно скрыть, примерно так: self.btn_yes:Hide(), если хочется непременно удалить, то ее надо отцепить от парента (DetachChild), только в этом случае советую еще поглядывать за сборщиком мусора, так как может все достаточно печально закончиться, особенно если имеешь дело с каким-нибудь динамическим статик-боксом.

 

P.S. Предупрежу, что мои советы не всегда могут быть применимы для стандартных исходников, так как некоторые части у меня достаточно сильно переписаны.

 

 

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, вопрос совершенно некорректный. Никто по этим обрывкам не сможет понять что ты делаешь, можно только гадать. Моя кофейная гуща говорит о том, что твоя таблица к моменту вызова типса уже вне зоны видимости, если вообще не уничтожена. Объяви ее в самом начале модуля вот так:

local mechanic_info = {}

Если вызов типса в этом же модуле, и вот так:

mechanic_info = {}

Если в ином, но в таком случае вызывать ее нужно module.mechanic_info, почему? Недавно я как-раз рассказывал про видимость переменных, рекомендую прочесть, там же я давал ссылки на главы по окружению из официального мануала.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@CRAZY_STALKER666, от него требуется только секцию взять. Я его в две строки переписал, тут по моему даже выкладывал. Секция 'never' ничего не значит, если ее не будет, он на нее просто не перейдет, вот и все, функция вернет nil и проверка не пройдет. Проверь если есть желание.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, есть функция:

ui.reinit_show_ui()

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

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@BoBaH_671, очевидно оперировать серверными объектами, так как дистанция работы клиентских методов равна радиусу онлайна, и немного не понятно зачем их применять за этими рамками. На xp-dev есть метод teleport_object, но у меня не было повода проверить как он работает, судя по коду работает корректно (говорю основываясь на подобных методах, которые пишу сам).

 

@Kondr48, предложенный тобою метод является усложнением простого, к тому же он в любом случае не позволит передавать объекты межлокационно.

Поделиться этим сообщением


Ссылка на сообщение

 

 

Как заспавнить тайник скриптом? Причем чтобы все данные о нём в этом же скрипте и указать (визуал и наполнение)

Вопрос некорректный. Данные разнообразны, в частности даже визуал и наполнение, первое это серверная часть, второе это клиентская часть. Можно сделать несколько секций с нужными тебе визуалами, либо сделать метод и ассоциировать его с чем либо. По второму жди пока тайник выйдет в онлайн и забрасывай все что тебе нужно.

 

Рекомендую посмотреть мою реализацию "съемных" рюкзаков, пока там именно так и сделано. Есть планы написать в движке универсального обладателя инвентаря, которого можно носить с собой, при таком подходе будет гораздо удобнее трансферить (в целом вся работа будет проходить лучше) и кода будет меньше. На выходе должен будет получится такой физический инвентарный ящик.

Поделиться этим сообщением


Ссылка на сообщение

@nikita_nz1986, ты создаешь объект particles_object, соответственно тебе доступны все методы класса, и там есть два метода для остановки: stop и stop_deffered.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

На мой взгляд проще добавить функцию в движок, где можно установить и кастом дату (ее наверное лучше вообще отдельной функцией сделать, у меня, например, по всякому сделано), и топливо, и прочие специфичные параметры вроде стейтов дверей (тут могу ошибиться, в транспорте совершенно не разбираюсь). Самое банальное - сделать еще один create, где опционально можно указать story id и custom data. Далее, если нужно, древовидно раскрутить все функции и вписывать туда специфичные параметры, далее их ассоциативно экспортировать в скрипты, в принципе это один из немногих хороших вариантов.

 

Если говорить о пакетах, то, если верно помню, там можно через смещение чтения/записи сразу прочесть/записать нужный параметр и не писать все это полотно, по крайней мере я так когда-то давно визуал читал.

 

Ну а оперировать этим через [spawner] это, конечно, ужасно.

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@CRAZY_STALKER666, предположу, что партикл рисуется по позиции объекта, а ты негодуешь из-за того, что он "не там" от первого лица, то есть от позиции камеры. Попробуй рисовать партикл от позиции камеры.

Поделиться этим сообщением


Ссылка на сообщение

@Kober(BRUC), в оригинале без костылей это невозможно. Для скриптов существует свой относительный путь, называется $game_scripts$ и явно прописан в fsgame.ltx. Чтобы скрипты можно было вызывать откуда угодно нужно переделывать функцию вызова скриптов в движке, файл script_engine.cpp. Я ее немного переделывал там чтобы хотя бы самых больших мух от котлет отделить, а вот alpet, насколько я знаю, переделывал ее примерно так как тебе и надо, у него, опять же насколько я знаю, скрипты можно вызывать из папки scripts и всех ее подпапок. Я в плюсах слабо рублю, но мне кажется это такая плюсовая плюшка (то есть не составляет большого труда, для тех кто в них шарит), сделать цикл не только по $game_scripts$, но и по всем вложенным папкам.

 

На луа, костылем, это, разумеется, можно сделать через dofile. Но поскольку это костыль, то и путь надо будет каждый раз писать для update_path для каждой новой подпапки, не совсем удобно, ну и разумеется уже pcall.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

upd:

Взгляни на ResourceManager_Scripting.cpp, // load shaders и далее, там как раз вот идеология того, что тебе нужно, думаю можно разобраться, цикл то маленький, а я тут напугал, даже я примерно въехал что к чему :).


 

 

Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет?

Ну нет конечно, если ты его заранее через луа явно не подключишь, и то скорее всего не взлетит, потому что модули с диалоговыми функциями это нечто большее, чем скрипты :)

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

Del.

 

Что-то я припудрился, извиняюсь, сравниваю со своими телегами и забыл, что отношения перерабатывал, у меня такая телега стоит:

function set_factions_community_relation(faction, faction_to, new_community)
    assert(is_string(faction), [[bad argument #1 to set_factions_community_relation (string excepted, got %s)]], type(faction))
    assert(is_string(faction_to), [[bad argument #2 to set_factions_community_relation (string excepted, got %s)]], type(faction_to))
    assert((is_number(new_community) or is_string(new_community)), [[bad argument #3 to set_factions_community_relation (string or number excepted, got %s)]], type(new_community))
    if tonumber(new_community) then
        relation_registry.set_community_relation(faction, faction_to, new_community)
    else
        assert(const_factions_relation[new_community], [[const_factions_relation doesn't exist [%s] field]], new_community)
        relation_registry.set_community_relation(faction, faction_to, const_factions_relation[new_community])
    end
end
Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение

@CRAZY_STALKER666, нет, в оригинальном ТЧ такой функции разумеется нет, тебе, возможно, подойдет использование relation_registry.set_community_goodwill, но она устанавливает коэффициент к конкретному объекту, но не меняет отношения между группировками. В твоем случае, я думаю, подойдет, так как, если не ошибаюсь, то ты хочешь поссорить актора, который состоит в Свободе, со сталкерами (как группировкой). Такое возможно.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...