27

» WarCraft 3 / Приказ отмены улучшения здания

проверяй дебагом. выводи на экран. когда жмешь отмену, смотри какой приказ
27

» WarCraft 3 / Полное отключение мультиборда ливнувших игроков

по-моему только спрятать. Короче у каждого игрока локально отображен 1 мультиборд, можно переключать мультиборды. После ливна игрока вам покажут эту отвратительную таблицу, а вы покажите заново нужный мульт (короче она где-то в игре будет существовать, и будет спрятана). И во-вторых, задавал один (даже не один пользователь хгм, а несколько, просто не найти темы) давно, пытался я помочь. Мне даже было интересно, мб ссылка или какая-нибудь переменная на эту таблицу. Рылся, искал в библиотеке. На хгм смотрел - ничего. Короче сшита или невозможно ссылку добыть на этот мульт, я бы нафиг удалил этот мультиборд. xgm.guru/p/wc3/164268
до такого у себя в карте не доходил. Это происходит чаще в стандартных сражениях. У вас они там? Наблюдение (возможно ошибаюсь): Но в некоторых картах, не в melee, если игрок ливает, то такой фигни не происходит. Не исключаю что в melee-функции что-то.
27

» WarCraft 3 / Как отследить яйцо феникса (после превращения)

Принятый ответ
так вроде там морф (спец абилка). после естественной смерти юнит морфится (событие смерти никак не отслеживается). И это легко отслеживается через "приводит в действие".
используй всегда дебаги, выводи на экран. я тоже не всегда знаю, проверяю
подробные абилки
Феникс 'AHpx' - вызывает феникса (можно указать кол-во вызванных). Появляется рядом с кастером. Может вызвать безграничное число птиц. Но есть один нюанс со фениксом - у него есть способность 'Превращение в феникса' Aphx, которое после гибели превращает яйцо. Эта способность не позволяет призывать больше одной жар-птицы. Нельзя отследить кастера - того кто призвал эту птицу (debug показывает что феникс призывает феникса, то есть он сам себя призвал)
Превращение в феникса 'Aphx' - морф работает при смерти. У фенникса каждый раз становится хп меньше (так специально сделали в РО: у феникса отрицательный реген), и когда умрет естественной смертью (не от руки врагов), тогда превращается в яйцо (такой цикл). Яйцо просуществует несколько секунд (можно задать длительность морфа, если задать 0.00 - постоянный морф). После из яйца рождается феникс.
Загруженные файлы
27

» WarCraft 3 / Способность "Взять дерево" у героя

подробности
в абилке нумерация индексов идет от 0.
0 = 1 атака, 1 = 2 атака, 2 = обе атаки
включен индекс атаки - переключается при вырывания дерева
индекс выключенной атаки - когда дерево ломается, у вас переключается на этот индекс
возможно баги, когда не отображаются иконки атаки
еще вариант - морф
27

» WarCraft 3 / Способность "Взять дерево" у героя

смотри вот здесь
там у абилы "вырвать дерево" индексы нужные прописать нужно.
27

» WarCraft 3 / Дропнуть предметъ

native SetItemPosition takes item i, real x, real y returns nothing
можно сдвинуть сам итем, а не через приказы. Где x, y - текущие координаты героя. Есть аналог на BJ это SetItemPositionLoc
27

» WarCraft 3 / Блокираторы пути (расширенные возможности)

SNART, черным он и должен быть прозрачным. Если поставить синий, то это для зданий другое, там нельзя строить xgm.guru/p/wc3/pathing-alternate
27

» WarCraft 3 / thistype и струкруты

пример векторов MF
//Система мистера MF https://xgm.guru/forum/showthread.php?t=27122

library vectors
    
    struct vector
        real x
        real y
        real z
        //Статичный метод создающий вектор, принимает координаты возвращает вектор. 
        //Вектор - отрезок AB, соединяющий из точки A в точку B. Вектор кроме того имеет направление. 
        //V = (x, y, z)  => казалось храним координаты точки, не совсем точно. Храним отрезок с направлением.
        //правильнее V = (Bx-Ax, By-Ay, Bz-Az)  => из конца вычитаем начало
        //эта функция создаем вектор. создается структура, короче выделяется место под массивы. максимум доступно 8190
        //прописываем: local vector v = vector.create(0,0,0) <= координаты
        static method create takes real x, real y, real z returns vector
            local vector v = vector.allocate() // <= что-то вроде перебора индекса массива
            set v.x=x
            set v.y=y
            set v.z=z
            return v //<= возвращает на самом деле индекс, номер структуры
        endmethod

        //Умножает вектор на какое либо число.
        //V = V * r
        //если раскрыть: 
        //set v_x[this]=v_x[this] * r
        //set v_y[this]=v_y[this] * r
        //set v_z[this]=v_z[this] * r
        //пишем: local vector v = vector.create(1,1,1)
        //пишем: call v.realmul(2)  // <= результат вектор с координатами 2 2 2
        method realmul takes real r returns nothing
            set .x=.x*r
            set .y=.y*r
            set .z=.z*r
        endmethod
        
        //Модуль вектора - метод возвращающий длину вектора (число всегда >0)
        //|V| = sqrt(x*x + y*y + z*z)
        //пишем: local vector v = vector.create(0,0,1)
        //пишем: local real r = v.getlength() <= результат равен 1
        method getlength takes nothing returns real
            return SquareRoot(.x*.x+.y*.y+.z*.z)
        endmethod
        
        //Устанавливет длину вектора равным 1
        //Нормализация — приведение к единичному размеру; 
        //нормализация в трехмерном пространстве - по сути является масштабированием в куб единичного размера 
        //Для нормализации вектора нужно каждую компоненту поделить на длину вектора, или умножить инверсию длины на данный вектор.
        //V/|V| = (x/|V|, y/|V|, z/|V|) <= короче складываем кажду координату, больше вычислении нужно
        //set InvLength = 1/legth  <=инверсия, здесь меньше вычислении
        method normalize takes nothing returns nothing
            local real l = .getlength()
            if l>0 then
                call .realmul(1/l)
            endif
        endmethod   
        
        //Принимает число. Устанавливает длину вектора равной этому числу.
        //похожий метод у функции normalize
        //пишем: local vector v = vector.create(54,0,0)
        //пишем: call v.setlength(30) <= результат: вектор а равен 30 0 0
        method setlength takes real r returns nothing
            local real l = .getlength()
            if l>0 then
                call .realmul(r/l)
            endif
        endmethod
        
        //Принимает вектор. Возвращает число равное скалярному произведению этих векторов.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        // A*B = Ax*Bx + Ay*By + Az*Bz
        //используется часто для вычисления углов между векторами
        //пишем: local vector v = vector.create(1,2,3)
        //пишем: local vector w = vector.create(1,0,3)
        //пишем: local real r = v.scalarmul(w)
        //результат равен 10
        method scalarmul takes vector v returns real
            return .x*v.x+.y*v.y+.z*v.z
        endmethod
        
        //Принимает вектор. Устанавливает вызывающий вектор равным сумме самого себя и принятого вектора.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        // Bx= Ax+Bx, By= Ay+By, Bz = Az+Bz   <= изменяются параметры вектора B
        //пишем: local vector v = vector.create(1,2,3)
        //пишем: local vector w = vector.create(1,0,3)
        //пишем: local real r = v.vectoradd(w)
        //результат: вектор v равен 2 2 6, вектор w не изменился
        method vectoradd takes vector v returns nothing
            set .x=.x+v.x
            set .y=.y+v.y
            set .z=.z+v.z
        endmethod
        //аналогично как и метод vectoradd, только вычитывает
        method vectorsub takes vector v returns nothing
            set .x=.x-v.x
            set .y=.y-v.y
            set .z=.z-v.z
        endmethod
        
        //Принимает вектор. Устанавливает вызывающий вектор равным векторному произведению самого себя и принятого вектора.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        //Bx= (Ay*Bz - By*Az), By= (Az*Bx - Bz*Ax), Bz = (Ax*By - Bx*Ay)
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: local vector w = vector.create(0,1,0)
        //пишем: local real r = v.vectormul(w)
        //результат: вектор v равен 0 0 1, вектор w не изменился
        method vectormul takes vector v returns nothing
            local real x = .y*v.z-v.y*.z
            local real y = .z*v.x-v.z*.x
            local real z = .x*v.y-v.x*.y
            set .x = x
            set .y = y
            set .z = z
        endmethod
        
        //Принимает вектор. Возвращает вектор равный вызывающему.
        //Смысл: эта функция создает копию-вектор, который принимает те же значения что у оригинала
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: local vector w = vector.clone()
        //результат: вектор v равен 1 0 0, вектор w равен 1 0 0
        method clone takes nothing returns vector
            local vector v=vector.allocate()
            set v.x=.x
            set v.y=.y
            set v.z=.z
            return v
        endmethod      
        
        //Принимает вектор. Устанавливает значение вызывающего вектора равным принятому вектору.
        //В отличии от метода clone здесь не создается двойник, у нас уже имеется вектор. Не всегда имеет смысл создавать двойников
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: local vector w = vector.create(0,1,0)
        //пишем: call v.copy(w)
        //результат: вектор v равен 0 1 0, вектор w равен 0 1 0
        method copy takes vector p returns nothing
            set .x=p.x
            set .y=p.y
            set .z=p.z            
        endmethod
        
        //Принимает координаты x, y и z. Форсированное изменение координат вектора.
        //Изменяет текущий вектор.
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: call v.change(1,1,1)
        //результат: вектор v равен 1 1 1
        method change takes real x, real y, real z returns nothing
            set .x=x
            set .y=y
            set .z=z
        endmethod
        
        
        //Принимает вектор. Вычисляет угол между двумя векторами.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        //Вытекает из скалярного произведения AB*Cos(A)
        //CosA = AB/|A|*|B|, где AB = ax*bx + ay*by + az*bz и |A| = sqrt(ax*ax + ay*ay + az*az), |B| = sqrt(bx*bx + by*by + bz*bz)
        method AngleBetweenVectors takes vector b returns real //в радинах
            local real ab =.scalarmul(b)/(.getlength()*b.getlength())
            return ab
        endmethod
        method AngleBetweenVectors2 takes vector b returns real //в градусах
            local real ab =.scalarmul(b)/(.getlength()*b.getlength())
            return Acos(ab)
        endmethod
        
    endstruct    
    
endlibrary
скомпилированный код
globals
//globals from vectors:
constant boolean LIBRARY_vectors=true
//endglobals from vectors
    // Generated
trigger gg_trg_vectors= null


//JASSHelper struct globals:
constant integer si__vector=1
integer si__vector_F=0
integer si__vector_I=0
integer array si__vector_V
real array s__vector_x
real array s__vector_y
real array s__vector_z

endglobals


//Generated allocator of vector
function s__vector__allocate takes nothing returns integer
 local integer this=si__vector_F
    if (this!=0) then
        set si__vector_F=si__vector_V[this]
    else
        set si__vector_I=si__vector_I+1
        set this=si__vector_I
    endif
    if (this>8190) then
        return 0
    endif

    set si__vector_V[this]=-1
 return this
endfunction

//Generated destructor of vector
function s__vector_deallocate takes integer this returns nothing
    if this==null then
        return
    elseif (si__vector_V[this]!=-1) then
        return
    endif
    set si__vector_V[this]=si__vector_F
    set si__vector_F=this
endfunction

//library vectors:
    
        //Статичный метод создающий вектор, принимает координаты возвращает вектор. 
        //Вектор - отрезок AB, соединяющий из точки A в точку B. Вектор кроме того имеет направление. 
        //V = (x, y, z)  => казалось храним координаты точки, не совсем точно. Храним отрезок с направлением.
        //правильнее V = (Bx-Ax, By-Ay, Bz-Az)  => из конца вычитаем начало
        //эта функция создаем вектор. создается структура, короче выделяется место под массивы. максимум доступно 8190
        //прописываем: local vector v = vector.create(0,0,0) <= координаты
        function s__vector_create takes real x,real y,real z returns integer
            local integer v= s__vector__allocate()
            set s__vector_x[v]=x
            set s__vector_y[v]=y
            set s__vector_z[v]=z
            return v //<= возвращает на самом деле индекс, номер структуры
        endfunction

        //Умножает вектор на какое либо число.
        //V = V * r
        //если раскрыть: 
        //set v_x[this]=v_x[this] * r
        //set v_y[this]=v_y[this] * r
        //set v_z[this]=v_z[this] * r
        //пишем: local vector v = vector.create(1,1,1)
        //пишем: call v.realmul(2)  // <= результат вектор с координатами 2 2 2
        function s__vector_realmul takes integer this,real r returns nothing
            set s__vector_x[this]=s__vector_x[this] * r
            set s__vector_y[this]=s__vector_y[this] * r
            set s__vector_z[this]=s__vector_z[this] * r
        endfunction
        
        //Модуль вектора - метод возвращающий длину вектора (число всегда >0)
        //|V| = sqrt(x*x + y*y + z*z)
        //пишем: local vector v = vector.create(0,0,1)
        //пишем: local real r = v.getlength() <= результат равен 1
        function s__vector_getlength takes integer this returns real
            return SquareRoot(s__vector_x[this] * s__vector_x[this] + s__vector_y[this] * s__vector_y[this] + s__vector_z[this] * s__vector_z[this])
        endfunction
        
        //Устанавливет длину вектора равным 1
        //Нормализация — приведение к единичному размеру; 
        //нормализация в трехмерном пространстве - по сути является масштабированием в куб единичного размера 
        //Для нормализации вектора нужно каждую компоненту поделить на длину вектора, или умножить инверсию длины на данный вектор.
        //V/|V| = (x/|V|, y/|V|, z/|V|) <= короче складываем кажду координату, больше вычислении нужно
        //set InvLength = 1/legth  <=инверсия, здесь меньше вычислении
        function s__vector_normalize takes integer this returns nothing
            local real l= s__vector_getlength(this)
            if l > 0 then
                call s__vector_realmul(this,1 / l)
            endif
        endfunction   
        
        //Принимает число. Устанавливает длину вектора равной этому числу.
        //похожий метод у функции normalize
        //пишем: local vector v = vector.create(54,0,0)
        //пишем: call v.setlength(30) <= результат: вектор а равен 30 0 0
        function s__vector_setlength takes integer this,real r returns nothing
            local real l= s__vector_getlength(this)
            if l > 0 then
                call s__vector_realmul(this,r / l)
            endif
        endfunction
        
        //Принимает вектор. Возвращает число равное скалярному произведению этих векторов.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        // A*B = Ax*Bx + Ay*By + Az*Bz
        //используется часто для вычисления углов между векторами
        //пишем: local vector v = vector.create(1,2,3)
        //пишем: local vector w = vector.create(1,0,3)
        //пишем: local real r = v.scalarmul(w)
        //результат равен 10
        function s__vector_scalarmul takes integer this,integer v returns real
            return s__vector_x[this] * s__vector_x[v] + s__vector_y[this] * s__vector_y[v] + s__vector_z[this] * s__vector_z[v]
        endfunction
        
        //Принимает вектор. Устанавливает вызывающий вектор равным сумме самого себя и принятого вектора.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        // Bx= Ax+Bx, By= Ay+By, Bz = Az+Bz   <= изменяются параметры вектора B
        //пишем: local vector v = vector.create(1,2,3)
        //пишем: local vector w = vector.create(1,0,3)
        //пишем: local real r = v.vectoradd(w)
        //результат: вектор v равен 2 2 6, вектор w не изменился
        function s__vector_vectoradd takes integer this,integer v returns nothing
            set s__vector_x[this]=s__vector_x[this] + s__vector_x[v]
            set s__vector_y[this]=s__vector_y[this] + s__vector_y[v]
            set s__vector_z[this]=s__vector_z[this] + s__vector_z[v]
        endfunction
        //аналогично как и метод vectoradd, только вычитывает
        function s__vector_vectorsub takes integer this,integer v returns nothing
            set s__vector_x[this]=s__vector_x[this] - s__vector_x[v]
            set s__vector_y[this]=s__vector_y[this] - s__vector_y[v]
            set s__vector_z[this]=s__vector_z[this] - s__vector_z[v]
        endfunction
        
        //Принимает вектор. Устанавливает вызывающий вектор равным векторному произведению самого себя и принятого вектора.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        //Bx= (Ay*Bz - By*Az), By= (Az*Bx - Bz*Ax), Bz = (Ax*By - Bx*Ay)
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: local vector w = vector.create(0,1,0)
        //пишем: local real r = v.vectormul(w)
        //результат: вектор v равен 0 0 1, вектор w не изменился
        function s__vector_vectormul takes integer this,integer v returns nothing
            local real x= s__vector_y[this] * s__vector_z[v] - s__vector_y[v] * s__vector_z[this]
            local real y= s__vector_z[this] * s__vector_x[v] - s__vector_z[v] * s__vector_x[this]
            local real z= s__vector_x[this] * s__vector_y[v] - s__vector_x[v] * s__vector_y[this]
            set s__vector_x[this]=x
            set s__vector_y[this]=y
            set s__vector_z[this]=z
        endfunction
        
        //Принимает вектор. Возвращает вектор равный вызывающему.
        //Смысл: эта функция создает копию-вектор, который принимает те же значения что у оригинала
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: local vector w = vector.clone()
        //результат: вектор v равен 1 0 0, вектор w равен 1 0 0
        function s__vector_clone takes integer this returns integer
            local integer v=s__vector__allocate()
            set s__vector_x[v]=s__vector_x[this]
            set s__vector_y[v]=s__vector_y[this]
            set s__vector_z[v]=s__vector_z[this]
            return v
        endfunction      
        
        //Принимает вектор. Устанавливает значение вызывающего вектора равным принятому вектору.
        //В отличии от метода clone здесь не создается двойник, у нас уже имеется вектор. Не всегда имеет смысл создавать двойников
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: local vector w = vector.create(0,1,0)
        //пишем: call v.copy(w)
        //результат: вектор v равен 0 1 0, вектор w равен 0 1 0
        function s__vector_copy takes integer this,integer p returns nothing
            set s__vector_x[this]=s__vector_x[p]
            set s__vector_y[this]=s__vector_y[p]
            set s__vector_z[this]=s__vector_z[p]
        endfunction
        
        //Принимает координаты x, y и z. Форсированное изменение координат вектора.
        //Изменяет текущий вектор.
        //пишем: local vector v = vector.create(1,0,0)
        //пишем: call v.change(1,1,1)
        //результат: вектор v равен 1 1 1
        function s__vector_change takes integer this,real x,real y,real z returns nothing
            set s__vector_x[this]=x
            set s__vector_y[this]=y
            set s__vector_z[this]=z
        endfunction
        
        
        //Принимает вектор. Вычисляет угол между двумя векторами.
        //Пусть в этом методе A - первый вектор, B - второй вектор (не путайте, выше был предоставлен вектор AB, сейчас поменял обозначения)
        //Вытекает из скалярного произведения AB*Cos(A)
        //CosA = AB/|A|*|B|, где AB = ax*bx + ay*by + az*bz и |A| = sqrt(ax*ax + ay*ay + az*az), |B| = sqrt(bx*bx + by*by + bz*bz)
        function s__vector_AngleBetweenVectors takes integer this,integer b returns real
            local real ab=s__vector_scalarmul(this,b) / ( s__vector_getlength(this) * s__vector_getlength(b) )
            return ab
        endfunction
        function s__vector_AngleBetweenVectors2 takes integer this,integer b returns real
            local real ab=s__vector_scalarmul(this,b) / ( s__vector_getlength(this) * s__vector_getlength(b) )
            return Acos(ab)
        endfunction
        
    

//library vectors ends
//===========================================================================
// 
// Еще одна карта
// 
//   Warcraft III map script
//   Generated by the Warcraft III World Editor
//   Date: Sun Oct 21 23:52:07 2018
//   Map Author: Неизвестно
// 
//===========================================================================

//***************************************************************************
//*
//*  Global Variables
//*
//***************************************************************************


function InitGlobals takes nothing returns nothing
endfunction

//***************************************************************************
//*
//*  Triggers
//*
//***************************************************************************

//===========================================================================
// Trigger: vectors
//
// Инициализация стандартного режима сражения для всех игроков
//===========================================================================
//TESH.scrollpos=60
//TESH.alwaysfold=0


function InitCustomTriggers takes nothing returns nothing
    //Function not found: call InitTrig_vectors()
endfunction

//===========================================================================
function RunInitializationTriggers takes nothing returns nothing
    call ConditionalTriggerExecute(gg_trg_vectors)
endfunction

//***************************************************************************
//*
//*  Players
//*
//***************************************************************************

function InitCustomPlayerSlots takes nothing returns nothing

    // Player 0
    call SetPlayerStartLocation(Player(0), 0)
    call SetPlayerColor(Player(0), ConvertPlayerColor(0))
    call SetPlayerRacePreference(Player(0), RACE_PREF_HUMAN)
    call SetPlayerRaceSelectable(Player(0), true)
    call SetPlayerController(Player(0), MAP_CONTROL_USER)

endfunction

function InitCustomTeams takes nothing returns nothing
    // Force: TRIGSTR_002
    call SetPlayerTeam(Player(0), 0)

endfunction

//***************************************************************************
//*
//*  Main Initialization
//*
//***************************************************************************

//===========================================================================
function main takes nothing returns nothing
    call SetCameraBounds(- 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), - 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM))
    call SetDayNightModels("Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl")
    call NewSoundEnvironment("Default")
    call SetAmbientDaySound("LordaeronSummerDay")
    call SetAmbientNightSound("LordaeronSummerNight")
    call SetMapMusic("Music", true, 0)
    call InitBlizzard()

call ExecuteFunc("jasshelper__initstructs15269843")

    call InitGlobals()
    call InitCustomTriggers()
    call ConditionalTriggerExecute(gg_trg_vectors) // INLINED!!

endfunction

//***************************************************************************
//*
//*  Map Configuration
//*
//***************************************************************************

function config takes nothing returns nothing
    call SetMapName("Еще одна карта")
    call SetMapDescription("Описание отсутствует")
    call SetPlayers(1)
    call SetTeams(1)
    call SetGamePlacement(MAP_PLACEMENT_USE_MAP_SETTINGS)

    call DefineStartLocation(0, 1792.0, - 1728.0)

    // Player setup
    call InitCustomPlayerSlots()
    call SetPlayerSlotAvailable(Player(0), MAP_CONTROL_USER)
    call InitGenericPlayerSlots()
endfunction




//Struct method generated initializers/callers:

function jasshelper__initstructs15269843 takes nothing returns nothing


endfunction
this - номер массива. работаем с двумя значениями.
сравни
Загруженные файлы
27

» WarCraft 3 / Блокираторы пути (расширенные возможности)

Maniac_91:
Ещё с текстурой пути 1х1 было бы здорово. Но, к сожалению, я не знаю способа, как заставить объекты с такой текстурой пути правильно устанавливаться на сетке карты.
мб это не относится к этому, пробовал строительство текстуры 2х2 pi. пробовал тоже не получалось меньше чем 4x4 pi, скажем этот 2х2 квадратик. ставился как бы криво. Мб не рассчитан или что. я сделал по другому - брал текстуру 4х4. в ней рисовал нужные розовым посередине 2х2, а края черными - тогда норм ставился.
здесь это наверное не к месту.
Загруженные файлы
27

» WarCraft 3 / thistype и струкруты

скомпилируй код. и можно достать j-файл, открыть блокнотом и посмотреть как сделан. обычно эти все this номера массивов
27

» XGM Team / XGM после анонса ремастера

не знаю, можно ли мне тут написать волнующий вопрос написать
раскрыть
а вы читали статьи по моделям? чтобы самому что-то сделать. для полного нуба было не очень понятно. знаете, я когда открывал mdlvis пробовал выделять точки, и прочее, я действительно не понял как сдвигать. но понял это позже.
я понял что это сложнее чем кажется, здесь нужны навыки скульптора и художника. можно попробовать, но у меня практики нет. я пробовал поискать видеоуроки на все модели-редакторы. не нашел. они такие короткие и простые (как пример прилепить картинку, как оторвать/отодвинуть кость), но я бы не назвал это видеоуроком (все равно в башке возникает вопрос а если хочу изменить текстуру, то как этот слои натягивают, вроде текстуру открывал мне мдлвис окошко с крит ошибкой выдает, откроет это и все. Редактировать это не могу. или хочу больше знать про частицы или про интерполяцию, но мне же не дают ответы. мне не понятно. неизвестно как анимации создавать, в статье раз 10 читал = не понял про эти кости. как вершины туда заносятся). еще не хватает редактору модели "вернуть действие на шаг назад", часто не хватает его, разрушишь что-то и обратно не вернешь.
понятно, я полез дальше в 3дмах зачем-то. видеоуроки для нуба смотрю. и там сижу. но мне не хватает практики
27

» WarCraft 3 / Blizzcon: Анонсирован WarCraft III Reforged (remaster)

LongbowMan, мне не жалко денег. во-первых только во что выльется игра и сам редактор. во-вторых, просто я столько времени потратил на карту. задействовал мем хак+ новые модели. с выходом патчей или модом, просто лишусь. или буду делать на старом патче. я просто хочу большее. а близзард не дадут большее. чувствую. очень медленно нативки добавляются
тем более предыдущие патчи не очень то и радовали новвоведением.
27

» WarCraft 3 / Blizzcon: Анонсирован WarCraft III Reforged (remaster)

Komkozavr, ну вов не считается для меня продолжением. он мертв
к тому же вселенная для меня не понятна, знаю ее из истории вкр3, а не вов
27

» WarCraft 3 / Blizzcon: Анонсирован WarCraft III Reforged (remaster)

ну как? обещают новый интерфейс, новые модельки, редактор (что в него добавят то?), новые кампании кто-то намекнул что будут (будут ли). ты птшешь лучше сделали кампании, я пишу длинными
27

» WarCraft 3 / Blizzcon: Анонсирован WarCraft III Reforged (remaster)

UrsaBoss, длинные кампании типа как рексар. и редактор продвинутый
у меня вот собирается кучу моделей. текстуры и модели старые останутся или как?
27

» WarCraft 3 / Rawcode To String

PT153, ну попробуй
\" - в коде обозначают двумя знаками, при компиляции будет выглядеть как ". эти два знака означают кавычки ", иначе вар ругает (это если вписать в строку " " " тк эти кавычки открывает строку, и их нужно закрыть. Не впишешь норм в "<строку>" так ' <число>' эти кавычки)
\' - эти два знака должны означать ' , в строку норм вписывается знак " ' ", а вот как число попробуй через слэш ' \' ', или пиши сразу 39
'\\', так как при компиляции у вас будет '\'
27

» WarCraft 3 / Rawcode To String

PT153, выше система FellGuard не учитывает пробелы, и знаки препинания (точнее не прописали в базу как точка, запятая и другие).
например в базе должны быть указаны
set sOutput[' '] = " " //32 dec
set sOutput['!'] = "!" //33 dec
set sOutput['.'] = "." //46 dec
например, пробел не прописан. Значит вернет null.

пробел = 32 dec = 0x20 hex
'I00 ' = 1227894816 dec = 0x49303020 hex
калькулятор можно проверить
тема варкрафт 3 сам составляет порядок равкодов. и ни разу не видел чтобы ставил таких символы (препинания, и пробелы). это может создать трудности при каких-то расчетах. Но можно самим вставить эти знаки при создании объекта.
27

» WarCraft 3 / Мифический Filter

PT153, просто мне пишет: Cannot convert codere turns boolean to boolexpr
ну это понятно, главное вернуть boolean (условие), ааа у тебя filter ничего не возвращает (nothing) как это возможно. Но мне пишет одну и ту же ошибку, что нельзя конверкнуть в ...
ладно забейте. не так важно это
27

» WarCraft 3 / Мифический Filter

Принятый ответ
ну это условие. отличие в том, что с помощью этих фильтров можно отсеивать не нужных юнитов, игроков, итемов, декорации. даже в регистре событии можно указать на каких-юнитов не может срабатывать. вот пример, вы выбираете через нативку EnumGroup юнитов, и вам нужно отсеять не нужных юнитов, и подобрать нужных. Например, нужно вражеский герой:
function A takes nothing returns boolean
return IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) and IsUnitEnemy(GetFilterUnit(), Player(0))
endfunction
local boolexpr b = Condition(function A)
call GroupEnumUnitsInRange(g, x, y, 900, b)
в группу добавляются только герои. тут с логическими условиями работать надо, составляя конструкции (условие 1) и/или (условие 2). Например, нужно вражеский герои либо здание. и так далее
хотя здесь фильтр и условие ничем не отличаются. когда юниты добавляются в группу через GroupEnumUnitsInRange, тут стоит фильтр. Если вернет true пропускает, а false отсеивает, удаляет. Здесь точно также как условие триггера
событие - активировал абилу
условие - id абилы == "..." <= точно также
раньше почему думал что там цикл. что берет всю группу перебирает всех и фильтрует. это не точно. это самый настоящий фильтр.