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

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

@proper70, чудной ты, право... 

(для чистого ТЧ с добавками по выводу в лог)

1. Берем обрез и подходим к новичку сидящему у костра в деревеньке на Кордоне.

2. Стреляем ему в голову.

Имеем в логе:

* DBG: _my:OnHit_NPC:=[esc_lager2],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager3],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_wolf],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager7],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager5],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager4],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager6],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager1],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0]
* DBG: _my:OnHit_NPC:=[esc_lager5],who=[single_player],amount=[0.620]=>hp=[0.380]:bone=[13]
sv destroy object [138][device_pda:device_pda0138] [41885]
sv reject. id_parent [137][stalker:esc_lager5] id_entity [138][device_pda:device_pda0138] [41885]
sv destroy object [139][ammo_12x70_buck:ammo_12x70_buck0139] [41885]
sv reject. id_parent [137][stalker:esc_lager5] id_entity [139][ammo_12x70_buck:ammo_12x70_buck0139] [41885]
sv destroy object [140][device_torch:device_torch0140] [41885]
sv reject. id_parent [137][stalker:esc_lager5] id_entity [140][device_torch:device_torch0140] [41885]
sv destroy object [141][energy_drink:energy_drink0141] [41885]
sv reject. id_parent [137][stalker:esc_lager5] id_entity [141][energy_drink:energy_drink0141] [41885]
sv destroy object [142][harmonica_a:harmonica_a0142] [41885]
sv reject. id_parent [137][stalker:esc_lager5] id_entity [142][harmonica_a:harmonica_a0142] [41885]
sv destroy object [144][kolbasa:kolbasa0144] [41885]
sv reject. id_parent [137][stalker:esc_lager5] id_entity [144][kolbasa:kolbasa0144] [41885]
* DBG: _my:OnDeath_NPC:=[esc_lager5],who=[single_player]
sv destroy object [139][NOTFOUND] [41885]

Что тебе еще нужно?!
Новичок получил заряд дроби в голову (bone=[13] и умер. То, что в логе отображается amount=[0.620]=>hp=[0.380] - говорит о том, что полученное значение повреждения вроде как менее имеющегося у непися здоровья и вроде как остаток жизни (hp) должен остаться, но тут нужно учитывать табличку повреждений по костям, где для головы коэффициент (hit_scale) более 1.

[stalker_damage]

bip01_head = 2.0, 0, 1.0, 5.0

т.е. в данном случае величина полученного повреждения = 0.620х2.0 > 1.0 => Death

 

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

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

 

Примечание: Попадание "в голову" может затрагивать не только bip01_head, а и eyelid_1, eye_left, eye_right (глаза), jaw_1 (подбородок).

 

(отступление)

 

 

вопрос: как может быть хит "пустой" (amount=0), если непись погиб от одного-единственного выстрела в голову?

О том, что не может погибнуть от пустого хита - вроде как очевидно, хотя...  ;)  

... не сложно перехватить хит (иль без него) и убавить неписю здоровья, чтобы аля "погиб"... или наоборот добавить.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Поделиться на других сайтах

proper70, я дал тебе наводку где искать и пример функции, которая правильно определяет куда попали по нпс, тебе сложно амк 2.0 глянуть, как у них(у рефреша) там все это сделано? Ты же пошел по пути изобретения велосипеда... У амк скрипты xr_motivator amkII_dynnews amkII...

Изменено пользователем Viнt@rь
Ссылка на комментарий
Поделиться на других сайтах

Например некоторые (в том числе и я) сталкивались с таким странным вылетом, когда в биндере объекта (чаще всего motivator_binder - биндер сталкеров в xr_motivator.script), который должен работать только когда существует объект, к которому биндер присвоен, вдруг возвращает внутри одного из своих методов что этот самый object вдруг не существует. 

 

Вообщем если вдруг кому интересно, то конкретно в моём случае проблема была в том, что в апдейте НПС я не сделал проверку на то, что он живой\мёртвый, и поэтому когда для мёртвого НПС вызывал его движковый метод:

 

if best_enemy ~= nil then

  npc:enable_memory_object(best_enemy, false)

end

 

Биндер объекта на этом месте ломался, и следовательно при срабатывании какого нибудь колбека на этом НПС (например колбек на осмотр трупа) игра вылетала с руганью что self.object = nil.

 

Как вариант, отловить "зависшего" НПС можно тем, что у него в биндере перестаёт вызываться метод :update() соответственно если НПС долго не обновлялся, можно считать что он скорее всего завис, а это может привести как к простому сбою при обыске, так и к порче сохранений, если очень повезёт. 

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Поделиться на других сайтах

