Есть бовые когти, нужно сделать крафт из 2х таких предметов, боевые когти + боевые когти = n
я сделал 2 условия одинаковых но получаеться так, что при получениее 1х боевых когтей у игрока появляеться придмет n. Как сделать так что, при наличии только 2х когтей и рецепта герой получал предмет ?

В чем проблема написать функцию подсчета итемов по их Id (циклом делается), а уже там делать условие. Не знаю уровень автора, поэтому напишу псевдокодом
Если КоличествоПредметов(u,'I000') >= 2 Тогда
	УдалитьИтем(u,'I000')
	УдалитьИтем(u,'I000')
	ДатьИтемЮниту(u,'I001')
КонецЕсли
u - юнит, с которым работаешь
`
ОЖИДАНИЕ РЕКЛАМЫ...
11
Можно ввести переменную, отвечающую за количество таких предметов у юнита.
Создаёшь сначала(не в триггерах) новую пременную, тип - Хэш-Таблица, название - hash(к примеру) - она понадобится для муи триггера.(Я пока только так придумал)
события: юнит получает предмет
инициализировать хэш-таблицу: set udg_hash = InitHashtable()
условие: полученныи предмет = боевые когти.
деиствия:
local unit u = GetTriggerUnit()
local integer h = GetHandleId(u)
local integer KollichestvoKogtei =LoadInteger(udg_hash,h,StringHash("Kogti")) // Изначально здесь будет 0
call SaveInteger(udg_hash,h,StringHash(Kogti),KollichestvoKogtei+1) // Когда юнит подобрал когти, у него стала переменная равна 1. Когда подобрал вторые - стало 2
if KollichestvoKogtei == 2 then //Если двое когтеи имется, то:
	Удалить когти и рецепт(если надо) - UnitRemoveItem()
	Дать юниту новыи предмет - UnitAddItemByIdSwapped()
	call SaveInteger(udg_hash,h,StringHash("Kogti"), 0)
endif
У тебя получается так:
Если: У юнита есть боевые когти И У юнита есть боевые когти, то дать предмет.
Надо обязательно именно на количество условие ввести, а не на наличие.
24
DopaMine, хештаблица для решения этой задачи это лишнее, достаточно перебрать слоты и посмотреть что в них лежит.
11
if KollichestvoKogtei == 2 then Если двое когтеи имется, то:
Здесь кстати ошибка у меня, так как я после сохранения нового значения сравниваю со старым, которое загружено(
Надо так:
If LoadInteger(udg_hash,h,StringHash("Kogti")) == 2 then
prog:
DopaMine, хештаблица для решения этой задачи это лишнее, достаточно перебрать слоты и посмотреть что в них лежит.
Да, ты прав. А если у юнита 24 слота? Сработает?(Если добавить к примеру ещё 3 способности "Предметы" герою)
33
DopaMine, что ещё за нововведения в 24 слота, я что-то пропустил?
22
простой это! Узнаем тип предмета который герой поднял с пола.
Проверяем есть ли данный тип для сборки одинаковых предметов! Чтобы не нагружать циклом. (Для быстроты вы не заметите разницу)
После чего у данной героя имеет локальный хендл предмета равен 0
и проходим цикл игнорируя который подобрал то есть игнорировать хендл номера. Если тип данного предмета встретил прекрашаем работу цикла и ставляет истинна true и сохраняе локально данного предмета хендла. То есть на выходе у вас появится 2 разные хендла для удаление.
после чего если переменная не равна 0 то удаляем 2 предмета и очичаеш переменные а тип берет с базы и создает нужный предмет.
События:
Герой поднял предмет
Условие
Тип-Предмет есть в базе для сборки
Действие
Глобально создаем переменную handleID = 0 или локально как удобно
Сохраняем тип предмет в локально или глобально как хотите typeID
Делаем цикл от 0 до 5
если встретил такого типа предмета и не являет тот подобраный предмет
typeID == GetItemTypeID(item) and handleID != GetHandleID(item)
если условие соблюдено сохраняем переменную хендла и завершаем работу цикла
Проверяем handleID != 0 то выполняем удаление двух предметов, создание 1 предмета и вручаем героя
если глобально то handleID = 0 (Так если не локально)
ну и всякое
11
что ещё за нововведения в 24 слота, я что-то пропустил?
Если герою или юниту дать несколько способностеи "Предметы", у него фактически будет количество слотов = 6*Количество способности "Предметы". Отображаться всё равно будет 6 слотов, но когда герои будет подбирать предметы, они в итоге начнут падать в "невидимые" дополнительные слоты. И эти предметы соответственно нельзя будет выложить.
33
DopaMine, а это интересно.. а триггерно их можно будет дропнуть? если это действительно так, то это вполне интересная находка, таки образом можно решить струю проблему "подбор при полном инвентаре", когда надо подобрать 7 предмет и мы получали сообщение противной.. Это решалось через руны или проверка радиуса при клике предмета.. Не ужели я только 1 не знал об этом способе?
Возможно ли триггерно понять, что предмет попал во второй инвентарь? а после выложить его..
24
Я вот помню древний баг, когда при определенных манипуляциях "лишние" предметы проваливались в никуда при подборе, но "никуда" там получалось бесконечное, а не в виде фантомного инвентаря на сколько-то слотов...
26
Всё придумано до нас - юзается цикл для перебора слотов.
Можно высечь булку из функции обнаружения предмета в инвентвре юнита, и подселить тудой интейджер. Тем самым сразу получая число и сравнивать его с необходимым количеством.
33
В любом случае, это уже простимулировало меня запустить редактор, дабы сделать какую-нить наработку, позволящую подбирать при полном инвентаре... Как по мне это проще, чем помещение в рюкзак, а если карта не подразумевает рюкзак?
Нужны функции:
Определение перегруза, есть ли 7 предмет
Подсчет количества предметов при перегрузе
Функция дропа из фантомного рюкзака
Система будет хороша, для карт, где используются рецепты или предметы стакаются в заряда
Не нужно делать рунный дубликат
Не нужно париться в совобождении при выкладывании
Можно сделать рюкзак, для статных пассивных предметов , свойства из которого будут без триггеров влиять на самого героя
27
prog:
Я вот помню древний баг, когда при определенных манипуляциях "лишние" предметы проваливались в никуда при подборе, но "никуда" там получалось бесконечное, а не в виде фантомного инвентаря на сколько-то слотов...
только я вот тоже помню такое делал. на бесконечный инвентарь это была идея. только не помню какое это действие, наверн на приказ поместить в другой слот

вроде если дать приказ итем переместить в 1-ый слот инвентаря. То итем в 1-ом слоте инвентаря пропадал (его короче запоминаем), а другой займет это место. короче можно было листать страницы инвентаря. А все ячейки запоминал в переменные, где каждый номер массива - номер страницы. Вроде как то так работало
16
В игре часть функций проверяет внешний (отображемый) инвентарь, а часть - последний добавленный. Поэтому добавление двух и более инветарей создаёт undefined behaviour, который может меняться от версии к версии. На мемхаке такое делать я ещё пойму, там стабильно 26,а вот для свежих проектов это такое себе
28
А если одному инвентарю сделать несколько уровней, с 0..7 предметов, на последнем уровне будет 7 слотов или всё же 6?
11
Проверять хэндлы айтемов? Они же разные будут
33
respect_gg, нет, там вешается на хендл юнита количество предметов определённого типа в ячейку StringHash("Kogti"), которая равна числу, но этот способ не рекомендуется использовать
11
Bergi_Bear, а че нет? Я всегда так делал, проверял по Хэндлу Айтема и все работало
7
В чем проблема написать функцию подсчета итемов по их Id (циклом делается), а уже там делать условие. Не знаю уровень автора, поэтому напишу псевдокодом
Если КоличествоПредметов(u,'I000') >= 2 Тогда
	УдалитьИтем(u,'I000')
	УдалитьИтем(u,'I000')
	ДатьИтемЮниту(u,'I001')
КонецЕсли
u - юнит, с которым работаешь
Принятый ответ
4
| Добавляешь функцию в шапку
| Принимает : юнита, id предмета который надо посчитать, требуемое кол-во этого предмета, id сборного предмета
function CheckItemCount takes unit u,integer id,integer count,integer add returns nothing
local integer i = 0
local integer s = 0
local item it
loop
exitwhen (i > 5 or s >= count)
if (GetItemTypeId(UnitItemInSlot(u,i)) == id) then
set s = s + 1
endif
set i = i + 1
endloop
if (s >= count) then
set i = 0
loop
set it = UnitItemInSlot(u,i)
if (GetItemTypeId(it) == id) then
call RemoveItem(it)
set s = s - 1
exitwhen (s <= 0)
endif
set i = i + 1
endloop
call UnitAddItem(u,CreateItem(add,GetUnitX(u),GetUnitY(u)))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",u,"origin"))
endif
set it = null
endfunction
ну и так проверяешь
Загруженные файлы
22
создаем абилку с 1 слот и вручаем герою. А потом уже 2 порядок предметы итог 7 слотов но не нашел как чтобы при фулл 6 слот не ругал. Учитивая если с пола может брать 7 итем и дропать всех. Но когда вручную 6 слот без начального слота то 1 слот останет и ругает что не хватает место! Баг древный но не нашли как обходить вроде уже было (нашли где то)
27
это тема живет очень долго, автору похоже по барабану. ему все пишут и пишут....

мне вот интересно, в инвентаре действительно ли больше 6 слотов будет, как сказал DopaMine ? то есть можно больше 6 проверять слоты/? проверка то может обнаружить лежит ли там в 7 слоте например? то есть можна пробегать циклом по 7-12 слотам еще?
22
Steal nerves, ни как!
Я братл основу сумка человек и подсунул в героя что у него итог 2 абилка 1 слотовый и 6 слотовый и главное порядок 1 слот а потом 6 слот чтобы в игре отобразил 6 слота. И можете брать 7 вешей. Но есть какой то система проверка 6 слотовый даже не берет!
27
Пример не для мультиплеера + не учтен момент, когда невозможно собрать предмет, если инвентарь перегружен.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.