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

Kirgudu

Жители
  • Число публикаций

    1 407
  • Регистрация

  • Последнее посещение

  • Дней в топе

    6
  • AMKoin

    3,595 [Подарить AMKoin]

Весь контент пользователя Kirgudu

  1. Kirgudu

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

    По мотивам всего вышенаписанного. Лишний раз хотелось бы заметить, что подобные советы, по сути своей возможно и правильные, могут быть крайне вредны, если даются новичку, за недостатком опыта не отличающему комментарий в коде от комментария в сообщении. Если уж решил помочь, лучше потрудиться и написать текст, не оставляющий места для кривотолков. @Zander_driver, респект.
  2. Не только в мобильной, но и в десктопной тоже.
  3. Kirgudu

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

    @Colder конечно, если вместо случайной выборки одной строки воспользоваться, например, циклом и вернуть по итогу таблицу (не забыть обработать её на выходе отличным от пары значений образом): Скрытый текст --local key = math.random(0,n-1) --local result, item, num = ini:r_line("generic_list",key,"","") --alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) --return item, num local t = {} for key = 0,n-1 do local result, item, num = ini:r_line("generic_list",key,"","") alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) table.insert(t, { item = item, num = num }) end return t Так будут обработаны все строки из generic_list. При желании сюда же можно прикрутить случайную выборку нескольких строк и так далее. Простор для творчества не ограничен.
  4. Kirgudu

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

    @INNOCENT KILLAZ да, фриплей тут ничем концептуально не отличается. Однако набор и наполнение точек могут меняться на разных стадиях игры, в том числе при наступлении фриплея - см. для подробностей код модуля ogsm_respawn. Там есть проверки по выданным инфопорциям и в зависимости от этого разные наборы спавна.
  5. Kirgudu

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

    Нет, конечно. Это точки постоянного (на протяжении игры) периодического (раз в какое-то время) спавна в указанной точке указанной группы монстров с контролем максимальной численности. См. в функции ogsm_packet.spawn_monster. В зависимости от значения в этом параметре ("fake"/"random_fake"/прочее) монстру назначается та или иная кастомная логика поведения. На будущее, подобные вопросы больше подходят для одной из тем "Ковыряемся в файлах" (в данном случае, я так подозреваю, вариация для ЧН).
  6. Kirgudu

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

    Например, распотрошить упомянутую функцию relocate_item_section_from_actor и переделать её под использование id: Скрытый текст function relocate_item_from_actor_by_id(first_speaker, second_speaker, id) if not id then return end local function who_is_npc(first_speaker, second_speaker) if db.actor:id() == second_speaker:id() then return first_speaker else return second_speaker end end local npc = who_is_npc(first_speaker, second_speaker) local function transfer_item(item) if item:id() == id then db.actor:transfer_item(item, npc) news_manager.relocate_item(db.actor, "out", item:section()) end end db.actor:inventory_for_each(transfer_item) end
  7. Kirgudu

    OGSM CS 1.8 CE Fixes

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

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

    С каких пор? Может, уже появились альтернативные темы по всем трём платформам, а народ-то и не в курсе? Тема по ТЧ - это "[SoC] Ковыряемся в файлах" или, например, "[SOC] Мелкие правки движка". "Скриптование" же всегда было мультиплатформенной темой, не надо искусственно навязывать лишние рамки. @Norman Eisenherz но тема всё равно вряд ли правильная, с таким вопросом, имхо, надо идти к тем, кто ковыряет движок.
  9. Kirgudu

    Old Good Stalker Mod - Clear Sky

    @MegaStalker может потому, что так было сделано, и никто в те времена, когда мод разрабатывался, не подумал, что можно (или нужно) сделать по-другому?
  10. Kirgudu

    Ачивки

    https://forum.ixbt.com/ Недостижимый идеал.
  11. Интересно, а можно ли как-нибудь скрыть внезапно (я так полагаю, в результате случившегося обновления движка) появившиеся "ранги"? Как-то немножко странно видеть надпись "newbie" при почти 10 годах стажа и тысяче с гаком сообщений.
  12. Kirgudu

    OGSM CS 1.8 CE Fixes

    Совершенно верно. А вороны и фантомы были добавлены, скорее всего, по принципу "перечислим всех". "Скорее всего" потому, что модуль имеет в авторах изначальных создателей мода OGSM, причём ещё до Community Edition, и позже почти не переделывался (я в своё время ограничился точечными коррекциями, хотя сейчас весь этот модуль переписал бы процентов на 70-80 - если б видел смысл и было время), в том числе не менялась и эта функция. Поэтому мы можем только гадать.
  13. Kirgudu

    OGSM CS 1.8 CE Fixes

    @hetrikWHY фраза "порядок проверки не менять" там рассчитана скорее на полных новичков, и её вполне можно заменить на "менять с умом". Позже или завтра (по возможности), если надо, распишу, что имелось в виду, а пока это сложно - я с мобильного. Кстати, вопрос этот относится к "ковырянию", которое в теме не слишком приветствуется, так что если уважаемый автор будет против, придётся переместиться в личку.
  14. Kirgudu

    OGSM CS 1.8 CE Fixes

    Кто-нибудь может навскидку перечислить типы заданий от членов группировки, которые, будучи выданными, должны быть актуальными только пока ты числишься в составе? Кроме удержания точки есть ещё такие? Добавлю автоотмену этих заданий в случае выхода из рядов группировки (или в случае вступления в другую группировку).
  15. А вот я рад, что меня не отправляют (потенциально) за ответом в какой-то ВК. Если я задал вопрос здесь, то и ответ хочу получить именно здесь, в противном случае воспользовался бы условным гуглом для поиска.
  16. Kirgudu

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

    Как ни странно, да. Примеры двойного объявления одних и тех же функций встречаются даже в скриптах оригинала (хотя, может быть, это-то как раз и не странно). Если кому интересно - загляните в чистонебовский скрипт task_objects.script, функция CHideFromSurgeTask:check_task(). Там внутри есть две встроенные функции, описанные дважды в пределах одного пространства. На практике, если представить, что содержимое повторяющихся функций различно, работать будет та, которая объявлена второй (третьей, четвёртой и так далее). Что конкретно должно быть в примере выше, сказать не могу. Всё зависит от логики, которую хотелось вложить в код автору. Возможно, заполняться должна только таблица creatures, возможно - creature, а возможно и обе сразу. Надо изучать те скрипты, где они используются далее. Но я предлагаю критически взглянуть на другое место. Вот: function add_obj( obj ) -- ... <skip> ... if IsStalker(obj) and IsMonster(obj) then --> если И сталкер И монстр btr_target[obj:id()] = true end end Ничего не смущает?
  17. Kirgudu

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

    Не надо так делать, в том варианте должно быть именно sobj.id. А так гейм вертекс можно (и нужно в данном случае) получать уже из серверного объекта: local sobj = alife():object(i) if sobj and sobj.m_game_vertex_id == 2482 and IsStalker(sobj) and sobj:alive() then return true end И ещё: почему только 2482? Других вертексов на нужной локации нет? Имхо, лучше из гейм вертекса получать id локации и проверять уже его совпадение с нужным: function get_level_nps() local al, gg = alife(), game_graph() -- многократно используемые функции кешируем для производительности for i=1,65535 do local sobj = al:object(i) if sobj and gg:vertex(sobj.m_game_vertex_id):level_id() == XXX and IsStalker(sobj) and sobj:alive() then -- вместо XXX подставить Id локации (не путать с наименованием) return true end end return false end Или, чтобы не вызывать лишние функции, сравнивать sobj.m_game_vertex_id с диапазоном значений - больше одного и меньше другого: if sobj and sobj.m_game_vertex_id >= XXX and sobj.m_game_vertex_id <= YYY and IsStalker(sobj) and sobj:alive() then -- вместо XXX и YYY подставить граничные гейм вертексы локации return true end
  18. Kirgudu

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

    @h0N0r все перечисленные методы действительно клиентские, а в переменной obj у тебя серверный объект. Если хочешь получить клиентский, следует действовать например так: local cobj = level.object_by_id(obj.id) if cobj then ... end и далее по написанному. Однако зачем делать это после удаления, если я правильно тебя понял? Ты уж определись, что необходимо - удалить объект или придать ему ускорение.
  19. Kirgudu

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

    for k,v in pairs(бла) do if v == true then db.actor:give_game_news('бла-бла', 'бла-бла-бла', "ui_iconsTotal_PDA", 0, 3000) end end P.S.: задавай свои вопросы в человекопонятной форме.
  20. Kirgudu

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

    @UriZzz у тебя и подсказка в логе есть args=[string]~not_table! и пример в конце модуля start_game_timer(3*60, nil, {info_id = "my_infoportion"}) Грубо говоря, ты в качестве доп. аргумента передаёшь строку "UriZzz_test.mecheny_mail", а надо таблицу. То есть: start_game_timer(30*60, nil, {param1 = "UriZzz_test.mecheny_mail"}) -- аргумент - таблица Если же ты хотел вызвать функцию внешнего модуля (на что слегка намекает текст "UriZzz_test.mecheny_mail"), то для этого надо было воспользоваться вторым аргументом, который у тебя сейчас равен nil, и без кавычек. А именно: start_game_timer(30*60, UriZzz_test.mecheny_mail) -- аргумент - указатель на функцию внешнего модуля В общем, смотри внимательно примеры в конце модуля таймеров, там всё расписано.
  21. Не критично, но потребовало некоторого времени для привыкания. В общем, тоже занудничаю.
  22. Совершенно неожиданно напрягла рокировка местами кнопок в подтверждалках. http://f26.ifotki.info/org/78a250c05396a27cf14cca0eadaffca3551ed4391577085.png Тычу по давно сложившейся привычке мышью справа - и не понимаю, что происходит.
  23. Kirgudu

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

    @UriZzz, ты, главное, принцип запомни. Пойми суть предложенных тебе изменений. А чем дальше, тем проще будет.
  24. Kirgudu

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

    @UriZzz, предлагаю борьбу с невнимательностью и fps продолжить дальше и поднять не невиданный доселе уровень, увеличив твою опытность ещё больше. Смотри. Функция у тебя с говорящим названием, sleep(obj), предназначена теоретически только для обработки нажатия на спальный мешок. Не знаю, откуда и как она вызывается, но если проверка на то, что ты используешь именно спальник, до вызова функции есть, тогда условие if obj:section() == "sleep_bag" then является лишним. Но скорее всего такую проверку ты до функции не делаешь, а просто всегда дёргаешь её в коллбэке на дроп (ТЧ) или использование предмета (ЧН, ЗП). Примем это допущение, и тогда возникает другой момент. Что будет, если вокруг тебя на расстоянии 40 метров нет ни одного врага? А если ты съел колбасу? Правильно, проверка на врага сработает, а поскольку рядом никого нет, пройдёт по полному циклу, по всем 65 с лишним тысячам потенциальных объектов. И в результате ты, может, и избавился от тормозов при выдаче сообщения, зато приобрёл их при любом использовании любого предмета (если только ты не ставишь целью кушать, применять антирад, использовать бинты и аптечки и т. д. также только в спокойном месте). Выходом является перемещение поиска врагов после условия if obj:section() == "sleep_bag" then, так чтобы цикл запускался только если ты используешь нужный предмет. И последнее, чисто перфекционистское замечание. Если всё, что делает функция, это проверяет, можешь ли ты использовать спальник, и показывает нужный диалог или выдаёт сообщение, тогда нет нужды заморачиваться с лишними брейками и переменными. Можно выдать сообщение и сразу выйти из функции (return сработает как и break, прервёт выполнение цикла, но вдобавок ещё и обеспечит выход), а меню будет показано за пределами цикла, если всё хорошо, и прерывания не случилось. Самое время проиллюстрировать вышесказанное. Скрытый текст function sleep(obj) -- мы ещё и условие проверки перевернём: если сработал не спальник, сразу выйдем из функции - дальнейшая портянка нас не интересует if obj:section() ~= "sleep_bag" then return end -- не спальник --> выход -- ogse.spawn_item_in_inv("sleep_bag") -- по-хорошему, спавнить новый предмет лучше сразу, чем разбивать на 2 части, при выдаче сообщения и, видимо, где-то в недрах класса спальника for k=0,65534 do local m_obj = level.object_by_id(k) -- здесь проверку на m_obj прикрутим спереди к остальным; все критерии срабатывают последовательно, так что ошибки не будет -- это позволит нам не множить "if" и не увеличивать кол-во уровней вложенности условий if m_obj and ((IsStalker(m_obj) and ogse.get_npc_relation(m_obj,db.actor)=="enemy") or IsMonster(m_obj)) and m_obj:position():distance_to(db.actor:position()) < 40 and m_obj:see(db.actor) then ogse.send_tip("Не получится заснуть пока вокруг шляются всякие", "Меченый", 0, 10, "mecheny") ogse.spawn_item_in_inv("sleep_bag") -- если не заспавнили выше return --> и сразу выход из цикла и функции end end -- если всё хорошо и цикл врагов не выявил, ничто больше не мешает показать меню спальника local hud = sleep_ui(get_hud()) -- указываем на class "sleep_ui" (CUIScriptWnd) level.start_stop_menu(hud, true) -- открываем меню end Результат: избавились от лишних времязатратных действий, укоротили (если стереть мои комментарии) код вдвое, а также малость улучшили читабельность. P.S. При желании ты с Lua разберёшься, я уверен. С СДК разобрался, значит и со скриптами сможешь. Надо лишь пройти чуть дальше, чем "работает - и ладно". @Марка демченков, попробуй это: exit()
  25. Kirgudu

    HARDWARMOD 3.3 (CS)

    Мотивация понятна. ) Но хоть я тоже давний поклонник РПГ (аж с конца 80-х и начала 90-х и таких игр, как M&M, EotB, LoL и др.), в данном случае поддержать не могу. Впрочем, решать в любом случае идейному вдохновителю и главному автору, а дискус об этом уже происходил на другой площадке.

AMK-Team.ru

×
×
  • Создать...