Problem with sliding trigger

PrisonLove

Hard Realist
Reaction score
78
Okay so I've created this trigger out of a GUI code that I had to convert to JASS in order to add a few functions to check pathability at a point. I can enable the trigger in the world editor as though it is fine, but when I go to save the map it creates an error when generating map script variables. So I need to know why this happens, and if the trigger will even work. Please keep in mind that I'm not good with JASS and I'm just starting to learn it.

I needed my trigger to use SetUnitX,Y because I need to preserve orders while sliding, and I can't use "Unit - Move Unit Instantly" or SetUnitPosition().

Here's the trigger please help.

JASS:
function IsCar takes nothing returns boolean
    return ( GetFilterUnit() == udg_Car[GetConvertedPlayerId(GetEnumPlayer())] )
endfunction

function NotCar takes nothing returns boolean
    return ( GetFilterUnit() != udg_Car[GetConvertedPlayerId(GetEnumPlayer())] )
endfunction

function IsPowerUp takes nothing returns boolean
    return ( GetUnitTypeId(GetFilterUnit()) != 'h009' )
endfunction

function IsDummy takes nothing returns boolean
    return ( GetUnitTypeId(GetFilterUnit()) != 'h008' )
endfunction

function UnitComparison takes nothing returns boolean
    return GetBooleanAnd( IsPowerUp(), IsDummy() )
endfunction

function BooleanUnk takes nothing returns boolean
    return GetBooleanAnd( NotCar(), UnitComparison() )
endfunction

function CheckPathabilityTrickGet takes nothing returns nothing
    set bj_rescueChangeColorUnit = bj_rescueChangeColorUnit or (GetEnumItem()!=bj_itemRandomCurrentPick)
endfunction

function CheckPathabilityTrick takes item p, real x, real y returns boolean
    local integer i=30
    local rect r
    call SetItemPosition(p,x,y)
    if ((Pow(GetItemX(p)-x,2)+Pow(GetItemY(p)-y,2))<=100) then
        return true
    endif
    set r=Rect(x-i,y-i,x+i,y+i)
    set bj_itemRandomCurrentPick=p
    set bj_rescueChangeColorUnit=false
    call EnumItemsInRect(r,null,function CheckPathabilityTrickGet)
    call RemoveRect(r)
    set r=null
    return bj_rescueChangeColorUnit
endfunction

function CheckPathability takes real x, real y returns boolean
    local item it = CreateItem('ciri',x,y)
    local boolean b = CheckPathabilityTrick(it,x,y)
    call SetItemVisible(it,false)
    call RemoveItem(it)
    set it=null
    return b
endfunction

function Booleans1 takes nothing returns boolean
    if ( not ( udg_Forward[GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit()))] == true ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STUNNED) == false ) ) then
        return false
    endif
    return true
endfunction

function Function2 takes nothing returns nothing
    if ( Booleans1() ) then
        set udg_TempPoint = GetUnitLoc(GetEnumUnit())
        set udg_TempReal = GetUnitFacing(GetEnumUnit())
        set udg_TempPoint2 = PolarProjectionBJ(udg_TempPoint, 11.00, udg_TempReal)
        set udg_TempUnitGroup2 = GetUnitsInRangeOfLocMatching(100.00, udg_TempPoint2, Condition(function BooleanUnk))
        if (CheckPathability(GetLocationX(udg_TempPoint2), GetLocationY(udg_TempPoint2)) == true) then
            call SetUnitX(GetEnumUnit(), GetLocationX(udg_TempPoint2))
            call SetUnitY(GetEnumUnit(), GetLocationY(udg_TempPoint2))
        else
        endif
        call DestroyGroup(udg_TempUnitGroup)
        call RemoveLocation(udg_TempPoint2)
        call RemoveLocation(udg_TempPoint)
    else
    endif
endfunction

function Function1 takes nothing returns nothing
    set udg_TempUnitGroup = GetUnitsOfPlayerMatching(GetEnumPlayer(), Condition(function IsCar))
    call ForGroupBJ( udg_TempUnitGroup, function Function2 )
    set udg_DetructPathable[GetConvertedPlayerId(GetEnumPlayer())] = false
    call DestroyGroup(udg_TempUnitGroup)
    set udg_CheckedDestructible = null
