#101 23-12-2011 08:09

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Не очень понял, "разрешение экрана" 1920 - делить на 640 = 3  ?!

Offline

#102 23-12-2011 14:46

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: CLEO для GTA III

В трешке и Васе размер экрана не 640 на 480, а разрешение экрана.


I know everything and nothing...

Offline

#103 26-12-2011 08:47

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Как проверить, перевернулась ли машинf, так понимаю ключевое слово flipped, но есть два проверочных опкода 01f4 и 020d (чем отличаются?), а ещё есть опкод flipped_for_2_seconds - кто может занимался этим?
И чем отличается опкод wrecked?
_Щас попробую в трёшку впихнуть repair car  smile

Last edited by reute70 (26-12-2011 08:50)

Offline

#104 26-12-2011 09:48

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: CLEO для GTA III

wrecked - транспорт взорван или потоплен, sunk - потоплен, flipped_for_2_seconds - находится в перевёрнутом положении более 2 секунд.

Offline

#105 26-12-2011 12:03

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Спасиб за перевод(хотя кое-что и уточнено) !
__Вобщем, repair_car не удалось "внедрить" wink, 01f4 работает, а вот после замены его на опкод 020d уже при посадке ГГ в гараже скрипт стал срабатывать(смотрелось это - машина подпрыгивает и еле двигается), а garage $PORTLAND_PAYNSPRAY_GARAGE respray_done просто, как я понял - ставит "метку" покрашено!?

Offline