По хит_калбеку - что на Солянке, что на чистой (4, 6 патчи) - результат как у @proper70. Тоесть при смерти от единичного выстрела в голову - информации нет, при стрельбе в тело без моментальной смерти - есть.

@Artos, возможно, что твои чудо-добавки делают игру корректнее ?

Ссылка на комментарий
Поделиться на других сайтах

Есть таблица вида:

local t = {{key = value}} --/ где value - boolean

Далее идет формирование строки

if t[i].key then
string = "1" --/ true
else
string = "2" --/ false
end

Так вот, при загрузке игры у меня происходит сброс этих value, и у меня все строки становятся равными "2".

 

Вопрос: как правильно сохранить/прочесть мое значение и подставить загруженное значение в мое условие при загрузке игры?

 

Разумеется всячески мусолил w_bool/r_bool, но за неимением навыков у меня что-то не получилось подставить значения в условия(но они сохранялись/загружались).

Изменено пользователем Карлан
Ссылка на комментарий
Поделиться на других сайтах

@Карлан, сначала сохраняй размер таблицы, а уже потом - значения. Так же и читай - сначала читай сохраненный размер, а потом уже нужное количество раз читай значения. И тебе действительно нужна таблица с подтаблицами, а не просто таблица с парами ключ-значение ?
Лучше опиши задачу вообще, а потом уже твои способы решения.

Ссылка на комментарий
Поделиться на других сайтах

@sapsan, у меня таблица с подтаблицами, вроде:
 
 


local t = {
{key1=string, key2=number, key3=boolean, key4=boolean},
{key1=string, key2=number, key3=boolean, key4=boolean}
...
}

И вот из этой таблицы мне и надо сохранить ключи с булевыми значениями. Простая, как видишь, не подойдет.

 

Что-то не понял я твоего объяснения, можешь наглядно? Допустим функции сохранения/загрузки таблицы возьмем готовые из амк. (load_table/save_table)(только они вложенные массивы вроде не сохраняют, так что я совсем в ступоре :)). Мне бы только примерный алгоритм дальше сам допилю, я не понял по какому принципу должно идти сохранение. 

 

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

Изменено пользователем Карлан
Ссылка на комментарий
Поделиться на других сайтах

@Карлан, если функции вида

function load_table(name)
	local var = load_variable(name)
	if var then return unpack_array_from_string(var) end
	return {}
end

function save_table(name,tbl)
	save_variable(name, pack_array_to_string(tbl))
end

тогда они обработают хоть всю твою таблицу любой вложенности. Разве что в Солянке они сейчас не такие, как были в чистом АМК. Ну и до Солянки они некорректно работали с булевыми значениями. Если таблица не большая, тогда можешь взять эти функции и вызываемые ими "подфункции" из последней Солянки и паковать хоть всю таблицу разом.

Ссылка на комментарий
Поделиться на других сайтах

@sapsan, извиняй, тупанул я, я же на модулях от Artos'а сижу. Если их видел, то вот мои функции:

 

function load_table(name)
local var = GetVar(name)
return table.decompress(var) 
end


function save_table(name, tbl)
SetVar(name, table.compress(tbl))
end

Я только смысла в таком сохранении не вижу, у меня строка строится динамически, а таблица у меня - константа, поэтому оперировать тут с таблицой глупо и бессмысленно. Значения видно сбрасываются при загрузке строки. Что-то я сам запутался.

Ссылка на комментарий
Поделиться на других сайтах

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

Ссылка на комментарий
Поделиться на других сайтах

@Карлан, в функции 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, но скорее всего игра подавится при большой таблице. 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Поделиться на других сайтах

@*Shoker*, так я делал еще часа три назад, и результата нужного мне это не принесло :) К слову, это первое, что я пытался сделать. stringZ все хавал, сохранял и загружал. Пробовал сохранять и распарсенную таблицу, и ключи таблицы в цикле(как у тебя) и свою готовую строку...все эти потуги мне результата никакого не принесли.

 

Короче я сейчас понял, что я ничего не понял :) Я не понимаю как формируется моя строка при загрузке, не получается отловить это, видать умений у меня мало, и из этого, как следствие, не те методы применяю к перезаписи, то ли не так перезаписываю, то ли не то перезаписываю... сложно как-то все, придется немного ампутировать свой код, иного варианта пока не вижу.

Ссылка на комментарий
Поделиться на других сайтах

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

2) Либо она работает, но значения потом перезаписываются в связи с неправильной работой скрипта.
Например после load() ты загрузил из сейва сохранённые значения, а потом прочёл их из конфига и перезатёр. 

 

По крайнем мере как и сохранение ключей так и сохранение строк должно работать правильно.
Поставь дополнительные printf-ы в разных местах кода и проследи в правильном ли порядке они срабатывают. 

 

