XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
LeXuS111555

offline
Опыт: 357
Активность:
Не двигается дамми
Код:
library dummy initializer init
{

globals
    hashtable table
endglobals

nothing timer_start()
{
    timer t = GetExpiredTimer()
    integer i = GetHandleId(t)
    dummy Dummy
    Dummy = dummy.create()
    Dummy.i = LoadInteger(table, i, 0)
    if(Dummy.i == 0)
    {
    }elseif(Dummy.i == 1)
    {
        Dummy.u = LoadUnitHandle(table, i, 1)
        Dummy.target = LoadUnitHandle(table, i, 2)
        Dummy.e = LoadEffectHandle(table, i, 3)
        Dummy.get_point()
        Dummy.set_point(Dummy.x_target, Dummy.y_target, 215.0)
    }
    
    Dummy.dummy_remove()
    Dummy.destroy()
    
    t = null
}

struct dummy
    integer i
    unit target
    unit u
    effect e
    string s
    string e_s
    string e_s1
    
    real x_u
    real y_u
    real z_u
    
    real x_target
    real y_target
    real z_target
    
    method dummy_effect takes string s, string s1 returns nothing
        .e_s = s
        .e_s1 = s1
        
        .e = AddSpecialEffectTarget(.e_s, .u, .e_s1)
    endmethod
    
    method get_point takes nothing returns nothing
        x_u = GetUnitX(.u)
        y_u = GetUnitY(.u)
        z_u = GetUnitFlyHeight(.u)
        
        x_target = GetUnitX(.target)
        y_target = GetUnitY(.target)
        z_target = GetUnitFlyHeight(.target)
    endmethod
    
    method set_point takes real x, real y, real z returns nothing
        SetUnitX(.u, x)
        SetUnitY(.u, y)
        SetUnitFlyHeight(.u, z, 0.0)
    endmethod
    
    method dummy_create takes integer i, integer id, real x, real y, real z returns nothing
    .i = i
    .u = CreateUnit(Player(id), 'h00E', x, y, 0.0)
    
    if UnitAddAbility(.u, 'Amrf') then
       UnitRemoveAbility(.u, 'Amrf')
    endif
    
    .set_point(x, y, z)
    .e = AddSpecialEffectTarget(.e_s, .u, .e_s1)
    
    if(.i == 0)
    {
    }
    if(.i == 1)
    {
    }
    endmethod
    
    method dummy_remove takes nothing returns nothing
        .u = null
        .target = null
        .e = null
        .s = ""
        e_s = ""
        e_s1 = ""
    endmethod
    
    method start takes nothing returns nothing
        timer t = CreateTimer()
        integer i = GetHandleId(t)
        
        if(.i == 0)
        {
        }
        if(.i == 1)
        {
            SaveInteger(table, i, 0, .i)
            SaveUnitHandle(table, i, 1, .u)
            SaveUnitHandle(table, i, 2, .target)
            SaveEffectHandle(table, i, 3, .e)
        }
        TimerStart(t, 0.01, true, function timer_start)
        
        t = null
    endmethod
endstruct

nothing init(nothing)
{
    table = InitHashtable()

    call PanCameraToTimedLocForPlayer(Player(0), GetRectCenter(GetPlayableMapRect()), 0.0)
    dummy Dummy
    Dummy = dummy.create()
    Dummy.dummy_create(1 , 0, 0.0, 0.0, 215.0)
    Dummy.dummy_effect("Abilities\\Spells\\Human\\FlameStrike\\FlameStrikeDamageTarget.mdl", "overhead")
    Dummy.target = CreateUnit(Player(0), 'hfoo', 0.0, 0.0, 0.0)
    Dummy.start()
    Dummy.dummy_remove()
    Dummy.destroy()
}

}
Старый 11.09.2012, 11:59
DioD

offline
Опыт: 45,134
Активность:
дурацкий вопрос, а дамми вообще может двигаться?
Старый 11.09.2012, 12:11
LeXuS111555

offline
Опыт: 357
Активность:
Я имел ввиду, что при событии запущенного таймера, дамми не перемещается к цели.
Старый 11.09.2012, 12:12
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
LeXuS111555, сделай скорость перемещения дамми больше 0, или двигает его через SetUnitPosotion а не SetUnitX()\Y
Старый 11.09.2012, 12:19
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Не вижу отладочных сообщений
Старый 11.09.2012, 12:22
LeXuS111555

offline
Опыт: 357
Активность:
Всё это нормально, почему-то в хеш таблицу не передаются данные, и они не считываются, поэтому дамми не записывается в структуру. Получается некого двигать.(что я успел выяснить)
Старый 11.09.2012, 12:24
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
LeXuS111555, хештаблица то инициализирована? и правильно ли инициализировал, то тут есть умные люди....
Старый 11.09.2012, 12:30
LeXuS111555

offline
Опыт: 357
Активность:
Код:
library dummy initializer init
{

globals
    hashtable table
endglobals

nothing timer_start()
{
    BJDebugMsg("Таймер обрабатывается")
    integer i = GetHandleId(GetExpiredTimer())
    dummy Dummy
    Dummy = dummy.create()
    Dummy.dummy_type = LoadInteger(table, i, 0)
    if(Dummy.dummy_type == 0)
    {
    }
    if(Dummy.dummy_type == 1)
    {
        BJDebugMsg("Здесь не проходит, хотя я назначил таймеру в хеш таблице значение 1 в методe start")
        Dummy.u = LoadUnitHandle(table, i, 1)
        Dummy.target = LoadUnitHandle(table, i, 2)
        Dummy.e = LoadEffectHandle(table, i, 3)
        Dummy.get_point()
        Dummy.set_point(Dummy.x_target, Dummy.y_target, 215.0)
    }
    
    Dummy.dummy_remove()
    Dummy.destroy()
}

struct dummy
    integer dummy_type
    unit target
    unit u
    effect e
    string s
    string e_s
    string e_s1
    
    real x_u
    real y_u
    real z_u
    
    real x_target
    real y_target
    real z_target
    
    method dummy_effect takes string s, string s1 returns nothing
        .e_s = s
        .e_s1 = s1
        
        .e = AddSpecialEffectTarget(.e_s, .u, .e_s1)
    endmethod
    
    method get_point takes nothing returns nothing
        x_u = GetUnitX(.u)
        y_u = GetUnitY(.u)
        z_u = GetUnitFlyHeight(.u)
        
        x_target = GetUnitX(.target)
        y_target = GetUnitY(.target)
        z_target = GetUnitFlyHeight(.target)
    endmethod
    
    method set_point takes real x, real y, real z returns nothing
        SetUnitX(.u, x)
        SetUnitY(.u, y)
        SetUnitFlyHeight(.u, z, 0.0)
    endmethod
    
    method dummy_create takes integer i, integer id, real x, real y, real z returns nothing
    .dummy_type = i
    .u = CreateUnit(Player(id), 'h00E', x, y, 0.0)
    
    if UnitAddAbility(.u, 'Amrf') then
       UnitRemoveAbility(.u, 'Amrf')
    endif
    
    .set_point(x, y, z)
    .e = AddSpecialEffectTarget(.e_s, .u, .e_s1)
    
    if(.dummy_type == 0)
    {
    }
    if(.dummy_type == 1)
    {
    }
    endmethod
    
    method dummy_remove takes nothing returns nothing
        .u = null
        .target = null
        .e = null
        .s = ""
        e_s = ""
        e_s1 = ""
    endmethod
    
    method start takes nothing returns nothing
        timer t = CreateTimer()
        integer i = GetHandleId(t)
        
        if(.dummy_type == 0)
        {
        }
        if(.dummy_type == 1)
        {
            BJDebugMsg(".dummy_type == 1") //Тут всё нормально
            SaveInteger(table, i, 0, .dummy_type)
            SaveUnitHandle(table, i, 1, .u)
            SaveUnitHandle(table, i, 2, .target)
            SaveEffectHandle(table, i, 3, .e)
        }
        TimerStart(t, 1.00, true, function timer_start)
        
        t = null
    endmethod
endstruct

nothing init(nothing)
{
    table = InitHashtable() //Таблица инициализирована

    PanCameraToTimedLocForPlayer(Player(0), GetRectCenter(GetPlayableMapRect()), 0.0)
    dummy Dummy
    Dummy = dummy.create()
    Dummy.dummy_create(1, 0, 0.0, 0.0, 215.0)
    Dummy.dummy_effect("Abilities\\Spells\\Human\\FlameStrike\\FlameStrikeDamageTarget.mdl", "overhead")
    Dummy.target = CreateUnit(Player(0), 'hfoo', 0.0, 0.0, 0.0)
    Dummy.start()
    Dummy.dummy_remove()
    Dummy.destroy()
}

}


LeXuS111555 добавил:
Немного переделал, больше отладочных сообщения. Но разобраться не могу.
Код:
library dummy initializer init
{

globals
    hashtable table
endglobals

nothing timer_start()
{
    BJDebugMsg("Таймер обрабатывается")
    timer t = GetExpiredTimer()
    integer i = GetHandleId(t)
    BJDebugMsg(I2S(LoadInteger(table, i, 0))) //Проверка того сохранилось ли значение 1, выдаёт 0. Вывод: почему то в хештаблицу не сохранились значения
    dummy Dummy
    Dummy = dummy.create()
    Dummy.dummy_type = LoadInteger(table, i, 0)
    if(Dummy.dummy_type == 0)
    {
    }
    if(Dummy.dummy_type == 1)
    {
        BJDebugMsg("Здесь не проходит, хотя я назначил таймеру в хеш таблице значение 1 в методe start")
        Dummy.u = LoadUnitHandle(table, i, 1)
        Dummy.target = LoadUnitHandle(table, i, 2)
        Dummy.e = LoadEffectHandle(table, i, 3)
        Dummy.get_point()
        Dummy.set_point(Dummy.x_target, Dummy.y_target, 215.0)
    }
    
    Dummy.dummy_remove()
    Dummy.destroy()
}

struct dummy
    integer dummy_type
    unit target
    unit u
    effect e
    string s
    string e_s
    string e_s1
    
    real x_u
    real y_u
    real z_u
    
    real x_target
    real y_target
    real z_target
    
    method dummy_effect takes string s, string s1 returns nothing
        .e_s = s
        .e_s1 = s1
        
        .e = AddSpecialEffectTarget(.e_s, .u, .e_s1)
    endmethod
    
    method get_point takes nothing returns nothing
        x_u = GetUnitX(.u)
        y_u = GetUnitY(.u)
        z_u = GetUnitFlyHeight(.u)
        
        x_target = GetUnitX(.target)
        y_target = GetUnitY(.target)
        z_target = GetUnitFlyHeight(.target)
    endmethod
    
    method set_point takes real x, real y, real z returns nothing
        SetUnitX(.u, x)
        SetUnitY(.u, y)
        SetUnitFlyHeight(.u, z, 0.0)
    endmethod
    
    method dummy_create takes integer i, integer id, real x, real y, real z returns nothing
    .dummy_type = i
    .u = CreateUnit(Player(id), 'h00E', x, y, 0.0)
    
    if UnitAddAbility(.u, 'Amrf') then
       UnitRemoveAbility(.u, 'Amrf')
    endif
    
    .set_point(x, y, z)
    .e = AddSpecialEffectTarget(.e_s, .u, .e_s1)
    
    if(.dummy_type == 0)
    {
    }
    if(.dummy_type == 1)
    {
    }
    endmethod
    
    method dummy_remove takes nothing returns nothing
        .u = null
        .target = null
        .e = null
        .s = ""
        e_s = ""
        e_s1 = ""
    endmethod
    
    method start takes nothing returns nothing
        timer t = CreateTimer()
        integer i = GetHandleId(t)
        
        if(.dummy_type == 0)
        {
        }
        if(.dummy_type == 1)
        {
            BJDebugMsg(".dummy_type == 1") //Тут всё нормально
            SaveInteger(table, i, 0, .dummy_type)
            SaveUnitHandle(table, i, 1, .u)
            SaveUnitHandle(table, i, 2, .target)
            SaveEffectHandle(table, i, 3, .e)
            BJDebugMsg(I2S(LoadInteger(table, i, 0))) //Проверил, сохпранилось значение 1
        }
        TimerStart(t, 1.00, true, function timer_start)
        
        t = null
    endmethod
endstruct

nothing init(nothing)
{
    table = InitHashtable() //Таблица инициализирована

    PanCameraToTimedLocForPlayer(Player(0), GetRectCenter(GetPlayableMapRect()), 0.0)
    dummy Dummy
    Dummy = dummy.create()
    Dummy.dummy_create(1, 0, 0.0, 0.0, 215.0)
    Dummy.dummy_effect("Abilities\\Spells\\Human\\FlameStrike\\FlameStrikeDamageTarget.mdl", "overhead")
    Dummy.target = CreateUnit(Player(0), 'hfoo', 0.0, 0.0, 0.0)
    Dummy.start()
    Dummy.dummy_remove()
    Dummy.destroy()
}

}


