Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Редактирование движка
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
mortan
Этих трабл из-за нет-пакетов - полно. Всё же делать единый двигло для сингла и мультиплеера дурная затея. Как пример - из трупа нельзя перетащить оружее в нужный слот, оно залетает в тот который прописан в конфиге если он свободен, иначе просто тупо дропается в инвентарь. Я с этим столкнулся когда делал inv-in-inv рюкзаки и контейнеры.
Winsor
Как бы само по себе SetSlotsBlocked оружие не прячет. Оно всего лишь выставляет маску на возможность использование того или иного слота. а вот уже спрятать/достать - это уже делает Activate(slot_id). т.е. могу предположить что в CInventory::SetSlotsBlocked код не попал в if(bChanged). По поводу нетпакета - на обработку такого вызова тратиться как минимум 1-н апдейт, вызов напрямую выполняется на этом же апдейте, на этом же апдейте должна выполниться и анимация hide. может она банально не успевает отрисоваться? может в этом причина? это только предположение.
Я делал проще если через скрипты
Код
local active_slot=db.actor:active_slot()
    if active_slot~=inventory_slots.NO_ACT_SLOT then
        db.actor:activate_slot(inventory_slots.NO_ACT_SLOT,true) --спрячем с анимацией активное оружие
    end
    db.actor:hide_weapon() --запретим использование слотов

так и красиво все и запрет выставляется.
===
Что-то я тупенький... Подскажите пожалуйста - где описан механизм обхода препятствий. например, деревьев, крупных скоплений камней. В path_builder все что смог понять - аномалии обходятся через рестрикторы, но у деревьев их нет? Или вот упирание ботов в открытые створки дверей, если открыты "по движению". Как бы дверь physic_object - но они его упорно игнорируют. Не стоит флаг STYPE_VISIBLEFORAI у створки, но при этом механизм коллизий с объектами работает? Или что делать с тем что feel_touch_new не "видит" объект створки? слишком много непонятного...
RayTwitty
Цитата(Winsor @ 26.07.2019, 16:59) *
Как бы само по себе SetSlotsBlocked оружие не прячет. Оно всего лишь выставляет маску на возможность использование того или иного слота. а вот уже спрятать/достать - это уже делает Activate(slot_id). т.е. могу предположить что в CInventory::SetSlotsBlocked код не попал в if(bChanged).

smile.gif
Конечно же, я проверил вызовы - всё вызывается. И я уже писал выше, что Activate отрабатывает одинаково, что при скрытии кнопкой, что при hide_weapon. И внутри себя Activate работает одинаково (ставил метки после каждого действия/условия и потом сравнивал - в копейку). Короче говоря, дело не в этом куске. Спецэффекты появляются, если делать вызов SetSlotsBlocked через нетпакет.

Я даже пробовал обратное - в экшон кнопки засунуть вызов скрытия через нетпакет - в итоге получал такой же косяк.

Цитата(Winsor @ 26.07.2019, 16:59) *
По поводу нетпакета - на обработку такого вызова тратиться как минимум 1-н апдейт, вызов напрямую выполняется на этом же апдейте, на этом же апдейте должна выполниться и анимация hide.

Что-то где-то неявно происходит за этот апдейт(ы). Вот мне и интересно что smile.gif

З.Ы. хотя в теории, даже отсрочка на 10 апдейтов не должна ничего ломать - ведь скрытие не растянуто по времени, просто сам вызов SetSlotsBlocked позже происходит, чем вызов SetWeaponHideState.
abramcumner
Цитата(Winsor @ 26.07.2019, 16:59) *
где описан механизм обхода препятствий. например, деревьев, крупных скоплений камней.

Они обходятся по определению - под ними нет аи-сетки. Если проложить, нпц будут ходить сквозь деревья.
XR_CPU_PIPE.DLL
люди подскажите как в тч запилить раскачку рук?
по идее это в исходниках колупаться надо но я не знаю де именно
помогите пожалуйста sad.gif
macron
Цитата(XR_CPU_PIPE.DLL @ 27.07.2019, 15:05) *
как в тч запилить раскачку рук?

А где обещанный порт ТЧ на PS3/4/5. Уже все приставки раскупили и сидим в предвкушении. laugh.gif
XR_CPU_PIPE.DLL
Цитата
А где обещанный порт ТЧ на PS3/4/5. Уже все приставки раскупили и сидим в предвкушении. laugh.gif

