Spell Moon Glaive

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Bounce

55987439.jpg

JASS:
Bounce  v1.0.2
    by kingking

Bouncing. Yeah, it is bouncing.
It makes your bouncing spells easier.

Requirements :
T32, Damage, Recycle or Damage, xefx, Event

How to implement?
  1) Implement those required systems.
  2) Copy this library into your map.
  3) Enjoy!
  
Usage :
Make your struct extends Bounce
Example : private struct Data extends Bounce

Struct Members :
.startingUnit        -> Starting unit.
.count               -> Number of bounce.
.allowRepeatingUnits -> Allows/Disallows affected units to be picked again.
.callback            -> When the missle is collided with unit, this will be called.
.filter              -> Unit picking filter.
.collisionSize       -> When range between missle and unit is under this value, bounce will occur.
.range               -> Unit picking range.
.missleSpeed         -> How fast the missle travelled.
.target              -> Modify the target by your ownself.
.missleHeight        -> Minimum height of missle.
.main                -> Bouncing around which unit? (Bouncing around dummy is default)
.x                   -> X-axis of missle
.y                   -> Y-axis of missle
.z                   -> Z-axis of missle

Static methods :
.allocate()                     -> Returns an instance.
.create()                       -> Returns an instance. (If you have custom defined .create method.)
.register(trigger) return EvenReg -> Register trigger for all onHit event.
.getTriggering()                -> Returns triggered instance.

Methods :
.startBouncing(model, scale)    -> Starts bouncing.

Example for .callback :
method onHit takes unit whichUnit returns nothing
function onHit takes struct whichStruct, unit whichUnit returns nothing

Example for .filter :
method filterUnits takes unit whichUnit returns boolean
function filterUnits takes struct whichStruct, unit whichUnit returns boolean
(Picking living units are done by this library, you dont have to add it in your filter function.)

Note :
You dont have to call .destroy() on struct, it will be destroyed automatically.


JASS:
library Bounce requires Damage, T32, optional Recycle, optional GroupUtils, xefx, Event
    
    function interface BounceCallback takes integer data, unit whichUnit returns nothing
    function interface BounceUnitFilter takes integer data, unit whichUnit returns boolean
    
    struct Bounce
        // For event callbacks.
        private static Event OnHit
        private static thistype array OnHitData 
        //Array? Prevent recursion. =)
        private static integer OnHitStackLevel = 0
        //
        private static conditionfunc condAllowRepeatingUnits
        private static conditionfunc condDisallowRepeatingUnits
        private static thistype d
        integer count = 0
        boolean allowRepeatingUnits = false
        BounceCallback callback = 0
        BounceUnitFilter filter = 0
        real collisionSize = 16.
        real range = .1
        unit target
        real missleHeight
        unit main
        private unit lastTarget
        private xefx fx
        private real speed
        private real targetZ
        private real lastTargetZ
        readonly real x
        readonly real y
        private group damagedUnits
        private conditionfunc cf
        
        static method getTriggering takes nothing returns thistype
            return thistype.OnHitData[thistype.OnHitStackLevel]
        endmethod
        
        private method onDestroy takes nothing returns nothing
            call .stopPeriodic()
            call .fx.destroy()
            if not .allowRepeatingUnits then
                static if LIBRARY_GroupUtils then
                    call ReleaseGroup(.damagedUnits)
                else
                    call Group.release(.damagedUnits)
                endif
            endif
            set .target = null
            set .missleHeight = 0.
            set .main = null
        endmethod
        
        private static method allowRepeating takes nothing returns boolean
            local unit u = GetFilterUnit()
            if GetWidgetLife(u) > .405 and thistype.d.filter.evaluate(thistype.d,u) and u != thistype.d.lastTarget then
                set u = null
                return true
            endif
            set u = null
            return false
        endmethod
        
        private static method disallowRepeating takes nothing returns boolean
            local unit u = GetFilterUnit()
            if GetWidgetLife(u) > .405 and thistype.d.filter.evaluate(thistype.d,u) and u != thistype.d.lastTarget and not IsUnitInGroup(u,thistype.d.damagedUnits) then
                set u = null
                return true
            endif
            set u = null
            return false
        endmethod
        
        private method periodic takes nothing returns nothing
            local real dx
            local real dy
            local real tx
            local real ty
            local real angle
            local real dist
            local group g
            
            if .target == null then
                if .count > 0 then
                
                    static if LIBRARY_GroupUtils then
                        set g = NewGroup()
                    elseif LIBRARY_Recycle then
                        set g = Group.get()
                    endif
                    
                    set thistype.d = this
                    call GroupEnumUnitsInRange(g,GetUnitX(.main),GetUnitY(.main),.range,.cf)
                    set .target = FirstOfGroup(g)
                    
                    static if LIBRARY_GroupUtils then
                        call ReleaseGroup(g)
                    elseif LIBRARY_Recycle then
                        call Group.release(g)
                    endif
                    
                    if .target == null then
                    //No more units in range.
                        call .destroy()
                    else
                        set .targetZ = GetUnitFlyHeight(.target)
                    endif
                else
                    call .destroy()
                    //No more bounces left...
                endif
            else
                set tx = GetUnitX(.target)
                set ty = GetUnitY(.target)
                set dx = tx - .x
                set dy = ty - .y
                set angle = Atan2(dy,dx)
                set dist = dx * dx + dy * dy
                
                set .x = .x + .speed * Cos(angle)
                set .y = .y + .speed * Sin(angle)
                set .fx.x = .x
                set .fx.y = .y
                set .fx.xyangle = angle
                set dx = tx - GetUnitX(.lastTarget)
                set dy = ty - GetUnitY(.lastTarget)
                set .fx.z = .missleHeight + .lastTargetZ + (dist/(dx*dx+dy*dy)) * (.targetZ - .lastTargetZ)
                //For flying units.

                if IsUnitInRange(.fx.dummy,.target,.collisionSize) then
                    set .count = .count - 1
                    call .callback.evaluate(this,.target)//Too bad, jasshelper can't detect callback.exists in extended structs.
                    set thistype.OnHitStackLevel = thistype.OnHitStackLevel + 1
                    set thistype.OnHitData[thistype.OnHitStackLevel] = this
                    call thistype.OnHit.fire()
                    set thistype.OnHitStackLevel = thistype.OnHitStackLevel - 1
                    if not .allowRepeatingUnits then
                        call GroupAddUnit(.damagedUnits,.target)
                    endif
                    set .lastTarget = .target
                    set .lastTargetZ = .targetZ
                    set .target = null
                endif
            endif
        endmethod
        
        implement T32x
        
        method operator missleSpeed= takes real mSpeed returns nothing
            set .speed = mSpeed * T32_PERIOD
        endmethod
        
        method operator startingUnit= takes unit whichUnit returns nothing
            set .lastTarget = whichUnit
        endmethod
        
        method operator z takes nothing returns real
            return .fx.z
        endmethod
        
        method startBouncing takes string model, real scale returns nothing
            set .x = GetUnitX(.lastTarget)
            set .y = GetUnitY(.lastTarget)
            set .lastTargetZ = GetUnitFlyHeight(.lastTarget)
            
            set .fx = xefx.create(.x,.y,0.)
            set .fx.z = .lastTargetZ
            set .fx.fxpath = model
            call SetUnitScale(.fx.dummy,scale,scale,0.)
            
            if .main == null then
                set .main = .fx.dummy
            endif
            
            if not .allowRepeatingUnits then
            
                static if LIBRARY_GroupUtils then
                    set .damagedUnits = NewGroup()
                elseif LIBRARY_Recycle then
                    set .damagedUnits = Group.get()
                endif
                
                set .cf = thistype.condDisallowRepeatingUnits
                call GroupAddUnit(.damagedUnits,.lastTarget)
            else
                set .cf = thistype.condAllowRepeatingUnits
            endif
            
            call .startPeriodic()
        endmethod
        
        static method registerEvent takes trigger whichTrigger returns EventReg
            return thistype.OnHit.register(whichTrigger)
        endmethod
        
        private static method onInit takes nothing returns nothing
            set thistype.condAllowRepeatingUnits = Condition(function thistype.allowRepeating)
            set thistype.condDisallowRepeatingUnits = Condition(function thistype.disallowRepeating)
            set thistype.OnHit = Event.create()
            static if not LIBRARY_GroupUtils and not LIBRARY_Recycle then
                call BJDebugMsg("Bounce Error! Please implement either GroupUtils or Recycle for your map.")
            endif
        endmethod
        
    endstruct

