Увы код интерпретируется немного не так как ты вего видишь в редакторе, т.е первый, второй, третий триггер, после создания war3map.j будут идти как второй, третий, первый если считать с верху вниз (от globals endglobals)...
Редактор считает триггеры не потому как ты их расположил а потом в какой очередности они были созданы, так что удалят и создавать заного, в нужном порядке.
Зависит от события триггера, ибо на юз предмета срабатывают куча событий, это и отдача приказа, и каст способности предмета. А так же отдельное событие Юнит применил предмет...
Нет, мне нужен именно контроль войска ВРАГА, но чтобы он все равно оставался врагом (т.е. Мы с ним враги, но управлять его войском я все равно могу). Если это возможно, конечно.
Параметры союзов, он тебя считает союзником а ты его нет. Параметры союзов юдут взаиемные, т.е если ты и второй игрок хотите быть союзниками то нужно прописать что ты считаешь другого игрока союзником и другой игрок считает союзником тебя.
Смотри внимательно функции настройки союзов игроков.
Странно, обычно 12500 золота в руднике...
Вы случаем ничего не меняли, когда речь идет о 100500 то редактор частенько сбрасывает на 0, как и слк оптимизатор (к примеру хп у деревьев ты выставил 9999999, а после слк оптимизации будет дефолт).
WoLLFeR, Поэтому я предложил создать систему мили побед\порожений (да и целиком весь сценарий вашего сражения) своими руками, для разминки могу порекомендовать карту -Монолит (от Blizzard), там реализованы нестандартные рассы, мили ии для нестандартных расс и победа\поражение.
Для изучения если вы совсем не представляете как это реализовать думаю вам подойдет.
Артес Менетил:
Высчитать путь можно только в пустой карте с 1 юнитом, не с 10. А проверить проходима ли точка можно спец. функцией, пути это не такая уж и простая штука.
Просите за нескромный вопрос, а нахрена вам знать дойдет или нет, если можно просто проверять приказ. Можно ли стоять в точке или нет можно определить с помощью функции проверки пафинга или создать в этой точке предмет и сравить его текущие координаты с точкой создания, если координаты предмета не равны точке его создания - точка непроходимо, а текущее положение предмета есть ближайшая проходимая точка.
WoLLFeR, эмм зачем, чувак я описал принцип работы дефольтного мили, где ты проиграешь если у тебя не осталось юнитов. Я так понимаю у вас не мили карта и вы не в лиге будите играть в неё. Определяем победу считая здания игрока, т.к вы на гуях пишите, пример на jass я предоставил не для копипаста а чтобы вы сами осилили аналог на гуи.
Ну разумеется, если скопировать стандартную функцию из Blizzard.j тебе редактор выдаст ошибку, что функция с таким именем уже обявлена...
Я не понимаю в чем проблема, я подробно описал что к чему.
По названиям функций думаю понятно что они делают, рассмотрим по подробнее MeleeInitVictoryDefea( )
function MeleeInitVictoryDefeat takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set bj_meleeDefeated[index] = false
set bj_meleeVictoried[index] = false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index] = false
set bj_playerIsExposed[index] = false
set bj_crippledTimer[index] = CreateTimer()
set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
call TriggerAddAction(trig, function MeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
call TriggerAddAction(trig, function MeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index] = true
set bj_meleeVictoried[index] = false
// Handle leave events for observers
if (IsPlayerObserver(indexPlayer)) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer(), 2.0, false, function MeleeTriggerActionAllianceChange)
endfunction
Вроде много, но тут все просто, создается три триггера один следит за тем сколько построил зданий любой играющий игрок, второй следит сколько зданий погибло у любого играющего игрока, ну а третий следит за теми кто ливнул, чтобы их не преребирать, два прочих вспомогательные, следят за отмненой строительства и прочее.
Итого делаем вывод, чтобы узнать проиграл или нет игрок, нам нужно узнать сколько у него живых зданий, меньше 1 игрок проиграл. А реализовать это можно как угодно, триггерами следящими за смертями и прочим или таймером, который будет переодически считать все здания каждого игрока и давать поражение тем игрокам у кого не осталось ни одного здания...
Переписать Милии триггеры, потому что там прописаны конкретные ИД всех стандартных ратуш.
Пишем код ручками, там нет ничего сложного, подсмотреть его можно в Blizzard.j
Цент карты = нет юнита, значит либо нет юнита (ошибка в реализации) либо он умер.
Вейты плз не юзай, себе дороже - такие баги часто и бывают из за неправильного использования ветов + глобальных переменных.
Мб карту в студию, то не видя всей карты нельзя сказать определенно где ошибся, а гадать можно долго...
Altf40160, еще раз повторяю - ГДЕ ГАРАНТИЯ ЧТО ЮНИТ МОЖЕТ ВЫПОЛНИТЬ ПРИКАЗ?
Прошу прощения за капс, но ваш контроль юнитом и триггерный приказ не одно и тоже, как показала практика нельзя надеятся на то что я могу кастануть, а сам он не кастует - увы, но нужно проверять на то что может ли юнит выполнить приказ. Проверки приказов на гуи вроде нет только на jass
if IssueTargetOrderBy( кастер, "chainligthing", цель ) then
call BJDebugMsg("приказ выполнен!")
else
call BJDebugMsg("невозможно выполнить приказ!")
endif
Может быть туча причин почему юнит не кастует скилл, так что внятный дебаг в студию, в момент срабатывания триггера выводите на экран кто кастанул, кто цель, видит ли кастер цель, проходит ли приказ каста.
Это типа какой будет отддан приказ, при таком то действии. Но толку от этого мало, ибо мы не можем менять приказы способностям, редактирование тех полей ничего не дает.
Приказ можно изменить только у канала и еще пары абилок, так что не обращай внимание.
Создаешь группу
Выбираешь всех юнитов на карте и добавляешь в эту группу
Выбираешь всех в группе и добавляешь в триггер Damage Event ивент "выбранный юнит получает урон"
Создаешь триггер с событием "юнит входит в зону игровой карты"
-Если юнит не в группе
-Добавить юнита в группу
-Добавить в Damage Event ивент "триггеринг юнит получает урон"
В самом демедж ивенте делай что тебе вздумается. Для того, чтобы отличить атаку с руки от урона от способности, просто кастуй способности через даммиков(если это триггерные спеллы, то трудностей не возникнет). Чтобы отличить ближника от дальника, дай тем или иным какую то пустышку на основе абилок предметов и сверяй уровень этой способности у юнита(если он равен 0 - значит у него ее нет)
Достаточно добавить событие урона на того, на кого ты замахнулся и ждать урона + поставить таймер на случай промаха.
Отличить физический урон с атаки от прочих довольно сложно без мемхака (там тоже не в 3 строчки), но есть фишка с рунными браслетами которая описывалась не раз, гуглите системы отлова физического урона.
Что за хрень? Фильтр всегда оформляется отдельной функцией, без вашего Г
Функции нужны не ваша строчка а code.
Тип code может быть только function ссылка на кастом функцию объявленную выше в коде.
Я знаю, я об этом и спрашивал, а в скобки условие я вставил уже отчаявшись)
Ну ты jass API то хоть смотрел?
Функция Condition() просит тип "code" и примет только "code".
цитата
globals
unit bj_lastFilterUnit = null
boolexpr OnlyEnemyOrgAlive = null
endglobals
function OnlyEnemyOrganicAlive_Filter takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit()
return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE )
endfunction
// При инициализации
***
set OnlyEnemyOrgAlive = Condition( function OnlyEnemyOrganicAlive_Filter )
***
// При переборе
set bj_groupEnumOwningPlayer = GetOwningPlayer( GetSpellAbilityUnit() ) // любой нужный тебе игрок, чтобы определи кто ему враг.
call GroupEnumUnitsInRange(g,X,Y,100, OnlyEnemyOrgAlive) //х и у - координаты
call ForGroup( g, function A ) // фунция A твоя функция где ты будешь совершать действия с юнитами в группе, передавать туда значения можно глобалками.
Москиты ни поподают в группу, GroupEnumUnitsInRange и прочее не пикает москитов, вообще никак... Москиты не взаимодействуют со скиллами и прочим, на них реагируют только события входа\выхода в зону или к юниту, а так же при переборе всех юнитов игрока GroupEnumUnitsOfPlayer, все остальное что ищет юнитов на москитов не реагирует...
2 пункта от GF RaiseD: 2.2 (троллинг) Добрее быть надо
Массивы работают нормально, у вас где то ошибка.
Тем более ваш скриншот не очем не говорит, где проверка что цель существует и даммик может выполнить приказ? Он может банально не видеть цели, у цели может быть иммунитет к магии или инвиз.
Что за хрень? Фильтр всегда оформляется отдельной функцией, без вашего Г
Функции нужны не ваша строчка а code.
Тип code может быть только function ссылка на кастом функцию объявленную выше в коде.
что мешает юзнуть берсерк, манащит, канал, да хоть виндвалк?
Мешает то, что берсерк и виндвалк уже использованы, переключаемые абилки - хурма, а канал не моментальный.
Ты станишь юнита, какая тебе разница?
Канал пойдет с тем же успехом, юнит его кастанет в любом случае.
Переключаемые абилки работают нормально, если уметь немного искать и читать, как их юзать в качестве простых есть инфа в статьях на форуме.
Еще всякие вееры ножей, не сбивают приказ идти куда либо. Юзай его в качестве основы.
» WarCraft 3 / как на jass вызвать функцию в соседнем верхнем триггере
Редактор считает триггеры не потому как ты их расположил а потом в какой очередности они были созданы, так что удалят и создавать заного, в нужном порядке.
» WarCraft 3 / Как узнать цель предмета
» WarCraft 3 / Контроль юнитов врага
Смотри внимательно функции настройки союзов игроков.
» WarCraft 3 / Баг констант в JNGP
Вы случаем ничего не меняли, когда речь идет о 100500 то редактор частенько сбрасывает на 0, как и слк оптимизатор (к примеру хп у деревьев ты выставил 9999999, а после слк оптимизации будет дефолт).
» WarCraft 3 / Ошибка в коде?
» WarCraft 3 / Как заставить редактор распознавать ратушу
Для изучения если вы совсем не представляете как это реализовать думаю вам подойдет.
Ред. quq_CCCP
» WarCraft 3 / Как сделать такую проходимость?
Высчитать путь можно только в пустой карте с 1 юнитом, не с 10. А проверить проходима ли точка можно спец. функцией, пути это не такая уж и простая штука.
Просите за нескромный вопрос, а нахрена вам знать дойдет или нет, если можно просто проверять приказ. Можно ли стоять в точке или нет можно определить с помощью функции проверки пафинга или создать в этой точке предмет и сравить его текущие координаты с точкой создания, если координаты предмета не равны точке его создания - точка непроходимо, а текущее положение предмета есть ближайшая проходимая точка.
» WarCraft 3 / Как заставить редактор распознавать ратушу
» WarCraft 3 / Как заставить редактор распознавать ратушу
Я не понимаю в чем проблема, я подробно описал что к чему.
» WarCraft 3 / Как заставить редактор распознавать ратушу
Итого делаем вывод, чтобы узнать проиграл или нет игрок, нам нужно узнать сколько у него живых зданий, меньше 1 игрок проиграл. А реализовать это можно как угодно, триггерами следящими за смертями и прочим или таймером, который будет переодически считать все здания каждого игрока и давать поражение тем игрокам у кого не осталось ни одного здания...
» WarCraft 3 / Как заставить редактор распознавать ратушу
» WarCraft 3 / Как заставить редактор распознавать ратушу
Пишем код ручками, там нет ничего сложного, подсмотреть его можно в Blizzard.j
» WarCraft 3 / Коректно ли работает массив юнитов?
Вейты плз не юзай, себе дороже - такие баги часто и бывают из за неправильного использования ветов + глобальных переменных.
Мб карту в студию, то не видя всей карты нельзя сказать определенно где ошибся, а гадать можно долго...
» WarCraft 3 / Коректно ли работает массив юнитов?
Прошу прощения за капс, но ваш контроль юнитом и триггерный приказ не одно и тоже, как показала практика нельзя надеятся на то что я могу кастануть, а сам он не кастует - увы, но нужно проверять на то что может ли юнит выполнить приказ. Проверки приказов на гуи вроде нет только на jass
» WarCraft 3 / Фильтр, еще раз
» WarCraft 3 / Для чего нужны эти строки?
Приказ можно изменить только у канала и еще пары абилок, так что не обращай внимание.
» WarCraft 3 / Как определить момент атаки и урона у дальнобойных юнитов
Отличить физический урон с атаки от прочих довольно сложно без мемхака (там тоже не в 3 строчки), но есть фишка с рунными браслетами которая описывалась не раз, гуглите системы отлова физического урона.
Ред. Raised
» WarCraft 3 / Фильтр, еще раз
Функция Condition() просит тип "code" и примет только "code".
» WarCraft 3 / Коректно ли работает массив юнитов?
Тем более ваш скриншот не очем не говорит, где проверка что цель существует и даммик может выполнить приказ? Он может банально не видеть цели, у цели может быть иммунитет к магии или инвиз.
» WarCraft 3 / Фильтр, еще раз
Функции нужны не ваша строчка а code.
Тип code может быть только function ссылка на кастом функцию объявленную выше в коде.
» WarCraft 3 / Как снять бафф Божественного Щита \ Как застанить неуязвимого
Канал пойдет с тем же успехом, юнит его кастанет в любом случае.
Переключаемые абилки работают нормально, если уметь немного искать и читать, как их юзать в качестве простых есть инфа в статьях на форуме.
Еще всякие вееры ножей, не сбивают приказ идти куда либо. Юзай его в качестве основы.