ну во первых ответ те на вопрос
ну а во вторых я тут думаю какбе присабачить opengl|es к этому дерьму
потом ещё и разобраться с этим power процами
кароч это капец
но я стараюсь
а теперь ответ буде?

RayTwitty
В продолжение о скрытии оружия - вроде получилось сделать фикс получше.

В ЗП оказывается эту проблему забороли, но сделали это таким образом (костыль или нет, хз):
в функции CInventory::Activate вместо вызова
Код
m_slots[m_iActiveSlot].m_pIItem->Deactivate();

сделали
Код
active_item->cast_hud_item()->SendDeactivateItem();

в котором сделали дополнительную смену стейта через нет_пакет
Код
    if (!object().getDestroy())
    {
        NET_Packet                P;
        object().u_EventGen        (P,GE_WPN_STATE_CHANGE,object().ID());
        P.w_u8                    (u8(eHiding));
        object().u_EventSend    (P, net_flags(TRUE, TRUE, FALSE, TRUE));
    }

Плюс функцию Deactivate они зачем-то переименовали в DeactivateItem, но похоже что нигде ее не вызывают. В свою очередь, в ней идет вызов OnHiddenItem, о котором я уже писал выше - его убирание тоже фиксит проблему, но я думал что будут нежелательные эффекты. Проверил - все что вызывается в ней у классов оружия и гранат/болта уже итак вызывается без нее. И даже то, что пыс сделали в ЗП с посылкой GE_WPN_STATE_CHANGE - не нужно. Я проверил, с этим кодом в ТЧ два раза устанавливается стейт eHiding.

Короче говоря, фикс этой херни заключается в комменте вызова OnHiddenItem() в CHudItem::Deactivate(). Заодно, плавное убирание заработает на лестнице и в других местах, а не только при скрытии скриптом.

x-ray pity.gif
ForserX
Кст, за лестницы. Два года назад словили интересное исключение, когда прыгали по лесницам туда-сюда. Если Стейт не до конца дошёл и тут же запускался следующий, двиг падал. Можно словить в ванильном ЗП в подземке Юпитер <-> Припять. Фикс можно найти у нас в одной из правок Гипа. А, да. Нужно достать детектор.
mortan
Кст, тут напомнили ( не знаю насколько сильно этот баг известен ) о баге с оружием на классе РГ-6. Короче, берёшь ствол в руки, открывашь инв, разряжаешь и закрываешь инв, потом можно сделать один бесплатный выстрел. Повторять можно до бесконечности. Пока не ковырялся особо, но штука больно читерная, надо править, в OXR точно не исправлено)
mortan
ага, пролистал назад, об этом как раз нанобот и упоминает.
Winsor
Цитата(abramcumner @ 26.07.2019, 17:39) *
Цитата(Winsor @ 26.07.2019, 16:59) *
где описан механизм обхода препятствий. например, деревьев, крупных скоплений камней.

Они обходятся по определению - под ними нет аи-сетки. Если проложить, нпц будут ходить сквозь деревья.

т.е. для того чтобы бот обошел створку двери - надо все ноды, которые она занимает - делать невалидными? каким то образом проверять в path_builder-е эти ноды на "занятость"? Уж очень не хочется еще рестрикторы добавлять и на створки дверей...
macron
Цитата(Winsor @ 29.07.2019, 08:12) *
т.е. для того чтобы бот обошел створку двери - надо все ноды, которые она занимает - делать невалидными? каким то образом проверять в path_builder-е эти ноды на "занятость"? Уж очень не хочется еще рестрикторы добавлять и на створки дверей...

Если дверь статичная, то при грамотном создании ai-сетки ноды под ней не сгенерятся. А если заспавнена как физика, то ноды можно будет вручную удалить. Я не спец по ai-сеткам, но вроде это базовые правила.
abramcumner
Цитата(Winsor @ 29.07.2019, 08:12) *
т.е. для того чтобы бот обошел створку двери - надо все ноды, которые она занимает - делать невалидными? каким то образом проверять в path_builder-е эти ноды на "занятость"? Уж очень не хочется еще рестрикторы добавлять и на створки дверей...

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

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