endfunction

function Trig_move_forward_Copy_Actions takes nothing returns nothing
    call ForForce( GetPlayersAll(), function Function1 )
endfunction

//===========================================================================
function InitTrig_move_forward_Copy takes nothing returns nothing
    set gg_trg_move_forward_Copy = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_move_forward_Copy, 0.01 )
    call TriggerAddAction( gg_trg_move_forward_Copy, function Trig_move_forward_Copy_Actions )
endfunction




Sorry it's kind of long. +rep for help!
 
This trigger is horrible. =(
You should start by optimizing everything you can.

Begin with BJs. Then move on to fixing your conditions. Try to inline as much as possible.
Also clean up your triggers, like removing useless lines such as 'else', and set your variables upon declaration.
 
Yeah I know the trigger is horrid looking, please remember I'm just getting into JASS.

This is what I've gotten the trigger down to thus far:

JASS:
ffunction IsCar takes nothing returns boolean
    return ( GetFilterUnit() == udg_Car[GetConvertedPlayerId(GetEnumPlayer())] )
endfunction

function Conditions takes nothing returns boolean
    if ( not ( udg_Forward[GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit()))] == true ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STUNNED) == false ) ) then
        return false
    endif
    return true
endfunction

function IsPositionPathable takes real x, real y returns boolean
    local boolean flag
    local unit PathChecker
    set PathChecker = CreateUnit(Player(15), 'hoof', x, y, 0)
    set flag = (GetUnitX(PathChecker) == x) and (GetUnitY(PathChecker) ==y)
    call RemoveUnit(PathChecker)
    set PathChecker = null
    return flag
endfunction

function Function2 takes nothing returns nothing
    local location TempPoint = GetUnitLoc(GetEnumUnit())
    local real TempReal = GetUnitFacing(GetEnumUnit())
    local location TempPoint2 = PolarProjectionBJ(TempPoint, 13.00, TempReal)
    local boolean pathable = IsPositionPathable(GetLocationX(TempPoint2), GetLocationY(TempPoint2))
    if ( Conditions() ) then
        if (pathable == true) then
            call SetUnitX(GetEnumUnit(), GetLocationX(TempPoint2))
            call SetUnitY(GetEnumUnit(), GetLocationY(TempPoint2))
        else
        endif
        call RemoveLocation(TempPoint2)
        call RemoveLocation(TempPoint)
    else
    endif
endfunction

function Function1 takes nothing returns nothing
    local group TempUnitGroup = GetUnitsOfPlayerMatching(GetEnumPlayer(), Condition(function IsCar))
    call ForGroupBJ( TempUnitGroup, function Function2 )
    call DestroyGroup(TempUnitGroup)
endfunction

function Trig_move_forward_Copy_Actions takes nothing returns nothing
    call ForForce( GetPlayersAll(), function Function1 )
endfunction

//===========================================================================
function InitTrig_move_forward_Copy takes nothing returns nothing
    set gg_trg_move_forward_Copy = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_move_forward_Copy, 0.03 )
    call TriggerAddAction( gg_trg_move_forward_Copy, function Trig_move_forward_Copy_Actions )
endfunction


It wasn't working, I think it may be because it's creating the PathChecking unit too close to the unit that's sliding, if so, how would I fix it?
 
There is no such function as "IsPositionPathable", unless you're using WEU with advanced triggers on.

Rather use "IsTerrainPathable", which is a native function. Just note that you must put the opposite of what you want when you use this function.

For example, if you want pathable, then
JASS:

will test "walkable\passable to ground"


will test "unwalkable\impassable to ground"
 
Here's how I would do it:

JASS:

function IsCar takes nothing returns boolean
    return (GetFilterUnit() == udg_Car[GetConvertedPlayerId(GetEnumPlayer())])
endfunction

function IsPositionPathable takes real x, real y returns boolean
    local unit PathChecker = CreateUnit(Player(15), 'hoof', x, y, 0)
    local boolean flag
    
    set flag = (GetUnitX(PathChecker) == x) and (GetUnitY(PathChecker) == y)
    call RemoveUnit(PathChecker)
    set PathChecker = null
    
    return flag
