Need Help With: Adding Charges To Item - Class of Item

Blood_Wraith

New Member
Reaction score
2
I need to know how you add a number of charges to an item with a certain class-type, IE:Unit kills a certain unit, the game sets ALL items of purchasable class-type in the hero's inventory to (Their Current Charges + 2). I'm fairly sure if I can even get the entire trigger right, it will probably glitch. Because it tries to calculate the number of charges of class-type "Purchasable", in which if the hero has more than one of that class-type of item, it probably just calculates the top most one, and sets the others/OR just the topmost one (which have different number of charges) to an incorrect amount. Does it calculate for every item of that class-type in the Hero's inventory? If not, how can I get this to work without walls of manual triggering? Because I have this AP system to level up the Hero's materia, and when a certain materia reaches a certain amount of charges, it turns into a stronger version of the item, which I got that part down right. For my system so far I have to do large amounts of code like this:

Trigger:
  • Events
    • Events
      • Unit - A unit owned by Player 2 (Blue) Dies
    • Conditions
    • Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Triggering unit)) Equal to MP
          • (Unit-type of (Triggering unit)) Equal to Grashstrike
          • (Unit-type of (Triggering unit)) Equal to Blugu
          • (Unit-type of (Triggering unit)) Equal to Sample: H0512-opt
    • Actions
    • Unit Group - Pick every unit in (Units within 3000.00 of (Position of (Triggering unit))) and do (Actions)
      • Loop - Actions
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Lightning Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Lightning Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Lightning Materia [|cffffcc00Level 2|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Lightning Materia [|cffffcc00Level 2|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Fire Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Fire Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Fire Materia [|cffffcc00Level 2|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Fire Materia [|cffffcc00Level 2|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Ice Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Ice Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Ice Materia [|cffffcc00Level 2|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Ice Materia [|cffffcc00Level 2|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Poison Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Poison Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Poison Materia [|cffffcc00Level 2|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Poison Materia [|cffffcc00Level 2|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Cure Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Cure Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Cure Materia [|cffffcc00Level 2|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Cure Materia [|cffffcc00Level 2|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Cure Materia [|cffffcc00Level 3|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Cure Materia [|cffffcc00Level 3|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Steal Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Steal Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Earth Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Earth Materia [|cffffcc00Level 1|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Earth Materia [|cffffcc00Level 2|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Earth Materia [|cffffcc00Level 2|r])) + 2)
        • Item - Set charges remaining in (Item carried by (Picked unit) of type Double Cut Materia [|cffffcc00Level 1|r]) to ((Charges remaining in (Item carried by (Picked unit) of type Double Cut Materia [|cffffcc00Level 1|r])) + 2)


That's JUST for the materia I have so far, I'm most likely gonna add more. And not only that, I have to do this for EVERY type of enemy that gives the same amount of AP. IE these 2 enemies give 3 AP, make a trigger for that, these 3 enemies give 8 AP, make a trigger for that, this enemy gives 210 AP, make a trigger for that. You get the point, large amounts of work. I suspect I'm going to have to make at least 30 more or so of these triggers, and if you do the math, every little line of code uses map space. And ALL those lines times 30 (or more) most likely takes a fair amount of space. Help would be much appreciated :).

If it requires custom code, at least give me an example.
 

KaerfNomekop

Swim, fishies. Swim through the veil of steel.
Reaction score
612
Trigger:
  • For each (Integer A) from 1 to 6, do (Actions)
    • Loop - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Item-class of (Item carried by (Picked unit) in slot (Integer A))) Equal to Charged
        • Then - Actions
          • Item - Set charges remaining in (Item carried by (Picked unit) in slot (Integer A)) to ((Charges remaining in (Item carried by (Picked unit) in slot (Integer A))) + 1)
        • Else - Actions

You could try to make a function that does this automatically, and call that instead.
 

Blood_Wraith

New Member
Reaction score
2
Dear God, it works! Well at least for now it does, here's an example of my trigger right now.

Trigger:
  • Events
    • Unit - A unit owned by Player 2 (Blue) Dies
    • Conditions
    • Or - Any (Conditions) are true
      • Conditions
        • (Unit-type of (Triggering unit)) Equal to MP
        • (Unit-type of (Triggering unit)) Equal to Grashstrike
        • (Unit-type of (Triggering unit)) Equal to Blugu
        • (Unit-type of (Triggering unit)) Equal to Sample: H0512-opt
    • Actions
      • Unit Group - Pick every unit in (Units within 3000.00 of (Position of (Dying unit))) and do (For each (Integer A) from 1 to 6, do (If ((Item-class of (Item carried by (Picked unit) in slot (Integer A))) Equal to Purchasable) then do (Item - Set charges remaining in (Item carried by (Picked unit) in slot (Integer A)) to ((Charges remaining in (Item carried by (Picked unit) in slot (Integer A))) + 2


Ugh. Apparently the last part of the trigger was so long, copying and pasting it as text only pasted half of it, I had to manually enter the rest of it. Have some Rep good sir.
 

KaerfNomekop

Swim, fishies. Swim through the veil of steel.
Reaction score
612
I hate those single-line Pick Every actions. They compress everything.

EDIT:
I made this neat little function, which I think works.
JASS:
function ItemAddCharge takes unit WhichUnit, integer Increase returns nothing
    local integer i = 0
    local item WhichItem
    loop
        set WhichItem = UnitItemInSlot(WhichUnit,i)
        if ( GetItemType(WhichItem) == ITEM_TYPE_CHARGED ) then
            call SetItemCharges( WhichItem, (GetItemCharges(WhichItem)+Increase) )
        endif
        set i = i + 1
        exitwhen i == 5
    endloop
endfunction


So to increase the charges, just do:
Trigger:
  • Custom script: call ItemAddCharge (GetTriggerUnit(), Number)

where you replace Number with the amount of charges to increase by.
[ENDEDIT]
 

Blood_Wraith

New Member
Reaction score
2
Also, I'm trying to make my materia combination system work better. IE When you combine Lightning Materia with All Materia, it turns into Lightning Materia (All) (Which multitargets, instead of single targets) I'm trying to bring the number of charges from the original materia to the one combined with all, but I'm doing it wrong apparently, since it doesn't set the charges. Take a look at my trigger, and see if anythings wrong.

Trigger:
  • bolt1 w all
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • And - All (Conditions) are true
        • Conditions
          • (Ability being cast) Equal to All Materia
          • ((Triggering unit) has an item of type Lightning Materia [|cffffcc00Level 1|r]) Equal to True
          • ((Triggering unit) has an item of type All Materia) Equal to True
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Triggering unit) has an item of type Lightning Materia [|cffffcc00Level 1|r]) Equal to True
          • ((Triggering unit) has an item of type All Materia) Equal to True
        • Then - Actions
          • Set Materia_AP = (Charges remaining in (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r]))
          • Item - Remove (Item carried by (Triggering unit) of type Lightning Materia [|cffffcc00Level 1|r])
          • Item - Remove (Item carried by (Triggering unit) of type All Materia)
          • Hero - Create Lightning Materia [|cffffcc00Level 1|r] (All) and give it to (Triggering unit)
          • Game - Display to (All players) the text: Materia Combined!
        • Else - Actions
          • Item - Set charges remaining in (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r] (All)) to Materia_AP


I'm also planning to make it so you have to target a Materia with All Materia to combine it specifically, so far it just combines with the topmost materia, if there's more than one materia that's combineable with All Materia.
 

Blood_Wraith

New Member
Reaction score
2
Okay I made my trigger work better, but two problems:

Trigger:
  • bolt1 w all
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • And - All (Conditions) are true
        • Conditions
          • (Ability being cast) Equal to All Materia Version 2
          • (Target item of ability being cast) Equal to (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r])
    • Actions
      • Set Materia_AP = (Charges remaining in (Target item of ability being cast))
      • Item - Remove (Target item of ability being cast)
      • Item - Remove (Item carried by (Triggering unit) of type All Materia)
      • Hero - Create Lightning Materia [|cffffcc00Level 1|r] (All) and give it to (Triggering unit)
      • Item - Set charges remaining in (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r] (All)) to Materia_AP
      • Game - Display to (All players) the text: Materia Combined!


The game crashes when it tries to execute it, the part that crashes it is

Trigger:
  • Item - Set charges remaining in (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r] (All)) to Materia_AP


I tried changing that part to

Trigger:
  • Item - Set charges remaining in (Item carried by (Triggering unit) of type Lightning Materia [|cffffcc00Level 1|r] (All)) to ((Charges remaining in (Item carried by (Triggering unit) of type Lightning Materia [|cffffcc00Level 1|r] (All))) + Materia_AP)


Still crashes. Could I get some help on this one please?

EDIT: ACTUALLY the part that crashes it is

Trigger:
  • Hero - Create Lightning Materia [|cffffcc00Level 1|r] (All) and give it to (Triggering unit)


I left the set charges remaining in item function enabled, even know it *can't* set charges remaining to cause I disabled the Hero - Give item function.

What the hell... why would that part crash it?

EDIT 2: Okay I changed it to
Trigger:
  • Hero - Create Lightning Materia [|cffffcc00Level 1|r] (All) and give it to (Casting unit)

Changing it to that doesn't CRASH it, but, it doesn't give the hero the item... somethings wrong here.
Note: The Materia_AP variable is a Integer variable, that's the appropriate type of variable for this case right? Still new to variables.

Edit 3: Now I tried
Trigger:
  • Item - Create Lightning Materia [|cffffcc00Level 1|r] (All) at (Position of (Triggering unit))
    • Item - Set charges remaining in (Last created item) to Materia_AP

It spawns the item at the Hero's feet just fine, picking it up CRASHES. Has something to do with the variable after all. Still need help here though.

Long story short: What's the correct way of adding charges to the next item like that? I'm fairly sure I'm doing it right, just probably not using the right variable type (doubt it).
 

NotInTheFace

Member
Reaction score
17
Do you have a trigger that runs when you get an item? It might be causing an infinite loop which will crash the game.

That's just the first thing I thought of.
 

TheLegend

New Member
Reaction score
10
Here is an old system that manipulates charge items. It works when an item is added to the heroes inventory that is add those items of yours to the hero when he kills (the charge of the added item will add to the item in the inventory, max 30). Here is the system
JASS:
function Trig_Combine_Items_Conditions takes nothing returns boolean
    if ( not ( GetItemCharges(GetManipulatedItem()) > 0 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Combine_Items_Actions takes nothing returns nothing
    local integer ITEMCOUNT
    local integer ITEMLOOP
    local integer CHARGES
    local integer MAXIMUM
    local item NEWITEM
    local unit OURUNIT

    set MAXIMUM = 30 // Here is the max number of charges, change this to whatever you want
    set ITEMCOUNT = 0
    set ITEMLOOP = 0
    set CHARGES = 0
    set NEWITEM = GetManipulatedItem()
    set OURUNIT = GetManipulatingUnit()
    
    loop
        exitwhen ITEMLOOP > 6
        if ((GetItemTypeId(NEWITEM)) == (GetItemTypeId(UnitItemInSlotBJ(OURUNIT, ITEMLOOP)))) then
            if ((GetItemCharges(UnitItemInSlotBJ(OURUNIT, ITEMLOOP)) + GetItemCharges(NEWITEM)) <= MAXIMUM) then
                if not ( (UnitItemInSlotBJ(OURUNIT, ITEMLOOP)) == (NEWITEM)) then                
                    set CHARGES = (GetItemCharges(UnitItemInSlotBJ(OURUNIT, ITEMLOOP))) + GetItemCharges(NEWITEM)
                    call SetItemCharges( UnitItemInSlotBJ(OURUNIT, ITEMLOOP), CHARGES )
                    call RemoveItem( NEWITEM )
                    set ITEMLOOP=7
                endif
            endif
        endif
        if ( ITEMLOOP < 7 ) then
            set ITEMLOOP = ITEMLOOP + 1
        endif
    endloop
endfunction

function InitTrig_Combine_Items takes nothing returns nothing
    set gg_trg_Combine_Items = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Combine_Items, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddCondition( gg_trg_Combine_Items, Condition( function Trig_Combine_Items_Conditions ) )
    call TriggerAddAction( gg_trg_Combine_Items, function Trig_Combine_Items_Actions )
endfunction

Just create a new trigger, convert it to custom text and replace its content with this. What you need to do is just change you kill trigger so that it adds the item to your hero when he kills the unit. and GFreak... stay out of my Jass xD
 

Blood_Wraith

New Member
Reaction score
2
Er, sorry I don't feel like using a custom script right now, besides when I tried to save my map it wouldn't save (I had to end the process), which is what happens if custom scripts aren't exactly right, probably cause the name of my trigger wasn't Trig_Combine_Items or whatever. I stripped my trigger down to basic parts so it doesn't crash.

Trigger:
  • Lightning 1 W All
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • And - All (Conditions) are true
        • Conditions
          • (Ability being cast) Equal to All Materia
          • (Target item of ability being cast) Equal to (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r])
    • Actions
      • Item - Remove (Target item of ability being cast)
      • Item - Remove (Item carried by (Casting unit) of type All Materia)
      • Hero - Create Lightning Materia [|cffffcc00Level 1|r] (All) and give it to (Casting unit)


It doesn't create an item for the Hero, what the hell?

And yes, the Remove (Target item of ability being cast) works in the Inventory just fine, believe it or not. I'm surprised Blizzard even coded that in.
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
and GFreak... stay out of my Jass xD

lol then get rid of the BJs and dont say not to get into it, that provokes me to do that :p
and move your actions into your conditions
and [ljass]Condition[/ljass] should be Filter

JASS:
function Trig_Combine_Items_Conditions takes nothing returns nothing
    local integer ITEMCOUNT = 0
    local integer ITEMLOOP = 0
    local integer CHARGES = 0
    local integer MAXIMUM = 30 // Here is the max number of charges, change this to whatever you want
    local item NEWITEM = GetManipulatedItem()
    local unit OURUNIT = GetManipulatingUnit()
    
    if (GetItemCharges(GetManipulatedItem()) > 0) then    
        loop
            exitwhen ITEMLOOP > 6
            if (GetItemTypeId(NEWITEM) == GetItemTypeId(UnitItemInSlot(OURUNIT, ITEMLOOP - 1))) then
            if (GetItemCharges(UnitItemInSlot(OURUNIT, ITEMLOOP - 1)) + GetItemCharges(NEWITEM) <= MAXIMUM) then
            if (not (UnitItemInSlot(OURUNIT, ITEMLOOP - 1)) == (NEWITEM)) then                
                set CHARGES = GetItemCharges(UnitItemInSlot(OURUNIT, ITEMLOOP - 1)) + GetItemCharges(NEWITEM)
                call SetItemCharges(UnitItemInSlot(OURUNIT, ITEMLOOP - 1), CHARGES)
                call RemoveItem(NEWITEM)
                set ITEMLOOP = 7
            endif
            endif
            endif
            if ( ITEMLOOP < 7 ) then
                set ITEMLOOP = ITEMLOOP + 1
            endif
        endloop
    endif
    set OURUNIT = null
endfunction

function InitTrig_Combine_Items takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    local code c = function Trig_Combine_Items_Conditions
    local integer index = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_PICKUP_ITEM, null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition(t, Filter(c))
    set t = null
    set c = null
endfunction

and now im confused as to what needs to be done, were you trying to set the charges or give the unit an item/a different item?

worst case scenario you could do:

Trigger:
  • Actions
    • Item - Create blah blah blah at position of Casting Unit
    • Unit - Order Casting Unit to pick up last created item


although i doubt that would be... optimal

does it remove the items, casting unit may not work in this instance and you cant give something to a unit that doesnt exist :p
 

Blood_Wraith

New Member
Reaction score
2
Yes, it does remove the targeted item directly from the inventory slot.

And now I try this:

Trigger:
  • Lightning 1 W All
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • And - All (Conditions) are true
        • Conditions
        • (Ability being cast) Equal to All Materia
        • (Target item of ability being cast) Equal to (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r])
    • Actions
      • Hero - Drop (Target item of ability being cast) from (Triggering unit)
      • Item - Remove (Last dropped item)
      • Item - Remove (Item carried by (Casting unit) of type All Materia)
      • Item - Create Lightning Materia [|cffffcc00Level 1|r] (All) at (Position of (Triggering unit))
      • Unit - Order (Triggering unit) to Right-Click (Last created item)
      • Game - Display to (All players) the text: Materia Combined!


The part that crashes it is

Trigger:
  • Item - Create Lightning Materia [|cffffcc00Level 1|r] (All) at (Position of (Triggering unit))


That does NOT make sense. Just thinking logically, what the hell would cause that to crash? It doesn't crash when I disable THAT function. I also tried turning the trigger off permanently
after the trigger is fired once, doesn't work, so its not a trigger looping problem.

Is it me or the forums WC3 code is being GLITCHY today. No matter how I format it, it seems spaced apart a lot.
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
the [noparse]
Trigger:
[/noparse] tags arent working right, and if ud like to upload your map tomorrow ill download it and see if it crashes with me
 

Blood_Wraith

New Member
Reaction score
2
Ok now I find out just merely picking up Lightning Materia (All) crashes me. Now my trigger looks like this:

Trigger:
  • Lightning 1 W All
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • And - All (Conditions) are true
        • Conditions
          • (Ability being cast) Equal to All Materia
          • (Target item of ability being cast) Equal to (Item carried by (Casting unit) of type Lightning Materia [|cffffcc00Level 1|r])
    • Actions
      • Set Materia_AP = (Charges remaining in (Target item of ability being cast))
      • Item - Remove (Target item of ability being cast)
      • Item - Remove (Item carried by (Casting unit) of type All Materia)
      • Hero - Create Crown of Kings +5 and give it to (Triggering unit)
      • Item - Set charges remaining in (Last created item) to Materia_AP
      • Game - Display to (All players) the text: Materia Combined!


Using a default item like Crown of Kings +5 worked PERFECTLY. It sets the last created item's charges to the charges of the target item of ability being cast. Now I'm gonna find out why picking up that item crashes me...
 

Blood_Wraith

New Member
Reaction score
2
Ok now I found out why it crashes, get this: Most of my materia items use spell book based abilities right? Well, the spell book it was using, it's spell list only had 1 spell (some materia have more, even if they only have 1, I like to use spell books for description of ability purposes.) and the spell was the same spell book, resulting in a crash when a hero picks it up. The only reason I made that mistake is because the ability names are somewhat similar, but I was apparently blind when I made that mistake.

Ok I guess I'm done here, but is there any way to make an item not use charges? Well the solution I came up with is this:

Trigger:
  • AP Recover
    • Events
      • Unit - A unit Uses an item
    • Conditions
      • (Item-class of (Item being manipulated)) Equal to Purchasable
    • Actions
      • Item - Set charges remaining in (Item being manipulated) to ((Charges remaining in (Item being manipulated)) + 1)
 

KaerfNomekop

Swim, fishies. Swim through the veil of steel.
Reaction score
612
What do you mean by "make an item not use charges"? I guess you mean that you don't want the item to be actually used, so you would set the Stats - Actively Used and the Stats - Perishable fields to false.
 

Blood_Wraith

New Member
Reaction score
2
Changing Actively Used to false will make the item not usable, at all (unless the stats are passive, AKA Evasion or something, thus not needing to left click the item). And Perishable means once the items charges are depleted to zero (if it has any) the item disappears from the game. By default I have that set to false for my materia (duh). So for the solution I just used the trigger I posted above. The only downside is that if a materia has zero charges, it will be set to 1 charge after use (big deal).
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
you could just simply do something like this:

Trigger:
  • Remove Charge Effect
    • Events
      • A unit begins the effect of an ability
    • Conditions
      • Or (any conditions are true)
        • Conditions
          • Ability Cast is equal to (your materia ability) <---- 1 for every type of materia
    • Actions
      • For loop Integer A from 1 to 6 do actions
        • Loop - Actions
          • If then else
            • If
              • Or (Any conditions are true)
                • Conditions
                  • (Item in slot (Integer A) for (Triggering unit)) is equal to (materia)) <---- 1 for every type of materia
            • Then
              • Item - Set charges of (Item in slot (Integer A) for (Triggering unit)) equal to 0
            • Else
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      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