• 🏆 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!

[JASS] I need a challenge

Status
Not open for further replies.
Level 16
Joined
Mar 3, 2006
Messages
1,564
Try making a follow system for hired and summoned units as in Diablo II and/or charm system like that of Necromancer class. And if you find that easy, you could try and make a petrification spell. I tried to think how to make such spell but I couldn't make the stone effect of a petrified unit.
 
Level 4
Joined
Jul 9, 2008
Messages
88
A radio system, like Grand Theft Auto, lol jk jk
but how about a city system? like cars just driving around (has to be in the right lane), and a new one respawns when one dies, but only where someone can't see it. And cops, ambulances.
Just speculating.
 
@ Starquizer
I've never played any Diablo games, so you'll have to elaborate. I won't make any spells. Spells are easy.

@ Nailgun
Sounds interesting. It'd be a logistical nightmare getting a traffic lights system to work, however.

@ Cokemonkey11
No full games, just a system. Anyway, isn't that game Fantasy Life like a decent LoaP?
 
Level 16
Joined
Mar 3, 2006
Messages
1,564
Its not a spell its a system, which make hired unit or summoned unit to follow hiring/summoning hero so that you don't select them; they make their action by the scripted AI and as for the Charm Spell of Diablo II, when you charm a monster he follows you as if a summoned unit until the spell duration end. I am not asking for the spell it self but the charmed unit follow system as well as for the hired and summoned.

Decided or not to make it, just elaborating :grin: and thanks for the definition :wink:.
 
Making a follow system is too easy. Anyone with half-decent knowledge of triggering (even GUI) can do it.

Anyway, I made a herd system like AoE3...

JASS:
/*******************************************************************************************
*                                    Herd System
*                             By Element of Water (EoW)
********************************************************************************************
* What is it?
*
* Herd System is a system to keep a group of units in a "herd", similar to hunts in the
* popular Age of Empires (AoE) series. The units will always stay in a group together, and
* units straying too far from the herd will quickly rejoin it. If any member of the herd is
* attacked, the entire herd will run away from the attacker.
********************************************************************************************
* Requirements
*
* - JassHelper by Vexorian
* - Table by Vexorian
* - GroupUtils by Rising_Dusk
* - TimerUtils by Vexorian
* - ADamage by Anitarf
********************************************************************************************
* How to use it
*
* How do you use Herd System? Simple.
*
* call Herd.create(group g, real runDist)
*
* group g       - a unit group containing all the units to be in the herd.
* real runDist  - how far the herd will run if one of their number is attacked. A runDist of
*                 0 means they do not run away and a runDist of less than 0 means they will
*                 run towards their attacker.
*
* You may also save your herd to a variable of type Herd, like this:
*
* local Herd h = Herd.create(myGroup, runDist)
*
* This way you can add unit groups or individual units to the Herd later, by doing:
*
* call h.addUnit(myUnit)
* or:
* call h.addGroup(myGroup)
*
* You may also remove individual units by doing:
*
* call h.removeUnit(myUnit)
********************************************************************************************
* Importing
*
* To import Herd System to your map, simply copy and paste the script into any trigger in
* your map, and make sure you have all the requirements in your map. Next, you should check
* the constant globals below and alter them to suit your map. They are all fully commented
* so you know exactly what they do.
*******************************************************************************************/

library HerdSystem requires Table, TimerUtils, GroupUtils, ADamage
    globals
        //Should the herd be destroyed when all the units die or are removed?
        private constant boolean DESTROY_WHEN_UNITS_KILLED  = true
        
        //How big the area containing the herd is per unit contained
        private constant real RECT_SIZE_PER_UNIT            = 50.00
        
        //Every x seconds the herds will be checked to maintain them. This is x.
        private constant real HERD_CHECK_TIME               = 10.00
        
        //When a unit in a herd is damaged, the herd will run away from the damager. A herd can not run
        //away more than once per x seconds. This is x.
        private constant real TIME_BETWEEN_RUN              = 10.00
        
//==========================================================================================
        
        //The order id for "move". Should not be changed.
        private constant integer ORDER_MOVE = 851986
    endglobals
    
//==========================================================================================
    
    private function CountUnitsInGroupEx takes group g returns integer
        set bj_groupCountUnits = 0
        call ForGroup(g, function CountUnitsInGroupEnum)
        return bj_groupCountUnits
    endfunction
    
    private function GroupAddGroupEx takes group a, group b returns nothing
        set bj_groupAddGroupDest = a
        call ForGroup(b, function GroupAddGroupEnum)
    endfunction
    
//==========================================================================================
    
    globals
        private real GroupMin_Temp
    endglobals
    
    private function GetGroupMinX_Enum takes nothing returns nothing
        local real r = GetUnitX(GetEnumUnit())
        
        if r < GroupMin_Temp then
            set GroupMin_Temp = r
        endif
    endfunction
    
    private function GetGroupMinX takes group g returns real
        set GroupMin_Temp = 999999.
        call ForGroup(g, function GetGroupMinX_Enum)
        return GroupMin_Temp
    endfunction
    
    private function GetGroupMinY_Enum takes nothing returns nothing
        local real r = GetUnitY(GetEnumUnit())
        
        if r < GroupMin_Temp then
            set GroupMin_Temp = r
        endif
    endfunction
    
    private function GetGroupMinY takes group g returns real
        set GroupMin_Temp = 999999.
        call ForGroup(g, function GetGroupMinY_Enum)
        return GroupMin_Temp
    endfunction

//==========================================================================================

    globals
        private real GroupCenter_Min
        private real GroupCenter_Temp
        private integer GroupCenter_Count
    endglobals
    
    private function GetGroupCenterX_Enum takes nothing returns nothing
        set GroupCenter_Temp = GroupCenter_Temp + GetUnitX(GetEnumUnit()) - GroupCenter_Min
        set GroupCenter_Count = GroupCenter_Count + 1
    endfunction
    
    private function GetGroupCenterX takes group g returns real
        set GroupCenter_Min     = GetGroupMinX(g)
        set GroupCenter_Temp    = 0.
        set GroupCenter_Count   = 0
        call ForGroup(g, function GetGroupCenterX_Enum)
        return GroupCenter_Temp / GroupCenter_Count + GroupCenter_Min
    endfunction
    
     private function GetGroupCenterY_Enum takes nothing returns nothing
        set GroupCenter_Temp = GroupCenter_Temp + GetUnitY(GetEnumUnit()) - GroupCenter_Min
        set GroupCenter_Count = GroupCenter_Count + 1
    endfunction
    
    private function GetGroupCenterY takes group g returns real
        set GroupCenter_Min     = GetGroupMinY(g)
        set GroupCenter_Temp    = 0.
        set GroupCenter_Count   = 0
        call ForGroup(g, function GetGroupCenterY_Enum)
        return GroupCenter_Temp / GroupCenter_Count + GroupCenter_Min
    endfunction
    
//==========================================================================================
    
    globals
        private real GroupToRect_MinX
        private real GroupToRect_MinY
        private real GroupToRect_MaxX
        private real GroupToRect_MaxY
    endglobals
    
    private function GroupToRect_Enum takes nothing returns nothing
        local real x = GetUnitX(GetEnumUnit())
        local real y = GetUnitY(GetEnumUnit())
        
        local boolean move = false
        
        if x < GroupToRect_MinX then
            set x = GroupToRect_MinX
            set move = true
        elseif x > GroupToRect_MaxX then
            set x = GroupToRect_MaxX
            set move = true
        endif
        
        if y < GroupToRect_MinY then
            set y = GroupToRect_MinY
            set move = true
        elseif y > GroupToRect_MaxY then
            set y = GroupToRect_MaxY
            set move = true
        endif
        
        if move then
            call IssuePointOrderById(GetEnumUnit(), ORDER_MOVE, x, y)
        endif
    endfunction
    
    private function MoveGroupToRect takes group g, rect r returns nothing
        set GroupToRect_MinX = GetRectMinX(r)
        set GroupToRect_MinY = GetRectMinY(r)
        set GroupToRect_MaxX = GetRectMaxX(r)
        set GroupToRect_MaxY = GetRectMaxY(r)
        call ForGroup(g, function GroupToRect_Enum)
    endfunction
    
