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

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

Ну, например, в этих самых схемах могут вызываться функции, которые дохлякам не поддерживаются.

Далее, это просто бесцельная трата ресурсов.

 

Самое поганое, что я не могу понять, откуда оно лезет, и при каких условиях.

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

Сразу извинюсь, за немного глупый вопрос. Проблема в том, что бы забить все id объектов инвентаря в таблицу и на всякий пожарный еще и их состояние, создал две идентичные таблички и на одной и той же итерации, добавляю по объекту и его состоянию параллельно в обе таблички соответственно, но когда пытаюсь проверить и вывести, состояние у всех объектов равно 1, не смотря на то, что там есть изодранный в хламину сталкерский костюм, еле живой шлем и побитый автомат...

--Вот функция загрузки таблиц
local tItems={}
local tCond={}
function Actor_Has_ListItems()
local cnt = db.actor:object_count()
for i=0, cnt-1 do
local item = db.actor:object(i)
local sobj = alife():object(item:id())
if sobj then
table.insert(tItems,item)
table.insert(tCond,item:condition())
end
end
end
--Этой я проверяю состояние
function test_t(n)
text="His condition -"..tCond[n]
news_manager.send_tip(db.actor,text , nil, nil, 30000)
end 

 

 

n-параметр, который вводится с помощью горячих клавиш, На numpad'e(1-9).То есть, могу вывести состояние 9 различных объектов их таблицы(теоретически). где я допустил ошибку? Заранее спасибо)

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

mumie

Возьми в инвентарь только 4 сломанных предмета и проверь на numpad'e все 9 вариантов. Штук 5 должны быть равны 1 (детектор, фонарь, бинокль, пда, нож), остальные меньше 1.

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

Подскажите пожалуйста, можно ли умножить вектор на матрицу без танцев с бубном (В Lua_Help не нашел - приходится юзать промежуточную матрицу)

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

Graff46

Прямого метода нет.

Поворот возможен только при использовании *.xml файлов.

Но способ скриптово управлять всем тем, что пока управляется только из *.xml существует.

 

P.S. По крайней мере я это делаю. Только на вопрос КАК? пока не отвечу, т.к. расширение для этого ещё не дописал. Лень.

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

Graff46

Поворот возможен только при использовании *.xml файлов.

 

 

Мне метод когда статики выводят через *.xml не подходит, они под родной худ уходят и удаляются ф-цией 

level.hide_indicators()

Я делаю статики методом таким

local hud = CUIStatic()hud:Init(0,0,1024,768)
hud:InitTexture("my\\krepost\\glass")
hud:Show(true)
hud:SetStretchTexture(true)
get_hud():AddDialogToRender(hud)

При таком подходе статики не пропадают при диалогах, открытом инвентаре, пда и так далее. Я хотел таким способом миникарту сделать, а для этого нужно вращать текстуру.

 

Ссылка на комментарий
... есть ли в классе CUIStatic метод поворота текстуры... платформа ТЧ.
CUIStatic : CUIWindow { 
CUIStatic ();
...
void SetHeading(float angle);
...}

http://www.amk-team.ru/forum/index.php?showtopic=7450&page=7#entry515301

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

всё легко

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

Поворот возможен только при использовании *.xml файлов

) Если в xml не прописать heading=1 (а xml не устраивает)...

Мне метод когда статики выводят через *.xml не подходит

..то повторю, - Вращать не выйдет

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

Ребят помогите ... есть такая функция которая при взятии оружия меняет на актерское оружие... но проблева в том как передать аддоны и количество жизней оружию)))зарание спасибо если кто знает как это сделать)))

 

function wpn_update()


