|
|
|
|
Хеш-Таблица
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 17:19:18 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Почитал я тут статейку про хеш- таблицу. Вроде понял а вроде нет хз кароче)) Вот сделал простой пример но он не правильно работает. Все время пишет 0. Code function Trig_dead_Actions takes nothing returns nothing local unit c=GetDyingUnit() local unit u=GetDyingUnit() local integer uh=GetHandleId(u) local integer uc=GetHandleId(c) local integer tu=LoadInteger(udg_hash, GetHandleId(u), 0) local integer tc=LoadInteger(udg_hash, GetHandleId(c), 1) local integer i=0 if GetUnitTypeId(GetDyingUnit()) == 'hkni' then call SaveReal(udg_hash, GetHandleId(u), 0, 1.00) loop call DisplayTimedTextToPlayer(Player(i),0,0,30,(I2S(tu))) set i= i + 1 exitwhen i == bj_MAX_PLAYERS endloop set u=null endif if GetUnitTypeId(GetDyingUnit()) == 'hfoo' then call SaveReal(udg_hash, GetHandleId(c), 1, 5.00) loop call DisplayTimedTextToPlayer(Player(i),0,0,30,(I2S(tc))) set i = i + 1 exitwhen i == bj_MAX_PLAYERS endloop set c=null endif endfunction //=========================================================================== function InitTrig_dead takes nothing returns nothing local integer i = 0 set gg_trg_dead = CreateTrigger( ) loop call TriggerRegisterPlayerUnitEvent(gg_trg_dead, Player(i), EVENT_PLAYER_UNIT_DEATH, null) set i = i + 1 exitwhen i == bj_MAX_PLAYER_SLOTS endloop call TriggerAddAction( gg_trg_dead, function Trig_dead_Actions ) endfunction
Сообщение отредактировал Dreii - Воскресенье, 26 Декабря 2010, 17:21:49 |
|
|
|
Banzay89 | Дата: Воскресенье, 26 Декабря 2010, 17:26:38 | Сообщение # 2 |
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
| Dreii, чтоб понять принцып работы хэш-таблиц нужно начинать делать чтото попроще
|
|
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 17:28:26 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Banzay89, например?)
|
|
|
|
Banzay89 | Дата: Воскресенье, 26 Декабря 2010, 17:42:09 | Сообщение # 4 |
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
| Зачем куча цыклов и прочего бреда? Простенький спелл с хэшем чтоб убедиться что ты понял
|
|
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 17:44:29 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Banzay89, Попробую, но скажи что тут не верно?
|
|
|
|
Banzay89 | Дата: Воскресенье, 26 Декабря 2010, 17:53:12 | Сообщение # 6 |
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
| Dreii, черт его знает, я не люблю копаться в чужом коде) Вот ток что сделал скилл для своей карты, как раз на хэш-таблице Code function Shattering_Jump_Actions takes nothing returns nothing local timer t=GetExpiredTimer() local integer id=GetHandleId(t) local unit u=LoadUnitHandle(udg_H, id, 0) local real x=LoadReal(udg_H, id, 1) local real y=LoadReal(udg_H, id, 2) local effect e=LoadEffectHandle(udg_H, id, 3) local integer lvl=LoadInteger(udg_H, id, 4) local unit d call SetUnitX(u,x) call SetUnitY(u,y) set d=CreateUnit(GetOwningPlayer(u),'h004',x,y,0) call UnitApplyTimedLife(d, 'BTLF', 1) call UnitAddAbility(d,'A00W') call SetUnitAbilityLevel(d,'A00W',lvl) call IssueImmediateOrder(d, "thunderclap") call DestroyEffect(AddSpecialEffect( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl",x,y)) call PauseTimer(t) call FlushChildHashtable(udg_H, id) call DestroyTimer(t) call DestroyEffect(e) set t=null set u=null set e=null set d=null endfunction
function Trig_Shattering_Jump_Actions takes nothing returns nothing local unit u=GetSpellAbilityUnit() local real x=GetSpellTargetX() local real y=GetSpellTargetY() local timer t=CreateTimer() local integer lvl=GetUnitAbilityLevel(u,'A00V') local effect e=AddSpecialEffectTarget("Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl", u, "weapon") call SaveUnitHandle(udg_H, GetHandleId(t), 0, u) call SaveReal(udg_H, GetHandleId(t), 1, x) call SaveReal(udg_H, GetHandleId(t), 2, y) call SaveEffectHandle(udg_H, GetHandleId(t), 3, e) call SaveInteger(udg_H, GetHandleId(t), 4, lvl) call TimerStart(t, 0.70, false, function Shattering_Jump_Actions) set t=null set u=null set e=null endfunction
|
|
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 17:57:43 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Banzay89, ууу, я долго буду разбираться Добавлено (26-12-2010, 17:57) --------------------------------------------- Banzay89, про эффекты не суда напсиал))))
Сообщение отредактировал Dreii - Воскресенье, 26 Декабря 2010, 17:57:30 |
|
|
|
FkoFF | Дата: Воскресенье, 26 Декабря 2010, 18:09:04 | Сообщение # 8 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| объясни суть системы. Кстати как минимум ошибка в том что local unit u = GetDyingUnit() когда должно быть local unit u = GetKillingUnit() Переменные через GetHandleId тебе зачем? function Trig_dead_Actions takes nothing returns nothing local unit c=GetDyingUnit() local unit u=GetDyingUnit() local integer uh=GetHandleId(u) // зачем это? Если ниже в работе с хэш ты всеравно используешь GetHandleId() local integer uc=GetHandleId© // Это так же local integer tu=LoadInteger(udg_hash, GetHandleId(u), 0) // Учитывая что u и c разные юниты - зачем разные переменные? local integer tc=LoadInteger(udg_hash, GetHandleId©, 1) local integer i=0 if GetUnitTypeId(GetDyingUnit()) == 'hkni' then call SaveReal(udg_hash, GetHandleId(u), 0, 1.00) // ты сохраняешь реальное значение 1.0, когда пытаешься выгрузить целое число. loop call DisplayTimedTextToPlayer(Player(i),0,0,30,(I2S(tu))) set i= i + 1 exitwhen i == bj_MAX_PLAYERS endloop set u=null endif if GetUnitTypeId(GetDyingUnit()) == 'hfoo' then call SaveReal(udg_hash, GetHandleId©, 1, 5.00) // в хэш лезем а базы данных еще не придумали? в джасс к тому же есть действие elseif. Зачем вообще локалки когда ты используешь везде функцию ? loop call DisplayTimedTextToPlayer(Player(i),0,0,30,(I2S(tc))) set i = i + 1 exitwhen i == bj_MAX_PLAYERS endloop set c=null //не могу понять зачем удалять переменные только в случае совпадения? вынеси эти обнуления в конец функции. endif endfunction //=========================================================================== function InitTrig_dead takes nothing returns nothing //зачем раскрывать BJ?!?! То же самое только места больше занимает. local integer i = 0 set gg_trg_dead = CreateTrigger( ) loop call TriggerRegisterPlayerUnitEvent(gg_trg_dead, Player(i), EVENT_PLAYER_UNIT_DEATH, null) set i = i + 1 exitwhen i == bj_MAX_PLAYER_SLOTS endloop call TriggerAddAction( gg_trg_dead, function Trig_dead_Actions ) endfunction Добавлено (26-12-2010, 18:09) --------------------------------------------- вот тебе полный аналог вот этой фигни сделанный более аккуратно. local unit u = GetTriggerUnit() local unit v = GetKillingUnit() local integer i = 0 local integer i2 = LoadInteger(udg_hash, GetHandleId(v), 1) if GetUnitTypeId(u) == 'hkfo' then call SaveInteger(udg_Hash,GetHandleId(v), i2+1) call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS, 10, I2S(i2+1)) elseif GetUnitTypeId(u) == 'hkni' then call SaveInteger(udg_Hash,GetHandleId(v), i2+5) call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS, 10, I2S(i2+5)) endif set u = null set v = null
|
|
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 18:20:21 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| FkoFF, я еще нубка в джассе. Пытаюсь ченить сделать))))
|
|
|
|
FkoFF | Дата: Воскресенье, 26 Декабря 2010, 18:44:19 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Dreii, Запомни - принципиальность в разворачивании актуальных БЖ функций - бред сивой кобылы. БЖ разворачивать надо те которые А) - вызывают всего одну функцию Б) - Не оптимизированны и вызывают лаги. Остальные бж функции можно развернуть но это уже гикство.
|
|
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 18:45:33 | Сообщение # 11 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Quote (FkoFF) Не оптимизированны и вызывают лаги Это какие?
|
|
|
|
SirNikolas | Дата: Воскресенье, 26 Декабря 2010, 18:48:17 | Сообщение # 12 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| DistanceBetweenPoints, например, или AngleBetweenPoints.
|
|
|
|
FkoFF | Дата: Воскресенье, 26 Декабря 2010, 19:00:41 | Сообщение # 13 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (SirNikolas) DistanceBetweenPoints, например, или AngleBetweenPoints. Все которые работают с точками, все которые сами вызывают БЖ. Проще написать свои такие же только без бж )
|
|
|
|
Dreii | Дата: Воскресенье, 26 Декабря 2010, 19:09:05 | Сообщение # 14 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Quote (FkoFF) Все которые работают с точками, все которые сами вызывают БЖ. Проще написать свои такие же только без бж ) Хм понятно
|
|
|
|
Kartoha | Дата: Воскресенье, 26 Декабря 2010, 23:36:08 | Сообщение # 15 |
10 уровень
Группа: Ветераны
Сообщений: 2851
Награды: 1
Блокировки:
| Quote (Dreii) local unit c=GetDyingUnit() local unit u=GetDyingUnit() Quote (Dreii) я еще нубка в джассе Причем тут нубота в джасе, тут элементарная логика отсутствует. Переведу для ясности: local unit c = умирающий юнит local unit u = умирающий юнит Неужели не понятно что юнит c и юнит u - один и тот же юнит?!
|
|
|
|
Dreii | Дата: Понедельник, 27 Декабря 2010, 00:01:46 | Сообщение # 16 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Kartoha, это я уже исправил
|
|
|
|
|
|
|
|
|
|
|