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

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

@dsh, да, действительно, сей коллбек перехватывает торговлю по нажатию на кнопку. То, что нужно, спасибо!

UPD: А обнулить деньги у ГГ можно? К сожалению в оригинальной игре не нашел методов, лишь give_money, но это не то, либо деньги уходят в минус, (да, и такое возможно) либо в плюс, а просто задать 0 никак. Никакого тебе set_money ПЫСы не предусмотрели к сожалению.

Изменено пользователем HellRatz
Ссылка на комментарий

@dsh, все бы вроде ничего, но. Если ГГ продает НПСу или покупает у НПСа 1 предмет (то есть мы предлагаем НПСу предмет, но у него ничего не покупаем, или наоборот только покупаем и не продаем), то деньги обнуляются, но если в торговлю добавляется второй предмет (Первый из рюкзака ГГ, второй из рюкзака НПС, короче взаимная торговля в обе стороны) то у ГГ образуется сумма в что-то вроде 245036573. В общем в огромную цифру. Обнуляется если опять купить что-то или продать в одно лицо.

Изменено пользователем HellRatz
Ссылка на комментарий

Здравствуйте. Совместил фриплейный мод( 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:

 

Ссылка на комментарий

@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 - насколько мне известно, он активно использует модули Артоса в своём моде на той же платформе. Я же не заходил дальше базовой проверки подключения, и вряд ли смогу помочь в данном конкретном случае.

Изменено пользователем Kirgudu
  • Спасибо 1
Ссылка на комментарий

Нужна помощь, как прописать звуки дыхания в противогазах для Dynamic Hud на ТЧ? Если не туда написал, то пожалуйста скажите куда задать вопрос? Заранее спасибо.

Изменено пользователем DJ.Orb.Warpal
Ссылка на комментарий

@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)

Ссылка на комментарий

Также меня беспокоит эта секция, не нужно ли её менять тоже?

 

Эти строки закоментированы.

 

Ошибка возникает потому что параметр 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

 

 

Изменено пользователем WinCap

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий

Да, зависает вот лог:

 

Проверил, работает.

Вот окончательный вариант:

 

 

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)

Ссылка на комментарий

А что совет Bak'а в другой теме не помог?

 

попробуй менять число 400 вот в этих строках cf = cf-(delta/400) cf = cf+(delta/400)

 

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий
Вот окончательный вариант

Говорю не для того чтобы обидеть, а только ради благих намерений.

Хотя и понимаю, что оными выстелена дорога в ад, поэтому как уж получиться.

 

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

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
 
Изменено пользователем Nazgool
  • Согласен 2
  • Не согласен 1
Ссылка на комментарий

Не раз уже говорил, и всегда недоумевал от столь бесполезного кода

 

Я придерживаюсь другого мнения.

Параметр community может принимать ряд заранее известных строковых значений, которые корректно обрабатываются функцией.

Если он не определен, т.е. nil, в данном случае, наверное, это допустимо, и я определяю его сам.

А если он вдруг благодаря “Аркелийским лучам смерти” станет равен false...

То я просто обязан словить вылет и разобраться с этими Аркелийцами.

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий

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. И я бы не закладывался на то, что ЛЮБОЙ ЛУА корректно отработает рэндом для не-целых аргументов. Изменено пользователем Dennis_Chikin
Ссылка на комментарий

@WinCap

Параметр community может принимать ряд заранее известных строковых значений

Ну во-первых он может принимать "ряд" любых типов значений lua кроме nil. См. :

if community == nil then

Во-вторых. Где у тебя в коде написано, что "заранее известных" и тем более "строковых значений"?

Вот в моем варианте это всё предусмотрено. А покажи где у тебя?

Если он не определен, т.е. nil, в данном случае, наверное, это допустимо, и я определяю его сам.
...
То я просто обязан словить вылет и разобраться

В третьих (как и во-первых), если он не определен, или определен не так как ожидалось (т.е. это либо не строка, либо строка, которой нет в списке таблицы "community_condition"), то ту два варианта - либо определять значение "насильно" (как ты сдедал):

then community = "stalker"

Либо вылетать. Ты уж определись чего нужно-то.

Исходя из твоего кода выходит что первый вариант. Что собственно я сделал, чтобы не отходить от оригинала.
 
Так что твоё несогласие с моим вариантом считаю не достаточно (вернее совсем не) обоснованным.
 
P.S. Вольность типов, количества и значений переменных в lua несомненно делает его очень гибким. Но только не в "точных науках". Например мне приходилось, для исключения двусмысленности, создавать ряд сигнатурных функций.
Изменено пользователем Nazgool
Ссылка на комментарий
Благодаря этой фразе:

Ну, во-первых, он может принимать "ряд" любых типов значений 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)

Ссылка на комментарий

 

 

Неужели бываю NPC без community, или он в offline'е коньки отбросил?

Биндер в файле xr_motivator.script обрабатывает только онлайновые объекты.

При смерти НПС, который находится оффлайн, метод death_callback не вызывается и соответственно не вызывается метод create_release_item класса drop_manager.

Соответственно применить метод character_community() к серверному классу объекта просто не получится ( так как его смерть не обрабатывается скриптом ). По идее NIL не должен быть никогда, если только вы сами не передали nil, как аргумент в функцию.

Ссылка на комментарий

@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 и с "не той" сигнатурой.

А в оригинале такой нет.

Изменено пользователем Nazgool
Ссылка на комментарий
Поэтому более надежный вариант можно было бы написать примерно так

Все пытаетесь универсальную защиту "от дурака" смастырить ? Так я Вам скажу, что дурак впиндюрит такое, что все эти защиты обделаются. Имхо, мое мнение: не надо дуракам программный код писать, а если очень хочется - пусть учится, как это правильно делать, и соответственно перестает быть дураком...

Да и такие способы защиты - если передали не верное community, то вернуть что-то от community = stalker - это чисто медвежья услуга. Пусть лучше писатель кода получит вылет, при тестировании, и будет вынужден найти ошибку и исправить ее, а не получить в виде этой самой медвежьей услуги левый результат.

Изменено пользователем UnLoaded
  • Нравится 1
  • Согласен 2
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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