Сейчас 14:59:59 Суббота, 23 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Хеш-Таблица
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, это я уже исправил

 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz