• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Custom Multishot

Status
Not open for further replies.
Level 12
Joined
Jan 2, 2016
Messages
973
Hello, I've been having issues with creating a unit Multishot that hits only units infront of the shooter (like cone spells), and deal damage based on its own damage.
I did make 2 versions of this, and 1 of them is somewhat working, but it's still not perfect. I want the Multishot to cover 5 criterias:
1. Only units infront of the shooter shall be shot.
2. Stop spamming should be prevented
3. The damage dealt by the Multishot shall be based on the unit's damage.
4. It should stack with criticals.
5. All the missiles should be launched at once.
The 1-st multishot I made wasn't covering (2) and (3). And the 2-nd one doesn't cover (5) and only partly covers (3). The difference between the systems was that the 1-st was using "A unit is attacked" event, while I was using the GDD damage detection for the 2-nd.

This is how the trigger looks like:
  • Multishot
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • (Level of Multishot (Death Archer) for GDD_DamageSource) Greater than 0
    • Actions
      • Set MultiUnit = GDD_DamageSource
      • Set MultiTarget = GDD_DamagedUnit
      • Set MultiGroup = (Units within 900.00 of (Position of MultiUnit))
      • Set MultiUtPt = (Position of MultiUnit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Owner of MultiTarget) is an ally of (Owner of MultiUnit)) Equal to True
        • Then - Actions
          • Unit - Create 1 Dummy for Neutral Hostile at MultiUtPt facing Default building facing degrees
          • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
          • Unit - Add Arrow to (Last created unit)
          • Unit - Order (Last created unit) to Neutral Alchemist - Acid Bomb MultiTarget
        • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Level of Critical Strike Special for MultiUnit) Greater than 0
              • (Random integer number between 1 and 100) Less than or equal to 25
            • Then - Actions
              • Set message = ((String((GDD_Damage x 2.50), 0, 0)) + !)
              • Floating Text - Create floating text that reads message above MultiUnit with Z offset 0.00, using font size 10.00, color (100.00%, 0.00%, 0.00%), and 0.00% transparency
              • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
              • Floating Text - Change (Last created floating text): Disable permanence
              • Floating Text - Change the lifespan of (Last created floating text) to 1.90 seconds
              • Floating Text - Change the fading age of (Last created floating text) to 0.80 seconds
              • Unit Group - Pick every unit in MultiGroup and do (Actions)
                • Loop - Actions
                  • Set MultiPoint = ((Position of MultiUnit) offset by (Distance between (Position of MultiUnit) and (Position of (Picked unit))) towards ((Angle from (Position of MultiUnit) to (Position of (Picked unit))) - (Angle from (Position of MultiUnit) to (Position of MultiTarget))) deg
                  • Set MultiPt = (Point((X of MultiPoint), (Y of (Position of MultiUnit))))
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Owner of (Picked unit)) is an enemy of (Owner of MultiUnit)) Equal to True
                      • (Angle from (Position of MultiUnit) to MultiPoint) Greater than or equal to -45.00
                      • (Angle from (Position of MultiUnit) to MultiPoint) Less than or equal to 45.00
                      • (Integer((Distance between (Position of MultiUnit) and (Position of (Picked unit))))) Less than or equal to (Integer((110.00 + (Distance between (Position of MultiUnit) and MultiPt))))
                      • (Angle from (Position of MultiUnit) to MultiPt) Less than 90.00
                    • Then - Actions
                      • Unit - Create 1 Dummy for (Owner of MultiUnit) at MultiUtPt facing 0.00 degrees
                      • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
                      • Set Dummy = (Last created unit)
                      • Unit - Add Arrow to Dummy
                      • Unit - Order Dummy to Neutral Alchemist - Acid Bomb (Picked unit)
                      • If ((Picked unit) Equal to MultiTarget) then do (Unit - Cause Dummy to damage (Picked unit), dealing (GDD_Damage x 1.50) damage of attack type Chaos and damage type Normal) else do (Unit - Cause Dummy to damage (Picked unit), dealing (GDD_Damage x 2.50) damage of attack type Chaos and damage type Normal)
                      • Set Dummy = No unit
                    • Else - Actions
                  • Custom script: call RemoveLocation (udg_MultiPoint)
                  • Custom script: call RemoveLocation (udg_MultiPt)
            • Else - Actions
              • Unit Group - Pick every unit in MultiGroup and do (Actions)
                • Loop - Actions
                  • Set MultiPoint = ((Position of MultiUnit) offset by (Distance between (Position of MultiUnit) and (Position of (Picked unit))) towards ((Angle from (Position of MultiUnit) to (Position of (Picked unit))) - (Angle from (Position of MultiUnit) to (Position of MultiTarget))) deg
                  • Set MultiPoint = (Point((X of MultiPoint), (Y of (Position of MultiUnit))))
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Owner of (Picked unit)) is an enemy of (Owner of MultiUnit)) Equal to True
                      • (Angle from (Position of MultiUnit) to MultiPoint) Greater than or equal to -45.00
                      • (Angle from (Position of MultiUnit) to MultiPoint) Less than or equal to 45.00
                      • (Integer((Distance between (Position of MultiUnit) and (Position of (Picked unit))))) Less than or equal to (Integer((110.00 + (Distance between (Position of MultiUnit) and MultiPoint))))
                      • (Angle from (Position of MultiUnit) to MultiPoint) Less than 90.00
                    • Then - Actions
                      • Unit - Create 1 Dummy for (Owner of MultiUnit) at MultiUtPt facing 0.00 degrees
                      • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
                      • Set Dummy = (Last created unit)
                      • Unit - Add Arrow to Dummy
                      • Unit - Order Dummy to Neutral Alchemist - Acid Bomb (Picked unit)
                      • If ((Picked unit) Equal to MultiTarget) then do (Do nothing) else do (Unit - Cause Dummy to damage (Picked unit), dealing GDD_Damage damage of attack type Chaos and damage type Normal)
                      • Set Dummy = No unit
                    • Else - Actions
                  • Custom script: call RemoveLocation (udg_MultiPoint)
                  • Custom script: call RemoveLocation (udg_MultiPt)
      • Unit Group - Remove all units from MultiGroup
      • Custom script: call DestroyGroup (udg_MultiGroup)
      • Custom script: call RemoveLocation (udg_MultiUtPt)

