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!
 

Exide

I am amazingly focused right now!
Reaction score
448
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.
 

PrisonLove

Hard Realist
Reaction score
78
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?
 

LurkerAspect

Now officially a Super Lurker
Reaction score
118
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"
 

Exide

I am amazingly focused right now!
Reaction score
448
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.
 

Fun_

New Member
Reaction score
1
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). :)
 

PrisonLove

Hard Realist
Reaction score
78
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?
 

PrisonLove

Hard Realist
Reaction score
78
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?
 

Weep

Godspeed to the sound of the pounding
Reaction score
400
Shouldn't it be 'hfoo' not 'hoof'? I don't think 'hoof' is a valid unit type.
 

PrisonLove

Hard Realist
Reaction score
78
You're right, but it's still constantly returning false and I don't know why. Any ideas?
 

Rainther

I guess I should write something of value here...
Reaction score
61
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.
 

Exide

I am amazingly focused right now!
Reaction score
448

PrisonLove

Hard Realist
Reaction score
78
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.
 

Rainther

I guess I should write something of value here...
Reaction score
61
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
 

PrisonLove

Hard Realist
Reaction score
78
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.
 

Exide

I am amazingly focused right now!
Reaction score
448
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.
 

PrisonLove

Hard Realist
Reaction score
78
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?
 

Exide

I am amazingly focused right now!
Reaction score
448
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.
  • Ghan Ghan:
    Howdy
  • 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 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