Ну или на худой конец выложи текущий вариант trade_manager в личку или лучше сюда, тогда мож увидим где косяк. 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Поделиться на других сайтах

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

 

 

--[[---------------------------------------------------------------
--//     Функции обработки перменных
--]]---------------------------------------------------------------
--[[
-- Сохраняем переменную
-- @param string  sVarName имя переменной
-- @param all types Value  значение переменной
--]]
function WriteVariable(sVarName, Value)
if Value ~= nil then
  storage[sVarName] = Value
end
end
--[[
-- Загружаем переменную
-- @param string  sVarName имя переменной
-- @param all types DefVal  дефолтовое значение
-- @return
--]]
function ReadVariable(sVarName, DefVal)
if storage[sVarName] ~= nil then
  return storage[sVarName]
end
return DefVal
end
--[[
-- Удаляем переменную
-- @param string sVarName имя переменной
--]]
function DeleteVariable(sVarName)
if storage[sVarName] ~= nil then
  storage[sVarName] = nil
end
end
 
storage = {}
local type2marker = {
    ['boolean'] = 1,
    ['number'] = 2,
    ['string'] = 3,
    ['table'] = 4
     }
local marker2type = {
    [1] = 'boolean',
    [2] = 'number',
    [3] = 'string',
    [4] = 'table'
     }
 
function Load(packet)
while not packet:r_eof() do
  local k = packet:r_stringZ()
  --_log_db("Key:[%s]",tostring(k))
  LoadValue = function()
   local value
   local tv = marker2type[packet:r_u8()]
   if tv == 'string' then
    value = packet:r_stringZ()
   elseif tv == 'boolean' then
    value = packet:r_bool()
   elseif tv == 'number' then
    value = packet:r_float()
   elseif tv == 'table' then
    local v = {}
    local n = packet:r_u8()
    if n > 0 then
     local b = packet:r_bool()
     if b then
      for i = 1, n do
       v[i] = LoadValue()
      end
     else
      for i = 1, n do
       local kk = packet:r_stringZ()
       --_log_db("Key:[%s]",kk)
       v[kk] = LoadValue()
      end
     end
    end
    value = v
   end
   --_log_db("Value:[%s]", tostring(value))
   return value
  end
  storage[k] = LoadValue()
end
end
 
function Save(packet)
 
if next(storage) then
  for k, v in pairs(storage) do
   if v ~= nil then
    packet:w_stringZ(k)
    --_log_db("Key:[%s]",tostring(k))
    SaveValue = function(Value)
     --_log_db("Value:[%s]",tostring(Value))
     local tv = type(Value)
     if type2marker[tv] then
      packet:w_u8(type2marker[tv])
      if tv == 'string' then
       packet:w_stringZ(Value)
      elseif tv == 'boolean' then
       packet:w_bool(Value)
      elseif tv == 'number' then
       packet:w_float(Value)
      elseif tv == 'table' then
       local iTblSize = GetTblSize(Value)
       --_log_db("size = [%s]",iTblSize)
       packet:w_u8(iTblSize)
       if iTblSize > 0 then
        packet:w_bool(IsTblList(Value))
        if IsTblList(Value) then
         for i = 1, iTblSize do
          SaveValue(Value[i])
         end
        else
         for kk, vv in pairs(Value) do
          --_log_db("Key:[%s]",kk)
          packet:w_stringZ(kk)
          SaveValue(vv)
         end
        end
       end
      end
     else
      --_log_db("~Not savable type:=[%s]",tv)
     end
    end
    SaveValue(v)
   end
  end
end
end

--[[
--	Получает реальный размер таблицы
--	@param	table	tTbl	таблица
--	@return integer
--]]
function GetTblSize(tTbl)
	if IsTblList(tTbl) then
		return #tTbl
	end
	local iSize = 0
	for k, v in pairs(tTbl) do
		iSize = iSize + 1
	end
	return iSize
end

--[[
--	Проверка типа таблицы:'список' или нет?
--	@param	table	tTbl	таблица
--	@return boolean
--]]
function IsTblList(tTbl)
	local bList = false
	local iCntIdx = #tTbl
	if iCntIdx > 0 then
		if next(tTbl) == 1 and not next(tTbl,iCntIdx) then
			for i=2,iCntIdx-1 do
				if tTbl[i] == nil then
					return false
				end
			end
			bList = true
		end
	end
	return bList
end

 

ЗЫ надеюсь объяснять откуда вызывать функции Save и Load, и что в них передавать - не надо...

ЗЫЫ функции написаны для кастомного хранилища и под ЗП, так что, если где-то в их коде будет вылет, отпиши, поправим.

 

