How to refer to variable in struct from another trigger ?

Nexor

...
Reaction score
74
I'm currently making a cooldown system for my map. It's a basic idea to make cooldowns dynamic. You cast the spell, it starts a timer, adds a fake icon to the unit and after some seconds changes back to normal, so you can use the ability again, simple. But I want to change the cooldown as the skill cools down. examples help a lot:

- Mountain King casts Thunder Clap (removes real skill, adds fake, starts timer with 10 second time)
- Another skill or item or something takes effect and the cooldown will be reduced to 8 seconds.

How to make that?
Here's the cooldown-system (maybe a snippet) I wrote :

JASS:
library CDLibrary

globals
    
endglobals
struct CD
    unit u
    integer a_real
    integer a_fake
    real dur
    effect eff
endstruct


private function CDCallback takes nothing returns nothing
    local CD cd = GetTimerStructA(GetExpiredTimer())
    call UnitRemoveAbility(cd.u, cd.a_fake)
    call UnitAddAbility(cd.u, cd.a_real)
    call ClearTimerStructA(GetExpiredTimer())
endfunction

function Cooldown takes unit u, integer ability_real, integer ability_fake, real duration returns nothing
    local CD cd = CD.create()
    local timer t = CreateTimer()
    set cd.u = u
    set cd.a_real = ability_real
    set cd.a_fake = ability_fake
    set cd.dur = duration
    call UnitRemoveAbility(cd.u, cd.a_real)
    call UnitAddAbility(cd.u, cd.a_fake)
    call SetTimerStructA(t, cd)
    
    call TimerStart(t, duration, false, function CDCallback)
    set t = null
    
endfunction

endlibrary
 

Frozenhelfir

set Gwypaas = Guhveepaws
Reaction score
56
>How to refer to variable in struct from another trigger ?

Make the struct into a global variable instead of a local.

JASS:
globals
     (private) CD CD_Array[8190]
endglobals


then just fill it up with units using a unit indexer. You'd reference it by something like this:
JASS:
local integer index = GetUnitIndex(u) //<- needs a unit indexer, tons out there

set CD_Array[index].a_real = ability_real


You can create the struct when the unit enters the map, and destroy it when it dies (unless a hero)

JASS:
function Actions takes nothing returns nothing
//fires on the unit enters map event
local integer index = GetUnitIndex(GetTriggerUnit())
set CD_Array[index] = CD_Array[index].create()
 

Nexor

