Raised This Month: $32 Target: $400
 8% 

[TF2] Donator Building Colors


Post New Thread Reply   
 
Thread Tools Display Modes
Velture
Senior Member
Join Date: Jan 2011
Location: Poland, Warsaw
Old 06-21-2013 , 23:26   Re: [TF2] Donator Building Colors
Reply With Quote #11

Could you just make that plugin to work without that donators plugin? For 'a' flag? eg: !buildings command?
__________________
Velture is offline
404UserNotFound
BANNED
Join Date: Dec 2011
Old 06-21-2013 , 23:42   Re: [TF2] Donator Building Colors
Reply With Quote #12

Quote:
Originally Posted by Velture View Post
Could you just make that plugin to work without that donators plugin? For 'a' flag? eg: !buildings command?
I did edit the main post to include installation instructions for the non-Basic Donator Interface version.

I also added a 2nd plugin to the main post, it uses ADMFLAG_CUSTOM1 (aka the "o" flag).

As well, "a" is an admin flag and not a donator flag, unless you personally use "a" as a donator flag.

Now, I really don't take modification requests, and I'm just about to head to bed, so if anyone else here wants to field this request and modify it for him, go right ahead. If nobody does by tomorrow, I'll do it.
404UserNotFound is offline
friagram
Veteran Member
Join Date: Sep 2012
Location: Silicon Valley
Old 06-22-2013 , 00:32   Re: [TF2] Donator Building Colors
Reply With Quote #13

You should use checkcommandaccess and give users an override flag. Also, isvalidclient is not really useful.. You get a userid... If it is 0 the client is disconnected, but probably never will be... The index of the builder will always be between 1 and maxclients i think, and will never be sourcetv or replay.
__________________
Profile - Plugins
Add me on steam if you are seeking sp/map/model commissions.
friagram is offline
404UserNotFound
BANNED
Join Date: Dec 2011
Old 06-22-2013 , 00:44   Re: [TF2] Donator Building Colors
Reply With Quote #14

Quote:
Originally Posted by friagram View Post
You should use checkcommandaccess and give users an override flag. Also, isvalidclient is not really useful.. You get a userid... If it is 0 the client is disconnected, but probably never will be... The index of the builder will always be between 1 and maxclients i think, and will never be sourcetv or replay.
Ahh, I'll have to do the checkcommandaccess in the non-basic-donator-interface version, and get rid of the valid client check in both versions.
404UserNotFound is offline
ReFlexPoison
☠☠☠
Join Date: Jul 2011
Location: ☠☠☠
Old 06-22-2013 , 02:01   Re: [TF2] Donator Building Colors
Reply With Quote #15

Had this for awhile, just edited it to have the colors from your plugin. By the way the valid client check is fine, just isn't required all the time. I use it just for good measures.

Added a ConVar and a basic command. Also made it change colors of buildings that are already built after changing your settings in the menu.

PHP Code:
#pragma semicolon 1

// ====[ INCLUDES ]============================================================
#include <sourcemod>
#include <sdktools>

// ====[ DEFINES ]=============================================================
#define PLUGIN_VERSION    "1.0"

// ====[ HANDLES | CVARS ]=====================================================
new Handle:g_hCvarEnabled;

// ====[ VARIABLES ]===========================================================
new g_iColor[MAXPLAYERS 1];
new 
bool:g_bEnabled;

// ====[ PLUGIN ]==============================================================
public Plugin:myinfo =
{
    
name "Building Colors",
    
author "ReFlexPoison",
    
description "Color Engineer Buildings",
    
version PLUGIN_VERSION,
    
url "https://www.sourcemod.net/"
}

// ====[ FUNCTIONS ]===========================================================
public OnPluginStart()
{
    
CreateConVar("sm_buildcolors_version"PLUGIN_VERSION"Building Colors Version"FCVAR_REPLICATED FCVAR_PLUGIN FCVAR_SPONLY FCVAR_DONTRECORD FCVAR_NOTIFY);

    
g_hCvarEnabled CreateConVar("sm_buildcolors_enabled"PLUGIN_VERSION"Enable Building Colors\n0 = Disabled\n1 = Enabled"_true0.0true1.0);
    
g_bEnabled GetConVarBool(g_hCvarEnabled);
    
HookConVarChange(g_hCvarEnabledConVarChanged);

    
HookEvent("player_builtobject"OnBuiltObject);

    
RegAdminCmd("sm_buildingcolors"BuildingColorsCmdADMFLAG_GENERIC);
}

public 
ConVarChanged(Handle:hConvar, const String:strOldValue[], const String:strNewValue[])
{
    if(
hConvar == g_hCvarEnabled)
    {
        
g_bEnabled GetConVarBool(g_hCvarEnabled);
        if(!
g_bEnabled)
            
OnPluginEnd();
    }
}

// ====[ EVENTS ]==============================================================
public OnPluginEnd()
{
    new 
iEntity INVALID_ENT_REFERENCE;
    while((
iEntity FindEntityByClassname(iEntity"obj_dispenser")) != INVALID_ENT_REFERENCE)
        
SetEntityRenderColor(iEntity255255255_);
    while((
iEntity FindEntityByClassname(iEntity"obj_teleporter")) != INVALID_ENT_REFERENCE)
        
SetEntityRenderColor(iEntity255255255_);
    while((
iEntity FindEntityByClassname(iEntity"obj_sentry")) != INVALID_ENT_REFERENCE)
        
SetEntityRenderColor(iEntity255255255_);
}

public 
OnClientConnected(iClient)
{
    
g_iColor[iClient] = 0;
}

public 
Action:OnBuiltObject(Handle:hEvent, const String:strName[], bool:bDontBroadcast)
{
    new 
iClient GetClientOfUserId(GetEventInt(hEvent"userid"));
    if(!
IsValidClient(iClient) || !g_bEnabled)
        return 
Plugin_Continue;

    if(!
CheckCommandAccess(iClient"sm_buildingcolors"ADMFLAG_GENERIC))
        return 
Plugin_Continue;

    new 
iBuilding GetEventInt(hEvent"index");
    if(
IsValidEntityEx(iBuilding))
        
SetBuildingColor(iBuildingiClient);
    return 
Plugin_Continue;
}

// ====[ COMMANDS ]============================================================
public Action:BuildingColorsCmd(iClientiArgs)
{
    if(!
IsValidClient(iClient) || !g_bEnabled)
        return 
Plugin_Continue;

    new 
Handle:hMenu CreateMenu(BuildingColorsHandler);
    
SetMenuTitle(hMenu"Building Colors:");

    
AddMenuItem(hMenu"0""None");
    
AddMenuItem(hMenu"1""Black");
    
AddMenuItem(hMenu"2""Red");
    
AddMenuItem(hMenu"3""Green");
    
AddMenuItem(hMenu"4""Blue");
    
AddMenuItem(hMenu"5""Yellow");
    
AddMenuItem(hMenu"6""Purple");
    
AddMenuItem(hMenu"7""Cyan");
    
AddMenuItem(hMenu"8""Orange");
    
AddMenuItem(hMenu"9""Pink");
    
AddMenuItem(hMenu"10""Olive");
    
AddMenuItem(hMenu"11""Lime");
    
AddMenuItem(hMenu"12""Violet");
    
AddMenuItem(hMenu"13""Light Blue");
    
AddMenuItem(hMenu"14""Silver");
    
AddMenuItem(hMenu"15""Chocolate");
    
AddMenuItem(hMenu"16""Saddle Brown");
    
AddMenuItem(hMenu"17""Indigo");
    
AddMenuItem(hMenu"18""Ghost White");
    
AddMenuItem(hMenu"19""Thistle");
    
AddMenuItem(hMenu"20""Alice Blue");
    
AddMenuItem(hMenu"21""Steel Blue");
    
AddMenuItem(hMenu"22""Teal");
    
AddMenuItem(hMenu"23""Gold");
    
AddMenuItem(hMenu"24""Tan");
    
AddMenuItem(hMenu"25""Tomato");

    
DisplayMenu(hMenuiClientMENU_TIME_FOREVER);
    return 
Plugin_Handled;
}

