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

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

Ответ
 
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Баг препроцессора //summon ADOLF
» jass2
function      cj_anonym__1 takes nothing returns nothing
//# optional
local timer t=GetExpiredTimer()
local integer th=GetHandleId(t)
local unit TriggerUnit=LoadUnitHandle(MoveDummyToTarget_Hash,th,1)
local unit TargetUnit=LoadUnitHandle(MoveDummyToTarget_Hash,th,2)
local real s=LoadReal(MoveDummyToTarget_Hash,th,3)
local real TriggerX=GetUnitX(TriggerUnit)
local real TriggerY=GetUnitY(TriggerUnit)
local real x2=GetUnitX(TargetUnit)
local real y2=GetUnitY(TargetUnit)
local real angle=Atan2(y2-TriggerY,x2-TriggerX)
local  cjlocgn_00000000
local real cjlocgn_00000001
local real cjlocgn_00000002
local real cjlocgn_00000003
if            (SquareRoot((TriggerX-x2)*(TriggerX-x2)+(TriggerY-y2)*(TriggerY-y2))>s) then
set TriggerX=TriggerX+s*Cos(angle)
set TriggerY=TriggerY+s*Sin(angle)
call SetUnitXEx(TriggerUnit,TriggerX)
call SetUnitYEx(TriggerUnit,TriggerY)
set cjlocgn_00000001=200.0
set cjlocgn_00000002=GetUnitFacing(TriggerUnit)-GetUnitFacing(TargetUnit)
call CauseDamageUnitX(TriggerUnit,TargetUnit,SpellDamageFactor(TriggerUnit,0x41303134,200.0,0.05),WIND)

else
call  CreateDummySfx("Wind.mdl",TriggerX,TriggerY,angle,90.0,0.5,0.2)

call FlushChildHashtable(MoveDummyToTarget_Hash,th)
call DestroyTimer(t)
endif
set t=null
set TriggerUnit=null
set TargetUnit=null
endfunction
Для local cjlocgn_00000000 тип определен
берется эта переменная отсюда:
#define private <SpellDamage()> = 
{
    int random = GetRandomInt(0,100);
    float dmg = abilDamage;
    float diff = GetUnitFacing(TriggerUnit) - GetUnitFacing(TargetUnit);
    float abc;
    ...
}
Самое интересно, что если убрать абц, то будет ругаться на diff, если убрать diff, то на dmg и тд, пока есть локалки.
Подчеркну, что если убрать локалки, и отправлять к примеру функцию, то все будет ок, т.е. эта конструкция верная и рабочая, дело именно в том, что препроцессор тип вариабла теряет где то.
Немного пояснения. Дефайн передается в дефайн, и в переданном дефайне передается в качестве аргумента в дефайн который формирует лямбда функцию. Видимо при такой последовательности и происходит косяк:)
в целом все ок если код вынести в функцию, и если нужно передать параметры, то закинуть их в аргументы, однако плодить функции не особо хочется :\

Отредактировано Faion, 30.07.2012 в 18:56.
Старый 29.07.2012, 22:20
adic3x

offline
Опыт: 108,439
Активность:
А попробуйте сделать так:
#define private <SpellDamage()> = 
{
    vblock
    {
        int random = GetRandomInt(0,100);
        float dmg = abilDamage;
        float diff = GetUnitFacing(TriggerUnit) - GetUnitFacing(TargetUnit);
        float abc;
        ...
    }
}
ADOLF добавил:
И если не поможет - покажите больше кода, как оно вызывается например.
Старый 31.07.2012, 09:45
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
vblock не помог.
» Вызов
#define EmptyAction = true;
 

scope WindBackstub

#define
{
    private abilCode = 'A014';
}

callback onUnitSpellEffect(abilCode) 
{
    unit caster = GetTriggerUnit();
    unit target = GetSpellTargetUnit();
    
    TMoveDummyToTarget(\
        caster,\
        target,\
        dummySpeed,\
        EmptyAction,\
        int var = 0;\
        EmptyAction);
        
    caster = null;
    target = null;
}
endscope
» Used Template