So the problems here are:
1) I had to make missile speed of Death Archer = 100000 and remove its model, so it wouldn't look like: the archer shoots and when the shot reaches the target - a spray of arrows is launched from the shooter. Now I artificially create the missiles :p
2) When the main target has high armor - all of the units hit will take damage equal to the damage dealt to the 1-st, and they will reduce the damage further with their armor.

NOTE: if you are wondering what's this "(Integer((Distance between (Position of MultiUnit) and (Position of (Picked unit))))) Less than or equal to (Integer((110.00 + (Distance between (Position of MultiUnit) and MultiPt))))" doing - it's making the multishot hit targets in a parabula infront of the shooter, instead of a simple cone :p
 
Last edited:
Level 12
Joined
Jan 2, 2016
Messages
973
Okay, tanks, I will fix it as soon as I read the guide :D

EDIT:
Oh, I also tried something else, using the "A unit is attacked" event. It somewhat prevents (or at least limits) "Stop spamming", but the damage dealt by the multishot is constant, and it isn't based on the unit's damage:
(I don't keep the triggers for it, so I will just write what it was doing)
Trigger 1:
When a unit is attacked by a Death archer, it was increasing the number of an integer "Shot_Count" by 1 (was counting the shots), a boolean array [Shot_Count] was being set to "true". Also I was setting the unit's cusom value to Shot_Count. Then was saving the value of Shot_Count as a local variable and after 0,3 seconds I was giving the local variable's value to a global variable "Temp_Integer". Then I was checking if the boolean [Temp_Integer] is true, and then I was begining the effect.
Trigger 2:
When the Death archer is given an order, it was setting the boolean [custom value of the Death Archer] to false.

This way of doing things has prevented "Stop spamming", but it wasn't preventing it when I was pressing "stop" only 3 times per second (or less than 3).
I figured that I could add another boolean after the 0,3 seconds, that checks if the trigger has launched, and prevent the trigger from firing if that boolean is true. I didn't try it, because I kind a deleted the trigger before coming up with this idea.

However, even if this way worked, I still need a way to deal damage, related to the unit's damage.
 
Last edited:
Level 24
Joined
Aug 1, 2013
Messages
4,657
You should change your weapon type to "instant" to make it properly instant instead of changing the speed to huge.
You should check when a unit is damaged by your unit and if that is basic attack damage.
If so, then you create a missile via a missile system (you can use mine).

In the trigger where you create that missile, you can also do a random percentage check and instead of making the missile as basic attack, you make a volley of arrows as your multishot.

That will pretty much solve everything if you dont want it to base off from basic attack damage.
 
Level 12
Joined
Jan 2, 2016
Messages
973
You should change your weapon type to "instant" to make it properly instant instead of changing the speed to huge.
You should check when a unit is damaged by your unit and if that is basic attack damage.
If so, then you create a missile via a missile system (you can use mine).

In the trigger where you create that missile, you can also do a random percentage check and instead of making the missile as basic attack, you make a volley of arrows as your multishot.

That will pretty much solve everything if you dont want it to base off from basic attack damage.
Can you give me a link to your missile system? I registered in the forum just yesterday and I'm not too familiar with it yet :p

And well, I kind a do want to base it off basic attack damage... I guess I will add a formula to the damage, based on the level of the upgrades it uses, and I will add few ifs, checking if it has specific auras or buffs increasing its damage :p
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
My missile system is in my signature... pretty much under every post of mine.

About the damage... how big is your map? In words of how many fighting units will you have at once?

If its a rts map, then im sorry, but if it is something like a rpg, then I have got a solution.
 
Level 12
Joined
Jan 2, 2016
Messages
973
Well, I don't know what rts stands for, but my map is a normal (melee) warcraft map, with changed races and some other extras. Each player has 100 food limit. And each player can have up to 1 Death Archer at a time, and they live for a limited amount of time :p
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
rts is Real Time Strategy.
I was kind of wondering if my DDS would work properly on your map but if you play with 12 players, then it will lagg your map.

Mine is kind of heavy compared to every other DDS around but it just has those tiny fixes that noone cares about. And if ofcourse superior in perspective of features and design :D

If you dont need the detection and just use it to deal damage, you can pretty much remove everything that takes so much CPU and still have all features that it has :D
Kind of like I do on my maps, where I try to expand my possibilities to beyonf the limitations of how WC3 was designed.
Apart from UI, I can make everything!
 
Level 12
Joined
Jan 2, 2016
Messages
973
Okay, I have a little update:
After setting the attack type to "instant" - the arrow firing looks normal (tho the units still take the damage before the arrows have reached them, but I can live with that).

Now the only question is: Is there a way to calculate the damage that the unit would've dealt to the target, if the target had no armor?
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
You can simulate the damage by a 100% attack type (chaos is that by default) and normal damage type.

So, you deal lets say 100 damage to the target, then calculate the result.
(You set health back to the original health.)
Then you divide the result by 100 and you have the armor factor.
You have to divide the damage taken from the basic attack by the armor factor to reverse it into normal damage.

Ofcourse, it is not good to fire the onDamage event from the DDS and you have to give the target a massive buffer in health to be able to survive the attack.
The second can be done by adding the life bonus of the dds.
 
From this thread:

Aroc (Barrage): Barrage allows unit to attack several targets with one attack and therefore it can be used for multishot abilities. The bonus damage field must be set to at least 1, because 0 will cause serious problems. Each target will be dealt the normal damage of the unit's attack and the amount of bonus damage specified here. The number of targets is 1 plus the maximum number of targets field of barrage. The projectile art field can have more than 1 entry and will override the default projectile of the unit. The art for each shot will be chosen at random from this list. The area of effect is the range for the additional attacks. This doesn't affect the main attack, only the extra attacks granted by barrage. Also set the maximum possible damage field to 0 if you don't want to limit the damage dealt. Unfortunately combining barrage with other attack enhancing abilities is pretty difficult. Many of them will completely eliminate the effect of barrage like all arrow abilities on autocast except AHfa (Searing Arrows) and many orb abilities. Orb abilities that do have an effect ability field only disable barrage when this effect ability comes into action. All other abilities like critical strike slow poison, freezing breath, lightning attack, liquid fire and similar spells pretty much work with barrage but will always only affect the main target and never the additional barrage targets. Basic enhancements like damage bonus, attack speed bonus and the like however will affect all targets. The AHfa (Searing Arrows) spell is very special. It's the only arrow ability that works with barrage and it even reenables barrage on autocast if it was disabled by an incompatible orb ability allowing to create an autocastable multishot ability.
 
Level 12
Joined
Jan 2, 2016
Messages
973

Obviously you haven't read the original post. I am making a custom multishot, because I want ALL targets INFRONT of the attacker to get hit, instead of ~SET NUMBER~ of targets ALL AROUND the attacker.

And hmm... isn't the barrage damage equal to the unit's damage (when set to 1) only if the unit is a hero? (I read that somewhere)
 
Obviously you haven't read the original post. I am making a custom multishot, because I want ALL targets INFRONT of the attacker to get hit, instead of ~SET NUMBER~ of targets ALL AROUND the attacker.
I am pretty sure that this is what barrage does. It's worth a try.

And hmm... isn't the barrage damage equal to the unit's damage (when set to 1) only if the unit is a hero? (I read that somewhere)
I don't know about that. I never bothered with OE spells.
 
Level 12
Joined
Jan 2, 2016
Messages
973
Anyways.....
You can simulate the damage by a 100% attack type (chaos is that by default) and normal damage type.

So, you deal lets say 100 damage to the target, then calculate the result.
(You set health back to the original health.)
Then you divide the result by 100 and you have the armor factor.
You have to divide the damage taken from the basic attack by the armor factor to reverse it into normal damage.

Ofcourse, it is not good to fire the onDamage event from the DDS and you have to give the target a massive buffer in health to be able to survive the attack.
The second can be done by adding the life bonus of the dds.

I'm eager to try that as I can't seem to find any other way to do it.
Question is: how the hell do I make the unit deal pure damage with it's attack?
Chaos damage ignores armor TYPE, but not armor amount.

I even checked out Bribe's DDS, but from what I saw (in the Demo Triggers) - I can't make the unit ignore target's armor. (Maybe I will try playing with it for a while tomorrow to see if anything can be done about it)
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
I didnt say that you should be ignoring the targets armor in the basic attack.
That is pretty much impossible if you want to use the standard basic attacks of WC3.

You have to deal triggered damage simulating basic attack damage and then checking the difference and put it in a factor value.
Then you can use that factor value to reverse the damage.

JASS:
    function ApplyDamage takes unit source, unit target, real amount, attacktype at, damagetype dt returns nothing
        call DisableTrigger(udg_ADE_Trigger_On_Damage)
        
        call UnitDamageTarget(source, target, amount, true, false, at, dt, null)
        
        call EnableTrigger(udg_ADE_Trigger_On_Damage)
    endfunction
    
    function GetDamageTypeFactor takes unit whichUnit, damagetype whichDamageType returns real
        local real damage
        local real oldHealth = GetWidgetLife(whichUnit)
        call UnitAddAbility(whichUnit, udg_ADE_ABILITY_CHEAT_DEATH)
        
        call SetWidgetLife(whichUnit, 250000.)
        
        call ApplyDamage(whichUnit, whichUnit, 100., null, whichDamageType)
        
        set damage = 250000. - GetWidgetLife(whichUnit)
        call UnitRemoveAbility(whichUnit, udg_ADE_ABILITY_CHEAT_DEATH)
        call SetWidgetLife(whichUnit, oldHealth)
        return damage / 100.
    endfunction

That is what I do.

First you store the health of the target, then you set the health to a value that would survive the damage.
Then you disable the DDS.
Then you deal 100 damage with nothing as attack type (100% without exception) and with the given damage type. (Damage type could be normal in this case.)
Then you turn the DDS on again.
Then you calculate the difference in health and use that as damage recieved.
Then you set the life back to normal.
Then you divide the returned damage by the damage that you tried to deal.
That is the armor factor of the target.

You can make this for the DDS that you use.
 
Level 12
Joined
Jan 2, 2016
Messages
973
Okay, thanks :)
I guess it's about time for me to start learning JASS.
From my previous experience I can tell that I'd need to replace the "whichUnit" with a unit variable :D
Guess it will take me some time till I actually apply this trigger, but I guess this trigger works instantly (you can't see the target's health going sky high for a split second), right?
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
If you use a proper DDS, you would never see the health skyrocket or even different than what it should be.

