GUI Friendly Castbar system getting 7 compile errors, need help fixing

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
Ok so heres the errors and i will put a commented arrow pointing to each line they reference:
  1. Expected a name
  2. Expected 'endloop'
  3. Expected a name
  4. Expected a name
  5. Expected a name
  6. Expected a name
  7. Expected a name

JASS:
//TESH.scrollpos=181
//TESH.alwaysfold=0

//The following functions are configure-able, you can change the value after the line that reads: return (something)
//you can change (something) to whatever you want if it matches the type that is already there, at the end of the function
//line: function Name takes nothing returns something, something is the type of return, make sure if you change this u
//change it to a value comparable

//================================================================================
//========================== GCB Configure-able Options ==========================
//================================================================================

function GCB_Defaults_Interval takes nothing returns real
    return 0.04
endfunction

//change this to what you want the refresh rate in seconds to be to be



function GCB_Defaults_Zoffset takes nothing returns real
    return -5.0
endfunction

//change this to what you want the z offset to be



function GCB_Defaults_Xoffset takes nothing returns real
    return -20.0
endfunction

//change this to what you want the x offset to be



function GCB_Defaults_Size takes nothing returns real
    return 7.0
endfunction

//change this to the real number you want the size of the castbar to be, this is best relatively low to keep any spaces minimal



function GCB_Defaults_Symbol takes nothing returns string
    return "|"
endfunction

//change this to what symbol you want the cast bar to be made up of, recommended: , . | [ ] '



function GCB_Defaults_CastBar_Length takes nothing returns integer
    return 40
endfunction

//change this to how many digits you want the string to have, higher numbers are better if under ~80



function GCB_Defaults_Incomplete_NoChannel_Color takes nothing returns string
    return "c1ffc1"
endfunction

//change this to the color code you want to use for any incomplete, non channeling castbars



function GCB_Defaults_Complete_NoChannel_Color takes nothing returns string
    return "00ff00"
endfunction

//change this to the color code you want to use for any complete parts of non channeling castbars



function GCB_Defaults_Incomplete_Channel_Color takes nothing returns string
    return "c1c1ff"
endfunction

//change this to the color code you want to use for any incomplete, channeling castbars



function GCB_Defaults_Complete_Channel_Color takes nothing returns string
    return "0000ff"
endfunction

//change this to the color code you want to use for any complete parts of channeling castbars



function GCB_Defaults_Incomplete_Negative_Color takes nothing returns string
    return "ffc1c1"
endfunction

//change this to the color code you want to use for any incomplete, negative castbars



function GCB_Defaults_Complete_Negative_Color takes nothing returns string
    return "ff0000"
endfunction

//change this to the color code you want to use for any complete parts of negative castbars



function GCB_Default_CastTime takes nothing returns real
    return 2.0
endfunction

//this is the default cast time of any non-set castbars



function GCB_Default_Channeling takes nothing returns boolean
    return false
endfunction

//this is the default true/false of whether or not the cast is a boolean, if its true it will show up as a cast in the castbar

function GCB_OrderFilter takes nothing returns boolean
    local integer this = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), 0)
    loop
        exitwhen this == 0
        if LoadUnit(udg_GCB_Hashtable, StringHash("GCB_Unit"), this) == GetTriggerUnit() and not (LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), this) or LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_New"), this)) then  //<------------------------------------------------------------------------------------------#1
            call SaveBoolean(udg_GCB_Hashtable, StringHash("GCB_Order"), this, true)
        endif  //<---------------------------------------------------------------------------------------------------------#2
        set this = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), this)
    endloop
    return false
endfunction

