Реалезуем ли дроп определённых предметов с каждого типа юнита.Допустим с паука падает либо лапа паука,либо мясо паука.А с скелета кости либо оружие.С учетом того что карта RPG жанра (Помимо этой механики есть еще куча всего),и в карте присутствует +-20 типов юнитов.Если возможно,то как это скажется на оптимизации?

anton1623, qне забудь про это. Там равкоды с калькулятором проверяй, для точности
казалось бы все правильно, равкод числа на одну единицу меньше. Но как оказалось, где-то допустил ошибку. Берем любой онлайн-калькулятор ASCII , и переводим 10-чную систему, проверяя насколько отличается.
I008=1227894840
I009=1227894841
I00A=1227894849 Тут отличается на целых 8 знаков, короче сбивается база данных
Давайте

жаль отреддактировать выше
//добавляем итемы в список it[0]
call ItemPoolAddItemType(it[0], 'I000',0) //нога Берги
call ItemPoolAddItemType(it[0], 'I001',0) //карта пеонов
call ItemPoolAddItemType(it[0], 'I002',0) //бкговые кроссовки Берги
//добавляем итемы в список it[1]
call ItemPoolAddItemType(it[1], 'I003',0) //маска Тыщи
call ItemPoolAddItemType(it[1], 'I004',0) //пистолет начальника
call ItemPoolAddItemType(it[1], 'I005',0) //мясо тюленя
call ItemPoolAddItemType(it[1], 'I006',0) //водка
`
ОЖИДАНИЕ РЕКЛАМЫ...
27
Да это легче свою систему дропа написать =) она проще пишется. Нужно бд итемов прописать, на каждый тип пишешь свою пачку итемов. И при смерти юнита дропаешь рандомный. В игре есть своя система рандома, но никогда ей не пользовался. Посмотри.
Ну насчет оптимизации. Не сказал бы, что это сильно нвгрузит, чтобы так оптимизировать. Вряд ли. Вы же не циклы гоняете, как в древнем 1.26 патче. И там тоже вряд ли возможна лаги, с чего бы. Но вот луа самый шедевр в плане удобства
27
Ну, и в 1.26 можно использовать бд. Помню, там минус в том, что в табличку можно прописать индекс макс 8192. А вот равкоды юнитов нельзя использовать, тк числа превышают 8192.
Как обойти: 1) используй в качестве бд равкоды, пример U000 и U001 ртличаются на единицу. Так можно получить номер массива. Пример, умер юнит с типом U007, так могу узнать, номер индекса юнита U007-U000=7 Ну а двльше думайте, как строить вашу структуру. Типа для чего вам нужен был индекс 2) ну а дальше используй отдельную хэш таблицу, для заполнения [I000+7] [max] = 7 [I000+7] [1] = rawcode 1 [I000+7] [2] = rawcode 2 [I000+7] [3] = rawcode 3 [I000+7] [4] = rawcode 4 [I000+7] [5] = rawcode 5 [I000+7] [6] = rawcode 6 [I000+7] [7] = rawcode 7 max это типа кэширование строки в число GetStringHash или GetHashString Можно вместо I000+7 сразу использовать равкод юнита U007. Ранее I000+7 был просто ключ и примером работы бд с равкодами, правда бесполезный
Ну далее рандомим число от 1 до max и вауу

anton1623, мемхак переходи на сторону зла
8
Итемпулы - вот ваше решение. Они именно для этого и придуманы.
native CreateItemPool           takes nothing returns itempool
native DestroyItemPool          takes itempool whichItemPool returns nothing
native ItemPoolAddItemType      takes itempool whichItemPool, integer itemId, real weight returns nothing
native ItemPoolRemoveItemType   takes itempool whichItemPool, integer itemId returns nothing
native PlaceRandomItem          takes itempool whichItemPool, real x, real y returns item
30
Но вот луа самый шедевр в плане удобства
На хт можно то же самое реализовать.

Итемпулы - вот ваше решение.
Итемпул всегда отдаёт предмет и не слишком тонко настраивается. Хотя для примитивного дропа подойдёт.
10
Реализуем.
Для твоего уровня хорошим вариантом будут параллельные массивы.
Об оптимизации опять же на твоем уровне вообще думать не стоит
30
Для твоего уровня хорошим вариантом будут параллельные массивы.
Не будут, ибо двумерные он не потянет.
8
nazarpunk, факт

Так почему по системе со скринов выше делать не стоит?
27
anton1623, ну у тебя список не привязан к типу. Как триггер это определяет?
30
Как триггер это определяет?
На каждый тип создаётся триггер Лут_Копировать_Копировать_Копировать_Копировать_Копировать.
27
База данных равкодов юнитов. Или можно другим способом добывать номер итемпула. Ну тут число завязано на тип, то проще сделать свою базу в ро. Или повторно инициируйте бд в таблицах или где то еще
//Можно бд равкодов юнита. Тут можно узнвть номер итемпула.
U000-U000=0
U001-U000=1
U002-U000=2
Создаем списки (итемпул)
//Ну пример, бд итемпула:
It[0] = CreateItemPool() //создаем список для U000
It[1] = CreateItemPool() //создаем список для U001

//добавляем итемы в список it[0]
call ItemPoolAddItemType(it[0], 'I000',0)
call ItemPoolAddItemType(it[0], 'I001',0)
call ItemPoolAddItemType(it[0], 'I002',0)
//добавляем итемы в список it[1]
call ItemPoolAddItemType(it[1], 'I003',0)
call ItemPoolAddItemType(it[1], 'I004',0)
call ItemPoolAddItemType(it[1], 'I005',0)
Узнаем номер списка. Если нужно рандомить случайный предмет из списка it[0]. Где x,y - координаты умирающего юнита
function CreateRandomItemForUnit takes integer num, unit u return nothing
call PlaceRandomItem(it[num], GetUnitX(u),GetUnitY(u))
endfunction

А если нужно удалить из списка итем
ItemPoolRemoveItemType(it[0],'I001')
8
МрачныйВорон, Воу,кажется маленько дошло.Кажется это мой вариант,спасибо!

anton1623, ну у тебя список не привязан к типу. Как триггер это определяет?
Ну я бы добавил условие триггеру какой именно юнит погиб
27
anton1623, qне забудь про это. Там равкоды с калькулятором проверяй, для точности
казалось бы все правильно, равкод числа на одну единицу меньше. Но как оказалось, где-то допустил ошибку. Берем любой онлайн-калькулятор ASCII , и переводим 10-чную систему, проверяя насколько отличается.
I008=1227894840
I009=1227894841
I00A=1227894849 Тут отличается на целых 8 знаков, короче сбивается база данных
Давайте

жаль отреддактировать выше
//добавляем итемы в список it[0]
call ItemPoolAddItemType(it[0], 'I000',0) //нога Берги
call ItemPoolAddItemType(it[0], 'I001',0) //карта пеонов
call ItemPoolAddItemType(it[0], 'I002',0) //бкговые кроссовки Берги
//добавляем итемы в список it[1]
call ItemPoolAddItemType(it[1], 'I003',0) //маска Тыщи
call ItemPoolAddItemType(it[1], 'I004',0) //пистолет начальника
call ItemPoolAddItemType(it[1], 'I005',0) //мясо тюленя
call ItemPoolAddItemType(it[1], 'I006',0) //водка
Принятый ответ
27
anton1623, там точки, двоеточие и пр приняты после цифр в таблице, а потом буквы. Символы нумеруются в таблице Asscil. Возми любой конвертер и посмотри. Например сейчас из ныне работающих это моб приложения. При создании объекта ты можешь прописать 'I00;' - точка с запятой
8
МрачныйВорон, спасибо еще раз,постараюсь разобраться во всем этом.
8
Бог дал человеку хэштаблицы, чтобы таким не заниматься хитрой массивной арифметикой.
Создаем итемпул для каждого типа юнита, сохраняем его в хэштаблицу:
	//....
	//hpea
	set pool = CreateItemPool()
	call ItemPoolAddItemType(pool,'I000',1)
	//.....	
	call SaveItemPoolHandle(ht,'hpea',0,pool)
	//Hblm
	set pool = CreateItemPool()
	call ItemPoolAddItemType(pool,'I001',1)
	call ItemPoolAddItemType(pool,'I002',1)
	//.....	
	call SaveItemPoolHandle(ht,'Hblm',0,pool)
	//.....
В случае смерти юнита загружаем итемпул, создаем айтем:
	set pool = LoadItemPoolHandle(ht,GetUnitTypeId(GetDyingUnit()),0)
	call PlaceRandomItem(pool,GetWidgetX(GetDyingUnit()),GetWidgetY(GetDyingUnit()))
27
Хэш очень неудобный. Много букв. А многомерные массивы кратче и красивее.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.