Network: WoW Gold | WoW Accounts | MPS Games | FPSowned
MMOwned - World of Warcraft Exploits, Hacks, Bots and Guides
Homepage »      Register »      Hall of Fame »      Ranks And Awards »      Advertise »      Marketplace »
 
Sign up



Do you like this excellent information? Then Donate HERE to remove ads and support the MMOwned community.


Go Back   MMOwned - World of Warcraft Exploits, Hacks, Bots and Guides > Discussions > Programming

Programming Discuss all your programming needs here.

Reply
 
LinkBack Thread Tools
  #1  
Old 07-12-2008
Apoc's Avatar
Apoc is offline.
MMOwned WebDev
Legendary User
  
 
Join Date: Jan 2008
Posts: 2,268
Nominated 8 Times in 4 Posts
Reputation: 1095
Points: 28,488, Level: 24
Points: 28,488, Level: 24 Points: 28,488, Level: 24 Points: 28,488, Level: 24
Level up: 76%, 412 Points needed
Level up: 76% Level up: 76% Level up: 76%
Activity: 26.1%
Activity: 26.1% Activity: 26.1% Activity: 26.1%

The diary of MMOwned Radio

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!

Download MMOwnedRadio source code.
__________________
[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, get your "DONATOR title, and get access to the MMOwned community's elite Shoutbawx.

  #2  
Old 07-12-2008
Apoc's Avatar
Apoc is offline.
MMOwned WebDev
Legendary User
  
 
Join Date: Jan 2008
Posts: 2,268
Nominated 8 Times in 4 Posts
Reputation: 1095
Points: 28,488, Level: 24
Points: 28,488, Level: 24 Points: 28,488, Level: 24 Points: 28,488, Level: 24
Level up: 76%, 412 Points needed
Level up: 76% Level up: 76% Level up: 76%
Activity: 26.1%
Activity: 26.1% Activity: 26.1% Activity: 26.1%

Reserved for later.
__________________
[Only registered and activated users can see links. ]
Reply With Quote
  #3  
Old 07-12-2008
KuRIoS's Avatar
KuRIoS is offline.
Admin
  
 
Join Date: Apr 2006
Location: Denmark
Posts: 6,146
Nominated 14 Times in 5 Posts
Reputation: 1727
Points: 87,302, Level: 43
Points: 87,302, Level: 43 Points: 87,302, Level: 43 Points: 87,302, Level: 43
Level up: 5%, 4,298 Points needed
Level up: 5% Level up: 5% Level up: 5%
Activity: 30.5%
Activity: 30.5% Activity: 30.5% Activity: 30.5%

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


[Only registered and activated users can see links. ] <|> [Only registered and activated users can see links. ]
Reply With Quote
  #4  
Old 07-12-2008
Syllabus is offline.
Banned
  
 
Join Date: Nov 2007
Posts: 78
Reputation: 22
Epic!
Reply With Quote
  #5  
Old 07-13-2008
Yeti is offline.
Banned
  
 
Join Date: Feb 2008
Location: Winterspring..mainly
Posts: 646
Reputation: 181
very nice!

When i can sorry
Reply With Quote
  #6  
Old 07-26-2008
warsheep is offline.
Contributor
  
 
Join Date: Sep 2006
Posts: 1,214
Reputation: 184
Points: 8,557, Level: 10
Points: 8,557, Level: 10 Points: 8,557, Level: 10 Points: 8,557, Level: 10
Level up: 87%, 143 Points needed
Level up: 87% Level up: 87% Level up: 87%
Activity: 0%
Activity: 0% Activity: 0% Activity: 0%

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 07-26-2008
Ket's Avatar
Ket is offline.
Administrator

  
 
Join Date: Feb 2008
Location: MMOwned Headquarters
Posts: 394
Reputation: 206
Points: 10,800, Level: 12
Points: 10,800, Level: 12 Points: 10,800, Level: 12 Points: 10,800, Level: 12
Level up: 84%, 200 Points needed
Level up: 84% Level up: 84% Level up: 84%
Activity: 5.5%
Activity: 5.5% Activity: 5.5% Activity: 5.5%

excellent, i look forward to seeing this going.
Reply With Quote
  #8  
Old 07-26-2008
R0w4n's Avatar
R0w4n is offline.
Retired Model Editor :3
  
 
Join Date: Apr 2007
Location: Northrend
Posts: 1,066
Reputation: 342
Points: 12,399, Level: 14
Points: 12,399, Level: 14 Points: 12,399, Level: 14 Points: 12,399, Level: 14
Level up: 8%, 1,201 Points needed
Level up: 8% Level up: 8% Level up: 8%
Activity: 1.1%
Activity: 1.1% Activity: 1.1% Activity: 1.1%

Wow.. A... W... E... S... O... M...!
Reply With Quote
  #9  
Old 07-28-2008
MaiN is offline.
Contributor
  
 
Join Date: Sep 2006
Location: Jaedenar O.o
Posts: 646
Reputation: 171
Points: 3,543, Level: 5
Points: 3,543, Level: 5 Points: 3,543, Level: 5 Points: 3,543, Level: 5
Level up: 93%, 57 Points needed
Level up: 93% Level up: 93% Level up: 93%
Activity: 7.0%
Activity: 7.0% Activity: 7.0% Activity: 7.0%

Wow, awesome! Read all of it.
+2.
__________________
Reply With Quote
  #10  
Old 07-28-2008
ClubbS's Avatar
ClubbS is offline.
Site Donator
  
 
Join Date: Feb 2007
Posts: 235
Reputation: 61
Points: 1,282, Level: 2
Points: 1,282, Level: 2 Points: 1,282, Level: 2 Points: 1,282, Level: 2
Level up: 77%, 118 Points needed
Level up: 77% Level up: 77% Level up: 77%
Activity: 0%
Activity: 0% Activity: 0% Activity: 0%

Nicely done Apoc.
Reply With Quote
Reply

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



All times are GMT -4. The time now is 04:46 AM.




Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.2

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 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524