endlibrary

Links : Damage, T32, Recycle, Event, (xe's link is unavailable because wc3c.net is downed :()
-> Classical spells that can be made by this are Chain Frost(Lich's Ultimate in DotA), Chain Entangle, Paralysing Cask(Witch Doctor's first skill in DotA), and those chainy spells.
-> Demo map includes Chain Frost and triggered Moon Glaive. :)
-> (Moon Glaive)Don't ask me about the damage amount, there are other libraries to let you to get the actual damage dealt.
-> If you wanted to bypass the default unit picking mechanism(The library uses FirstOfGroup), just set .target by yourself in the onHit callback.
-> If you wanted to force the struct to be destroyed, just set .count = 0 and .target = null, it will be destroyed.
JASS:
library ChainFrost requires GT, Bounce, DummyCaster

    globals
        private constant integer SPELL_ID    = 'A002'
        private constant string MISSLE_MODEL = "Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl"
        private constant real MISSLE_SCALE   = 1.
        private constant real MISSLE_SPEED   = 600.
        private constant attacktype ATK_TYPE = ATTACK_TYPE_NORMAL
        private constant damagetype DMG_TYPE = DAMAGE_TYPE_NORMAL
        private constant integer FROST_NOVA  = 'A003'
        private constant string FROST_ORDER  = "frostnova"
    endglobals
    
    private function Damage takes integer lv returns real
        return 190. + (lv * 90.)
    endfunction
    
    private function BounceCount takes integer lv returns integer
        return 7
    endfunction
    
    private function AoE takes integer lv returns real
        return 600.
    endfunction

    private struct Data extends Bounce
        unit caster
        integer lv
        player owner
        real damage
        
        private method onHit takes unit whichUnit returns nothing
            if UnitAddAbility(DUMMY,FROST_NOVA) then
                if IssueTargetOrder(DUMMY,FROST_ORDER,whichUnit) then
                    call UnitDamageTargetEx(.caster,whichUnit,.damage,false,false,ATK_TYPE,DMG_TYPE,null)
                endif
                call UnitRemoveAbility(DUMMY,FROST_NOVA)
            endif
        endmethod
        
        //Pretty easy, huh?
        private method filterUnits takes unit whichUnit returns boolean
            return IsUnitEnemy(whichUnit,.owner)
        endmethod
        
        private static method act takes nothing returns boolean
            local thistype this = thistype.allocate()
            set .caster = GetTriggerUnit()
            set .startingUnit = .caster
            set .target = GetSpellTargetUnit()
            set .lv = GetUnitAbilityLevel(.caster,SPELL_ID)
            set .owner = GetOwningPlayer(.caster)
            set .allowRepeatingUnits = true
            set .count = BounceCount(.lv)
            set .damage = Damage(.lv)
            set .range = AoE(.lv)
            set .collisionSize = 16.
            set .missleSpeed = MISSLE_SPEED
            set .callback = .onHit
            set .filter = .filterUnits
            set .missleHeight = 30.
            set .main = .caster
            call .startBouncing(MISSLE_MODEL,MISSLE_SCALE)
            return false
        endmethod
        
        private static method onInit takes nothing returns nothing
            call GT_AddStartsEffectAction(function thistype.act,SPELL_ID)
        endmethod
    endstruct
    
endlibrary
 

Attachments

  • Bounce.w3x
    116.3 KB · Views: 365

HeX.16

Isn't Trollin You Right Now
Reaction score
131
Awesome spell. One thing i noticed was that the buff from the moon glaive ability was Devotion Aura. Slight problem.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Awesome spell. One thing i noticed was that the buff from the moon glaive ability was Devotion Aura. Slight problem.
Yeah, should be Channel.
 

