Вот я тоже интересовался этим, но у меня проблема наоборот в отображении нужных элементов. Когда скрываешь основной интерфейс, исчезает все! Остается лишь панель управления, если применить :
То исчезает и панель управления
После всего этого пытался отобразить кнопки Меню, Логи, Союзники и Задания по отдельности с помощью
set ppp=BlzGetOriginFrame(ORIGIN_FRAME_SYSTEM_BUTTON,0)
call BlzFrameSetVisible(ppp,true)
Но оно не отображало...затем попробовал
set ppp=BlzGetFrameByName("UpperButtonBarMenuButton",0)
call BlzFrameSetVisible(ppp,true)
И оно отобразило все четыре элемента меню, но мне это не надо...
Почему нельзя просто убрать все эти противные рамочки-картиночки и оставить/удалить/переместить все как надо, почему опять все через одно место...
Либо я дурак, либо это все кривое...Уже 2 день сижу и пытаюсь сделать одно и то же и все через одно место, то одно то другое...короче я х3
Всё нормально, мне надо чтобы пропал интерфейс и твои первые две нативки нормально работают!
Вот, что вышло, на скорую руку
код
do
local trg = CreateTrigger()
TriggerRegisterTimerEventSingle(trg, 0.0)
--
TriggerAddAction(trg, function()
local max = 11
local frame = {}
for i = 0, max do
frame[i] = BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON,i)
BlzFrameClearAllPoints(frame[i])
--BJDebugMsg(I2S(i))
end
BlzFrameSetAbsPoint(frame[0], FRAMEPOINT_CENTER, 0.3, 0.1)
for j = 1, max do
BlzFrameSetPoint(frame[j], FRAMEPOINT_CENTER, frame[j-1], FRAMEPOINT_CENTER, 0.04, 0.0)
--BJDebugMsg(I2S(j))
end
BJDebugMsg("Interface")
end)
end
Как понять выбрать?
Смотря, что тебе сделать надо.
Можно циклом, а если в событие на обычных триггерах, то просто много событий с разными игроками и указываешь триггерного игрока.
Там и перезапись инта есть.
Сохраняешь инт со значением 25. Таймер запускаешь с периодом в одну секунду, каждую итерацию перезаписываешь инт как: инт - 1. Проверяем условием, что инт > 1, если нет, то останавливаем таймер, удаляем, чистим хэш, если да, то твои действия. Например вывод этого инта на экран.
Как вариант, раз вы не паузите юнита, он может заагриться на кого-то и проигрываемая вами анимация сбросится на анимацию атаки.
Он и правую кнопку в землю нажать может и всё сбросится.
Я уже решил проблему ускорением и новым таймером, хотя всё равно смотрится так себе, но работает.
Анимация вращения "как у акса" но была с названием "spell, slam" поэтому не мог её к вихрю прикрутить.
Ты сначала подумай, как тебе определить "Конец битвы"?
А остальное легко. Выбираешь всех юнтов в области по твоему условию и передаешь нужному игроку.
Во втором случае тебе нужно счетчик завести и как только он станет равен нулю отдать(создать) отряд.
Есть событие когда игрок отправляет сообщение в чат.
Если сообщение то, что надо то кикаем.
И зачем такие заморочки, когда можно заставить человека на слоте выиграть\проиграть?
И что в итоге делает спел?
Ну вот что-то на подобие того, что ты описал.
Если хочешь, чтобы сюрикены наносили урон когда летят добавь дамикам жар феникса.
В гугле. Это общая концепция программирования. Суть проста - каждый экземпляр какого-то типа хранит в себе ссылку на предыдущий экземпляр этого типа и на следующий (в твоем примере это массивы next и prev), таким образом позволяя пройтись по всем экземплярам этого типа. Но в показанном тобой коде реализация стремная, поскольку использование статичных массивов в виде
set next[prev[this]] = next[this]
set prev[next[this]] = prev[this]
это просто избыток. Если next и prev изменить из массва в обычные атрибуты, работа алгоритма не изменится, но код станет на много проще.
Код воскрешает юнита через некоторое время после его смерти. Для этого нужен таймер. Но вместо того чтобы создавать новый таймер для каждого экземпляра структуры, автор создал 1 общий таймер, а в экземплярах хранит оставшееся время до воскрешения юнита, отнимая 1 через каждую секунду работы общего таймера. Так себе подход.
Я просто хотел туда потом еще добавить изменение строки в борде. Чтобы было видно сколько осталось до воскрешения.
Да и воскрешение я просто так сделал. Мне в основном интересно как работает конструкция с next и prev. Steal nerves:
пример векторов 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 - номер массива. работаем с двумя значениями.
сравни
Т.е по сути каждый я вызываю метод create, а конкретно allocator, то уже работает как next и prev в моем примере, ну и deallocate?
сохраняешь на героя переменную, в которой считаешь угол поворота
каждые 0.03 увеличиваешь эту переменную на скорость поворота в градусах * 0.03, и перемещаешь юнита в
x = x героя + cos угла * радиус
y = y героя + sin угла * радиус
для больше одного даммика еще нужно добавлять к углу 360 градусов * номер даммика / число даммиков
Снова туплю, не понимаю как угол поворота посчитать
Cos и Sin чего?
» WarCraft 3 / Замена иконки Во время игры
» WarCraft 3 / Как спрятать интерфейс?
Castiel: Всё нормально, мне надо чтобы пропал интерфейс и твои первые две нативки нормально работают!
Вот, что вышло, на скорую руку
local trg = CreateTrigger()
TriggerRegisterTimerEventSingle(trg, 0.0)
--
TriggerAddAction(trg, function()
local max = 11
BlzHideOriginFrames(true)
BlzFrameSetAllPoints(BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0),BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0))
for i = 0, max do
frame[i] = BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON,i)
BlzFrameClearAllPoints(frame[i])
--BJDebugMsg(I2S(i))
end
BlzFrameSetAbsPoint(frame[0], FRAMEPOINT_CENTER, 0.3, 0.1)
for j = 1, max do
BlzFrameSetPoint(frame[j], FRAMEPOINT_CENTER, frame[j-1], FRAMEPOINT_CENTER, 0.04, 0.0)
--BJDebugMsg(I2S(j))
end
BJDebugMsg("Interface")
end)
end
» WarCraft 3 / Как сделать дамаг каждые 20секунд определённым юнитам
» WarCraft 3 / Нид хелп по триггерам - спавн/движение
Всё что связано с AoS'ми смотри в Open Dota'е.
» WarCraft 3 / как в 1,30 теперь можно подрубить mpq свой?
И если мод под сингл, то тем более не понимаю зачем тебе mpq.
» WarCraft 3 / Загрузка ресурсов и наработок на сайт
Где просак?
» WarCraft 3 / Рандомные герои
Тебе нужен -random как в доте? Или что-то другое?
Ред. noyl
» WarCraft 3 / Как выбрать в триггере всех игроков?
Смотря, что тебе сделать надо.
Можно циклом, а если в событие на обычных триггерах, то просто много событий с разными игроками и указываешь триггерного игрока.
» WarCraft 3 / День/ночь
Делаешь его разрушаемым объектом и играешь анимацию смерти ночью и анимацию станд днем.
» WarCraft 3 / Обратный отсчет на джассе
Сохраняешь инт со значением 25. Таймер запускаешь с периодом в одну секунду, каждую итерацию перезаписываешь инт как: инт - 1. Проверяем условием, что инт > 1, если нет, то останавливаем таймер, удаляем, чистим хэш, если да, то твои действия. Например вывод этого инта на экран.
Ред. noyl
» WarCraft 3 / Камера с видоам сзади
» WarCraft 3 / Как заставить юнита играть анимацию во время движения?
Я уже решил проблему ускорением и новым таймером, хотя всё равно смотрится так себе, но работает.
Анимация вращения "как у акса" но была с названием "spell, slam" поэтому не мог её к вихрю прикрутить.
» WarCraft 3 / Как заставить юнита играть анимацию во время движения?
» WarCraft 3 / Вопрос про эффекты в варкрафте
Ред. noyl
» WarCraft 3 / Области и триггеры... ещё юниты...
А остальное легко. Выбираешь всех юнтов в области по твоему условию и передаешь нужному игроку.
Во втором случае тебе нужно счетчик завести и как только он станет равен нулю отдать(создать) отряд.
» WarCraft 3 / Поворот dummy к цели
» WarCraft 3 / Kick func
Если сообщение то, что надо то кикаем.
И зачем такие заморочки, когда можно заставить человека на слоте выиграть\проиграть?
» WarCraft 3 / Проблема с триггером.
Столько хороших статей написано чтобы JASS начать учить!
» WarCraft 3 / Два диска, один с противоположной стороны
Ну вот что-то на подобие того, что ты описал.
Если хочешь, чтобы сюрикены наносили урон когда летят добавь дамикам жар феникса.
» WarCraft 3 / thistype и струкруты
» WarCraft 3 / thistype и струкруты
Да и воскрешение я просто так сделал. Мне в основном интересно как работает конструкция с next и prev.
Steal nerves: Т.е по сути каждый я вызываю метод create, а конкретно allocator, то уже работает как next и prev в моем примере, ну и deallocate?
» WarCraft 3 / thistype и струкруты
GetLocalPlayer:
Да вроде всё вполне понятно.
С thistype и this разобрался.
» WarCraft 3 / Пассивная способность с перезарядкой и манакостом
» XGM Team / Приветствуем новую Администрацию
Картавый(дрей) пытался до последнего.
Ред. noyl
» WarCraft 3 / Скорость дамми юнита
Cos и Sin чего?