local wpn_actor = {
"wpn_pm",
"wpn_pb",
"wpn_fort",
"wpn_apb",

"wpn_hpsa",
"wpn_beretta",
"wpn_walther",

"wpn_colt1911",
"wpn_ups",
"wpn_desert_eagle",
"wpn_desert_eagle_full",
"wpn_sig220",

"wpn_pp19",
"wpn_mp5",

"wpn_ak74u",
"wpn_ak74",
"wpn_abakan",

"wpn_l85",
"wpn_lr300",
"wpn_sig550",
"wpn_sig_m1",
"wpn_sig_m2",
"wpn_g36",
"wpn_fn2000",

"wpn_vintorez",
"wpn_val",
"wpn_val_m1",
"wpn_groza",

"wpn_svd",
"wpn_svu",

"wpn_bm16",
"wpn_bm-16_full",
"wpn_toz34_short",
"wpn_toz34",
"wpn_wincheaster1300",
"wpn_spas12",
}
for _, section in pairs (wpn_actor) do
local wpnObject = db.actor:object(section)
if wpnObject then
db.actor:drop_item(wpnObject)
alife():release(alife():object(wpnObject:id()), true)
spawn.inv(section.."_actor)
end
end
end

 

 

 

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

@kmsk,Состояние очень легко 

wpnObject:condition() -- это сохраняешь в переменную скажем cond
wpnObject:set_condition(cond)-- это когда будешь спавнить свой ствол, просто дописываешь после спавна


@kmsk,небольшой апдейт.
проверить наличие аддонов можно так(не знаю прокатит ли, но в ЛУА_хелпе иного нет совсем )
 

weapon_scope_status()
weapon_grenadelauncher_status()
weapon_silincer_status()
--Данная группа функций должна возвращать наличие или отсутствие аддонов на стволе.
weapon_is_silencer()
weapon_is_scope()
weapon_is_grenadelauncher()
-эта группа должна выводить тип, если есть. Могу ошибаться, лучше проверить.  
Ссылка на комментарий

mumie, Я сделал но почему-то ошибка, 10 раз все перепроверил не могу понять причины:

 

Expression : fatal error


Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description : <no expression>
Arguments : LUA error: ...hadow of chernobyl\gamedata\scripts\wpn_actor.script:99: attempt to index local 'wpn' (a nil value)

 

 

Пишет что wpn нет равно нулю  :huh:

 

for _, section in pairs (wpn_actor) do

local wpnObject = db.actor:object(section)

if wpnObject then
local cond = wpnObject:condition()
db.actor:drop_item(wpnObject)
alife():release(alife():object(wpnObject:id()), true)
local spawnwpn = section.."_actor"
local obj = alife():create(spawnwpn,vector():set(0,0,0),1,1,db.actor:id())
local wpn = db.actor:object(spawnwpn)
wpn:set_condition(cond)
end
end

 

 

З.Ы. если ставлю проверку

 

local wpn = db.actor:object(spawnwpn)
if wpn then
wpn:set_condition(cond)
end

 

передачи жизней нет

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

@kmsk,

Потому что сразу после создания ствола нельзя получить его клиентский объект - его ещё не существует.

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

Если бы ещё нужный скрипт ещё был бы под рукой, но некоторые здесь поспособствовали, и теперь его придётся искать у себя или брать первый попавшийся. <_<

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

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

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

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

@kmsk, да, прости. Я думал ты уже разобрался с мутками клиентских объектов и работу с ними.
@*Shoker*,Слушай, а не подскажешь как можно функционально прикрутить/снять к/у стволу/а аддоны? а то вот как раз не смог найти такой функции. Вывод, либо ее нет, либо не там искал, конечно же...

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

 

 


как можно функционально прикрутить/снять к/у стволу/а аддоны?

Берем нет-пакет ствола, уводим его в оффлайн, меняем в нет-пакете что нам надо (например наличие/отсутствие аддонов), присваиваем новый нет-пакет стволу, выводим его в онлайн. вроде так.

 

Вопрос по работе с оконными классами, точнее с текстурами для них. прежде чем устанавливать текстуру для статика методом  void InitTexture(string texture); можно ли как то проверить что данная текстура (string texture) существует?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Если texture это файл, то его наличие можно проверить так

getFS():exist("$game_textures$", texture..".dds")

Если это идентификатор текстуры, то нужно проверить его наличие в файлах-описателях для текстур. Их имена перечислены в секции texture_desc. Если не нашлось ни того ни другого, ругаемся в лог и текстурим окно какой-нибудь заведомо существующей дефолтной текстурой.

  • Нравится 1
Ссылка на комментарий

Наконец-то победил причину автозавершения квестов на защиту барьера и им подобным после сейв/лоада) Найдена и вырвана с корнем глубоко сидевшая в скриптах ошибка еще от ПЫСов, что в сейве не сохранялся ИД смарта, от которого надо защищать другой смарт) Этот ИД задавался при выдаче таска, но при сейв/лоаде он терялся, и после лоада это ИД было = nil. Но ее легко было бы выловить, если бы при запросе состояния несуществующего гулага возвращалось заведомо несуществующее значение, например -1. Но xr_gulag.getGulagState() при несуществующем гулаге возвращает 0, или состояние неактивного, пустого гулага. Вот проверка и срабатывала, что гулаг зачищен, и задание выполнялось)) Это, конечно, досадная оплошность со стороны того, кто делал скрипты гулагов, и, если бы не она, то это все было бы выявлено и поправлено еще в далеком 2007 году) а так эта проблема дожила аж до 2014 года)) И, наконец, она вылечена))

Правка этой ошибки в общем случае требует НИ, так как в нетпакет пишется новое значение и меняется его размер. Но можно использовать технологию двухэтапного подключения этой и подобных ей правок, без начала НИ. Для этого нужно в методе save выдать поршень, и в методе load его проверять при чтении нетпакета. Тогда на старых сейвах до правки будет читаться старый нетпакет, а на новых - новый)