This action will indeed be instant as well.
(You can make this in GUI, you only need a custom script for the damage part because iIrc, you cant have "null" (empty) as values in attack type in GUI.)

Be aware that you also have to remove the spell damage reduction ability from the dds before applying damage and add it again after applying the damage.
I dont use it because of my own reasons but it will not properly work for all other DDS out there. (Damage type checks may work... attack type checks are a different story.)
 
Level 12
Joined
Jan 2, 2016
Messages
973
If you use a proper DDS, you would never see the health skyrocket or even different than what it should be.

This action will indeed be instant as well.
(You can make this in GUI, you only need a custom script for the damage part because iIrc, you cant have "null" (empty) as values in attack type in GUI.)

Be aware that you also have to remove the spell damage reduction ability from the dds before applying damage and add it again after applying the damage.
I dont use it because of my own reasons but it will not properly work for all other DDS out there. (Damage type checks may work... attack type checks are a different story.)
Yeah, today, while I was ~on the road~ I was thinking if I could make something like this in GUI, and I did think of a way how to do it. May post it later if it's working, if anyone else wants to use a custom multishot.

And Bribe, that's a good idea, I may try it out if Witelol's way doesn't work (was kind a thinking half of the day how to make it work the way he suggested).
 
Level 12
Joined
Jan 2, 2016
Messages
973
This is what I've done so far:
  • Multishot Constant
    • Events
      • Unit - A unit Is attacked
    • Conditions
      • (Unit-type of (Attacking unit)) Equal to Death Archer
      • Or - Any (Conditions) are true
        • Conditions
          • (Remaining time for Constant_cd[(Player number of (Owner of (Attacking unit)))]) Equal to 0.00
          • (Triggering unit) Not equal to MS_Armor_Unit[(Player number of (Owner of (Attacking unit)))]
    • Actions
      • Set Temp_Player = (Owner of (Attacking unit))
      • Set Temp_Integer = (Player number of Temp_Player)
      • Set MS_Armor_Unit[Temp_Integer] = (Triggering unit)
      • Set Temp_Point = (Position of MS_Armor_Unit[Temp_Integer])
      • Set Temp_Real = (Life of MS_Armor_Unit[Temp_Integer])
      • Unit - Create 1 Dummy Multishot const for Temp_Player at Temp_Point facing Default building facing degrees
      • Unit - Add Item Life Bonus 25000 to MS_Armor_Unit[Temp_Integer]
      • Unit - Cause (Last created unit) to damage MS_Armor_Unit[Temp_Integer], dealing 25000.00 damage of attack type Chaos and damage type Normal
      • Unit - Remove Item Life Bonus 25000 from MS_Armor_Unit[Temp_Integer]
      • Unit - Set life of MS_Armor_Unit[Temp_Integer] to Temp_Real
      • Countdown Timer - Start Constant_cd[Temp_Integer] as a One-shot timer that will expire in 0.30 seconds