Еще можно рестриктор в виде гейм-объекта не заводить, а попробовать из класса двери работать с RestrictionObject (или как-то так, чем там рестрикторы оперируют).
AndreySol
Цитата
Уж очень не хочется еще рестрикторы добавлять и на створки дверей...
Но рестриктор может быть лучше,
Как по мне - рестриктор самое то. Вспомните дверь к ученым на Янтаре: непись подошел - дверь открылась, прошел - закрылась. Вполне адекватно. А если надо совсем не пущать - так есть экспортированый ф-ционал по добавлению\удалению рестрикторов("реал-тайм" так сказать), и не нужны никакие шаманства с передергиванием он-офф-он лайн.
P.S. А желание "чтоб само все работало" - это в основном от лени,и реализовать крайне затруднительно на этом движке... Но это мое мнение.
zibit_93
Цитата(mortan @ 28.07.2019, 03:16) *
Кст, тут напомнили ( не знаю насколько сильно этот баг известен ) о баге с оружием на классе РГ-6. Короче, берёшь ствол в руки, открывашь инв, разряжаешь и закрываешь инв, потом можно сделать один бесплатный выстрел. Повторять можно до бесконечности. Пока не ковырялся особо, но штука больно читерная, надо править, в OXR точно не исправлено)

Это еще что... В мп теней можно делать разрядку бульдога бесконечно много раз - т.е. разрядил-зарадил 100 раз, и у тебя будет 600 (!) выстрелов без перезарядки, которые вылетают быстрее чем пули гадюки, заливая всю карту взрывами.
Или еще можно клонировать РПГ, и после каждого выстрела менять ствол нажатием на 3, он автоматически меняется на заряженный и у тебя получается проливной дождь из ракет)
mortan
zibit_93, ого, если это действительно так, то сто пудов надо фиксить. Такого рода эксплойт не нужен ни в сингле ни тем более в МП.
macron
Цитата(mortan @ 29.07.2019, 23:06) *
Такого рода эксплойт не нужен ни в сингле ни тем более в МП.

В сингле да, а в mp тяжелое оружие на серьезных серверах давно заблокировано. На самом деле, в mp такими "читами" практически не пользовались. Там и других косяков хватало.
zibit_93
Цитата(macron @ 29.07.2019, 23:25) *
Цитата(mortan @ 29.07.2019, 23:06) *
Такого рода эксплойт не нужен ни в сингле ни тем более в МП.

В сингле да, а в mp тяжелое оружие на серьезных серверах давно заблокировано. На самом деле, в mp такими "читами" практически не пользовались. Там и других косяков хватало.

На твт так часто делал, вейх рвался но не банил. Иногда, когда с деньгами жопа была, фармил себе деньги клонированием пушек, но немного, чтоб не сильно палиться. И он неоднократно банил людей за злоупотребление этим багом.
Некоторые стали делать на своих сервах по 300000 начальных денег - с одной стороны, это останавливает фарм, облегчает игру, с другой - не интересно, ведь фармили единицы, а безденежье заставляло выживать и бояться за свой хабар, собирать его и тащить на базу для продажи.
Чаще всего конечно делал это на разминке.
Ну еще лифтами баловался и левитацией) И лазаньем за картой. Хорошее время было, веселое. Я в сингле сингловые карты так не исследовал, как в МП.

Кстати, хотел сейчас это повторить - а в инвентаре нельзя разряжать пушки, как оказалось. Это что такое? Раньше, по крайней мере на артханте, всегда можно было.
Да и клонировать не получилось, как на своем выделенном серваке (оно и раньше тяжело давалось из-за минимального пинга), так и на чужом. Или я уже сноровку растерял, ибо там нужно иметь молниеносную реакцию и моментально открыть инвентарь после выбрасывания пушки.
Не могли же такое пофиксить без вмешательства в мои файлы?
Может и подмену гейдаты пофиксили?
Winsor
Цитата(abramcumner @ 29.07.2019, 12:32) *
Еще можно рестриктор в виде гейм-объекта не заводить, а попробовать из класса двери работать с RestrictionObject (или как-то так, чем там рестрикторы оперируют).

