Yoko
http://forum.yoko.com.ua/

Использование вандов из пака
http://forum.yoko.com.ua/viewtopic.php?f=20&t=17464
Page 1 of 1

Author:  kobol [ 2014-08-09 16:33:45 ]
Post subject:  Использование вандов из пака

Это старый скрипт. Новый в след сообщении.
=============
Использование wWand(1) - ищет в паке и подсумках UsefulWand [1]="a Magic wand of Paralyze" и берет его (UO.useobject() )


Code:
; примеры вызовов 
############
sub wDeamon()
wWand(24)
end sub
############
sub wVortex()
wWand(26)
end sub
############
sub wBlade()
wWand(25)
end sub


############
sub wElem()
;   UsefulWand[20] = 'a Magic wand of Water Elemental';
;   UsefulWand[21] = 'a Magic wand of Earth Elemental';
;   UsefulWand[22] = 'a Magic wand of Fire Elemental';
;   UsefulWand[23] = 'a Magic wand of Air Elemental';

var i

for i=20 to 23
if wWand(i)==1 then
return
end if
next


end sub




##################### использование wand #############################
sub wWand(wnum)
   ; Использование wWand(1) - ищет в паке и подсумках UsefulWand [1]="a Magic wand of Paralyze" и берет его (UO.useobject() )
   DIM WandType[4]
   WandType[0] = '0x0DF2' ;
   WandType[1] = '0x0DF3' ;
   WandType[2] = '0x0DF4' ;
   WandType[3] = '0x0DF5' ;
   #------------- примеры имен вандов ----------------
   ;a Magic wand of Cure (8 charges)
   ;a Magic wand of Mana Drain (10 charges)
   ;a Magic wand of Reactive Armor (10 charges)
   ;a Magic wand of Flame Strike (8 charges)
   ;нужно сравнивать по имени и учитывать бы число зарядов. разряженные ванды не брать
   var wCount=26
   dim UsefulWand [26] ;
   UsefulWand [1]='a Magic wand of Paralyze' ;
   UsefulWand [2]='a Magic wand of Paralyze Field' ;
   UsefulWand [3]='a Magic wand of Greater Heal' ; 4: Greater Heal !!!!!!!!!!!!!!! 11 -10
   UsefulWand [4]='a Magic wand of Cure' ; 2: Cure !!!!!!!!!!!!!!! 3 -5
   UsefulWand [5]='a Magic wand of Invisibility' ; 6: Invisibility !!!!!!!!!!!!!!! 19 -10
   UsefulWand [6]='a Magic wand of Reveal' ;!!!!
   UsefulWand [7]='a Magic wand of Recall' ;
   UsefulWand [8]='a Magic wand of Magic Reflection' ; 5: Magic Reflection !!!!!!!!!!!!!!! 16 -10

   UsefulWand [8]='a Magic wand of Wall of Stone' ;
   UsefulWand [9]='a Magic wand of Fire Field' ;
   UsefulWand [10]='a Magic wand of Magic Arrow' ; 1: Magic Arrow !!!!!!!!!!!!!!!    1 -10  ;
   UsefulWand [11]='a Magic wand of Reactive Armor' ; 1: Reactive Armor !!!!!!!!!!!!!!! 2 -10
   UsefulWand [12]='a Magic wand of Mana Drain' ;
   UsefulWand [13]='a Magic wand of Protection' ; 2: Protection !!!!!!!!!!!!!!! 4 -5
   UsefulWand [14]='a Magic wand of Fireball' ; 3: Fireball !!!!!!!!!!!!!!! 5 -5
   UsefulWand [15]='a Magic wand of Poison' ; 3:
   UsefulWand [16]='a Magic wand of Telekinesis' ;
   UsefulWand [17]='a Magic wand of Teleport' ; 3:
   UsefulWand [18]='a Magic wand of Dispel Field' ; 5: Dispel Field !!!!!!!!!!!!!!! 15 -5
   UsefulWand [19]='a Magic wand of Poison Field' ; 5: Poison Field !!!!!!!!!!!!!!! 18 -10
   ; ванды элемов
   
   UsefulWand[20] = 'a Magic wand of Water Elemental';
   UsefulWand[21] = 'a Magic wand of Earth Elemental';
   UsefulWand[22] = 'a Magic wand of Fire Elemental';
   UsefulWand[23] = 'a Magic wand of Air Elemental';
   
   UsefulWand[24] = 'a Magic wand of Daemon'; 'Magic wand of Daemon'
   UsefulWand[25]='a Magic wand of Blade Spirit' ;
   UsefulWand[26] = 'a Magic wand of Energy Vortex';
   