And:
  • Multishot Damage
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • (Unit-type of GDD_DamageSource) Equal to Dummy Multishot const
    • Actions
      • Set MS_Damage_Coef[(Player number of (Owner of GDD_DamageSource))] = (25000.00 / GDD_Damage)
      • Game - Display to (All players) the text: (String(MS_Damage_Coef[(Player number of (Owner of GDD_DamageSource))]))
This detects how much damage has the unit reduced. This part works. I tried it on units with different armors, and it's giving pretty precise measures.
What bothers me is that sometimes units die from 1 shot. This trigger seems to kill them randomly o_O

EDIT: Nevermind, I fixed it by adding "Unit - Set life of MS_Armor_Unit[Temp_Integer] to (Temp_Real + 25000.00)" after giving the bonus HP.
 
Level 12
Joined
May 22, 2015
Messages
1,051
Before looking_for_help discovered the -reduction trick, the alternative was using an orb ability. So when the unit damages the target, it has a buff from the orb I believe after a 0 second timer (or maybe the unit-state event works, too). That means it was damage dealt by its autoattack. then remove the buff.

I used this while messing around with my own DDS. The buff from the orb effect (I used orb of corruption - the armour reduction orb effect - as a base) is there by the time the damage is detected (which is just before the damage is actually dealt). That means you can just check for the orb buff immediately - no using 0s timers and stuff.

