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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] cJass/vJass
SmartarosДата: Суббота, 10 Ноября 2012, 15:58:21 | Сообщение # 1
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Решил начать учить, есть много вопросов.
В частности, облазил весь инет, но ничего не нашел по поводу структур.
В чем разница между library и scope.
Расскажите про всякие тонкости/ньюансы, вообще про теорию. Кто знает русскоязычные источники по детальному мэнуалу сего. Сижу пишу у себя через либы, и че то чувствую что хрень делаю, через скоуп тоже самое, знаю только синтаксис, а сам смысл только в конструкции и функциях, и то не всего.
 

Ty3uKДата: Суббота, 10 Ноября 2012, 16:35:41 | Сообщение # 2
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
library при компиляции помещается выше нестандартного кода, а scope остается в месте объявления. на объяснение нюансов уйдет куча времени, а лучше официального мануала на англ. пока ничего нет. и, да, а причем тут cJASS?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SmartarosДата: Суббота, 10 Ноября 2012, 16:52:19 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
синтаксис, знаю только ++ -- -= и тд. , что еще есть?

Добавлено (10 Ноября 2012, 16:52:19)
---------------------------------------------
почему не робит?

Code
scope Sotryasenie initializer Init_Sotryasenie
{

     include "cj_types.j"
     include "cj_typesEX.j"

     define
     {
         private ABILITY = 'A011'
         private ABILITY_STUN = 'A010'
         private DUMMY = 'n009'
     }

private bool Cond()
{
     return GetSpellAbilityId() == ABILITY
}
      
private void Body()
{
     unit u = GetTriggerUnit(); unit c = GetSpellTargetUnit()
     int stun = 100 + 50 * GetUnitAbilityLevel(u, ABILITY)
     float damage = 40.0 + 60.0 * GetUnitAbilityLevel(u, ABILITY)
      
     if GetHeroStr(c, true) >= stun and GetHeroStr(c, true) >= damage
     {
         damage = 0.0
         stun = 1
     } elseif GetHeroStr(c, true) >= stun {
         stun = 1
     } elseif GetHeroStr(c, true) >= damage {
         damage = 0.0
     } else {
         damage -= I2R(GetHeroStr(c, true))
         stun -= GetHeroStr(c, true)
     }
      
     UnitDamageTargetByType(u, c, damage, DAMAGE_TYPE_MAGIC)
      
     unit d = CreateUnit(GetOwningPlayer(u), DUMMY, GetWidgetX(c), GetWidgetY(c), 0)
     UnitAddAbility(d, ABILITY_STUN)
     SetUnitAbilityLevel(d, ABILITY_STUN, stun)
     IssueTargetOrder(d, "thunderbolt", c)
     UnitApplyTimedLife(d, 'BTLF', 1)
      
     u = null; c = null; d = null
}

private void Init_Sotryasenie()
{
     gg_trg_Sotryasenie = new trigger
     TriggerRegisterAnyUnitEventBJ(gg_trg_Sotryasenie, EVENT_PLAYER_UNIT_SPELL_EFFECT)
     TriggerAddCondition(gg_trg_Sotryasenie, Condition( function Cond))
     TriggerAddAction(gg_trg_Sotryasenie, function Body)
}

}
 

Ty3uKДата: Суббота, 10 Ноября 2012, 17:00:19 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
читай мануал, много чегг есть. его, правда, давно не обновляли.
не работает - не компилируется? если да, то что пишет?


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SmartarosДата: Суббота, 10 Ноября 2012, 17:09:13 | Сообщение # 5
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
компилируется, проверил что не работает все после ифа

Добавлено (10 Ноября 2012, 17:09:13)
---------------------------------------------
еще вопрос, может быть в либе приватная scope, и имеется ли в этом смысл?

 

Ty3uKДата: Суббота, 10 Ноября 2012, 17:31:48 | Сообщение # 6
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Quote (Smartaros)
еще вопрос, может быть в либе приватная scope, и имеется ли в этом смысл?

Я же говорю - читаем мануал vJASS
Quote (vJASS manual)
Nested scopes

Scopes can be nested, don't confuse this statement with "libraries can be nested", in fact, you cannot even place a library inside an scope definition. You can however, have scope inside either library or scope definitions.

An scope inside another scope is considered a child scope. A child scope is considered to be a public member of the parent scope (?).

A child scope cannot declare members that were previously declared as private or global by a parent scope.

A child scope behaves in relation to its parent in the same way as a normal scope behaves in relation to the whole map script.

Since child scopes are always public members, you can access a child scope' public members froum outside the parent scope, but it needs a prefix for the parent and a prefix for the child.

An example :
Code
    library nestedtest
         scope A
           globals
             private integer N=4
           endglobals

           public function display takes nothing returns nothing
             call BJDebugMsg(I2S(N))
           endfunction
         endscope

         scope B
             globals
                 public integer N=5
             endglobals

             public function display takes nothing returns nothing
                 call BJDebugMsg(I2S(N))
             endfunction
         endscope

         function nestedDoTest takes nothing returns nothing
             call B_display()
             call A_display()
         endfunction

     endlibrary

     public function outside takes nothing returns nothing
         set nestedtest_B_N= -4
         call nestedDoTest()
         call nestedtest_A_display()

     endfunction

The next example will cause a syntax error:
Code
    library nestedtest
         globals
             private integer N=3
         endglobals

         scope A
           globals
             private integer N=4 //Error: 'N' redeclared
           endglobals
         endscope

     endlibrary

It is actually caused by a limitation in the parser, there is a conflict caused by using N for the parent and then declaring it for the child. However this version does not cause syntax errors:
Code
    library nestedtest
         scope A
           globals
             private integer N=4
           endglobals
         endscope

         globals
             private integer N=3
         endglobals

     endlibrary

It does kind of the same thing, but since the child's N was declared before the parent's the parser no longer gets in a confusion.

Another thing to keep in mind is that unlike normal global variables, private/public global variables cannot be used before declared, otherwise JassHelper will think they are just normal variables.

Scopes cannot be redeclared, there cannot be 2 scopes with the same name. But 2 child scopes might have the same name if they are children of different scopes, the reason is that they actually don't have the same name, they have different names given by their public child scope situation.
Code
    library nestedtest
       scope A
         function kkk takes nothing returns nothing
             set N=N+5  // By the time JassHelper gets to this line, it did not see the private integer N
                        // declaration yet, so it assumes N is an attempt to use a global variable and does not
                        // do any replacement
         endfunction
       endscope

    endlibrary

    scope X
        scope A
           //Declaring scope A again does not cause any problem, it is because the scope is actually X_A , the
           // previous declaration of A was actually nestedtest_A
           function DoSomething takes nothing returns nothing
           endfunction

        endscope
     endscope

There is no nesting limit, but notice that resulting variable and function names of private/public members get big and bigger depending of the depth of the scope nesting. Bigger variable names may affect performance. Not a lot but they do, and this efficiency issue is to be prevented by an obfuscator/finalizer that renames every identifier in the map script a.k.a the map optimizer's shortest names possible method.


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Суббота, 10 Ноября 2012, 17:36:23 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Приватных областей, к сожалению, не бывает.
Smartaros, набери в поиске "vJASS manual" и "cJASS manual". Первые ссылки - офицальные.


 

Ty3uKДата: Суббота, 10 Ноября 2012, 17:37:49 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas, первый он не будет читать, т.к. он не знает англ (ну по-крайней мере он мне так говорил)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SmartarosДата: Суббота, 10 Ноября 2012, 18:56:12 | Сообщение # 9
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Quote (Smartaros)
компилируется, проверил что не
работает все после ифа
 

SirNikolasДата: Суббота, 10 Ноября 2012, 19:05:43 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Code
include "cj_order.j"