//==========================================================================================

    globals
        private real MoveGroupPolar_Cos
        private real MoveGroupPolar_Sin
        private real MoveGroupPolar_Dist
    endglobals
    
    private function MoveGroupPolar_Enum takes nothing returns nothing
        local real x = GetUnitX(GetEnumUnit()) + MoveGroupPolar_Dist * MoveGroupPolar_Cos
        local real y = GetUnitY(GetEnumUnit()) + MoveGroupPolar_Dist * MoveGroupPolar_Sin
        call IssuePointOrderById(GetEnumUnit(), ORDER_MOVE, x, y)
    endfunction
    
    private function MoveGroupPolar takes group g, real angle, real dist returns nothing
        if dist == 0. then
            return
        endif
        
        set MoveGroupPolar_Cos  = Cos(angle)
        set MoveGroupPolar_Sin  = Sin(angle)
        set MoveGroupPolar_Dist = dist
        call ForGroup(g, function MoveGroupPolar_Enum)
    endfunction

//==========================================================================================

    private function onHit takes unit damagedUnit, unit damageSource, real damage, real prevented returns nothing
        call Herd.attacked(damagedUnit, damageSource)
    endfunction

//==========================================================================================

    struct Herd
        private static HandleTable ht
        
        private static Herd array herds
        private static integer index = 0
        private static timer tim = CreateTimer()
        
        private integer ID
        
        private static trigger unitDies = CreateTrigger()
        
//==========================================================================================
        
        private rect container = Rect(0., 0., 0., 0.)
        private group herd
        private integer num = 0
        private real dist
        
        private timer runTimer
        private boolean run = true
        
//==========================================================================================
        
        private static method check takes nothing returns nothing
            local Herd h
            local integer i = 0
            
            loop
                exitwhen i >= Herd.index
                set h = Herd.herds[i]
                
                call h.groupRefresh()
                call h.resetRect()
                call h.sortHerd()
                
                set i = i + 1
            endloop
        endmethod
        
//==========================================================================================
        
        static method create takes group herd, real runDist returns Herd
            local Herd h = Herd.allocate()
            local unit u
            
            set h.herd = NewGroup()
            set h.dist = runDist
            
            if herd != null then
                call h.addGroup(herd)
            endif
            
            set Herd.herds[Herd.index] = h
            set h.ID = Herd.index
            
            if Herd.index == 0 then
                call TimerStart(Herd.tim, HERD_CHECK_TIME, true, function Herd.check)
            endif
            
            set Herd.index = Herd.index + 1
            
            call h.resetRect()
            
            return h
        endmethod
        
//==========================================================================================

        private static method deathActions takes nothing returns boolean
            local Herd h
            local unit u = GetTriggerUnit()
            
            if Herd.ht.exists(u) then
                set h = Herd.ht[u]
                call h.removeUnit(u)
            endif
            
            set u = null
            
            return false
        endmethod

//==========================================================================================
        
        private static method resetRun takes nothing returns nothing
            local timer t = GetExpiredTimer()
            local Herd h  = GetTimerData(t)
            set h.run = true
            call ReleaseTimer(t)
        endmethod
        
        static method attacked takes unit damagedUnit, unit damageSource returns nothing
            local Herd h
            local timer t
            
            local real array x
            local real array y
            
            if Herd.ht.exists(damagedUnit) then
                set h = Herd.ht[damagedUnit]
                
                if h.run then
                    call BJDebugMsg("RUN AWAY!")
                    
                    set x[0] = GetUnitX(damageSource)
                    set y[0] = GetUnitY(damageSource)
                    
                    set x[1] = GetUnitX(damagedUnit)
                    set y[1] = GetUnitY(damagedUnit)
                    
                    set x[2] = x[1] - x[0]
                    set y[2] = y[1] - y[0]
                    
                    call MoveGroupPolar(h.herd, Atan2(y[2], x[2]), h.dist)
                    
                    set h.run = false
                    
                    set t = NewTimer()
                    call SetTimerData(t, h)
                    call TimerStart(t, TIME_BETWEEN_RUN, false, function Herd.resetRun)
                endif
            endif
        endmethod
        