Совет по таблицам, если key1=string статичен, тогда лучше немного по другому описывать табличку

local tbl = {
[key1] = {key2=number, key3=boolean, key4=boolean},
...
}
где key1 - это строка, которая присваивалась ему ранее(в смысле key2=string)

еще интересно бы узнать о key2=number, по порядку ли идут присвоенные ему значения в под таблицах(в смысле 1,2,3,...,100) и зачем он вообще? нужен?

 

ЗЫЫЫ можно написать кастомный сейвер/лоадер значений, под более конкретные нужды/задачи, при этом, обычно, можно сэкономить немного, не мало, байт в сохраняемом пакете, но, ИМХО, в данном случае, это не нужно, так как у тебя сохраняются булева значения, а это 1 байт, ну и может быть надо сохранять key2, а это float - 4 байта...(кастомный сэкономил бы почему, потому что ты знаешь структуру таблицы, и не надо сохранять ключи в ней, а только их значения, как видно по алгоритму, ключи сохраняются в виде строки, а занимаемый ею размер - длина строки + 1)

Изменено пользователем Viнt@rь
Ссылка на комментарий
Поделиться на других сайтах

Вопрос: как правильно сохранить/прочесть мое значение и подставить загруженное значение в мое условие при загрузке игры?

К сожалению, автор вопроса задал шараду без необходимых пояснений/данных... Предполагаю, что все это относится к менеджеру торговли и автор вопроса задался целью сохранять в сэйвы и считывать из них свои параметры. Однако, позабыл (или не знает), что скрипт, отвечающий за это (trade_manager.script) и алгоритм работы с ним подразумевает периодическое(!) обновление при каждой(!) смене секции логики.

Штатные параметры этого модуля запоминаются движком и меняются по заложенному алгоритму. А вот "пользовательские" данные, даже будучи запомненными и восстановленными, при первой же смене/переинициализации логики непися будут заменены на дефолтные (см. вызов: trade_manager.trade_init(npc, trade_ini) из xr_logic.configure_schemes).

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

@Viнt@rь, если мое предположение о менеджере торговли верно, то нет особого смысла в кастомном хранилище и в экономиях байтов... У неписей почти ничего не запоминается в pstor и его (не менее 7-ми кило) вполне достаточно даже для очень богатого и разветвленного ассортимента. ;-) 

P.S.

 

я же на модулях от Artos'а сижу.

И модулях Artos'а (конкретно в lua_helper.script) имеются функции работы с pstor'ом объектов/неписей (SetVarObj/GetVarObj_Table/...), аналогичные всем что тут упоминались...(+ с компрессией) и хранить/считывать таблицы совсем не сложно и нет смысла ломать голову над ними, если данные в таблицах строки/числа/булевы... 

Тебе нужно над другим поломать голову ;-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Поделиться на других сайтах

Подскажите, как можно сделать многострочный текст с прокруткой ?

Ссылка на комментарий
Поделиться на других сайтах

Давно с UI не работал, но если нет нормального способа через какой нибудь статик, то например в ОГСМе это делали через ListBox, то-есть просто разбивали текст на строки и построчно добавляли их в "список". Можешь глянуть в ОГСМ ЧН энциклопедию. Тока на ЗП код нужно будет переделывать. 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Поделиться на других сайтах

@*Shoker*, вопрос задан некорректно и совершенно не ясно что нужно автору вопроса. То-ли он не управится с аргументом complex_mode, то-ли ему надо составить листинг/текст скриптом со скроллом, лично я вопроса не понял. Приведу свой пример для листинга составляемого скриптом(здесь у меня именно список, а не абзационный текст):

 

--/ расположение листинга
local list_wnd = CUIListWnd()
list_wnd:SetAutoDelete(true)
list_wnd:SetWindowName("list_window")
list_wnd:SetItemHeight(20)
list_wnd:Init(130, 230, 430, 400)
list_wnd:EnableScrollBar(true) --// показывать скролл-бар или нет
list_wnd:ShowSelectedItem(true)
self:Register(list_wnd)
self:AttachChild(list_wnd)

 

 

Ссылка на комментарий
Поделиться на других сайтах

Как по мне вопрос вполне ясный. Текст со скроллером. 

Режим complex_mode вроде как позволяет делать переносы строк и прочую "раскраску" но прокрутку не добавляет, хотя могу ошибаться.

А так твой пример вполне подходящий, как раз то что нужно. 

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Поделиться на других сайтах

[error]Description : Particle effect or group doesn't exist

 

Вопрос: а наличие оного эффекта можно как-то проверить до вызова particles_object(), и, соответственно, повисания чего попало с такой вот ошибкой в логе ?

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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

AMK-Team.ru

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