globals
region TR
rect lastRect = null
endglobals
function Trig_ddd_Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction
function IsPointInRect takes rect a, real x, real y returns boolean
call RegionClearRect(TR,lastRect)
call RegionAddRect(TR,a)
set lastRect = a
return IsPointInRegion(TR,x,y)
endfunction
function Trig_ddd_Actions takes nothing returns nothing
local real x = GetUnitX(GetTriggerUnit())
local real y = GetUnitY(GetTriggerUnit())
call DisableTrigger(GetTriggeringTrigger())
if IsPointInRect(gg_rct_rect_000,x,y) then
set udg_Point[0] = GetRectCenter(gg_rct_rect_002)
elseif IsPointInRect(gg_rct_rect_001,x,y) then
set udg_Point[0] = GetRectCenter(gg_rct_rect_003)
elseif IsPointInRect(gg_rct_rect_002,x,y) then
set udg_Point[0] = GetRectCenter(gg_rct_rect_000)
elseif IsPointInRect(gg_rct_rect_003,x,y) then
set udg_Point[0] = GetRectCenter(gg_rct_rect_001)
endif
call SetUnitPositionLoc( GetTriggerUnit(), udg_Point[0] )
call RemoveLocation(udg_Point[0])
set udg_Point[0] = null
call TriggerSleepAction(0.)
call EnableTrigger(GetTriggeringTrigger())
endfunction
//===========================================================================
function InitTrig_ddd takes nothing returns nothing
set gg_trg_ddd = CreateTrigger( )
call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_000 )
call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_001 )
call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_002 )
call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_003 )
call TriggerAddCondition( gg_trg_ddd, Condition( function Trig_ddd_Conditions ) )
call TriggerAddAction( gg_trg_ddd, function Trig_ddd_Actions )
set TR = CreateRegion()
endfunction
Единственное, что из-за микрозадержки могут быть случаи, когда некоторых юнитов не телепотирует и им ещё раз в область зайти нужно. Задержка нужна чтобы не вызвать бесконечный цикл, к сожалению, таймером в 0.00 сек тоже нельзя воспользоваться, он слишком быстрый для вара
хотя я вижу в твоём триггере, что юнит не может вернуться обратно через ту же область, поэтому тебе даже задержка не нужна
Закидываешь все нужные области в событие, в условия закидываешь что входящий юнит это герой, а через если тогда иначе проверяешь в какую именно область юнит зашёл
По поводу локальной группы, перед ней нужно поставить set bj_wantDestroyGroup = true
Нужен таймер. Первым способом это каждые 0.01 сек проверять координаты юнита, а вторым, это все те же твои действия, но перед ними ещё таймер в 0.00 сек
library HC initializer init
private leaderboard HB
private function HCU takes nothing returns nothing
local integer i = 0
local integer id
local location array P
local real result = 0
loop
exitwhen i >= 50
set i = i+1
set P[i] = Location(0,0)
set id = GetHandleId(P[i])
set result = result+(id-0x100000)
endloop
set result = result/i-i/2
loop
call RemoveLocation(P[i])
set P[i] = null
exitwhen i <= 1
set i = i-1
endloop
call LeaderboardSetItemValue(HB,0,R2I(result))
endfunction
private function HCA takes nothing returns nothing
set HB = CreateLeaderboard()
call LeaderboardSetLabel(HB,"Handle Counter")
call PlayerSetLeaderboard(GetLocalPlayer(),HB)
call LeaderboardDisplay(HB,true)
call LeaderboardAddItem(HB,"Handles",0,Player(0))
call LeaderboardSetSizeByItemCount(HB,1)
call HCU()
call TimerStart(GetExpiredTimer(),.05,true,function HCU)
endfunction
private function init takes nothing returns nothing
call TimerStart(CreateTimer(),0,false,function HCA)
endfunction
endlibrary
Нет, тебе это вообще ничем не грозит и ты лишь облегчишь работу варика, чутка ускорив его, оптимизация проще говоря
То есть варик же bj зачем то делал и не начнет ли он тупить, как обычно?
Близзарды создавали бж для удобства использования другими людьми
Та же гуишная функция с созданием юнитов позволяет человеку в последующем обращаться к юниту/группе как последний созданный/последняя группа (хотя для создания одного юнита действительно дочерта написано)
Другой пример это:
bj_RADTODEG / bj_DEGTORAD (radians to degrees / degrees to radians)
согласись, куда удобнее писать эти слова, нежели искать/запоминать эти цифры 57.2958 / .0174532
Ну а так же, если заменять некоторые бж функции можно знатно раздуть свой код, например
ReplaceUnitBJ
function ReplaceUnitBJ takes unit whichUnit, integer newUnitId, integer unitStateMethod returns unit
local unit oldUnit = whichUnit
local unit newUnit
local boolean wasHidden
local integer index
local item indexItem
local real oldRatio
// If we have bogus data, don't attempt the replace.
if (oldUnit == null) then
set bj_lastReplacedUnit = oldUnit
return oldUnit
endif
// Hide the original unit.
set wasHidden = IsUnitHidden(oldUnit)
call ShowUnit(oldUnit, false)
// Create the replacement unit.
if (newUnitId == 'ugol') then
set newUnit = CreateBlightedGoldmine(GetOwningPlayer(oldUnit), GetUnitX(oldUnit), GetUnitY(oldUnit), GetUnitFacing(oldUnit))
else
set newUnit = CreateUnit(GetOwningPlayer(oldUnit), newUnitId, GetUnitX(oldUnit), GetUnitY(oldUnit), GetUnitFacing(oldUnit))
endif
// Set the unit's life and mana according to the requested method.
if (unitStateMethod == bj_UNIT_STATE_METHOD_RELATIVE) then
// Set the replacement's current/max life ratio to that of the old unit.
// If both units have mana, do the same for mana.
if (GetUnitState(oldUnit, UNIT_STATE_MAX_LIFE) > 0) then
set oldRatio = GetUnitState(oldUnit, UNIT_STATE_LIFE) / GetUnitState(oldUnit, UNIT_STATE_MAX_LIFE)
call SetUnitState(newUnit, UNIT_STATE_LIFE, oldRatio * GetUnitState(newUnit, UNIT_STATE_MAX_LIFE))
endif
if (GetUnitState(oldUnit, UNIT_STATE_MAX_MANA) > 0) and (GetUnitState(newUnit, UNIT_STATE_MAX_MANA) > 0) then
set oldRatio = GetUnitState(oldUnit, UNIT_STATE_MANA) / GetUnitState(oldUnit, UNIT_STATE_MAX_MANA)
call SetUnitState(newUnit, UNIT_STATE_MANA, oldRatio * GetUnitState(newUnit, UNIT_STATE_MAX_MANA))
endif
elseif (unitStateMethod == bj_UNIT_STATE_METHOD_ABSOLUTE) then
// Set the replacement's current life to that of the old unit.
// If the new unit has mana, do the same for mana.
call SetUnitState(newUnit, UNIT_STATE_LIFE, GetUnitState(oldUnit, UNIT_STATE_LIFE))
if (GetUnitState(newUnit, UNIT_STATE_MAX_MANA) > 0) then
call SetUnitState(newUnit, UNIT_STATE_MANA, GetUnitState(oldUnit, UNIT_STATE_MANA))
endif
elseif (unitStateMethod == bj_UNIT_STATE_METHOD_DEFAULTS) then
// The newly created unit should already have default life and mana.
elseif (unitStateMethod == bj_UNIT_STATE_METHOD_MAXIMUM) then
// Use max life and mana.
call SetUnitState(newUnit, UNIT_STATE_LIFE, GetUnitState(newUnit, UNIT_STATE_MAX_LIFE))
call SetUnitState(newUnit, UNIT_STATE_MANA, GetUnitState(newUnit, UNIT_STATE_MAX_MANA))
else
// Unrecognized unit state method - ignore the request.
endif
// Mirror properties of the old unit onto the new unit.
//call PauseUnit(newUnit, IsUnitPaused(oldUnit))
call SetResourceAmount(newUnit, GetResourceAmount(oldUnit))
// If both the old and new units are heroes, handle their hero info.
if (IsUnitType(oldUnit, UNIT_TYPE_HERO) and IsUnitType(newUnit, UNIT_TYPE_HERO)) then
call SetHeroXP(newUnit, GetHeroXP(oldUnit), false)
set index = 0
loop
set indexItem = UnitItemInSlot(oldUnit, index)
if (indexItem != null) then
call UnitRemoveItem(oldUnit, indexItem)
call UnitAddItem(newUnit, indexItem)
endif
set index = index + 1
exitwhen index >= bj_MAX_INVENTORY
endloop
endif
// Remove or kill the original unit. It is sometimes unsafe to remove
// hidden units, so kill the original unit if it was previously hidden.
if wasHidden then
call KillUnit(oldUnit)
call RemoveUnit(oldUnit)
else
call RemoveUnit(oldUnit)
endif
set bj_lastReplacedUnit = newUnit
return newUnit
endfunction
Ну и отдельный тип бж функций, которые просто бесполезны, вроде DoNothing, ChooseRandomCreepBJ, ChooseRandomItemBJ, CopySaveGameBJ и т.д., где тупо добавили BJ в конце
А то исправлю 90 % красноты от карты и еще что ни будь не так будет?
Всё что может пойти не так - твоя криворукость и невнимательность
Проиграется только то, что ты и указал, это раз, во вторых, локалка бы тебе ничем не помогла проиграть звук, потому что всё что ты делаешь с ней, это пытаешься уничтожить
как правильно написать, чтобы в указанной точке появился юнит?
На примере с позицией юнита
local unit u = GetTriggerUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u),'u000',x,y,GetUnitFacing(u))
Создаст какого-то там юнита в позиции юнита триггера
совместимость с JNGP (т.к. данный редактор является основной надстройки);
Так что можешь возвращаться на джнгп если что, хотя в этом нет необходимости
Я всё время пользовался вджассом и сджассом, и единственные проблемы что возникали, были благодаря моей криворукости. Хотя приходилось лично видеть у другого чела несовместимость сджасса с зинком. Так и не понял в чем проблема была
без этих библиотек естевстенно работать не будет
Работать будет, потому что, как и указал PT153, подключаемые библиотеки это cjass, который, судя по всему, уже используется в твоём редакторе)
po1son, какая-то ерунда))
Ему не спецэффект нужен, а чтобы при нажатии на предмет не нужно было выбирать цель, чтобы повесить бафф, чтобы целью сразу становится кастующий. Другое, у тебя уже есть утечка, ты повешал эффект, а удалять его кто будет? + триггер низя выключать, предмет же вряд ли один раз заюзается в игре
Вот пример, у предмета способность-пустышка (канал), при касте которой вызывается дамми юнит и накладывает духовное пламя на кастера
Ред. rsfghd
» WarCraft 3 / Области и перемещение между ними
Ред. rsfghd
» WarCraft 3 / Области и перемещение между ними
» WarCraft 3 / Области и перемещение между ними
» WarCraft 3 / Области и перемещение между ними
» WarCraft 3 / Как реализовать наложение дебаффов?
Ред. rsfghd
» WarCraft 3 / Отмена приказа
» WarCraft 3 / Нашел баг! (или утечку)
Ред. rsfghd
» WarCraft 3 / Нашел баг! (или утечку)
» WarCraft 3 / Панель приказов
Ред. rsfghd
» WarCraft 3 / Звука смерти у юнита
Звуки модели
Ищешь там звук и вместо добавления удаляешь его
» Блог им. rsfghd / HandleCounter
» WarCraft 3 / Переход к анимации движения
» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing
Ред. rsfghd
» WarCraft 3 / Вопрос от Вдохновленного Нативками Трггерщика
Та же гуишная функция с созданием юнитов позволяет человеку в последующем обращаться к юниту/группе как последний созданный/последняя группа (хотя для создания одного юнита действительно дочерта написано)
Другой пример это:
bj_RADTODEG / bj_DEGTORAD (radians to degrees / degrees to radians)
согласись, куда удобнее писать эти слова, нежели искать/запоминать эти цифры 57.2958 / .0174532
Ну а так же, если заменять некоторые бж функции можно знатно раздуть свой код, например
» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing
» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing
Ред. rsfghd
» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing
Попробуй этот вариант
» WarCraft 3 / Чем заменить CreateNUnitsAtLoc
» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing
Ред. rsfghd
» WarCraft 3 / Чем заменить CreateNUnitsAtLoc
» WarCraft 3 / Чем заменить CreateNUnitsAtLoc
» WarCraft 3 / Чем заменить CreateNUnitsAtLoc
Ред. rsfghd
» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing
Посмотри Function List используя ключевые слова, например Sound
Ред. rsfghd
» WarCraft 3 / Вопрос от Вдохновленного Нативками Трггерщика
» WarCraft 3 / WarCraft 3 Как создать предмет без цели наведения
Ему не спецэффект нужен, а чтобы при нажатии на предмет не нужно было выбирать цель, чтобы повесить бафф, чтобы целью сразу становится кастующий. Другое, у тебя уже есть утечка, ты повешал эффект, а удалять его кто будет? + триггер низя выключать, предмет же вряд ли один раз заюзается в игре