...
Reaction score
74
Okay, then there will be a bump and I'll post my code, what I've done so far (yea, it isn't working)
I used PUI for unit indexer. I think it works for the cooldown thing, but not for modifying the cooldown.
The code:

JASS:
library CDLibrary uses PUI

globals
    timer array T
    CD array CD_Array[8190]
endglobals

struct CD
    unit u
    integer a_real
    integer a_fake
    real dur
    effect eff
endstruct

private function CDCallback takes nothing returns nothing
    local integer i = 0
    local integer index
    local boolean b = false
    loop
        exitwhen b == true
        if T<i> == GetExpiredTimer() then
            set index = i
            set CD_Array[index] = GetTimerStructA(GetExpiredTimer())
            set b = true
        endif
        set i = i + 1
    endloop
    call UnitRemoveAbility(CD_Array[index].u, CD_Array[index].a_fake)
    call UnitAddAbility(CD_Array[index].u, CD_Array[index].a_real)
    call DisplayTextToPlayer(GetOwningPlayer(CD_Array[index].u), 0, 0, &quot;|cffffcc00&quot;+GetObjectName(CD_Array[index].a_real)+&quot;|r is ready!&quot;)
    call ClearTimerStructA(GetExpiredTimer())
    call DisableTrigger( gg_trg_Timer )
    call PauseTimer(GetExpiredTimer())
endfunction

function Cooldown takes unit u, integer ability_real, integer ability_fake, real duration returns nothing
    local integer index = GetUnitIndex(u)
    //call BJDebugMsg(I2S(index))
    set CD_Array[index] = CD.create()
    set T[index] = CreateTimer()
    set CD_Array[index].u = u
    set CD_Array[index].a_real = ability_real
    set CD_Array[index].a_fake = ability_fake
    set CD_Array[index].dur = duration
    call UnitRemoveAbility(CD_Array[index].u, CD_Array[index].a_real)
    call UnitAddAbility(CD_Array[index].u, CD_Array[index].a_fake)
    call SetTimerStructA(T[index], CD_Array[index])
    call TimerStart(T[index], duration, false, function CDCallback)
endfunction

function Cooldown_Modify takes unit u, integer abil_id, real modify returns nothing
    local integer index = GetUnitIndex(u)+1
    local real time = TimerGetRemaining(T[index])
    //call BJDebugMsg(I2S(index))
    if time != 0 then
        call PauseTimer(T[index])
        if  time - modify &lt;= 0 and modify &lt; -time then
            set time = 0
        else
            set time = time + modify
        endif
        if time &gt; 0 then
            //call DisplayTextToPlayer(GetOwningPlayer(u), 0, 0,&quot;New cooldown for |cffffcc00&quot;+GetObjectName(abil_id)+&quot;:|r &quot; + R2S(time))
        endif
        call TimerStart(T[index], time, false, function CDCallback)
        //call BJDebugMsg(&quot;CD modified to: &quot;+R2S(time))
    else
        return
    endif
endfunction

endlibrary
</i>
 

cleeezzz

The Undead Ranger.
Reaction score
268
JASS:
    loop
        exitwhen b == true
        if T<i> == GetExpiredTimer() then
            set index = i
            set CD_Array[index] = GetTimerStructA(GetExpiredTimer())
            set b = true
        endif
        set i = i + 1
    endloop</i>


i would just attach the index by making another integer member in the struct to save the index, that loop is mad inefficient.

and i think it would be better to just use a local timer for this rather than an array
 

Nexor

...
Reaction score
74
Sorry for editing the whole post but I got this one...

So here's the second problem, how do I refer back to the struct I need from the callback function. The code:

JASS:
private function CDCallback takes nothing returns nothing
    local integer i = 0
    local boolean b = false
    local integer index
    local integer ind
    local timer t = GetExpiredTimer()
    //call BJDebugMsg(&quot;Timer callback&quot;)
    loop
        exitwhen b == true
        set CD_Array<i> = GetTimerStructA(t)
        if CD_Array<i>.t == t then
            set b = true
            set index = i
        endif
        set i = i + 1
    endloop
    set ind = CD_Array[index].index
    call UnitRemoveAbility(CD_Array[ind].u, CD_Array[ind].a_fake)
    call UnitAddAbility(CD_Array[ind].u, CD_Array[ind].a_real)
    call DisplayTextToPlayer(GetOwningPlayer(CD_Array[ind].u), 0, 0, &quot;|cffffcc00&quot;+GetObjectName(CD_Array[ind].a_real)+&quot;|r is ready!&quot;)
    call ClearTimerStructA(GetExpiredTimer())
    call DisableTrigger( gg_trg_Timer )
    call PauseTimer(GetExpiredTimer())
endfunction</i></i>


I says that CD_Array is not of a type that allows .syntax :S:S
 

Nexor

...
Reaction score
74
I have the newest NewGen, and I don't get this replacement. Could please replace it and send the code? I replaced them but it says that cannot convert integer to null... :S:S

I post the map too for checking for actual triggers.

View attachment TEST_1.w3x
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
JASS:
library CDLibrary uses PUI

private struct CD
    unit u
    integer a_real
    integer a_fake
    real dur
    effect eff
    integer index
    timer t
endstruct


globals
    CD array CD_Array
    timer TIMER = CreateTimer()
endglobals

private function CDCallback takes nothing returns nothing
    local integer i = 0
    local boolean b = false
    local integer index
    local integer ind
    local timer t = GetExpiredTimer()
    //local cd cd = GetTimerStructA(t)
    //call BJDebugMsg(&quot;Timer callback&quot;)
    loop
        exitwhen b == true
        set CD_Array<i> = GetTimerStructA(t)
        if CD(CD_Array[index]).t == t then
            set b = true
            set index = i
        endif
        set i = i + 1
    endloop
    set ind = CD(CD_Array[index])
    call UnitRemoveAbility(CD(CD_Array[index]).u, CD(CD_Array[index]).a_fake)
    call UnitAddAbility(CD(CD_Array[index]).u, CD(CD_Array[index]).a_real)
    call DisplayTextToPlayer(GetOwningPlayer(CD(CD_Array[index]).u), 0, 0, &quot;|cffffcc00&quot;+GetObjectName(CD(CD_Array[index]).a_real)+&quot;|r is ready!&quot;)
    call ClearTimerStructA(GetExpiredTimer())
    call DisableTrigger( gg_trg_Timer )
    call PauseTimer(GetExpiredTimer())
endfunction

function Cooldown takes unit u, integer ability_real, integer ability_fake, real duration returns nothing
    local integer index = GetUnitIndex(u)
    local timer t = CreateTimer()
    set TIMER = t
    //call BJDebugMsg(I2S(index))
    set CD_Array[index] = CD.create()
    set CD(CD_Array[index]).u = u
    set CD(CD_Array[index]).a_real = ability_real
    set CD(CD_Array[index]).a_fake = ability_fake
    set CD(CD_Array[index]).dur = duration
    set CD(CD_Array[index]).index = index
    set CD(CD_Array[index]).t = TIMER
    call UnitRemoveAbility(CD(CD_Array[index]).u, CD(CD_Array[index]).a_real)
    call UnitAddAbility(CD(CD_Array[index]).u, CD(CD_Array[index]).a_fake)
    call SetTimerStructA(TIMER, CD(CD_Array[index]))
    call TimerStart(TIMER, duration, false, function CDCallback)
endfunction

function Cooldown_Add takes unit u, integer abil_id, real modify returns nothing
    local integer index = GetUnitIndex(u)+1
    local real time = TimerGetRemaining(CD(CD_Array[index]).t)
    local string s = &quot;&quot;
    //call BJDebugMsg(I2S(index))
    if time &gt; 0 then
        call PauseTimer(CD(CD_Array[index]).t)
        if  time + modify &lt;= 0 and modify &lt; 0 then
            set time = 0
        else
            set time = time + modify
        endif
        set s = &quot;New cooldown for |cffffcc00&quot;+GetAbilityName(abil_id)+&quot;:|r &quot; + I2S(R2I(time))
        call DisplayTimedTextToPlayer(GetOwningPlayer(u), 0,0,10,s)
        call TimerStart(CD(CD_Array[index]).t, time, false, function CDCallback)
        //call BJDebugMsg(&quot;CD modified to: &quot;+R2S(time))
    else
        return
    endif
endfunction

endlibrary

</i>


If you want to use global struct, make sure the global placed under the struct, so jasshelper will compile it.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
My homemade CD System :
JASS:
library CDSys requires PUI, ABC

    globals
        private constant integer MAX_ABILITY = 6
    endglobals
    
    private struct CD
        private static integer pui_unit
        private static thistype pui_data
        private static integer i
        unit u
        timer array t [MAX_ABILITY]
        integer array abil [MAX_ABILITY]
        integer array abil2 [MAX_ABILITY]
        integer array lv [MAX_ABILITY]
        real array dur [MAX_ABILITY]
        
        static method operator [] takes unit whichunit returns thistype
            set thistype.pui_data = thistype(GetUnitIndex(whichunit))
            if thistype.pui_data.u != whichunit then
                if thistype.pui_data.u != null then
                    set thistype.i = 1
                    loop
                    exitwhen thistype.i &gt; MAX_ABILITY
                        set thistype.pui_data.abil[thistype.i] = 0
                        set thistype.pui_data.abil2[thistype.i] = 0
                        set thistype.pui_data.lv[thistype.i] = 0
                        set thistype.pui_data.dur[thistype.i] = 0.
                        set thistype.i = thistype.i + 1
                    endloop
                endif
                set thistype.pui_data.u = whichunit    
            endif
            return thistype.pui_data
        endmethod
        
        //Never call create or destroy on this struct.
    endstruct
    
    globals
        private CD d
        private integer pos
    endglobals
    
    private function RemoveCD takes nothing returns nothing
        set d = GetTimerStructA(GetExpiredTimer())
        set pos = GetTimerStructB(GetExpiredTimer())
        call UnitRemoveAbility(d.u,d.abil2[pos])
        call UnitAddAbility(d.u,d.abil[pos])
        call SetUnitAbilityLevel(d.u,d.abil[pos],d.lv[pos])
        call PauseTimer(d.t[pos])
    endfunction
    
    private function AddCD takes nothing returns nothing
        set d = GetTimerStructA(GetExpiredTimer())
        set pos = GetTimerStructB(GetExpiredTimer())
        call UnitRemoveAbility(d.u,d.abil[pos])
        call UnitAddAbility(d.u,d.abil2[pos])
        call PauseTimer(d.t[pos])
        call TimerStart(d.t[pos],d.dur[pos],false,function RemoveCD)
    endfunction
    
    function Cooldown takes unit whichunit, integer whichslot, integer abil, integer abil2, real duration returns nothing
       set d = CD[whichunit]
       if d.t[whichslot] == null then
            set d.t[whichslot] = CreateTimer()
            call SetTimerStructA(d.t[whichslot],d)
            call SetTimerStructB(d.t[whichslot],whichslot)
        endif
        set d.abil[whichslot] = abil
        set d.abil2[whichslot] = abil2
        set d.dur[whichslot] = duration
        set d.lv[whichslot] = GetUnitAbilityLevel(d.u,d.abil[whichslot])
        call PauseTimer(d.t[whichslot])
        call TimerStart(d.t[whichslot],.0,true,function AddCD) //Allow the spell to be casted
    endfunction
    
    function ResetCooldown takes unit whichunit, integer whichslot returns nothing
        set d = CD[whichunit]
        if d.abil[whichslot] &gt; 0 then
            call PauseTimer(d.t[whichslot])
            call TimerStart(d.t[whichslot],.0,false,function RemoveCD)
        endif
    endfunction
    
    function ModifyCooldown takes unit whichunit, integer whichslot, real time returns nothing
        set d = CD[whichunit]
        if d.abil[whichslot] &gt; 0 then
            call PauseTimer(d.t[whichslot])
            set d.dur[whichslot] = time
            if time &gt; d.dur[whichslot] then
                call TimerStart(d.t[whichslot],time - TimerGetRemaining(d.t[whichslot]),false,function RemoveCD)    
            else
                call TimerStart(d.t[whichslot],0.,false,function RemoveCD)    
            endif
        endif
    endfunction
    
    function GetRemainingCooldown takes unit whichunit, integer whichslot returns real
        return TimerGetRemaining(CD[whichunit].t[whichslot])
    endfunction
    
    function GetAbilityByIndex takes unit whichunit, integer whichslot returns integer
        return CD[whichunit].abil[whichslot]
    endfunction
    
    function Ability2Index takes unit whichunit, integer abil_id returns integer
        local integer count = 1
        set d = CD[whichunit]
        loop
        exitwhen count &gt; MAX_ABILITY
            if CD[whichunit].abil[count] == abil_id then
                return count
            endif
            set count = count + 1
        endloop
        return 0
    endfunction
endlibrary
 

Nexor

...
Reaction score
74
Hm that's the thing I wanted to make. what does the [ljass]integer whichslot[/ljass] refer to?

And what if I want to increase/reduce cooldown by a percent? [ * ; / ]

I know I should make another function to it, but should I base it on the modify (Addition/removal) [ + / - ] function?

I tried to modify my spell to increase it's cooldown by 5 seconds, but it was set to 0 :S:S what happened?
 

Nexor

...
Reaction score
74
Sorry for doubleposting but I must post this in a new post.

I've found the error that caused my ability to get resetted when I tried to modify it.

JASS:
set d.dur[whichslot] = time
            if time &gt; d.dur[whichslot] then
                call TimerStart(d.t[whichslot],time - TimerGetRemaining(d.t[whichslot]),false,function RemoveCD)    
            else
                call TimerStart(d.t[whichslot],0.,false,function RemoveCD)    
            endif


This part in the Modify function will reset the ability no matter what.
You set the duration to the time the user wants to set it. The variables will be equal so it means that the else part will run EVERYTIME -> ability reset.
 

Nexor

...
Reaction score
74
Triplepost... I know but don't want to start a new thread.

I repaired your trigger and added some other functions to it, if you don't mind.
The exceeded cooldown system:

JASS:
library CDSys requires PUI, ABC

    globals
        private constant integer MAX_ABILITY = 6
    endglobals
    
    private struct CD
        private static integer pui_unit
        private static thistype pui_data
        private static integer i
        unit u
        timer array t [MAX_ABILITY]
        integer array abil [MAX_ABILITY]
        integer array abil2 [MAX_ABILITY]
        integer array lv [MAX_ABILITY]
        real array dur [MAX_ABILITY]
        
        static method operator [] takes unit whichunit returns thistype
            set thistype.pui_data = thistype(GetUnitIndex(whichunit))
            if thistype.pui_data.u != whichunit then
                if thistype.pui_data.u != null then
                    set thistype.i = 1
                    loop
                    exitwhen thistype.i &gt; MAX_ABILITY
                        set thistype.pui_data.abil[thistype.i] = 0
                        set thistype.pui_data.abil2[thistype.i] = 0
                        set thistype.pui_data.lv[thistype.i] = 0
                        set thistype.pui_data.dur[thistype.i] = 0.
                        set thistype.i = thistype.i + 1
                    endloop
                endif
                set thistype.pui_data.u = whichunit    
            endif
            return thistype.pui_data
        endmethod
        
        //Never call create or destroy on this struct.
    endstruct
    
    globals
        private CD d
        private integer pos
        private string Effect = &quot;Abilities\\Spells\\Human\\DispelMagic\\DispelMagicTarget.mdl&quot;
        private string Attach = &quot;origin&quot;
    endglobals
    
    private function RemoveCD takes nothing returns nothing
        set d = GetTimerStructA(GetExpiredTimer())
        set pos = GetTimerStructB(GetExpiredTimer())
        call UnitRemoveAbility(d.u,d.abil2[pos])
        call UnitAddAbility(d.u,d.abil[pos])
        call SetUnitAbilityLevel(d.u,d.abil[pos],d.lv[pos])
        call PauseTimer(d.t[pos])
        call DestroyEffect( AddSpecialEffectTarget(Effect, d.u, Attach)) 
    endfunction
    
    private function AddCD takes nothing returns nothing
        set d = GetTimerStructA(GetExpiredTimer())
        set pos = GetTimerStructB(GetExpiredTimer())
        call UnitRemoveAbility(d.u,d.abil[pos])
        call UnitAddAbility(d.u,d.abil2[pos])
        call PauseTimer(d.t[pos])
        call TimerStart(d.t[pos],d.dur[pos],false,function RemoveCD)
    endfunction
    
    function Cooldown takes unit whichunit, integer whichslot, integer abil, integer abil2, real duration returns nothing
       set d = CD[whichunit]
       if d.t[whichslot] == null then
            set d.t[whichslot] = CreateTimer()
            call SetTimerStructA(d.t[whichslot],d)
            call SetTimerStructB(d.t[whichslot],whichslot)
        endif
        set d.abil[whichslot] = abil
        set d.abil2[whichslot] = abil2
        set d.dur[whichslot] = duration
        set d.lv[whichslot] = GetUnitAbilityLevel(d.u,d.abil[whichslot])
        call PauseTimer(d.t[whichslot])
        call TimerStart(d.t[whichslot],.0,true,function AddCD) //Allow the spell to be casted
    endfunction
    
    function ResetCooldown takes unit whichunit, integer whichslot returns nothing
        set d = CD[whichunit]
        if d.abil[whichslot] &gt; 0 then
            call PauseTimer(d.t[whichslot])
            call TimerStart(d.t[whichslot],.0,false,function RemoveCD)
        endif
    endfunction
    
    function RestartCooldown takes unit whichunit, integer whichslot returns nothing
        set d = CD[whichunit]
        if d.abil[whichslot] &gt; 0 then
            call PauseTimer(d.t[whichslot])
            call TimerStart(d.t[whichslot],d.dur[whichslot],false,function RemoveCD)
        endif
    endfunction
    
    function AddCooldown takes unit whichunit, integer whichslot, real time returns nothing
        set d = CD[whichunit]
        if d.abil[whichslot] &gt; 0 then
            call PauseTimer(d.t[whichslot])
            //set d.dur[whichslot] = time
            if TimerGetRemaining(d.t[whichslot])+time &gt; 0 then
                call TimerStart(d.t[whichslot],TimerGetRemaining(d.t[whichslot])+time,false,function RemoveCD)    
            else
                call TimerStart(d.t[whichslot],0.,false,function RemoveCD)    
            endif
        endif
    endfunction
    
    function MultiplyCooldown takes unit whichunit, integer whichslot, real multi returns nothing
        set d = CD[whichunit]
        if d.abil[whichslot] &gt; 0 then
            call PauseTimer(d.t[whichslot])
            //set d.dur[whichslot] = time
            if TimerGetRemaining(d.t[whichslot])*multi &gt; 0 then
                call TimerStart(d.t[whichslot],TimerGetRemaining(d.t[whichslot])*multi,false,function RemoveCD)    
            else
                call TimerStart(d.t[whichslot],0.,false,function RemoveCD)    
            endif
        endif
    endfunction
    
    function GetRemainingCooldown takes unit whichunit, integer whichslot returns real
        return TimerGetRemaining(CD[whichunit].t[whichslot])
    endfunction
    
    function GetAbilityByIndex takes unit whichunit, integer whichslot returns integer
        return CD[whichunit].abil[whichslot]
    endfunction
    
    function Ability2Index takes unit whichunit, integer abil_id returns integer
        local integer count = 1
        set d = CD[whichunit]
        loop
        exitwhen count &gt; MAX_ABILITY
            if CD[whichunit].abil[count] == abil_id then
                return count
            endif
            set count = count + 1
        endloop
        return 0
    endfunction
endlibrary
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Just modify it freely. I claim no credit from it. ;)
The whichslot is the position of skills on a unit.
You can adjust the MAX_ABILITY to match your needs.
If the hero in your map contains 4 maximum active skills then change it to 4.
The hero casts skill 1, use slot 1, skill 2 uses slot 2, vice versa.
 

Nexor

...
Reaction score
74
Is there any cooldown systems out there?
This one is ubercool I gotta say, really easily upgradeable. I added some functions to it, like:

-UnitAddCooldown: to add cooldown to unit's ability before it casts anything
-GetAbilityNameByIndex: returns ability name
-RestartCooldown: the name tells it
-MultiplyCooldown: multiply the current cooldown with a number higher than 0.0
 
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

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top