БД содержит равкоды юнитов, хранится в хэше.
Какие есть варианты проверить содержится ли уже такое значение в БД, кроме перебора?

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

avuremybe, как тебе такой вариант?
	function HaveItem takes unit shop, integer itemid returns boolean
		return LoadBoolean(ht, GetUnitUserData(shop), itemid)
	endfunction

	function ShopAddItem takes unit shop, integer itemid returns nothing
		if not HaveItem(shop, itemid) then
			//...
			set lastItem = lastItem + 1
			call SaveInteger(ht, GetUnitUserData(shop), lastItem, itemid)
			call SaveBoolean(ht, GetUnitUserData(shop), itemid, true)
			//...
		endif
	endfunction

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
16
7 лет назад
Отредактирован avuremybe
0
Clamp, это наполнение магазинов/инвентарей. Нужна последовательная нумерация.
Иначе у меня страница магазина будет формироваться туеву хучу времени.
0
30
7 лет назад
0
В таком случае название "БД" неуместно, в рантайме из базы данных значения только выгружаются.
Делай структурами и храни данные в них, это будет и удобнее, и проще.
Кроме того, при заполнении можно создавать каждому магазину/инвентарю свой пул всех доступных предметов и переносить предметы из него, а не копировать.
0
16
7 лет назад
Отредактирован avuremybe
0
Clamp, так у меня и есть свой пул доступных предметов для каждого юнита.
Там же parentKey - GetUnitUserData().
А чем удобнее и проще то?
Даже используя структуры, я все равно упрусь в то, что при покупке/поднятии юнитом предмета у которого есть стаки, мне нужно перелопатить весь его инвентарь, чтобы узнать, надо создавать новую ячейку или добавить в существующую.
То есть единственное преимущество структуры над хэш-таблицей - это разница в скорости обращения к глобалке и к хэшу. И на сколько я знаю, она не велика.
0
23
7 лет назад
0
чем не угодил индификатор зависимости от максимального количеств слота ?? вот пример

globals
	public constant integer MAX_UNIT_STATES = 100
endglobals

struct TypeUnit
        private static hashtable type_units
        
        public static constant integer KEY_STATE_TYPE = 0
        public static constant integer KEY_STATE_VALUE = 1
        
        readonly integer state_count = 0
        
        static method operator [] takes integer id returns thistype
            return LoadInteger(thistype.type_units, 0, id)
        endmethod
        
        static method create takes integer id returns thistype
            local thistype this = thistype.allocate()
            call SaveInteger(thistype.type_units, 0, id, this)
            return this
        endmethod
        
        public method addState takes State s, integer v returns nothing
            call SaveInteger(thistype.type_units, this, KEY_STATE_TYPE * MAX_UNIT_STATES + state_count, s)
            call SaveInteger(thistype.type_units, this, KEY_STATE_VALUE * MAX_UNIT_STATES + state_count, v)
            set state_count = state_count + 1
        endmethod
        
        public method getStateType takes integer i returns State
            return LoadInteger(thistype.type_units, this, KEY_STATE_TYPE * MAX_UNIT_STATES + i)
        endmethod
        
        public method getStateValue takes integer i returns integer
            return LoadInteger(thistype.type_units, this, KEY_STATE_VALUE * MAX_UNIT_STATES + i)
        endmethod
        
        private static method onInit takes nothing returns nothing
            set thistype.type_units = InitHashtable()
            call BJDebugMsg("type_units: " + I2S(GetHandleId(thistype.type_units)))
        endmethod
    endstruct
Вот так легче и удобно подбирать циклом... ясно что это пример но реализовать ясно
Циклом легче подбирать если такого есть хеша счетчик
Подбор цико вот как выглядит...
// i = 0
// tu = TypeUnit[unit id]
// item = null
loop
            exitwhen i == tu.state_count 
    
            set item = tu.getStateType(i)
                
			тут уже знаем предмет или что хотите шаманите
            
             set i = i + 1
        endloop
0
30
7 лет назад
0
А чем удобнее и проще то?
Не попробуешь - не узнаешь =)
2
7
7 лет назад
Отредактирован Ige
2
avuremybe, как тебе такой вариант?
	function HaveItem takes unit shop, integer itemid returns boolean
		return LoadBoolean(ht, GetUnitUserData(shop), itemid)
	endfunction

	function ShopAddItem takes unit shop, integer itemid returns nothing
		if not HaveItem(shop, itemid) then
			//...
			set lastItem = lastItem + 1
			call SaveInteger(ht, GetUnitUserData(shop), lastItem, itemid)
			call SaveBoolean(ht, GetUnitUserData(shop), itemid, true)
			//...
		endif
	endfunction
Принятый ответ
0
16
7 лет назад
0
pro100master, а у меня в примерах не то же самое?
Ige, а у меня в примерах не то же самое?
2
7
7 лет назад
2
avuremybe, в смысле "то же самое"?
У тебя в примере в таблицу сохраняется только код предмета
	call SaveInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(1)), 'U000')
    call SaveInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(2)), 'U001')
    call SaveInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(3)), 'U002')
я же (да и не только я) предлагаю тебе дополнительно сохранить пометку, что данный предмет добавлен в магазин
	call SaveInteger(ht, GetUnitUserData(shop), lastItem, itemid) 	// сохраняем код предмета
	call SaveBoolean(ht, GetUnitUserData(shop), itemid, true)		// пометка, что предмет добавлен в этот магазин
а затем с помощью всего 1 функции проверять, есть ли такой-то предмет в таком-то магазине
	function HaveItem takes unit shop, integer itemid returns boolean
		return LoadBoolean(ht, GetUnitUserData(shop), itemid)
	endfunction
0
16
7 лет назад
Отредактирован avuremybe
0
Ige, сорян, не проснулся еще.
Проморгал, что ты в качестве childKey использовал ID предмета.
Действительно, я могу на этой основе построить решение моей проблемы.
Спасибо!
0
21
7 лет назад
0
Ige, а если так:
	function HaveItem takes unit shop, integer itemid returns boolean
		return HaveSavedInteger(ht, GetUnitUserData(shop), itemid)
	endfunction

	function ShopAddItem takes unit shop, integer itemid returns nothing
		if not HaveItem(shop, itemid) then
			//...
			call SaveInteger(ht, GetUnitUserData(shop), itemid, itemid)
			//...
		endif
	endfunction
0
30
7 лет назад
0
ScopteRectuS, более тяжёлые проверки, в остальном без разницы.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.