#106 26-12-2011 14:55

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Так как repair в трёшке не работает, решил сделать, как один раз обсуждали - нажал две кнопки, удаляется машина, на её месте создаётся с тем же ID`ом, в неё помещается ГГ:
:UNFLIP_10
wait 250
if
   Player.Defined($PLAYER_CHAR)
else_jump @UNFLIP_10
if
   Actor.Driving($PLAYER_ACTOR)
else_jump @UNFLIP_10
03C0: 0@ = actor $PLAYER_ACTOR car
if and
05EE:  key_pressed 17   // Ctrl       
05EE:  key_pressed 81   // Q
else_jump @UNFLIP_10
Car.StorePos(0@, 1@, 2@, 3@)
3@ += 2 // integer values
4@ = Car.Angle(0@)
Model.Destroy(0@)
    Model.Load(0@)
    038B: load_requested_models
while not Model.Available(0@) //8248: not model 6@ available
    wait 10
end
00A5: 5@ = create_car 0@ at 1@ 2@ 3@
Car.Angle(5@) = 4@
0224: set_car 5@ health_to 900
Model.Destroy(0@)
01C3: remove_references_to_car 5@  // 0@
0369: put_player $PLAYER_CHAR in_car 0@
wait 200
jump @UNFLIP_10

но чё-то не то (зависает игра)?
Надо сначала ID машины взять, опкод помещения ГГ в машину не там поставил?

Offline

#107 27-12-2011 00:58

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Попробуй это.

{$CLEO}
wait 250
while true
    if
        0256:   player 0 defined
    then
        if
            00E0:   player 0 driving
        then
            if and
                05EE:   key_pressed 17   // Ctrl       
                05EE:   key_pressed 81   // Q
            then
                03C1: 0@ = player 0 car
                05F5: call_scm_func @Car_Repair params_count 1 car 0@
            end
        end
    end
    wait 0
end

:Car_Repair
05E7: 0@ = car 0@ struct
0@ += 0x200
05DF: write_memory 0@ size 4 value 1000.0 virtual_protect 0
0@ += 0x88
05E3: call_method 0x545850 struct 0@ num_params 0 pop 0
05F6: ret 0

Last edited by DK22Pac (27-12-2011 01:02)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#108 27-12-2011 08:10

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Спасибо большое, попробую!
Но ведь тут есть работа с памятью, значит, не на все ехе пойдёт?!
(я сначала пробую на Snow City, а уж потом на оригинальном wink

Offline

#109 28-12-2011 22:57

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

{$CLEO}
wait 250
while true
    if
        0256:   player 0 defined
    then
        if
            00E0:   player 0 driving
        then
            if and
                05EE:   key_pressed 17   // Ctrl       
                05EE:   key_pressed 81   // Q
            then
                03C1: 0@ = player 0 car
                gosub @Car_Repair // 0@ - car handle
            end
        end
    end
    wait 0
end

:Car_Repair
05E7: 0@ = car 0@ struct
05E5: 1@ = game_version
if
    1@ == 0
then    
    05E3: call_method 0x53C240 struct 0@ num_params 0 pop 0
else
    05E3: call_method 0x53C480 struct 0@ num_params 0 pop 0
end
0@ += 0x200
05DF: write_memory 0@ size 4 value 1000.0 virtual_protect 0
return

SCM-функции в этой клео криво работют. Параметры не передаются.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#110 30-12-2011 14:52

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Поправочка. SCM-функции работают на ура, просто были проблемы с .ini с Дежи-ного сайта. На радостях написал ещё парочку полезных SCM-функций. wink

//-----------------------------------------------------------------------------------
:getCoordsFromActor
{
05F5: call_scm_func @getCoordsFromActor 4 actor $PLAYER_ACTOR offset 0.0 2.0 0.0 store_to 0@ 1@ 2@
}
05E6: 0@ = actor 0@ struct
0@ += 4
05E5: 5@ = game_version
05EC: 6@ = current_thread_pointer
6@ += 0x34
if
    5@ == 0
then    
    05E1: call 0x5A37D0 num_params 4 pop 4 0@ 1 6@ 6@
else
    05E1: call 0x5A3A90 num_params 4 pop 4 0@ 1 6@ 6@
end
05F6: ret 3 1@ 2@ 3@

//-----------------------------------------------------------------------------------
:getCoordsFromCar
{
05F5: call_scm_func @getCoordsFromCar 4 car 3@ offset 0.0 2.0 0.0 store_to 0@ 1@ 2@
}
05E7: 0@ = car 0@ struct
0@ += 4
05E5: 5@ = game_version
05EC: 6@ = current_thread_pointer
6@ += 0x34
if
    5@ == 0
then    
    05E1: call 0x5A37D0 num_params 4 pop 4 0@ 1 6@ 6@
else
    05E1: call 0x5A3A90 num_params 4 pop 4 0@ 1 6@ 6@
end
05F6: ret 3 1@ 2@ 3@

//-----------------------------------------------------------------------------------
:getCoordsFromObject
{
05F5: call_scm_func @getCoordsFromObject 4 object 3@ offset 0.0 2.0 0.0 store_to 0@ 1@ 2@
}
05E8: 0@ = object 0@ struct
0@ += 4
05E5: 5@ = game_version
05EC: 6@ = current_thread_pointer
6@ += 0x34
if
    5@ == 0
then    
    05E1: call 0x5A37D0 num_params 4 pop 4 0@ 1 6@ 6@
else
    05E1: call 0x5A3A90 num_params 4 pop 4 0@ 1 6@ 6@
end
05F6: ret 3 1@ 2@ 3@

//-----------------------------------------------------------------------------------
:getLocalVarOffset
{
05F5: call_scm_func @getLocalVarOffset 1 var 0 store_to 1@
}
05EC: 1@ = current_thread_pointer
0@ *= 4
1@ += 0x30
005A: 1@ += 0@
05F6: ret 1 1@

//-----------------------------------------------------------------------------------
:getActorBodypartPosition
{
05F5: call_scm_func @getActorBodypartPosition 2 actor $PLAYER_ACTOR bodypart SUPPERARML store_to 0@ 1@ 2@
}
05E6: 0@ = actor 0@ struct
0@ += 0x1A4
1@ *= 4
005A: 0@ += 1@
05E0: 0@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x10
05E0: 0@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x80
05E0: 1@ = read_memory 0@ size 4 virtual_protect 0
0@ += 4
05E0: 2@ = read_memory 0@ size 4 virtual_protect 0
0@ += 4
05E0: 3@ = read_memory 0@ size 4 virtual_protect 0
05F6: ret 3 1@ 2@ 3@

//-----------------------------------------------------------------------------------
:ActorRemoveBodypart
{
05F5: call_scm_func @ActorRemoveBodypart 2 actor $PLAYER_ACTOR bodypart SUPPERARML
}
05E6: 0@ = actor 0@ struct
05E5: 2@ = game_version
if
    2@ == 0
then
    05E3: call_method 0x4EAEE0 struct 0@ num_params 2 pop 0 0 1@
else
    05E3: call_method 0x4EAF90 struct 0@ num_params 2 pop 0 0 1@
end
05F6: ret 0

Номера

//-----------------------------------------------------------------------------------
{
eNums bodyparts
}
const
    SLOWERLEGL = 0
    SMID       = 1
    SHEAD      = 2
    SUPPERARML = 3
    SUPPERARMR = 4
    SLHAND     = 5
    SRHAND     = 6
    SUPPERLEGL = 7
    SUPPERLEGR = 8
    SFOOTL     = 9
    SFOOTR     = 10
    SLOWERLEGR = 11    
end

Last edited by DK22Pac (30-12-2011 19:13)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#111 30-12-2011 18:44

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Э-э-э, а что такое ActorBodypart... с номерами ?
И чего там с ".ini с Дежи-ного сайта" ? - на всякий случай

Offline

#112 30-12-2011 19:04

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Номера частей педа.
Сейчас у меня .ini от инсталлятора CLEO.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#113 31-12-2011 14:38

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Да я перевёл, хоть и "немец" по образованию wink
Считывание координат частей тела... - трансформеры, подспорье в создании анимаций?!

Offline

#114 11-01-2012 18:12

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

to DK22Pac

На гтафорумс в ветке мода Хбокс автор говорил, что у тебя есть скрипт, чтоб фары светили пореалистичнее - можешь поделиться? А то в трёшке это один из самых стрёмных моментов...

Offline

#115 21-01-2012 00:58

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

@reute70
http://www.mediafire.com/?rdvvedn46oaz70d
Вот мой кар-спаунер)

{$CLEO}
05E5: 8@ = game_version
while true
    wait 0
    if
        player.Defined($PLAYER_CHAR)
    then
        for 0@ = 90 to 150
            05F5: call_scm_func @getCarModelName 1 model 0@ get_string_offset_to 10@
            05F5: call_scm_func @getStringNumChars 2 string_offset 10@ include_null_terminator 0 get_num_chars_to 9@
            if
                9@ <> 0
            then
                05F5: call_scm_func @testCheat 2 string_offset 10@ num_chars 9@ get_result_to 3@
                if
                    3@ == 1
                then
                    0054: store_player $PLAYER_CHAR position_to 1@ 2@ 3@
                    02C1: set 4@ 5@ 6@ to_car_path_coords_closest_to 1@ 2@ 3@
                    05F5: call_scm_func @getDistanceBetweenPoints 6 XYZ 1@ 2@ 3@ and_XYZ 4@ 5@ 6@ to 7@
                    if
                        7@ > 15.0
                    then
                        05F5: call_scm_func @getCoordsFromActor 4 actor $PLAYER_ACTOR offset 0.0 3.0 0.0 store_to 4@ 5@ 6@
                    end
                    05F5: call_scm_func @spawnCar 4 model 0@ XYZ 4@ 5@ 6@
                    9@ *= 2
                    if
                        8@ == 0
                    then
                        9@ += 0x95CCB6
                    else
                        9@ += 0x95CE6E
                    end
                    if
                        8@ == 0
                    then
                        13@ = 0x95CCB6
                        14@ = 0x5051E0
                    else
                        13@ = 0x95CE6E
                        14@ = 0x5052C0
                    end
                    0085: 7@ = 13@
                    0085: 11@ = 10@
                    for 15@ = 0 to 19
                        05E0: 12@ = read_memory 11@ size 1 virtual_protect 0
                        05DF: write_memory 13@ size 2 value 12@ virtual_protect 0
                        inc(11@)
                        13@ += 2
                    end
                    05DF: write_memory 9@ size 2 value 0x20 virtual_protect 0 //
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x73 virtual_protect 0 // s
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x70 virtual_protect 0 // p
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x61 virtual_protect 0 // a
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x77 virtual_protect 0 // w
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x6E virtual_protect 0 // n
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x65 virtual_protect 0 // e
                    9@ += 2
                    05DF: write_memory 9@ size 2 value 0x64 virtual_protect 0 // d
                    05E1: call 14@ num_params 2 pop 2 0 7@
                end
            end
        end
    end
end

{$I scmfuncs.txt}

SCM-ф-ции

//-----------------------------------------------------------------------------------
:spawnCar
{
05F5: call_scm_func @spawnCar 4 model 0@ XYZ 4@ 5@ 6@
}
model.Load(0@)
038B: load_requested_models 
car.Create(4@, 0@, 1@, 2@, 3@)
model.Destroy(0@)
car.RemoveReferences(4@)
05F6: ret 0

//-----------------------------------------------------------------------------------
:showTextBox
{
05F5: call_scm_func @showTextBox 1 string_offset 0@
}
05E5: 1@ = game_version
if
    1@ == 0
then
    3@ = 0x95CCB6
    4@ = 0x5051E0
else
    3@ = 0x95CE6E
    4@ = 0x5052C0
end
for 1@ = 0 to 19
    05E0: 2@ = read_memory 0@ size 1 virtual_protect 0
    05DF: write_memory 3@ size 2 value 2@ virtual_protect 0
    inc(0@)
    3@ += 2
end
05E1: call 4@ num_params 2 pop 2 0 3@
05F6: ret 0

//-----------------------------------------------------------------------------------
:getCoordsFromActor
{
05F5: call_scm_func @getCoordsFromActor 4 actor $PLAYER_ACTOR offset 0.0 2.0 0.0 store_to 0@ 1@ 2@
}
05E6: 0@ = actor 0@ struct
0@ += 4
05E5: 5@ = game_version
05EC: 6@ = current_thread_pointer
6@ += 0x34
if
    5@ == 0
then    
    05E1: call 0x5A37D0 num_params 4 pop 4 0@ 1 6@ 6@
else
    05E1: call 0x5A3A90 num_params 4 pop 4 0@ 1 6@ 6@
end
05F6: ret 3 1@ 2@ 3@

//-----------------------------------------------------------------------------------
:getDistanceBetweenPoints
{
05F5: call_scm_func @getDistanceBetweenPoints XYZ 1@ 2@ 3@ and 4@ 5@ 6@ to 7@
} 
0087: 6@ = 0@ 
0087: 7@ = 1@ 
0087: 8@ = 2@ 
0063: 6@ -= 3@ 
0063: 7@ -= 4@ 
0063: 8@ -= 5@ 
006B: 6@ *= 6@ 
006B: 7@ *= 7@ 
006B: 8@ *= 8@ 
005B: 6@ += 7@ 
005B: 6@ += 8@ 
01FB: 6@ = square_root 6@ 
if 
    6@ < 0.0 
then 
    0097: absf 6@ 
end
05F6: ret 1 6@    

//-----------------------------------------------------------------------------------
:getCarModelName
{
05F5: call_scm_func @getCarModelName 1 model 90 get_string_offset_to 1@
}
0@ *= 4
0@ += 0x83D408
05E0: 0@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x4
05F6: ret 1 0@

//-----------------------------------------------------------------------------------
:getStringNumChars
{
05F5: call_scm_func @getStringNumChars 2 string_offset 1@ include_null_terminator 1 get_num_chars_to 2@
}
for 2@ = 0 to 99
    05E0: 3@ = read_memory 0@ size 1 virtual_protect 0
    if
        3@ == 0
    then
        if
            1@ == 1
        then
            inc(2@)
        end
        05F6: ret 1 2@
    end
    inc(0@)
end
05F6: ret 1 0

//-----------------------------------------------------------------------------------
:stringReverse
{
05F5: call_scm_func @stringReverse 4 string_offset 0x885B90 num_chars 1@ store_to 0x5F7650 skip_null_terminator 1
}
if
    3@ == 0
then
    1@ -= 2
else
    dec(1@)
end
005A: 2@ += 1@
0085: 6@ = 2@
for 4@ = 0 to 1@
    05E0: 5@ = read_memory 0@ size 1 virtual_protect 0
    05DF: write_memory 2@ size 1 value 5@ virtual_protect 0
    dec(2@)
    inc(0@)
end
inc(6@)
05DF: write_memory 6@ size 1 value 0 virtual_protect 0
05F6: 0

//-----------------------------------------------------------------------------------
:testCheat
{
05F5: call_scm_func @testCheat 2 string_offset 1@ num_chars 2@ get_result_to 3@
}
05E5: 3@ = game_version
if
    3@ == 0
then
    05F5: call_scm_func @stringReverse 4 string_offset 0x885B90 num_chars 1@ store_to 0x5F7650 skip_null_terminator 1
    05E2: call_function 0x5A08B0 num_params 2 pop 2 0@ 0x5F7650 2@
else
    05F5: call_scm_func @stringReverse 4 string_offset 0x885B40 num_chars 1@ store_to 0x5F7438 skip_null_terminator 1
    05E2: call_function 0x5A0B70 num_params 2 pop 2 0@ 0x5F7438 2@
end                                                         
if
    2@ == 0
then
    if
        3@ == 0
    then
        05DF: write_memory 0x885B90 size 1 value 0 virtual_protect 0
    else
        05DF: write_memory 0x885B40 size 1 value 0 virtual_protect 0
    end
    05F6: ret 1 1
else
    05F6: ret 1 0
end

Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#116 21-01-2012 15:28

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Большое спасибо!
Насчёт карспаунера - scm_func вызываются из текстового файла, лежащего в папке Cleo ?!

Offline

#117 21-01-2012 16:14

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: CLEO для GTA III

Нет, эти функции куда-нибудь вниз скрипта кинуть.

Offline

#118 21-01-2012 17:55

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: CLEO для GTA III

Он у меня в папке CLEO.
Вот все нужные файлы. (в аттаче)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#119 22-01-2012 23:04

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Насчёт headlight.asi - прямоугольник света у фары всё-таки немного виден и корона "слегка" просвечивает через крыло машины - это, наверно, вряд ли можно исправить(с таким движком)?

Offline

#120 06-02-2012 20:58

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Поставил простенький код 041E: set_radio_station 9 0 (когда в машине), срабатывает, но мп3 начинает проигрываться, когда в меню выйдешь и обратно (поставил на клавишу Delete) - как сделать, шоб сразу, как при переборе станций?
И каждый раз, когда нажимаешь - проигрываться начинает с начала "списка" - можно сделать, чтоб случайный был трэк? (этакий рандомайзер wink

Offline

#121 11-02-2012 22:27

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Как оживлённо на форуме!
Спрошу по-другому - есть опкод для вызова паузы в игре? - надо сымитировать нажатие кнопки Esc и обратно в игру.

Offline

#122 12-02-2012 15:27

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: CLEO для GTA III

Если в меню и можно, то обратно с помощью скриптов - нет.

Offline

#123 13-02-2012 10:36

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Хотя б в меню, ещё раз стукнуть по эскейпу смогу - не в лом!

Offline

#124 13-02-2012 13:04

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: CLEO для GTA III

Поздно прочел заголовок темы "Cleo для GTA III". Например, для са адрес byte 0xBA677B - запись 1 или 0 вкл/выкл меню... Для III не знаю, но все можно найти в .idb Листенера.

Last edited by Jack Daniel's (13-02-2012 13:04)

Offline

#125 29-02-2012 09:16

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: CLEO для GTA III

Решил через Cleo сделать гараж, откуда в миссии Getaway выбегают мужики, чтоб ограбить банк
0219: $PORTLAND_MY_GARAGE = create_garage 18 from 1092.3 -234.1 8.5 1082.3 -242.5 13.5
03DA: set_garage $PORTLAND_MY_GARAGE camera_follows_player  // достаточно только первого опкода
- дверь открывается, машина исчезает при закрытии "шторки" (изнутри можно наблюдать, если отойти), при открытии - ничего нет и так впихать тачек можно много...
Попробую конечно, и через main.scm(использовал и локальные переменные), но хотелось бы понять...

PS Извиняюсь, поставил задержку wait 1000 - всё нормально, видать, несколько раз активировался гараж при нажатии клавиши(вначале хотел сделать пикап, но для отладки сделал по-простому) !

PPS Вобщем при загрузке сохранений дверь гаража не открывается, хотя за ней машины есть и при отдалении от них они исчезают, а ещё хотел попробовать использовать при активировании гаража локальные переменные (маркеры остаются)!

Last edited by reute70 (29-02-2012 15:08)

Offline

Board footer

Powered by FluxBB