endfunction

function GroupCallback takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer i = GetPlayerId(GetOwningPlayer(u))
    local real a = GetUnitFacing(u)
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local boolean pathable
    
    set x = x + 13 * Cos(a * bj_DEGTORAD)
    set y = y + 13 * Sin(a * bj_DEGTORAD)
    set pathable = IsPositionPathable(x, y)
    
    if ((udg_Forward<i> == true) and (IsUnitType(u, UNIT_TYPE_STUNNED) == false) and (pathable == true)) then
        //call SetUnitPosition(u, x, y)   You said you don&#039;t want to use it, though..
        call SetUnitX(u, x)
        call SetUnitY(u, y)
    endif
    
    set u = null
endfunction

function ForceCallback takes nothing returns nothing                //Group-less Enumerating can be used effectively in this function.
    local group g = GetUnitsOfPlayerMatching(GetEnumPlayer(), Condition(function IsCar))
    call ForGroup(g, function GroupCallback)
    call DestroyGroup(g)
    set g = null
endfunction

function TriggerActions takes nothing returns nothing
    call ForForce(GetPlayersAll(), function ForceCallback)
endfunction

//===========================================================================
function InitTrig_move_forward_Copy takes nothing returns nothing
    local trigger t = CreateTrigger()               //Local triggers can&#039;t be run/enabled/disabled through other triggers.
    call TriggerRegisterTimerEvent(t, 0.03, true)
    call TriggerAddAction(t, function TriggerActions)
endfunction
</i>


I would also use Group-less Enumerating, but that requires a global unit group variable. I feel it would only confuse you include an unknown global variable in your trigger.

Here's two useful links that you should read up on when you get the chance, though:
http://wiki.thehelper.net/wc3/Group_API#boolexpr_as_callback
http://www.thehelper.net/forums/showthread.php?t=132926


EDIT:
I'm not sure, but I believe you can put the whole IsPositionPathable function in your Map Header, removing it from this trigger. Making it easier to both use (seeing how it can be used from other triggers as well) and the trigger to read.

Tips:
*Everytime you use Get*** (for example: GetEnumUnit(), GetOwningPlayer(**), etc) you're forcing your computer to do more work. You can make this more effective by declaring a local variable in the beginning of the function. -It also looks better and is easier to read and edit. (You should only do this for handle variables if you're using Get*** more than twice in the same function. -The more, the better reason.)
*You should always use coordinates, instead of locations, when it is possible (and it is, in most cases.)
*Get rid of as many BJ's as possible.


There is no such function as "IsPositionPathable", unless you're using WEU with advanced triggers on.

Yes there is. He creates it in this trigger.
 
I, actually, made one slide trigger and one turn trigger; and, my slide trigger was different than that, although it might leak some. I made it with help from The Hive, This Site (thehelper.net), and maybe also other sites as well. Anyway, destroying memory leaks with JASS might or might not be a good idea.
I just like to keep my JASS simple (no offense intended). :)
 
Thank you so much, Exide, for all the help and tips. This is the trigger I'm currently using:

JASS:
function IsCar takes nothing returns boolean
    return ( GetFilterUnit() == udg_Car[GetConvertedPlayerId(GetEnumPlayer())] )
endfunction