This is also the case for other buff-placing damage effects that I have tested:
Phoenix fire
Breath of fire

It probably works with most or even all of the buff-placing spells that also deal damage, but those are the only two I actually tested with. The breath of fire one is particularly handy for fake projectile systems.
 
Level 12
Joined
Jan 2, 2016
Messages
973
Yeah, I was planing to use this for the final part of my multishot: making it deal it's damage when the arrow reach the enemy.
They already have a side-effect buff (even if it lasts only 0,01 seconds, I can still see it apear in the units' status bar for a brief (flash) period of time), so I'm planing to make another trigger that is going to deal the damage to units that have this buff (and remove the buff).

EDIT: By the way, during the tests of my triggers, I found out how armor works :D
Each point of armor increases the multiplier needed for the unit to deal 100% damage by the gameplay constant (6% by default).
So when a unit hits another unit, with 10 armor - the damage it deals, multiplied by 1,6 (for 60% = 10*6%) will be equal to the unit's base damage.
Bribe, you could imply that to your DDS and make units able to ignore armor :) (Tho I have no idea how are you going to find out how much armor the unit has without some really complex trigger (unless you use the trigger(s) Wietlol or I posted))

EDIT 2: I edited my Multishot trigger and now it's working perfectly! I am attacking a unit with 25 armor, but the critical notification shows the unit's base damage! And all of the units (with 25 armor) take the same damage (40%)! Not like before - targeted unit taking 40% damage and rest of the units taking 16% damage :D

