Quantcast
Arena ClassSpec-Icons appear/mirror friendly/neutral nameplates - WoWInterface
Thread Tools Display Modes
02-27-21, 06:31 PM   #1
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
Arena ClassSpec-Icons appear/mirror friendly/neutral nameplates

Hello,

I use alot of scripts for pvp and one of the codes is giving me trouble since Shadowlands.


Code:
local U = UnitIsUnit;
local GetNamePlate = C_NamePlate.GetNamePlateForUnit;
local frame = CreateFrame("frame");
local data = {};

function NamePlate_Added(...)
   local nameplateId = ...;
   local nameplate = GetNamePlate(nameplateId).UnitFrame;

   for i=1,5 do
      if UnitIsUnit(nameplateId, "arena"..i) then
         addIcon(data[i], nameplate);
      end
   end
end

function NamePlate_Removed(...)
   local nameplateId = ...;
   local nameplate = GetNamePlate(nameplateId).UnitFrame;

   if (nameplate.iconClass) then
      nameplate.iconClass:Hide();
   end
end

function SetupIcons()
   for i = 1, GetNumArenaOpponentSpecs() do
      local specID = GetArenaOpponentSpec(i)
      if specID > 0 then
         local id, name, description, icon, role, class = GetSpecializationInfoByID(specID);
         data[i] = icon;
      end
   end
end

function addIcon (icon, frame)
   local button = CreateFrame("Button", "ClassIcon", frame);
   local txt = button:CreateTexture();

   txt:SetTexture(icon);
   txt:SetAllPoints();
   
   button:SetNormalTexture(txt);
   button:SetWidth(20);
   button:SetHeight(20);
   button:SetPoint("RIGHT", 10, -5);

   frame.iconClass = button;
end

frame:RegisterEvent('NAME_PLATE_UNIT_ADDED');
frame:RegisterEvent('NAME_PLATE_UNIT_REMOVED');
frame:RegisterEvent('ARENA_PREP_OPPONENT_SPECIALIZATIONS');
frame:SetScript('OnEvent', function (self, event, ...)
      if (event == "ARENA_PREP_OPPONENT_SPECIALIZATIONS") then
         SetupIcons();
      elseif (event == 'NAME_PLATE_UNIT_ADDED') then
         NamePlate_Added(...)
      elseif (event == 'NAME_PLATE_UNIT_REMOVED') then
         NamePlate_Removed(...);
      end
end)
The code works but sometimes icons will randomly appear on other non related units even outside of arena.

Also I get lua.errors which I couldnt fix myself but I dont think it is related to this problem itself:

Code:
Message: Interface\AddOns\RulezPvPScripts\core.lua:21: attempt to index local 'nameplate' (a nil value)
Time: Sun Feb 28 00:59:43 2021
Count: 2
Stack: Interface\AddOns\RulezPvPScripts\core.lua:21: attempt to index local 'nameplate' (a nil value)
[string "@Interface\AddOns\RulezPvPScripts\core.lua"]:21: in function `NamePlate_Removed'
[string "@Interface\AddOns\RulezPvPScripts\core.lua"]:60: in function <Interface\AddOns\RulezPvPScripts\core.lua:54>

Locals: nameplateId = "nameplate1"
nameplate = nil
(*temporary) = "nameplate1"
(*temporary) = NamePlate1 {
 OnSizeChanged = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:485
 GetPreferredInsets = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:466
 GetAdditionalInsetPadding = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:455
 NCIconsCount = 0
 ApplyOffsets = <function> defined =[C]:-1
 NCIcons = <table> {
 }
 OnRemoved = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:424
 OnAdded = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:413
 template = "NamePlateUnitFrameTemplate"
 0 = <userdata>
 OnOptionsUpdated = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:431
}
(*temporary) = "attempt to index local 'nameplate' (a nil value)"
GetNamePlate = <function> defined =[C]:-1
Since I use the code for enemy nameplates only' it is pretty annoying when wrong spec-icons from enemy players appear on friendly nameplates.

It is not my own code so it would be really kind if someone is able to fix it up.

For friendly nameplates I use a different code because I need different positioning and Iconsize (smaller nameplates):

Code:
local frame = CreateFrame("Frame")
 
frame:SetScript("OnEvent", function(self, event, unit)
    local namePlate = GetNamePlateForUnit(unit)
    if event == "NAME_PLATE_UNIT_ADDED" and UnitIsFriend("player", unit) then
        local _, class = UnitClass(unit)
        if iconTexture[class] then
            local icon = namePlate[iconKey]
            if not icon then
                icon = namePlate:CreateTexture(nil, "OVERLAY")
                icon:SetPoint('CENTER', 0, 29.46)
                icon:SetSize(24, 24)
                namePlate[iconKey] = icon
            end
            icon:SetTexture(iconTexture[class])
            icon:Show()
            return
        end
    end
    if namePlate[iconKey] then
        namePlate[iconKey]:Hide()
    end
end)

frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
frame:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_LOGIN")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", function()
	
	nameplateSize()

end)

function nameplateSize()
Is it possible to fix the first code with enemy_units (lua errors/wrong display)

and to rewrite the second code with friendly_units but to show spec-icons instead of class-icons (see example) in arenas?

Basically friendly and enemy nameplate class-icons outside of arena/pvp (or when :GetSpec isnt working) and turn to friendly/enemy specialization-icons inside arena/pvp (if possible).

I know its a mess and alot of work but I usually just put all the stuff mixed together in one addon and I dont have alot of expierence with lua.

It would be really helpful and maybe its possible to create a small addon with both functions/codes (friendly, enemy) with the possibility to seperate edit friendly icons from enemy icons in sizes/positioning (no ingame config just simple lua-code).

I would also like to share the result to the community if someone get this to work.

Thank you for reading.

Attachments: Issues (wrong/discplacement_example), Friendly_Nameplates (default_ like usually), Enemy_Nameplates (default_ like usually)
The icon on the top of the first image is from BigDebuffs which is bugged too but addon related (already reportet).
Attached Thumbnails
Click image for larger version

Name:	ISSUES.PNG
Views:	42
Size:	102.2 KB
ID:	9592  Click image for larger version

Name:	Enemy_Nameplate_example.PNG
Views:	38
Size:	33.3 KB
ID:	9594  
Attached Images
 

Last edited by rulezyx : 03-01-21 at 06:49 AM.
  Reply With Quote
03-01-21, 07:27 AM   #2
Vrul
A Scalebane Royal Guard
 
Vrul's Avatar
AddOn Author - Click to view addons
Join Date: Nov 2007
Posts: 403
I don't pvp so I didn't get to test the enemy nameplate part but here is a start:
Lua Code:
  1. local addonName = ...
  2.  
  3. local iconKey = addonName .. "Icon"
  4.  
  5. local GetNamePlateForUnit = C_NamePlate.GetNamePlateForUnit
  6.  
  7. local isInArena = false
  8.  
  9. local iconTexture = {
  10.     ["DEATHKNIGHT"] = 135771,
  11.     ["DEMONHUNTER"] = 236415,
  12.     ["DRUID"] = 625999,
  13.     ["HUNTER"] = 626000,
  14.     ["MAGE"] = 626001,
  15.     ["MONK"] = 626002,
  16.     ["PALADIN"] = 626003,
  17.     ["PRIEST"] = 626004,
  18.     ["ROGUE"] = 626005,
  19.     ["SHAMAN"] = 626006,
  20.     ["WARLOCK"] = 626007,
  21.     ["WARRIOR"] = 626008
  22. }
  23.  
  24. local function UpdateNamePlateIcon(namePlate, unit)
  25.     local icon = namePlate[iconKey]
  26.     if UnitIsPlayer(unit) then
  27.         local texture
  28.         local specID = GetInspectSpecialization(unit)
  29.         if specID then
  30.             local _, _, _, icon = GetSpecializationInfoByID(specID)
  31.             texture = icon
  32.         end
  33.         if not texture then
  34.             local _, class = UnitClass(unit)
  35.             texture = iconTexture[class]
  36.         end
  37.         if texture then
  38.             if not icon then
  39.                 icon = namePlate:CreateTexture(nil, "OVERLAY")
  40.                 namePlate[iconKey] = icon
  41.             end
  42.             local iconStyle = UnitIsFriend("player", unit) and "friend" or "enemy"
  43.             if icon.style ~= iconStyle then
  44.                 icon.style = iconStyle
  45.                 icon:ClearAllPoints()
  46.                 if iconStyle == "friend" then
  47.                     icon:SetPoint('CENTER', 0, 29.46)
  48.                     icon:SetSize(24, 24)
  49.                 else
  50.                     icon:SetPoint('RIGHT', 10, -5)
  51.                     icon:SetSize(20, 20)
  52.                 end
  53.             end
  54.             icon:SetTexture(texture)
  55.             icon:Show()
  56.             return
  57.         end
  58.     end
  59.     if icon then
  60.         icon:Hide()
  61.     end
  62. end
  63.  
  64. local function UpdateAllNamePlateIcons()
  65.     local nameplates = C_NamePlate.GetNamePlates()
  66.     for index = 1, #nameplates do
  67.         UpdateNamePlateIcon(nameplates[index], nameplates[index].namePlateUnitToken)
  68.     end
  69. end
  70.  
  71. local frame = CreateFrame("Frame")
  72.  
  73. frame:SetScript("OnEvent", function(self, event, unit)
  74.     if event == "NAME_PLATE_UNIT_ADDED" then
  75.         local namePlate = GetNamePlateForUnit(unit)
  76.         UpdateNamePlateIcon(namePlate, unit)
  77.     elseif event == "NAME_PLATE_UNIT_REMOVED" then
  78.         local namePlate = GetNamePlateForUnit(unit)
  79.         if namePlate[iconKey] then
  80.             namePlate[iconKey]:Hide()
  81.         end
  82.     elseif event == "PLAYER_ENTERING_WORLD" then
  83.         if isInArena ~= C_PvP.IsArena() then
  84.             isInArena = not isInArena
  85.             UpdateAllNamePlateIcons()
  86.         end
  87.     elseif event == "ARENA_PREP_OPPONENT_SPECIALIZATIONS" then
  88.         UpdateAllNamePlateIcons()
  89.     end
  90. end)
  91.  
  92. frame:RegisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS")
  93. frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
  94. frame:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
  95. frame:RegisterEvent("PLAYER_ENTERING_WORLD")
  Reply With Quote
03-01-21, 01:03 PM   #3
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
Seems to work perfectly without any issues.

Thank you so much!
  Reply With Quote
03-01-21, 07:28 PM   #4
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
So it works fine for friendly nameplates but I noticed that enemy spec-icons doesn't show/switch up in arenas.

I can only see the class-icons for enemy players.

Is there a way to fix that?

Friendly is fine even in Openworld when warmode is on.

I mean with the first code the spec-icons worked fine except the errors and buggs but I dont understand the issue since you put up both friendly and enemy triggers the same way.

Gladius and GladiusEx (Addons) have a similar way to detect that.

Does that do anything:
local isInArena = false

Last edited by rulezyx : 03-01-21 at 07:40 PM.
  Reply With Quote
03-01-21, 07:31 PM   #5
Kanegasi
A Molten Giant
 
Kanegasi's Avatar
AddOn Author - Click to view addons
Join Date: Apr 2007
Posts: 558
Spec info for enemy players is not available. All you get is their class, what they look like, and the spells they cast.
  Reply With Quote
03-01-21, 07:49 PM   #6
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
I am sure it is available at least in closed pvp: arenas and battlegrounds.

You can also get Talents/CD's of Opponents, here some examples from my UI:

https://imgur.com/a/EQDNHZZ (GladiusEx and before the game started)

https://imgur.com/a/fOeEjvf (old Code in Arenafight)

Last edited by rulezyx : 03-01-21 at 07:55 PM.
  Reply With Quote
03-02-21, 12:15 AM   #7
Vrul
A Scalebane Royal Guard
 
Vrul's Avatar
AddOn Author - Click to view addons
Join Date: Nov 2007
Posts: 403
Like I said I don't do arenas so I couldn't test that part. I can change it to do the arena opponent specs the original way when I get some time but it may be a few days.
  Reply With Quote
03-02-21, 05:11 AM   #8
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
Ty, you already helped alot

I was just confused because it worked for friendly units but I noticed for enemys it is a bit more tricky.

Blizzard gives opportunities to detect specialization in closed PvP areas (skrims, rated arena, normal-, epic-bgs, rated bgs).

Something like this worked well with friendly units and some Tooltip Addons use this and Inspect for friendly player specs too:

Code:
 local specID = GetInspectSpecialization(unit)
        if specID then
            local _, _, _, icon = GetSpecializationInfoByID(specID)
            texture = icon
For arena enemys/opponents its always something like that:

Code:
 for i=1,5 do
      if UnitIsUnit(nameplateId, "arena"..i) then
         addIcon(data[i], nameplate);
      end
   end
end

-----------------------------------------------------------------------------------

function SetupIcons()
   for i = 1, GetNumArenaOpponentSpecs() do
      local specID = GetArenaOpponentSpec(i)
      if specID > 0 then
         local id, name, description, icon, role, class = GetSpecializationInfoByID(specID);
         data[i] = icon;
      end
   end
end

Last edited by rulezyx : 03-02-21 at 05:23 AM.
  Reply With Quote
03-05-21, 01:19 PM   #9
Vrul
A Scalebane Royal Guard
 
Vrul's Avatar
AddOn Author - Click to view addons
Join Date: Nov 2007
Posts: 403
Most of the extra code is for showing friendly specs and the arena code has still not been tested:
Lua Code:
  1. local addonName = ...
  2.  
  3. local INSPECT_DELAY = 40
  4.  
  5. local iconKey = addonName .. "Icon"
  6.  
  7. local CheckInteractDistance, next = CheckInteractDistance, next
  8. local CanInspect, ClearInspectPlayer, NotifyInspect = CanInspect, ClearInspectPlayer, NotifyInspect
  9. local GetInspectSpecialization = GetInspectSpecialization
  10. local GetArenaOpponentSpec, GetNumArenaOppenents = GetArenaOpponentSpec, GetNumArenaOppenents
  11. local GetNamePlateForUnit = C_NamePlate.GetNamePlateForUnit
  12. local UnitClassBase, UnitExists, UnitGUID = UnitClassBase, UnitExists, UnitGUID
  13. local UnitIsEnemy, UnitIsFriend, UnitIsPlayer = UnitIsEnemy, UnitIsFriend, UnitIsPlayer
  14.  
  15. local iconData, inspectList, isAtlas, namePlateByGUID, reinspectList = { }, { }, { }, { }, { }
  16. local arenaSpec, numArenaOpponents = { }
  17.  
  18. local SetInspectDelay
  19.  
  20. local frame = CreateFrame("Frame")
  21.  
  22. local function InspectList_OnUpdate(self)
  23.     local namePlate, unit = next(inspectList)
  24.     if namePlate then
  25.         inspectList[namePlate], reinspectList[namePlate] = nil, unit
  26.         if CheckInteractDistance(unit, 1) then
  27.             SetInspectDelay()
  28.             NotifyInspect(unit)
  29.         end
  30.     elseif next(reinspectList) then
  31.         inspectList, reinspectList = reinspectList, inspectList
  32.     else
  33.         self:Hide()
  34.     end
  35. end
  36.  
  37. do
  38.     local delayCount = 0
  39.  
  40.     local function InspectDelay_OnUpdate(self)
  41.         delayCount = delayCount + 1
  42.         if delayCount >= INSPECT_DELAY then
  43.             delayCount = 0
  44.             self:SetScript("OnUpdate", InspectList_OnUpdate)
  45.         end
  46.     end
  47.  
  48.     function SetInspectDelay(reset)
  49.         delayCount = 0
  50.         if reset then
  51.             frame:SetScript("OnUpdate", InspectList_OnUpdate)
  52.         else
  53.             frame:SetScript("OnUpdate", InspectDelay_OnUpdate)
  54.         end
  55.     end
  56. end
  57.  
  58. local function UpdateNamePlateIcon(namePlate, unit, texture)
  59.     local icon = namePlate[iconKey]
  60.     if UnitIsPlayer(unit) then
  61.         if not texture then
  62.             local specID = GetInspectSpecialization(unit)
  63.             texture = (specID or 0) > 0 and iconData[specID]
  64.         end
  65.         local usingSpec = texture and true or nil
  66.         if not texture then
  67.             local _, classID = UnitClassBase(unit)
  68.             texture = iconData[classID]
  69.         end
  70.         if texture then
  71.             if not icon then
  72.                 icon = namePlate:CreateTexture(nil, "OVERLAY")
  73.                 namePlate[iconKey] = icon
  74.             end
  75.             local iconStyle = UnitIsFriend("player", unit) and "friend" or "enemy"
  76.             if icon.style ~= iconStyle then
  77.                 icon.style = iconStyle
  78.                 icon:ClearAllPoints()
  79.                 if iconStyle == "friend" then
  80.                     icon:SetPoint('CENTER', 0, 29.46)
  81.                     icon:SetSize(24, 24)
  82.                 else
  83.                     icon:SetPoint('RIGHT', 10, -5)
  84.                     icon:SetSize(20, 20)
  85.                 end
  86.             end
  87.             icon[isAtlas[texture] and "SetAtlas" or "SetTexture"](icon, texture)
  88.             icon:Show()
  89.             return usingSpec
  90.         end
  91.     end
  92.     if icon then
  93.         icon:Hide()
  94.     end
  95. end
  96.  
  97. frame:SetScript("OnEvent", function(self, event, arg1)
  98.     if event == "INSPECT_READY" then
  99.         local namePlate = namePlateByGUID[arg1]
  100.         if namePlate and UpdateNamePlateIcon(namePlate, namePlate.namePlateUnitToken) then
  101.             inspectList[namePlate], reinspectList[namePlate] = nil, nil
  102.         end
  103.         ClearInspectPlayer()
  104.         SetInspectDelay(true)
  105.     elseif event == "NAME_PLATE_UNIT_ADDED" or event == "PLAYER_SPECIALIZATION_CHANGED" then
  106.         local namePlate = GetNamePlateForUnit(arg1)
  107.         if namePlate then
  108.             if numArenaOpponents and UnitIsEnemy("player", arg1) then
  109.                 for index = 1, numArenaOpponents do
  110.                     if UnitIsUnit("arena" .. index, arg1) then
  111.                         UpdateNamePlateIcon(namePlate, arg1, iconData[arenaSpec[index]])
  112.                         return
  113.                     end
  114.                 end
  115.             end
  116.             if not UpdateNamePlateIcon(namePlate, arg1) and CanInspect(arg1) then
  117.                 local guid = UnitGUID(arg1)
  118.                 if guid then
  119.                     namePlateByGUID[guid], inspectList[namePlate] = namePlate, arg1
  120.                     self:Show()
  121.                 end
  122.             end
  123.         end
  124.     elseif event == "NAME_PLATE_UNIT_REMOVED" then
  125.         local namePlate = GetNamePlateForUnit(arg1)
  126.         if namePlate then
  127.             inspectList[namePlate], reinspectList[namePlate] = nil, nil
  128.             local guid = UnitGUID(arg1)
  129.             if guid then
  130.                 namePlateByGUID[guid] = nil
  131.             end
  132.             if namePlate[iconKey] then
  133.                 namePlate[iconKey]:Hide()
  134.             end
  135.         end
  136.     elseif event == "PLAYER_ENTERING_WORLD" then
  137.         wipe(arenaSpec)
  138.         wipe(inspectList)
  139.         wipe(reinspectList)
  140.         numArenaOpponents = nil
  141.     elseif event == "ARENA_PREP_OPPONENT_SPECIALIZATIONS" then
  142.         wipe(arenaSpec)
  143.         numArenaOpponents = GetNumArenaOpponents()
  144.         if numArenaOpponents > 0 then
  145.             for index = 1, numArenaOpponents do
  146.                 local specID = GetArenaOpponentSpec(index)
  147.                 arenaSpec[index] = (specID or 0) > 0 and specID or nil
  148.                 local namePlate = GetNamePlateForUnit("arena" .. index)
  149.                 if namePlate then
  150.                     inspectList[namePlate], reinspectList[namePlate] = nil, nil
  151.                     UpdateNamePlateIcon(namePlate, namePlate.namePlateUnitToken, iconData[specID])
  152.                 end
  153.             end
  154.         else
  155.             numArenaOpponents = nil
  156.         end
  157.     end
  158. end)
  159.  
  160. frame:SetScript("OnUpdate", InspectList_OnUpdate)
  161.  
  162. frame:RegisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS")
  163. frame:RegisterEvent("INSPECT_READY")
  164. frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
  165. frame:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
  166. frame:RegisterEvent("PLAYER_ENTERING_WORLD")
  167. frame:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED")
  168.  
  169. do
  170.     local GetClassAtlas, GetClassInfo = GetClassAtlas, GetClassInfo
  171.     local GetNumSpecializationsForClassID = GetNumSpecializationsForClassID
  172.     local GetSpecializationInfoForClassID = GetSpecializationInfoForClassID
  173.  
  174.     for index = 1, GetNumClasses() do
  175.         local _, class, classID = GetClassInfo(index)
  176.         local atlas = GetClassAtlas(class)
  177.         iconData[classID], isAtlas[atlas] = atlas, true
  178.         for specNum = 1, GetNumSpecializationsForClassID(classID) do
  179.             local specID, name, description, icon = GetSpecializationInfoForClassID(classID, specNum)
  180.             iconData[specID] = icon
  181.         end
  182.     end
  183. end
  Reply With Quote
03-05-21, 02:53 PM   #10
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
Ok I tested it openworld and in arenas (friendly&enemy).

Friendly nameplates show random race-like icons/frame(?) before spec shows up:
https://imgur.com/a/GKtbccl

Enemy nameplates too but no spec-icon will show up/appear and it looks like this:
https://imgur.com/a/8MvPpSG

Basically friendly icons will work openworld and in preparation-room(pvp) aside from the race-frame/thing but when the pvp game starts they end up looking like this too:
https://imgur.com/a/sCliDLA

Also when I inspect players their whole profile/gear-slots appear empty.

No errors/other issues. Hope that helps a bit.

Last edited by rulezyx : 03-11-21 at 10:51 AM.
  Reply With Quote
03-29-21, 04:12 AM   #11
rulezyx
A Cliff Giant
 
rulezyx's Avatar
Join Date: Jan 2020
Posts: 73
At the moment I use the first code (Vrul/#2) which works fine.

It shows friendly spec-icons and enemie class-icons in closed pvp.

Maybe theres a solution for the enemy-specs in the future but the only Addon I found is Plater Nameplates.

And since Plater is somehow in correlation with Details it is probably much easier to have these functions working but apart from this I prefer default nameplates.

Last edited by rulezyx : 03-29-21 at 04:17 AM.
  Reply With Quote

WoWInterface » Developer Discussions » Lua/XML Help » Arena ClassSpec-Icons appear/mirror friendly/neutral nameplates

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off