LeXuS111555 добавил:
Помогите пожалуйста! Уже всё перепробовал, проверил. Всеравно не работает.
Старый 11.09.2012, 13:58
ScorpioT1000
Работаем
online
Опыт: отключен
    real x_u
    real y_u
    real z_u
    
    real x_target
    real y_target
    real z_target
    
    method get_point takes nothing returns nothing
        x_u = GetUnitX(.u)
        y_u = GetUnitY(.u)
        z_u = GetUnitFlyHeight(.u)
        
        x_target = GetUnitX(.target)
        y_target = GetUnitY(.target)
        z_target = GetUnitFlyHeight(.target)
    endmethod
поржал
ScorpioT1000 добавил:
dummy Dummy
Dummy = dummy.create()
Dummy.dummy_type 
// надо было так:
dummy Dummy
Dummy = dummy.Dummy
DUmmy.dummy_dummy = dummy.Dummy.dummy
еще поржал
Старый 11.09.2012, 15:21
ScorpioT1000
Работаем
online
Опыт: отключен
вот кстати я не понял, зачем вообще надо структуру и дамми, если ты юзаешь хештейбл для сохранения значений после таймера
Старый 11.09.2012, 15:32
LeXuS111555

offline
Опыт: 357
Активность:
Мне так проще будет работать, чем с массивом переменных
Старый 12.09.2012, 06:12
ScorpioT1000
Работаем
online
Опыт: отключен
зачем тебе массив переменных, если есть хештейбл?
Старый 12.09.2012, 14:17
LeXuS111555

offline
Опыт: 357
Активность:
Лучше бы помогли решить проблему...
Старый 13.09.2012, 00:51
YellowStar
poon
offline
Опыт: 15,144
Активность:
чувак, тут мусора много, реально ты парился и твой код можно уместить в 20 строк максимум
Старый 13.09.2012, 03:17
DioD

offline
Опыт: 45,134
Активность:
это не код, это блот.
структуры и прочий оверлоад обычно нужен чтобы вместить всё в несколько строк, а не наоборот подробно расписывать в принципе атомарные действия.
объектный код в принципе не предполагает что-то хранить в хеш таблицах или дополнительных массивах.
ты должен создать статик обработчик инстансов, где запускается таймер и происходят прочие действия и после того как новый инстанс внесён в список, таймер его обрабатывает молча и без дополнительных действий.
переписать код не представляется возможным так как он в корне неверен и противоречит принципам объектности.
записывать на таймер ничего не надо, объектный код на джас возможен без хеш таблиц кеша ретурн бага и даже кастом велью.
если нам нужно 32 раза в секунду двигать юнита А в точку Б
мы создаём 100500 массивов на нужные параметры (те самые структуры) ложим юнита А в слот Ц и все данные в соответствующие массивы тоже в слот Ц, когда будет идти энумирация получать какие либо данные с юнита не потребуется.
Старый 13.09.2012, 10:57
LeXuS111555

offline
Опыт: 357
Активность:
Я хотел расширить эту систему до большей вариации, хочу сделать различные виды использования дамми, поэтому мне нужна структура. А упрощать я буду позже, когда хотя бы работать всё будет.
Старый 13.09.2012, 12:32
DioD

offline
Опыт: 45,134
Активность:
да хоть 100500 видов дамми, массивы тебе потребуются всё равно, добавить еще один массив в систему занимает секунду и не требует никакого кода.
Старый 13.09.2012, 13:17
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:38.