21

» WarCraft 3 / Какие существуют альтернативы ветвлению ифами?

Alexey103, я не говорил, что массивы - это альтернатива if'ам.
Я про то, что это :
Наприме если установить процентный дроп каждого итема, 100 итемов, 100 ифов по 1% шанс дропа. Это опасно?
можно сделать с помощью массивов, без кучи if'ов.
21

» WarCraft 3 / Рандом итем

Andrey33, я же Вам написал решение.
вот карта пример, если уж совсем не понятно.
Загруженные файлы
21

» WarCraft 3 / Рандом итем

Andrey33, ну тут же всё интуитивно понятно. Вы ведь учили англ. в школе?
21

» WarCraft 3 / Рандом итем

Andrey33, что именно не можете понять? Как инициализировать массивы? Или как выбрать из массива нужный?
21

» WarCraft 3 / Рандом итем

Если у вас 100 предметов, занесите их все в массив. Далее, когда юнит умирает, генерируете случайное число (от 1 до кол-во предметов) и вставляете его в индекс массива.
21

» WarCraft 3 / Какие существуют альтернативы ветвлению ифами?

biridius, А проще, мне можно делать полотна из сотен гуишных ифов? Наприме если установить процентный дроп каждого итема, 100 итемов, 100 ифов по 1% шанс дропа. Это опасно?
100 if'ов для war3 не много, а вот Вам это может надоесть, пока писать будете. Да и к тому же, это получится очень большой триггер, при открытии которого в редакторе триггеров, у Вас будет всё лагать и подвисать (если сделано на GUI).
Как выше уже сказали, лучше делать через массивы.
21

» WarCraft 3 / Какие существуют альтернативы ветвлению ифами?

ClotPh, неправда.
if ( a ) and ( b ) and ( c)  then
если "а" будет false, то "b" и "с" не будут выполняться.
А если вместо "and" будет "or", то условия будут проверяться до тех пор, пока один не выдаст "true".
21

» WarCraft 3 / Перенос jass

Вы уверены, что там используется именно JASS? Быть может там используется другой язык (vJASS, как пример)? В таком случае, Вам нужен JNGP.
Также, если у Вас код всё-таки написан на чистом JASS, то вам нужно копировать сам триггер, а не код внутри него. Так как там может использоваться глобальная переменная с названием триггера:
set gg_trg_triggername = CreateTrigger( )
21

» WarCraft 3 / unitRecycler

исправил некоторые недочёты, и всё же хотелось бы узнать, может еще есть какие-то недоработки тут?
раскрыть
library UnitRecycler requires UnitRevive



    globals

        private  constant  integer         MAX_STOCKED_RAWCODES         =  256
        private  constant  integer         MAX_STOCKED_UNITTYPES        =  1024

        private  constant  group           stock                        =  CreateGroup( )
        private            unit            recycledUnit                 =  null

        private            integer         stockedRawCodesCount         =  0
        private            integer  array  stockedRawCodes

        private            integer  array  stockedUnitCount
        private            unit     array  stockedUnit[ MAX_STOCKED_RAWCODES ] [ MAX_STOCKED_UNITTYPES ]

    endglobals



    private constant function IsUnitAlive takes unit whichUnit returns boolean
        return not ( IsUnitType( whichUnit, UNIT_TYPE_DEAD ) or  ( GetUnitTypeId( whichUnit ) == 0 ) )
    endfunction



    private function RAW2S takes integer value returns string
        local  string   charMap         =  ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."
        local  string   result          =  ""
        local  integer  remainingValue  =  value
        local  integer  byteno          =  0
        local  integer  charValue

        loop
            set charValue = ModuloInteger(remainingValue, 256)
            set remainingValue = remainingValue / 256
            set result = SubString(charMap, charValue, charValue + 1) + result
     
            set byteno = byteno + 1
            exitwhen ( byteno == 4 )
        endloop

        return result
    endfunction



    private function GetUnitFromStock takes integer rawCode returns unit
        local  integer  i  =  0

        loop

            if ( stockedRawCodes[ i ] == rawCode ) and ( stockedUnitCount [ i ] > 0 ) then

                set  stockedUnitCount [ i ]                             =  stockedUnitCount [ i ] - 1
                set  recycledUnit                                       =  stockedUnit [ i ] [ stockedUnitCount [ i ] ]
                set  stockedUnit      [ i ] [ stockedUnitCount [ i ] ]  =  null
                exitwhen true
            endif

            if ( i == stockedRawCodesCount ) then

                debug call BJDebugMsg( "GetUnitFromStock(...) :    '" + RAW2S( rawCode ) + "' unittype stock is emty. New unit has been created." )
                set recycledUnit = CreateUnit( Player( 15 ), rawCode, HIDDEN_X, HIDDEN_Y, 0.0 )
                exitwhen true
            endif

            set i = i + 1
        endloop

        return recycledUnit
    endfunction



    private function AddUnitToStock takes unit whichUnit returns nothing
        local  integer rawCode  =  GetUnitTypeId( whichUnit )
        local  integer i        =  0

        loop
            exitwhen ( stockedRawCodes[ i ] == rawCode )

            if ( i == stockedRawCodesCount ) and ( stockedRawCodesCount < MAX_STOCKED_RAWCODES ) then
                set stockedRawCodes[ i ] = rawCode
                set stockedRawCodesCount = stockedRawCodesCount + 1
                exitwhen true

            elseif ( stockedRawCodesCount == MAX_STOCKED_RAWCODES ) then
                debug call BJDebugMsg( "AddUnitToStock(...) :    Cannot add unit to stock, max rawcode count achieved. Unit has been removed." )
                call KillUnit( whichUnit )
                call ShowUnit( whichUnit, false )
            endif

            set i = i + 1
        endloop

        if ( stockedUnitCount [ i ] < MAX_STOCKED_UNITTYPES ) then
            set stockedUnit      [ i ] [ stockedUnitCount [ i ] ]  =  whichUnit
            set stockedUnitCount [ i ]                             =  stockedUnitCount [ i ] + 1

        else
            debug call BJDebugMsg( "AddUnitToStock(...) :    Cannot add unit to stock, max unittype count achieved. Unit has been removed." )
            call KillUnit( whichUnit )
            call ShowUnit( whichUnit, false )
        endif

    endfunction



    function GetRecycledUnit takes player owner, integer rawCode, real x, real y, real facing returns unit
        if IsHeroUnitId( rawCode ) then
            debug call BJDebugMsg( "GetRecycledUnit(...) :    Attempt to  get recycled hero unit." )

        else
            set recycledUnit = GetUnitFromStock( rawCode )
            call GroupRemoveUnit    ( stock, recycledUnit )
            call PauseUnit          ( recycledUnit, false )
            call SetUnitOwner       ( recycledUnit, owner, true )
            call SetUnitPosition    ( recycledUnit, x, y )
            call SetUnitFacing      ( recycledUnit, facing )
            call SetUnitPathing     ( recycledUnit, true )
            call SetUnitInvulnerable( recycledUnit, false )
            call ShowUnit           ( recycledUnit, true )

            return recycledUnit
        endif

        return null
    endfunction



    function RecycleUnit takes unit whichUnit returns boolean
        if ( whichUnit == null ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle a null unit." )
            return false

        elseif IsUnitAlive( whichUnit ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle an alive unit." )
            return false

        elseif IsUnitInGroup( whichUnit, stock ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle an already recycled unit." )
            return false

        elseif IsHeroUnitId( GetUnitTypeId( whichUnit ) ) then
            debug call BJDebugMsg( "RecycleUnit(...) :    Attempt to recycle a hero unit." )
            return false

        elseif ReviveUnit( whichUnit ) then
            call GroupAddUnit       ( stock, whichUnit )
            call PauseUnit          ( whichUnit, true )
            call SetUnitOwner       ( whichUnit, Player( 15 ), false )
            call SetUnitState       ( whichUnit, UNIT_STATE_LIFE, GetUnitState( whichUnit, UNIT_STATE_MAX_LIFE ) )
            call SetUnitState       ( whichUnit, UNIT_STATE_MANA, GetUnitState( whichUnit, UNIT_STATE_MAX_MANA ) )
            call SetUnitScale       ( whichUnit, 1.0, 0.0, 0.0 )
            call SetUnitVertexColor ( whichUnit, 255, 255, 255, 255 )
            call SetUnitFlyHeight   ( whichUnit, GetUnitDefaultFlyHeight( whichUnit ), 0.0 )
            call SetUnitPathing     ( whichUnit, false )
            call SetUnitInvulnerable( whichUnit, true )
//          call ShowUnit           ( whichUnit, false )
            call SetUnitPosition    ( whichUnit, HIDDEN_X, HIDDEN_Y )
            call AddUnitToStock     ( whichUnit )
            return true

        else
            debug call BJDebugMsg( "RecycleUnit(...) :    Cannot revive this unit." )
            return false
        endif

        return false
    endfunction



endlibrary
21

» WarCraft 3 / Макс. кол-во звуков

ssbbssc, значит данная проблема появляется только на моём ПК, а на других ПК будет все нормально со звуком?
21

» WarCraft 3 / Иниц. глоб. переменных

PT153, кстати, да! Инициализация некоторых типов, происходящих подобным образом, приводит к фаталу. Я думаю, что это говорит о том, что инициализация подобных переменных происходит несколько иначе.
21

» WarCraft 3 / Макс. кол-во звуков

Hate, Вы не понимаете.
	call DestroyEffect( AddSpecialEffect( effectPath, x, y )
можно заменить на:
	call StartSound( sound )
Суть остаётся прежней.

Не обязательно, чтобы данную способность применяли несколько воинов. Можно начать битву между двумя армиями и воспроизвести лишь один звук, и он не воспроизведётся, потому что Warcraft воспроизводит звуки сражения (удары мечей).
21

» WarCraft 3 / Макс. кол-во звуков

Hate, нет, я привел пример. Да и когда воин применяет способность и воспроизводится эффект без звука - это выглядит некрасиво.
Извините, случайно поставил "минус".
21

» WarCraft 3 / Макс. кол-во звуков

Hate, например, если так сделать:
function callback takes nothing returns nothing
    call DestroyEffect( AddSpecialEffect( effectPath, x, y )
endfunction

//  ....
    call TimerStart( timer, 0.10, true, function callback )
//  ....
То через некоторое время звуки эффекта "effectPath" перестанут воспроизводиться на некоторое время.
21

» WarCraft 3 / xedummy Vexorian'a

biridius, разве? Я почему то думал, что триггерный поворот юнита моментальный.

21

» WarCraft 3 / Помогите с jass

KaneThaumaturge, нет, я имел ввиду:
static if ( ANGLE_RND ) then
	local real a = GetRandomReal( 0, 2 * bj_PI )
else
	local real a = ANGLE
endif
local real a
if ( ANGLE_RND ) then
	set a = GetRandomReal( 0, 2 * bj_PI )
else
	set a = ANGLE
endif
А вообще, выше уже написали самый правильный ответ, советую воспользоваться им, если не используется cJASS.
GetLocalPlayer:
Выключи препроцессор cJass - AdicHelper.
21

» WarCraft 3 / Как спрятать иконки пасивки

Andrey33, нужно не убирать спелбук, а делать его недоступным для игрока:
	call SetPlayerAbilityAvailable( player, rawcode, false )
21

» WarCraft 3 / Помогите с jass

попробуйте cтереть всё что есть внутри блока "static if", а вместо этого напишите:
local real a
if ( ANGLE_RND ) then
	set a = GetRandomReal( 0, 2 * bj_PI )
else
	set a = ANGLE
endif
но и Ваш способ, думаю, тоже рабочий...))
21

» WarCraft 3 / DestroyGroup()

Лучше не создавать много групп, а создать один и использовать его, очищая группу после использования.
Sergey105:
trigger t = CreateTrigger();
DestroyTrigger(t);
t = null;
а как правильно удалять триггеры описано здесь. xgm.guru/p/wc3/venomanser
21

» WarCraft 3 / Искусственный интеллект крипов

quq_CCCP, я думал, что будет легче, если крипы будут сами использовать способности, нежели, если я буду писать ИИ для каждого типа крипа.