; ищем заданный wand в паке и подсумках
var WNameRQ,WNameCurr, ti, TTov, si, zz,flFound
   
;PrintInColor(str(wnum),'2999')
;PrintInColor(UsefulWand[wnum],'2999')
   
   ; ищем ванды
   for ti=0  to 3 ; перебираем по типам вандов
      Ttov=WandType[ti]
      
      UO.FindType(Ttov,'-1', 2) ; находим wand в паке и подсумках
      wait (10)
      If UO.FindCount() > 0 then
         
         repeat ; <<<<<<<<<<<<<<< цикл поиска вандов в паке и подсумках
            uo.click ('finditem')
            wait (10)
            WNameCurr =UO.GetName( 'finditem' ) ; имя найденного ванда
            ;PrintInColor(WNameCurr,clr)
            WNameRQ=UsefulWand[wnum]
            WNameRQ=left(WNameRQ, InStr(WNameRQ, '(')) ; a Magic wand of Mana Drain (10 charges)
            ;PrintInColor(WNameRQ,'2998')
            zz=instr(WNameCurr,WNameRQ) ; имя из массива совпадает с именем найденного ванда?
            ;PrintInColor(str(zz),clo)
            flFound=0

            if zz>-1 then ;если да, то берем его в руки
               flFound=1
               ti=3 ; для выхода из цикла
               uo.useobject("finditem")
            PrintInColor(WNameCurr,"2524")
            else
               uo.Ignore("finditem") ; ??????????????
            end if
            UO.FindType(Ttov,'-1',2)
            wait (10)
         until not UO.FindCount() or  flFound==1 ; ; <<<<<<<<<<<<<<<
      end if
            ;CheckLag()
   next ;  переходим к следующему типу Wandа
   
   uo.IgnoreReset()
   wait (100)
UO.Print('Finished...')
return flFound


end sub


Author:  kobol [ 2015-12-26 17:42:42 ]
Post subject:  Re: Использование вандов из пака

Новый скрипт на использование вандов из пака.
Ищет ванды в паке и подсумках, берет их serial-ы и сохраняет их в глобальные переменные wXXXID для последующего UseObject(wXXXID) из функций, забинденных на хоткеи.

Состоит из двух частей.
1. При коннекте к серверу первым делом надо запустить функцию sub wWand() (см. code 1)
Ищет ванды в паке и подсумках, берет их serial-ы и сохраняет их в глобальные переменные wXXXID
2. После этого можно юзать функции для вызова конкретных вандов. (см. code 2)

Code:
##################### использование wand #############################
## '1-wParID 2-wPFid 3-wGHID 4-wCureID 5=wInvID 6-wRevealID 7-wRclID 8-wMRefID 9-wWSid 10-wFFid
## '11-wMArrID 12-wRAid 13-wManaDRid 14-wMassDispID 15-wINVid 16-wPoisID 17-wTKinID 18-wTPortID 19-wDispFid

## '20-wPsFID 21-wWElID 22-wEElID 23-wFElid 24-wAElid  25-wDeamonID 26-wBladeID 27-wVortexID 28-wResurID

sub wWand()
; Использование wWand() - ищет ванды в паке и подсумках, берет их serial и сохраняет в глобальные переменные wXXXID для последующего UseObject(wXXXID) из функций, забинденных на хоткеи.
DIM WandType[4]
WandType[0] = "0x0DF5" ;
WandType[1] = "0x0DF3" ;
WandType[2] = "0x0DF4" ;
WandType[3] = "0x0DF2" ;
#------------- примеры имен вандов ----------------
;a Magic wand of Cure (8 charges)
;a Magic wand of Mana Drain (10 charges)
;a Magic wand of Reactive Armor (10 charges)
;a Magic wand of Flame Strike (8 charges)
;нужно сравнивать по имени и учитывать бы число зарядов. разряженные ванды не брать
var wCount=28, iw
dim UsefulWand [29] ;
UsefulWand [1]="a Magic wand of Paralyze" ; wParID
UsefulWand [2]="a Magic wand of Paralyze Field" ; wPFid
UsefulWand [3]="a Magic wand of Greater Heal" ; wGHid
UsefulWand [4]="a Magic wand of Cure" ; wCureID
UsefulWand [5]="a Magic wand of Invisibility" ; wInvID
UsefulWand [6]="a Magic wand of Reveal" ; wRevealID
UsefulWand [7]="a Magic wand of Recall" ;wRclID
UsefulWand [8]="a Magic wand of Magic Reflection" ;wMRefID

