MMOwned - World of Warcraft Exploits, Hacks, Bots and Guides

Homepage Register FAQ Members Mark Forums Read Advertise Marketplace FPSowned


Go Back   MMOwned - World of Warcraft Exploits, Hacks, Bots and Guides > Programming > Server side > ASP & ASP.NET
Reload this Page The diary of MMOwned Radio
ASP & ASP.NET Discussions about ASP & ASP.NET

Reply
 
LinkBack Thread Tools
The diary of MMOwned Radio
(#1)
Old
Apoc's Avatar
Apoc is Offline
c|_| My care cup is empty
Legendary User
Rep Power: 5
Reputation: 617
Apoc is a name known to allApoc is a name known to allApoc is a name known to allApoc is a name known to allApoc is a name known to allApoc is a name known to all
 
Posts: 625
Join Date: Jan 2008
The diary of MMOwned Radio - 07-12-2008

Since there aren't any ASP(.NET) threads yet, I guess I'll kick it off with my trek through creating a web based radio. This will be a sort of tutorial/diary type thing.

Some things this radio will have:
  • You will be able to upload songs and have them played! (I've got 5TB of space just for music, so feel free to upload all you want)
  • You'll be able to see all the songs in the current playlist, as well as browse songs within the folder I've setup for this little service.
  • You'll be able to "tag" songs, and sort by genre (hopefully).
  • You'll be able to remove any songs you've uploaded yourself. (Nobody else can remove the songs, besides admins, or myself for the time being)
  • There will be an event calendar, so everyone knows about special events coming up on the MMOwned Radio.
  • You will be able to request songs to play. You will be able to request up to 5 songs per hour. (Unless that limit is lifted of course)
  • You will have your own separate accounts. (Not tied to MMOwned in any way, unless you really want them to be.)
  • There will be a GUI (kinda) showing the currently playing song, time left, time elapsed, etc. All the nifty stuff you like about most music players. You will also see the normal Play, Pause, Stop, FF, RW, etc buttons. (These will be disabled for normal users however)
  • You will be able to save "personal playlists" which may be picked at any random point in time and played. (Might be tied to an event, I.E, every Saturday night is members DJ night.)


Some internal things:
  • It uses Winamp, and outputs to Ventrilo. (Maybe SHOUTcast later)
  • There may be streaming music through the web as well.
  • It will be hosted at MMOwnedRadio.com (when I finish setting up IIS to support some things and get security tight)
  • Downloading will NOT be available. (This will lag people like crazy, and I don't think my little junker file store PC can handle the download requests)

It will be coded in ASP.NET 3.5, AJAX Futures, and Silverlight. (FF 3 users will need to download Silverlight 2 Beta 2 to actually be able to view Silverlight with Firefox)

It's also hosted by yours truly, so you can whine about speeds to someone else. I will have it capped so I don't burn all my connection speed. (It will be limited to 20mb/s down - 10mb/s up, should be able to stream and host other things with that much bandwith easily)


Now that all that's out of the way, let's get started.

I personally don't use Microsoft Web Developer (Their ASP.NET dedicated IDE). I prefer good old Visual Studio 2008 Team Suite. It has all the same stuff, and then some.

First things first, we need a way to wrap common Winamp functions in .NET. This next snippet is mostly from a few people on codeproject, and edited by myself to make it a bit more... less retarded.

Code:
    /// <summary>
    /// A .NET wrapper for common winamp controls.
    /// </summary>
    public class Winamp
    {
        #region DLL Imports

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName,
                                               [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowText(IntPtr hwnd, string lpString, int cch);

        [DllImport("user32")]
        public static extern int GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

        [DllImport("Kernel32.dll")]
        public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, UInt32 nSize,
                                                    ref UInt32 lpNumberOfBytesRead);

        [DllImport("Kernel32.dll", SetLastError = true)]
        public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, bool bInheritHandle, UInt32 dwProcessId);

        [DllImport("KERNEL32.DLL")]
        public static extern int CloseHandle(int handle);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, uint lParam);

        #endregion

        #region Winamp-specific Constants

        // We have to define the Winamp class name
        private const string m_windowName = "Winamp v1.x";

        // Useful for GetSongTitle() Method
        private const string strTtlEnd = " - Winamp";

        #endregion

        private static int eqPosition;
        public static IntPtr hWnd = FindWindow("Winamp v1.x", null);
        public static Process WinAmpProcess = Process.GetProcessesByName("Winamp")[0];

        #region Other useful Winamp Methods

        /// <summary>
        /// Gets the current song title.
        /// </summary>
        /// <returns></returns>
        public static string GetCurrentSongTitle()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);

            if (hwnd.Equals(IntPtr.Zero))
            {
                return "N/A";
            }

            string lpText = new string((char) 0, 100);
            int intLength = GetWindowText(hwnd, lpText, lpText.Length);

            if ((intLength <= 0) || (intLength > lpText.Length))
            {
                return "N/A";
            }

            string strTitle = lpText.Substring(0, intLength);
            return strTitle.Replace(strTtlEnd, string.Empty).Trim();
        }

        #endregion

        #region WM_COMMAND Type Methods

        /// <summary>
        /// Stops winamp.
        /// </summary>
        public static void Stop()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.StopSong,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Plays  winamp.
        /// </summary>
        public static void Play()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.PlaySong,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Pauses  winamp.
        /// </summary>
        public static void Pause()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.PauseUnpause,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Moves winamp to the previous track.
        /// </summary>
        public static void PrevTrack()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.PreviousTrack,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Moves winamp to the next track.
        /// </summary>
        public static void NextTrack()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.NextTrack,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Turns winamp's volume up.
        /// </summary>
        public static void VolumeUp()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.VolumeUp,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Turns winamp's volume down.
        /// </summary>
        public static void VolumeDown()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.VolumeDown,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Fast forwards 5 seconds.
        /// </summary>
        public static void Forward5Sec()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.FastForwardFive,
                         (uint) Command.Nothing);
        }

        /// <summary>
        /// Rewinds 5 seconds.
        /// </summary>
        public static void Rewind5Sec()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmCommand, (int) Command.RewindFive,
                         (uint) Command.Nothing);
        }

        #endregion

        #region WM_USER (WM_WA_IPC) Type Methods

        /// <summary>
        /// Gets the playback status.
        /// </summary>
        /// <value>The playback status.</value>
        public static int PlaybackStatus
        {
            get
            {
                IntPtr hwnd = FindWindow(m_windowName, null);
                return SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing, isPlaying);
            }
        }

        /// <summary>
        /// Gets the winamp version.
        /// </summary>
        /// <value>The winamp version.</value>
        public static int WinampVersion
        {
            get
            {
                IntPtr hwnd = FindWindow(m_windowName, null);
                return SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing,
                                    getVersion);
            }
        }

        /// <summary>
        /// Gets or sets the playlist position.
        /// </summary>
        /// <value>The playlist position.</value>
        public static int PlaylistPosition
        {
            get
            {
                IntPtr hwnd = FindWindow(m_windowName, null);
                return SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing,
                                    getPlaylistPosition);
            }
            set
            {
                IntPtr hwnd = FindWindow(m_windowName, null);
                SendMessageA(hwnd, (int) Command.WmWaIpc, value, setPlaylistPos);
            }
        }

        /// <summary>
        /// Gets the track position. (In milliseconds)
        /// </summary>
        /// <value>The track position.</value>
        public static int TrackPosition
        {
            get
            {
                IntPtr hwnd = FindWindow(m_windowName, null);
                return SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing,
                                    getOutputTime);
            }
        }

        /// <summary>
        /// Gets the track count of the playlist
        /// </summary>
        /// <value>The track count.</value>
        public static int TrackCount
        {
            get
            {
                IntPtr hwnd = FindWindow(m_windowName, null);
                return SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing,
                                    getPlaylistLength);
            }
        }

        /// <summary>
        /// Deletes the current playlist.
        /// </summary>
        public static void DeleteCurrentPlaylist()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing, clearPlaylist);
        }

        /// <summary>
        /// Saves the playlist.
        /// </summary>
        public static void SavePlaylist()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, (int) Command.Nothing, writePlaylist);
        }

        /// <summary>
        /// Jumps to a position (in milliseconds) on the current track.
        /// </summary>
        /// <param name="position">The position.</param>
        public static void JumpToTrackPosition(int position)
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, position, jumpToTime);
        }

        /// <summary>
        /// Sets the volume. (0 - 255)
        /// </summary>
        /// <param name="position">The position.</param>
        public static void SetVolume(int position)
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, position, setVolume);
        }

        /// <summary>
        /// Sets the panning. (0 (left) - 255 (right))
        /// </summary>
        /// <param name="position">The position.</param>
        public static void SetPanning(int position)
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, position, setPanning);
        }

        /// <summary>
        /// Returns info about the current playing song. (KB rate, etc)
        /// </summary>
        /// <param name="mode">The mode.</param>
        public static void GetTrackInfo(int mode)
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, mode, getCurrentTrackInfo);
        }

        public static void GetEqData(int position)
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            eqPosition = SendMessageA(hwnd, (int) Command.WmWaIpc, position, getEquilizerData);
        }

        public static int SetEqData()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            SendMessageA(hwnd, (int) Command.WmWaIpc, eqPosition, setEquilizerData);
            return eqPosition;
        }

        #endregion

        private static string readStringFromWinampMemory(int winampMemoryAddress)
        {
            string str = "";
            IntPtr handle = OpenProcess(0x0010, false, (uint) WinAmpProcess.Id);
            byte[] buff = new byte[500];
            uint ret = new UInt32();
            IntPtr pos = new IntPtr(winampMemoryAddress);
            int stringLength = 500; // Max length, if the buffer doesn't contain 0x00
            if (ReadProcessMemory(handle, pos, buff, 500, ref ret))
            {
                for (int i = 0; i < stringLength; i++)
                {
                    if (buff[i] != 0x00)
                    {
                        continue;
                    }
                    stringLength = i; // Store length
                    break;
                }
                Encoding encoding = Encoding.Default;
                str = encoding.GetString(buff, 0, stringLength); // Encode from start to 0x00
            }
            return str;
        }

        public static string[] GetPlaylist()
        {
            int len = SendMessage(hWnd, (int) WA_IPC.WM_WA_IPC, 0, (uint) WA_IPC.IPC_GETLISTLENGTH);
            string[] listNames = new string[len];
            for (int i = 0; i < len; i++)
            {
                listNames[i] =
                    readStringFromWinampMemory(SendMessage(hWnd, (int) WA_IPC.WM_WA_IPC, i,
                                                           (uint) WA_IPC.IPC_GETPLAYLISTTITLE));
            }
            return listNames;
        }

        #region Nested type: Command

        /// <summary>
        /// Enum of constants used for Winamp commands
        /// </summary>
        private enum Command
        {
            /// <summary>
            /// 
            /// </summary>
            Nothing = 0,
            /// <summary>
            /// To tell Winamp that we are sending it a WM_COMMAND, it needs this value.
            /// </summary>
            WmCommand = 0x111,
            /// <summary>
            /// To tell Winamp that we are sending it a WM_USER (WM_WA_IPC) it needs this value.
            /// </summary>
            WmWaIpc = 0x0400,
            /// <summary>
            /// Opens the Preferences menu
            /// </summary>
            TogglePreferencesMenu = 40012,
            /// <summary>
            /// Toggles the Always On Top option
            /// </summary>
            ToggleAlwaysOnTop = 40019,
            /// <summary>
            /// Opens the Load File(s) menu
            /// </summary>
            ToggleLoadFileMenu = 40029,
            /// <summary>
            /// Opens the EQ menu.
            /// </summary>
            ToggleEquilizerMenu = 40036,
            /// <summary>
            /// Opens the playlist menu
            /// </summary>
            TogglePlaylistMenu = 40040,
            /// <summary>
            /// Opens the About box
            /// </summary>
            OpenAboutBox = 40041,
            /// <summary>
            /// Plays the previous track
            /// </summary>
            PreviousTrack = 40044,
            /// <summary>
            /// Plays the selected track
            /// </summary>
            PlaySong = 40045,
            /// <summary>
            /// Pauses/unpauses the current track
            /// </summary>
            PauseUnpause = 40046,
            /// <summary>
            /// Stops playing the current track
            /// </summary>
            StopSong = 40047,
            /// <summary>
            /// Plays the next track
            /// </summary>
            NextTrack = 40048,
            /// <summary>
            /// Turns the volume up
            /// </summary>
            VolumeUp = 40058,
            /// <summary>
            /// Turns the volume down
            /// </summary>
            VolumeDown = 40059,
            /// <summary>
            /// Fast forwards 5 seconds
            /// </summary>
            FastForwardFive = 40060,
            /// <summary>
            /// Rewinds 5 seconds
            /// </summary>
            RewindFive = 40061,
            /// <summary>
            /// Fast-rewind 5 seconds
            /// </summary>
            RewindFastFive = 40144,
            Button2Shift = 40145,
            Button3Shift = 40146,
            /// <summary>
            /// Stop after current track
            /// </summary>
            StopAfterCurrent = 40147,
            /// <summary>
            /// Fast forward 5 seconds
            /// </summary>
            FastForwardFive2 = 40148,
            /// <summary>
            /// Go to the start of the playlist
            /// </summary>
            GoToStartOfPlaylist = 40154,
            /// <summary>
            /// Open URL dialog
            /// </summary>
            ToggleURLDialog = 40155,
            Button3Ctrl = 40156,
            /// <summary>
            /// Fadeout and stop
            /// </summary>
            FadeoutAndStop = 40157,
            /// <summary>
            /// Go to the end of the playlist
            /// </summary>
            GoToEndOfPlaylist = 40158,
            /// <summary>
            /// Opens the load directory box
            /// </summary>
            ToggleLoadDirectoryMenu = 40187,
            /// <summary>
            /// Starts playing the audio CD in the first CD reader
            /// </summary>
            PlayFirstCDDrive = 40323,
            /// <summary>
            /// Starts playing the audio CD in the second CD reader
            /// </summary>
            PlaySecondCDDrive = 40323,
            /// <summary>
            /// Starts playing the audio CD in the third CD reader
            /// </summary>
            PlayThirdCDDrive = 40323,
            /// <summary>
            /// Starts playing the audio CD in the fourth CD reader
            /// </summary>
            PlayFourthCDDrive = 40323
        }

        #endregion

        #region Nested type: WA_IPC

        private enum WA_IPC
        {
            WM_WA_IPC = 1024,
            IPC_GETLISTLENGTH = 124,
            IPC_SETPLAYLISTPOS = 121,
            IPC_GETLISTPOS = 125,
            IPC_GETPLAYLISTFILE = 211,
            IPC_GETPLAYLISTTITLE = 212
        }

        #endregion

        #region WM_USER (WM_WA_IPC) Type Constants

        // typically (but not always) use 0x1zyx for 1.zx versions
        /// <summary>
        /// Clears Winamp's playlist.
        /// </summary>
        private const int clearPlaylist = 101;

        /// <summary>
        /// Returns info about the current playing song (about Kb rate)
        /// </summary>
        private const int getCurrentTrackInfo = 126;

        /// <summary>
        ///  Queries the status of the EQ. The value it returns depends on what 'position' is set to.
        /// </summary>
        private const int getEquilizerData = 127;

        /// <summary>
        /// Returns the position in milliseconds of the current track
        /// </summary>
        private const int getOutputTime = 105;

        /// <summary>
        /// Returns the length of the current playlist in tracks
        /// </summary>
        private const int getPlaylistLength = 124;

        /// <summary>
        /// Returns the playlist position.
        /// </summary>
        private const int getPlaylistPosition = 125;

        /// <summary>
        /// Returns Winamp version (0x20yx for winamp 2.yx)
        /// </summary>
        private const int getVersion = 0;

        /// <summary>
        /// Returns status of playback. Returns: 1 = playing, 3 = paused, 0 = not playing) current song (mode = 0), 
        /// or the song length, in seconds (mode = 1). 
        /// It returns: -1 if not playing or if there is an error.
        /// </summary>
        private const int isPlaying = 104;

        /// <summary>
        /// Sets the appoximate position in milliseconds of the current song
        /// </summary>
        private const int jumpToTime = 106;

        /// <summary>
        /// Sets the value of the last position retrieved by IPC_GETEQDATA (integer eqPosition)
        /// </summary>
        private const int setEquilizerData = 128;

        /// <summary>
        /// Sets the panning of Winamp (from 0 (left) to 255 (right))
        /// </summary>
        private const int setPanning = 123;

        /// <summary>
        /// Sets the playlist position
        /// </summary>
        private const int setPlaylistPos = 121;

        /// <summary>
        /// Sets the volume of Winamp (from 0-255)
        /// </summary>
        private const int setVolume = 122;

        /// <summary>
        /// Writes the current playlist to <winampdir>Winamp.m3u
        /// </summary>
        private const int writePlaylist = 120;

        #endregion
    }