scope Shaking {
    include "cj_types_priv.j"

    define {
        private ABILITY = 'A011'
        private ABILITY_STUN = 'A010'
        private DUMMY = 'n009'
        private STUN(lvl) = 100 + 50 * lvl
        private DAMAGE(lvl) = 40. + 60. * lvl
    }

    callback onUnitSpellEffect(ABILITY) {
        unit u = GetTriggerUnit(), c = GetSpellTargetUnit()
        unit d = CreateUnit(GetOwningPlayer(u), DUMMY, GetWidgetX(c), GetWidgetY(c), .0)
        int level = GetUnitAbilityLevel(u, ABILITY)
        int str = GetHeroStr(c, true)
        int stun = STUN(level)
        real damage = DAMAGE(level)
        if str >= stun {
            stun = 1
        } else {
            stun -= str
        }
        if str >= damage {
            damage = .0
        } else {
            damage -= str
        }
        UnitDamageTargetByType(u, c, damage, DAMAGE_TYPE_MAGIC)
        UnitAddAbility(d, ABILITY_STUN)
        SetUnitAbilityLevel(d, ABILITY_STUN, stun)
        UnitApplyTimedLife(d, 'BTLF', 1.)
        IssueTargetOrderById(d, order_thunderbolt, c)
        flush locals
    }
}


 

SmartarosДата: Суббота, 10 Ноября 2012, 22:57:23 | Сообщение # 11
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Переписал - не пашет после ифов.
Проверил даммика и его способность, все в порядке.
Поменял функцию, убрал установление лвла дамми абилы на снятие баффа таймером, тоже не работает, понятия не имею в чем ошибка, явно в ро, но все проверил итак.

Добавлено (10 Ноября 2012, 21:18:49)
---------------------------------------------
хотя по факту даже даммик не создается, первый раз такое вижу

Добавлено (10 Ноября 2012, 21:35:29)
---------------------------------------------
короче понял, не работает все после damagebytype, независимо где она стоит, ща позжее ее скину

Добавлено (10 Ноября 2012, 22:57:23)
---------------------------------------------

Code
void UnitSpecialDamageTarget(unit u, unit t, float r, damagetype d)
{
     if d == DAMAGE_TYPE_MAGIC or d == DAMAGE_TYPE_POISON or d == DAMAGE_TYPE_FIRE or d == DAMAGE_TYPE_WATER or d == DAMAGE_TYPE_AIR or d == DAMAGE_TYPE_EARTH or d == DAMAGE_TYPE_ELECTRISITY
     {
         UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)
     } elseif d == DAMAGE_TYPE_NORMAL {
         UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
     } elseif d == DAMAGE_TYPE_UNKNOWN {
         UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
     } elseif d == DAMAGE_TYPE_CRITICAL {
         UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
     }
}

void UnitDamageTargetByType(unit u, unit t, float r, damagetype d)
{
     if d == DAMAGE_TYPE_NORMAL
     {
         unit c = CreateUnit(GetOwningPlayer(u), NORMAL, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_NORMAL)
     } elseif d == DAMAGE_TYPE_MAGIC {
         unit c = CreateUnit(GetOwningPlayer(u), MAGIC, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_MAGIC)
     } elseif d == DAMAGE_TYPE_POISON {
         unit c = CreateUnit(GetOwningPlayer(u), POISON, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_POISON)
     } elseif d == DAMAGE_TYPE_FIRE {
         unit c = CreateUnit(GetOwningPlayer(u), FIRE, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_FIRE)
     } elseif d == DAMAGE_TYPE_WATER {
         unit c = CreateUnit(GetOwningPlayer(u), WATER, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_WATER)
     } elseif d == DAMAGE_TYPE_AIR {
         unit c = CreateUnit(GetOwningPlayer(u), AIR, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_AIR)
     } elseif d == DAMAGE_TYPE_EARTH {
         unit c = CreateUnit(GetOwningPlayer(u), EARTH, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_EARTH)
     } elseif d == DAMAGE_TYPE_ELECTRISITY {
         unit c = CreateUnit(GetOwningPlayer(u), ELECTRISITY, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_ELECTRISITY)
     } elseif d == DAMAGE_TYPE_UNKNOWN {
         unit c = CreateUnit(GetOwningPlayer(u), PURE, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_UNKNOWN)
     } elseif d == DAMAGE_TYPE_CRITICAL {
         unit c = CreateUnit(GetOwningPlayer(u), CRITICAL, GetWidgetX(t), GetWidgetY(c), 0)
         UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_CRITICAL)
     }
}
 

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

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