UsefulWand [9]="a Magic wand of Wall of Stone" ;wWSid
UsefulWand [10]="a Magic wand of Fire Field" ;wFFid
UsefulWand [11]="a Magic wand of Magic Arrow" ; wMArrID
UsefulWand [12]="a Magic wand of Reactive Armor" ;'wRAid
UsefulWand [13]="a Magic wand of Mana Drain" ;'wManaDRid

#'UsefulWand [14]="a Magic wand of Protection" ;# wProtID

UsefulWand [14]="a Magic wand of Mass Dispel" ; wMassDispID

#'UsefulWand [15]="a Magic wand of Fireball" ; # wFBid
UsefulWand [15]="a Magic wand of Invisibility" ; wINVid

UsefulWand [16]="a Magic wand of Poison" ; wPoisID
UsefulWand [17]="a Magic wand of Telekinesis" ; 'wTKinID
UsefulWand [18]="a Magic wand of Teleport" ; 'wTPortID
UsefulWand [19]="a Magic wand of Dispel Field" ;wDispFid
UsefulWand [20]="a Magic wand of Poison Field" ;wPsFid

; ванды элемов

UsefulWand[21] = "a Magic wand of Water Elemental";wWElID
UsefulWand[22] = "a Magic wand of Earth Elemental";wEElID
UsefulWand[23] = "a Magic wand of Fire Elemental";wFElid
UsefulWand[24] = "a Magic wand of Air Elemental";wAElid

UsefulWand[25] = "a Magic wand of Daemon";wDeamonID
UsefulWand[26]="a Magic wand of Blade Spirit" ;wBladeID
UsefulWand[27] = "a Magic wand of Energy Vortex";wVortexID
UsefulWand[28] = "a Magic wand of Resurrection";wResurID



; ищем заданный wand в паке и подсумках
var WNameRQ,WNameCurr, ti, TTov, si, zz,flFound, zzar, wserial

;PrintColor(str(wnum),"2999")
;PrintColor(UsefulWand[wnum],"2999")