Phew, that's alot of code.

That will allow you to control most of the features in Winamp directly from any .NET program (or web page in this case)

Now, open up your favorite ASP IDE, and create a new ASP web site. (You should get a Default.aspx and some other files and folders, we want these.)


(Note, I've already added the Winamp class to the project, and another class that we'll get into later.)

Next up, lets get some content on our page. We'll start with the general overview page. (Default.aspx) All we're going to add on this page, are a few status things, and some links. (To register, and log in)

First things first, create 3 new web forms. (New ASPX pages)
- Login
- Register
- RecoverPassword

We'll be using these shortly.



The N/A is a label, with red font. (Duh?)
The "box" is currently just a simple listbox that will hold the current playlist.
And the two links at the bottom point to the pages you just created.

Now to add some code

Double click on the form to bring up the Page_Load event handler. This event fires whenever the page is loaded, or reloaded.

We're going to add a small method to pull the playlist and display it on our page.

Code:
        public static List<string> songList = new List<string>();
        private void GetSongList()
        {
            if (songList.Count != Winamp.GetPlaylist().Length)
            {
                songList.Clear();
                foreach (var s in Winamp.GetPlaylist())
                {
                    songList.Add(s);
                }
            }
            lstPlaylistPreview.Items.Clear();
            foreach (var s in songList)
            {
                lstPlaylistPreview.Items.Add((songList.IndexOf(s) + 1) + " - " + s);
            }
        }
