Map Lag on Unit Death -- code poorly written/leaking ?

ZakkWylde-

New Member
Reaction score
14
So it appears that whenever someone dies, there is this annoying map lag from which everyone suffers.
Here is the relevant code:

This is the sliding/Terrain Kill trigger that determines a unit should die:
JASS:

cope Sliding initializer Init

private function SlidingCond takes nothing returns boolean
        return (GetUnitTypeId(GetFilterUnit()) == 'E000')
endfunction
    
private function Sliding takes nothing returns nothing
    
    local unit u
    
    local real x
    local real y
    local real uX
    local real uY 
    local real facing
    
    local integer terType
    local integer t1
    local integer t2
    local integer t3
    local integer t4
    
    local integer i
    
    local boolean d1
    local boolean d2
    local boolean d3
    local boolean d4
    
    local boolean shouldSlide
    local boolean properTerrain
    local boolean alive
    
    call GroupEnumUnitsInRect(dhGroup, worldBounds, Condition(function SlidingCond))
    
    loop
        set u = FirstOfGroup(dhGroup)
        exitwhen u == null
        set i = GetUnitUserData(u)
        set uX = GetUnitX(u)
        set uY = GetUnitY(u)
        
        set t1 = GetTerrainType(uX + tightness, uY + tightness)
        set t2 = GetTerrainType(uX + tightness, uY - tightness)
        set t3 = GetTerrainType(uX - tightness, uY + tightness)
        set t4 = GetTerrainType(uX - tightness, uY - tightness)
        
        set d1 = (t1 == udg_DeathTerSnow or t1 == udg_DeathTerLava)    
        set d2 = (t2 == udg_DeathTerSnow or t2 == udg_DeathTerLava)
        set d3 = (t3 == udg_DeathTerSnow or t3 == udg_DeathTerLava)
        set d4 = (t4 == udg_DeathTerSnow or t4 == udg_DeathTerLava)
        
        set alive = (GetWidgetLife(u) >= .405)
        if not (d1 and d2 and d3 and d4) then
        
            set terType = GetTerrainType(uX, uY)
            set properTerrain = (terType == slide1 or terType == slide2 or terType == slide3 or terType == slide4)
            set shouldSlide = (alive and IsUnitPaused(u) == false and properTerrain)
            
            if shouldSlide then
                set facing = (GetUnitFacing(u) * bj_DEGTORAD)
                call SetUnitPosition(u, uX + ((slideSpeed<i> * Cos(facing))* 3.125), uY + ((slideSpeed<i> * Sin(facing))* 3.125))
            endif
        else
            call IssueImmediateOrder(u, &quot;stop&quot;)
            if (TKInUse<i> == false and alive) then
                call TriggerExecute(udg_checkTerrain<i>)
            endif
        endif
        
        
        call GroupRemoveUnit(dhGroup, u)
    endloop

endfunction

private function Init takes nothing returns nothing
    call TimerStart(CreateTimer(), 0.03125, true, function Sliding) //frequency of trigger
endfunction
    
endscope
</i></i></i></i>


Regarding [ljass] if (TKInUse == false and alive) then
call TriggerExecute(udg_checkTerrain)
endif [/ljass],
TKInUse will be seen in the following code, and udg_checkTerrain IS the trigger with the following code (there are 12 checkTerrains, one for each hero):

JASS:

function RedTerrainKill takes nothing returns nothing
    local integer i = 0
    local unit u = udg_DemonHunter<i>
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local effect e
    local effect e2
    
    if GetTerrainType(x, y) == udg_DeathTerSnow and GetUnitState(u, UNIT_STATE_LIFE) &gt;= 1 then
        set TKInUse<i> = true
        call PauseUnit(u, true)
        set isUnitDying<i> = true
        call SetUnitFacing(u, GetUnitFacing(u))
        set e = AddSpecialEffect(frost1, x, y)
        set e2 = AddSpecialEffect(frost2, x, y)
        call DisableTrigger(udg_checkTerrain<i>)
        call TriggerSleepAction(2)
        call SetUnitExploded(u, false)
        if isUnitDying<i> == true then
            call KillUnit(u)
        endif
        call PauseUnit(u, false)
        set isUnitDying<i> = false
        call DestroyEffect(e)
        call DestroyEffect(e2)
        set e = null
        set e2 = null
        set TKInUse<i> = false
        call EnableTrigger(udg_checkTerrain<i>)
    elseif GetTerrainType(x,y) == udg_DeathTerLava and GetUnitState(u, UNIT_STATE_LIFE) &gt;= 1 then
        set TKInUse<i> = true
        call PauseUnit(u, true)
        set isUnitDying<i> = true
        call SetUnitFacing(u, GetUnitFacing(u))
        set e = AddSpecialEffect(fire1, x, y)
        call DisableTrigger(udg_checkTerrain<i>)
        call TriggerSleepAction(1.95)
        set e2 = AddSpecialEffect(fire2, x, y)
        call TriggerSleepAction(.05)
        call SetUnitExploded(u, false)
        if isUnitDying<i> == true then
            call KillUnit(u)
        endif
        call PauseUnit(u, false)
        set isUnitDying<i> = false
        call DestroyEffect(e)
        call DestroyEffect(e2)
        set e = null
        set e2 = null
        set TKInUse<i> = false
        call EnableTrigger(udg_checkTerrain<i>)
    endif