function GCB_Periodic takes nothing returns nothing
    local integer this = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), 0)
    local integer i
    local string a
    local string b
    loop
        exitwhen this == 0
        if LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Order"), this) or LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeCompleted"), this) >= LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeMax"), this) then
            call SaveBoolean(udg_GCB_Hashtable, StringHash("GCB_Order"), this, false)
            call SaveReal(udg_GCB_Hashtable, StringHash("GCB_TimeComplete"), this, LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeComplete"), this) + GCB_Defaults_Interval())
            set i = R2I(LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeComplete"), this) / LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeMax"), this))
            set a = LoadString(udg_GCB_Hashtable, StringHash("GCB_String"), 0) <-------------------------------------------------------------------------------------------------#3
            set b = a
            set a = SubString(a, 0, i - 1)
            set b = SubString(a, i, GCB_Defaults_CastBar_Length() - 1)
            if not (LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Channeling"), this) or LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), this)) then
                set a = "|cff" + GCB_Defaults_Complete_NoChannel_Color() + a + "|r|cff" + GCB_Defaults_Incomplete_NoChannel_Color() + b
            elseif LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Channeling"), this) and not LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), this) then
                set a = "|cff" + GCB_Defaults_Incomplete_Channel_Color() + b + "|r|cff" + GCB_Defaults_Complete_Channel_Color() + a
            elseif LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), this) then
                set a = "|cff" + GCB_Defaults_Complete_Negative_Color() + a + "|r|cff" + GCB_Defaults_Incomplete_Negative_Color() + b
            else
                set a = "|cff" + GCB_Defaults_Incomplete_Negative_Color() + b + "|r|cff" + GCB_Defaults_Complete_Negative_Color() + a
            endif
            set bj_lastCreatedTextTag = CreateTextTag()
            call SetTextTagText(bj_lastCreatedTextTag, a, GCB_Defaults_Size() * 0.023 / 10)
            if LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), this) then
                call SetTextTagPos(bj_lastCreatedTextTag, GetUnitX(LoadUnit(udg_GCB_Hashtable, StringHash("GCB_Unit"), this) - GCB_Defaults_Xoffset()), GetUnitY(LoadUnitudg_GCB_Hashtable, (StringHash("GCB_Unit"), this)), ((GCB_Defaults_Zoffset() - GCB_Defaults_Size()) - 3))  //<------------------------------------------------------------------------------------#4
            else
                call SetTextTagPos(bj_lastCreatedTextTag, GetUnitX(LoadUnit(udg_GCB_Hashtable, StringHash("GCB_Unit"), this) - GCB_Defaults_Xoffset()), GetUnitY(LoadUnitudg_GCB_Hashtable, (StringHash("GCB_Unit"), this)), GCB_Defaults_Zoffset())  //<----------------------------------------------------------------------------------------------------------------#5
            endif
            call SetTextTagLifespan(bj_lastCreatedTextTag, GCB_Defaults_Interval() + 0.01)
            set this = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), this)
        else
            set udg_GCB_Triggering_Unit = LoadUnit(udg_GCB_Hashtable, StringHash("GCB_Unit"), this) //<------------------------------------------------------------------------------------------------------------------#6
            set udg_GCB_Positive = not LoadBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), this)
            if LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeCompleted"), this) >= LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeMax"), this) then
                set udg_GCB_Time = LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeMax"), this)
                set udg_GCB_Completed = true
            else
                set udg_GCB_Time = LoadReal(udg_GCB_Hashtable, StringHash("GCB_TimeCompleted"), this)
                set udg_GCB_Completed = false
            endif
            set this = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), this)
            call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_Next"), this, LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Next"), LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Next"), this)))
            call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Next"), this), this)
        endif
    endloop
    set a = null
    set b = null
endfunction

//==============================================================
//==================== CastBar Registration ====================
//==============================================================

function GCB_LinkNewBar takes nothing returns nothing
    local integer allocated = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_RecycleList"), 0)
    if allocated == 0 then
        if LoadInteger(udg_GCB_Hashtable, StringHash("GCB_RecycleList"), 0) == 0 then
            call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_ListSize"), 0, LoadInteger(udg_GCB_Hashtable, StringHash("GCB_ListSize"), 0) + 1 )
            set allocated = LoadInteger(udg_GCB_Hashtable, StringHash("GCB_ListSize"), 0)
        else
            call BJDebugMsg("GCB ERROR: You have more than 8190 castbars running at once.")
            set allocated = 0
        endif
    else
        call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_RecycleList"), 0, LoadInteger(udg_GCB_Hashtable, StringHash("GCB_RecycleList"), allocated))
        call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_RecycleList"), allocated, 0)
    endif
    call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_Next"), allocated, 0)
    call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), allocated, LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), 0))
    call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), 0, allocated)
    call SaveInteger(udg_GCB_Hashtable, StringHash("GCB_Next"), LoadInteger(udg_GCB_Hashtable, StringHash("GCB_Previous"), allocated), allocated)
    call SaveReal(udg_GCB_Hashtable, StringHash("GCB_TimeMax"), allocated,udg_GCB_Time)
    call SaveUnitHandle(udg_GCB_Hashtable, StringHash("GCB_Unit"), allocated, udg_GCB_Caster)
    call SaveBoolean(udg_GCB_Hashtable, StringHash("GCB_Channeling"), allocated, udg_GCB_Channeling)
    call SaveBoolean(udg_GCB_Hashtable, StringHash("GCB_Negative"), allocated, udg_GCB_Negative_Cast)
    call SaveBoolean(udg_GCB_Hashtable, StringHash("GCB_New"), allocated, true)
    call SaveBoolean(udg_GCB_Hashtable, StringHash("GCB_Order"), this, false)  //<--------------------------------------------------------------------------------------------------------------------------#7
    if udg_GCB_Target != null and (not udg_GCB_Positive_Cast) then
        set udg_GCB_Caster = udg_GCB_Target
        set udg_GCB_Target = null
        set udg_GCB_Negative_Cast = true
        call GCB_LinkNewBar()
        set udg_GCB_Negative_Cast = false
    else
        set udg_GCB_Caster = udg_GCB_Target
        set udg_GCB_Target = null
        set udg_GCB_Negative_Cast = false
        call GCB_LinkNewBar()
    endif
    set udg_GCB_Caster = null
    set udg_GCB_Target = null
    set udg_GCB_Time = GCB_Default_CastTime()
    set udg_GCB_Channeling = GCB_Default_Channeling()