All this does, is check if the count in our List of songs (songList) is different than what Winamp.GetPlaylist() returns. If it is, we need to update our song list before going any further. (This is to cut down on requests to reading memory, and slowing down page loads, and my PC)

Now in the Page_Load handler, add GetSongList(); and go ahead and debug.



And it works!

Now to add the current song title. (This one is really simple)

Code:
        protected void Page_Load(object sender, EventArgs e)
        {
            GetSongList();
            lblPlaying.Text = Winamp.GetCurrentSongTitle();
        }
And now you can see what's playing on winamp!



Congratulations. You just finished the easiest part of the site!

[Only registered and activated users can see links. ]


[Only registered and activated users can see links. ]

Last edited by Apoc; 07-12-2008 at 04:53 PM.
Reply With Quote

Donate to remove ads.
(#2)
Old
Apoc's Avatar
Apoc is Offline
c|_| My care cup is empty
Legendary User
Rep Power: 5
Reputation: 617
Apoc is a name known to allApoc is a name known to allApoc is a name known to allApoc is a name known to allApoc is a name known to allApoc is a name known to all
 
Posts: 625
Join Date: Jan 2008
07-12-2008

Reserved for later.


[Only registered and activated users can see links. ]
Reply With Quote
(#3)
Old
KuRIoS's Avatar
KuRIoS is Offline
Administrator
Rep Power: 15
Reputation: 1417
KuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud ofKuRIoS has much to be proud of
 
Posts: 4,265
Join Date: Apr 2006
Location: Denmark
07-12-2008

very nice apoc... +15 (i give u too much rep)



Do NOT add me to msn to talk about emu servers
[Only registered and activated users can see links. ]
Reply With Quote
(#4)
Old
Syllabus's Avatar
Syllabus is Online
Site Donator
Rep Power: 1
Reputation: 22
Syllabus is on a distinguished road
 
Posts: 83
Join Date: Nov 2007
07-12-2008

Epic!
Reply With Quote
(#5)
Old
Yeti is Offline
Banned
Rep Power: 0
Reputation: 181
Yeti has a spectacular aura aboutYeti has a spectacular aura about
 
Posts: 660
Join Date: Feb 2008
Location: Winterspring..mainly
07-13-2008

very nice!

When i can sorry
Reply With Quote
(#6)
Old
warsheep is Offline
Contributor
Rep Power: 4
Reputation: 184
warsheep has a spectacular aura aboutwarsheep has a spectacular aura about
 
Posts: 1,150
Join Date: Sep 2006
07-26-2008

I look forward to more updates on this. *hint hint*


<ToXiCa> warsheep + denmark + VIP lounge + cheese = love <3
FOR A MOMENT, NOTHING HAPPENED. THEN, AFTER A SECOND OR SO, NOTHING CONTINUED TO HAPPEN.
Reply With Quote
(#7)
Old
Ket's Avatar
Ket is Offline
Administrator
Rep Power: 15
Reputation: 160
Ket has a spectacular aura aboutKet has a spectacular aura about
 
Posts: 253
Join Date: Feb 2008
07-26-2008

excellent, i look forward to seeing this going.
Reply With Quote
(#8)
Old
Jenack's Avatar
Jenack is Offline
Lazy Elite Panda :3

Rep Power: 4
Reputation: 333
Jenack is a jewel in the roughJenack is a jewel in the roughJenack is a jewel in the roughJenack is a jewel in the rough
 
Posts: 989
Join Date: Apr 2007
Location: My room?
07-26-2008

Wow.. A... W... E... S... O... M...!
Reply With Quote
(#9)
Old
MaiN is Offline
Contributor
Rep Power: 3
Reputation: 110
MaiN will become famous soon enoughMaiN will become famous soon enough
 
Posts: 370
Join Date: Sep 2006
Location: Jaedenar O.o
07-28-2008

Wow, awesome! Read all of it.
+2.



I was here. ~
Dragon[Sky] I was here too. ~Kuiren
Reply With Quote
(#10)
Old
ClubbS's Avatar
ClubbS is Offline
Site Donator
Rep Power: 2
Reputation: 18
ClubbS is on a distinguished road
 
Posts: 92
Join Date: Feb 2007
07-28-2008

Nicely done Apoc.
Reply With Quote
Reply

Donate to remove ads.

Thread Tools

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
Trackbacks are Off
Pingbacks are Off
Refbacks are On




Powered by vBulletin® Version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
vBulletin Skin developed by: vBStyles.com


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343