темаэта тема может разъяснить некоторые моменты. хотя ... размер квадрата 32 или 64?
Короче не дописал. Размеры радиусом менее 192 принимают квадрат, как показано ниже. А размеры более 192 принимают ромбовидный круг.
насчет того. что автор заметил баги при очищении. К сожалению, мне неизвестно, что ему там удалось обнаружить. И не удалось поймать. Сильно устал сегодня. Есть тестовая карта P2, пока она далека нужного просмотра.
сколько будет это правильно обработать? сделал сам, но видны границы квадратиков (что очень не красиво). мне нужна черноземная почва, нашел картинку, сделал, но смотрится как песок в варе. думаю нужно искать новую.
тоже тестил давно перерождение, и даже сравнивал с обычной смертью, всегда ноль возвращает. откуда берется интересное число 0.405? у меня один раз выскочило это число при абилке перерождения минотавра (и то не всегда что-то, например у лучницы) кстати есть же проверка классификацией Dead, там точно можно узнать мертв или нет. эх любите оптимизировать все до дыр
Я не понимаю как вы собираете решать (потому что не даете ответ развернутый). Так вот решение:
решение один. добавить в условие проверку на тип
тут нужно вместо hfoo поставить свой тип
function DuelChecking takes nothing returns nothing
local integer alliance_number=0
local integer akatsuki_number=0
local integer alliance_current=0
local integer akatsuki_current=0
local integer i=0
local unit hero_duel_1=null
local unit hero_duel_2=null
//идет первый цикл
//здесь введены специально счетчики для игроков от каждой команды
// alliance_number - кол-во играющих за добро и akatsuki_number - кол-во играющих за зло
//перебирает всех 10 игроков, если игрок играет, то прибавляет в счетчик
//эти счетчики - переменные целые. они высчитывают шанс.
loop
if i!=4 and i!=5 then
if GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING then
if i<4 then //<=здесь можно выставить условие ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) выставите тип, и тогда счетчик не засчитаете его
set alliance_number=alliance_number+1
elseif i>5 then //<=или здесь можно выставить условие ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) выставите тип, и тогда счетчик не засчитаете его
set akatsuki_number=akatsuki_number+1
endif
endif
endif
set i=i+1
exitwhen i>10
endloop
//идет второй цикл
//теперь снова перебираем тех же игроков.
//но пытаемся выдать шанс на то, что герой этого игрока выйдет на дуэль
set i=0
loop
if i!=4 and i!=5 then
if GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING then //если игрок играет
if i<4 and hero_duel_1==null then //если первый дуэлянт еще не выбран (дуэлянт выбирается от 1 до 4 игрока)
set alliance_current=alliance_current+1 //< странно эти переменная ничего не делает дальше.
//должна alliance_current по идее вычитать из общее количества. из этого шанс будет становится больше.
//например 3 игрока. 1/3=0.3 или 30 процентов. 2 игрока - 1/2=0.5 или 50 процентов
//if ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) then <= здесь нужно поставить условие, тогда нагато никогда не выйдет на арену
if alliance_current<alliance_number then
if GetRandomInt(1,alliance_number)==1 then //выбирается рандомно.
set hero_duel_1=udg_Hero[i]
endif
elseif alliance_current==alliance_number then //если дуэлянт не выбран (если до этого шанс не выпад, то выбираем последнего игрока)
set hero_duel_1=udg_Hero[i]
endif
//endif
elseif i>5 and hero_duel_2==null then
set akatsuki_current=akatsuki_current+1 //< странно эти переменная ничего не делает дальше.
//должна akatsuki_current по идее вычитать из общее количества. из этого шанс будет становится больше.
//например 3 игрока. 1/3=0.3 или 30 процентов. 2 игрока - 1/2=0.5 или 50 процентов
//if ( GetUnitTypeId(udg_Hero[i]) != 'hfoo' ) then <= здесь нужно поставить условие, тогда нагато никогда не выйдет на арену
if akatsuki_current<akatsuki_number then
if GetRandomInt(1,akatsuki_number)==1 then //выбирается рандомно шанс
set hero_duel_2=udg_Hero[i]
endif
elseif akatsuki_current==akatsuki_number then
set hero_duel_2=udg_Hero[i]
endif
//endif
endif
endif
endif
set i=i+1
exitwhen i>10 or hero_duel_2!=null
endloop
if hero_duel_1!=null and hero_duel_2!=null then
call DuelStart(GetOwningPlayer(hero_duel_1),GetOwningPlayer(hero_duel_2))
else
call DisplayTimedTextToPlayer(GetLocalPlayer(),0.,0.,5.,"|cFFFFCC00Дуэль не состоялась!|r")
endif
set hero_duel_1=null
set hero_duel_2=null
endfunction
типы
какой из них имба? основное тело героя O014? кого из них отключать?
или может исключить имбу, а клонов в бой на арену? тогда придеться переделать систему.
функцию DuelPrestart надо перезаписать.
только вызывают целые вопросы. клоны - герои. если они мертвы, перед ареной их оживить, после арены убить?
есть карта я код с всеми способности нагато отсортировал для удобства
по поводу переключения
триггер выбора
function Nagato___PainClickGetJutsuCheck takes string str,integer whatValue returns integer
local integer l__Nagato_value=0
if str=="влево"then
if whatValue==5 then
if Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
endif
elseif whatValue==4 then
if Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
endif
elseif whatValue==3 then
if Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
endif
elseif whatValue==2 then
if Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
endif
elseif whatValue==1 then
if Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
endif
elseif whatValue==6 then
if Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
endif
endif
elseif str=="вправо"then
if whatValue==2 then
if Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
endif
elseif whatValue==3 then
if Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
endif
elseif whatValue==4 then
if Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
endif
elseif whatValue==5 then
if Nagato_PainExist[5]then
set l__Nagato_value=5
elseif Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
endif
elseif whatValue==6 then
if Nagato_PainExist[6]then
set l__Nagato_value=6
elseif Nagato_PainExist[1]then
set l__Nagato_value=1
elseif Nagato_PainExist[2]then
set l__Nagato_value=2
elseif Nagato_PainExist[3]then
set l__Nagato_value=3
elseif Nagato_PainExist[4]then
set l__Nagato_value=4
elseif Nagato_PainExist[5]then
set l__Nagato_value=5
endif
endif
endif
return l__Nagato_value
endfunction
function cj_anonym__523 takes nothing returns nothing
set Nagato_painClickSound=false
call DestroyTimer(GetExpiredTimer())
endfunction
function Nagato___PainClickGetJutsu takes integer id,unit u,string str returns nothing
local boolean camLog=false
local integer i=1
loop
if Nagato_JutsuActive[i]!=0 then
call SetPlayerAbilityAvailable(Nagato_p,Nagato_JutsuActive[i],false)
endif
set i=i+1
exitwhen i>5
endloop
if str=="клик"then
set Nagato_PainSelectedNumberNext=0
if id==Nagato_PAIN_ID_1 then
set Nagato_JutsuActive[1]=0x41303959//A09Y
set Nagato_JutsuActive[2]=0x4130395A//A09Z
set Nagato_JutsuActive[3]=0x4130574C//A0WL
set Nagato_JutsuActive[4]=0x41304833//A0H3
set Nagato_JutsuActive[5]=0x41304530//A0E0
call Sound3D(u,"Nagato Pain 1 Chikushodo.mp3")
elseif id==Nagato_PAIN_ID_2 then
set Nagato_JutsuActive[1]=0x41304842//A0HB
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 2 Gakido.mp3")
elseif id==Nagato_PAIN_ID_3 then
set Nagato_JutsuActive[1]=0x41305730//A0W0
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 3 Ningendo.mp3")
elseif id==Nagato_PAIN_ID_4 then
set Nagato_JutsuActive[1]=0x41304157//A0AW
set Nagato_JutsuActive[2]=0x41304543//A0EC
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 4 Shurado.mp3")
elseif id==Nagato_PAIN_ID_5 then
set Nagato_JutsuActive[1]=0x41304741//A0GA
set Nagato_JutsuActive[2]=0x41305658//A0VX
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 5 Jigokudo.mp3")
elseif id==Nagato_PAIN_ID_6 then
set Nagato_JutsuActive[1]=0x41303551//A05Q
set Nagato_JutsuActive[2]=0x41303534//A054
set Nagato_JutsuActive[3]=0x41303457//A04W
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 6 Tendo.mp3")
endif
elseif str=="влево"then
set camLog=true
if Nagato_PainSelectedNumberNext==0 then
if Nagato_PainExist[6]then
set Nagato_PainSelectedNumberNext=6
elseif Nagato_PainExist[5]then
set Nagato_PainSelectedNumberNext=5
elseif Nagato_PainExist[4]then
set Nagato_PainSelectedNumberNext=4
elseif Nagato_PainExist[3]then
set Nagato_PainSelectedNumberNext=3
elseif Nagato_PainExist[2]then
set Nagato_PainSelectedNumberNext=2
elseif Nagato_PainExist[1]then
set Nagato_PainSelectedNumberNext=1
endif
endif
if Nagato_PainExist[6]and Nagato_PainSelectedNumberNext==6 then
set u=Nagato___PainUnit[6]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",5)
set Nagato_JutsuActive[1]=0x41303551
set Nagato_JutsuActive[2]=0x41303534
set Nagato_JutsuActive[3]=0x41303457
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 6 Tendo.mp3")
elseif Nagato_PainExist[5]and Nagato_PainSelectedNumberNext==5 then
set u=Nagato___PainUnit[5]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",4)
set Nagato_JutsuActive[1]=0x41304741
set Nagato_JutsuActive[2]=0x41305658
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 5 Jigokudo.mp3")
elseif Nagato_PainExist[4]and Nagato_PainSelectedNumberNext==4 then
set u=Nagato___PainUnit[4]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",3)
set Nagato_JutsuActive[1]=0x41304157
set Nagato_JutsuActive[2]=0x41304543
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 4 Shurado.mp3")
elseif Nagato_PainExist[3]and Nagato_PainSelectedNumberNext==3 then
set u=Nagato___PainUnit[3]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",2)
set Nagato_JutsuActive[1]=0x41305730
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 3 Ningendo.mp3")
elseif Nagato_PainExist[2]and Nagato_PainSelectedNumberNext==2 then
set u=Nagato___PainUnit[2]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",1)
set Nagato_JutsuActive[1]=0x41304842
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 2 Gakido.mp3")
elseif Nagato_PainExist[1]and Nagato_PainSelectedNumberNext==1 then
set u=Nagato___PainUnit[1]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("влево",6)
set Nagato_JutsuActive[1]=0x41303959
set Nagato_JutsuActive[2]=0x4130395A
set Nagato_JutsuActive[3]=0x4130574C
set Nagato_JutsuActive[4]=0x41304833
set Nagato_JutsuActive[5]=0x41304530
call Sound3D(u,"Nagato Pain 1 Chikushodo.mp3")
endif
elseif str=="вправо"then
set camLog=true
if Nagato_PainSelectedNumberNext==0 then
if Nagato_PainExist[1]then
set Nagato_PainSelectedNumberNext=1
elseif Nagato_PainExist[2]then
set Nagato_PainSelectedNumberNext=2
elseif Nagato_PainExist[3]then
set Nagato_PainSelectedNumberNext=3
elseif Nagato_PainExist[4]then
set Nagato_PainSelectedNumberNext=4
elseif Nagato_PainExist[5]then
set Nagato_PainSelectedNumberNext=5
elseif Nagato_PainExist[6]then
set Nagato_PainSelectedNumberNext=6
endif
endif
if Nagato_PainExist[1]and Nagato_PainSelectedNumberNext==1 then
set u=Nagato___PainUnit[1]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",2)
set Nagato_JutsuActive[1]=0x41303959
set Nagato_JutsuActive[2]=0x4130395A
set Nagato_JutsuActive[3]=0x4130574C
set Nagato_JutsuActive[4]=0x41304833
set Nagato_JutsuActive[5]=0x41304530
call Sound3D(u,"Nagato Pain 1 Chikushodo.mp3")
elseif Nagato_PainExist[2]and Nagato_PainSelectedNumberNext==2 then
set u=Nagato___PainUnit[2]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",3)
set Nagato_JutsuActive[1]=0x41304842
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 2 Gakido.mp3")
elseif Nagato_PainExist[3]and Nagato_PainSelectedNumberNext==3 then
set u=Nagato___PainUnit[3]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",4)
set Nagato_JutsuActive[1]=0x41305730
set Nagato_JutsuActive[2]=0
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 3 Ningendo.mp3")
elseif Nagato_PainExist[4]and Nagato_PainSelectedNumberNext==4 then
set u=Nagato___PainUnit[4]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",5)
set Nagato_JutsuActive[1]=0x41304157
set Nagato_JutsuActive[2]=0x41304543
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 4 Shurado.mp3")
elseif Nagato_PainExist[5]and Nagato_PainSelectedNumberNext==5 then
set u=Nagato___PainUnit[5]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",6)
set Nagato_JutsuActive[1]=0x41304741
set Nagato_JutsuActive[2]=0x41305658
set Nagato_JutsuActive[3]=0
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 5 Jigokudo.mp3")
elseif Nagato_PainExist[6]and Nagato_PainSelectedNumberNext==6 then
set u=Nagato___PainUnit[6]
set Nagato_PainSelectedNumberNext=Nagato___PainClickGetJutsuCheck("вправо",1)
set Nagato_JutsuActive[1]=0x41303551
set Nagato_JutsuActive[2]=0x41303534
set Nagato_JutsuActive[3]=0x41303457
set Nagato_JutsuActive[4]=0
set Nagato_JutsuActive[5]=0
call Sound3D(u,"Nagato Pain 6 Tendo.mp3")
endif
endif
set i=1
loop
if Nagato_PainExist[i]then
if Nagato___PainUnit[i]==u then
call SetTextTagColor(Nagato___PainText[i],165,253,0,0)
else
call SetTextTagColor(Nagato___PainText[i],255,255,255,0)
endif
endif
set i=i+1
exitwhen i>6
endloop
set i=1
loop
if Nagato_JutsuActive[i]!=0 then
if GetUnitAbilityLevel(Nagato_c,Nagato_JutsuActive[i])>0 then
call SetPlayerAbilityAvailable(Nagato_p,Nagato_JutsuActive[i],true)
else
call UnitAddAbility(Nagato_c,Nagato_JutsuActive[i])
endif
endif
set i=i+1
exitwhen i>5
endloop
set Nagato_painClickSound=true
call TimerStart(CreateTimer(),1.,false,function cj_anonym__523)
if GetLocalPlayer()==Nagato_p then
call ClearSelection()
call SelectUnit(Nagato_c,true)
endif
if camLog then
if GetLocalPlayer()==Nagato_p then
call ResetToGameCamera(0.)
call PanCameraToTimed(GetWidgetX(u),GetWidgetY(u),0.)
endif
endif
set Nagato___PainClicked=null
endfunction
function Nagato___PainClickConditions takes nothing returns boolean
return GetTriggerPlayer()==Nagato_p and IsUnitPain(GetTriggerUnit())and Nagato___PainClickNumber<2
endfunction
function cj_anonym__524 takes nothing returns nothing
set Nagato___PainClickNumber=Nagato___PainClickNumber-1
call DestroyTimer(GetExpiredTimer())
endfunction
function Nagato___PainClickActions takes nothing returns nothing
local unit u=GetTriggerUnit()
local integer i=1
set Nagato___PainClickNumber=Nagato___PainClickNumber+1
if not Nagato___PainFirst then
set Nagato___PainFirst=true
call DisplayTimedTextToPlayer(Nagato_p,0.,0.,20.,"|cFFFF5000Чтобы открыть способности Пейнов, используйте стрелки влево-вправо-вниз на клавиатуре, либо в течение 0,25 секунд выберите нужного Пейна дважды!|r")
endif
if Nagato___PainClickNumber==1 then
set Nagato___PainClicked=u
endif
if Nagato___PainClickNumber==2 and u==Nagato___PainClicked then
call Nagato___PainClickGetJutsu(GetUnitTypeId(u),u,"клик")//+
endif
call TimerStart(CreateTimer(),.25,false,function cj_anonym__524)//+
set u=null
endfunction
кнопки переключения
function Nagato___PainKeyDownConditions takes nothing returns boolean
return GetUnitAbilityLevel(udg_Hero[GetPlayerId(GetTriggerPlayer())],Nagato_RIKUDO_CANCEL)>0
endfunction
function Nagato___PainKeyDownActions takes nothing returns nothing
local integer i=1
if GetLocalPlayer()==Nagato_p then
call ClearSelection()
call SelectUnit(Nagato_c,true)
endif
loop
if Nagato_PainExist[i]then
if GetLocalPlayer()==Nagato_p then
call SelectUnit(Nagato___PainUnit[i],true)
endif
endif
set i=i+1
exitwhen i>6
endloop
endfunction
function Nagato___PainKeyRightConditions takes nothing returns boolean
return GetUnitAbilityLevel(udg_Hero[GetPlayerId(GetTriggerPlayer())],Nagato_RIKUDO_CANCEL)>0
endfunction
function Nagato___PainKeyRightActions takes nothing returns nothing
call Nagato___PainClickGetJutsu(0,null,"вправо")
endfunction
function Nagato___PainKeyLeftConditions takes nothing returns boolean
return GetUnitAbilityLevel(udg_Hero[GetPlayerId(GetTriggerPlayer())],Nagato_RIKUDO_CANCEL)>0
endfunction
function Nagato___PainKeyLeftActions takes nothing returns nothing
call Nagato___PainClickGetJutsu(0,null,"влево")
endfunction
8gabriel8, эта же функция точно делает невозрат юнита к точке? давно-давно тестил. у меня нейтралы на нее болт кладут, и всегда возращаются.
раскрыть
native RemoveGuardPosition takes unit hUnit returns nothing //юнит становится неподконтрольным ИИ-командам
native RemoveAllGuardPositions takes player num returns nothing //все юниты игрока становятся неподконтрольным
native RecycleGuardPosition takes unit hUnit returns nothing //возвращает контроль ИИ
native SetUnitCreepGuard(targ,true) //включает/выключается контроль (здесь указаны creep, значит ли что нейтралы ?)
функцией RemoveGuardPosition вырубить нельзя это. Мне кажется ничего не делает она, эта функция полезна на юнитах игроков 0-11, где включен скрипт ИИ. Тестил.
что она делает? отбирает контроль у ИИ-скриптов. Типа он будет стоять и ничего не делать. А у тех юнитов, что включены скрипты, они будут слушаться команды ИИ.
1 вопрос можно добавить в условие проверку на тип юнита.
2 вопрос не совсем понял. че-то не понятная способность у нагато. та самая первая с глазами, что-то про марионетки
раскрыть
мб имеешь в виду переключиться на юнита (чтоб меню абил этого юнита отображалось на панеле)? снимаешь выделение с отряда, добавляешь обратно выделение в нужном порядке. По идее кто первый добавлен, и меню абил того и будет отображено. Неизвестно, будет ли работать выделение в нужном порядке (а то мб при добавлении героя этот гер по-любому займет первую позицию в выделенном отряде, но выделен должен быть у вас первый добавленный ).
вотсмотри раздел проходимость. Она объяснит как устроено все. вотможно использовать здания, или декорации - так сказать искусственные блокираторы путей. Есть конечно настоящие блокираторы. Это прояснит вам немножко. Думаю, это самый простой для вас вариант вотв этой теме есть карта, которая триггерно задает паффинг. скачал с хайва. можно триггерно создать паффинг
вот таких бы побольше)) особенно для сельхозяйственных нужд для сурвайла.
мне не хватает для сельскохозяйственных нужд.
особенно не знаю какие иконки нужна вставить для способности "собирать" и "копать" и "посеять"
Карта путей зданий легко определяется. Используется текстура пути
поле редактора "Пути- Карта путей"
возьмем текстуру фермы:
PathTextures\4x4SimpleSolid.tga
у всех обычно в текстурках цифры какие-то приписываются. Означают они пиксели. То есть там картинка 4x4. Это самая минимальная. Пробовал сделать меньше, но потом здание не ставится нормально при строительстве (ставится только через каждые 4 клетки), сделал по-другому, можно взять иконку 4x4, квадрат с 2x2 середину закрасить розовым, края черным). вот статья
еще цифры означают и реальный игровой размер площадки здания.
например числа 4x4. здесь 4 означает, что 4 квадрата. короче площадь с размером 4 квадрата на 4 квадрата.
1 маленький квадрат = 32x32 (его можно увидеть в редакторе, сетку включите)
площадь 4квадрата x 4квадрата = 128x128
площадь 10квадрата x 10 квадрата = 320x320 и так далее
можно использовать код
можно брать массив ректы. создаете ректы под разные размеры (их там не много).
set Rect_32x32[2] = (Rect(0, 0, 64,64)) это не существующий сделал для себя
set Rect_32x32[4] = (Rect(0, 0, 128,128)) площадка фермы и др
set Rect_32x32[8] = (Rect(0, 0, 256, 256)) площадка башни грифона и кузницы и др
set Rect_32x32[10] = (Rect(0, 0, 320, 320)) площадка алтаря, лесопилки и др
set Rect_32x32[12] = (Rect(0, 0, 384, 384)) площадка казармы и др
и так далее
короче берем двигаем центр ректа в предполагаемую точку, проверяем функцией GetPathingRect.
в коде каждые 32 координаты смещения точки проверяется точка. Не хотелось бы проверять через каждую координату, лучше через каждые 32 координаты. Тут сразу же выходит из цикла, если например в точке нельзя строить (или что там по условию).
function GetPathingRect takes rect re, pathingtype pt, boolean pathable returns integer
//available pathing types
//PATHING_TYPE_ANY //if this is false you can't walk/build/fly on it
//PATHING_TYPE_WALKABILITY //if this is false you can't walk on it
//PATHING_TYPE_FLYABILITY //if this is false you can't fly on it
//PATHING_TYPE_BUILDABILITY //if this is false you can't build on it
//PATHING_TYPE_PEONHARVESTPATHING //don't know
//PATHING_TYPE_BLIGHTPATHING //if this is false you can't build ziggs on it
//PATHING_TYPE_FLOATABILITY //don't know
//PATHING_TYPE_AMPHIBIOUSPATHING //don't know
local real r = 32 //size of pathing blocks
local real x = GetRectMinX(re)
local real y
local real x2 = GetRectMaxX(re)
local real y2 = GetRectMaxY(re)
local boolean b = pathable
local integer k = 0
loop
exitwhen x >= x2 or b!=pathable
set y = GetRectMinY(re)
loop
exitwhen y >= y2 or b!=pathable
if y < y2 and x < x2 then
set b = (not IsTerrainPathable(x, y, pt)) //точка где можно строить, функция инверсная.
if not b then
set k = k + 1 //кол-во точек, в которых нельзя строить
endif
endif
set y = y + r
endloop
set x = x + r
endloop
set re = null
set pt = null
// call BJDebugMsg("проверка на стройку " + I2S(k) )
return k //если бы хотя бы одна точка не подходит под площадку значит здесь невозможно применить площадку
endfunction
эти ректы еще помогают записывать площадки в регион. Можно потом проверять не занята ли площадка, или можно здесь копать и др.
или при строительстве записываете площадку в регион. Потом проверяете.
Берете записываете. Например можно взять поле вот, в этом поле можно записать размер здания. Бесполезно поле для большинства здании.
Короче понял как сделать (ну и в принципе ничего сложного. методом тыка узнал как это сделать. до этого уже 2 часа добил):
расписываю
у меня есть почва
обрабатываю. Но вообще-то не нужно вырезать, просто выделите и все. Но я уж поздно, обработал. По примеру уберсплатов для зданий в варике не вырезаны края. Просто альфа канал стоит
Ну и .. (понял бы любой)
сохраняете в формате tga, потом конвентируете (можно прогой Warcraft 3 Viewer). и смотрим, что получилось
получилось не очень, нужно наверное другую картинку подобрать.
скачивал даже 3d Max 2017 (но там не конвектирует из max в mdx)
Короче помогло "запустить от имени администратора", и потом кликнуть Run Script => NeoDexInstaller.ms. И появится вкладка NeoDex. Мне кажется эту папку приложения Gmax лучше хранить на рабочем столе.
Когда пытаюсь открыть скачанную чужую модель выдает "An unknown error has occured". Что делать?
либо путь к папке с прогой Warcraft 3 Model Editor указана кириллица или путь к модели указана кириллица. В пути не должно быть русских букв. Это одна из причин не работы. Догадался, что здесь как в jngp думал, что достаточно только проге указать путь на english, забывая об моделях
там у обоих должна быть указана эта абилка. если у одного из них нет ее, но эта форма указана в параметре = может фаталить. скорее всего это у вас и случилось. вот
Сейчас поговорим про Графика - Анимация: Точка броска и Графика - Анимация: Обратный ход броска, они составляют общее время каста. Честно говоря, не понял, что пишут на английском, и немного сбивает с толку. Нашел ссылку. Пробовал подробно провести собственные тесты, проводил тесты на паладине на "благодать".
Art - Animation - Cast Point (Real)
The amount of time it takes a unit/building/hero to go through half the physical movement necessary to cast a spell. If the unit/building/hero has no animations for casting spells, the time set in this field still applies, but there will be no viewed physical movement. This field combines additively with "Art - Animation - Cast Backswing" to form the total time taken to physically cast a spell.
Графика - Анимация: Точка броска (Real)
Можно таймером проверить это время между событиями "юнит начинает применять способность" и "юнит приводит способность в действие". В событии "юнит начинает применять способность" юнит начинает проводить анимацию (махание руками), а в событии "юнит приводит в способность в действии" юнит уже накидывает эффекты (на себя кидает эффект, или на цель, или область). Короче это время между этими двумя событиями, между началом анимации и киданием эффекта. За это время нельзя будет заставить юнита резко применить другую анимацию. Сделано специально, чтобы юниты во время анимации резко не принимали другую анимацию, а просто доделывали её до конца. не обязательно эффект кидается в противника, эффект можно над небом появится освещая всех. Короче говоря эффект это какое-то действие заклинания, а не только спецэффекты. Даже событие приводит в действие переводится так: EVENT_PLAYER_UNIT_SPELL_EFFECT. Когда юнит кидает молот бурь, у противника начинается только-только появляться бафф "оглушение", это значит он получил эффект. Или когда паладин применяет щит неуязвимости, у него появляется бафф (заметьте, что событие не работает у таких способностей как "Укрыться за щитом", поскольку при применении у него нету баффа). Еще эффект приходит, когда нажимаешь и эффекты приходят типа буран, звездопад, покой.
Art - Animation - Cast Backswing (Real)
The amount of time it takes a unit/building/hero to go through half the physical movement necessary to cast a spell. If the unit/building/hero has no animations for casting spells, the time set in this field still applies, but there will be no viewed physical movement. This field combines additively with "Art - Animation - Cast Point" to form the total time taken to physically cast a spell.
Графика - Анимация: Обратный ход броска (Real)
Время анимации после применения скилла. Можно таймером проверить это время между событиями "юнит приводит способность в действие" и "юнит завершает применение способности". В событии "юнит приводит способность в действии" юнит кидает эффект (если это channeling-заклинание типа буран или зведопад, то заклинание будет продолжаться), а в событии "юнит завершает применение способности" юнит прекращает анимацию (а если это channeling-заклинание, то завершается еще и заклинание). Но в этом промежутке между "приводит" и "завершает" можно перебить анимацию другой: короче юнит помахал, кинул эффект и в этот момент обычно юнит уже должен опускать руки после махания, но приказом можно перебить анимацию. Может не доделать ее.
Эти два поля создают два промежутка, в одном как видим нельзя перебить анимацию, в другом уже можно.
точно также есть и у атаки. раздел бой. поля: "бой - атака 1 - анимация: точка обратного хода" и "бой - атака 1 - анимация: точки повреждения". похожий принцип
карту пример скинул. не забудь включить проверочные триггеры (они время таймером засекают)
но это конечно не ответ на твой главный вопрос.
имеется в виду что
одну и ту же несколько раз добавить юниту (даже оригинал) => не складывается эффект
copy1 + copy2 (разные копии, короче разные типы, основа одна но rawcode разный) = работает
у предметов = работает
с уровнями = не пробовал
Тоже заметил, что не суммируются. Тут одна и та же способность если добавлена несколько раз, то у нее не складываются эффекты. Если только разные создавать: абилка "элуны 1", абилка "элуны 2" или попробовать как выше советовали с уровнями
Понятное дело, что у предметов работает (у айтема эффекты складываются от одной и той же).
KingMaximax, есть же WARCRAFT III Viewer rus
очень хорош как конвектор иконок, и просмотрщик не только иконок, но и моделей. это программа как-то достает текстуры от моделей из архива игры для просмотра модели. как и mdlvis.
Самый большой геммор оказался сейчас с просмотром blp.
Fakov, это как ты хотел сделать просмотр. типа открыл архив карты и посмотрел через просмотр иконку.blp?
Ред. MpW
» WarCraft 3 / Исследование порчи (Blight)
Ред. MpW
» WarCraft 3 / Радиус обзора юнита
не совсем понятно что вы хотите сделать, выражайте четко мысли
Ред. MpW
» WarCraft 3 / Как создать конусные заклинания?
» WarCraft 3 / Редактор моделей
Ред. MpW
» Гильдия «Черамор» / Платные заказы: Ландшафт
Ред. MpW
» WarCraft 3 / Отличия
кстати есть же проверка классификацией Dead, там точно можно узнать мертв или нет. эх любите оптимизировать все до дыр
Ред. MpW
» WarCraft 3 / Особый персонаж
только вызывают целые вопросы. клоны - герои. если они мертвы, перед ареной их оживить, после арены убить?
» WarCraft 3 / Есть ли SetGuardPosition и GetGuardPosition?
Ред. MpW
» WarCraft 3 / Особый персонаж
» WarCraft 3 / Временная преграда для юнитов на триггерах.
вот можно использовать здания, или декорации - так сказать искусственные блокираторы путей. Есть конечно настоящие блокираторы. Это прояснит вам немножко. Думаю, это самый простой для вас вариант
вот в этой теме есть карта, которая триггерно задает паффинг. скачал с хайва. можно триггерно создать паффинг
» WarCraft 3 / Item Icons Misc by Nazarii Hrytsiuk
» WarCraft 3 / Item Icons Misc by Nazarii Hrytsiuk
мне не хватает для сельскохозяйственных нужд.
особенно не знаю какие иконки нужна вставить для способности "собирать" и "копать" и "посеять"
Ред. MpW
» WarCraft 3 / ИИ. Поиск и выбор участка для строительства
поле редактора "Пути- Карта путей"
возьмем текстуру фермы:
PathTextures\4x4SimpleSolid.tga
у всех обычно в текстурках цифры какие-то приписываются. Означают они пиксели. То есть там картинка 4x4. Это самая минимальная. Пробовал сделать меньше, но потом здание не ставится нормально при строительстве (ставится только через каждые 4 клетки), сделал по-другому, можно взять иконку 4x4, квадрат с 2x2 середину закрасить розовым, края черным).
вот статья
еще цифры означают и реальный игровой размер площадки здания.
например числа 4x4. здесь 4 означает, что 4 квадрата. короче площадь с размером 4 квадрата на 4 квадрата.
1 маленький квадрат = 32x32 (его можно увидеть в редакторе, сетку включите)
площадь 10квадрата x 10 квадрата = 320x320 и так далее
set Rect_32x32[2] = (Rect(0, 0, 64,64)) это не существующий сделал для себя
set Rect_32x32[4] = (Rect(0, 0, 128,128)) площадка фермы и др
set Rect_32x32[8] = (Rect(0, 0, 256, 256)) площадка башни грифона и кузницы и др
set Rect_32x32[10] = (Rect(0, 0, 320, 320)) площадка алтаря, лесопилки и др
set Rect_32x32[12] = (Rect(0, 0, 384, 384)) площадка казармы и др
и так далее
короче берем двигаем центр ректа в предполагаемую точку, проверяем функцией GetPathingRect.
в коде каждые 32 координаты смещения точки проверяется точка. Не хотелось бы проверять через каждую координату, лучше через каждые 32 координаты. Тут сразу же выходит из цикла, если например в точке нельзя строить (или что там по условию).
Берете записываете. Например можно взять поле вот, в этом поле можно записать размер здания. Бесполезно поле для большинства здании.
Ред. MpW
» WarCraft 3 / как создавать картинку ubersplat, image? Альфа-канал
Ред. MpW
» WarCraft 3 / G max не могу запустить плагин NeoDex 2.7
Ред. MpW
» WarCraft 3 / War3 Model Editor 1.07 - Проблемы и решения
думал, что достаточно только проге указать путь на english, забывая об моделях
Ред. MpW
» WarCraft 3 / Не могу зайти на сайт и фатал от превращения в ворона
Ред. MpW
» WarCraft 3 / Замедлить скорость анимации атаки
Можно таймером проверить это время между событиями "юнит начинает применять способность" и "юнит приводит способность в действие". В событии "юнит начинает применять способность" юнит начинает проводить анимацию (махание руками), а в событии "юнит приводит в способность в действии" юнит уже накидывает эффекты (на себя кидает эффект, или на цель, или область). Короче это время между этими двумя событиями, между началом анимации и киданием эффекта. За это время нельзя будет заставить юнита резко применить другую анимацию. Сделано специально, чтобы юниты во время анимации резко не принимали другую анимацию, а просто доделывали её до конца.
не обязательно эффект кидается в противника, эффект можно над небом появится освещая всех. Короче говоря эффект это какое-то действие заклинания, а не только спецэффекты. Даже событие приводит в действие переводится так: EVENT_PLAYER_UNIT_SPELL_EFFECT. Когда юнит кидает молот бурь, у противника начинается только-только появляться бафф "оглушение", это значит он получил эффект. Или когда паладин применяет щит неуязвимости, у него появляется бафф (заметьте, что событие не работает у таких способностей как "Укрыться за щитом", поскольку при применении у него нету баффа). Еще эффект приходит, когда нажимаешь и эффекты приходят типа буран, звездопад, покой.
Время анимации после применения скилла. Можно таймером проверить это время между событиями "юнит приводит способность в действие" и "юнит завершает применение способности". В событии "юнит приводит способность в действии" юнит кидает эффект (если это channeling-заклинание типа буран или зведопад, то заклинание будет продолжаться), а в событии "юнит завершает применение способности" юнит прекращает анимацию (а если это channeling-заклинание, то завершается еще и заклинание). Но в этом промежутке между "приводит" и "завершает" можно перебить анимацию другой: короче юнит помахал, кинул эффект и в этот момент обычно юнит уже должен опускать руки после махания, но приказом можно перебить анимацию. Может не доделать ее.
но это конечно не ответ на твой главный вопрос.
» WarCraft 3 / кем был отдан приказ (отследить как?)
Ред. MpW
» WarCraft 3 / Elune's Grace или Благословление Элуны
одну и ту же несколько раз добавить юниту (даже оригинал) => не складывается эффект
copy1 + copy2 (разные копии, короче разные типы, основа одна но rawcode разный) = работает
у предметов = работает
с уровнями = не пробовал
» WarCraft 3 / Elune's Grace или Благословление Элуны
Ред. MpW
» WarCraft 3 / Elune's Grace или Благословление Элуны
Понятное дело, что у предметов работает (у айтема эффекты складываются от одной и той же).
» WarCraft 3 / кем был отдан приказ (отследить как?)
Ред. MpW
» Fa_losophy / FaMPQ
очень хорош как конвектор иконок, и просмотрщик не только иконок, но и моделей. это программа как-то достает текстуры от моделей из архива игры для просмотра модели. как и mdlvis.
» Fa_losophy / FaMPQ