endfunction

//===========================================================================
function InitTrig_RedTerrainKill takes nothing returns nothing
    set gg_trg_RedTerrainKill = CreateTrigger(  )
    call TriggerAddAction( gg_trg_RedTerrainKill, function RedTerrainKill )
endfunction
</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>


If that weren't enough, this is what runs when the unit actually dies. (REALLY SORRY FOR ALL THIS CODE, but I'D REALLY APPRECIATE finding out what's wrong with it <3)
JASS:

function Trig_check_if_alive_Conditions takes nothing returns boolean

    local integer Id = GetPlayerId( GetOwningPlayer( GetTriggerUnit() ) )
    return Id != 12 and Id != 15

endfunction

function Trig_check_if_alive_Actions takes nothing returns nothing

    local integer n = GetUnitUserData( GetTriggerUnit() )
    local integer i = 0
    
    local item it=UnitItemInSlot(udg_DemonHunter[n],0)
    local integer d=GetItemUserData(it)

    call SetItemPosition(it, GetRectCenterX(itemsloc[d]), GetRectCenterY(itemsloc[d]))
    
    set udg_CircleOn[n] = false
    
    if udg_Teamwork then
        loop
        exitwhen i&gt;11 or GetUnitState(udg_DemonHunter<i>, UNIT_STATE_LIFE) &gt; 0
            set i = i + 1
        endloop
    else 
        loop
        exitwhen i&gt;11 or GetUnitState(udg_DemonHunter<i>, UNIT_STATE_LIFE) &gt; 0 or GetUnitState(reviveCircle<i>, UNIT_STATE_LIFE) &gt; 0
            set i = i + 1
        endloop

    endif
    
    if (i &lt;= 11) then
        if udg_Teamwork then
            call TriggerExecute(makecircle[n])
        else
            if GetUnitState(reviveCircle[n], UNIT_STATE_LIFE) &gt; 0 then
                call circlerevive(n)
            endif
        endif
    endif
    
    if ( i&gt;11 ) and IsTriggerEnabled(gg_trg_DeathRez) then
        call ForGroup(reviveCircles, function RemoveCircles)
        if not udg_Teamwork then
            set i = 0
            loop
            exitwhen i &gt; 11
                set madecircle<i> = false
                set i = i+1
            endloop
        endif
        call TriggerExecute( gg_trg_DeathRez )
    endif

    

endfunction

//===========================================================================
function InitTrig_CheckIfAlive takes nothing returns nothing
    set gg_trg_CheckIfAlive = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_CheckIfAlive, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_CheckIfAlive, Condition( function Trig_check_if_alive_Conditions ) )
    call TriggerAddAction( gg_trg_CheckIfAlive, function Trig_check_if_alive_Actions )
endfunction
</i></i></i></i>