function IsPositionPathable takes real x, real y returns boolean
    local boolean flag
    local unit PathChecker
    set PathChecker = CreateUnit(Player(15), &#039;hoof&#039;, x, y, 0)
    set flag = (GetUnitX(PathChecker) == x) and (GetUnitY(PathChecker) == y)
    call RemoveUnit(PathChecker)
    set PathChecker = null
    return flag
endfunction

function Function2 takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer i = GetPlayerId(GetOwningPlayer(u))
    local real a = GetUnitFacing(u)
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local boolean pathable
    set x = x + 13 * Cos(a * bj_DEGTORAD)
    set y = y + 13 * Sin(a * bj_DEGTORAD)
    set pathable = IsPositionPathable(x , y)
    if ( (udg_Forward<i> == true) and (IsUnitType(u, UNIT_TYPE_STUNNED) == false) and (pathable == true) ) then
        call SetUnitX(u, x)
        call SetUnitY(u, y)
    endif
    set u = null
endfunction

function Function1 takes nothing returns nothing
    local group TempUnitGroup = GetUnitsOfPlayerMatching(GetEnumPlayer(), Condition(function IsCar))
    call ForGroup( TempUnitGroup, function Function2 )
    call DestroyGroup(TempUnitGroup)
endfunction

function TriggerActions takes nothing returns nothing
    call ForForce( GetPlayersAll(), function Function1 )
endfunction

//===========================================================================
function InitTrig_move_forward_Copy takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterTimerEvent( t, 0.03, true )
    call TriggerAddAction( t, function TriggerActions )
endfunction</i>


But it won't slide the unit, any idea why?
 
Ok so I've found the problem function, it's:

JASS:
function IsPositionPathable takes real x, real y returns boolean
    local boolean flag
    local unit PathChecker
    set PathChecker = CreateUnit(Player(15), &#039;hfoo&#039;, x, y, 0)
    set flag = (GetUnitX(PathChecker) == x) and (GetUnitY(PathChecker) ==y)
    call RemoveUnit(PathChecker)
    set PathChecker = null
    return flag
endfunction


flag always returns false, even when I move x,y far away from any unit/anything that can block pathing. Can anybody see why that would happen?
 
Shouldn't it be 'hfoo' not 'hoof'? I don't think 'hoof' is a valid unit type.
 
You're right, but it's still constantly returning false and I don't know why. Any ideas?
 
Either the unit isn't created or it fails somehow. Perhaps you should consider measuring the points by a few units if it'd be so that the unit aint exactly placed on the same X and Y.
 
Either the unit isn't created or it fails somehow. Perhaps you should consider measuring the points by a few units if it'd be so that the unit aint exactly placed on the same X and Y.

Can you elaborate on that please?


And I'll try that BJDebugMsg, Exide, and get back to you. Thanks.


EDIT: After checking the coordinates using BJDebugMsg, the unit IS created at the desired coordinates, and it IS a footman, so something else must be wrong. Any ideas?

EDIT2: Here I'll post a picture. As you can see, the coordinates for the unit and the desired coordinates are different, which is the problem I need to fix. The footman's coordinates are the unit that is created, Firelord is the unit that is sliding, and Desired Coordinates are where I need to slide to.

The coordinates for each unit come immediately after its name.
IsPathableTest2.jpg


By the way, in case you were wondering, the map is going to be a WarCraft adaptation of battle mode from Mario Kart 64. It will be named WarKart.
 
Either the unit that'd check everything isn't created at all, giving the cordinates 0 and 0 if using GetUnitX/Y.
Or maybe the unit gets spawned without decimals and you'd need to check the distance between spawn point and units location and see if it's under 5 units for instance.

And I love good O'l Mario Kart 64's battle mode :D
 
Holy shit, I just realized I made a mistake in my test trigger and it was displaying the wrong data, so the unit it NOT created at the desired location, which is why flag keeps returning false. Can anyone help with this? I updated the picture in the previous post.

Please explain more about the 5 units thing.


EDIT: Okay I have a very buggy, but working trigger. It sometimes returns false, and sometimes it returns true. Here's the trigger minus the BJDebugMsg function that I use for testing.

JASS:
function IsCar takes nothing returns boolean
    return ( GetFilterUnit() == udg_Car[GetConvertedPlayerId(GetEnumPlayer())] )
endfunction

function IsPositionPathable takes real x, real y returns boolean
    local boolean flag
    local unit PathChecker = CreateUnit(Player(15), &#039;hfoo&#039;, x, y, 0)
    local real x2 = GetUnitX(PathChecker)
    local real y2 = GetUnitY(PathChecker)
    local real d = SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))
    set flag = (d &lt;= 10)
    call RemoveUnit(PathChecker)
    set PathChecker = null
    return flag
endfunction

function Function2 takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer i = GetConvertedPlayerId(GetEnumPlayer())
    local real a = GetUnitFacing(u)
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local real x2 = x + 100 * Cos(a * bj_DEGTORAD)
    local real y2 = y + 100 * Sin(a * bj_DEGTORAD)
    local boolean pathable
    set x = x + 25 * Cos(a * bj_DEGTORAD)
    set y = y + 25 * Sin(a * bj_DEGTORAD)
    set pathable = IsPositionPathable(x2 , y2)
    if ( (udg_Forward<i> == true) and (IsUnitType(u, UNIT_TYPE_STUNNED) == false) and (pathable == true) ) then
        call SetUnitX(u, x)
        call SetUnitY(u, y)
    endif
    set u = null
endfunction

function Function1 takes nothing returns nothing
    local group TempUnitGroup = GetUnitsOfPlayerMatching(GetEnumPlayer(), Condition(function IsCar))
    call ForGroup( TempUnitGroup, function Function2 )
    call DestroyGroup(TempUnitGroup)
endfunction

function TriggerActions takes nothing returns nothing
    call ForForce( GetPlayersAll(), function Function1 )
endfunction

//===========================================================================
function InitTrig_move_forward_Copy takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterTimerEvent( t, 0.03, true )
    call TriggerAddAction( t, function TriggerActions )
endfunction
</i>



I'll attach the map so you guys can see for yourself how buggy it is. I really need suggestions as to how to smooth it out. The trigger is under the movement folder and it is "move forward copy." You'll see a lot of other incomplete triggers, don't worry about those. Also, the reverse movement trigger is using my old system, it'll be updated once I get this one moving smoothly.
 
JASS:
        call SetUnitX(u, x)
        call SetUnitY(u, y)


Should be x2, y2. But you don't need x2 and y2. Doing this with x and y is enough.
 
Actually it shouldn't be. x2 and y2 are points that are slightly ahead of the desired location because the unit that was sliding was what was interfering the created being sent to the right spot. So I'm checking slightly ahead so that I can see if the area ahead is pathable.

If you wouldn't mind, could you check out the map and help me smooth it out?
 
I changed your map.
It works when I tested it during single-player.

This trigger places (not creates) a footman-unit infront of the car that is moving forward. It checks if the x and y 175 range infront of the car is pathable, if it is the car will move forward, if it is not, the car will stand still.

It works fairly well. When you reach walls your car generally stops in a somewhat silly manner.
This can probably be fixed by removing the pathing of the footman unit, and setting it's location closer to the car itself.
Another "problem" that occurs is that the footman sets off the buttons that raises the "bridges". -This can be prevented in the 'Raise-Bridge-Triggers' with a simple condition.

I added three new global variables:
playergroup (player group)
movegroup (unit group)
pathunit (unit)

Triggers:
Trigger:
  • Phrosen Setup
    • Events
      • Time - Elapsed game time is 1.00 seconds
    • Conditions
    • Actions
      • Set playergroup = (All players matching (((Matching player) slot status) Equal to (==) Is playing))
      • Unit - Create 1 Footman for Neutral Extra at (Player 1 (Red) start location) facing 270.00 degrees
      • Set pathunit = (Last created unit)
      • Unit - Add Permanent Invisibility to pathunit
      • Player Group - Pick every player in playergroup and do (Actions)
        • Loop - Actions
          • Player - Make Neutral Extra treat (Picked player) as an Neutral


This trigger creates the footman, and sets it to 'pathunit'. The very same unit will be used throughout the whole game. -It would be wise to create a custom unit for this, give it Permanent Invisibilty (to prevent it from being seen), change it's pathing, make it invulnerable, add magic immunity, give it a ton of starting hp and hp regen.
The trigger also makes the owner of 'pathunit' treat all playing players as Neutral (to prevent 'pathunit' from attacking the cars.) -This can also be done by removing 'pathunit's' ability to attack in the Object Editor.


JASS:

function GroupCallback takes nothing returns boolean
    local unit u = GetFilterUnit()
    local integer i = GetPlayerId(GetOwningPlayer(u)) + 1     //Replaced GetConvertedPlayerId with GetPlayerId.
    local real a = GetUnitFacing(u)
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local real checkx
    local real checky
    local boolean pathable
    
    if (u == udg_Car<i>) then               //Non-Cars is not affected by the actions within this if/then check.
        set checkx = x + 175 * Cos(a * bj_DEGTORAD)    //How far away &#039;udg_pathunit&#039; will check for pathability.
        set checky = y + 175 * Sin(a * bj_DEGTORAD)
        set x = x + 9 * Cos(a * bj_DEGTORAD)           //How far the car will move. Higher = Faster.
        set y = y + 9 * Sin(a * bj_DEGTORAD)
    
        if ((udg_Forward<i> == true) and (IsUnitType(u, UNIT_TYPE_STUNNED) == false)) then
            set pathable = IsPositionPathable(checkx, checky)    //This function can be found in the map header.
        
            if (pathable == true) then         //This check is in an if/then function of it&#039;s own, to prevent lag.
                call SetUnitPosition(u, x, y)
            endif
        endif
    endif
    
    set u = null
    return false
endfunction

function ForceCallback takes nothing returns nothing    //Group-Less Enumerating. Simply awesome. Uses &#039;udg_movegroup&#039;, which is set in trigger: &#039;Phrosen Setup&#039;
    call GroupEnumUnitsInRect(udg_movegroup, bj_mapInitialPlayableArea, Condition(function GroupCallback))
endfunction

function TriggerActions takes nothing returns nothing   //Uses &#039;udg_playergroup&#039;, which is set in trigger: &#039;Phrosen Setup&#039;
    call ForForce(udg_playergroup, function ForceCallback)
endfunction

//===========================================================================
function InitTrig_Phrosen_Move takes nothing returns nothing
    local trigger t = CreateTrigger()               
    call TriggerRegisterTimerEvent(t, 0.02, true)      //Decreased the periodic time, for smoother sliding.
    call TriggerAddAction(t, function TriggerActions)
endfunction
</i></i>



Demo-map can be downloaded here:
http://www.wikiupload.com/download_page.php?id=152203
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • The Helper The Helper:
    News portal has been retired. Main page of site goes to Headline News forum now
  • The Helper The Helper:
    I am working on getting access to the old news portal under a different URL for those that would rather use that for news before we get a different news view.
  • Ghan Ghan:
    Easily done
    +1
  • The Helper The Helper:
    https://www.thehelper.net/pages/news/ is a link to the old news portal - i will integrate it into the interface somewhere when i figure it out
  • Ghan Ghan:
    Need to try something
  • Ghan Ghan:
    Hopefully this won't cause problems.
  • Ghan Ghan:
    Hmm
  • Ghan Ghan:
    I have converted the Headline News forum to an Article type forum. It will now show the top 20 threads with more detail of each thread.
  • Ghan Ghan:
    See how we like that.
  • The Helper The Helper:
    I do not see a way to go past the 1st page of posts on the forum though
  • The Helper The Helper:
    It is OK though for the main page to open up on the forum in the view it was before. As long as the portal has its own URL so it can be viewed that way I do want to try it as a regular forum view for a while
  • Ghan Ghan:
    Yeah I'm not sure what the deal is with the pagination.
  • Ghan Ghan:
    It SHOULD be there so I think it might just be an artifact of having an older style.
  • Ghan Ghan:
    I switched it to a "Standard" article forum. This will show the thread list like normal, but the threads themselves will have the first post set up above the rest of the "comments"
  • The Helper The Helper:
    I don't really get that article forum but I think it is because I have never really seen it used on a multi post thread
  • Ghan Ghan:
    RpNation makes more use of it right now as an example: https://www.rpnation.com/news/
  • The Helper The Helper:
  • The Helper The Helper:
    What do you think Tom?
  • tom_mai78101 tom_mai78101:
    I will have to get used to this.
  • tom_mai78101 tom_mai78101:
    The latest news feed looks good
  • The Helper The Helper:
    I would like to see it again like Ghan had it the first time with pagination though - without the pagination that view will not work but with pagination it just might...
  • The Helper The Helper:
    This drink recipe I have had more than a few times back in the day! Mind Eraser https://www.thehelper.net/threads/cocktail-mind-eraser.194720/

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top