//==========================================================================================
        
        private method groupRefresh takes nothing returns nothing
            call GroupRefresh(.herd)
        endmethod
        
        private method resetRect takes nothing returns nothing
            local real x = GetGroupCenterX(.herd)
            local real y = GetGroupCenterY(.herd)
            
            local real size = (.num * RECT_SIZE_PER_UNIT) / 2
            
            call SetRect(.container, x - size, y - size, x + size, y + size)
        endmethod
        
        private method sortHerd takes nothing returns nothing
            call MoveGroupToRect(.herd, .container)
        endmethod
        
//==========================================================================================
        
        method removeUnit takes unit u returns nothing
            local Herd h
            if Herd.ht.exists(u) then
                set h = Herd.ht[u]
                if h == this then
                    set Herd.ht[u] = 0
                    call GroupRemoveUnit(.herd, u)
                    set .num = .num - 1
                endif
            endif
        endmethod
        
        method addUnit takes unit u returns nothing
            set Herd.ht[u] = this
            call GroupAddUnit(.herd, u)
            set .num = .num + 1
        endmethod
        
        private static Herd toAdd
        
        private static method addUnits takes nothing returns nothing
            call Herd.toAdd.addUnit(GetEnumUnit())
        endmethod
        
        method addGroup takes group g returns nothing
            set Herd.toAdd = this
            call ForGroup(g, function Herd.addUnits)
        endmethod
        
//==========================================================================================
        
        method onDestroy takes nothing returns nothing
            call ReleaseGroup(.herd)
            call RemoveRect(.container)
            
            set Herd.index = Herd.index - 1
            set Herd.herds[.ID] = Herd.herds[Herd.index]
            set Herd.herds[.ID].ID = .ID
            
            if Herd.index == 0 then
                call PauseTimer(Herd.tim)
            endif
        endmethod
        
        static method onInit takes nothing returns nothing
            set Herd.ht = HandleTable.create()
            
            call ADamage_AddResponse(onHit)
            
            call TriggerRegisterAnyUnitEventBJ(Herd.unitDies, EVENT_PLAYER_UNIT_DEATH)
            call TriggerAddCondition(Herd.unitDies, Condition(function Herd.deathActions))
        endmethod
        
//==========================================================================================

    endstruct
    
//==========================================================================================

endlibrary

I made a test map also, but that requires v1.24 (or v1.23b) because I used the latest versions of the requirements. The system itself does not use any 1.24-specific code, however.
 

Attachments

  • AoE systems.w3m
    89.2 KB · Views: 62
Level 19
Joined
Oct 29, 2007
Messages
1,184
Make an arrowkey controlled vehicle system with realistic car physics/ collision and sounds, just like racing games.

What you made there isn't really what I meant. I was thinking about having more detail in it. : o

The vehicle should go half a yard inside the wall with crashing. Also slipping would be a really hard part, but oh so awesome. What if there is height variation? Will the car still stick to the ground due invisible glue? I know all this will be very hard to make, but it would still rock if completed.
 
Level 8
Joined
Aug 4, 2006
Messages
357

Lol why don't you work on the suggestions I gave you on your car system? If you don't feel like working on those, give me permission and I'll work on them for you :grin:. Hell, I'll even work on the math/physics stuff. I like those kinds of challenges.

How about making a function GetUnitZOffset takes unit u returns real that returns how high above the ground a flying unit should be, at its current position, based on its default fly height. Blizzard's GetUnitFlyHeight function does jack shit. Using this function, you could set a missile's fly height such that it can fly straight over hills and stuff. I think it could be very useful. I am currently working on it, but unfortunately, my function is not accurate enough to be useful right now.
 
Level 11
Joined
Jun 21, 2007
Messages
505
Maybe you could find a challenge in like, listen:
You have a Jump ability, a unit with that ability and a crate. When having pressed Jump ability button the unit jumps. If he's jumping from a hill, he gets a longer jump. If he's jumping on a hill, his jump is short. Each crate has a dynamic region around it. If the jumping unit is in the region, and is high enough to get on the crate, then the jumping is finished and the unit is permanently raised until it falls.
If elevation of unit with jump ability is for some reason higher than any crate's height in region of which the unit is standing, then the unit falls until its elevation reaches zero or below or his elevation becomes equal to the one needed to stand on any crate in region of which the unit is in.