endfunction

function InitTrig_GCB takes nothing returns nothing
    local trigger trig = CreateTrigger()
    local timer t = CreateTimer()
    set gg_trg_GCB = CreateTrigger(  )
    call TriggerAddCondition(gg_trg_GCB, Filter(function GCB_LinkNewBar))
    call TimerStart(t, GCB_Defaults_Interval(), true, function GCB_Periodic)
    call TriggerAddCondition(trig, Filter(function GCB_OrderFilter))
    set t = null
endfunction


As always, thanks for any help you can provide and +rep for all those who help (if i have spread it around enough)
 

Dirac

22710180
Reaction score
147
You've done this before, you confuse functions for variables.... (like on the thread with static ifs)
Functions must be expressed using the arguments they take

MyFunc is a variable
MyFunc() is a function
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
i dont confuse them, i write most my code in notepad at work then try to compile it after, i just forget a few things and i catch roughly 90% of my mistakes
 

Dirac

22710180
Reaction score
147
So I guess the answers to all your threads and jass suggestions is
"don't code in notepad"
You can't be serious if you're coding in notepad and come right after finished to ask what's wrong.
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
is your goal in life to be an ass? i mean, im friends with a lotta asses... but u take the cake with almost every post dude, for real, im not even mad about it anymore. no1 pointed out that every single JH link on the helper is severly outdated, as in... static ifs werent working, optional requirements werent working, and struct compiles were off

i have it installed now and my spell compiled without any changes from what i had pasted pretty much
other than a few typos
 

Dirac

22710180
Reaction score
147
no1 pointed out that every single JH link on the helper is severly outdated
Wrong, the DL links work, maybe your JH version is outdated because you didn't fully read the post that explains that you have to download it separately. (As in i did read the post and i does work in my computer and i just tested the links and they work just fine)
Stop covering yourself in that huge "you're an asshole" shield you have, you seem to be applying it to every situation you do something wrong.
i have it installed now and my spell compiled without any changes from what i had pasted pretty much
other than a few typos
If this is true then what's this thread for anyways?
 

KaerfNomekop

Swim, fishies. Swim through the veil of steel.
Reaction score
613
So is the thread solved? Or is it open for the sake of argument?
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
i just installed it and no its not solved, i still havent gotten an answer, just a mouthfull of dirac troll spew

and im not covering myself for anything, im plainly stating a fact, your an ass... you simply are, and i have seen other people, including mods, say it

he was bringing up another thread which got solved when i reinstalled, but this one still is open, i simply cant understand the blizzard syntax checker, it makes almost no sense
 

Ayanami

칼리
Reaction score
288
he was bringing up another thread which got solved when i reinstalled, but this one still is open, i simply cant understand the blizzard syntax checker, it makes almost no sense

The error that it displays is pretty vague, yes. But it does point out to the error line. Then, there must be something wrong on that line. So a good programmer would look through that line over and over again and pick out the mistakes.

1) There's no such thing as LoadUnit. There's only [ljass]LoadUnitHandle[/ljass].
2) Error caused due to 1)
3) There's no such thing as LoadString. There's only [ljass]LoadStr[/ljass]
4) Same as 1)
5) Same as 1)
6) Same as 1)
7) Where does this come from?
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
this is a local variable integer, i made a linked list and used this as the link number <--- nvm didnt catch that, thanks, cnp from top one and forgot to switch

thanks again ayanami ill change those

updated it, no compile errors in Vanilla GUI now, thanks a bunch ayanami

