Raised This Month: $51 Target: $400
 12% 

Ghost Spec to enable trough chat


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
ArminC
Senior Member
Join Date: Apr 2016
Old 02-28-2018 , 06:12   Ghost Spec to enable trough chat
Reply With Quote #1

Right now this plugin is asking me after connect if I wana be a ghost after I die.. but actually I want just to activate it (without menu or automat asking).. simple saying /ghost and turn it off by saying again /ghost

Plugin: https://pastebin.com/wMRSLLqF

Thanks!

Last edited by ArminC; 02-28-2018 at 11:12.
ArminC is offline
ArminC
Senior Member
Join Date: Apr 2016
Old 02-28-2018 , 11:13   Re: Ghost Spec to enable trough chat
Reply With Quote #2

-- I removed the cvar thing.. Now I wana it just trough a command. Hope it's simpler..
ArminC is offline
Paltimus
Junior Member
Join Date: Feb 2018
Location: German - Bomb site A
Old 03-02-2018 , 21:20   Re: Ghost Spec to enable trough chat
Reply With Quote #3

try this ! not sure if will work but tell me the results ...

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <fun>

#define PLUGIN      "Ghost Spec"
#define VERSION     "1.5"
#define AUTHOR      "vato loco [GE-S]"

#define iRandomNum              random_num(0,255)
#define MENU_KEYS_GHOST         MENU_KEY_1|MENU_KEY_2
#define HUD_HIDE_FLAGS          1<<0 | 1<<1 | 1<<3 | 1<<4 | 1<<5 | 1<<6
#define SB_ATTRIB_DEAD          1<<0
#define MAX_LEN_LENGHT          100
#define GHOST_ORIGIN            3
#define XO_WEAPONS              4
#define XO_PLAYER               5
#define    m_iHideHUD                361
#define    m_iClientHideHUD        362
#define m_iRadiosLeft           192
#define m_pPlayer               41
#define m_flNextPrimaryAttack   46
#define m_flNextSecondaryAttack 47
#define IsPlayer(%1)            (1 <= %1 <= g_iMaxPlayers)