public 
BuildingColorsHandler(Handle:hMenuMenuAction:iActioniParam1iParam2)
{
    if(
iAction == MenuAction_End)
        
CloseHandle(hMenu);

    if(
iAction == MenuAction_Select)
    {
        
decl String:strInfo[12];
        
GetMenuItem(hMenuiParam2strInfosizeof(strInfo));
        
g_iColor[iParam1] = StringToInt(strInfo);

        new 
iEntity INVALID_ENT_REFERENCE;
        while((
iEntity FindEntityByClassname(iEntity"obj_dispenser")) != INVALID_ENT_REFERENCE)
        {
            if(
GetEntPropEnt(iEntityProp_Send"m_hBuilder") == iParam1)
                
SetBuildingColor(iEntityiParam1);
        }
        while((
iEntity FindEntityByClassname(iEntity"obj_teleporter")) != INVALID_ENT_REFERENCE)
        {
            if(
GetEntPropEnt(iEntityProp_Send"m_hBuilder") == iParam1)
                
SetBuildingColor(iEntityiParam1);
        }
        while((
iEntity FindEntityByClassname(iEntity"obj_sentry")) != INVALID_ENT_REFERENCE)
        {
            if(
GetEntPropEnt(iEntityProp_Send"m_hBuilder") == iParam1)
                
SetBuildingColor(iEntityiParam1);
        }
    }
}

// ====[ STOCKS ]==============================================================
stock bool:IsValidClient(iClientbool:bReplay true)
{
    if(
iClient <= || iClient MaxClients || !IsClientInGame(iClient))
        return 
false;
    if(
bReplay && (IsClientSourceTV(iClient) || IsClientReplay(iClient)))
        return 
false;
    return 
true;
}

stock bool:IsValidEntityEx(iEntity)
{
    if(
iEntity <= MaxClients || !IsValidEntity(iEntity))
        return 
false;
    return 
true;
}

