Комментарии проекта WarCraft 3
7

Удаление 6 лет работы с сайта, авторское право.

» WarCraft 3
Многие модели WOTR (War of the Ring) автора HerrDave были удалены из сайта www.hiveworkshop.com по причине того, что они используют текстуры из оригинальной игры.

Читать далее...
Araders #1 - 19 минут назад 2
GetLocalPlayer, Ну это уже в принципе уже вершина того как можно растянуть это понятие. Тем более самым важным качеством любого творчества является что нельзя построить свой стиль не воруя идеи или определенные фишки у других, так или иначе твои принципы будут построены на наблюдения за другими авторами или изучении их работ.
GetLocalPlayer #2 - 3 часа назад 4
Дело в том что заработок на чужом труде может быть трактован очень широко, вплоть до невозможности создать сайт не ущемив чьих-либо прав. Самое простое - сайт зарабатывает на рекламе; сайт привлекает посетителей контентом; контент не является оригинальным (фанарт); контент основан на чужой интеллектуальной собственности; вывод - сайт зарабатывает на чужой интеллектуальной собственности нарушая авторские права.
konvan5 #3 - 4 часа назад 2
Rare:
У меня мнение простое: если на твоём продукте никто не зарабатывает без договора с тобой, то пусть используют, сколько захотят. Какая разница? А модели для варкрафта - это явно не то, на чём кто-либо заработать может.
Именно! Поэтому и странно, что предрассудки доминируют над разумом и логикой.
Rare #4 - 5 часов назад 5
У меня мнение простое: если на твоём продукте никто не зарабатывает без договора с тобой, то пусть используют, сколько захотят. Какая разница? А модели для варкрафта - это явно не то, на чём кто-либо заработать может.
DracoL1ch #5 - 6 часов назад 4
нинтендо с тобой несогласны, GetLocalPlayer
европейцы прикрывают свою жопу и правы в этом, никогда не знаешь, что взбредет в голову умалишенным, у которых есть твои контакты
GetLocalPlayer #6 - 7 часов назад 9
Все вопросы авторского права сводятся к деньгам, если автор и сайт никак не извлекали выгоду из изготовления или размещения данных моделей, то и проблем никаких не должно было быть.
Hate #7 - 8 часов назад 4
здесь насколько я знаю над этим вопросом никто не запаривается
на самом деле не думаю что кто то в своем уме бы подавал в суд за использование текстур из других игр. только если замешана личная неприязнь. ибо если рассматривать с другой стороны - рипнутые текстуры являются контекстной рекламой, так что нужно быть не в своем уме что бы стрелять себе же в ногу
что до хайва, то они опасаются за свою шкуру превентивно (что соответствует европейским понятиям), а не на практике (как обычно происходит в снг)
прикреплены файлы
prog #5 - 28 минут назад 0
а как прикрепить к weapon эффекта другой эффект
О как меня переклинило то - был уверен что видел в нативках такую возможность, а вот фиг, нет такого, только к виджету прикрутить можно, но виджеты это юниты, разрушаемый декор и предметы.
Bergi_Bear #6 - 37 минут назад 2
prog, спасибо, есть контакт =)
prog #7 - 41 минуту назад 2
Bergi_Bear, файл должен быть .lua чтобы vscode его понимал как lua и включал подсветку и плагины.
Bergi_Bear #8 - 44 минуты назад 0
NazarPunk, вот пытаюсь чутка код поковырять, вроде всё правильно установил
мне хотя бы 2-3 цвета и было бы норм, вообще сплошной монолит
прикреплены файлы
GetLocalPlayer #9 - 1 час назад 0
как прикрепить к weapon эффекта другой эффект? И как получить модель юнита?
Никак
NazarPunk:
И как проиграть анимацию эффекта?
Выше написал же функцию.
NazarPunk #10 - 2 часа назад (отредактировано ) 0
GetLocalPlayer, а как прикрепить к weapon эффекта другой эффект? И как получить модель юнита?

И как проиграть анимацию эффекта?
GetLocalPlayer #11 - 4 часа назад 0
А как проиграть нужную анимацию эффекта с нужной скоростью?
BlzPlaySpecialEffect
BlzSetSpecialEffectTimeScale
prog #12 - 5 часов назад 0
Только первый вызов должен быть после инициализации.
Справедливо только для глобальных функций и переменных, а для локальных порядок важен.
NazarPunk #13 - 9 часов назад (отредактировано ) 0
Причем не важно где Jump объявлена, хоть вначале хоть в конце кода?
Да. Я же приводил пример:
TimerStart(CreateTimer(), 0, false, function()
    test() --> test  
end)

function test()
    test1()
end
function test1()
    print('test')
end

Только первый вызов должен быть после инициализации.
Bergi_Bear #14 - 9 часов назад 0
А как сделать чтобы функцию Jump можно было использовать в других триггерах? просто убрать local?
Да
Причем не важно где Jump объявлена, хоть вначале хоть в конце кода? Кажись про это неоднократно говорилось уже, но я так и не до конца понял
NazarPunk #15 - 9 часов назад 2
новый таймер на отдельную иллюзию верно же?
Да, решил не переусложнять.
А как сделать чтобы функцию Jump можно было использовать в других триггерах? просто убрать local?
Да
А все эти прыжки адекватно реагируют на склон/глубокую воду?
Из-за того, что у юнита не убран угол крена, на склонах немного подёргивается. Как допилят SetUserField, зафиксится.
Bergi_Bear #16 - 10 часов назад 0
NazarPunk, новый таймер на отдельную иллюзию верно же?
А как сделать чтобы функцию Jump можно было использовать в других триггерах? просто убрать local?
А все эти прыжки адекватно реагируют на склон/глубокую воду?
NazarPunk #17 - 10 часов назад (отредактировано ) 0
если можно с тем-же успехом все через эффекты сделать в 1.31
А как проиграть нужную анимацию эффекта с нужной скоростью?
Bergi_Bear #18 - 10 часов назад 0
prog, так то да, если к аттачу weapon эффекта можно еще 1 эффект приципить, я вообще забыл про манипуляции с эффектами
1

Иконки героев союзников слева

» WarCraft 3
Как сделать, чтобы в карте у игроков иконки героев союзников отображались слева, можно было смотреть их способности и видеть состояние их перезарядки, но при этом нельзя было ими управлять?
Bergi_Bear #1 - 3 часа назад 0
Чтобы смотреть состояние способностей, как в 1 доте нужен дотахелпер, мемхак и AllySkillViewer. и не управлять....
А чтобы героя появились слева и ими управлять, это полный триггерный контроль, смотри на гуи в категории игрок => установка союза
1696

Заклинания на заказ

» WarCraft 3
Если вы хотели бы использовать в своей карте нестандартное, оригинальное заклинание, но у вас не хватает знаний для его реализации, то эта тема специально для вас. В данной теме вы можете оставить заявку на создание необходимого вам заклинания.

Читать далее...
PT153 #1696 - 4 часа назад (отредактировано ) 1
NazarPunk, Так тут даже MUI не надо.

Заклинание готово!

Заказчик: Zikok247
Способность: Сила воли
Выполнено: Да

Копируем способность, в настройках редактора ставим галку "Создавать неизвестные переменные", копируем триггеры из категории Regen, убеждаемся, что значения созданных переменных совпадают со значениями на скриншоте.
прикреплены файлы
27

Самый производительный Bullet Hell

» WarCraft 3
Вопрос, какая система снарядов будет наиболее производительной?
Хочу рассмотреть вообще абсолютно все варианты, под Bullet Hell я имею ввиду стадию босса когда миллион снарядов летит от 1 или нескольких источников и игрок должен уклоняться от всего этого месива.

Какие я знаю варианты:

  1. Дефолтный скилл рексара стадо ящериц, он там проблемы с углом поворота и настройками в целом, самый примитивный но норм
  2. Система снарядов:
  • 1 таймер на движение всех снарядов
  • перебор группы в которой ищется враг вокруг снаряда в определённом радиусе
  1. Система снарядов для 1 игрока
  • тот же перебор таймером
  • но столкновение определяется через IsunitInrange (снаряд, наш герой)
  1. Система снарядов + аура жара (мой фаворит):
  • снаряды снова летят на таймере
  • в качестве столкновения используется событие получения урона 131 патча, сами же снаряды излучают жар преисподни (постоянный)
  1. Медленные волны силы/ тёмные стаи:
  • 1 дамми кастует заклинание в указанную точку
  • к сожелению период урона в таком случае странный и снаряд не будет умирать при столкновении с героем

Читать далее...
DracoL1ch #11 - 6 часов назад 0
ну да, это самая быстрая конструкция при входных условиях, что нам содержимое группы нигде не нужно, а все действия над ними нужно выполнить лишь 1 раз
PT153 #12 - 7 часов назад 0
Bergi_Bear, я общий вариант писал.
Bergi_Bear #13 - 7 часов назад 0
PT153, почти нет =) группу же лучше глобальную одну и туже 1 раз создать и просто наполнять её, уж локальная группа точно лишнее
PT153 #14 - 7 часов назад (отредактировано ) 0
Почти как ты и сделал.
function f takes something returns something
    local group g = CreateGroup()
    local unit u
    // ...
    call GroupEnumUnitsInRange(g, x, y, 80, null)
    loop  
        set u = FirstOfGroup(g)
        exitwhen u == null
        call GroupRemoveUnit(g, u)
        // ACTIONS
    endloop
    call DestroyGroup(g)
    set g = null
    // ...
endfunction
Bergi_Bear #15 - 7 часов назад 0
DracoL1ch, напиши как надо конструкцию в 2019 писать
PT153, а то, случайно попало =)
PT153 #16 - 7 часов назад 0
Bergi_Bear, он про обнуление в самом конце, оно бесполезно.
Bergi_Bear #17 - 7 часов назад 0
e==null - условие выхода из цикла, значит группа пуста, иначе он будет бесконечно гонять loop , что вызовет дикий лаг на пару секунд
PT153 #18 - 7 часов назад 0
DracoL1ch, то есть вообще не юзать фильтры?
DracoL1ch #19 - 7 часов назад 2
зачем ты пишешь e==null , если оно всегда будет нулл в итоге?
фильтр ни разу не быстрее и требует создание потока для каждого юнита, поэтому все китайцы и перешли на null - firstOfGroup, где это возможно
Bergi_Bear #20 - 7 часов назад 0
а мы не будет использовать урон и вешать какой либо бафф, важен лишь факт соприкосновения, первый тик, после этого дамми снаряд будет уничтожен
DracoL1ch, но ведь если в фильтре гонять будет бытрее?
лично я использую да тот самый
» loop-firstOfGroup
call GroupEnumUnitsInRange(perebor,x,y,80,null)
loop  
set e=FirstOfGroup(perebor)
exitwhen e==null 

//ACTIONS

call GroupRemoveUnit(perebor,e)
set e=null
endloop
DracoL1ch, не помню чтобы балиста била насквозь =(, но это бы очень подошло
quq_CCCP:
Юнитов в качестве снарядов лучше не юзать, большая нагрузка на движок. Юзайте даммика который стреляет по площади или по цели.
точно не подойдёт, визуально может быть и да, но с таким снарядом не столкнуться заранее
DracoL1ch #21 - 8 часов назад 2
нет, для оптимизации групп нужно не использовать фильтр (ставить нулл), а перебирать её через loop-firstOfGroup
жар преисподней будет оптимальнее с той точки зрения, что он собирает группы по заданным критериям целей без подключения жасс-машины. Однако он же будет тратить время на создание, вручение, уборку бафа и анимаций урона, создание объектов нанесения урона, а также саму работу абилки на даммике. Короче, и так, и так тяжело будет.
а в игре разве не было баллист, которые стреляют по прямой и снаряд разрушается при соприкосновении с первой целью?
quq_CCCP #22 - 8 часов назад 1
Юнитов в качестве снарядов лучше не юзать, большая нагрузка на движок. Юзайте даммика который стреляет по площади или по цели.
Bergi_Bear #23 - 8 часов назад 0
JackFastGame, это и собираемся выяснить, ещё не тестировалось особо, но жар перебирает юнитов движком игры, а не таймером+группой
Maniac_91, точно я забыл просто как называется =)
Maniac_91 #24 - 8 часов назад 0
Тогда уж "bullet hell" будет правильно )
PT153 #25 - 8 часов назад (отредактировано ) 0
Мой опыт показывает, что GroupEnumUnitsInRange() показывает себя лучше, меньше лагов.
Это логично хотя бы по той причине, что скорее всего жар и GroupEnumUnitsInRange() ищут юнитов вокруг одинаковым способом, но жар ещё и урон наносит.
Для оптимизации, кол-во юнитов вокруг можно считать в фильтре GroupEnumUnitsInRange(), а в группу ничего не добавлять.
JackFastGame #26 - 8 часов назад 0
А как вы выяснили, что Жар Преисподней оптимальный по производительности вариант? Каким алгоритмом игра ищет юнитов вокруг ауры?
DracoL1ch #27 - 8 часов назад 0
я давным-давно пытался скилл тинкера на гоблинов закодить, лагает жутко, на двух кастах юнит уже ходить не может - предел двигаемых юнитов за одного игрока. В новых патчах лимит подняли, там зависать не должно. А еще в новых можно на эффектах, но коллизии самостоятельно регистрировать нужно как-то. Очевидно, что узкое место будет именно это.
1

Событие на выход игрока

» WarCraft 3
Триггер выхода игрока перестаёт реагировать на выход игрока p, если сделать так.
call SetPlayerState(p, PLAYER_STATE_GAME_RESULT, some_value)
Повторная регистрация события для игрока p не помогает.
Как это исправить?
XGM Bot #1 - 7 часов назад 0
Похожие вопросы:

» ответ
Вам сюда, господин хороший. Там есть ответы, практически, на все ваши вопросы.
» ответ
Стандартными средствами — нельзя. Такие функции есть в подключаемых библиотеках, например Reinventing the Craft, но они будут работать только у тех, кто эти библиотеки установил в свой Варкрафт.

4

Свойства декорации

» WarCraft 3
Не могу найти что надо поставить чтобы менять масштаб разрушаемой декорации по каждой оси отдельно? Неужели нельзя?
И ещё кто знает за что отвечают те 3 пункта вверху на скрине?
PT153 #1 - 7 часов назад 0
Proshel_Doty, у тебя ру версия.
Proshel_Doty #2 - 7 часов назад 0
PT153:
ля а как у тебя там норм написано, а у меня нет
PT153 #3 - 8 часов назад (отредактировано ) 1
Не могу найти что надо поставить чтобы менять масштаб разрушаемой декорации по каждой оси отдельно?
Разрушаемые объекты никак, декорации можно.
И ещё кто знает за что отвечают те 3 пункта вверху на скрине?
прикреплены файлы
XGM Bot #4 - 8 часов назад 0
Похожие вопросы:

» ответ
Кароче берешь декорацию и ставишь на земю и смотриш, какое пространство карты путей она блокирует, Можно взять несколько, создаешь новые декорации на основе блокираторов пути, но текстуры пути у них удаляешь, втыкаешь их на нужные места, сохраняешь карту, после берешь и редактируешь эти самые декорации устанавливая им нужную текстуру пути, как у тех декораций которые подходят по размеру чтобы заткнуть дыру.

6

как создать свой GetUnitUserData

» WarCraft 3
мне нужно создать свой GetUnitUserData потому что GetUnitUserData уже занет другим
NazarPunk #2 - 9 часов назад 2
и тут нет метода delete, он потерялся =)
Метод create тоже потерялся)
А на lua всё ещё проще)
respect_gg #3 - 9 часов назад 2
library UnitDataBase

    globals
		UNITDATA array UnitData
	endglobals


	struct UNITDATA
		private static integer count = 0
		private integer id
		private unit unitId

		real    critical_chance
        real    critical_power
        real    miss_chance
        real    evade_chance
        real    spell_resist
        real    physical_resist
        real    spell_damage
        real    physical_damage
        boolean can_absorb
        boolean stun_immune
        real    heal_bonus
        boolean armor_ignore
        boolean damage_immune
        boolean is_bubled
        real cast_speed
	
    static method Create takes unit u, real cc, real cp, real mc, real ec, real sr, real pr, real sd, real pd, boolean ca, boolean si, real hb returns UNITDATA
        local UNITDATA this = .allocate()
        set .id = .count
        set .count = .count + 1
        set UnitData[.id] = this
        set .unitId = u
        set .critical_chance = cc
        set .critical_power = cp
        set .miss_chance = mc
        set .evade_chance = ec
        set .spell_resist = sr
        set .physical_resist = pr
        set .spell_damage = sd
        set .physical_damage = pd
        set .can_absorb = ca
        set .stun_immune = si
        set .heal_bonus = hb
        set .armor_ignore = false
        set .damage_immune = false
        set .is_bubled = false
        set .cast_speed = 0.00
        return this
    endmethod
    
    method operator setCriticalChance= takes real i returns nothing
        set .critical_chance = .critical_chance + i
    endmethod
    
    method operator getCriticalChance takes nothing returns real
        return .critical_chance
    endmethod
    
    method operator setCriticalPower= takes real i returns nothing
        set .critical_power = .critical_power
    endmethod
    
    method operator getCriticalPower takes nothing returns real
        return .critical_power
    endmethod
    
    method operator setMissChance= takes real i returns nothing
        set .miss_chance = .miss_chance + i
    endmethod
    
    method operator getMissChance takes nothing returns real
        return .miss_chance
    endmethod
    
    method operator setEvadeChance= takes real i returns nothing
        set .evade_chance = .evade_chance + i
    endmethod
    
    method operator getEvadeChance takes nothing returns real
        return .evade_chance
    endmethod
    
    method operator setSpellResist= takes real i returns nothing
        set .spell_resist = .spell_resist + (i/100.00)
    endmethod
    
    method operator getSpellResist takes nothing returns real
        return .spell_resist
    endmethod
    
    method operator setPhysicalResist= takes real i returns nothing
        set .physical_resist = .physical_resist + (i/100.00)
    endmethod
    
    method operator getPhysicalResist takes nothing returns real
        return .physical_resist
    endmethod
    
    method operator setSpellDamage= takes real i returns nothing
        set .spell_damage = .spell_damage + (i/100.00)
    endmethod
    
    method operator getSpellDamage takes nothing returns real
        return .spell_damage
    endmethod
    
    method operator setPhysicalDamage= takes real i returns nothing
        set .physical_damage = .physical_damage + (i/100.00)
    endmethod
    
    method operator getPhysicalDamage takes nothing returns real
        return .physical_damage
    endmethod
    
    method operator setAbsorbStatus= takes boolean i returns nothing
        set .can_absorb = i
    endmethod
    
    method operator getAbsorbStatus takes nothing returns boolean
        return .can_absorb
    endmethod
    
    method operator setStunImmune= takes boolean i returns nothing
        set .stun_immune = i
    endmethod
    
    method operator getStunImmune takes nothing returns boolean
        return .stun_immune
    endmethod
    
    method operator setHealBonus= takes real i returns nothing
        set .heal_bonus = .heal_bonus + (i/100.00)
    endmethod
    
    method operator getHealBonus takes nothing returns real
        return .heal_bonus
    endmethod
    
    method operator setArmorIgnore= takes boolean i returns nothing
        set .armor_ignore = i
    endmethod
    
    method operator getArmorIgnore takes nothing returns boolean
        return .armor_ignore
    endmethod
    
    method operator setDamageImmune= takes boolean i returns nothing
        set .damage_immune = i
    endmethod
    
    method operator getDamageImmune takes nothing returns boolean
        return .damage_immune
    endmethod
    
    method operator setBubled= takes boolean i returns nothing
        set .is_bubled = i
    endmethod
    
    method operator getBubled takes nothing returns boolean
        return .is_bubled
    endmethod
    
    method operator setCastSpeed= takes real i returns nothing
        set .cast_speed = .cast_speed + i
    endmethod
    
    method operator getCastSpeed takes nothing returns real
        return .cast_speed
    endmethod
        
    static method GetData takes unit u returns UNITDATA
        local integer i = .count - 1
        loop
            exitwhen i < 0
            if UnitData[i].unitId == u then
                return UnitData[i]
            endif
            set i = i - 1
        endloop
        return 0
    endmethod

    method Destroy takes nothing returns nothing
	    set .count = .count -  1
	    set UnitData[.id] = UnitData[.count]
	    set UnitData[.id].id = .id
	    call .destroy()
    endmethod

    endstruct

endlibrary
когда то так делал.
Bergi_Bear #4 - 9 часов назад (отредактировано ) 0
Нужно вызвать специалиста по структурам? но код примерно такой будет:
struct AB
int userdata1
int userdata2
int userdataN
endstruct

function ACTIONS takes nothing returns nothing
int total
AB u=AB.create()
u.userdata1=5
u.userdata2=6
total=u.userdata1+u.userdata2 // =>11 вроде всё работает так-то
endfunction
P.s. я не спец по структурам
и тут нет метода delete, он потерялся =)
NazarPunk #5 - 9 часов назад 0
Bergi_Bear, к структуре же id юнита привязать нужно через таблицы или использовать unit indexer.
local CustomUnitData u = GetUnitUserData(GetTriggerUnit())
u.data1 = 'data1'
u.data2 = 'data2'
Bergi_Bear #6 - 9 часов назад 0
или структуры, тока не помню уже как точно там но код будет вида "unit.userdata1"
На крайняк можно под юзердату использовать некие поля из РО, смотря какой патч, если 126 и нужно хранить в юзердате к примеру родную броню юнита, то можно поместить броню в GetunitCostGold (в золотостоимость), разумеется если она не используется, но тогда рпидётся делать много манипуляций с РО, смотря для чего в общем, вариантов решения крайне много и смотря какой патч