Weep

Godspeed to the sound of the pounding
Reaction score
400
Problems:
This takes its damage from the first hit, so if you attack something strong like an Infernal, and it bounces to something weak like a Peasant, the Peasant will only take a percent of the damage the Infernal took, not damage based on the actual attack's strength and damage type.

Also, it deals its damage as Damage_Pure, so if it first hits something weak like a Peasant, and bounces to something strong like an Infernal, the Infernal will take a percent of the damage the Peasant took, ignoring the Infernal's armor.

The missiles don't move to a flying unit's height. It looks pretty silly when the Huntress launches an attack directly at a flying unit, and then the bouncing glaive suddenly appears at ground level. :p Shouldn't this be using a projectile library, anyway?

There's no option to disallow the bounce hitting the same unit multiple times, like there is with native bouncing attacks.

Wouldn't this be more useful as a library for creating bouncing projectiles in general, with an onHit method, to facilitate things like bouncing poison attacks?
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
This takes its damage from the first hit, so if you attack something strong like an Infernal, and it bounces to something weak like a Peasant, the Peasant will only take a percent of the damage the Infernal took, not damage based on the actual attack's strength and damage type.

Also, it deals its damage as Damage_Pure, so if it first hits something weak like a Peasant, and bounces to something strong like an Infernal, the Infernal will take a percent of the damage the Peasant took, ignoring the Infernal's armor.

The missiles don't move to a flying unit's height. It looks pretty silly when the Huntress launches an attack directly at a flying unit, and then the bouncing glaive suddenly appears at ground level. Shouldn't this be using a projectile library, anyway?

There's no option to disallow the bounce hitting the same unit multiple times, like there is with native bouncing attacks.

Wouldn't this be more useful as a library for creating bouncing projectiles in general, with an onHit method, to facilitate things like bouncing poison attacks?

Uhm, I think... Will it be better to be a library? :p

Update : v1.0.1 is in progress.
New Features :
-> Allow triggered spell to interact to this spell, like lifesteal.
-> Flying missle, looks more natural

Sigh, I modified this spell into a library.
Can any moderator help me to change the title? :eek:
 

Crazy_Dead

New Member
Reaction score
24
Wouldn't this be more useful as a library for creating bouncing projectiles in general, with an onHit method, to facilitate things like bouncing poison attacks?
Uhm, I think... Will it be better to be a library?

Yes. ( +1 postcount )

Question;