Вот правка автозавершения на task_manager от Народной Солянки на версии 1.0006:

 

 



-- Будем записывать не id задания а его хеш - семикратная экономия.
function CRandomTask:save(p)
  printf("^^^ SAVE")
  -- Отметка того, что это новая версия формата.
  p:w_u8(255)
  --' Считаем количество записей
  local i = 0
  for k,v in pairs(self.task_info) do
    i = i + 1
  end
  p:w_u8(i)
  for k,v in pairs(self.task_info) do
    if not id_to_hash[k] then
      abort("Cannot find hash for id %s!",k)
    end
    p:w_u16(id_to_hash[k]) 
    p:w_bool(v.enabled) 
    p:w_bool(v.enabled_props)
    if not status_to_num[v.status] then
      abort("Wrong status '%s' for task %s!",v.status,k)
    end
    p:w_u8(status_to_num[v.status])
    p:w_u32(v.selected_target or -1)
    p:w_u32(v.defend_target or -1)	-- Фикс автозавершения квестов
    utils.w_CTime(p, v.last_task_time)
  end

  --' Та же самая процедура с активными тасками
  i = 0
  for k,v in pairs(self.active_task_by_type) do
    i = i + 1
  end
  p:w_u8(i)
  for k,v in pairs(self.active_task_by_type) do
    if not ct_to_hash[k] then
      abort("Cannot find hash for complex type %s!",k)
    end
    p:w_u16(ct_to_hash[k]) 
    if not id_to_hash[v] then
      abort("Cannot find hash for task id %s!",v)
    end
    p:w_u16(id_to_hash[v])
  end

  -- Фикс автозавершения квестов
  db.actor:give_info_portion("fix_task_manager")
end

--' Загрузка
function CRandomTask:load(p)
  printf("^^^ LOAD")
  --' Считаем количество записей
  local rt0=p:r_tell()
  local i = p:r_u8()
  amk.mylog("tasks "..i)
  if i~=255 then
    for k = 1,i do
      local id = p:r_stringZ()
      if id ~= nil and self.task_info[id] ~= nil then
            self.task_info[id].enabled = p:r_bool()
            self.task_info[id].enabled_props = p:r_bool()
            self.task_info[id].status = p:r_stringZ()

            local selected_target = p:r_u32()
            if selected_target ~= -1 then
              self.task_info[id].selected_target = selected_target
            end

			-- Фикс автозавершения квестов
			if has_alife_info("fix_task_manager") then
				local defend_target = p:r_u32()
				if defend_target ~= -1 then
				  self.task_info[id].defend_target = defend_target
				end
			end
            self.task_info[id].last_task_time = utils.r_CTime(p)
      end
    end
    --' Та же самая процедура с активными тасками
    local i = p:r_u8()  
    amk.mylog("active "..i)
    for k = 1,i do
      local id = p:r_stringZ()
      self.active_task_by_type[id] = p:r_stringZ()  
    end
  else
    i=p:r_u8()
    for k = 1,i do
      local hash = p:r_u16() 
      local id=hash_to_id[hash]
      if not id then
        abort("Cannot find id for hash %d!",hash)
      end
      self.task_info[id].enabled = p:r_bool()
      self.task_info[id].enabled_props = p:r_bool()
      self.task_info[id].status = num_to_status[p:r_u8()]

      local selected_target = p:r_u32()
      if selected_target ~= -1 then
        self.task_info[id].selected_target = selected_target
      end
	  
	  -- Фикс автозавершения квестов
	  if has_alife_info("fix_task_manager") then
		local defend_target = p:r_u32()
		if defend_target ~= -1 then
		  self.task_info[id].defend_target = defend_target
		end
	  end
      self.task_info[id].last_task_time = utils.r_CTime(p)
    end
    --' Та же самая процедура с активными тасками
    i = p:r_u8()  
    amk.mylog("active "..i)
    for k = 1,i do
      local cthash = p:r_u16()
      local id=hash_to_ct[cthash]
      if not id then
        abort("Cannot find complex type for hash %d!",cthash)
      end
      local hash=p:r_u16()
      self.active_task_by_type[id] = hash_to_id[hash]
      if not self.active_task_by_type[id] then
        abort("Cannot find task id for hash %d!",hash)
      end
    end
    amk.mylog("Feel the difference.")
  end
  amk.mylog("size "..p:r_tell()-rt0)
end

Если адаптация к старым сейвам не нужна, то можно выкинуть поршень fix_task_manager и все его проверки.

 

 

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

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

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

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

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

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

Войти

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

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

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