And now it's complete!
You can check it out here :)
 
Last edited:
Level 24
Joined
Aug 1, 2013
Messages
4,657
Im not Witelol, but Wietlol -_-

On the other hand, it is a bit silly to simulate something from WC3 that actually works by triggers... you could instead make something completely new and remove the armors.

You should not be doing the armor calculation by a dummy unit nor by the DDS.
I explained how you can do it and suggest you to do that like I said.

Also, there is no way that you want to use "A unit is attacked" as event for any triggers at all.

"how was I going to detect how much damage has the dummy dealt?"
You calculate the difference in health between before and after the damage.
 
Level 12
Joined
Jan 2, 2016
Messages
973
Hmm, makes sense.
I have to admit that I didn't understand exactly what you meant the 1-st time I read the post, but then I had to leave home for half the day and during that time I was thinking how to do it, so I build the version with the Dummy unit in my mind.
But I have to agree that your way of doing it is better, as the coeficient is calculated only when it's needed.
I will rework my triggers :p

EDIT: It works! fused 3 triggers into one :)
You really helped me with this ^^
Sorry for misspelling your name.. I almost always write it as "Whitelol" and then delete the "h", and that causes the misspelling (I don't do it on purpose, I'm just not-so good at remembering the spelling of fictional names xP)
You can check it out as it is now and tell me if there is anything more that can be improved =)
 
Last edited:
Status
Not open for further replies.
Top