нет такого... sad.gif только скриптовая обертка ph_door. А так - это всего лишь physical_object.
NanoBot-AMK
В классе шотгане не сохраняются разные патроны, точней они сохраняются, но в ствол загружаются лишь тот тип патрона, который находится в патроннике в момент сохранения.
Этот код это исправляет.
CWeaponShotgun
Код
BOOL    CWeaponShotgun::net_Spawn(CSE_Abstract* DC)
{
    BOOL    res = inherited::net_Spawn(DC);
    CSE_ALifeItemWeaponShotGun*        E = smart_cast<CSE_ALifeItemWeaponShotGun*>(DC);
    u32    ammoCount = E->m_AmmoIDs.size();
    if(ammoCount>0){
        m_magazine.clear();
        for (u32 i=0; i<ammoCount; i++){
            u8            ammoType = E->m_AmmoIDs[i];
            CCartridge    cartidge; cartidge.m_flags.zero();
            cartidge.Load(*m_ammoTypes[ammoType], ammoType);
            m_magazine.push_back(cartidge);
        }
    }
    return res;
}

Не забыть зарегистрировать метод в *.h файле.
zibit_93
Может, я не совсем понял, но вроде как если на каком-нибудь спасе выстрелить 4 патрона, потом сменить тип патрона клавишей Y, то туда будут заряжаться другие патроны. Аналогично, если в инвентаре не осталось типа патронов которые были заряжены, будут заряжаться другого типа. С обрезом работает так же. Или это не то?
NanoBot-AMK
Двухстволка сделана на классе шотгана, соответственно, теоретически можно запихнуть два разных патрона, но движок этого не позволяет.
AndreySol
По исходникам вроде вижу, что все содержимое инвентаря хранится в нескольких контейнерах: m_ruck, m_belt, m_slots, и глобальный m_all, и все эти контейнеры наследованы от xr_vector. А сохранение\загрузка предметов инвентаря как происходит ?
RayTwitty
Вопрос скорее по Lua, нежели по движку...

Из движка экспортируется перечисление DIK_keys, которое содержит список клавиш и их числовые идентификаторы. Чаще всего, в скриптах это перечисление используют таким образом:
Код
lua_help.script:
C++ class DIK_keys {
...
const DIK_F1 = 59;
...
}

my.script:
if dik == DIK_keys.DIK_F1 then
...
end

А что если у меня есть цифра 59 и мне нужно получить "DIK_F1", т.е. получить ключ по значению? Вся проблема в том, что DIK_keys не таблица, а юзердата и перебрать ее не получается. Я конечно могу вручную переписать всё перечисление в таблицу, но это как-то не очень.
abramcumner
Цитата(AndreySol @ 02.08.2019, 13:55) *
А сохранение\загрузка предметов инвентаря как происходит ?

В классе предмета сохраняется хозяин и в каком слоте/контейнере лежит.

Цитата(RayTwitty @ 02.08.2019, 20:19) *
А что если у меня есть цифра 59 и мне нужно получить "DIK_F1", т.е. получить ключ по значению? Вся проблема в том, что DIK_keys не таблица, а юзердата и перебрать ее не получается. Я конечно могу вручную переписать всё перечисление в таблицу, но это как-то не очень.

А в твоем луа есть функция class_info? Ей передаешь юзердату, а она тебе возвращает информацию о классе. Имя класса так точно можно вернуть, по идее и свойства, но в исходниках для свойств по-моему какая-то лажа написана.
AndreySol
Цитата
В классе предмета сохраняется хозяин и в каком слоте/контейнере лежит.
Спс, я уже понял. Просто думал, что сохранением\загрузкой содержимого инвентаря занимается класс самого инвентаря или его UI-класс. А получается, что все объекты, если так можно сказать, полностью самостоятельны, просто хранят "в себе" свое местоположение?
abramcumner
Цитата(AndreySol @ 02.08.2019, 21:44) *
полностью самостоятельны, просто хранят "в себе" свое местоположение?

Да.
RayTwitty
Цитата(abramcumner @ 02.08.2019, 20:39) *
А в твоем луа есть функция class_info?

tostring(class_info) возвращает "nil", похоже что нет...

Lua и все сопутствующие причиндалы у меня отсюда: https://xp-dev.com/sc/204486/HEAD/
abramcumner
Цитата(RayTwitty @ 02.08.2019, 21:53) *
Lua и все сопутствующие причиндалы у меня отсюда: https://xp-dev.com/sc/204486/HEAD/

Она есть, но не экспортирована smile.gif
https://xp-dev.com/sc/204486/HEAD/%2Ftrunk%...Fclass_info.cpp

bind_class_info нигде не вызывается.
XR_CPU_PIPE.DLL
Слухайте а кто то пытался ковырнуть xrRender_R2, допустим чтобы синюшность исправить?
RayTwitty
Цитата(abramcumner @ 02.08.2019, 22:25) *
bind_class_info нигде не вызывается.

Ага, нигде. А куда лучше засунуть? Я тут заприметил два места:
Код
CScriptEngine::init
CResourceManager::LS_Load (тут RvP свою либу подключал)

еще возможно здесь, но я не уверен Script::vfExportToLua
abramcumner
Цитата(RayTwitty @ 02.08.2019, 22:36) *
Ага, нигде. А куда лучше засунуть? Я тут заприметил два места:
Код
CScriptEngine::init
CResourceManager::LS_Load (тут RvP свою либу подключал)

еще возможно здесь, но я не уверен Script::vfExportToLua

Абсолютно не важно. Как будет удобней.

Но она по идее из luabind.dll не экспортируется, в xrGame/xr3da ее не достанешь. Но можно экспортировать из луабинд.длл и вызвать, где глобальный неймспейс в луа добавляется.

Можно попробовать добавить ее вызов в конец open в https://xp-dev.com/sc/204486/HEAD/%2Ftrunk%...Fsrc%2Fopen.cpp
Там как раз "class" в луа экспортируется.


Цитата(XR_CPU_PIPE.DLL @ 02.08.2019, 22:30) *
Слухайте а кто то пытался ковырнуть xrRender_R2, допустим чтобы синюшность исправить?

Да зачем? На пс3 по-любому синюшности не будет.

Синюшность же погодой/смоллскаями добавляется, нет?
XR_CPU_PIPE.DLL
Не ну может ктото пытался рендер р2 оптимизировать?
И кто пытался прикручивать lua-5.3.5?

RayTwitty
Цитата(abramcumner @ 02.08.2019, 22:48) *
Можно попробовать добавить ее вызов в конец open в

Экспортировал
Код
tostring(class_info) -> function: 01765AE0

но при таком вызове:
Код
log("1")
local cinfo = class_info(DIK_keys)
log("2")
log(tostring(cinfo.attributes))
log("3")

Отрабатывает только "1", дальше там что-то зависает.
abramcumner
Цитата(RayTwitty @ 02.08.2019, 23:20) *
Отрабатывает только "1", дальше там что-то зависает.

Зависает или просто больше ничего не выводит?
Если ничего больше не выводит, то это нормально. Я же писал, что там лажа smile.gif
Цикл надо переделать на:
Код
for (map_type::const_iterator i = obj->crep()->properties().begin();
  i != obj->crep()->properties().end(); ++i, ++index)
{
  result.attributes[index] = i->first;
}

Добавить ++index, а то все свойства пишутся по индексу 1.
AndreySol
Ф-ция CWeapon::SpawnAmmo. Как-то можно для боеприпаса, который в ней будет создан, задать инвентарный флаг EItemPlace? Т.е. указать для создаваемой пачки патронов, контейнер инвентаря в который она должна попасть, пройдя через ф-цию CInventory::Take.
mortan
AndreySol, не уверен что это совсем то: https://github.com/OGSR/OGSR-Engine/commit/...4e5b242218c038e
p.s. еще можно получить ID такого итема, в теории зная ID тоже можно попробовать отправить объект в нужный контейнер.
RayTwitty
Цитата(abramcumner @ 03.08.2019, 01:59) *
Зависает или просто больше ничего не выводит?
Если ничего больше не выводит, то это нормально. Я же писал, что там лажа

Больше ничего не выводит.

Добавил инкремент ++index, но ничего не изменилось mellow.gif
abramcumner
Цитата(RayTwitty @ 03.08.2019, 20:01) *
Больше ничего не выводит.

А если не DIK_keys передать, а db.actor?
RayTwitty
Цитата(abramcumner @ 03.08.2019, 20:07) *
А если не DIK_keys передать, а db.actor?

Вот с ним сработало, вывелись свойства (сытость, жизнь и т.д.). А объекты типа DIK_keys не скушать ему?
AndreySol
Цитата
зная ID тоже можно попробовать отправить объект в нужный контейнер.
Это придется как-то передавать этот ID в нужное место, городить синхронизацию. Хотелось бы по-проще и по-правильнее unsure.gif .

Еще вопрос: имея клиентский класс, к примеру CWeaponAmmo, как-то можно из него добраться до CSE_ALifeItemAmmo? В методе CWeaponAmmo::net_Spawn есть такая возможность, а вот вне этого метода как быть?
abramcumner
Цитата(RayTwitty @ 03.08.2019, 20:19) *
Вот с ним сработало, вывелись свойства (сытость, жизнь и т.д.). А объекты типа DIK_keys не скушать ему?

Можно попробовать создать объект класса DIK_keys и передать уже его: class_info(DIK_keys())
RayTwitty
Цитата(abramcumner @ 03.08.2019, 22:36) *
Можно попробовать создать объект класса DIK_keys и передать уже его: class_info(DIK_keys())

Неа, не сработало. Тот же самый эффект.
abramcumner
Цитата(RayTwitty @ 03.08.2019, 22:51) *
Неа, не сработало. Тот же самый эффект.

У тебя отладочная сборка работает? Надо под отладчиком пройтись по get_class_info. Посмотреть, на чем зависает DIK_keys?

Ну и get_class_info енумы не обрабатывает. Надо добавить обработку по аналогии со свойствами.
mortan
AndreySol, да, можно, в том примере из ogsr можно потом вызвать смарткастом нужный класс ( не проверял ). Либо же получить серверный объект зная ID итема и потом уже опять смарткастом вызвать нужный класс
CODE
CSE_Abstract* obj = Level().Server->GetGameState()->get_entity_from_eid(ID);
AndreySol
Цитата
CSE_Abstract* obj = Level().Server->GetGameState()->get_entity_from_eid(ID);

У меня VS заругался, что не знает GetGameState для xrServer, поправил на
CSE_Abstract* obj = Level().Server->game->get_entity_from_eid(ID);
Спасибо за подсказку.

Еще вопрос: имеется такой фрагмент
BOOL CWeaponAmmo::net_Spawn(CSE_Abstract* DC)
{
BOOL bResult = inherited::net_Spawn(DC);
CSE_Abstract* e = (CSE_Abstract*)(DC);
CSE_ALifeItemAmmo* l_pW = smart_cast<CSE_ALifeItemAmmo*>(e);
Зачем сделано то, что я жирным выделил?
mortan
AndreySol, если не ошибаюсь, то это связано с работой указателей, сначала нужно разыменовать указатель, потом уже можно и смарткаст вызвать.
RayTwitty
Цитата(abramcumner @ 03.08.2019, 23:12) *
У тебя отладочная сборка работает? Надо под отладчиком пройтись по get_class_info. Посмотреть, на чем зависает DIK_keys?

Зависает как раз таки на куске с циклом, а конкретно здесь:
Код
map_type::const_iterator i = obj->crep()->properties().begin();

Похоже, в объекте нет свойств (там только "константы").
AndreySol
При появлении однотипных пачек патронов в инвентаре, они группируются в одну ячейку, при этом отображается суммарное кол-во патронов всех пачек, сгруппированых в этой ячейке. Единственное место в коде(или я ошибаюсь?), где это прописано - ф-ция CUIAmmoCellItem::UpdateItemText, где перебираются все пачки, сгруппированые в ячейке и формируется текст с общим кол-вом патронов. Само добавление пачки патронов в ячейку начинается из CUIDragDropListEx::SetItem. Я битый час рою от SetItem и дальше в лес, но не могу понять, где появляется CUIAmmoCellItem?
Вот в CUIInventoryWnd::InitInventory() все прозрачно:
CUICellItem* itm = create_cell_item(*it);
m_pUIBagList->SetItem(itm);
--->
UICellItemFactory.cpp:
CUICellItem* create_cell_item(CInventoryItem* itm)
{
CWeaponAmmo* pAmmo = smart_cast<CWeaponAmmo*>(itm);
if(pAmmo)
return xr_new<CUIAmmoCellItem>(pAmmo);
Ячейка будет класса CUIAmmoCellItem, соответственно в ней будет отображаться общее кол-во патронов. А из CUIDragDropListEx::SetItem я это найти не могу. Подскажите.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.