; ищем ванды
for ti=0  to 3
   ; перебираем по типам вандов
   Ttov=WandType[ti]
   UO.FindType(Ttov,"-1", 2) ; находим wand в паке и подсумках
   wait (10)
   If UO.FindCount() > 0 then
      repeat ; <<<<<<<<<<<<<<< цикл поиска вандов в паке и подсумках
      uo.click ("finditem")
      wait (100)
      WNameCurr =UO.Journal(0)
      zzar=instr(WNameCurr,"charges")
      ;PrintColor("Zaryad found="+str(zzar),clm)
      PrintColor(WNameCurr,clb)
      ## Нашли какой-то ванд, пробегаем по массиву и ищем с каким именем он совпадет и смотрим в какую переменную из 27 запихать его ID
      
      for iw=1 to wCount
         WNameRQ=UsefulWand[iw]
         zz=InStr(WNameCurr, "(")-1
         WNameCurr=left(WNameCurr, zz) ; a Magic wand of Mana Drain (10 charges)
         WNameRQ=left(WNameRQ,InStr(WNameRQ, "(")-1)
         wait(20)
         ;PrintColor("1 "+WNameRQ+"<<",clr)
         ;PrintColor("2 "+WNameCurr+"<<",clm)
         
         flFound=0
         ;              if zz>-1 and zzar>-1 then
         
         if WNameRQ==WNameCurr and zzar>-1 then
            
            ; имя совпадает и заряды есть
            ;PrintColor(WNameCurr,clm)
            ;PrintColor("Zaryad found="+str(zzar),0x0120)
            wserial=uo.getserial("finditem")
            wait(50)
            ;PrintColor("123 wserial="+(wserial),clb)
            
            ## 1-wParID 2-wPFID 3-wGHID 4-wCureID 5=wInvID 6-wRevealID 7-wRclID 8-wMRefID 9-wWSid 10-wFFid
            ## 11-wMArrID 12-wRAid 13-wManaDRid 14-wProtID 15-wFBid 16-wPoisID 17-wTKinID 18-wTPortID 19-wDispFid
            ## 20-wPsFID 21-wWElID 22-wEElID 23-wFElid 24-wAElid  25-wDeamonID 26-wBladeID 27-wVortexID
            
            ### Добавлены операторы continue; break; switch->case->end switch
            ;PrintColor("130 iw="+str(iw),clb)
            
            switch iw
         case 1 ;
            UO.SetGlobal("wParID",wserial)
            PrintColor("1 wParID="+UO.GetGlobal("wParID"),4)
         case 2 ;
            UO.SetGlobal("wPFID",wserial)
            PrintColor("2 wPFID="+UO.GetGlobal("wPFID"),4)
         case 3 ;
            UO.SetGlobal("wGHID",wserial)
            PrintColor("3 wGHID="+(wserial),4)
         case 4 ;
            UO.SetGlobal("wCureID",wserial)
            PrintColor("4 wCureID="+(wserial),4)
         case 5 ;
            UO.SetGlobal("wInvID",wserial)
            PrintColor("5 wInvID="+(wserial),4)
         case 6 ;
            UO.SetGlobal("wRevealID",wserial)
            PrintColor("6 wRevealID="+(wserial),4)
         case 7 ;
            UO.SetGlobal("wRclID",wserial)
            PrintColor("7 wRclID="+(wserial),4)
         case 8 ;
            UO.SetGlobal("wMRefID",wserial)
            PrintColor("8 wMRefID="+(wserial),4)
         case 9 ;
            UO.SetGlobal("wWSiD",wserial)
            PrintColor("9 wWSid="+(wserial),4)
         case 10 ;
            UO.SetGlobal("wFFiD",wserial)
            PrintColor("10 wFFid="+(wserial),4)
         case 11 ;
            UO.SetGlobal("wMArrID",wserial)
            PrintColor("11 wMArrID="+(wserial),4)
         case 12 ;
            UO.SetGlobal("wRAiD",wserial)
            PrintColor("12 wRAid="+(wserial),4)
         case 13 ;
            UO.SetGlobal("wManaDRiD",wserial)
            PrintColor("13 wManaDRid="+(wserial),4)
         case 14 ;
            UO.SetGlobal("wMassDispID",wserial)
            PrintColor("14 wMassDispID="+(wserial),4)
         case 15 ;
            UO.SetGlobal("wINVid",wserial)
            PrintColor("15 wINVid="+(wserial),4)
         case 16 ;
            UO.SetGlobal("wPoisID",wserial)
            PrintColor("16 wPoisID="+(wserial),4)
         case 17 ;
            UO.SetGlobal("wTKinID",wserial)
            PrintColor("17 wTKinID="+(wserial),4)
         case 18 ;
            UO.SetGlobal("wTPortID",wserial)
            PrintColor("18 wTPortID="+(wserial),4)
         case 19 ;
            UO.SetGlobal("wDispFiD",wserial)
            PrintColor("19 wDispFid="+(wserial),4)
         case 20 ;
            UO.SetGlobal("wPsFID",wserial)
            PrintColor("20 wPsFID="+(wserial),4)
         case 21 ;
            UO.SetGlobal("wWElID",wserial)
            PrintColor("21 wWElID="+(wserial),4)
         case 22 ;
            UO.SetGlobal("wEElID",wserial)
            PrintColor("22 wEElID="+(wserial),4)
         case 23 ;
            UO.SetGlobal("wFEliD",wserial)
            PrintColor("23 wFElid="+(wserial),4)
         case 24 ;
            UO.SetGlobal("wAEliD",wserial)
            PrintColor("24 wAElid="+(wserial),4)
         case 25 ;
            UO.SetGlobal("wDeamonID",wserial)
            PrintColor("25 wDeamonID="+(wserial),4)
         case 26 ;
            UO.SetGlobal("wBladeID",wserial)
            PrintColor("26 wBladeID="+(wserial),4)
         case 27 ;
            UO.SetGlobal("wVortexID",wserial)
            PrintColor("27 wVortexID="+(wserial),4)
         case 28 ;
            UO.SetGlobal("wResurID",wserial)
            PrintColor("28 wResurID="+(wserial),4)
            end switch
         end if
         
      next
      
      
      uo.Ignore("finditem") ; ??????????????
      
      UO.FindType(Ttov,"-1",2)
      wait (20)
      until not UO.FindCount()  ; ; <<<<<<<<<<<<<<< or  flFound==1
   else
   end if
   ;CheckLag()
next ;  переходим к следующему типу Wandа

uo.IgnoreReset()
wait (100)
UO.Print("Finished...")


return flFound


end sub


Функции для юзания конкретных вандов

Code:
############# использование вандов #####################################
## '1-wParID 2-wPFid 3-wGHID 4-wCureID 5=wInvID 6-wRevealID 7-wRclID 8-wMRefID 9-wWSid 10-wFFid
## '11-wMArrID 12-wRAid 13-wManaDRid 14-wMassDispID 15-wINVid 16-wPoisID 17-wTKinID 18-wTPortID 19-wDispFid
## '20-wPsFID 21-wWElID 22-wEElID 23-wFElid 24-wAElid  25-wDeamonID 26-wBladeID 27-wVortexID 28-wResurID
############ 1
Sub wPar()
;wWand(1)

if UO.GetGlobal("wParID")=="N/A" then
   PrintColor("wPar not found", clr)
else
   UO.UseObject(UO.GetGlobal("wParID"))
end if

end sub
############ 2
Sub wPF()
UO.UseObject(UO.GetGlobal("wPFID"))
end sub
############ 3
Sub wGH()
UO.UseObject(UO.GetGlobal("wGHID"))
end sub
############ 4
Sub wCure()
UO.UseObject(UO.GetGlobal("wCureID"))
end sub
############ 5
Sub wInv()
if UO.GetGlobal("wInvID")=="N/A" then
   PrintColor("wInvID N/A", clr)
else
   UO.UseObject(UO.GetGlobal("wInvID"))
end if
end sub
############ 6
Sub wREV()
UO.UseObject(UO.GetGlobal("wRevealID"))
end sub
############ 7
Sub wRCL()
UO.UseObject(UO.GetGlobal("wRclID"))
end sub
############ 8
Sub wMRef()
UO.UseObject(UO.GetGlobal("wMRefID"))
end sub
############ 9
Sub wWS()
UO.UseObject(UO.GetGlobal("wWSid"))
end sub
############ 10
Sub wFF()
UO.UseObject(UO.GetGlobal("wFFid"))
end sub
############ 11
Sub wMarr()
UO.UseObject(UO.GetGlobal("wMArrID"))
end sub
############ 12
Sub wRA()
UO.UseObject(UO.GetGlobal("wRAid"))
end sub
############ 13
Sub wManaDR()
UO.UseObject(UO.GetGlobal("wManaDRid"))
end sub
############ 14
Sub wMassDisp()
UO.UseObject(UO.GetGlobal("wMassDispID"))
end sub
############ 15
Sub wINV1()
UO.UseObject(UO.GetGlobal("wINVid"))
end sub

## '11-wMArrID 12-wRAid 13-wManaDRid 14-wMassDispID 15-wINVid 16-wPoisID 17-wTKinID 18-wTPortID 19-wDispFid
## '20-wPsFID 21-wWElID 22-wEElID 23-wFElid 24-wAElid  25-wDeamonID 26-wBladeID 27-wVortexID 28-wResurID
############ 16
Sub wPs()
UO.UseObject(UO.GetGlobal("wPoisID"))
end sub
############ 17
Sub wTKin()
UO.UseObject(UO.GetGlobal("wTKinID"))
end sub
############ 18
Sub wTPort()
UO.UseObject(UO.GetGlobal("wTPortID"))
end sub
############ 19
Sub wDispF()
UO.UseObject(UO.GetGlobal("wDispFid"))
end sub
############ 20
Sub wPsF()
UO.UseObject(UO.GetGlobal("wPsFID"))
end sub
############ ;21    wPar wPF wGH wCure wInv wREV wRCL wMRef wWS wFF wPsF wWEl wDeamon wVortex wBlade
Sub wWEl()
UO.UseObject(UO.GetGlobal("wWElID"))
end sub
############; 22
Sub wEEl()
UO.UseObject(UO.GetGlobal("wEElID"))
end sub
############; 23
Sub wFireEl()
UO.UseObject(UO.GetGlobal("wFElid"))
end sub
############; 24
Sub wDeamon()
UO.UseObject(UO.GetGlobal("wAElid"))
end sub
############; 25
Sub wDeamon()
UO.UseObject(UO.GetGlobal("wDeamonID"))
end sub
############; 25
Sub wVortex()
UO.UseObject(UO.GetGlobal("wPFid"))
end sub
############; 26
Sub wBlade()
UO.UseObject(UO.GetGlobal("wBladeID"))
end sub
############; 27
Sub wVortex()
UO.UseObject(UO.GetGlobal("wVortexID"))
end sub
############; 28
Sub wResur()
UO.UseObject(UO.GetGlobal("wResurID"))
end sub