LASTLY (thank you so much if you've gotten this far):
This is the makecircle function that is called when the unit has died (with Teamwork on):

JASS:

function MakeCircle takes integer n returns nothing
    local real offset=127-(2*tightness) //90
    local real checkoffset=20
    local real x=GetUnitX(udg_DemonHunter[n])
    local real y=GetUnitY(udg_DemonHunter[n])
    local real rx=x
    local real ry=y
    local boolean check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    if not(check)then
        set rx=x-offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x+offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x
        set ry=y-offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x
        set ry=y+offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x-offset
        set ry=y-offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x-offset
        set ry=y+offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x+offset
        set ry=y-offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    if not(check)then
        set rx=x+offset
        set ry=y+offset
        set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
    endif
    //in case everything goes WRONGGGGgggggggg  I dont think the trigger ever goes past this part--it goes straight to call RemoveUnit(...)...
    if not (check) then
        set checkoffset = 0
        if not(check)then
            set rx=x-offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x+offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x
            set ry=y-offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x
            set ry=y+offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x-offset
            set ry=y-offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x-offset
            set ry=y+offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x+offset
            set ry=y-offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not(check)then
            set rx=x+offset
            set ry=y+offset
            set check=GetTerrainType(rx+checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry+checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx-checkoffset,ry-checkoffset)!=deathTerrain and GetTerrainType(rx+checkoffset,ry)!=deathTerrain and GetTerrainType(rx-checkoffset,ry)!=deathTerrain and GetTerrainType(rx,ry-checkoffset)!=deathTerrain and GetTerrainType(rx,ry+checkoffset)!=deathTerrain 
        endif
        if not (check) then
        endif
    endif

    call RemoveUnit(reviveCircle[n])
    set reviveCircle[n]=CreateUnit(Player(n),&#039;h005&#039;,rx,ry,90)
    call TriggerRegisterUnitInRange(revivetrig[n],reviveCircle[n],80.00, null)
    call GroupAddUnit(reviveCircles,reviveCircle[n])
    call SetUnitPosition(udg_DemonHunter[n],rx,ry)
    call SetUnitAnimationByIndex(udg_DemonHunter[n],0)
    //call TriggerSleepAction(0.2)
    call TriggerSleepAction(0.001) //?
    
endfunction


I know this is a lot of code, but I have gone through it, and I don;t really understand why it would cause map lag...

Appreciate the help (A LOT!),
Zakk
 

Dirac

22710180
Reaction score
147
Obviously the lag comes from the MakeCircle function, you check so many values at the same time, i'm sure there's a way to avoid that. What's that TriggerSleepAction at the end of the code????
 

ZakkWylde-

New Member
Reaction score
14
hmmm, i'm not exactly sure. the person who gave it to me had TriggerSleepAction(.2), then I changed it to .001...
not even sure what a triggesleepaction does inside of a function declared in the map header (i.e. not in a trigger), to be honest.

if I popped in little trigger sleep actions between the checks, like .05 here .05 there, would that fix this problem?
is the rest of the code pretty solid?

EDIT: +rep for reading through my code and proposing the cause of problem :D
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Varine Varine:
    How can you tell the difference between real traffic and indexing or AI generation bots?
  • The Helper The Helper:
    The bots will show up as users online in the forum software but they do not show up in my stats tracking. I am sure there are bots in the stats but the way alot of the bots treat the site do not show up on the stats
  • Varine Varine:
    I want to build a filtration system for my 3d printer, and that shit is so much more complicated than I thought it would be
  • Varine Varine:
    Apparently ABS emits styrene particulates which can be like .2 micrometers, which idk if the VOC detectors I have can even catch that
  • Varine Varine:
    Anyway I need to get some of those sensors and two air pressure sensors installed before an after the filters, which I need to figure out how to calculate the necessary pressure for and I have yet to find anything that tells me how to actually do that, just the cfm ratings
  • Varine Varine:
    And then I have to set up an arduino board to read those sensors, which I also don't know very much about but I have a whole bunch of crash course things for that
  • Varine Varine:
    These sensors are also a lot more than I thought they would be. Like 5 to 10 each, idk why but I assumed they would be like 2 dollars
  • Varine Varine:
    Another issue I'm learning is that a lot of the air quality sensors don't work at very high ambient temperatures. I'm planning on heating this enclosure to like 60C or so, and that's the upper limit of their functionality
  • Varine Varine:
    Although I don't know if I need to actually actively heat it or just let the plate and hotend bring the ambient temp to whatever it will, but even then I need to figure out an exfiltration for hot air. I think I kind of know what to do but it's still fucking confusing
  • The Helper The Helper:
    Maybe you could find some of that information from AC tech - like how they detect freon and such
  • Varine Varine:
    That's mostly what I've been looking at
  • Varine Varine:
    I don't think I'm dealing with quite the same pressures though, at the very least its a significantly smaller system. For the time being I'm just going to put together a quick scrubby box though and hope it works good enough to not make my house toxic
  • Varine Varine:
    I mean I don't use this enough to pose any significant danger I don't think, but I would still rather not be throwing styrene all over the air
  • The Helper The Helper:
    New dessert added to recipes Southern Pecan Praline Cake https://www.thehelper.net/threads/recipe-southern-pecan-praline-cake.193555/
  • The Helper The Helper:
    Another bot invasion 493 members online most of them bots that do not show up on stats
  • Varine Varine:
    I'm looking at a solid 378 guests, but 3 members. Of which two are me and VSNES. The third is unlisted, which makes me think its a ghost.
    +1
  • The Helper The Helper:
    Some members choose invisibility mode
    +1
  • The Helper The Helper:
    I bitch about Xenforo sometimes but it really is full featured you just have to really know what you are doing to get the most out of it.
  • The Helper The Helper:
    It is just not easy to fix styles and customize but it definitely can be done
  • The Helper The Helper:
    I do know this - xenforo dropped the ball by not keeping the vbulletin reputation comments as a feature. The loss of the Reputation comments data when we switched to Xenforo really was the death knell for the site when it came to all the users that left. I know I missed it so much and I got way less interested in the site when that feature was gone and I run the site.
  • Blackveiled Blackveiled:
    People love rep, lol
    +1
  • The Helper The Helper:
    The recipe today is Sloppy Joe Casserole - one of my faves LOL https://www.thehelper.net/threads/sloppy-joe-casserole-with-manwich.193585/
  • The Helper The Helper:
    Decided to put up a healthier type recipe to mix it up - Honey Garlic Shrimp Stir-Fry https://www.thehelper.net/threads/recipe-honey-garlic-shrimp-stir-fry.193595/

      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