enum (+= 11111
{
    
TASK_CROSS 11111,     
    
TASK_SPAWN,       
    
TASK_STRIP,      
    
TASK_CACHE     
}

new 
szPluginInfoMsg[MAX_LEN_LENGHT]
new 
szGhostInfoMsg[MAX_LEN_LENGHT]
new 
g_Cross[] = "+"
new g_GhostModel[] = "ghost"
new const Float:VEC_DUCK_HULL_MIN[GHOST_ORIGIN] = {-16.0, -16.0, -18.0}
new const 
Float:VEC_DUCK_HULL_MAX[GHOST_ORIGIN] = {16.016.018.0}
new 
g_iEntPlayerModel[MAX_PLAYERS 1]                       
new 
g_iEntWeaponModel[MAX_PLAYERS 1]
new 
g_iIsSpectator[MAX_PLAYERS 1]
new 
Float:g_fSpwanPosition[MAX_PLAYERS 1][GHOST_ORIGIN]
new 
Float:g_fGhostPosition[MAX_PLAYERS 1][GHOST_ORIGIN]
new 
bool:g_bIsConnected[MAX_PLAYERS 1]
new 
bool:g_bIsAlive[MAX_PLAYERS 1]
new 
bool:g_bIsGhost[MAX_PLAYERS 1]
new 
bool:g_bIsBot[MAX_PLAYERS 1]
new 
bool:g_bAgree[MAX_PLAYERS 1]
new 
bool:g_bFirstSpwan[MAX_PLAYERS 1]
new 
bool:g_bRoundEnd
new bool:g_bBombIsPlanted
new Trie:g_tPlayerSound
new g_ScoreAttrib
new g_CurWeapon
new g_ClCorpse
new g_SyncCutomCross
new g_SyncPluginInfo
new g_SyncGhostInfo
new g_pCvar[8]
new 
g_iCachepCvar[8]
new 
g_iMaxPlayers

public plugin_init() 
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_menu("Ghost Menu"MENU_KEYS_GHOST "GhostMenuHandler")
    
register_clcmd("say /ghost""no_ghost");
    
register_clcmd("say /ghoston""ghost_on");
    
    
register_event("HLTV""ev_NewRound""a""1=0""2=0")
    
register_event("SpecHealth2""ev_SpecHealth2""bd")
    
register_logevent("ev_RoundEnd",2,"1=Round_End")
    
register_logevent("ev_FunctionP"3"2=Planted_The_Bomb")
    
    
RegisterHam(Ham_Weapon_PrimaryAttack"weapon_knife""fw_KnifePrimaryAttack")
    
RegisterHam(Ham_Weapon_SecondaryAttack"weapon_knife""fw_KnifeSecondaryAttack")
    
RegisterHam(Ham_Touch"weaponbox""fw_WeaponTouch")
    
RegisterHam(Ham_Touch"armoury_entity""fw_WeaponTouch")
    
RegisterHam(Ham_Touch"weapon_shield""fw_WeaponTouch")
    
RegisterHam(Ham_Player_PreThink"player""fw_PreThink_Post"1)
    
RegisterHam(Ham_Spawn"player""fw_PlayerSpawn"1)
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled"1)
    
    
register_forward(FM_ClientKill,"fw_ClientKill")
    
register_forward(FM_AddToFullPack"fw_AddToFullPack_Post"1)
    
register_forward(FM_CmdStart"fw_CmdStart")
    
register_forward(FM_EmitSound"fw_EmitSound")
    
    
register_clcmd("radio1""BlockCmd")
    
register_clcmd("radio2""BlockCmd")
    
register_clcmd("radio3""BlockCmd")
    
    
g_pCvar[0] = register_cvar("ghost_spawn""1")
    
g_pCvar[1] = register_cvar("ghost_noclip""0")
    
g_pCvar[2] = register_cvar("ghost_kill""1")
    
g_pCvar[3] = register_cvar("ghost_visible""0")
    
g_pCvar[4] = register_cvar("ghost_sound""1")
    
g_pCvar[5] = register_cvar("ghost_menu""1")
    
g_pCvar[6] = register_cvar("ghost_respawn_delay""1.5")
    
g_pCvar[7] = register_cvar("ghost_effect""0")
    
    
g_ScoreAttrib get_user_msgid("ScoreAttrib")
    
g_CurWeapon get_user_msgid("CurWeapon")
    
g_ClCorpse get_user_msgid("ClCorpse")
    
register_message(g_ClCorpse"MsgClCorpse")
    
register_message(g_ScoreAttrib"MsgScoreAttrib")
    
register_messageg_CurWeapon"MsgCurWeapon")
    
set_msg_block(g_ClCorpseBLOCK_SET)
    
    
g_SyncCutomCross CreateHudSyncObj()
    
g_SyncPluginInfo CreateHudSyncObj()
    
g_SyncGhostInfo CreateHudSyncObj()
    
g_iMaxPlayers get_maxplayers()
    
    new const 
g_iPlayerSound[][] = {
    
/*
        "items/gunpickup2.wav",
        "player/death6.wav", 
        "player/die1.wav",
        "player/die2.wav", 
        "player/die3.wav",
        "player/bhit_kevlar-1.wav", 
        "player/bhit_flesh-1.wav",
        "player/bhit_flesh-2.wav", 
        "player/bhit_flesh-3.wav",
        "player/pl_wade1.wav",
        "player/pl_wade2.wav"
    }
    g_tPlayerSound = TrieCreate()
    for(new i = 0; i < sizeof(g_iPlayerSound); i++)
    {
        TrieSetCell(g_tPlayerSound , g_iPlayerSound[i], i)
    }
    */
    
formatex(szPluginInfoMsgsizeof szPluginInfoMsg 1"ZM.ArminC.Tk")
    
formatex(szGhostInfoMsgsizeof szGhostInfoMsg 1"You are a ghost until the round end!")
    
set_task(1.0"CustomCross"TASK_CROSS__"b")
}

public 
plugin_cfg()
{
    
set_task(0.5"CacheCvars"TASK_CACHE)
}

public 
plugin_precache() 
{
    new 
modelpath[100]
    
formatex(modelpathsizeof modelpath -1"models/player/%s/%s.mdl"g_GhostModelg_GhostModel)
    
precache_model(modelpath)
}