############
Sub wElem()
; UsefulWand[23] = 'a Magic wand of Water Elemental';
; UsefulWand[21] = 'a Magic wand of Earth Elemental';
; UsefulWand[22] = 'a Magic wand of Fire Elemental';
; UsefulWand[20] = 'a Magic wand of Air Elemental';

var i

for i=20 to 23
   if wWand(i)==1 then
      return
   end if
next


end sub


##################################################



Не перфекционист, да.. :oops:

Author:  kobol [ 2015-12-26 17:44:34 ]
Post subject:  Re: Использование вандов из пака

До кучи printColor()
Code:
###################################################
sub PrintColor(text,color)
# PrintInColor("здесь текст",'цвет текста')
# красный   - '38' или '0x0026'  # темно-бирюзовый - '83' или '0x0053'
# оранжевый - '43' или '0x002B'  # голубой    - '89'  или '0x0059'
# желтый    - '53' или '0x0035'  # синий      - '3'   или '0x0003'
# зеленый   - '63' или '0x003F'  # фиолетовый - '120' или '0x0078'
# '1088' - по умолчанию
# 1152 - бирюзовый 1151 - черный 1155 - фиолетовый 1156 - белый  1158 - кр 1161 - синий 1162 - темно зел 1166 ткр 1169 сз
# 2500 2524 - оранж  2517 кр 2567 малин 2566=0x0A06 белый
#  2998 - белый 3008 3221 3600 и выше - контур


UO.ConColor(color)
;UO.Exec('set quiet 0')   # Показывать сообщения Injection.
UO.Print(text)
;UO.Exec('set quiet 1')   # Не показывать сообщения Injection.
UO.ConColor('1088')
endsub


Author:  kobol [ 2015-12-26 17:53:45 ]
Post subject:  Re: Использование вандов из пака

Пример рекола по ванду. Плюс в том, что не теряется хайд при касте.

Code:
############################################################
sub w_rekol()
   var   mX = UO.GetX("self")
   var   mY = UO.GetY("self")

   UO.Press(9) ' переходим в мирное состояние
#   INV() ; !!!!!!!!!!

# ищем рунки в паке
# uo.AddFindList(ListName,Graphic,[Color]) - добавляет Graphic,Color в набор с названием ListName
uo.AddFindList("Runki","0x1F14")
uo.AddFindList("Runki","0x1F15")
uo.AddFindList("Runki","0x1F16")
uo.AddFindList("Runki","0x1F17")

#uo.FindList(ListName,[Container],[Distance],[Notoriety],[Nearest])-осуществляет поиск по набору. Возвращает серийник найденного #объекта. Так же он доступен в finditem и кол-во найденного в uo.findcount()

wRCL() # это функция выбора ванда Recall из пака
wait (10)
;uo.useobject(uo.FindList("Runki","-1"))
UO.WaitTargetObject(uo.FindList("Runki","-1")) # рунка должна лежать в паке, берет первую попавшуюся
wait (400)
while mX == UO.GetX("self") and mY == UO.GetY("self")
   wait (400) # ждем пока улетит (изменятся координаты)
wend
# по-хорошему надо проверять физлы и прочие траблы
PrintColor ("Moved to X="+str(UO.GetX("self")) +" and Y="+str(UO.GetY("self")),clr)

#hiding() # опционально, прячемся

end sub



Page 1 of 1 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/