I already made some sort of jumping in first person in my map, but I'm still trying to make it jump onto any object and fall from objects. If you're interested, here's the page of my map: http://www.hiveworkshop.com/forums/...yer-fps-with-rpg-elements-136561/#post1224830
 
Level 11
Joined
Jun 21, 2007
Messages
505
hmm, i can give you one that would be useless to any map but very challenging..
make a unit that has an animation(s) out of various dummy units. It is not impossible just extremely useless and challenging :D.

noob134 meant a unit, which is not actually a unit. It is a unit made of other units. When the overall unit walks, the units which the unit is composed of begin moving in a way to make it look like the unit's making steps.
Or a unit made of special effects flying in the air.
 
Level 8
Joined
Aug 6, 2008
Messages
451
Some ability system, which allows you to dynamicly change ability data, such as cooldown and manacost and correctly display them in tooltips.

Or something like that. It should also support silencing only certain abilities at the time and stuff like that.

Kinda like some neat ability struct.
 
@ Vikuna

Nah, it's impossible to make it display right. You can't change tooltips dynamically.

@ noob134

I had an idea to make something like that a while ago, then I realised the maths was too hard. So, no.

@ Diehard@Azeroth

That already exists in natives.

JASS:
native UnitDamageTarget takes unit whichUnit, widget target, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
 
Level 20
Joined
Jan 6, 2008
Messages
2,627
Element of water, maybe you shouldnt post a jass code, he doesnt like it xP

Diehard@Azeroth
  • Custom Script: native UnitDamageTarget takes unit whichUnit, widget target, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
What system are you working on now atm?
 
Element of water, maybe you shouldnt post a jass code, he doesnt like it xP

Diehard@Azeroth
  • Custom Script: native UnitDamageTarget takes unit whichUnit, widget target, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
What system are you working on now atm?

You can't just get to JassCraft, copy the code you see in the space below (which defines the function you want) and turn it into a custom script suddenly to fit GUI.. It doesn't work for everything :p
 
Level 21
Joined
Aug 21, 2005
Messages
3,699
Here are 2 ideas:

1) Pattern recognition. Make a map where you have a bunch of footmen and place them in a certain position. Then, when you press escape an artificial intelligence will attempt to "read" what you wrote. So if you place your footmen in an "H" shape, a game message saying "H" should appear. Basically what scan software is based on, but in warcraft :p

2) A meta-programming game :D
There's a combat zone with robots you can equip with all sorts of guns, energy sources, shields, radar, etc.
Next, each player must write (in a meta-language, text based or "gui" based) software for those robots. Ultimately, those droids will fight each others the way they were programmed by the player.
 
Level 11
Joined
Jun 21, 2007
Messages
505
I have an idea too. Make units move in a formation. All the units of the formation are unselectable, but the officer of the formation is selectable. Units can be any number in the formation and formation's maximum number of soldiers in a line is specified by player by a text message in the game. If there are 6, 6, and 4 soldiers on 3 lines, then the last line's soldiers gain larger distance between them to fit the formation's width.
And no one damn switches their position in the group, etc unit's don't switch their places with other units. If a unit of the formation died, then a unit from the very last line comes to his place and the last line gains even more additional distance between its soldiers.
 
Level 8
Joined
Aug 4, 2006
Messages
357
I have an idea too. Make units move in a formation. All the units of the formation are unselectable, but the officer of the formation is selectable. Units can be any number in the formation and formation's maximum number of soldiers in a line is specified by player by a text message in the game. If there are 6, 6, and 4 soldiers on 3 lines, then the last line's soldiers gain larger distance between them to fit the formation's width.
And no one damn switches their position in the group, etc unit's don't switch their places with other units. If a unit of the formation died, then a unit from the very last line comes to his place and the last line gains even more additional distance between its soldiers.

I think something similar to this has already been made. However, your specific idea sounds interesting. What would happen if the officer died? How would multiple formations move if you have multiple officers (from different groups) selected? I might want to make this.
 
Level 11
Joined
Jun 21, 2007
Messages
505
I think something similar to this has already been made. However, your specific idea sounds interesting. What would happen if the officer died? How would multiple formations move if you have multiple officers (from different groups) selected? I might want to make this.

Please do! I propose to convert a random unit from the formation into a new officer. If multiple officers are selected, then their formations move together and distance between officers = width of formation1+width of formation2+64 or 128, because |___| |___|
 
Level 11
Joined
Jun 21, 2007
Messages
505
2) I don't know enough about how code works to make my own language inside wc3.

For example: you select the robot and type in game "see_enemy=flee" or "see_enemy=attack" or "wounded=keepfighting" or "wounded=flee" or "attack=shoot # times" (# ranges from 0 to 6) (if robots need to shoot..) "prime_attack_spell=chillingfrost" or "second_attack_spell=fierytouch" or "prime_defend_spell=crouch" or "prime_flee_spell=sprint" and so on.
 
Level 8
Joined
Aug 6, 2008
Messages
451
Nah, it's impossible to make it display right. You can't change tooltips dynamically.

yes and no. There are ways to fake it, but most of them currently suck. I thought you might wanna try to figgure out some new and better way to do that shit.
 
Level 8
Joined
Aug 4, 2006
Messages
357
Yeah I suppose that would simplify it, but it'd be hard for the player to understand and there would only be a limited amount of things you could do with it.

You could just use my string library to allow functions to be called in-game. You only need to write one line of code to enable each function. Of course, it is limited to parameters that can be converted from strings, and it can't recognize variables. It would also be a pain to type all that crap in. I don't think anyone would want to play it (besides programmers).
 
1) Ok, I'll have a look around...

2) What I mean is, I have no fucking idea how a compiler works. Besides, I don't think it'd be any good for wc3.

EDIT: Ok, I looked a bit at the wikipedia article on these neural network things, and basically, it's a load of different threads which interact with each other, and all run functions at the same time. How to set up a network like this which can recognise images made of wc3 units? I still have no idea whatsoever.
 
Level 11
Joined
Jun 21, 2007
Messages
505
Maybe take a region which is a point with offset - position of any unit and offset is 64.. and.. if there's no unit in the region upper from it then set a boolean value for that unit to true meaning it's either top right or top left end or middle.. or.. and all that is done (# of regions of units taken and those regions touch each other)
 

Rmx

Rmx

Level 19
Joined
Aug 27, 2007
Messages
1,164
You want something challenging ..

Make MAP system ! ya you heard me ! MAP SYS !

Imagine you open the editor and don't see anyhting only GRASS .. nothing ..

And when you enter the MAP .. it randomly creates trees river Gold places .. Terrain deformation ..

And each time you enter it .. it will be random ... players from war3 .. won't get enuff playing this MAP ..

Coz it's Random ! .. call it ... Magic Map !
 
Level 21
Joined
Aug 21, 2005
Messages
3,699
EDIT: Ok, I looked a bit at the wikipedia article on these neural network things, and basically, it's a load of different threads which interact with each other, and all run functions at the same time. How to set up a network like this which can recognise images made of wc3 units? I still have no idea whatsoever.

I'd say: you make a 2D boolean matrix (a 2D array, basically. Dimensions from e.g. 16*16)
Next, you create 26 of those matrices, and for each letter of the alphabet you set certain booleans to true. For example (with a 5x5 matrix for simplicity) :

1 - 0 - 0 - 0 - 1
1 - 0 - 0 - 0 - 1
1 - 1 - 1 - 1 - 1
1 - 0 - 0 - 0 - 1
1 - 0 - 0 - 0 - 1

0's are "false" and 1's are "true". This matrix would match a perfect "H" pattern.

Finally, each time you press "Escape" (or something else) a new matrix is created and depending on the X/Y positions of the units the matrix is filled up. A result matrix may give something like:

1 - 0 - 0 - 1 - 0
1 - 0 - 0 - 0 - 1
1 - 1 - 1 - 1 - 1
1 - 0 - 0 - 0 - 1
1 - 0 - 0 - 0 - 1

As you can see, you misplaced 1 unit a "little bit" causing the matrix to look "slightly" different. In the end, no man can write the "perfect" H like he should write it.

Through a clever algorithm, you try to figure out which one of the 26 initial matrices looks the most like the one you generated based on the unit locations.
 
Status
Not open for further replies.
Top