Is this a system or a spell, or a spellsystem or a system+spell? :p
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
It was spell, but I turned it into a library. But seems like nobody bother my request. :(
 

Laiev

Hey Listen!!
Reaction score
188
@hgkjfhfdsj

JASS:
////////////////////////////////////////////
//      Moon Glaive, by kingking
//          -v1.0.0-
//
//  Bouncing Attack. Yes, it is triggered
//  bouncing attack.
//
//  Requirements :
//  T32
//  Damage
//  Recycle or GroupUtils
//  xebasic (Optional)
//
//  How to implement?
//  1) Implement those required systems.
//  2) Copy this library into your map.
//  3) Adjust the rawcode.
//  4) Enjoy!
//
//  Constant globals :
//  SPELL_ID
//  -> Change the rawcode to the Moon Glaive
//     spell in your map.
//  DUMMY_ID
//  -> Rawcode for dummy.
//  -> If you have xebasic in your map, this
//     library will use the dummy of xebasic
//     instead.
//  MISSLE_MODEL
//  -> Model for missle.
//  MISSLE_SCALE
//  -> Size for missle.
//  MISSLE_SPEED
//  -> Speed of missle.
//  COLLISION_SIZE
//  -> How near between missle and units
//     to apply damaging.
//  RANGE
//  -> AoE for searching units.
//
//  Functions :
//  BounceCount
//  -> Number of bounce
//
//  Multiplier
//  -> Amount of damage to deal.
///////////////////////////////////////////
library MoonGlaive requires Damage, T32, optional Recycle, optional GroupUtils, optional xebasic
    
    globals
        private constant integer SPELL_ID    = 'A000'
        private constant integer DUMMY_ID    = 'u000'
        private constant string MISSLE_MODEL = "Abilities\\Weapons\\SentinelMissile\\SentinelMissile.mdl"
        private constant real MISSLE_SCALE   =  1.
        private constant real MISSLE_SPEED   =  900.
        private constant real COLLISION_SIZE =  20.
        private constant real RANGE          =  400.
    endglobals
    
    private function BounceCount takes integer lv returns integer
        return 2 * lv
    endfunction
    
    private function Multiplier takes integer lv returns real
        return 0.70
        //Deals 70% damage per bounce.
    endfunction

    private function BounceCondition takes unit whichUnit, unit atker returns boolean
        return IsUnitEnemy(whichUnit,GetOwningPlayer(atker))
        //Condition to bounce.
    endfunction
    
    private keyword Data
    private function PickUnitCondition takes unit whichUnit, Data dat returns boolean
        return true
        //Unit alive, enemy is filtered by default.
    endfunction
    
    //-------------------> No more touching below. <---------------------\\
    
    private struct NearestUnit extends array
        private static unit curr
        private static unit target
        private static real max
        private static real tx
        private static real ty
        private static method check takes nothing returns nothing
            local unit u = GetEnumUnit()
            local real dx = .tx - GetUnitX(u)
            local real dy = .ty - GetUnitY(u)
            local real dist = dx*dx+dy*dy
            if dist < .max then
                set .max = dist
                set .curr = u
            endif
            set u = null
        endmethod
        static method pick takes unit whichUnit, group g returns unit
            set .curr = null
            set .target = whichUnit
            set .max = 9999999999999999.
            set .tx = GetUnitX(.target)
            set .ty = GetUnitY(.target)
            call ForGroup(g,function thistype.check)
            return .curr
        endmethod
        //Snippet.
    endstruct
    
    private struct Data
        private static real missleSpeed
        private static conditionfunc cf
        private static thistype d
        unit atker
        real multiplier
        real damage
        integer lv
        integer count
        player p
        
        unit target
        unit lastTarget
        unit dummy
        effect eff
        real x
        real y
        
        private method onDestroy takes nothing returns nothing
            call .stopPeriodic()
            call DestroyEffect(.eff)
            call RemoveUnit(.dummy)
        endmethod
        
        private static method pickUnits takes nothing returns boolean
            local unit u = GetFilterUnit()
            if GetWidgetLife(u) > .405 and IsUnitEnemy(u,thistype.d.p) and PickUnitCondition(u,thistype.d) and u != thistype.d.lastTarget then
                set u = null
                return true
            endif
            set u = null
            return false
        endmethod
        
        private method periodic takes nothing returns nothing
            local real dx
            local real dy
            local real tx
            local real ty
            local real angle
            local group g
            
            if .target == null then
                if .count > 0 then
                
                    static if LIBRARY_GroupUtils then
                        set g = NewGroup()
                    elseif LIBRARY_Recycle then
                        set g = Group.get()
                    endif
                    
                    set thistype.d = this
                    call GroupEnumUnitsInRange(g,.x,.y,RANGE,thistype.cf)
                    set .target = NearestUnit.pick(.atker,g)
                    
                    static if LIBRARY_GroupUtils then
                        call ReleaseGroup(g)
                    elseif LIBRARY_Recycle then
                        call Group.release(g)
                    endif
                    
                    if .target == null then
                    //No more units in range.
                        call .destroy()
                    else
                        set .count = .count - 1
                    endif
                else
                    call .destroy()
                    //No more bounces left...
                endif
            else
                set tx = GetUnitX(.target)
                set ty = GetUnitY(.target)
                set dx = tx - .x
                set dy = ty - .y
                set angle = Atan2(dy,dx)
                
                set .x = .x + thistype.missleSpeed * Cos(angle)
                set .y = .y + thistype.missleSpeed * Sin(angle)
                call SetUnitX(.dummy,.x)
                call SetUnitY(.dummy,.y)
                
                if IsUnitInRange(.dummy,.target,COLLISION_SIZE) then
                    set .damage = .damage * .multiplier
                    call DestroyEffect(AddSpecialEffectTarget(MISSLE_MODEL,.target,"chest"))
                    call Damage_Pure(.atker,.target,.damage)
                    set .lastTarget = .target
                    set .target = null
                endif
            endif
        endmethod
        
        implement T32x
        
        private static method onAtk takes nothing returns boolean
            local thistype this
            if GetUnitAbilityLevel(GetEventDamageSource(),SPELL_ID) > 0 and Damage_IsAttack() and BounceCondition(GetTriggerUnit(),GetEventDamageSource()) then
                set this = thistype.allocate()
                set .atker = GetEventDamageSource()
                set .damage = GetEventDamage()
                set .lv = GetUnitAbilityLevel(.atker,SPELL_ID)
                set .multiplier = Multiplier(.lv)
                set .count = BounceCount(.lv)
                set .p = GetOwningPlayer(.atker)
                
                set .lastTarget = GetTriggerUnit()
                set .x = GetUnitX(.lastTarget)
                set .y = GetUnitY(.lastTarget)
                
                set .target = null
                
                static if LIBRARY_xebasic then
                    set .dummy = CreateUnit(Player(15),XE_DUMMY_UNITID,.x,.y,0.)
                else
                    set .dummy = CreateUnit(Player(15),DUMMY_ID,.x,.y,0.)
                endif
                set .eff = AddSpecialEffectTarget(MISSLE_MODEL,.dummy,"origin")
                call SetUnitScale(.dummy,MISSLE_SCALE,MISSLE_SCALE,0.)
                
                call .startPeriodic()
            endif
            return false
        endmethod
        
        
        private static method onInit takes nothing returns nothing
            local trigger trig = CreateTrigger()
            call Damage_RegisterEvent(trig)
            call TriggerAddCondition(trig,Condition(function thistype.onAtk))
            
            set thistype.missleSpeed = MISSLE_SPEED * T32_PERIOD
            set thistype.cf = Condition(function thistype.pickUnits)
            
            static if not LIBRARY_GroupUtils and not LIBRARY_Recycle then
                call BJDebugMsg("Moon Glaive Error! Please implement either GroupUtils or Recycle for your map.")
            endif
        endmethod
        
    endstruct

endlibrary


EDIT:

@kingking
your forget to explain the .owner and others members in documentation but my only question is about the owner... is the owner of the missile? and for what is used?

EDIT¹: Off-Topic - [ljass]FROST_NOVA[/ljass] <~ Highlight'ed ? Oo'

EDIT²: where's library Event is used on system?

EDIT³: -> Classical spells that can be made by this are Chain Frost(Lich's Ultimate in DotA), Chain Entangle, Paralysing Cask(Witch Doctor's Ultimate in DotA), and those chainy spells.

is first skill, ultimate is that ward with chaos damage ;x
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
EDIT:

@kingking
your forget to explain the .owner and others members in documentation but my only question is about the owner... is the owner of the missile? and for what is used?

Aren't they part of the examples' struct data? It is used to check if the unit is an enemy. ;D

EDIT¹: Off-Topic - [ljass]FROST_NOVA[/ljass] <~ Highlight'ed ? Oo'

It is from the common.ai. =)
JASS:
    constant integer FROST_NOVA         = &#039;AUfn&#039;


EDIT²: where's library Event is used on system?

Damage uses Event, and:
JASS:
//
        static method registerEvent takes trigger whichTrigger returns EventReg
            return thistype.OnHit.register(whichTrigger)
        endmethod


Anyway, nice library king. Definitely useful. =D
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Aren't they part of the examples' struct data? It is used to check if the unit is an enemy. ;D
Yep, yep.

EDIT³: -> Classical spells that can be made by this are Chain Frost(Lich's Ultimate in DotA), Chain Entangle, Paralysing Cask(Witch Doctor's Ultimate in DotA), and those chainy spells.
Lol, I will edit that, thanks for informing.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • The Helper The Helper:
    So what it really is me trying to implement some kind of better site navigation not change the whole theme of the site
  • 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 Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top