HellRatz 2 814 Опубликовано 20 Марта 2017 Поделиться Опубликовано 20 Марта 2017 (изменено) @dsh, да, действительно, сей коллбек перехватывает торговлю по нажатию на кнопку. То, что нужно, спасибо! UPD: А обнулить деньги у ГГ можно? К сожалению в оригинальной игре не нашел методов, лишь give_money, но это не то, либо деньги уходят в минус, (да, и такое возможно) либо в плюс, а просто задать 0 никак. Никакого тебе set_money ПЫСы не предусмотрели к сожалению. Изменено 20 Марта 2017 пользователем HellRatz GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
dsh 3 824 Опубликовано 20 Марта 2017 Поделиться Опубликовано 20 Марта 2017 @HellRatz, я сейчас вот такое выполнил db.actor:give_money( -db.actor:money() ) и денег стало ровно 0. 1 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
HellRatz 2 814 Опубликовано 20 Марта 2017 Поделиться Опубликовано 20 Марта 2017 (изменено) @dsh, все бы вроде ничего, но. Если ГГ продает НПСу или покупает у НПСа 1 предмет (то есть мы предлагаем НПСу предмет, но у него ничего не покупаем, или наоборот только покупаем и не продаем), то деньги обнуляются, но если в торговлю добавляется второй предмет (Первый из рюкзака ГГ, второй из рюкзака НПС, короче взаимная торговля в обе стороны) то у ГГ образуется сумма в что-то вроде 245036573. В общем в огромную цифру. Обнуляется если опять купить что-то или продать в одно лицо. Изменено 20 Марта 2017 пользователем HellRatz GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
vampirnik77 121 Опубликовано 21 Марта 2017 Поделиться Опубликовано 21 Марта 2017 Здравствуйте. Совместил фриплейный мод( sza, просто вырезает сюжет) с модулями тов. Артоса и теперь получаю такой вылет, как исправить? Заранее спасибо. ! Cannot find saved game ~:lua_helper:fget_inisection:ini=[<userdata>],not_found_section=[levels],type=[table]:<error!> ! Cannot find saved game ~:lua_helper:fget_inisection:ini=[<userdata>],not_found_section=[levels_underground],type=[true]:<error!> ! Cannot find saved game ~:lua_helper:correct_max_idlevelvertex:=[1844793]=>[1851250](+6457), map(108)=[zaton] :<info!> compiling shader model_def_lqs_0 compiling shader model_def_lplanes_0 ! Unable to find Software\GSC Game World\STALKER-COP\ in registry ! Unknown command: dump_infos ! Cannot find saved game ~:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Cannot find saved game ~:attention! game is interrupted! the information in lines above. ! Cannot find saved game ~:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Log file has been saved successfully! FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...l.k.e.r - call of pripyat\gamedata\scripts\_g.script:857: attempt to call global 'exit' (a nil value) stack trace: Официальная страница проекта Neof-One Crew Ссылка на комментарий
Kirgudu 1 204 Опубликовано 21 Марта 2017 Поделиться Опубликовано 21 Марта 2017 (изменено) @HellRatz, коллбек "trade_sell_buy_item" срабатывает для каждого предмета, участвующего в акте торговли. Не исключено, что сразу для нескольких предметов текущее кол-во денег отлично от нуля, таким образом после обработки всех предметов ты получаешь неверную итоговую сумму. Чтобы обнуление работало правильно, необходимо делать его после окончания обработки всех предметов, например на первом апдейте после торговли. Примерно так: local set_money_zero = false --/ коллбек на торговлю function on_trade(item, sell_buy, cost) if set_money_zero == false then set_money_zero = true level.add_call( function() return set_money_zero end, function() db.actor:give_money(-db.actor:money()) set_money_zero = false end ) end endКроме того, не забудь, что на момент срабатывания коллбека деньги за продажу/покупку уже засчитаны актору и НПС и, если мне не изменяет память, учтены в статистике. То есть тебе не только надо обнулить деньги у игрока, но и, возможно, вызвать соотв. функцию в xr_statistics для коррекции потраченных средств в КПК. Также стоит иметь в виду, что аргумент sell_buy при коллбеке на продаваемый героем предмет имеет значение "true", а при коллбеке на покупаемый - "false". При этом сначала срабатывают все коллбеки на продажу, потом все коллбеки на покупку (если обмениваемых предметов много с той и другой стороны). Это тоже можно использовать для реализации расширенной логики, например отказа от предметов, имеющих плохую кондицию и возврата денег за них. Впрочем, это уже за рамками первоначального вопроса. @vampirnik77, модули брал отсюда? Точно следовал инструкции по подключению? Она довольно таки исчерпывающая, ошибиться сложно, если следовать всем пунктам согласно нужной платформе. Почитай ещё этот пост и дальше пару страниц, возможно наткнёшься на полезную информацию. Судя по всему, твой мод на платформе ЗП. Если он согласится помочь, рекомендую попросить совета у @Romz - насколько мне известно, он активно использует модули Артоса в своём моде на той же платформе. Я же не заходил дальше базовой проверки подключения, и вряд ли смогу помочь в данном конкретном случае. Изменено 21 Марта 2017 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
Graff46 598 Опубликовано 30 Марта 2017 Поделиться Опубликовано 30 Марта 2017 Подскажите ф-цию что бы заставить НПС ТЧ смотреть в заданную вектором позицию? Ссылка на комментарий
dsh 3 824 Опубликовано 30 Марта 2017 Поделиться Опубликовано 30 Марта 2017 @Graff46, в state_mgr_direction.script посмотри использование set_sight() 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
DJ.Orb.Warpal 40 Опубликовано 9 Апреля 2017 Поделиться Опубликовано 9 Апреля 2017 (изменено) Нужна помощь, как прописать звуки дыхания в противогазах для Dynamic Hud на ТЧ? Если не туда написал, то пожалуйста скажите куда задать вопрос? Заранее спасибо. Изменено 9 Апреля 2017 пользователем DJ.Orb.Warpal Ссылка на комментарий
WinCap 316 Опубликовано 9 Апреля 2017 Поделиться Опубликовано 9 Апреля 2017 @abr Возможно ли его переделать так, чтобы бы после сталкеров определённой фракции оружие было определённого состояния. Попробуй так: Нужно изменить функцию set_weapon_drop_condition следующим образом: local community_condition = { ["stalker"] = {min = 0.1, max = 0.9}, ["dolg"] = {min = 0.1, max = 0.9}, ["freedom"] = {min = 0.1, max = 0.9}, ["bandit"] = {min = 0.1, max = 0.9}, ["army"] = {min = 0.1, max = 0.9}, ["zombied"] = {min = 0.1, max = 0.9}, ["ecolog"] = {min = 0.1, max = 0.9}, ["killer"] = {min = 0.1, max = 0.9}, ["monolith"] = {min = 0.1, max = 0.9} } function set_weapon_drop_condition(item, community) local condition = math.random(community_condition[community].min, community_condition[community].max) item:set_condition(condition) end А после изменить вызов этой функции: if isWeapon(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then set_weapon_drop_condition(item, character_community(npc)) return end Написано на скорую руку, так что могут быть ошибки. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
WinCap 316 Опубликовано 9 Апреля 2017 Поделиться Опубликовано 9 Апреля 2017 (изменено) Также меня беспокоит эта секция, не нужно ли её менять тоже? Эти строки закоментированы. Ошибка возникает потому что параметр community=nil. Нужно выяснить почему или обработать это исключение, например так: function set_weapon_drop_condition(item, community) if community == nil then community = "stalker" end local condition = math.random(community_condition[community].min, community_condition[community].max) item:set_condition(condition) end Изменено 9 Апреля 2017 пользователем WinCap S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
WinCap 316 Опубликовано 9 Апреля 2017 Поделиться Опубликовано 9 Апреля 2017 Да, зависает вот лог: Проверил, работает. Вот окончательный вариант: local community_condition = { ["stalker"] = {min = 10, max = 90}, ["dolg"] = {min = 10, max = 90}, ["freedom"] = {min = 10, max = 90}, ["bandit"] = {min = 10, max = 90}, ["army"] = {min = 10, max = 90}, ["zombied"] = {min = 10, max = 90}, ["ecolog"] = {min = 10, max = 90}, ["killer"] = {min = 10, max = 90}, ["monolith"] = {min = 10, max = 90} } function set_weapon_drop_condition(item, community) if community == nil then community = "stalker" end local condition = math.random(community_condition[community].min, community_condition[community].max) / 100 item:set_condition(condition) end S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
WinCap 316 Опубликовано 9 Апреля 2017 Поделиться Опубликовано 9 Апреля 2017 А что совет Bak'а в другой теме не помог? попробуй менять число 400 вот в этих строках cf = cf-(delta/400) cf = cf+(delta/400) S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Nazgool 250 Опубликовано 9 Апреля 2017 Поделиться Опубликовано 9 Апреля 2017 (изменено) Вот окончательный вариант Говорю не для того чтобы обидеть, а только ради благих намерений. Хотя и понимаю, что оными выстелена дорога в ад, поэтому как уж получиться. Не раз уже говорил, и всегда недоумевал от столь бесполезного кода (и подобный встречается довольно часто) : if community == nil then community = "stalker" end Что такого полезного тут проверяется? Что значение "community" не "nil"? Ну хорошо. Оно не "nil". А, скажем, "false". И что тогда будет? community_condition[community].min будет фактически равно community_condition[false].min К чему это приведет? Рассказывать, думаю, не нужно. Да, значения не то что нужно, а просто необходимо проверять! НО! Делать это максимально полезным что ли. В данном случае сам код подсказывает как это сделать У тебя уже есть таблица "community_condition", в которой заданы поля, ключи которой и определяют весь необходимый диапазон значений переменной "community" Поэтому сделав : community = community_condition[community] and community or "stalker" Решаются абсолютно все проблемы как с типом, так и со значением переменной "community". Ну или на любителя (эквивалент предыдущему коду): if not community_condition[community] then community = "stalker" end Изменено 9 Апреля 2017 пользователем Nazgool 2 1 Ссылка на комментарий
WinCap 316 Опубликовано 10 Апреля 2017 Поделиться Опубликовано 10 Апреля 2017 Не раз уже говорил, и всегда недоумевал от столь бесполезного кода Я придерживаюсь другого мнения. Параметр community может принимать ряд заранее известных строковых значений, которые корректно обрабатываются функцией. Если он не определен, т.е. nil, в данном случае, наверное, это допустимо, и я определяю его сам. А если он вдруг благодаря “Аркелийским лучам смерти” станет равен false... То я просто обязан словить вылет и разобраться с этими Аркелийцами. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 10 Апреля 2017 Поделиться Опубликовано 10 Апреля 2017 (изменено) community = community_condition[community] and community or "stalker"Ой ! (Кхм, продолжим оскорблять граждан клонов своим присутствием)может, все-таки, что-нибудь типаlocal cnd = item_cond[npc:character_community()] or item_cond.default,либо, как вариант, local cnd = item_cond[npc:character_community()] or abort( чего_нибудь ) ?P.S. И я бы не закладывался на то, что ЛЮБОЙ ЛУА корректно отработает рэндом для не-целых аргументов. Изменено 10 Апреля 2017 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 13 Апреля 2017 Поделиться Опубликовано 13 Апреля 2017 (изменено) @WinCap, Параметр community может принимать ряд заранее известных строковых значений Ну во-первых он может принимать "ряд" любых типов значений lua кроме nil. См. : if community == nil then Во-вторых. Где у тебя в коде написано, что "заранее известных" и тем более "строковых значений"? Вот в моем варианте это всё предусмотрено. А покажи где у тебя? Если он не определен, т.е. nil, в данном случае, наверное, это допустимо, и я определяю его сам. ... То я просто обязан словить вылет и разобраться В третьих (как и во-первых), если он не определен, или определен не так как ожидалось (т.е. это либо не строка, либо строка, которой нет в списке таблицы "community_condition"), то ту два варианта - либо определять значение "насильно" (как ты сдедал): then community = "stalker" Либо вылетать. Ты уж определись чего нужно-то. Исходя из твоего кода выходит что первый вариант. Что собственно я сделал, чтобы не отходить от оригинала. Так что твоё несогласие с моим вариантом считаю не достаточно (вернее совсем не) обоснованным. P.S. Вольность типов, количества и значений переменных в lua несомненно делает его очень гибким. Но только не в "точных науках". Например мне приходилось, для исключения двусмысленности, создавать ряд сигнатурных функций. Изменено 13 Апреля 2017 пользователем Nazgool Ссылка на комментарий
WinCap 316 Опубликовано 14 Апреля 2017 Поделиться Опубликовано 14 Апреля 2017 Благодаря этой фразе: Ну, во-первых, он может принимать "ряд" любых типов значений lua кроме nil. стала понятна причина нашего недопонимания - мы говорим о разных вещах. Со своей точки зрения ты абсолютно прав, спорить не буду. Я расскажу про свой подход, который, надеюсь, тоже имеет право на существование. В Lua существует большое множество A всех типов и их значений. Поскольку этот язык имеет динамическую типизацию, любая переменная действительно может иметь любой тип и значение из множества A. А поскольку параметр функции является обычной переменной для него это тоже в полной мере справедливо. И вот тут начинается самое интересное. Для параметра функции из всего множества A я выделяю два подмножества: это B - все типы и значения, которые функция может принимать и C - все типы и значения, которые могут быть переданы в функцию. Для меня B и C не одно и то же. Подмножество B определяется назначением функции, той задачей, которую она выполняет, тем, зачем вообще этой функции нужен параметр. Подмножество C определяется тем, как и где функция вызывается. Функция может быть локальной, глобальной, методом класса, перегруженной и т.д. и т.п. В каждом месте кода, где происходит вызов функции, подмножество C дополняется новыми типами и значениями. Теперь есть два возможных варианта: 1) B содержит или равно C. В этом случае в функции пишется только обработка значений. Ни в чем не сомневаемся, ничего не проверяем, просто используем параметр и все. 2) B меньше C (т.е. C содержит и НЕ равно B). В этом случае в функции сначала пишется проверка значений, при которой множество C приводится к B, а уже после этого пишется обработка значений. В рассматриваемом примере функция вызывается только в одном месте: set_weapon_drop_condition(item, character_community(npc)) Значит для параметра community множество C определяется возвращаемым значением функции character_community(), а это точно строки и не абы какие, а те, что используются в игре (можно посмотреть в [communities_relations]),а также неопределенное значение nil (куда же без него). И поскольку для данной функции C равно B, в ней нет никаких проверок, только обработка значений. Поэтому такой код кажется "нелепым": if community == nil then community = "stalker" end Но это НЕ проверка, а ОБРАБОТКА одного из допустимых для функции значений. Кстати мне очень интересно, в каких случаях character_community() возвращает nil? Неужели бываю NPC без community, или он в offline'е коньки отбросил? 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
makdm 37 Опубликовано 14 Апреля 2017 Поделиться Опубликовано 14 Апреля 2017 Неужели бываю NPC без community, или он в offline'е коньки отбросил? Биндер в файле xr_motivator.script обрабатывает только онлайновые объекты. При смерти НПС, который находится оффлайн, метод death_callback не вызывается и соответственно не вызывается метод create_release_item класса drop_manager. Соответственно применить метод character_community() к серверному классу объекта просто не получится ( так как его смерть не обрабатывается скриптом ). По идее NIL не должен быть никогда, если только вы сами не передали nil, как аргумент в функцию. Ссылка на комментарий
Nazgool 250 Опубликовано 15 Апреля 2017 Поделиться Опубликовано 15 Апреля 2017 (изменено) @WinCap, Я понял о чем ты говоришь.Да, если ты используешь подобную функцию ограничено, и уверен что в будущем её не будут вызывать больше ниоткуда, что может привести к передаче "не тех" аргументов то можно оставить и так.Тогда, учитывая твоё объяснение, и запись : if community == nil then community = "stalker" end можно сократить до : community = community or "stalker" Но твоё объяснение всё равно не делает функцию абсолютно "безопасной".Твой код полностью опирается на данные таблицы community_condition. Поэтому нужно следить за тем, чтобы после добавления какой-либо группировки, не забыть прописать её и в этой таблице тоже. А сколько подобных таблиц может быть в файлах? И о всех нужно помнить? Поверь, такие мелочи со временем приводят к долгому и нудному обслуживанию кода.Вот ты сам говоришь, что функция character_community не возвращает "абы какие" значения.Т.е. программист позаботился о том, чтобы функция работала как можно надежнее. В твоей же функции, имхо, всё-равно остаются эти два слабых места.Первое - я бы никогда не был уверен на 100% что придут именно те аргументы.Второе - даже если придут "те", то я не был уверен на 100% что они обязательно будут в таблице character_community. Поэтому более надежный вариант можно было бы написать примерно так : function set_weapon_drop_condition(item, community) local data = type(community_condition) == 'table' and community_condition[community or "stalker"] -- я тут всё в кучу собрал, но можно и раздельно ошибки отлавливать if not (type(item) == 'userdata' and type(item.set_condition) == 'function' and type(data) == 'table' and type(data.min) == 'number' and type(data.max) == 'number') then return -- тут что-то делать. лог, вылет, исправить или ничего не делать end local condition = math.random(data.min, data.max) / 100 item:set_condition(condition) end Этот вариант закрашить можно только передав юзердату, которая также имеет метод set_condition и с "не той" сигнатурой. А в оригинале такой нет. Изменено 15 Апреля 2017 пользователем Nazgool Ссылка на комментарий
UnLoaded 313 Опубликовано 15 Апреля 2017 Поделиться Опубликовано 15 Апреля 2017 (изменено) Поэтому более надежный вариант можно было бы написать примерно так Все пытаетесь универсальную защиту "от дурака" смастырить ? Так я Вам скажу, что дурак впиндюрит такое, что все эти защиты обделаются. Имхо, мое мнение: не надо дуракам программный код писать, а если очень хочется - пусть учится, как это правильно делать, и соответственно перестает быть дураком... Да и такие способы защиты - если передали не верное community, то вернуть что-то от community = stalker - это чисто медвежья услуга. Пусть лучше писатель кода получит вылет, при тестировании, и будет вынужден найти ошибку и исправить ее, а не получить в виде этой самой медвежьей услуги левый результат. Изменено 15 Апреля 2017 пользователем UnLoaded 1 2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти