0
27
3 дня назад
Отредактирован MpW
0

» WarCraft 3 / Как сделать лимит улучшений?

Логически можно додуматься. пишешь триггер с проверкой:
С: Юнит - завершает исследование
У: завершаемое исследование - "технология 1" or (или) завершенное исследование - "технология 2"
Д: (нужно будет проверить, что исследование достигла максимума)
Возможно, тут нужна будет делать задержку, я точно не знаю, как работает триггер
If тек уровень "тех 1" == макс уровень "тех 1" and (И) тек уровень "тех 2" == макс уровень "тех 2" then
Действие - запретить исследование "технология 3"
end
У меня нет возможности потыкать вар, и надо вам самим посмотреть в триггервх в действиях в разделе игрок или технология. Мб там с уровнем поинрать. Попробуй обнулить, или -1 поставить. Должно быть какое то действие
Вот вам нашел пример

2
27
1 неделю назад
2

» WarCraft 3 / Как отследить чей игрок убил юнита

KillingUnit - убийца
DyingUnit - умирающий
TriggerUnit - юнит, запустивший триггер. Т.е. в событии "юнит умирает" ссылается на умирающего.
Так, что вывод: TriggerUnit не равно KillingUnit, KillingUnit - убийца.
Можно сравнивать игроков, т.е. влвдельцев:
Владелец убийцы не равно влвделец умирающего
Владелец триггер юнит - это ТриггерИгрок
Еще в булеан можно посмотреть функции, типа яаляется ли этот игрок врагом для умирающего
0
27
1 неделю назад
Отредактирован MpW
0

» WarCraft 3 / Массив в магазине.

BlzGetFrameByName(name, createContext)
Все равно это тоже надо будет циклом перебирать BlzGetTriggerFrame() с BlzGetFrameByName(name, 1-15), если говорить про рефордж
1
27
1 неделю назад
Отредактирован MpW
1

» WarCraft 3 / Массив в магазине.

Не совсем понял ваш вопрос, что выхотите сделать. Внимательно раз 4-5 вчитал.
Вот небольшой кусок кода с кнопкой и функцией клика по кнопке с покупкой предмета, как?
код я посмотрел, он убер простой. Ничего сверхсложного логически, и уникального нн увидел. Однако, я не увидел никакой связи с магазином и итемами. У вас udg_Item хранят только от одного итема? Фреймы отображаются при выделении магазина? Сколько у вас магазинов? Один?
можно сделать массив примерно на 15 предметов чтоб не создавать функцию клика для каждой кнопки c выдачей заранее подготовленного предмета.
Видимо, у вас возникла проблема как структурировать всю эту базу данных информации. Так чего же вы не создали 15 итемов, и не показали.
Ладно. Примерно понял. Функцию клика можно не плодить, достаточно на всех 1 функции, просто будут разные триггеры запускаться.
Вот вы циклом создаете 15 кнопок fr[1-15], 15 триггеров tr[1-15]. Потом в функции click нужно перебрать какая кнопка нажата (индекс вытащить), а это можно сравнивать в действии, т.е. в функции click
  1. либо вызванный фрейм BlzGetTriggerFrame() перебираем с 15 фреймами fr
  2. либо запущенный триггер GetTriggeringTrigger() перебираем с 15 триггерами tr

Еще у вас проблема может с фреймовыми событиями, на один триггер можно записать 1 событие фрейма. Иначе, я замечал, что событие не работало. Возможна, я ошибаюсь. Но мне кащалось, что ивент просто перезаписывался на последний фрейм, и работало только у него. Вы сейчас пытались накинуть на 1 триггер 15 ивентов для разных фреймов, или что? Поэтому я вот для каждого фрейма создаю свой триггер. Это главное правило - создавать для каждого фрейма свой триггер
0
27
1 неделю назад
Отредактирован MpW
0

» WarCraft 3 / Не могу придумать, как сделать ракетный залп - залпом

Можно в интернете набрать поиск ракетный залп. На хайве или где-нибудь. Да можно найти.
Идиотский способ - использовать даймик-касты, лучше реализовать свою систему движения снарядов.
0
27
1 неделю назад
0

» WarCraft 3 / Ледяное дыхание

Видимо, это сшито в движок. А часть настроек отображено в константах. Пример, можно редактировать скорость (смотреть) , а вот как время, тут наверное, ничего не поделаешь.
0
27
1 неделю назад
Отредактирован MpW
0

» WarCraft 3 / пассивная способность "кража маны" при атаке

EugeAl, вы намеренно даете ложный ответ? "событие - юнит атакован" реагирует в начале замаха, и тут можно сломать эту систему.
Как это работает. Юнит таргется на цель, и начинает производить атаку, т.е. начинает производить анимацию атаки, и только после нее начнется дамаг. У юнитов с дистанционной ренж атаки еще нужно прождать, когда снаряд долетит, если, конечно, долетит. И после должен выйти дамаг.
До вснх этих моментов есть еще уклонение, промахи и др вещи, когда до цели дамаг не дойдет.
Событие "юнит атакован" предвищает, что юнит начинает атаку, вернее начнет атаку через 0.00 сек здесь криво перевели мысль. Тут игрок может отдать приказ на цель, и ткт же отменить, отдав другой
1
27
2 недели назад
Отредактирован MpW
1

» WarCraft 3 / Как вывести таймер в таблицу

У каждого таймера есть 3 времени:
  • TimerGetRemaining(timer). Оставшееся время таймера, сколько осталось времени до завершения. Счетчик времени уменьшается. По истечении будет == 0.0.
  • TimerGetElapsed(timer). Истекшееся время таймера. Сколько прошло времени, счетчик увеличивает хажанное время.
  • TimerGetTimeout(timer) - заданное время таймера. на сколько запущен таймер (заданное значение не меняется, короче)
Это все функции есть в триггерах, можете в любое время узнать сколько времени, и эти три реальных числа, надо преобразовать из выбранных в нужную строку. При этом важно, чтобы таймер был запущен.
Есть проблема, в том, что счетчик отображает не как время, а как счетчик секунд (вообще можно и микросекунды, но не об этом речь). Если допустим прошло 120 сек, он тебе не отобразит, что прошло 2 мин. Нужно будет самому делать систему времени. Типа часы/минуты/секунды, тут все выражено секундами в таймере. Пример, можно запустить одноразовый таймер от начала игры с 99999999 сек, и от него узнавать текущее время/пройденное и оставшее выраженные в секундах. Это как одна из задач.
Обычно, в таких системах ежесекудно обновляют время, и обновляют строку в таблице. Заводим, периодический таймер, который будет каждую 1 сек тикать. И счетчики часов hour, минут min, секунд sec
//Каждую 1 секунду
set sec=sec+1
if sec >= 60 then
    set sec=0
    set min=min+1
    if min >= 60 then
        set min = 0
        set hour = hour + 1
        if hour >= 24 then
            set hour = 0
        endif
    endif
endif
1
27
2 недели назад
Отредактирован MpW
1

» WarCraft 3 / способность "защитная аура"

Введи поиск dummy-unit. Тут есть статьи как делать dummy-unit.
xgm.guru/p/wc3/dummy на код пока не смотрите
dummy-unit не только бывает невидимый, бывало и визуально из него делали снаряды, эффекты, и двигали по координатам. Поскольку в патче 1.26 варкрафт был очень ограниченным, нам дали спецэффекты, но не было функции по перемещению. Вместо этого приходилось задавать модельку эффекта юниту, и перемещали, проигрывали анимации и пр.
0
27
2 недели назад
0

» Администрация XGM / XGM предлагает проиграть однокадровые гифки

Makeba, помню, что жаловалось, что гифки без конца проигрывали анимации, и подлагивало.. наверное из-за этого
0
27
2 недели назад
Отредактирован MpW
0

» WarCraft 3 / Ломается система динамичной цены найма юнита

Данная система даёт сбой если юнит типа пехотинец был в очереде а денег не хватает
То есть я могу бесконечно нанимать их даже при не хватки денег. Есть идеи как решить?
Ну, ивент "начинает подготовку юнита". Это отслеживаем, когда начинается обучение юнита. А отследить последующих в очереди не удаться, только с помощью приказа, когда нанимаете бойца, бараки получают приказ. Приказ, еще можно отменить. Помню как то делал. Поищи приказ "отмена", не путай с приказом "стоп". При проверке, если у игрока нет ресурсов, то отдавай баракам приказ отмены, и последний в очереди отменяется. Если я там помню

0
27
2 недели назад
Отредактирован MpW
0

» WarCraft 3 / Ломается система динамичной цены найма юнита

nazarpunk,
Я так понял, что бесплатные юниты не с проста, тк у автора собственная система ценника. Задай ему фиксированную цену в ро, и игрок не всегда сможет купить даже за скидку, и юнит не появится в бараках. Вот реализовал, точнее, это еще полдело, тк ивент триггера ловит только обучение, а не заказ всех юнитов в казарму. Надо с ивентом приказа для бараков ловить очередь. а теперь, он не может придумать как ограничить наем. Я предлагаю просто приказом отмены из очереди баракам удалять, если не прошел требование по ресурсам
0
27
2 недели назад
Отредактирован MpW
0

» WarCraft 3 / Ломается система динамичной цены найма юнита

Изменить никак стандартным способом. Не помню, можно ли изменять в рефоге цены, тк там тоже завезли функции, и если да, как там работает.
Можно либо фреймами, либо ujapi
Фреймы на рефордже: Ты просто переделываешь стандартный интерфейс, и меняешь кнопки. Но это большая работа, но я уже разжевал для новых верущих, все что остается практика. Ах, да там требует понимание хотя бы jass. Я что то в гуи не находил ни ивентов, ни команд, когда начинал. Это уже сейчас ввели. Хотч, если честно, может большой работы и не потребуется, написать какой-нибудь костыль, и визуально прикрыть дефолтный тултип с ценником, но заморачиваться не хочется
ujapi : сейчас там больше функции, и активно поаолняется. Возможно, там вам не нужно будет изучать фреймы, достаточно будет изменить цены напрямую, если нет, к автору. Тут тоже надо jass изучать
1
27
2 недели назад
Отредактирован MpW
1

» WarCraft 3 / Воскрешение ломает счетчик юнита/цену юнита

Ну, что вас всех триггерит на одни и те же вопросы. Попробуйте перебрать все события, и выводить на экран имена кастера/сумонера/сумона
Посмотрите здесь все способности с призывами, здесь подробно описал каждый скилл, и каким ивентом можно это отследить
Есть события - юнит призывает. Ивент замечателен тем, что ловит не только призыв, но и воскрешение. Однако, не все абилки призыва можно словить, вроде ульту рыцаря смерти.
Есть событие - юнит входит в область (игровая карта). Можно ловить приход новых юнитов. Правда, надо отсеивать, иногда москитов тролля ловит.
Есть событие - юнит получает приказ. Интересно, суммоны вроде ульты рыцаря смерти могут ли получать приказы. Можно попробовать отслеживать изменение каких то данных
Еще была абилка Adef ее надо попробовать проверить на воскрешение. Там абилка дает приказы даже трупам. Пример разъяснения работы я вот не помню, когда юнит воскрешает получает ли приказ
0
27
2 недели назад
0

» Администрация XGM / Ошибка при заходе

У меня мобильник дохлый, хром. Хром обновляется
Драйвера андроид какие то обновляет.

Мб память телефона перегружена.. после перезагрузке все нормально работает
0
27
2 недели назад
Отредактирован MpW
0

» WarCraft 3 / GetLocalPlayer()

nazarpunk, тут знаешь, дело в знаниях и опыте, на них будет строится твоя уверенность. Ты же не сможешь разбить в пух и прах аргументом чужой без определенных знании. Вторая причина, что ты можешь внести туда? Методичка должна быть какую то информацию новую. Тут Док все кратко рассказал, мне даже, нечего добавить.
Выше я писал, что хотел привести уйма тестов с примерами с мультибордом, спецэффектом, юнитом итд. Разобрать всякие часто встречаемые ошибки (загуглить на хгм все темы с десихронамм), придумать какие нибудь локальные фишки вроде примера Дока про мафию выше, где каждый локально видит граждана, что-нибудь такое-придумать. мб можна какие то данные юнита подергать.
Если честно, у меня не было энтузиазма делать тесты, чтобы написать статью подобие фреймам. У меня нет понимания как работает, но есть знание то, чего не надо делать. По фреймам это не моя работа, я ее украл с хайва, перевел, и потом что то добавил, улучшил, переделал
Самое главное, что фишка статей, это можно рассказать, но не показать. Пример карты "мафия" каждый локально видит своего граждана, но есть определенное НО. Подводные камни, если будут сравнивать типы, и др данные юнита, у меня просто может вылетить?
0
27
2 недели назад
Отредактирован MpW
0

» Администрация XGM / Приглашение

Потому, что приглОтить?
пригласить, приглушить, придушить, проглотить
0
27
2 недели назад
Отредактирован MpW
0

» WarCraft 3 / Задания в редакторе отобразить определенным игрокам

кстати, а Get Local Player можно ли сохранять в глобалку на старте игры, чтобы не вызывать команду каждый раз?
Можно. Я так когда то делал. Без проблем. Заводил глобалку на старте и писал GetLocalPlayer = GetLocalPlayer()
Вдруг там движок сравнивает значения одинаковых переменных по всем игрокам в сетевой игре, и выдаёт десинк при несоответствии
Такое логически невозможна. Значение в глобалке у каждого игрока на своей машине будет свое. Пример глобалка GetLocalPlayer у красного хранит значение, что он локальный игрок, у синего GetLocalPlayer будет показывать что он.
Можно еще локально узнвть номер локального игрока, и его брать.
Хотя, мне без разницы. Позже я отказался от глобалок. Я на фреймах кстати хранил данные квждого игрока локально в массивах
На самом деле, я не специалист по десинхам, тк у меня карты нк доходили до этапа мульплеерной игры. Но вот часто тестил, и ни разу не бывало десинхов, а если бывали, то я устранял. Нужно знать как правильнее делать или устранять
0
27
3 недели назад
Отредактирован MpW
0

» Таверна "Ржавое колесо" / Сочный и нежный шашлык! Доступный маринад! Рецепт!

У нас еще пасха впереди друг

Куличи к чаю
0
27
3 недели назад
0

» WarCraft 3 / Задания в редакторе отобразить определенным игрокам

nazarpunk, информацию надо в статью дока
0
27
3 недели назад
0

» WarCraft 3 / Задания в редакторе отобразить определенным игрокам

Вам поможет эта статья
Эта команда GetLocalPlayer() дает узнать, какая машина является локальной. Если ты играешь за красного игрока, у тебя покажет, что ты локальный игрок. Если твой сосед играет за синего, у него отображается, что синий это локальный, а не красный. У каждой машины будет свой игрок.
В начале игры или в какой то момент игры (не обязательно со старта) ты создаешь для всех общее задание, и скрываешь. Статья учит, что нельзя создать локально данные, иначе это будет плохо. Я вот не знаю, как с квестами, можно ли их локально создавать, ведь это относится к части интерфейса, а там все локально можно сделать.
Можно проверить у каких игроков (допустим красный и синий), локальная машина, и добавить/изменить задание.
if GetLocalPlayer() == Красный ИЛИ GetLocalPlayer() == Синий then
Показать квест
end
1
27
3 недели назад
Отредактирован MpW
1

» WarCraft 3 / Не скрываются Tooltip-фреймы

Я немного не понял ваш вопрос.
Сначала я думал, что вам нужно скрыть дефолт тултип
Как скрыть / убрать дефолтный tooltip
Посмотрел, и понял в чем проблема. Вы кажется использовали пример 1 на backdrop
У StatIconPlayer1 (backdrop) не может быть подсказок, ни событии, это особый фрейм с изобрвжением. Чтобы у этого фрейма была какая реакция, сверху на этом фрейме создают пустышку StatFramePlayer1 (FRAME), тип frame можно накинуть tooltip, мы как раз и прикрепляем подсказку
BlzFrameSetTooltip(StatFramePlayer1,StatTextPlayer1)
Чтобы отключить показ подсказки, достаточно выключить StatFramePlayer1 (frame), а вы прячете иконку StatIconPlayer1 (см. код ниже), с этого ничего не будет. сам фрейм-виновник SetFramePlayer1 невидим, но еще существует, его то и надо выключить.
BlzFrameSetSize(BlzGetFrameByName("StatIconPlayer1",0),0,0)

Теперь надо понять почему у вас текст не меняетс

Возможно потому что дело в этом
call BlzFrameSetText(BlzGetFrameByName("BoxedTextValue_Player1",0), s)
call BlzFrameSetText(BlzGetFrameByName("BoxedTextTitle_Player1",0), "Дополнительные характеристики")
Ты сначало меняет описание на строку s, а потом повторно меняешь на "доп характеристики"
0
27
4 недели назад
Отредактирован MpW
0

» WarCraft 3 / Можно ли отследить конец разложения юнита?

nazarpunk, когда труп разложился, окончательно, т.е. время истекло, ему игра отдает приказ undefend. А через 0.00 сек он уже окончательно удален что не понятно? Его уже нет в игре. Воскресить ничего не может трупа то нет.
Смотрел наработку
Воскрешение как раз можно отследить. Тем более паладоса. Не понимаю в чем проблема. Вроде через как ивент призыва.
1
27
4 недели назад
Отредактирован MpW
1

» WarCraft 3 / Можно ли отследить конец разложения юнита?

Была одна наработка как отследить реинкарнацию/трансформацию (морф)/и конец разложения (удаление) ссылка
Есть способности вроде укрыться щитом Adef. И в игре есть занимательная особенность: при смерти юниту зачем то отдают приказ undefend. Возможна, связано с моделью, я не знаю, зачем игра отдает приказ. Но замечано не только при смерти, но и при трансформации (морфе), даже, разлагающему трупу (юниту) перед удалением отдает приказ undefend. По моему мнению, это позволяет юниту убирать щит, переключить из активного режима в выключенный, наверняка какая нибудь защита от багов. Абилка Adef просто универсальна в отлове, об этом оаишу ниже.
Что же там с реинкарнацией? В чем проблема реинкарнации?
При наличии абилки реинкарнации "событие - юнит умирает" не засчитывало, что юнит умер, это было проблемой отследить. Но отследить можно было с помощью Adef и отловом приказа "undefend", но с задержкой таймером через 0.00 сек чекаем мертв ли он
бесполезная инфа
К слову немного информации: Крест реинкарнации героя (труп) это типа крест, который можно выделить, и можно отдавать приказы defend/undefend, таким образом, скилл может переходить в включенное состояние, и выключенное. Но кресту в здравом уме никто же не отдаст приказ undefend, но такие картоделы были. Удивительно, что обычные трупы (не говорю про геройские кресты, которые можно выделить на карте) тоже могу получать приказы, правда, от специальных абил вроде Adef.
Насчет морфа, как отследить трансформацию юнита?
Такого события тоже в игре нету, можно было отслеживать через "юнит приводит способность в действие", либо "юнит получает приказ", или другими подручными средствами. Но эти все проверки ссылались на один конкретный скилл/морф, мб никому не составит это проблему (даже для меня). а вот если у кого-то сотня морфов происходит, при чем от разных скиллов, как тут узнать, что морф произошел? Все делается также как и в реинкарнации, но с некоторым отличием. При морфе игра юниту тоже отдает приказ undefend, убрать щит. Зачем? Тоже не понятно. Хитрый автор системы сделал одну фишку, можно вручить какую нибудь "временную абилку".
Зачем вручать временную абилку? Как это поможет отследить морф?
При морфе юнит перевоплощается из одного в другого, меняется, но и может УТРАЧИВАТЬ ЭФФЕКТЫ, АБИЛКИ. Если в игре вы давали ее кодом, то при морфе эта абилка исчезала, и уже не сохранялась. Надеюсь объяснил. В чем же отличие системы реинкарнации от этой? Здесь мы даем какую нибудь "временную абилку" (можно пустышку), тк она не является пермаментной, и это позволяло фиксировать то что юнит трансформировался. При получении приказа undefend таймером через 0.00 сек чекаем наличие временной абилки, осталась ли она
Насчет удаления юнита из игры. Как отследить конец разложения, и удаления юнита. И что юнит окончательно разложился и удалится.
Можно просто использовать аналогичную систему реинкарнации, но с проверкой, что юнит уничтожен.
GetUnitTypeId == 0 //его больше не существует
Несмотря на то, что юнит мертв (разлагающий труп), зачем то игра перед удалением отдает ему приказ undefend, будто говорит ему : "дорогой юнит, убери пожалуйста щит от всяких багов перед удалением. Приятной игры". Тут точно также как и с реинкарнацией, только проверяем, что юнит удален. Таймером через 0.00 сек (через 0.00 сек будет удален) после получения приказа
0
27
1 месяц назад
0

» Таверна "Ржавое колесо" / Рассольник с перловкой и солёными огурцами

С копченной колбасой тоже ничего