Кому нужно - берите) мне не жалко. Будут вопросы, пишите здесь.
################################################################################ ################################################################################ ######Lumberjacking script v2.0################################################# ######Writed by Arghhhh######################################################### ################################################################################ #!!!!Запускать скрипт нужно стоя рядом с сундуком!!!!!!######################### ################################################################################ #В сундуке должно лежать:####################################################### #бинты ####################################################### #топоры ####################################################### #рекол скролы ####################################################### #грит агилки ####################################################### #реги на рекол ####################################################### #лессер хилы ####################################################### #лессер рефреши ####################################################### #Молоко(A pitcher of milk)###################################################### #Бекон(Small Bacon slice) ###################################################### ################################################################################ #Ваш чар должен быть снабжен:################################################### #Армом ##################################################### #Вепом ##################################################### #Щитом ##################################################### #Рунбукой с рунами(1ая руна домой, 2ая в лес)################################### ################################################################################ #Запускать скрипт с процесса Start############################################## #После того, как зпустите, вас попросят указать оружие и щит.################### ################################################################################ ################################################################################ var nom_run ; не менять############################################# Var F ; не менять############################################# var sc = 0 ; не менять############################################# ################################################################################ Var FileName='C:\lumbalex.txt' ; путь к файлу с тайлами####################### ################################################################################ var rassa = 0 ;Расса чара: 1 - клерик,0 - лучник ############# ################################################################################ var Ruda = '0x1BDD' ; Тип бревен var rec = 1 ; перезаряжать рунбуку?(0-нет, 1 - да) var recolles = 0 ;Реколится в лес? 1- да 0 -нет var svitok = '0x1F4C' ; свиток рекола var topor = '0x0F43' ; топор)) var bagpak = '0x4011E079' ; ID бэгпака вашего чара. var Box = '0x40114A21'; ID коробки куда складывать и откуда брать бинты и тд var Boxt = '0x0E79'; Type коробки куда складывать и откуда брать бинты и тд var ff = 1 ; Кушать? 1- да 0 - нет var t = 3000 ; время лечения бинтом (в мс ) var s = 450 ; максимальный вес var ar = 0 ; Если убили, ресаться?(работает не стабильно, тк требуются координаты кнопок на экране, они у каждого различаются) var runebook = '0x4004FD08' ; ID рунбука Var skill = 0 ; Снимать +скилл вещи?(роба, маска, плащь) 1-да 0-нет var gotobox = 1 ; Подходить к сундуку?(если руна далеко от сундука, не должно быть больших препядствий на пути) 0 -нет 1- да ################################################################################ uo.set('norbcalc','1') uo.set('norbcheck','1') uo.set('injectecho','1') UO.Set('finddistance','10') uo.setdressspeed(600) ################################################################################ ###########Настройки для ходилки:############################################### ################################################################################ var MaxTraceDistance=4 var Speed=2 var StepTimeOut=500 ################################################################################ sub start() uo.print("Ukagite orugie") uo.addobject("wep") while uo.targeting() wait(500) wend if rassa == 1 then uo.print("Ukagite shit") uo.addobject("shit") while uo.targeting() wait(500) wend wait(500) end if uo.useobject("wep") wait(500) uo.useobject("shit") wait(500) uo.print("OK") if ff == 1 then uo.exec('exec foodcontrol') wait(1000) end if if ar == 1 then uo.exec('exec avtores') wait(1000) end if wait(500) uo.exec('exec deathcontrol') wait(1000) uo.exec('exec rubit') wait(1000) end sub Sub avtores() while true if uo.dead() then UO.LClick(1008,337) wait(1000) UO.LClick(354,349) wait(5000) UO.Recall("0x400C16A2","6") wait(11111) uo.exec("terminate all") end if wait(1000) wend wait(1000) end if sub peoplecontrol() uo.warmode(0) wait(150) CheckLag() wait(50) uo.WaitMenu('Tracking','Players') uo.UseSkill('Tracking') wait(1800) if not uo.injournal("You see no signs of players to track.") then uo.exec("exec waitforppl") end if wait(50) end sub Sub waitforppl() uo.exec("terminate rubit") wait(200) go_to_home() wait(10000) putit() wait(300000) uo.exec('exec rubit') end sub Sub foodcontrol() UO.SetGlobal('food','no') uo.deletejournal() wait(500) while uo.GetGlobal("food")=='no' if uo.injournal("You fail to do that! You are hungry!") then wait(500) UO.SetGlobal('food','yes') wait(500) uo.deletejournal() wait(500) end if wait(200) wend wait(200) end sub sub deathcontrol() var x var y var l var nm var k repeat if uo.life < uo.getmaxhp() - 10 then wait(50) if skill == 1 then uo.unequip('Hat') wait(100) uo.unequip('Hat') wait(200) uo.unequip('Cloak') wait(100) uo.unequip('Cloak') wait(200) uo.unequip('Robe') wait(100) uo.unequip('Robe') wait(200) end if uo.exec("terminate rubit") wait(100) uo.exec('exec avtoheal') wait(100) uo.exec('exec avtohealb') wait(100) uo.exec('exec avtostam') wait(250) UO.SetGlobal('heal','yes') wait(100) uo.useobject("wep") wait(250) uo.useobject("shit") wait(250) uo.useobject("wep") wait(250) uo.useobject("shit") wait(250) uo.usetype("0x0F08") wait(200) uo.findtype("0x002F",-1,"ground") wait(100) uo.addobject("enemy","finditem") UO.WarMode(1) wait(100) UO.Attack('enemy') uo.deletejournal() k=0 while uo.CountGround("0x002F") or k > 300000 x=uo.GetX('enemy') y=uo.Gety('enemy') wait(200) GoToXY(X,Y,1) wait(300) k=k+500 wend wait(1000) Looting() wait(1000) UO.WarMode(0) wait(500) go_to_home() wait(1000) UO.SetGlobal('heal','no') wait(5000) if skill == 1 then uo.usetype("0x1515") wait(100) uo.usetype("0x1F03") wait(100) uo.usetype("0x1549") wait(100) uo.usetype("0x1515") wait(100) uo.usetype("0x1F03") wait(100) uo.usetype("0x1549") wait(1000) end if uo.exec('exec rubit') end if wait(100) until false wait(100) end sub sub avtokemp() while uo.GetGlobal("heal")=='yes' uo.msg(".camp") wait(34000) wend end sub Sub avtoheal() var k while uo.GetGlobal("heal")=='yes' if uo.life < uo.getmaxhp() then uo.deletejournal() k=0 uo.bandageself() repeat wait(500) k=k+500 until UO.InJournal("You gain") or UO.InJournal("You fail healing!") or Uo.injournal("failed.") or k > t + 500 end if wait(10) wend wait(10) end sub Sub avtohealb() while uo.GetGlobal("heal")=='yes' if uo.life < uo.getmaxhp() - 50 then uo.usetype("0x182E") wait(1000) end if wait(10) wend wait(10) end sub Sub avtostam() while uo.GetGlobal("heal")=='yes' if uo.stamina < 10 then uo.usetype("0x182F") wait(1000) end if wait(10) wend wait(10) end sub Sub Looting() var t,l t=1800 dim LootingItem[3] LootingItem[1] = '0x0EED' LootingItem[2] = '0x1BDD' LootingItem[3] = '0x09AA' for l=1 to 3 uo.FindType(LootingItem[l],"-1","lastcorpse") if uo.FindCount()>0 and uo.GetDistance("lastcorpse")<=2 then uo.moveitem('finditem') wait(t) end if next end sub Sub again() uo.exec("terminate rubit") wait(250) go_to_home() wait(1000) putit() wait(200000) uo.exec('exec rubit') end sub Sub Rubit() var time Var Tl,T,X,Y,Z Var F=File(FileName) F.Open() putit() dobor() go_to_Shahta() wait(5000) Beg: if uo.weight > s then GoTo Konec End If Tl=safecall F.Readln() Tl=Trim(Tl) If Tl=='File read error' Then GoTo Ext End If T=GetNumb(Tl,0) X=GetNumb(Tl,1) Y=GetNumb(Tl,2) Z=GetNumb(Tl,3) GoToXY(X,Y,1) wait(500) peoplecontrol() uo.deletejournal() UO.WaitTargetTile(Str(t),Str(x),Str(y),Str(z)) time = 0 wait(500) UO.Usetype(topor) repeat wait(500) time = time + 500 until uo.injournal("There is nothing here to chop.") or uo.injournal("That is too far away.") or uo.injournal("You stop Lumberjacking") or uo.injournal("It appears immune to your blow") or uo.injournal("You fail to do that! You are hungry!") or uo.injournal("Unexpected target info") or time > 20000 GoTo Beg Ext: F.Close() GoTo Nachalo Konec: go_to_home() wait(5000) dobor() wait(1000) putit() wait(1000) recharge() F=File(FileName) F.Open() wait(500) go_to_Shahta() wait(1000) GoTo Beg Nachalo: uo.exec('exec again') End Sub Sub GetNumb(C,I) var J,T,K J=0 K=1 While K>0 J=J+1 If (Mid(C,J,1)==' ') Or (J>=Len(C)-1) Then If I==0 Then T=Val(Left(C,J)) Else T=GetNumb(Right(C,Len(C)-J-1),I-1) EndIf K=0 EndIf wend UO.Print(T) return T endsub sub putit() uo.useobject(Box) wait(1000) uo.useobject(Box) wait(1000) repeat uo.findtype(Ruda) uo.moveitem('finditem','0',Box) wait(1000) until not uo.count(Ruda) end sub sub dobor() uo.useobject(Box) wait(1000) uo.useobject(Box) wait(1000) if uo.count(topor) < 2 then uo.msg("Топор") uo.findtype(topor,-1,Box) wait(100) uo.moveitem('finditem','1',bagpak) wait(2000) end if if rassa == 1 then if uo.count(0x0F7B) < 10 then while uo.count(0x0F7B) < 10 uo.msg("Рег1") uo.findtype(0x0F7B,-1,Box) wait(100) uo.moveitem('finditem',str(10-uo.count(0x0F7B)),bagpak) wait(2000) wend end if if uo.count(0x0F86) < 10 then while uo.count(0x0F86) < 10 uo.msg("Рег2") uo.findtype(0x0F86,-1,Box) wait(100) uo.moveitem('finditem',str(10-uo.count(0x0F86)),bagpak) wait(2000) wend end if if uo.count(0x0F7A) < 10 then while uo.count(0x0F7A) < 10 uo.msg("Рег3") uo.findtype(0x0F7A,-1,Box) wait(100) uo.moveitem('finditem',str(10-uo.count(0x0F7A)),bagpak) wait(2000) wend end if wait(50) end if if uo.count('0x0DE1') < 9 then while uo.count('0x0DE1') < 9 uo.msg("Кемп") uo.findtype('0x0DE1','-1',Box) wait(100) uo.moveitem('finditem',str(9-uo.count('0x0DE1')),bagpak) wait(2000) wend end if if uo.count(0x0E21) < 70 then while uo.count(0x0E21) < 70 uo.msg("Бинты") uo.findtype(0x0E21,-1,Box) wait(100) uo.moveitem('finditem',str(70-uo.count(0x0E21)),bagpak) wait(2000) wend end if if uo.count(0x182F) < 15 then while uo.count(0x182F) < 15 uo.msg("Рефреш") uo.findtype(0x182F,-1,Box) wait(100) uo.moveitem('finditem',str(15-uo.count(0x182F)),bagpak) wait(2000) wend end if if uo.count(0x182E) < 15 then while uo.count(0x182E) < 15 uo.msg("Хил") uo.findtype(0x182E,-1,Box) wait(100) uo.moveitem('finditem',str(15-uo.count(0x182E)),bagpak) wait(2000) wend end if if uo.count(0x0F08) < 2 then while uo.count(0x0F08) < 2 uo.msg("Агилка") uo.findtype(0x0F08,-1,Box) wait(100) uo.moveitem('finditem',str(2-uo.count(0x0F08)),bagpak) wait(2000) wend end if if uo.count(0x0E20) then while uo.count(0x0E20) uo.msg("Выкидываем бинты") uo.findtype(0x0E20,-1) wait(100) uo.moveitem('finditem','200',box) wait(2000) wend end if if uo.count(0x0EED) then while uo.count(0x0EED) uo.msg("Выкидываем золото") uo.findtype(0x0EED,-1) wait(100) uo.moveitem('finditem','20000',box) wait(2000) wend end if if uo.count(0x0F0E) then while uo.count(0x0F0E) uo.msg("Выкидываем бутылки") uo.findtype(0x0F0E,-1) wait(100) uo.moveitem('finditem','20000',box) wait(2000) wend end if if uo.count(0x09AA) then while uo.count(0x09AA) uo.msg("Выкидываем пандоры") uo.findtype(0x09AA,-1) wait(100) uo.moveitem('finditem','20000',box) wait(2000) wend end if if uo.GetGlobal("food")=='yes' then uo.msg("Пьем молоко") uo.findtype(0x1F99,-1,Box) uo.moveitem('finditem',1,bagpak) wait(1000) uo.usetype("0x1F99") wait(1000) uo.msg("Хрумкаем бекон") uo.findtype(0x0978,-1,Box) uo.moveitem('finditem',1,bagpak) wait(1000) uo.usetype("0x0978") wait(1000) UO.SetGlobal('food','no') wait(500) uo.exec('exec foodcontrol') end if uo.msg("Готов") wait(1000) Copyright() end sub Sub recharge() if rec == 1 then uo.useobject(Box) wait(1000) uo.msg("Recharge") uo.findtype(svitok,-1,box) wait(300) uo.moveitem('finditem','1','bagpak') if recolles == 1 then wait(1000) uo.moveitem('finditem','1','bagpak') wait(1000) UO.Recall(runebook,'1') end if wait(1000) UO.Recall(runebook,'1') wait(1000) uo.msg("Recharged") uo.findtype(svitok,-1) wait(100) uo.moveitem('finditem','0',box) wait(1000) end if end sub Sub go_to_home() var yy var xx uo.deletejournal() wait(250) while uo.CountGround(Boxt)==0 uo.Useskill("Hiding") wait(100) if rassa == 1 then UO.Recall(runebook,20);рекол в лес для клера else UO.Recall(runebook,2);рекол в лес для лучника end if wait(1000) if uo.mana < 35 then uo.useskill("Meditation") end if wait(11000) wend if gotobox == 1 then xx=uo.GetX(box) yy=uo.Gety(box) wait(200) GoToXY(xx,yy,1) end if wait(50) end sub Sub go_to_Shahta() If recolles == 1 then if rassa == 1 then UO.Recall(runebook,22);рекол в лес для клера else UO.Recall(runebook,3);рекол в лес для лучника end if wait(1000) uo.useskill("Meditation") wait(10000) end if end sub Sub gotoxy(GoX,GoY,Prec) UO.SetGlobal("Logging","0") UO.SetGlobal("BlindWalk","0") var LastDir UO.SetGlobal("GlobalGoX",str(GoX)) UO.SetGlobal("GlobalGoY",str(GoY)) while not IsEnd(GoX,GoY,Prec) LogInfo('Just walking') LastDir=GoUntilHit(GoX,GoY,Prec) if not IsEnd(GoX,GoY,Prec) then LogInfo('Tracing') FullAroundTrace(LastDir,GoX,GoY,Prec) end if wend end sub Sub FullAroundTrace(StartDir,GoX,GoY,Prec) var LineX=UO.GetX() var LineY=UO.GetY() var CurDir=StartDir var Direction=CountDirection(GoX,GoY,CurDir,Prec) var StartX,StartY var MovesDone=0 repeat StartX=UO.GetX() StartY=UO.GetY() CurDir=Tracer(CurDir,Direction,Prec) if (CurDir==GetDir(GoX,GoY,Prec)) then return endif if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then return end if MovesDone=MovesDone+1 CurDir=AddToDir(CurDir,-Direction,Prec) until MovesDone>MaxTraceDistance end sub Sub CountDirection(GoX,GoY,StartDir,Prec) var GoDir=GetDir(GoX,GoY,Prec) var MyX=UO.GetX() var MyY=UO.GetY() if GoDir<StartDir then return -1 end if if GoDir>StartDir then return 1 end if if Abs(MyX-GoX)>Abs(MyY-GoY) then if (GoDir==3 and GoY>MyY) OR (GoDir==7 and GoY<MyY) then return -1 else return 1 end if else if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then return -1 else return 1 end if end if end sub Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec) var x3,y3,x4,y4 x3=StartX y3=StartY x4=StartX+(XFromDir(Dir)-StartX)*Speed y4=StartY+(YFromDir(Dir)-StartY)*Speed return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec) end sub Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec) if x1==x3 and y1==y3 then return false end if var z1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1) var z2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1) if z1*z2>0 then return false else LogInfo('Vector info:') LogInfo('x1= '+str(x1)) LogInfo('y1= '+str(y1)) LogInfo('x2= '+str(x2)) LogInfo('y2= '+str(y2)) LogInfo('x3= '+str(x3)) LogInfo('y3= '+str(y3)) LogInfo('x4= '+str(x4)) LogInfo('y4= '+str(y4)) return true end if end sub Sub IsDiap(X,X0,X1,Prec) if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then return true end if return false end sub Sub GoUntilHit(GoX,GoY,Prec) var LastDir LastDir=GetDir(GoX,GoY,Prec) var CouldMove repeat LastDir=GetDir(GoX,GoY,Prec) if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then CouldMove=TryDir(LastDir,Prec) end if until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove return LastDir end sub Sub IsEnd(GoX,GoY,Prec) if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then LogInfo('END FOUND') return true else return false end if end sub Sub GetDir(GoX,GoY,Prec) var MyX=UO.GetX() var MyY=UO.GetY() var DiffX=Abs(UO.GetX()-GoX) var DiffY=Abs(UO.GetY()-GoY) var GoDir=0 if (DiffX/(DiffY+0.1))>=2 then if (MyX>GoX) then GoDir=7 else GoDir=3 end if else if (DiffY/(DiffX+0.1))>=2 then if (MyY>GoY) then GoDir=5 else GoDir=1 end if else if (MyX>GoX) and (MyY>GoY) then GoDir=6 else if (MyX>GoX) and (MyY<GoY) then GoDir=8 else if (MyX<GoX) and (MyY>GoY) then GoDir=4 else if (MyX<GoX) and (MyY<GoY) then GoDir=2 end if end if end if end if end if end if return GoDir end sub Sub Tracer(StartDir,Direction,Prec) var CurDir=StartDir var Result repeat Result=TryDir(CurDir,Prec) if not Result then CurDir=AddToDir(CurDir,Direction,Prec) end if until Result return Result end sub Sub AddToDir(Dir,Cnt,Prec) var NewDir=Dir NewDir=NewDir+Cnt while NewDir>8 NewDir=NewDir-8 wend while NewDir<1 NewDir=NewDir+8 wend return NewDir end sub Sub TryDir(Dir,Prec) var BegX=UO.GetX() # Ia?aeuiia O var BegY=UO.GetY() # Ia?aeuiia Y var Counter=0 var GoX=BegX var GoY=BegY GoX=XFromDir(Dir) GoY=YFromDir(Dir) if not IsPass(GoX,GoY) then LogInfo(str(GoX)+':'+str(GoY)+' is not passable') return false end if return TurnAndGoDir(Dir,Prec) end sub Sub XFromDir(Dir) if Dir==2 OR Dir==3 Or Dir==4 then return (UO.GetX()+1) end if if Dir==6 OR Dir==7 Or Dir==8 then return (UO.GetX()-1) end if return (UO.GetX()) end sub Sub YFromDir(Dir) if Dir==8 OR Dir==1 Or Dir==2 then return (UO.GetY()+1) end if if Dir==4 OR Dir==5 Or Dir==6 then return (UO.GetY()-1) end if return (UO.GetY()) end sub Sub TurnAndGoDir(Dir,Prec) var StartDir=GetDirToDir(UO.GetDir(),Prec) var StartX=UO.GetX() var StartY=UO.GetY() var EndDir var Counter=0 GoDir(Dir,Prec) repeat EndDir=GetDirToDir(UO.GetDir(),Prec) wait(100) Counter=Counter+1 until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=8 if Counter>=8 then return 0 end if if StartY<>UO.GetY() or StartX<>UO.GetX() then return Dir else GoDir(Dir,Prec) repeat wait(100) Counter=Counter+1 until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/100 if Counter>=StepTimeOut/100 then LogInfo('Step timeout reached') return 0 else return Dir end if end if end sub Sub GetDirToDir(GotDir,Prec) var ChangedDir=-GotDir ChangedDir=AddToDir(ChangedDir,5,Prec) return ChangedDir end sub Sub Copyright() var ttt = 900 uo.fontcolor('0x0017') uo.msg("Made") wait(ttt) uo.fontcolor('0x0044') uo.msg("Made by") wait(ttt) uo.fontcolor('0x0026') uo.msg("Made by Arghhhh") wait(ttt) end sub Sub DirToInj(Dir) dim Dirs[9] Dirs[1]=1 Dirs[2]=2 Dirs[3]=3 Dirs[4]=6 Dirs[5]=9 Dirs[6]=8 Dirs[7]=7 Dirs[8]=4 return (Dirs[Dir]) end sub Sub GoDir(Dir,Prec) dim Dirs[9] Dirs[1]=35 Dirs[2]=40 Dirs[3]=34 Dirs[4]=39 Dirs[5]=33 Dirs[6]=38 Dirs[7]=36 Dirs[8]=37 var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX"))) var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY"))) var GoDistance if (DistanceX-Prec)<Speed then GoDistance=DistanceX-Prec else if (DistanceY-Prec)<Speed then GoDistance=DistanceY-Prec else GoDistance=Speed endif endif UO.Press(Dirs[Dir],GoDistance) end sub Sub IsPass(X,Y) if UO.GetGlobal("BlindWalk") then return true endif dim Types[60] Types[1]=3 Types[2]=25 Types[3]=51 Types[4]=63 Types[5]=113 Types[6]=140 Types[7]=172 Types[8]=219 Types[9]=232 Types[10]=235 Types[11]=239 Types[12]=243 Types[13]=248 Types[14]=251 Types[15]=264 Types[16]=267 Types[17]=282 Types[18]=289 Types[19]=321 Types[20]=379 Types[21]=420 Types[22]=440 Types[23]=476 Types[24]=499 Types[25]=513 Types[26]=542 Types[27]=578 Types[28]=586 Types[29]=622 Types[30]=700 Types[31]=804 Types[32]=1740 Types[33]=1758 Types[34]=1770 Types[35]=1779 Types[36]=1779 Types[37]=1881 Types[38]=1886 Types[39]=1801 Types[40]=1805 Types[41]=1813 Types[42]=1820 Types[43]=1831 Types[44]=1833 Types[45]=1843 Types[46]=1850 Types[47]=1873 Types[48]=1876 Types[49]=1885 Types[50]=1888 Types[51]=1946 Types[52]=1969 Types[53]=2500 Types[54]=2539 for var i=1 TO 53 STEP 2 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then return true end if next return false end sub Sub LogInfo(Line) if not UO.GetGlobal("Logging")=="0" then UO.TextOpen() UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line); end if end sub Sub Abs(X) if X>0 then return X else return (-X) end if end sub Sub CheckLag() UO.DeleteJournal() repeat UO.Click('backpack') wait(200) until UO.InJournal('backpack') end sub
Добавил Проверку игроков трекингом, чар будет есть, если проголодался, стабилизировал убийство риперов, и прочие мелкие исправлеия