PS. i find it eerily ironic that not a single one of the issues was what dirac raged about
 

Dirac

22710180
Reaction score
147
I can bring a whole list of threads where all you do is confuse people with nonsense posts written in notepad and off-topic fights you start with people (mostly luorax and me)
I did point out something you were doing wrong.
You still commit all of those issues because you were writing in notepad (if you use the JH the auto complete helps you to not avoid writing non-existant functions such as LoadUnit or LoadString)
I find ironic that you call my posts a "rage" when you're the one insulting other people and even when all of my posts are thread related (even this one)
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
1. I dont write in notepad for shits and giggles, i do it when im at work and have no access to an editor, options are, write code in notepad, dont write at all

2. I know there was more wrong with it because it wasnt complete and i was not posting this for the resources area yet

3. Luorax and I fought because he said, "Why would you respond like that it has nothing to do with this thread." when i was asking for more information in the post he was refering to, and immedately afterwards he proceeded to ask for more information, it might as well have been a copy of the post he was refering to

and lastly
4.
You've done this before, you confuse functions for variables.... (like on the thread with static ifs)
Functions must be expressed using the arguments they take

MyFunc is a variable
MyFunc() is a function

Is this the post where you stuck to this thread? where you referenced other threads and didnt have a single comment that actually pertained to the code that was there?
 

Dirac

22710180
Reaction score
147
where you referenced other threads and didnt have a single comment that actually pertained to the code that was there?
I absolutely don't get this, I was talking about this code.
Guess I was wrong anyways, that issue doesn't concern this code (I didn't fully read the code and jumped to conclusions, sorry about that becuase you cleared over-raged about this), there are many other that do, such as:
The fact that you're using string hashes instead of a list of functions that point towards integers like those "globals" you wrote.
JASS:
function GCB_Next takes nothing returns integer
    return 1
endfunction

Even though those shouldn't exist if you used a set of variables for this library instead of a hashtable.
Encouraging GUI users to not use the JNGP is wrong, i hope i don't have to explain why.
This system already exists.
Because you're not using JNGP this is actually harder to use for GUI users.
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
I told you i wasnt mad, im still not mad, im simply having a conversation, i may have used words like ass, asshole, maybe even ass-hat but that has nothing to do with whether i am mad or not, i simply speak like that, just like your vocabulary is limited to dont, bad, wrong, stop, and other various putdowns...

It did not pertain to the code because you jumped to conclusions from another post which i actually had right in the first place, but changed it due to incorrect syntax errors from an outdated JH (i started with constants and switched to functions to see if that worked before i posted that)

as far as this system goes...

if you have any input other than: wrong. feel free to share

I used string hashes simply because i wanted it to be use-able with other gui systems without having an integer save-value overlap seeing as it was set to use the player's main hashtable and avoid creating a new one for this system, to suggest to use functions pointing to an integer is the EXACT SAME as saying use BJ's in every single hashtable save/load call

GUI users many times dont use JNGP so i was providing them with something to use without requiring JNGP... so far i have not run into a castbar system for vanilla gui, if there is, link please and ill recycle bin this, else im going to continue doing it, not to "encourage GUI users to not use JNGP" but to provide a resource for those who do not yet, just because something is better, unfortunately does not mean everyone uses it, and along with the GUI version i planned to release a JNGP version just for completion, although i know one already exists.
Just because JNGP is better does not mean every script i write will be for JNGP, and this was pimarily meant as a challenge for myself to see if i could get something working for GUI users

And no, providing a working and efficient resource DOES NOT hurt gui users, thats a plainly ludicrous statement

congrats you will never ever code anything ever that works for gui, thats great for you, but i will occasionally and until you can provide a valid reason why i should not i will continue to do so whenever i want

i have no idea why you seem to think things can be one and only one way, and btw... ~half + of your responses to my threads were you spewing about why something is stupid or wrong and why i should not to do it...
 

Dirac

22710180
Reaction score
147
Coding for GUI users is fine, limiting yourself to vanilla JASS shouldn't be fine, as a result this system turns out to be incredibly inefficient because of that (i never said that this system hurts GUI users but now i do)
If you don't want it to overlap then use completely random numbers, or even, save the string hash of every string and use that instead.
I still think this should use it's own set of arrays instead of a hashtable.
i have no idea why you seem to think things can be one and only one way, and btw... ~half + of your responses to my threads were you spewing about why something is stupid or wrong and why i should not to do it...
I thought you started threads so people could tell you what's wrong with your code, and coding is an exact science so there's only one way to do things to reach an objective the fastest and simplest way (Same reason resources aren't instantly approved)
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
so i could get some help in making it better, not for people to say, thats a stupid pursuit give up now...
get the difference? and no, there is never ever ever only one way to aproach things, coding yes, should be like that, but when its for making a game and the average joe is trying to do it there is also simplicity, to allow them to ease into it, im not saying this is going to be the new standard for cast bar systems, simply something for beginners to use

I would use a set of arrays and actually will have both versions since i made that first, but i wanted the option to use hashtables instead of arrays... and trust me, writing this for hashtables was WAY more confusing than writing it for arrays, just because i dont have that version posted on this thread does not mean it does not exist
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Ghan Ghan:
    Still lurking
    +3
  • The Helper The Helper:
    I am great and it is fantastic to see you my friend!
    +1
  • The Helper The Helper:
    If you are new to the site please check out the Recipe and Food Forum https://www.thehelper.net/forums/recipes-and-food.220/
  • Monovertex Monovertex:
    How come you're so into recipes lately? Never saw this much interest in this topic in the old days of TH.net
  • Monovertex Monovertex:
    Hmm, how do I change my signature?
  • tom_mai78101 tom_mai78101:
    Signatures can be edit in your account profile. As for the old stuffs, I'm thinking it's because Blizzard is now under Microsoft, and because of Microsoft Xbox going the way it is, it's dreadful.
  • The Helper The Helper:
    I am not big on the recipes I am just promoting them - I use the site as a practice place promoting stuff
    +2
  • Monovertex Monovertex:
    @tom_mai78101 I must be blind. If I go on my profile I don't see any area to edit the signature; If I go to account details (settings) I don't see any signature area either.
  • The Helper The Helper:
    You can get there if you click the bell icon (alerts) and choose preferences from the bottom, signature will be in the menu on the left there https://www.thehelper.net/account/preferences
  • The Helper The Helper:
    I think I need to split the Sci/Tech news forum into 2 one for Science and one for Tech but I am hating all the moving of posts I would have to do
  • The Helper The Helper:
    What is up Old Mountain Shadow?
  • The Helper The Helper:
    Happy Thursday!
    +1
  • Varine Varine:
    Crazy how much 3d printing has come in the last few years. Sad that it's not as easily modifiable though
  • Varine Varine:
    I bought an Ender 3 during the pandemic and tinkered with it all the time. Just bought a Sovol, not as easy. I'm trying to make it use a different nozzle because I have a fuck ton of Volcanos, and they use what is basically a modified volcano that is just a smidge longer, and almost every part on this thing needs to be redone to make it work
  • Varine Varine:
    Luckily I have a 3d printer for that, I guess. But it's ridiculous. The regular volcanos are 21mm, these Sovol versions are about 23.5mm
  • Varine Varine:
    So, 2.5mm longer. But the thing that measures the bed is about 1.5mm above the nozzle, so if I swap it with a volcano then I'm 1mm behind it. So cool, new bracket to swap that, but THEN the fan shroud to direct air at the part is ALSO going to be .5mm to low, and so I need to redo that, but by doing that it is a little bit off where it should be blowing and it's throwing it at the heating block instead of the part, and fuck man
  • Varine Varine:
    I didn't realize they designed this entire thing to NOT be modded. I would have just got a fucking Bambu if I knew that, the whole point was I could fuck with this. And no one else makes shit for Sovol so I have to go through them, and they have... interesting pricing models. So I have a new extruder altogether that I'm taking apart and going to just design a whole new one to use my nozzles. Dumb design.
  • Varine Varine:
    Can't just buy a new heatblock, you need to get a whole hotend - so block, heater cartridge, thermistor, heatbreak, and nozzle. And they put this fucking paste in there so I can't take the thermistor or cartridge out with any ease, that's 30 dollars. Or you can get the whole extrudor with the direct driver AND that heatblock for like 50, but you still can't get any of it to come apart
  • Varine Varine:
    Partsbuilt has individual parts I found but they're expensive. I think I can get bits swapped around and make this work with generic shit though
  • Ghan Ghan:
    Heard Houston got hit pretty bad by storms last night. Hope all is well with TH.
  • The Helper The Helper:
    Power back on finally - all is good here no damage
    +2
  • V-SNES V-SNES:
    Happy Friday!
    +1
  • The Helper The Helper:
    New recipe is another summer dessert Berry and Peach Cheesecake - https://www.thehelper.net/threads/recipe-berry-and-peach-cheesecake.194169/

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top