сколько будет это правильно обработать? сделал сам, но видны границы квадратиков (что очень не красиво). мне нужна черноземная почва, нашел картинку, сделал, но смотрится как песок в варе. думаю нужно искать новую.
тоже тестил давно перерождение, и даже сравнивал с обычной смертью, всегда ноль возвращает. откуда берется интересное число 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 / Радиус обзора юнита
не совсем понятно что вы хотите сделать, выражайте четко мысли
Ред. 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
Ред. MpW
» WarCraft 3 / Вопрос про облости
тема