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

*Shoker*

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

    926
  • Регистрация

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

  • Дней в топе

    15
  • AMKoin

    107 [Подарить AMKoin]

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

  1. *Shoker*

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

    Возможно ты просто не правильно вызывал её: void give_game_news( -- выдать на экран сообщение string, -- само сообщение. Может содержать некоторые форматирующие элементы string, --текстура, из которой берется аватара "отправителя" Frect, --координаты и размеры вырезаемого из текстуры изображения int, --начало показа сообщения с текущего момента (в миллисекундах) int --длительность показа сообщения (в миллисекундах) ) В любом случае работает и ладно, а правильный вызов give_game_news можешь в том же news_manager глянуть.
  2. В дополнение к этому посту по поводу функции global_transform(), по крайнем мере в ЗП она рабочая, и при вызове возвращает матрицу, (class matrix) которая хранит координаты кости, а также направление этой кости (или нечто похожее, я как раз разбираюсь) local ph_shell = door:get_physics_shell() local ph_element = ph_shell:get_element_by_bone_name("door") if ph_element ~= nil then local m = ph_element:global_transform() end C.X = 355.5 C.Y = 56.6 C.Z = 763.6 I.X = 1 I.Y = -5.4984565167615e-007 I.Z = -2.3666775632591e-006 J.X = 5.4984121788948e-007 J.Y = 1 J.Z = -1.8957925931318e-006 K.X = 2.3666784727538e-006 K.Y = 1.8957912288897e-006 K.Z = 1 Направление кости в виде углов эйлера (которые в СДК используются) можно по идее получить матричной функцией getHPB(), но т.к у меня она вызывала вылет, я для этого использую функцию из Zones Editor - extract_euler_xzy(m) Плохо только то, что ph_shell:get_element_by_bone_name("door") работает не для всех костей (а судя по всему только для костей с типом joint), а сам ph_shell есть тока у неживых объектов (у живого сталкера он отсутствует) PS: На правах оффтопа, malandrinus - подскажи пож-ста по поводу функции extract_euler_xzy(m), она возвращает x z y, а если соотнести их с HPB (такие обозначения используются в сталкере), то что чему равно? B это наклон, H кажется горизонталь, P вертикаль. ******************************************************************************* По поводу вопроса разобрался:HPB идут в таком порядке. local p,b,h = extract_euler_xzy(m)
  3. *Shoker*

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

    Да не, это просто подсветка синтаксиса от другого языка видимо, либо просто глючит. Из того что могу посоветовать: 1) Все таблицы из necrolog(victim) вынеси за пределы функции (перед ней например, или в начале скрипта), т.к содержимое таблиц у тебя определенно зарание, а так получается что при каждом вызове функции эти таблицы как бы заново создаются, что вообще плохо в плане производительности (хотя в твоём случае это совершенно не заметно) 2) ["agroprom"] = "Окрестности НИИ Агропром", } Можешь спокойно после каждого элемента таблицы ставить запятую, даже если он последний в таблице. Меньше риск что ошибёшься при добавлении новых элементов. -- Некролог (На основе работы тов. Weanchester) function necrolog(victim) get_console():execute("kill_msg") get_console():execute(victim:name()) ... При смерти сталкеров у тебя в консоли должна появляться строка kill_msg и имя погибшего сталкера. Если этого не происходит, значит функция всё таки не вызывается, если функция вызывается, то аналогично через вывод в консоль проверяй доходит ли функция до отправки сообщения: if victim and IsStalker(victim) and shans>27 then get_console():execute("send_msg") db.actor:give_game_news(necrolog_text, "ui_inGame2_Necrolog", math.random(1000,3000), 3000)
  4. *Shoker*

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

    Хм, покажи пож-ста всю эту функцию под спойлером, мож где то в ней стоит return из за чего твой код просто не вызывается.
  5. *Shoker*

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

    Если сам скрипт у тебя без ошибок (синтаксических) то на лицо не правильный вызов функции necrolog(victim) Покажи кусок из xr_motivator где ты её вызываешь.
  6. *Shoker*

    Shoker Mod CS v[2.0]

    @Hukutka94, честно говоря уже не знаю. Максимум что будет (при условии что у меня не пойдут проблемы с переносом), это патч для текущей версии с новым оружием и фиксами, и то это смотря как пойдёт. Я честно говоря хочу что нибудь сюжетное сделать, а попытки починить\обновить этот драндулет на ЧН хоть и вполне возможны, и мне реально хотелось бы сделать, но боюсь что это займёт достаточно времени, которое я могу потратить на более интересный (как мне, так и игрокам) проект с 0. Пока что я делаю это: http://www.amk-team.ru/forum/index.php?showtopic=12656&page=11
  7. Видимо анимации не хватает. @Serg.Ivan, либо сразу удаляй худ на уровне xml-конфигов, либо напиши скрипт, который при каждой загрузке уровня будет в консоль вводить команду на отключения худа (но такой вроде нету, не помню), либо через скриптовую функцию прятать худ (но по моему тогда и прицел пропадает, и + ГГ может стать бессмертным, но я точно не помню) Через xml всё же надёжней.
  8. У тебя в логе же чётко указанно что игра не может найти в конфигах секцию [predbannik_hide_restrictor] В функции спавна рестриктора ты передаёшь имя уровня, а в скрипте к нему потом дописывается _hide_restrictor Найди в конфигах по аналогии например l01_escape_hide_restrictor и глянь что туда писать надо.
  9. *Shoker*

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

    @Stalkersof, попробуй вместо 0 указать 1500 или любое положительно число. (5000) relation_registry.set_community_goodwill ("military", db.actor:id (), 1500) по идее работает прямо на Кордоне. Скорее всего при 0 у тебя просто не изменяется никак отношение, и нужно брать число побольше. Если по умолчанию у тебя отношение со сталкерами -2000, то соответственно и пиши 2000, но это теория. Я не помню точно что там творится с отношением группировок в ТЧ, Вполне возможно что если ты перед этим перестреляешь кучу членов этой группировки, то даже этой функции будет недостаточно. Ну и если это не сработает, то есть совсем уж хардкорный вариант - помимо set_community_goodwill перебрать всех сталкеров данной группировки, которые есть в игре, и в ручную поставить им нейтральное отношение к игроку, правда тогда нужно проверить будут ли нейтралами свеже-появившиеся сталкеры.
  10. Обычно модели сворачиваются в комок когда у них перестаёт анимация отыгрываться. Сидорович сам по себе одна большая модель с анимациями, у которого тока голова крутится вслед за ГГ. Скорее всего: полетело что то в скриптах, а вместе с этим "сдохла" схема торговца mob_trader.script, которая ответственна за проигрывание его анимаций. Ещё маловероятный, но вполне возможный вариант - ты напортачил в торговле, и после определённого момента в сюжете (когда меняются товары у торговца) там что то идёт не так и в итоге игра не вылетает, но торговец ломается. (попробуй поторговать с ним кстати, проверь товары) Тут уже надо конкретно проверять что ломается, либо конфиг торговли крутить, либо логику торговца (configs\script), либо в скрипте mob_trade.script выводить сообщения в лог и смотреть, например, вызывается ли апдейт торговца в этом скрипте или нет, а дальше уже гадать почему так произошло. Ну а вообще похоже на то что логика у него полетела. Почему это уже искать надо.
  11. @karavan, не совсем на самом деле понятно, покажи если не трудно кусок "проблемного" кода, интересно чего там такого, чего нельзя совместить. (Мод не SIMBION случаем? )
  12. @karavan, если у тебя два bind_stalker-а из разных модов, и ты пытаешься их совместить таким образом, то у меня для тебя плохие новости. Открывай два скрипта в Total Commander или Notepad++ (где угодно где можно сравнивать файлы, например WinMerge), и вручную совмещай те строки, которые, как ты считаешь, нужны для работы той фичи, которую ты хочешь перетащить к себе. А иначе это всё равно что корова с двумя головами. ColR_iT На самом деле так возможно можно слегка упросить совмещение модов, вместо того чтобы сувать всё в bind_stalker - вынести всё в свой собственный биндер, правда скорее всего коллизии где нибудь да произойдут (в колбеках скорее всего). Ну и вообще не факт что на один объект можно делать несколько биндеров.
  13. [actor]:common_ph_friction_params_on_npc_death,actor_base ... script_binding = bind_stalker.actor_init Когда игрок появляется на карте (в онлайне), вызывается эта функция, в которой в свою очередь происходит создание самого биндера, который уже вызывает обновления и прочие функции. Создать биндер можно для любого объекта который бывает в онлайне. Про биндеры можешь покурить статью в теме Справочник функций и классов. bind_stalker - биндер актёра (несмотря на своё название, сталкеры в нём тоже есть, но они из него перенаправляются в xr_motivator) Можно ли "нормально" делать два биндера на один объект - скорее всего нет, по крайнем мере я не пробовал.
  14. Если вопрос всё же касается сталкера, то возможно поможет эта вещь: http://www.amk-team.ru/forum/index.php?showtopic=6185&p=678277
  15. Для тех кто вдруг не знал, в ЗП level.physics_world() работает, и его свойства можно в классе C++ class physics_world посмотреть. Это пару раз на форуме тут мелькало, но допустим я об этом узнал случайно только что, а штука между прочим интересная - позволяет гравитацию изменять. Никто кстати не знает можно ли как нибудь использовать function add_call(class CPHCondition*, class CPHAction*);, а то эти классы похоже не экспортированы.
  16. *Shoker*

    Шейдеры

    http://cs416323.vk.me/v416323922/9961/aheY4PCcHbs.jpg А каким образом можно создать подобный шейдер, чтобы был прозрачный но при этом текущее небо отражал? (про баг с прозрачными поверхностями на худе знаю, сейчас не в этом дело) Можно ли здесь обойтись стандартными СДК-шными примитивами или нужно писать свой скриптовый шейдер. Если второе, то где нибудь можно достать уже готовый такой шейдер, как тот что на скринах? В СДК пробовал смотреть, но там даже если есть где скайкуб, в игре он не отрисовывается. (по крайнем мере на динамике)
  17. *Shoker*

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

    На самом деле это "фича" Lua, любую функцию можно вызывать как со скобками так и без, правда вроде как если без скобок, то передать можно лишь один аргумент (а если без аргументов или больше чем один, то по моему вообще не вызовется). В тонкости не вдавался. Например можно abort("text"), а можно abort "text" Если просто написать abort без скобок то ничего не будет. (точнее мы просто получим ссылку на функцию) assert же просто если первым аргументом идёт false (или nil), то крэшает игру и пишет какую то фразу в лог. Например assert(false, "yes") крэшнет игру и напишет в логе "yes", если вызывать с одним аргументом, то будет писать "assertion failed!" Так что это не более чем узкоспециализированный аналог abort()-а в сталкере. И кста, просто для тех кто вдруг не знает, если изменять скрипты, то не обязательно выходить из игры, достаточно лишь перезагрузить сохранение и они соберутся заново. Очень экономит время. Ну а что мешает проверить. Скорее всего сработает, на крайняк если юзаешь предмет скриптово, то в этот момент можешь запоминать ID использованного предмета, и в колбеке на использование проверять этот момент.
  18. *Shoker*

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

    Попробуй что нибудь придумать с dik_to_bind() local bind = dik_to_bind(dik) if bind == key_bindings.kQUIT then self:OnButton_close_clicked() end В Lua_help смотри C++ class key_bindings.
  19. *Shoker*

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

    Не, если в particle_object передать не существующий путь, то игра вылетит. Насчёт функции чтения всех параметров - она действительно удобная, но есть один недочёт - при необходимости получить всего 1 параметр из конфига ты скопом считываешь сразу 30-40, причём каждый раз. На глаз это не заметно, но с точки зрения оптимизации это ужасно. Тут есть несколько вариантов: 1) Почему бы тебе просто не написать свою функцию-обёртку над system_ini() Я например использую такую: local cost = _u.ltx(секция, "cost", "num") 2) Чтобы не считывать каждый раз значение из конфига, ты можешь считать их один раз (при первом вызове) и занести в таблицу. А при следующих вызовах этой пары секция-строка просто сразу возвращать уже значение из таблицы. Пример можно глянуть здесь: http://pastebin.com/iT9ztQik (На самом деле я не знаю есть ли особая разница в скорости - считывать ли значения каждый раз или один раз и сохранять их в таблицу. но я юзаю второй вариант)
  20. *Shoker*

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

    Как по мне вопрос вполне ясный. Текст со скроллером. Режим complex_mode вроде как позволяет делать переносы строк и прочую "раскраску" но прокрутку не добавляет, хотя могу ошибаться. А так твой пример вполне подходящий, как раз то что нужно.
  21. *Shoker*

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

    Давно с UI не работал, но если нет нормального способа через какой нибудь статик, то например в ОГСМе это делали через ListBox, то-есть просто разбивали текст на строки и построчно добавляли их в "список". Можешь глянуть в ОГСМ ЧН энциклопедию. Тока на ЗП код нужно будет переделывать.
  22. dromundus Я одно время тоже пробовал но так и не нашёл нормального решения. Лично я огнемёт сделал (пришлось прицепить автокликер к игре, чтобы создать видимость авто-огня) Впрочем у этого метода есть минусы, которые ещё буду править.Возможно есть ещё вариант но уже с ковырянием движка - искать в памяти строку с партиклом и изменять её, но это прокатит только если для каждого оружия своя строка с партиклом хита, что мало вероятно. Скорее всего это просто совпадение. За тип стрельбы у оружия отвечает ef_weapon_type Может конечно use_aim_bullet действительно и НПС используется, но когда я тестировал его на ГГ в ЧН, то с ним заметно повышался урон у оружия. Тоже самое мне сказали люди, ковыряющие движок.
  23. *Shoker*

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

    Понаставь в свой код вывод в лог\консоль через printf (или что там у тебя выводило в лог) И посмотри, тут два варианта как мне кажется: 1) Либо функция сохранения\записи не работает так как ты от неё ожидаешь. 2) Либо она работает, но значения потом перезаписываются в связи с неправильной работой скрипта. Например после load() ты загрузил из сейва сохранённые значения, а потом прочёл их из конфига и перезатёр. По крайнем мере как и сохранение ключей так и сохранение строк должно работать правильно. Поставь дополнительные printf-ы в разных местах кода и проследи в правильном ли порядке они срабатывают. Ну или на худой конец выложи текущий вариант trade_manager в личку или лучше сюда, тогда мож увидим где косяк.
  24. *Shoker*

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

    @Карлан, в функции save() получай размер всей твоей таблицы (либо table.size\table.count (забыл что именно) - это если на модулях Artos-а сидишь, либо вручную считай его через перебор всех элементов - pairs(). Сохраняй этот размер в пакет. Дальше через тот же pairs() перебирай всю твою таблицу и сохраняй каждый из её четырёх элементов. Примерно будет так: local t = { {key1=string, key2=number, key3=boolean, key4=boolean}, {key1=string, key2=number, key3=boolean, key4=boolean} ... } save() local size = table.size(t) packet:w_u16(size) for _,v in pairs(t) do packet:w_stringZ(v.key1) packet:w_s32(v.key2) packet:w_bool(v.key3) packet:w_bool(v.key4) end Соответственно в: load() local size = packet:r_u16() for i=1, size do local temp_tbl = {} temp_tbl.key1 = packet:r_stringZ() temp_tbl.key2 = packet:r_s32() temp_tbl.key3 = packet:r_bool() temp_tbl.key4 = packet:r_bool() table.insert(t, temp_tbl) end Где t это твоя таблица, которую тебе нужно было сохранить. Вариант для гурманов - запаковать всю таблицу в одну огромную строку (в тех скриптах от Artos-а кажется table.compres) и попытаться впихнуть её в stringZ, но скорее всего игра подавится при большой таблице.
  25. >_< У НПС где нибудь регулируется упреждение наводки при стрельбе по движущейся цели? Встал вплотную к НПС, двигаюсь влево\вправо, тот пистолетом то влево то вправо водит и все пули в молоко улетают, поскольку слишком большое упреждение он берёт. hit_probality влияет только на точность выпущенных пуль. Собственно из за этого-же они косят по монстрам, т.к стреляют наперёд, в итоге толпа наёмников с дробовиками и калашами не справляется с парой\тройкой собак. В принципе если это значение запрятано где то самом коде игры в dll-ке, его местоположение тоже подойдёт.
×
×
  • Создать...