public 
client_putinserver(id
{
    
g_bIsAlive[id] = false
    g_bIsConnected
[id] = true
    g_bIsGhost
[id] = false
    g_bAgree
[id] = true
    g_bFirstSpwan
[id] = true
    g_bIsBot
[id] = bool:is_user_bot(id)
    
g_iIsSpectator[id] = 0
}

public 
no_ghost(id)
{
    
g_bAgree[id] = false;
    
client_print(id,"you will not be ghost after death ! you can re-activated by < say /ghoston>");
}

public 
ghost_on(id)
{
    
g_bAgree[id] = true;
}

public 
client_disconnected(id)
{
    if(
g_bIsGhost[id])
    {
        
fm_reset_user_model(id)    
    }
    
g_bIsAlive[id] = false
    g_bIsConnected
[id] = false
    g_bIsGhost
[id] = false
    g_bIsBot
[id] = false
    g_bAgree
[id] = true
    g_bFirstSpwan
[id] = true
    g_iIsSpectator
[id] = 0
    
    
if(!IsAlive(CS_TEAM_CT) || !IsAlive(CS_TEAM_T) && !g_bBombIsPlanted)
    {
        
ForceRoundEnd()
    }
}

public 
ev_FunctionP()
{
    
g_bBombIsPlanted true
}

public 
ev_SpecHealth2(id)
{
    
g_iIsSpectator[id] = read_data(2)
}

public 
ev_NewRound()
{
    
g_bRoundEnd false
    g_bBombIsPlanted 
false
    CacheCvars
()
    
    for(new 
1<= g_iMaxPlayersi++) 
    {
        if(
g_bIsConnected[i])
        {
            
remove_task(TASK_SPAWN)
            
            if(
g_bIsGhost[i])
            {
                
cs_set_user_deaths(ics_get_user_deaths(i) - 1)
                
set_pdata_int(im_iClientHideHUD0)
                
set_pdata_int(im_iHideHUD0)
                
set_pev(ipev_movetypeMOVETYPE_WALK)
                
set_pev(ipev_takedamageDAMAGE_AIM)
                
set_user_footsteps(i0)
                
fm_reset_user_model(i)
                
set_user_rendering(i)
            }
            
g_bIsGhost[i] = false
        
}
    }
}

public 
ev_RoundEnd()
{
    if(!
g_bRoundEnd)
    {
        
ForceRoundEnd()
    }
}

public 
fw_PlayerSpawn(id
{
    if(
is_user_alive(id))
    {
        
g_bIsAlive[id] = true
        g_iIsSpectator
[id] = 0
        pev
(idpev_origing_fSpwanPosition[id])
        
        if(
g_bIsGhost[id])
        {
            
StripWeapons(id)
            
SetUserGhost(id)
        }
        if(
g_iCachepCvar[5] && g_bFirstSpwan[id] && !g_bIsBot[id])
        {
            
GhostAgreeMenu(id)
        }
        
g_bFirstSpwan[id] = false
    
}
}

public 
fw_PlayerKilled(id
{
    
g_bIsAlive[id] = false
    
    
if(!g_bRoundEnd)
    {
        if(!
IsAlive(CS_TEAM_CT) || !IsAlive(CS_TEAM_T) && !g_bBombIsPlanted)
        {
            
ForceRoundEnd()
            return
        }
        if(
g_bIsGhost[id] && !g_iCachepCvar[2] && !g_bRoundEnd)
        {
            
g_fGhostPosition[id] = g_fSpwanPosition[id]
            
set_task(float(g_iCachepCvar[6]), "RespawnGhost"id TASK_SPAWN)
        }
        if(!
g_bIsGhost[id] && !g_bIsBot[id] && g_bAgree[id] && !g_bRoundEnd)
        {
            new 
CsTeams:iTeam cs_get_user_team(id)
            if(
iTeam == CS_TEAM_T || iTeam == CS_TEAM_CT)
            {
                if(
g_iCachepCvar[0])
                {
                    
pev(idpev_origing_fGhostPosition[id])
                }
                
set_task(float(g_iCachepCvar[6]), "RespawnGhost"id TASK_SPAWN)
            }
        }
    }
    else if(
g_bIsGhost[id])
    {
        
fm_reset_user_model(id)
    }


public 
RespawnGhost(id)
{
    
id -= TASK_SPAWN
    
    
if(!g_bRoundEnd)
    {
        
g_bIsGhost[id] = true
        ExecuteHamB
(Ham_CS_RoundRespawnid)
    }
}

public 
fw_KnifePrimaryAttack(iEnt)
{
    new 
id get_pdata_cbase(iEntm_pPlayerXO_WEAPONS)
    if(
g_bIsGhost[id])
    {
        
set_pdata_float(iEntm_flNextPrimaryAttack20.0XO_WEAPONS)
        return 
HAM_SUPERCEDE
    

    return 
HAM_IGNORED
}

public 
fw_KnifeSecondaryAttack(iEnt)
{
    new 
id get_pdata_cbase(iEntm_pPlayerXO_WEAPONS)
    if(
g_bIsGhost[id])
    {
        
set_pdata_float(iEntm_flNextSecondaryAttack20.0XO_WEAPONS)
        return 
HAM_SUPERCEDE
    

    return 
HAM_IGNORED
}

public 
fw_WeaponTouch(iEntid)
{
    return (
IsPlayer(id) && g_bIsGhost[id]) ? HAM_SUPERCEDE HAM_IGNORED
}

public 
fw_CmdStart(iducseed
{
    if(
g_bIsGhost[id]) 
    {
        new 
Buttons get_uc(ucUC_Buttons
        new 
Impulse get_uc(ucUC_Impulse)
        
        if(
Buttons IN_USE
        {     
            
Buttons &= ~IN_USE     
            set_uc
(ucUC_ButtonsButtons
        }
        if(
Impulse == 100 || Impulse == 201
        { 
            
set_uc(ucUC_Impulse0)
            return 
FMRES_HANDLED
        
}
    }
    return 
FMRES_IGNORED
}

public 
fw_EmitSound(idchannel, const sound[]) 
{
    if(
TrieKeyExists(g_tPlayerSoundsound))
    {
        if(
g_bIsGhost[id])
        {
            return 
FMRES_SUPERCEDE
        
}
    }
    return 
FMRES_IGNORED
}

public 
fw_ClientKill(id)
{
    return 
g_bIsGhost[id] ? FMRES_SUPERCEDE FMRES_IGNORED
}

public 
CustomCross()
{
    for(new 
1<= g_iMaxPlayersi++) 
    {
        if(
g_bIsAlive[i] && g_bIsGhost[i])
        {
            
ShowCustomSync(ig_SyncCutomCrossg_CrossiRandomNumiRandomNumiRandomNum, -1.01)
            
ShowCustomSync(ig_SyncGhostInfoszGhostInfoMsgiRandomNumiRandomNumiRandomNum0.042)
            
ShowCustomSync(ig_SyncPluginInfoszPluginInfoMsg2555000.953)
        }
    }
}

public 
MsgScoreAttrib()
{
    new 
id get_msg_arg_int(1)
    
    if(
g_bIsGhost[id])
    {
        
set_msg_arg_int(2ARG_BYTESB_ATTRIB_DEAD)
    }
}

public 
MsgCurWeapon(MsgidDestid)
{
    if(
g_bIsAlive[id] && g_bIsGhost[id])
    {
        
fm_set_user_weaponmodel(id)
        
        static 
iWeapon
        
if(get_msg_arg_int(1))
        {
            
iWeapon get_msg_arg_int(2)
            if(
iWeapon != CSW_KNIFE)
            {
                
set_task(0.2"StripWeapons"id TASK_STRIP)
            }
        }
    }
}

public 
MsgClCorpse() 
{
    static 
idid get_msg_arg_int(12)
    
    if(
g_bIsAlive[id] && g_bIsGhost[id]) 
    {
        
set_msg_arg_string(1g_GhostModel)
    }
}

public 
StripWeapons(id)
{
    new 
pid id TASK_STRIP id id TASK_STRIP
    
    
if(g_bIsAlive[pid] && g_bIsGhost[pid])
    {
        
strip_user_weapons(pid)
        
give_item(pid"weapon_knife")
    }
}

public 
BlockCmd(id)
{
    return 
g_bIsGhost[id] ? PLUGIN_HANDLED PLUGIN_CONTINUE


public 
fw_PreThink_Post(id)
{
    if(!
g_bIsAlive[id])
        return
    
    static 
i
    
for(1<= g_iMaxPlayersi++)
    {
        if(
g_bIsGhost[id] != g_bIsGhost[i] || g_bIsGhost[id] && !g_bIsGhost[i])
        {
            if(
g_bIsAlive[i])
            {
                
set_pev(ipev_solidSOLID_NOT)
            }
        }
    }
}

public 
client_PostThink(id)
{
    if(!
g_bIsAlive[id])
        return
    
    static 
i
    
for(1<= g_iMaxPlayersi++)
    {
        if(
id != i)
        {    
            if(
g_bIsAlive[i] && !g_bIsGhost[i])
            {
                
set_pev(ipev_solidSOLID_SLIDEBOX)
            }
        }
    }
}

public 
fw_AddToFullPack_Post(eseenthosthostflagsplayerpSet
{
    if(!
get_orig_retval() || !g_bIsAlive[host] && !g_iIsSpectator[host])
    {
        return 
FMRES_IGNORED
    
}
    if(
player
    {
        if(
host != ent)
        {
            
set_es(esES_SolidSOLID_NOT)
            
            if(
g_bIsGhost[ent])
            {
                
set_es(esES_RenderModekRenderTransAlpha)
                
set_es(esES_RenderAmt0)
                
                if(!
g_iCachepCvar[3] && !g_bIsGhost[host])
                {
                    
set_es(esES_Effectsget_es(esES_Effects) | EF_NODRAW)
                    
set_es(esES_OriginFloat:{99999.9,99999.9,99999.9})
                }
            }
        }
    }
    else
    {
        static 
owner owner pev(entpev_owner)
        if(
IsPlayer(owner) && (ent == g_iEntPlayerModel[owner] || ent == g_iEntWeaponModel[owner]))
        {    
            
set_es(esES_SolidSOLID_NOT)
            
set_es(esES_RenderFxg_iCachepCvar[7] ? kRenderFxDistort kRenderFxHologram)
            
set_es(esES_RenderModekRenderTransAdd)
            
set_es(esES_RenderAmt175)
        }
    }
    return 
FMRES_IGNORED
}

public 
CacheCvars()
{
    
g_iCachepCvar[0] = get_pcvar_num(g_pCvar[0])
    
g_iCachepCvar[1] = get_pcvar_num(g_pCvar[1])
    
g_iCachepCvar[2] = get_pcvar_num(g_pCvar[2])
    
g_iCachepCvar[3] = get_pcvar_num(g_pCvar[3])
    
g_iCachepCvar[4] = get_pcvar_num(g_pCvar[4])
    
g_iCachepCvar[5] = get_pcvar_num(g_pCvar[5])
    
g_iCachepCvar[6] = get_pcvar_num(g_pCvar[6])
    
g_iCachepCvar[7] = get_pcvar_num(g_pCvar[7])
}

public 
GhostAgreeMenu(id)
{    
    static 
menu[512]
    
    new 
len formatex(menusizeof menu -1,"\r Do you want to respawn as a ghost after you die?^n")
    
len += formatex(menu[len], sizeof menu --len,"\w1. Yes^n")
    
len += formatex(menu[len], sizeof menu --len,"\w2. No")
    
    
show_menu(idMENU_KEYS_GHOST menu, -1)
}

public 
GhostMenuHandler(idkey
{
    switch(
key
    {
        case 
0g_bAgree[id] = true
            
        
case 1g_bAgree[id] = false
            
    
}
}

SetUserGhost(id

    
set_pdata_int(idm_iRadiosLeft0XO_PLAYER)
    
set_pdata_int(idm_iClientHideHUD0)
    
set_pdata_int(idm_iHideHUDHUD_HIDE_FLAGS)
    if(
g_iCachepCvar[0])
    {
        
engfunc(EngFunc_SetOriginidg_fGhostPosition[id])
        
set_pev(idpev_velocityFloat:{0.0,0.0,0.0})
        
SetUserDuck(id)
    }
    if(
g_iCachepCvar[1])
    {
        
set_pev(idpev_movetypeMOVETYPE_NOCLIP)
    }
    
set_pev(idpev_solidSOLID_NOT)
    
set_pev(idpev_takedamageDAMAGE_NO)
    
set_user_footsteps(id1)
    if(
g_iCachepCvar[4])
    {
        
client_cmd(id,"spk ambience/thunder_clap.wav")
    }
    
fm_set_user_model(idg_GhostModel)
}

SetUserDuck(id
{
    
set_pev(idpev_flagspev(idpev_flags) | FL_DUCKING)
    
engfuncEngFunc_SetSizeidVEC_DUCK_HULL_MINVEC_DUCK_HULL_MAX)
}

IsAlive(CsTeams:iTeam
{
    new 
iAliveNum 
    
    
for(new 1<= g_iMaxPlayersi++) 
    {
        if(
g_bIsAlive[i] && cs_get_user_team(i) == iTeam && !g_bIsGhost[i])
        {
            
iAliveNum++ 
        }
    }
    return 
iAliveNum 
}

ForceRoundEnd() 

    
g_bRoundEnd true
    
    
for(new 1<= g_iMaxPlayersi++) 
    {
        if(
g_bIsAlive[i] && g_bIsGhost[i])
        {
            
set_pev(ipev_takedamageDAMAGE_AIM)
            
set_pev(ipev_movetypeMOVETYPE_WALK)
            
user_silentkill(i)
        }
    }
}

fm_set_user_model(id, const model[]) 
{
    
set_pev(idpev_rendermodekRenderTransTexture)
    
set_pev(idpev_renderamt1.0)
    
    static 
modelpath[100]
    
formatex(modelpathsizeof modelpath -1"models/player/%s/%s.mdl"modelmodel)
    
    if(!
pev_valid(g_iEntPlayerModel[id])) 
    {
        
g_iEntPlayerModel[id] = engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"))
        
        if(!
pev_valid(g_iEntPlayerModel[id])) return
        
        
set_pev(g_iEntPlayerModel[id], pev_classname"ent_playermodel")
        
set_pev(g_iEntPlayerModel[id], pev_movetypeMOVETYPE_FOLLOW)
        
set_pev(g_iEntPlayerModel[id], pev_aimentid)
        
set_pev(g_iEntPlayerModel[id], pev_ownerid)
    }
    
engfunc(EngFunc_SetModelg_iEntPlayerModel[id], modelpath)
}

fm_set_user_weaponmodel(id
{
    static 
model[100]
    
pev(idpev_weaponmodel2modelsizeof model -1)
    
    if(!
pev_valid(g_iEntWeaponModel[id])) 
    {
        
g_iEntWeaponModel[id] = engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"))
        
        if (!
pev_valid(g_iEntWeaponModel[id])) return
        
        
set_pev(g_iEntWeaponModel[id], pev_classname"ent_weaponmodel")
        
set_pev(g_iEntWeaponModel[id], pev_movetypeMOVETYPE_FOLLOW)
        
set_pev(g_iEntWeaponModel[id], pev_aimentid)
        
set_pev(g_iEntWeaponModel[id], pev_ownerid)
    }
    
engfunc(EngFunc_SetModelg_iEntWeaponModel[id], model)
}

fm_reset_user_model(id
{
    if(
pev_valid(g_iEntPlayerModel[id])) 
    {
        
engfunc(EngFunc_RemoveEntityg_iEntPlayerModel[id])
        
g_iEntPlayerModel[id] = 0
    
}
    if(
pev_valid(g_iEntWeaponModel[id])) 
    {
        
engfunc(EngFunc_RemoveEntityg_iEntWeaponModel[id])
        
g_iEntWeaponModel[id] = 0
    
}
}

ShowCustomSync(idSyncTypeMsg[], RedGreenBlueFloat:yPosChannel
{
    
set_hudmessage(RedGreenBlue, -1.0yPos__2.0_,  _Channel)
    
ShowSyncHudMsg(idSyncTypeMsg)

Paltimus 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 18:14.


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