27

» Администрация XGM / Нарушена подсветка lua

ScorpioT1000, ок понял. Тут сильно изменили сайт. Теперь непривычно. Нажимаешь на ник, и тебя перенаправляют на профиль, вместо ответа. Раньше это было цитирование всего сообщения, боялся этой кнопки как огня
27

» Администрация XGM / Нарушена подсветка lua

Круто))
Кстати почему вот здесь подсветка не работает?
function InterLineLine(x1,y1,x2,y2,a1,b1,a2,b2)
    local p = (x2-x1)*(b2-b1)-(y2-y1)*(a2-a1)
    local x,y

    if ( p == 0 ) then --отрезки параллельны
        return false
    end

    x =  ((x2-x1)*(a2-a1)*(y1-b1)+(x2-x1)*(b2-b1)*a1-(y2-y1)*(a2-a1)*x1)/p
    y = -((y2-y1)*(b2-b1)*(x1-a1)+(y2-y1)*(a2-a1)*b1-(x2-x1)*(b2-b1)*y1)/p
    return x,y
end
function IsPointOnBeam2(x,y,x1,y1,x2,y2)
	return ((x-x1)*(y2-y1) == (x2-x1)*(y-y1)) and ((x-x1) * (x2-x1) >= 0) and ((y-y1)*(y2-y1) >= 0)
end

function IsPointInSegment(x,y,x1,y1,x2,y2)
	return((x1-x)^2+(y1-y)^2)^0.5 + ((x2-x)^2+(y2-y)^2)^0.5 == ((x2-x1)^2+(y2-y1)^2)^0.5 
end

function RayIntersectSegment(rayx,rayy,dirx,diry,x1,y1,x2,y2)
	--находим точку пересечения прямых
	local x,y=InterLineLine(rayx,rayy,dirx,diry,x1,y1,x2,y2)
	
	if x then
		--проверка, что точка пересечения на отрезке, и принадлежит лучу
		return IsPointInSegment(x,y,x1,y1,x2,y2)and IsPointOnBeam2(x,y,rayx,rayy,dirx,diry)
	else
		--иначе, если прямые не пересекаются, то точки пересечения нет.
		--если луч и отрезок лежат на одной линии
		return IsPointOnBeam2(x1,y1,rayx,rayy,dirx,diry) and IsPointOnBeam2(x2,y2,rayx,rayy,dirx,diry)
	end
	
	return false
end
print('p1=1: '..tostring(RayIntersectSegment(0,0,0,1,100,0,-100,0))..' луч направлен вверх, луч пересекает горизонтальный отрезок') 
print('p1=0: '..tostring(RayIntersectSegment(0,0,0,1,100,-1,-100,-1))..' луч направлен вверх, луч не пересекает горизонтальный отрезок, расположенный ниже'')

Ок понял😅

ScorpioT1000, ок понял. Тут сильно изменили сайт. Теперь непривычно. Нажимаешь на ник, и тебя перенаправляют на профиль, вместо ответа. Раньше это было цитирование всего сообщения, боялся этой кнопки как огня
27

» WarCraft 3 / Кривая Безье

ScorpioT1000, я просто векторы не понимаю. Я думал там точки. Ладно, это тема исчерпана, тк я сейчас не за компом
27

» WarCraft 3 / Кривая Безье

Можно притяжение всех пеонов к звезде, только в 3d. Прежставим себе галактику. И все пеоны притягиваются к звезде, вращаясь хаотично, как молекулы газа. Пеоны друг от друга бьются еще, ударясь, вращаясь. и звезда растет при вхождении пеона в нее
27

» WarCraft 3 / Кривая Безье

Соглашусь с выше мнением. У Скорпа есть библиотека, но ей очень сложна воспользоваться из за очень непонятных параметров

Берги, давай)) сальтухи пеоны еаучатся делать красивые при разбеге
27

» Администрация XGM / Нарушена подсветка lua

Я понял, там не предусмотрены точка с запятой. Вообще, в луа редко это юзают
Ну юзается, не юзается, просто смотрится не красиво. Нельхя ли спереть стиль у какого нибудь редактора, типа vs code
27

» WarCraft 3 / Не пустая клетка.

Тут просто различные манипуляции.
Если нужно посадить героя в клетку, то нужно его заблочить, скрыть и сделать неуязвимым (мало ли что). Аналогично с крипом, если это какой уникум. Но обычных юнитов можно было удалить, и позже пересоздать, это проще всего делается, тк юнит от этого ничего не теряет (ни предметы, ни статы, выученные скилы - нету ничего из этого, то все ок). Но вдруг, этот юнит обладает важными предметами, или изменяли ему базовые урон/защиту/скорость и пр поэтому из за этих условии юнита тоже как и героя скрываем.
27

» Администрация XGM / Нарушена подсветка lua

Я еще c++ скидывал. Но там наверн отдельная история, мб вы не предусматривали на этом языке. Программа что может анализировать на ком языке пишут?

ScorpioT1000, можно было библиотеку оуа подсвечивать. Типа math.cos или math.sin. Тут получается math.cos
27

» Администрация XGM / Нарушена подсветка lua

--Угол между 2 векторами, угол между направлениями этих векторов (наименьший угол).
--По определению, угол между двумя векторами находится в промежутке [0°; 180°].
--Косинус угла между ними равен
--@param real dx1,dy1,dx2,dy2
---@return real
function AngleBetweenTwoVectors(dx1,dy1,dx2,dy2) --в радианах (для превращения в градусы заверните в Acos)
    return math.acos((dx1*dx2+dy1*dy2)/((dx1^2+dy1^2)^0.5  * (dx2^2+dy2^2)^0.5))
end

--Угол между двумя отрезками
function BlzAngleBetweenSegments(Ax1,Ay1,Ax2,Ay2,Bx1,By1,Bx2,By2)
    local dx1,dx2,dy1,dy2=Ax2-Ax1,Bx2-Bx1,Ay2-Ay1,By2-By1
    return AngleBetweenTwoVectors(dx1,dy1,dx2,dy2)

end
--угол между диагоналями четырехугольника/сторонами треугольника и пр
--cx,cy - точка пересечения диагоналей A и B
--Ax,Ay,Bx,By - одна из крайних точек диагоналей
function BlzAngleBetweenDiagonals(cx,cy,Ax,Ay,Bx,By)
    local dx1,dx2,dy1,dy2=Ax-cx,Bx-cx,Ay-cy,By-cy --4 опер
    return AngleBetweenTwoVectors(dx1,dy1,dx2,dy2)
end

Что то весь текст монотонной подсветкой изукрашен, почти весь код белым штрифтом. Почему комменты не закрашиваются зеленьким или сереньким? Можно было ключевые слова local return и др подсвечивать, не белым

--угол лежит между двумя углами
function IsAngleBetweenAngles(angle,angle1,angle2)
	N = angle%360 --normalize angles to be 1-360 degrees
	a = angle1%360
	b = angle2%360

	if (a < b)then
		return a <= N and N <= b;
	else
		return a <= N or N <= b;
	end
end

print(IsAngleBetweenAngles(150, 80, 320)) --=> true
print(IsAngleBetweenAngles(30, 80, 320)) --=> false
print(IsAngleBetweenAngles(340, 80, 320)) --=> false
print(IsAngleBetweenAngles(140, 0, 160)) --=> true
print(IsAngleBetweenAngles(180, 0, 160)) --=> false
print(IsAngleBetweenAngles(1, 0, 360)) --=> true
Пример где значок процента %, в луа это модуль, это странный стиль. Заметил, что ключевые слова, цифры и пр при слтином писании кода очень не красиво получается, какая то часть строчки резко выделяется на фоне остального
Или тут
function ascii2decimal(str)
    str = string.reverse(str)
    local result = 0
    local pw = 1
    for i=1, #str do
        local c = str:sub(i,i)
        result = result + string.byte(c)*pw
        pw = pw*256
    end
    return result
end

function area(x1,y1,x2,y2,x3,y3)
	return (x2-x1) * (y3-y1) - (y2-y1) * (x3-x1);
end
 
function intersect_1 (a,b,c,d)
	if (a > b)then a,b=b,a end
	if (c > d)then c,d=d,c end
	return math.max(a,c) <= math.min(b,d);
end
 
function intersect(x1,y1,x2,y2,x3,y3,x4,y4)
	return intersect_1 (x1, x2, x3, x4)
		and intersect_1 (y1, y2, y3, y4)
		and area(x1,y1,x2,y2,x3,y3) * area(x1,y1,x2,y2,x4,y4) <= 0
		and area(x3,y3,x4,y4,x1,y1) * area(x3,y3,x4,y4,x2,y2) <= 0;
end

Ниже я заметил странность, что ключевые слова как if then почему то голубым светом отсвечивается. Ошибка или нет это
function InterLineLine(x1,y1,x2,y2,a1,b1,a2,b2)
    local p = (x2-x1)*(b2-b1)-(y2-y1)*(a2-a1)
    local x,y

    if ( p == 0 ) then --отрезки параллельны
        return false
    end

    x =  ((x2-x1)*(a2-a1)*(y1-b1)+(x2-x1)*(b2-b1)*a1-(y2-y1)*(a2-a1)*x1)/p
    y = -((y2-y1)*(b2-b1)*(x1-a1)+(y2-y1)*(a2-a1)*b1-(x2-x1)*(b2-b1)*y1)/p
    return x,y
end
function IsPointOnBeam2(x,y,x1,y1,x2,y2)
	return ((x-x1)*(y2-y1) == (x2-x1)*(y-y1)) and ((x-x1) * (x2-x1) >= 0) and ((y-y1)*(y2-y1) >= 0)
end

function IsPointInSegment(x,y,x1,y1,x2,y2)
	return((x1-x)^2+(y1-y)^2)^0.5 + ((x2-x)^2+(y2-y)^2)^0.5 == ((x2-x1)^2+(y2-y1)^2)^0.5 
end

function RayIntersectSegment(rayx,rayy,dirx,diry,x1,y1,x2,y2)
	--находим точку пересечения прямых
	local x,y=InterLineLine(rayx,rayy,dirx,diry,x1,y1,x2,y2)
	
	if x then
		--проверка, что точка пересечения на отрезке, и принадлежит лучу
		return IsPointInSegment(x,y,x1,y1,x2,y2)and IsPointOnBeam2(x,y,rayx,rayy,dirx,diry)
	else
		--иначе, если прямые не пересекаются, то точки пересечения нет.
		--если луч и отрезок лежат на одной линии
		return IsPointOnBeam2(x1,y1,rayx,rayy,dirx,diry) and IsPointOnBeam2(x2,y2,rayx,rayy,dirx,diry)
	end
	
	return false
end
print('p1=1: '..tostring(RayIntersectSegment(0,0,0,1,100,0,-100,0))..' луч направлен вверх, луч пересекает горизонтальный отрезок') 
print('p1=0: '..tostring(RayIntersectSegment(0,0,0,1,100,-1,-100,-1))..' луч направлен вверх, луч не пересекает горизонтальный отрезок, расположенный ниже'')

function LinesIntersect(a1,b1,c1, a2,b2,c2)
	local x = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
	local y = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
	return x,y
end
print(LinesIntersect(1, 1, -1, 1, -1, 0))

function kramer(a1,b1,c1,a2,b2,c2)
  local d = a1 * b2 - a2 * b1;
  local dx = c1 * b2 - c2 * b1;
  local dy = a1 * c2 - a2 * c1;
  local x,y = dx / d, dy / d;
  return x,y
end

Кстати, я заметил, что вы убрали вездел внутри спойлеров внутренние спойлеров. Раскрыв их. Но это не везде такое. Кое где это осталось без изменении, и внутри спойлеров можно сохранить спойлеры. Как это получилось))

call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 0)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 1)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 2)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON,3)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 4)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 5)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 6)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 7)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 8)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 9)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 10)), FALSE)
call BlzFrameSetVisible(BlzFrameGetParent(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 11)), FALSE)
27

» WarCraft 3 / Зачем создавать юнитов триггерно, а не через редактор?

В карте Impossible Missions Squad все юниты создаются триггерно, но зачем?
Какой-то глупый вопрос. Все крипы создаются кодом, или ты хочешь заранее расставить их на карте? Тут по-любому придеться создавать через триггер.
Я не знаю, что это за карта, но если автор расставляет юнитов на карте с нуля кодом, мб есть какая-то причина. Я пока не знаю зачем так делать, и не вижу смысла, если я о том, о чем подумал. Но внутри карты все равно кодом программа расставляет всех юнитов на карте, зачем еще и триггерами усложнять.
Но судя по скринам наверн какой-то нуб.
Лучше использовать координаты, а не точку point.
27

» WarCraft 3 / Несколько способностей в одной

А зачем тебе ловить получение способности? Да такого ивента нет, но это легко исправляется. Ты же не часто меняешь абилу герою? Поэтому нужно конкретные ивенты
Тут надо ловить повышение геройской способности. => даем или повышаем скиллы
Или получение итема => можно дать
Или юнит входит в игру, при сохдании => даем скилл
Если ты сам меняешь, то легко кодом исправить. Поэтому проблемой никонда не было в условиях ограниченности
Или можно ujapi там уже есть небось такие ивенты
27

» WarCraft 3 / Несколько способностей в одной

О, очередной доходяга.пока все отходят от пьянки, Мрачный Ворон дает ответ
Как повышать уровни способностей, которые в самом спеллбуке?
Я уже давно не использовал спеллбук. Но предлагаю 2 варианта:
  1. сделать способности многоуровневыми, и триггерно поднимать уровень абилок.
  2. подменять спеллбуки с содержимым внутри
Спеллбук - активная способность, а у меня две пассивки. Как сделать способность некликабельной?
Спеллбук можно скрыть, заблокировав его. Тогда как эффекты пассивок остаются рабочими. Это я тоде забыл немного

Не активной книгу заклинании трудно сделать, только поставить пустышку, а сам спеллбук скрвть
27

» Рецепториум / Праздничная Индейка

Джерри Смит постоянно готовил индейку для всей семьи по рецепту Пувера
27

» WarCraft 3 / Способность требующая золото

Самое простое решение это использовать ujapi.
Если нет, не устраивает этот вариант, тогда выбираем сложный вариант. Ибо надо много чего сделать. Ну смотри, делаем это так:
Заметка: можно было взять готовую не-целевую способность, но вызывы абилки не всегда удобны: нажатие сразу вызывают каст, а по идее должно вызвать прицел. Поэтому я бы отошел от абилки, и сделал бы на фреймах, но тут очень много надо работы сделать.
  1. делаем обычную кнопку
  2. изучаем как сделать tooltip (подсказку для кнопки). Можно научиться и делать с ресурсами. Смотрим пример
Все пустышка готова, нужно внести еще и штрихи.
  1. кнопка должна появляться когда юнит выделен, верно? Иначе, кнопка так и будет висеть на экране. Для этого нужно сделать проверку. Вот здесь показано как выследить какой юнит выбран
  2. ну, и последнее. Нужно как-то вызвать прицел. К сожалению, в рефе нет возможности менять прицелы, подсвечивать и пр. А тем более вызвать напрямую прицел. Есть один способ, но не очень приятен. Использовать хоткей (hotkey, горячую кнопку). Почему это не хороший способ? Он не очень удобный, и требует еще лишних махинации. нужно, чтобы иконка способности была видима, иначе хоткей не работает, нельзя скрывать ее никаким образом. Единственный вариант, который нашелся - это мы должны будем перетащить кнопку за пределы экрана, так кнопка все еще считается "видимой" для игры, но мы не видим эту настоящую способность. и только тогда можно форсить хоткей игроком прицел. Что и сделал в примере с инвентарем
Проще все это сделать было бы в ujapi. Все, до свидания. С вами был Мрачный Ворон!
27

» WarCraft 3 / Определение хоста карты

PROSHELDOTU, другой вопрос как сделать, чтобы хост не мог сменить клан в ячейке. Как только создал игру, то все выбирать не смог бы.
27

» WarCraft 3 / Как использовать boolean variable в Хэш таблице.

jasonrus96, проверяй дебагом типа
if LoadBoolean(Hash,GetHandleId(t),0) then 
    Вывести текст на экран "да"
else
    Вывести текст на экран "нет"
endif
Либо сохраняй integer (целое число, типа 1=да, 0=нет)
native SaveInteger takes hashtable table, integer parentKey, integer childKey, integer value returns nothing
native LoadInteger takes hashtable table, integer parentKey, integer childKey returns integer
И проверяй. Тут числа конвентируешь в строку и выводишь на экран
Вывести число I2S(LoadInteger(Hash,GetHandleId(t),0)) 
Если надо проверить на истину, делаешь сравнение
if LoadInteger(Hash,GetHandleId(t),0)==1 then endif