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

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

[ЧН/ЗП]
Перебор пояса через старый костыль со спавном предмета-маркера: пересчет при открытом инвентаре, вылет в момент удаления нового маркера, если в инвентаре не остался аналогичный маркер от прошлой проверки. Если отспавнить один лишний маркер до начала пересчета, вылета не происходит.

Если сравнивать со старым кодом АМК, где выполнялся циклический переспавн маркера и сразу же перебор инвентаря (без ожидания регистрации), там как раз оставался один лишний маркер ввиду того, что первый перебор не находил ничего, второй перебор находил первый маркер и т. д.

 

Почему без "запасного" маркера случается вылет?

 

Spoiler
Expression    : assertion failed
Function      : CUICellContainer::GetItemPos
File          : E:\priquel\sources\engine\xrGame\ui\UIDragDropListEx.cpp
Line          : 702				-- в ЗП строка 769, обработчик тот же
Description   : 0


[xrGame\ui\UIDragDropListEx.cpp]
Ivector2 CUICellContainer::GetItemPos(CUICellItem* itm)
{
	for(int x=0; x<m_cellsCapacity.x ;++x)
		for(int y=0; y<m_cellsCapacity.y ;++y){
			Ivector2 p;
			p.set(x,y);
		if(GetCellAt(p).m_item==itm)
			return p;
		}

		R_ASSERT(0);
		return Ivector2().set(-1,-1);

 

 

Конфиг маркера:

[marker]:harmonica_a
inv_weight                = 0
inv_grid_width            = 0
inv_grid_height            = 0

 

Скрипт пересчета пояса: https://drive.google.com/file/d/1sbr2Sc8zBVP-0qrSh-M4WTb6TnEs24DD
Тест: загрузить сейв (можно начать новую игру), открыть инвентарь, запустить пересчет пояса on_belt.update() любым подходящим способом.

 

В ТЧ спавн и удаление маркера выполняются без нарушений на любых сейвах и в новой игре.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
17 минут назад, Norman Eisenherz сказал:

Почему без "запасного" маркера случается вылет?

Так у тебя проблема не с "костылем-перебором", а с отображением ячеек инвентаря, раз вылет туда ссылается. Насколько я понял, отработал R_ASSERT, потому что функция не нашла предмет по указанной позиции. Нужно смотреть метод GetCellAt, возможно там предметы 0х0 не обрабатываются. Обратить также внимание на сравнение вещественных чисел с нулем, менялось это или нет. Или, может быть при удалении предмета из онлайна его уже нет в CUICellContainer, это вполне могло поменяться в ЧН, тогда как в ТЧ прокатывало.

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

Методы GetItemPos и GetCellAt в ТЧ и ЧН имеют одинаковое описание. Что еще можно проверить?

 

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
11.07.2023 в 19:39, Norman Eisenherz сказал:

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

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

 

В общем случае, по идее в одной ячейке может быть только один предмет. А когда у нас предмет 0х0, то их может быть бесконечно много, что уже выглядит как косяк с точки зрения системы. Почему тогда в ТЧ это работает?.. Нужно смотреть все цепочки вызовов, что откуда вызывается, в том числе GetItemPos.

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

Задача: заполнить таблицу парами значений с суммированием (+/-) или просто нулями. Вместо суммирования таблица очищается на каждом шаге при проверке наличия заданного ключа.
Вложенная таблица {0, 0} не успевает записаться в память до следующей проверки?

Spoiler
local count = {}

for stat, v in pairs(st) do							-- так заполняется правильно
	count[stat] = {0, 0}
end

if #arts > 0 then
	for i = 1, #arts do
		local sect = arts[i]

		if sect:find("^af_") then
			for stat, v in pairs(st) do
				local p = 
				local k = p < 0 and 2 or 1			-- позиция записи

				-- if not count[stat] then			-- так очищается на каждом шаге
					-- count[stat] = {0, 0}
				-- else
					count[stat][k] = count[stat][k] + p
				-- end
			end
		end
	end
end

 

 

Мини-тест с такой же проверкой и правильным суммированием:

Spoiler
local count = {}

for j = 1, 3 do
	for i = 1, 4 do
		if not count.name then
			count.name = {0, 0}
		else
			count.name[1] = count.name[1] + 2
		end
	end
end

 

 

  • Смешно 2

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
11 часов назад, Norman Eisenherz сказал:

Вместо суммирования таблица очищается на каждом шаге при проверке наличия заданного ключа.

А шагов не два случайно? :)

 

11 часов назад, Norman Eisenherz сказал:

Вложенная таблица {0, 0} не успевает записаться в память до следующей проверки?

Ошибка всегда в программе.

 

В первый раз вместо того, чтобы прибавить p, ты пишешь нолики. Убери else.

 

Ну и вариант с отдельной инициализаций count и отдельным заполнением в сто раз лучше. И ошибок в нем меньше.

Изменено пользователем abramcumner
  • Нравится 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий
6 hours ago, abramcumner said:

шагов не два случайно

Варианты "так работает / так нет" включаются в код по отдельности – в одном блоке кода они указаны только для объяснения проблемы. Или мы говорим о разных вещах?

 

С записью {0, 0} вместо значения на первом шаге поправка принимается, но основная проблема в том, что на следующем шаге, когда значение есть, проверка if not снова дает nil и значение перезаписывается парой нулей.

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
2 часа назад, Norman Eisenherz сказал:

проверка if not снова дает nil и значение перезаписывается парой нулей.

Нет, не  дает и не перезаписывается.

Вот результат выполнения твоего кода

local st={a=1}
local arts ={"af_a", "af_b", "af_c"}

i=1 stat=a count[stat]=nil
i=2 stat=a count[stat][k]=0
i=3 stat=a count[stat][k]=1
count={a = {1 = 2,2 = 0}}

 

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

У меня при тестовом выводе таблицы на каждом шаге получается {0, 0}, потом какое-то значение, потом опять {0, 0} и другое значение, но не сумма.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Потестил еще: сбой только в старом варианте "0, 0 else сумма". Если сделать "(0,0 + значение) else сумма", считает правильно даже в общем цикле (ожидаемо).

Проще оставить вариант с предварительным заполнением нулями – меньше кода.

  • Нравится 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Приветы!

Подскажите, как можно определить опьянение актора? Скриптовой функции, я так понял, нет. 

Может, как-то через нет-пакет это число добывается? 

Платформа: ОП 2.2

Добра.

Ссылка на комментарий
13 минут назад, phalcor сказал:

Увы... 

 

28 минут назад, phalcor сказал:

Платформа: ОП 2.2

У меня OGSR, в биндере actor_binder:update(delta) 

https://disk.yandex.ru/i/J16oMpsKFlCeUA

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

Здесь могла быть ваша реклама.

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

@phalcor , в трубочку дыхнуть надо? Ну если прибухнул, выдай инфопоршен, который удалится по таймеру...

  • Спасибо 1
  • Не нравится 1

Здесь могла быть ваша реклама.

Ссылка на комментарий
27 минут назад, phalcor сказал:

Но у меня обычный двиг

1 час назад, phalcor сказал:

Платформа: ОП 2.2

Пардон, но разве это одно и то же? Мне кажется что в ОП с движком что-то все же делали. Стало быть, надо брать их справочную документацию/исходники и смотреть там.

 

4 минуты назад, mole venomous сказал:

инфопоршен, который удалится по таймеру

Костыль на костыле... и работать "так, как ожидалось", эта конструкция будет не всегда. И числовое значение если оно важно/нужно, из инфопоршня не вытянуть.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ссылка на комментарий
6 минут назад, Zander_driver сказал:

Костыль на костыле... и работать "так, как ожидалось", эта конструкция будет не всегда. И числовое значение если оно важно/нужно, из инфопоршня не вытянуть.

Никто не интересовался конкретно числовым значением, насколько я вижу. Также непонятно, всегда ли нужно проверять ГГ на градус, может лишь единожды. Есть скриптовый вариант? Предложи, ибо твоё мнение авторитетно. 

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

Здесь могла быть ваша реклама.

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

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

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

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

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

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

Войти

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

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

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