stock SetBuildingColor(iEntityiOwner)
{
    switch(
g_iColor[iOwner])
    {
        case 
1SetEntityRenderColor(iEntity000_);
        case 
2SetEntityRenderColor(iEntity25500_);
        case 
3SetEntityRenderColor(iEntity02550_);
        case 
4SetEntityRenderColor(iEntity00255_);
        case 
5SetEntityRenderColor(iEntity2552550_);
        case 
6SetEntityRenderColor(iEntity2550255_);
        case 
7SetEntityRenderColor(iEntity0255255_);
        case 
8SetEntityRenderColor(iEntity2551280_);
        case 
9SetEntityRenderColor(iEntity2550128_);
        case 
10SetEntityRenderColor(iEntity1282550_);
        case 
11SetEntityRenderColor(iEntity0255128_);
        case 
12SetEntityRenderColor(iEntity1280255_);
        case 
13SetEntityRenderColor(iEntity0128255_);
        case 
14SetEntityRenderColor(iEntity192192192_);
        case 
15SetEntityRenderColor(iEntity21010530_);
        case 
16SetEntityRenderColor(iEntity1396919_);
        case 
17SetEntityRenderColor(iEntity750130_);
        case 
18SetEntityRenderColor(iEntity248248255_);
        case 
19SetEntityRenderColor(iEntity216191216_);
        case 
20SetEntityRenderColor(iEntity240248255_);
        case 
21SetEntityRenderColor(iEntity70130180_);
        case 
22SetEntityRenderColor(iEntity0128128_);
        case 
23SetEntityRenderColor(iEntity2552150_);
        case 
24SetEntityRenderColor(iEntity210180140_);
        case 
25SetEntityRenderColor(iEntity2559971_);
    }

Attached Files
File Type: sp Get Plugin or Get Source (buildingcolors.sp - 316 views - 7.0 KB)
ReFlexPoison is offline
404UserNotFound
BANNED
Join Date: Dec 2011
Old 06-22-2013 , 02:22   Re: [TF2] Donator Building Colors
Reply With Quote #16

Quote:
Originally Posted by ReFlexPoison View Post
Also made it change colors of buildings that are already built after changing your settings in the menu.
Nooo, that's the best thing about the plugin, being able to change the color of each building you put down. Why would you go and patch that? At least convert it to a convar.

Also, you say you've had this sitting around for a while, yet it looks suspiciously the same as mine (then again mine is suspiciously the same looking as the plugin I used, because I harvested the code). Things like the Valid Client check looking exactly the same as the one I use trigger red flags in my head

Last edited by 404UserNotFound; 06-22-2013 at 02:24.
404UserNotFound is offline
friagram
Veteran Member
Join Date: Sep 2012
Location: Silicon Valley
Old 06-22-2013 , 11:04   Re: [TF2] Donator Building Colors
Reply With Quote #17

Isvalidclient is something everyone new to sourcepawn gets slapped with

Just like the isclientconnected isclientingame thing...
Or

New client = getclientofuserid
If client && isclientingame bit

I think i used to isvalidclient everything in loops because thats what the person did when they gave me my first code bits in plugins our server used :/
__________________
Profile - Plugins
Add me on steam if you are seeking sp/map/model commissions.

Last edited by friagram; 06-22-2013 at 11:06.
friagram is offline
404UserNotFound
BANNED
Join Date: Dec 2011
Old 06-22-2013 , 14:21   Re: [TF2] Donator Building Colors
Reply With Quote #18

Quote:
Originally Posted by friagram View Post
Isvalidclient is something everyone new to sourcepawn gets slapped with

Just like the isclientconnected isclientingame thing...
Or

New client = getclientofuserid
If client && isclientingame bit

I think i used to isvalidclient everything in loops because thats what the person did when they gave me my first code bits in plugins our server used :/
Except I'm not new to SourcePawn.
404UserNotFound is offline
ReFlexPoison
☠☠☠
Join Date: Jul 2011
Location: ☠☠☠
Old 06-22-2013 , 14:59   Re: [TF2] Donator Building Colors
Reply With Quote #19

Quote:
Originally Posted by abrandnewday View Post
Except I'm not new to SourcePawn.
Checking to make sure a client is valid is perfectly fine. A client disconnecting still has a userid until the full disconnect, in which they will not be in-game but will continue to be considered, above 0. Just use it if you want, not like it's going to slow anything down.

Quote:
Originally Posted by abrandnewday View Post
Also, you say you've had this sitting around for a while, yet it looks suspiciously the same as mine (then again mine is suspiciously the same looking as the plugin I used, because I harvested the code). Things like the Valid Client check looking exactly the same as the one I use trigger red flags in my head
https://forums.alliedmods.net/showpo...41&postcount=3
Old one I edited. Just changed the one I posted up.

Quote:
Originally Posted by abrandnewday View Post
Nooo, that's the best thing about the plugin, being able to change the color of each building you put down. Why would you go and patch that? At least convert it to a convar.

Also, you say you've had this sitting around for a while, yet it looks suspiciously the same as mine (then again mine is suspiciously the same looking as the plugin I used, because I harvested the code). Things like the Valid Client check looking exactly the same as the one I use trigger red flags in my head
Here's a version with the ConVar, didn't test.
PHP Code:
#pragma semicolon 1

// ====[ INCLUDES ]============================================================
#include <sourcemod>
#include <sdktools>

// ====[ DEFINES ]=============================================================
#define PLUGIN_VERSION    "1.0"

// ====[ HANDLES | CVARS ]=====================================================
new Handle:g_hCvarEnabled;
new 
Handle:g_hCvarChange;

// ====[ VARIABLES ]===========================================================
new g_iColor[MAXPLAYERS 1];
new 
bool:g_bEnabled;
new 
bool:g_bChange;

// ====[ PLUGIN ]==============================================================
public Plugin:myinfo =
{
    
name "Building Colors",
    
author "ReFlexPoison",
    
description "Color Engineer Buildings",
    
version PLUGIN_VERSION,
    
url "https://www.sourcemod.net/"
}

// ====[ FUNCTIONS ]===========================================================
public OnPluginStart()
{
    
CreateConVar("sm_buildcolors_version"PLUGIN_VERSION"Building Colors Version"FCVAR_REPLICATED FCVAR_PLUGIN FCVAR_SPONLY FCVAR_DONTRECORD FCVAR_NOTIFY);

    
g_hCvarEnabled CreateConVar("sm_buildcolors_enabled"PLUGIN_VERSION"Enable Building Colors\n0 = Disabled\n1 = Enabled"_true0.0true1.0);
    
g_bEnabled GetConVarBool(g_hCvarEnabled);
    
HookConVarChange(g_hCvarEnabledConVarChanged);
    
    
g_hCvarChange CreateConVar("sm_buildcolors_change"PLUGIN_VERSION"Change already built building colors when a new color is selected\n0 = Disabled\n1 = Enabled"_true0.0true1.0);
    
g_bChange GetConVarBool(g_hCvarChange);
    
HookConVarChange(g_hCvarChangeConVarChanged);

    
HookEvent("player_builtobject"OnBuiltObject);

    
RegAdminCmd("sm_buildingcolors"BuildingColorsCmdADMFLAG_GENERIC);
}

public 
ConVarChanged(Handle:hConvar, const String:strOldValue[], const String:strNewValue[])
{
    if(
hConvar == g_hCvarEnabled)
    {
        
g_bEnabled GetConVarBool(g_hCvarEnabled);
        if(!
g_bEnabled)
            
OnPluginEnd();
    }
    if(
hConvar == g_hCvarChange)
        
g_bChange GetConVarBool(g_hCvarChange);
}

// ====[ EVENTS ]==============================================================
public OnPluginEnd()
{
    new 
iEntity INVALID_ENT_REFERENCE;
    while((
iEntity FindEntityByClassname(iEntity"obj_dispenser")) != INVALID_ENT_REFERENCE)
        
SetEntityRenderColor(iEntity255255255_);
    while((
iEntity FindEntityByClassname(iEntity"obj_teleporter")) != INVALID_ENT_REFERENCE)
        
SetEntityRenderColor(iEntity255255255_);
    while((
iEntity FindEntityByClassname(iEntity"obj_sentry")) != INVALID_ENT_REFERENCE)
        
SetEntityRenderColor(iEntity255255255_);
}

public 
OnClientConnected(iClient)
{
    
g_iColor[iClient] = 0;
}

public 
Action:OnBuiltObject(Handle:hEvent, const String:strName[], bool:bDontBroadcast)
{
    new 
iClient GetClientOfUserId(GetEventInt(hEvent"userid"));
    if(!
IsValidClient(iClient) || !g_bEnabled)
        return 
Plugin_Continue;

    if(!
CheckCommandAccess(iClient"sm_buildingcolors"ADMFLAG_GENERIC))
        return 
Plugin_Continue;

    new 
iBuilding GetEventInt(hEvent"index");
    if(
IsValidEntityEx(iBuilding))
        
SetBuildingColor(iBuildingiClient);
    return 
Plugin_Continue;
}

// ====[ COMMANDS ]============================================================
public Action:BuildingColorsCmd(iClientiArgs)
{
    if(!
IsValidClient(iClient) || !g_bEnabled)
        return 
Plugin_Continue;

    new 
Handle:hMenu CreateMenu(BuildingColorsHandler);
    
SetMenuTitle(hMenu"Building Colors:");

    
AddMenuItem(hMenu"0""None");
    
AddMenuItem(hMenu"1""Black");
    
AddMenuItem(hMenu"2""Red");
    
AddMenuItem(hMenu"3""Green");
    
AddMenuItem(hMenu"4""Blue");
    
AddMenuItem(hMenu"5""Yellow");
    
AddMenuItem(hMenu"6""Purple");
    
AddMenuItem(hMenu"7""Cyan");
    
AddMenuItem(hMenu"8""Orange");
    
AddMenuItem(hMenu"9""Pink");
    
AddMenuItem(hMenu"10""Olive");
    
AddMenuItem(hMenu"11""Lime");
    
AddMenuItem(hMenu"12""Violet");
    
AddMenuItem(hMenu"13""Light Blue");
    
AddMenuItem(hMenu"14""Silver");
    
AddMenuItem(hMenu"15""Chocolate");
    
AddMenuItem(hMenu"16""Saddle Brown");
    
AddMenuItem(hMenu"17""Indigo");
    
AddMenuItem(hMenu"18""Ghost White");
    
AddMenuItem(hMenu"19""Thistle");
    
AddMenuItem(hMenu"20""Alice Blue");
    
AddMenuItem(hMenu"21""Steel Blue");
    
AddMenuItem(hMenu"22""Teal");
    
AddMenuItem(hMenu"23""Gold");
    
AddMenuItem(hMenu"24""Tan");
    
AddMenuItem(hMenu"25""Tomato");

    
DisplayMenu(hMenuiClientMENU_TIME_FOREVER);
    return 
Plugin_Handled;
}

public 
BuildingColorsHandler(Handle:hMenuMenuAction:iActioniParam1iParam2)
{
    if(
iAction == MenuAction_End)
        
CloseHandle(hMenu);

    if(
iAction == MenuAction_Select)
    {
        
decl String:strInfo[12];
        
GetMenuItem(hMenuiParam2strInfosizeof(strInfo));
        
g_iColor[iParam1] = StringToInt(strInfo);

        if(
g_bChange)
        {
            new 
iEntity INVALID_ENT_REFERENCE;
            while((
iEntity FindEntityByClassname(iEntity"obj_dispenser")) != INVALID_ENT_REFERENCE)
            {
                if(
GetEntPropEnt(iEntityProp_Send"m_hBuilder") == iParam1)
                    
SetBuildingColor(iEntityiParam1);
            }
            while((
iEntity FindEntityByClassname(iEntity"obj_teleporter")) != INVALID_ENT_REFERENCE)
            {
                if(
GetEntPropEnt(iEntityProp_Send"m_hBuilder") == iParam1)
                    
SetBuildingColor(iEntityiParam1);
            }
            while((
iEntity FindEntityByClassname(iEntity"obj_sentry")) != INVALID_ENT_REFERENCE)
            {
                if(
GetEntPropEnt(iEntityProp_Send"m_hBuilder") == iParam1)
                    
SetBuildingColor(iEntityiParam1);
            }
        }
    }
}

// ====[ STOCKS ]==============================================================
stock bool:IsValidClient(iClientbool:bReplay true)
{
    if(
iClient <= || iClient MaxClients || !IsClientInGame(iClient))
        return 
false;
    if(
bReplay && (IsClientSourceTV(iClient) || IsClientReplay(iClient)))
        return 
false;
    return 
true;
}

stock bool:IsValidEntityEx(iEntity)
{
    if(
iEntity <= MaxClients || !IsValidEntity(iEntity))
        return 
false;
    return 
true;
}

stock SetBuildingColor(iEntityiOwner)
{
    switch(
g_iColor[iOwner])
    {
        case 
1SetEntityRenderColor(iEntity000_);
        case 
2SetEntityRenderColor(iEntity25500_);
        case 
3SetEntityRenderColor(iEntity02550_);
        case 
4SetEntityRenderColor(iEntity00255_);
        case 
5SetEntityRenderColor(iEntity2552550_);
        case 
6SetEntityRenderColor(iEntity2550255_);
        case 
7SetEntityRenderColor(iEntity0255255_);
        case 
8SetEntityRenderColor(iEntity2551280_);
        case 
9SetEntityRenderColor(iEntity2550128_);
        case 
10SetEntityRenderColor(iEntity1282550_);
        case 
11SetEntityRenderColor(iEntity0255128_);
        case 
12SetEntityRenderColor(iEntity1280255_);
        case 
13SetEntityRenderColor(iEntity0128255_);
        case 
14SetEntityRenderColor(iEntity192192192_);
        case 
15SetEntityRenderColor(iEntity21010530_);
        case 
16SetEntityRenderColor(iEntity1396919_);
        case 
17SetEntityRenderColor(iEntity750130_);
        case 
18SetEntityRenderColor(iEntity248248255_);
        case 
19SetEntityRenderColor(iEntity216191216_);
        case 
20SetEntityRenderColor(iEntity240248255_);
        case 
21SetEntityRenderColor(iEntity70130180_);
        case 
22SetEntityRenderColor(iEntity0128128_);
        case 
23SetEntityRenderColor(iEntity2552150_);
        case 
24SetEntityRenderColor(iEntity210180140_);
        case 
25SetEntityRenderColor(iEntity2559971_);
    }

Attached Files
File Type: sp Get Plugin or Get Source (buildingcolors.sp - 315 views - 7.5 KB)

Last edited by ReFlexPoison; 06-22-2013 at 15:08.
ReFlexPoison is offline
prom3th3an
SourceMod Donor
Join Date: Jun 2010
Old 07-27-2013 , 04:58   Re: [TF2] Donator Building Colors
Reply With Quote #20

Could we get a non-BDI version that uses a single building colour for all buildings and stores the player's choice of colour in clientprefs
prom3th3an is offline
Reply



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

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

Forum Jump


All times are GMT -4. The time now is 16:41.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode