System Units' Inventory Data

Jesus4Lyf

Good Idea™
Reaction score
397
v1.0.3 : Deprecated : UID_Register/UnregisterOnPickUpItem(trigger), UID_Registe/UnregisterrOnDropItem(trigger), UID_Register/UnregisterOnChangeItemPosition(trigger), UID_Register/UnregisterOnSellItem(trigger), UID_Register/UnregisterOnPawnItem(trigger), UID_Register/UnregisterOnUseItem(trigger), GetItemInUnitBySlot
You did not deprecate those, you removed them. There's a big difference - one breaks backwards compatibility (not that there is a problem with that in this instance, but you should be aware of the meaning of "deprecate").
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
You did not deprecate those, you removed them. There's a big difference - one breaks backwards compatibility (not that there is a problem with that in this instance, but you should be aware of the meaning of "deprecate").
Okay, modified.
 

Laiev

Hey Listen!!
Reaction score
188
other stupid 'bug' found by me lol :p

Both trigger (in post) Charge Merger and Charge Splitter got the same Description "What is Charge Splitter?"

:X
 

SanKakU

Member
Reaction score
21
Laiev, as far as i know, charge splitter doesn't do anything.

And btw, since we're talking about oddities with the way your code is arranged, kingkingyyk3, I should mention that i think it makes more sense to put chargesplitter and chargemerger libraries underneath UID in the same trigger. Like how AIDS has PUI underneath it.
 

Laiev

Hey Listen!!
Reaction score
188
Laiev, as far as i know, charge splitter doesn't do anything.

And btw, since we're talking about oddities with the way your code is arranged, kingkingyyk3, I should mention that i think it makes more sense to put chargesplitter and chargemerger libraries underneath UID in the same trigger. Like how AIDS has PUI underneath it.

JASS:
//  =========================
//  What is Charge Splitter?
//  =========================
//  Charge Splitter allows auto splitting of
//  items' charges when it is moved to 
//  another slot in inventory of a unit.


So Charge Splitter do a thing... What i say about 'bug' is because the Charge Merger got the same description :thdown:

Also DON'T DO IT kingking =.= don't merge both triggers :nuts::nuts:
 

SanKakU

Member
Reaction score
21
JASS:
//  =========================
//  What is Charge Splitter?
//  =========================
//  Charge Splitter allows auto splitting of
//  items' charges when it is moved to 
//  another slot in inventory of a unit.


So Charge Splitter do a thing... What i say about 'bug' is because the Charge Merger got the same description :thdown:

Also DON'T DO IT kingking =.= don't merge both triggers :nuts::nuts:

well, i can't split anything. he said i would have to edit splitter to split items myself. but i don't know how...as you said, the comments for charge splitter are charge merger's comments duplicated. or something like that....whatever the case...the instructions are insufficient.

all i know is that the charge merging works...maybe kingkingyyk3 needs a second demo map of charge splitting? but i don't think charge splitting is useful...
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Ok... :)

Updated demo map.
Updated Charge Splitter. (Use a global timer + stack now)
 

Laiev

Hey Listen!!
Reaction score
188
hmmm :rolleyes:

I think I find a bug :rolleyes::rolleyes::rolleyes:

When you got a charged item and right click it and right click again in the item which you get (to move slot), it just desapear :(
 

SanKakU

Member
Reaction score
21
i have had success with using the system and yet i don't know how to modify it.
well, i see you've updated it since i have been using it. you changed the requirement from timerutils to t32, it seems. also it seems you say you optimized the code or something like that so i wonder if your code is easier for me to understand or not. i will be reviewing it.

at any rate. the reason i'm visiting the thread today is i have been thinking about the system a lot, and a major thing i'd like to see done with it...is for it to do this thing where it doesn't use aids.

the only reason i'm using aids in my tag map is because i need the charge merger system in order to stack charged items of a count beyond 1 (i also call them ammo items)automatically.

the unit indexing and whatever else that comes with aids that i don't understand and probably slows down my map somewhat if nothing else in loading time is all rather unnecessary, unless this system requires it.

so i thought, why not just index the items?

well, someone's done such a thing, they're indexing items.

i'm not sure who made it as their name isn't in the comments, but it's from wc3c.net

i added one small change to the system. i'm delighted that it's a lot easier to understand and work with than either autoindex or aids or those other indexing systems. but so far i can't understand how to work with your system, so if you can figure out how to make your system work with itemdex, i would be thrilled, and i think it would be better for your system. if you don't agree, then if you can just make it an alternate version, that would be great.
JASS:
library Itemdex initializer init requires optional Table
//**************************************************************
//* Itemdex (Multi-version)
//* -------
//* I need this for many things, something that indexes items
//* Problems of item indexing:
//*  a) Only way to detect item death is with a dynamic trigger
//*  b) No known way to detect an item removal event. Besides
//*  expecting the user to tell you.
//*  c) Runes leave some kind of ghost item with 0.0 life that
//*  still got all the data of the item , including its type.
//*
//* ...So, I use a loop to do index garbage collection,
//* see you in hell. Luckily it is even rarer to think of 8190
//* items than to think of 8190 units so it should work ok...
//*
//* UserData or Table?
//* ------------------
//*   By setting the USE_USER_DATA constant to true, Itemdex will
//* use ItemUserData instead of Table.
//*
//*   UserData is faster, if you don't use UserData for other things
//* in your map, it is a good idea to use UserData.
//*
//*   If USE_USER_DATA is set to false, you will require Table in
//* your map.
//*
//***************************************************************

//===============================================================
 globals
    private constant boolean USE_USER_DATA    = true
    private constant real    RECYCLE_INTERVAL = 45.0//2.5
    private constant integer RECYCLE_COUNT    = 72//10

    // Smaller RECYCLE_INTERVAL / Bigger RECYCLE_COUNT equal faster
    //  detection of removed items and worse performance.
    //
    // "Every RECYCLE_INTERVAL seconds RECYCLE_COUNT indexes are
    //  reviewed looking for removed/dead ones to recycle"
 endglobals

//=============================================================
    private struct index
        item attachedto
    endstruct

 globals
    private index   array activeIndexes
    private integer indexN = 0
    private integer DataInteger
 endglobals
 
    function GetItemId takes item it returns integer
     local index d
//sankaku adds the if then to avoid indexing blank inventory slots...
     if it==null then
     return 0
     endif
     static if(USE_USER_DATA) then
            set d = index( GetItemUserData(it) )
        else
            set d = index( HandleTable(DataInteger)[it] )
        endif
        if(d==0) then
            set d = index.create()
            set d.attachedto = it
            static if(USE_USER_DATA) then
                call SetItemUserData(it, integer(d) )
            else
                set HandleTable(DataInteger)[it] = integer(d)
            endif
            set activeIndexes[indexN] = d
            set indexN = indexN + 1
        endif
        return integer(d)
    endfunction

    // Requirements to use ItemdexModule:
    // : create takes no arguments
    // : no custom .destroy method
    //
    module Itemdex
        private static thistype array V
        private item attachedto = null

        method operator thatItem takes nothing returns item
            return this.attachedto
        endmethod
        
        private static method get takes nothing returns nothing
        //remind me to add .name to structs
        endmethod
        static method operator [] takes item it returns thistype
         local integer d = GetItemId(it)
            static if( DEBUG_MODE) then
                if ( (GetItemTypeId(it)==0) or (GetWidgetLife(it)<=0.0) ) then
                     call BJDebugMsg("Itemdex user error: ghost item used for "+thistype.get.name)
                endif
            endif
            
            if( (.V[d]!=0) and (.V[d].attachedto != it) ) then
                call .V[d].destroy()
                set  .V[d] = 0
            endif
            if ( .V[d] == 0) then
                set .V[d] = thistype.create()
                set .V[d].attachedto = it
            endif
            return .V[d]

        endmethod

        method destroy takes nothing returns nothing
         local integer d
            if ( this.attachedto != null) then
                set d = GetItemId( this.attachedto)
                set .V[d] = 0
                call deallocate()
                set this.attachedto = null
            else
                call deallocate()
            endif
        endmethod
        
        method release takes nothing returns nothing
            call destroy()
        endmethod
    endmodule

    globals
        private integer lastindex = 0
    endglobals
    
    private function recycleLoop takes nothing returns nothing
     local integer start
     local integer i
     local integer j

        if(indexN>0) then
            //set start = lastindex % indexN
            set start = lastindex - indexN * (lastindex/indexN)
            set i=start
            set j=0
            loop
                exitwhen (j>=RECYCLE_COUNT)
                if (GetItemTypeId(activeIndexes<i>.attachedto) == 0) or (GetWidgetLife(activeIndexes<i>.attachedto) == 0.0) then
                    set activeIndexes<i>.attachedto = null
                    call activeIndexes<i>.destroy()
                    set indexN = indexN-1
                    set activeIndexes<i> = activeIndexes[ indexN ]
                endif

                set i = i +1
                exitwhen (indexN==0)
                if(i&gt;=indexN) then
                    set i=0
                endif
                if(start&gt;=indexN) then
                    set start = 0
                endif
                exitwhen(i==start)
                set j=j+1

            endloop
            set lastindex = i
        endif
     

    endfunction

    private function init takes nothing returns nothing
     local timer T= CreateTimer()
         static if( not USE_USER_DATA ) then
             set DataInteger = integer(HandleTable.create())
         endif
         call TimerStart(T, RECYCLE_INTERVAL, true, function recycleLoop)
     set T=null           
    endfunction

endlibrary



</i></i></i></i></i>


you're the one involved with item indexing or whatever it is aids and your system is doing, so you'd know better than i would if the small change i made to the system was a good one, lol. i just thought blank inventory slot being indexed didn't make any sense. oh i also lowered the numbers that were like 8090 and 256 or whatever to like 2500 and 150 because i thought those numbers were really high...but, whatever. i honestly don't understand that part of the system, how those numbers work...i thought even smaller numbers would be ok but i was quite mistaken.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
I was going to use Item Indexing System, but due to the nature of them, the item removal detection can't O(1).
Itemdex and this system uses O(n) detection for it.
But sadly, Itemdex didn't provide the onDestroy method for item removal event, which is not compatible the internal indexing system.
If I use Itemdex, I also have to use T32 to check for the existence of item.
Itemdex + Internal T32, 2 timers already.
That's why I prefer, internal item indexing, more optimized, and efficient.
If you use IDEA, then you can port it into this system, but there are potential bugs (I forgot).
 

SanKakU

Member
Reaction score
21
i just want to add that i accidently mixed up the configurable constants with the ones from another system...so although i did change these in this system, it's not the sort of numbers i thought they were...

but back to the matter at hand. i'm not sure existence of item is so important...itemdex has a timer checking for if items exist. doesn't aids also have timer?

did i misunderstand how aids works? i thought i was having a hard time dealing with aids, not t32.

i don't know what IDEA system is at all...i might've been using it long ago but i know your system has been working fine without it. i updated to the newest version before this latest version without any problems when IDEA was scrapped for this system's requirements.

if you are indexing items INTERNALLY...doesn't it mean you are not using aids to index? using aids to index means indexing externally, same as if you were using itemdex, isn't it right? i still have to review the latest patch of the system, so maybe i'll understand better after i do that.

isn't the problem having to do with itemdex doesn't have all the functionality that aids has which you're using? if so, can't we modify itemdex to do what we need it to do?

if i remember right, like i ALREADY SAID, if i'm not too much mistaken, the flaw with itemdex that i noticed very quickly was returning index values for blank inventory slots. it was a super easy fix by me if my perception is correct. now, could this be why you said, "item removal event, which is not compatible the internal indexing system"? because i was thinking that in itemdex, items are NOT indexed until they become part of a unit's inventory. something that is far beyond the capability of aids to distinguish, if i'm not mistaken. i had a horrible time trying to configure aids to ignore units that aren't relevant and here itemdex is ignoring items that are not relevant for me.

perhaps what i'm looking for is an entirely new and completely different form of a system that does just what your system does, but does it differently. i don't know. that could be what you were trying to tell me...
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
JASS:
library UID requires AIDS, T32, Event, Itemdex
    
    globals
        public constant integer FIRST_INVENTORY_ID = 852002
        public constant integer LAST_INVENTORY_ID = 852007
    endglobals
    
    globals
        private Event OnMoveItem
        private item array MovedItem
        private integer array LastPosition
        private integer StackLevel = 0
    endglobals
    
    public function RegisterOnMoveItem takes trigger trig returns EventReg
        return OnMoveItem.register(trig)
    endfunction
    
    public function UnregisterOnMoveItem takes trigger trig returns nothing
        call OnMoveItem.unregister(trig)
    endfunction
    
    private keyword items
    private keyword UnitStruct
    
    private struct ItemStruct
        integer position
        item it
        unit owner
        boolean isCreated
        
        private method periodic takes nothing returns nothing
            if GetItemTypeId(this.it)==0 or GetWidgetLife(it)&lt;=0.0 then
                call this.stopPeriodic()
                set this.isCreated = false
                call this.destroy()
            endif
        endmethod
        
        static method load takes item i returns thistype
            local thistype this = GetItemId(i)
            if not this.isCreated then
                set this = thistype.allocate()
                set this.it = i
                set this.position = -1
                set this.owner = null
                set this.isCreated = true
                call this.startPeriodic()
            endif
            return this
        endmethod
        
        implement Itemdex
        implement T32x
        
        private static method onInit takes nothing returns nothing
            set thistype(0).position = -1
        endmethod
    endstruct
    
    private type items extends ItemStruct array [6]
    
    private struct UnitStruct extends array
        items items
        
        method periodic takes nothing returns nothing
            local integer i = 0
            local integer maxSize = UnitInventorySize(this.unit)
            local item it
            loop
            exitwhen i == maxSize
                set it = UnitItemInSlot(this.unit,i)
                if it != null then
                    set ItemStruct[it].position = i
                    set ItemStruct[it].owner = this.unit
                    
                    set this.items<i> = ItemStruct[it]
                endif
                set i = i + 1
            endloop
        endmethod
        
        private method AIDS_onCreate takes nothing returns nothing
            call this.startPeriodic()
            set this.items = items.create()
        endmethod
        
        private method AIDS_onDestroy takes nothing returns nothing
            local integer i = 0
            
            loop
            exitwhen i == 6
                set this.items<i>.owner = null
                set this.items<i>.position = -1
                set i = i + 1
            endloop
            
            call this.stopPeriodic()
            call this.items.destroy()
        endmethod
        
        implement T32x
        //! runtextmacro AIDS()
    endstruct
    
    function GetItemOwner takes item i returns unit
        return ItemStruct<i>.owner
    endfunction
    
    function GetItemInventoryPosition takes item i returns integer
        return ItemStruct<i>.position
    endfunction
    
    function GetMovedItem takes nothing returns item
        return MovedItem[StackLevel]
    endfunction
    
    function GetLastInventoryPosition takes nothing returns integer
        return LastPosition[StackLevel]
    endfunction
    
    function GetUnitItemInSlot takes unit u, integer slot returns item
        return UnitStruct<u>.items[slot].it
    endfunction

    private struct Initializer extends array
        private static method onPickUp takes nothing returns boolean
            local ItemStruct i = ItemStruct.load(GetManipulatedItem())
            local integer pos = 0
            
            set i.owner = GetTriggerUnit()
            loop
            exitwhen pos == 6
                if UnitItemInSlot(i.owner,pos) == GetManipulatedItem() then
                    set i.position = pos
                    set pos = 5
                endif
                set pos = pos + 1
            endloop
            return false
        endmethod
        
        private static method onDrop takes nothing returns boolean
            local ItemStruct i = ItemStruct.load(GetManipulatedItem())
            set UnitStruct[i.owner].items[i.position] = 0
            set i.owner = null
            set i.position = -1
            return false
        endmethod
        
        private static method onMove takes nothing returns boolean
            local integer orderId = GetIssuedOrderId()
            local unit u = GetTriggerUnit()
            local integer originalPos
            local ItemStruct movedItem
            local ItemStruct originalItem
            
            set orderId = orderId - FIRST_INVENTORY_ID
                
            set movedItem = ItemStruct.load(GetOrderTargetItem())
            set originalItem = UnitStruct<u>.items[orderId]

            if movedItem != originalItem then
                if originalItem != 0 then
                    set originalItem.position = movedItem.position
                endif
                set originalPos = movedItem.position
                set movedItem.position = orderId
                
                set UnitStruct<u>.items[orderId] = movedItem
                set UnitStruct<u>.items[originalPos] = originalItem

                set StackLevel = StackLevel + 1
                set MovedItem[StackLevel] = movedItem.it
                set LastPosition[StackLevel] = originalPos
                call OnMoveItem.fire()
                set StackLevel = StackLevel - 1
            endif
            set u = null
            return false
        endmethod
        
        private static method checkOrder takes nothing returns boolean
            return GetIssuedOrderId() &gt;= FIRST_INVENTORY_ID and GetIssuedOrderId() &lt;= LAST_INVENTORY_ID
        endmethod
        
        private static method onInit takes nothing returns nothing
            local trigger pickUp = CreateTrigger()
            local trigger drop = CreateTrigger()
            local trigger move = CreateTrigger()

            set OnMoveItem = Event.create()

            call TriggerRegisterAnyUnitEventBJ(pickUp,EVENT_PLAYER_UNIT_PICKUP_ITEM)
            call TriggerRegisterAnyUnitEventBJ(drop,EVENT_PLAYER_UNIT_DROP_ITEM)
            call TriggerRegisterAnyUnitEventBJ(move,EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
            
            call TriggerAddCondition(pickUp,Condition(function thistype.onPickUp))
            call TriggerAddCondition(drop,Condition(function thistype.onDrop))
            call TriggerAddCondition(move,And(Condition(function thistype.checkOrder),Condition(function thistype.onMove)))
        endmethod
    endstruct
endlibrary
</u></u></u></u></i></i></i></i></i>

As you wish. (Freehand, didn't try it yet.)
It is not so efficient.
 

SanKakU

Member
Reaction score
21
JASS:

library UID requires AIDS, T32, Event, Itemdex
    
    globals
        public constant integer FIRST_INVENTORY_ID = 852002
        public constant integer LAST_INVENTORY_ID = 852007
    endglobals
    
    globals
        private Event OnMoveItem
        private item array MovedItem
        private integer array LastPosition
        private integer StackLevel = 0
    endglobals
    
    public function RegisterOnMoveItem takes trigger trig returns EventReg
        return OnMoveItem.register(trig)
    endfunction
    
    public function UnregisterOnMoveItem takes trigger trig returns nothing
        call OnMoveItem.unregister(trig)
    endfunction
    
    private keyword items
    private keyword UnitStruct
    
    private struct ItemStruct
        integer position
        item it
        unit owner
        boolean isCreated
        
        private method periodic takes nothing returns nothing
            if GetItemTypeId(this.it)==0 or GetWidgetLife(it)&lt;=0.0 then
                call this.stopPeriodic()
                set this.isCreated = false
                call this.destroy()
            endif
        endmethod
        
        static method load takes item i returns thistype
            local thistype this = GetItemId(i)
            if not this.isCreated then
                set this = thistype.allocate()
                set this.it = i
                set this.position = -1
                set this.owner = null
                set this.isCreated = true
                call this.startPeriodic()
            endif
            return this
        endmethod
        
        implement Itemdex
        implement T32x
        
        private static method onInit takes nothing returns nothing
            set thistype(0).position = -1
        endmethod
    endstruct
    
    private type items extends ItemStruct array [6]
    
    private struct UnitStruct extends array
        items items
        
        method periodic takes nothing returns nothing
            local integer i = 0
            local integer maxSize = UnitInventorySize(this.unit)
            local item it
            loop
            exitwhen i == maxSize
                set it = UnitItemInSlot(this.unit,i)
                if it != null then
                    set ItemStruct[it].position = i
                    set ItemStruct[it].owner = this.unit
                    
                    set this.items<i> = ItemStruct[it]
                endif
                set i = i + 1
            endloop
        endmethod
        
        private method AIDS_onCreate takes nothing returns nothing
            call this.startPeriodic()
            set this.items = items.create()
        endmethod
        
        private method AIDS_onDestroy takes nothing returns nothing
            local integer i = 0
            
            loop
            exitwhen i == 6
                set this.items<i>.owner = null
                set this.items<i>.position = -1
                set i = i + 1
            endloop
            
            call this.stopPeriodic()
            call this.items.destroy()
        endmethod
        
        implement T32x
        //! runtextmacro AIDS()
    endstruct
    
    function GetItemOwner takes item i returns unit
        return ItemStruct<i>.owner
    endfunction
    
    function GetItemInventoryPosition takes item i returns integer
        return ItemStruct<i>.position
    endfunction
    
    function GetMovedItem takes nothing returns item
        return MovedItem[StackLevel]
    endfunction
    
    function GetLastInventoryPosition takes nothing returns integer
        return LastPosition[StackLevel]
    endfunction
    
    function GetUnitItemInSlot takes unit u, integer slot returns item
        return UnitStruct<u>.items[slot].it
    endfunction

    private struct Initializer extends array
        private static method onPickUp takes nothing returns boolean
            local ItemStruct i = ItemStruct.load(GetManipulatedItem())
            local integer pos = 0
            
            set i.owner = GetTriggerUnit()
            loop
            exitwhen pos == 6
                if UnitItemInSlot(i.owner,pos) == GetManipulatedItem() then
                    set i.position = pos
                    set pos = 5
                endif
                set pos = pos + 1
            endloop
            return false
        endmethod
        
        private static method onDrop takes nothing returns boolean
            local ItemStruct i = ItemStruct.load(GetManipulatedItem())
            set UnitStruct[i.owner].items[i.position] = 0
            set i.owner = null
            set i.position = -1
            return false
        endmethod
        
        private static method onMove takes nothing returns boolean
            local integer orderId = GetIssuedOrderId()
            local unit u = GetTriggerUnit()
            local integer originalPos
            local ItemStruct movedItem
            local ItemStruct originalItem
            
            set orderId = orderId - FIRST_INVENTORY_ID
                
            set movedItem = ItemStruct.load(GetOrderTargetItem())
            set originalItem = UnitStruct<u>.items[orderId]

            if movedItem != originalItem then
                if originalItem != 0 then
                    set originalItem.position = movedItem.position
                endif
                set originalPos = movedItem.position
                set movedItem.position = orderId
                
                set UnitStruct<u>.items[orderId] = movedItem
                set UnitStruct<u>.items[originalPos] = originalItem

                set StackLevel = StackLevel + 1
                set MovedItem[StackLevel] = movedItem.it
                set LastPosition[StackLevel] = originalPos
                call OnMoveItem.fire()
                set StackLevel = StackLevel - 1
            endif
            set u = null
            return false
        endmethod
        
        private static method checkOrder takes nothing returns boolean
            return GetIssuedOrderId() &gt;= FIRST_INVENTORY_ID and GetIssuedOrderId() &lt;= LAST_INVENTORY_ID
        endmethod
        
        private static method onInit takes nothing returns nothing
            local trigger pickUp = CreateTrigger()
            local trigger drop = CreateTrigger()
            local trigger move = CreateTrigger()

            set OnMoveItem = Event.create()

            call TriggerRegisterAnyUnitEventBJ(pickUp,EVENT_PLAYER_UNIT_PICKUP_ITEM)
            call TriggerRegisterAnyUnitEventBJ(drop,EVENT_PLAYER_UNIT_DROP_ITEM)
            call TriggerRegisterAnyUnitEventBJ(move,EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
            
            call TriggerAddCondition(pickUp,Condition(function thistype.onPickUp))
            call TriggerAddCondition(drop,Condition(function thistype.onDrop))
            call TriggerAddCondition(move,And(Condition(function thistype.checkOrder),Condition(function thistype.onMove)))
        endmethod
    endstruct
endlibrary
</u></u></u></u></i></i></i></i></i>

As you wish. (Freehand, didn't try it yet.)
It is not so efficient.


i'm confused. why is aids used in the code?
 

Laiev

Hey Listen!!
Reaction score
188
for the AIDS struct, used to save the owner of the item and save the position of the item.
 

SanKakU

Member
Reaction score
21
so i added 2 or 3 functions to my stackitems library that i made and now i got item charge merging working perfectly without the use of your system. was very easy. just needed to make a small fix to itemdex and bam. easy to prepare comparison formulas
i suppose your system might be still useful for some odd type of using item stuff, as much as detect transport loading and unloading can still be useful for whatever...
but for now it looks like the system isn't making the final cut into any of my maps. but it was in my tag map for a while...up until the next version which should be out sometime this week, 0.96r

got a quick question or 2 though...who made itemdex? the comments don't say.
and the timerutils that you used to use for UID...was that custom version of timerutils made by kingkingyyk3 or someone else? and can i get an opinion on whether it's good for my map? i think some of my spells use it, but that's about all i'm using it for...there are very few custom spells in my map... is there any difference in loading times between the various timerutils? because i'm looking for ways to decrease that. i figure you might know if you're the one that made that custom timerutils.
 
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