library MoveDummyToTarget
{ 
    public hashtable Hash = InitHashtable()
    
    #define 
    {
        private HT_OBJECT_COUNT = 0;
        private UNIT_CASTER = 1;
        private UNIT_TARGET = 2;
        private UNIT_SPEED = 3;
    }
    
    #define private TimerAction(onPeriod, onEnd) = 
    {
        timer t=GetExpiredTimer();
        int th=GetHandleId(t);
        unit TriggerUnit=LoadUnitHandle(MoveDummyToTarget_Hash,th,UNIT_CASTER);
        unit TargetUnit=LoadUnitHandle(MoveDummyToTarget_Hash,th,UNIT_TARGET);
        float s = LoadReal(MoveDummyToTarget_Hash,th,UNIT_SPEED);
        float TriggerX=GetUnitX(TriggerUnit),TriggerY=GetUnitY(TriggerUnit),x2=GetUnitX(TargetUnit),y2=GetUnitY(Ta​rgetUnit);
        float angle = Atan2(y2-TriggerY,x2-TriggerX);
        if (SquareRoot((TriggerX-x2)*(TriggerX-x2)+(TriggerY-y2)*(TriggerY-y2)) > s)
        {
            TriggerX=TriggerX+s*Cos(angle);
            TriggerY=TriggerY+s*Sin(angle);
            SetUnitX(TriggerUnit,TriggerX);
            SetUnitY(TriggerUnit,TriggerY);
            #if (!onPeriod)
                onPeriod
            #endif
        }
        else
        {
            #if (!onEnd)
                onEnd
            #endif
            FlushChildHashtable(MoveDummyToTarget_Hash,th);
            DestroyTimer(t);
        }
        t=null;
        TriggerUnit=null;
        TargetUnit=null;
    }

    #define TMoveDummyToTarget(u1, u2, speed, onPeriod, onEnd) = 
    {
        timer t = CreateTimer();
        int th = GetHandleId(t);
        SaveUnitHandle(MoveDummyToTarget_Hash,th,UNIT_CASTER,u1);
        SaveUnitHandle(MoveDummyToTarget_Hash,th,UNIT_TARGET,u2);
        SaveReal(MoveDummyToTarget_Hash,th,UNIT_SPEED,speed);
        TimerStart(t,.04,true,lambda void(){TimerAction(onPeriod, onEnd)});
        t=null;
    }
}
если будет не понятно как это работает, могу проставить комментарии.
Старый 31.07.2012, 10:41
ScorpioT1000
Работаем
offline
Опыт: отключен
Внутри тела дефайна не может быть #if, повторяешь сто раз, а вы всеравно тычетесь как котята об стену
Старый 31.07.2012, 13:05
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ScorpioT1000:
Внутри тела дефайна не может быть #if, повторяешь сто раз, а вы всеравно тычетесь как котята об стену
Вот с чего ты так решил? Практика показывает что все ок. Да и проблема не в #if вовсе.
Старый 31.07.2012, 14:55
adic3x

offline
Опыт: 108,439
Активность:
Внутри тела дефайна не может быть #if, повторяешь сто раз, а вы всеравно тычетесь как котята об стену
Откуда инфа? По идее должно работать.
У меня на 1.4.2.40 оно вообще падает, и отладчика опд рукой нет. Какая у Вас то версия?
Старый 31.07.2012, 15:55
ScorpioT1000
Работаем
offline
Опыт: отключен
ADOLF, от крашрепорта =)
Старый 31.07.2012, 15:59
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ADOLF:
Откуда инфа? По идее должно работать.
Работает отлично, скорп не шарит:)
ADOLF:
У меня на 1.4.2.40 оно вообще падает, и отладчика опд рукой нет. Какая у Вас то версия?
Последняя с гуглокода.
Старый 31.07.2012, 16:00
adic3x

offline
Опыт: 108,439
Активность:
Я кстати один не увидел в 3 посте с кодом макрос SpellDamage()?
На самом деле кд достаточно сложный в плане препроцессинга. И я не уверен, что смогу что то исправить. Вообще, если вдруг что то не работает - пробуйте раскрывать макросы, не использовать вложенные макросы, не передавать в макрос в качестве аргумента другой макрос.
Старый 31.07.2012, 20:04
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ADOLF, а он и не нужен, я выпилил все лишнее, что б тебе было удобнее тестировать:)
Там достаточно int var = 0
Я не спорю, ппц я замудрил, но вроде бы вопрос решаемый, да и фича на самом деле крутая.
Faion добавил:
ADOLF, в принципе могу выслать опенсорц проекта.
в общем я очень надеюсь что ты поправишь этот баг, т.к. баг таки существенен на самом деле и сильно обламывает гибкость концепции которую я хотел бы привнести в массы:)

Отредактировано Faion, 31.07.2012 в 21:58.
Старый 31.07.2012, 20:22
adic3x

offline
Опыт: 108,439
Активность:
Я сейчас без отладчика, без ничего. Вообще, можно попробовать вылодить тут карту, где все ненужное порезанно, и описать, что именно происходит, но обещать ничего не могу.
Старый 07.08.2012, 10:42
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Окей, вечером я сделаю тестовую мапу и весь код раскомментирую :)
Старый 07.08.2012, 11:00
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ADOLF, сори что так долго.
Прикрепленные файлы
Тип файла: w3m 123.w3m (18.9 Кбайт, 8 просмотров )
Старый 16.08.2012, 23:22
adic3x

offline
Опыт: 108,439
Активность:
Ничего, я теперь смотреть ее буду столько-же ;)
Старый 17.08.2012, 00:14
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ADOLF, ну надеюсь вопрос решится в течении ~ месяца:)
Старый 17.08.2012, 01:54
Ответ

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

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

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

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



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