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

Принятый ответ

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

вроде если дать приказ итем переместить в 1-ый слот инвентаря. То итем в 1-ом слоте инвентаря пропадал (его короче запоминаем), а другой займет это место. короче можно было листать страницы инвентаря. А все ячейки запоминал в переменные, где каждый номер массива - номер страницы. Вроде как то так работало
2
16
5 лет назад
Отредактирован DracoL1ch
2
В игре часть функций проверяет внешний (отображемый) инвентарь, а часть - последний добавленный. Поэтому добавление двух и более инветарей создаёт undefined behaviour, который может меняться от версии к версии. На мемхаке такое делать я ещё пойму, там стабильно 26,а вот для свежих проектов это такое себе
1
28
5 лет назад
1
А если одному инвентарю сделать несколько уровней, с 0..7 предметов, на последнем уровне будет 7 слотов или всё же 6?
0
11
5 лет назад
0
Проверять хэндлы айтемов? Они же разные будут
0
32
5 лет назад
0
respect_gg, нет, там вешается на хендл юнита количество предметов определённого типа в ячейку StringHash("Kogti"), которая равна числу, но этот способ не рекомендуется использовать
0
11
5 лет назад
0
Bergi_Bear, а че нет? Я всегда так делал, проверял по Хэндлу Айтема и все работало
0
7
5 лет назад
Отредактирован PornoMishka
0
В чем проблема написать функцию подсчета итемов по их Id (циклом делается), а уже там делать условие. Не знаю уровень автора, поэтому напишу псевдокодом
Если КоличествоПредметов(u,'I000') >= 2 Тогда
	УдалитьИтем(u,'I000')
	УдалитьИтем(u,'I000')
	ДатьИтемЮниту(u,'I001')
КонецЕсли
u - юнит, с которым работаешь
Принятый ответ
0
4
5 лет назад
0
| Добавляешь функцию в шапку
| Принимает : юнита, 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
ну и так проверяешь
Загруженные файлы
1
26
5 лет назад
1
Загруженные файлы
0
23
5 лет назад
0
создаем абилку с 1 слот и вручаем герою. А потом уже 2 порядок предметы итог 7 слотов но не нашел как чтобы при фулл 6 слот не ругал. Учитивая если с пола может брать 7 итем и дропать всех. Но когда вручную 6 слот без начального слота то 1 слот останет и ругает что не хватает место! Баг древный но не нашли как обходить вроде уже было (нашли где то)
0
27
5 лет назад
Отредактирован MpW
0
это тема живет очень долго, автору похоже по барабану. ему все пишут и пишут....

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