Mirage Source

Free ORPG making software.
It is currently Sat Apr 27, 2024 9:48 am

All times are UTC


Forum rules


Make sure your tutorials are kept up to date with the latest MS4 releases.



Post new topic Reply to topic  [ 1233 posts ]  Go to page 1, 2, 3, 4, 5 ... 50  Next
Author Message
 Post subject: Basic Diagonal Movement
PostPosted: Tue Sep 23, 2008 2:23 am 
Offline
Persistant Poster
User avatar

Joined: Wed Nov 29, 2006 11:25 pm
Posts: 860
Location: Ayer
Diagonal Movement
- 8 directional movement - / DOWNLOAD

- Haven't wrote up a tutorial in ages so here you go.
Feel free to improve it.

Diagonal movement is very basic and simple, it's just a lot of copying, pasting,
modifying, and a bit of brain power.

Starting with the client
SPOILER: (click to show)
Let's look at our original DIR_ Constants

Code:
Public Const DIR_UP As Byte = 0
Public Const DIR_DOWN As Byte = 1
Public Const DIR_LEFT As Byte = 2
Public Const DIR_RIGHT As Byte = 3


Since we are adding Diagonal movement theres a top left, top right, bottom left, and bottom right.
I copied that, modified it, and had everything after another.

Code:
Public Const DIR_UP_LEFT As Byte = 0
Public Const DIR_UP_RIGHT As Byte = 1
Public Const DIR_DOWN_LEFT As Byte = 2
Public Const DIR_DOWN_RIGHT As Byte = 3


See anything wrong? You should.
The constants DIR_UP and etc is just a cover for the number so we don't get confused.
Basically the number 0 is the direction up, number 1 is the direction right, etc.

So we cannot have DIR_UP_LEFT to equal 0 because that would be facing up.
so your constants should look like this.

Code:
' Direction constants
Public Const DIR_UP As Byte = 0
Public Const DIR_DOWN As Byte = 1
Public Const DIR_LEFT As Byte = 2
Public Const DIR_RIGHT As Byte = 3
Public Const DIR_UP_LEFT As Byte = 4
Public Const DIR_UP_RIGHT As Byte = 5
Public Const DIR_DOWN_LEFT As Byte = 6
Public Const DIR_DOWN_RIGHT As Byte = 7


Also find
Code:
Public DirUp As Boolean
Public DirDown As Boolean
Public DirLeft As Boolean
Public DirRight As Boolean


and add
Code:
Public DirUpLeft As Boolean
Public DirUpRight As Boolean
Public DirDownLeft As Boolean
Public DirDownRight As Boolean

So now what we want to do is just update everything that includes DIR_UP, DIR_DOWN, etc. and add
our new directions.

Find
Code:
Public Sub BltPlayer(ByVal Index As Long)

Replace the sub with
Code:
Public Sub BltPlayer(ByVal Index As Long)
Dim Anim As Byte
Dim X As Long
Dim Y As Long
Dim rec As DXVBLib.RECT

    ' Check for animation
    Anim = 0
    With rec
        If Player(Index).Attacking = 0 Then
            Select Case GetPlayerDir(Index)
                Case DIR_UP
                    If (Player(Index).YOffset < SIZE_Y / 2) Then Anim = 1
                    .Left = (GetPlayerDir(Index) * 3 + Anim) * SIZE_X
                Case DIR_DOWN
                    If (Player(Index).YOffset < SIZE_Y / 2 * -1) Then Anim = 1
                    .Left = (GetPlayerDir(Index) * 3 + Anim) * SIZE_X
                Case DIR_LEFT
                    If (Player(Index).XOffset < SIZE_Y / 2) Then Anim = 1
                    .Left = (GetPlayerDir(Index) * 3 + Anim) * SIZE_X
                Case DIR_RIGHT
                    If (Player(Index).XOffset < SIZE_Y / 2 * -1) Then Anim = 1
                    .Left = (GetPlayerDir(Index) * 3 + Anim) * SIZE_X
                Case DIR_UP_LEFT
                    If (Player(Index).YOffset < SIZE_Y / 2) And (Player(Index).XOffset < SIZE_Y / 2) Then Anim = 1
                    .Left = ((GetPlayerDir(Index) - GetPlayerDir(Index)) * 3 + Anim) * SIZE_X
                Case DIR_UP_RIGHT
                    If (Player(Index).YOffset < SIZE_Y / 2) And (Player(Index).XOffset < SIZE_Y / 2 * -1) Then Anim = 1
                    .Left = ((GetPlayerDir(Index) - GetPlayerDir(Index)) * 3 + Anim) * SIZE_X
                Case DIR_DOWN_LEFT
                    If (Player(Index).YOffset < SIZE_Y / 2 * -1) And (Player(Index).XOffset < SIZE_Y / 2) Then Anim = 1
                    .Left = ((GetPlayerDir(Index) - GetPlayerDir(Index) + 1) * 3 + Anim) * SIZE_X
                Case DIR_DOWN_RIGHT
                    If (Player(Index).YOffset < SIZE_Y / 2 * -1) And (Player(Index).XOffset < SIZE_Y / 2 * -1) Then Anim = 1
                    .Left = ((GetPlayerDir(Index) - GetPlayerDir(Index) + 1) * 3 + Anim) * SIZE_X
            End Select
        Else
            If Player(Index).AttackTimer + 500 > GetTickCount Then
                Anim = 2
            End If
        End If
   
        .Top = GetPlayerSprite(Index) * SIZE_Y
        .Bottom = .Top + SIZE_Y
        .Right = .Left + SIZE_X
    End With

   
    ' Check to see if we want to stop making him attack
    With Player(Index)
        If .AttackTimer + 1000 < GetTickCount Then
            .Attacking = 0
            .AttackTimer = 0
        End If
    End With
   

       
   
    X = GetPlayerX(Index) * SIZE_X + Player(Index).XOffset
    Y = GetPlayerY(Index) * SIZE_Y + Player(Index).YOffset - 4 ' to raise the sprite by 4 pixels
   
    ' Check if its out of bounds because of the offset
    If Y < 0 Then
        Y = 0
        With rec
            .Top = .Top + (Y * -1)
        End With
    End If
       
    Call DD_MiddleBuffer.BltFast(X, Y, DD_SpriteSurf, rec, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY)
End Sub


Find
Code:
Sub HandlePlayerMove(ByRef Parse() As String)

Below you will see DIR_UP, DIR_DOWN, etc.

What we are gonna do here is simple, just combine directions to make our new direction.

For an example DIR_UP is
Code:
         Case DIR_UP
             Player(i).YOffset = PIC_Y


and DIR_LEFT is
Code:
         Case DIR_LEFT
             Player(i).XOffset = PIC_X


to make our new direction we just combine them!

our new direction: DIR_UP_LEFT
Code:
         Case DIR_UP_LEFT
             Player(i).YOffset = PIC_Y
             Player(i).XOffset = PIC_X


After your done combining everything, it should now look like this
Code:
         Case DIR_UP
             Player(i).YOffset = PIC_Y
         Case DIR_DOWN
             Player(i).YOffset = PIC_Y * -1
         Case DIR_LEFT
             Player(i).XOffset = PIC_X
         Case DIR_RIGHT
             Player(i).XOffset = PIC_X * -1
         Case DIR_UP_LEFT
             Player(i).YOffset = PIC_Y
             Player(i).XOffset = PIC_X
         Case DIR_UP_RIGHT
             Player(i).YOffset = PIC_Y
             Player(i).XOffset = PIC_X * -1
         Case DIR_DOWN_LEFT
             Player(i).YOffset = PIC_Y * -1
             Player(i).XOffset = PIC_X
         Case DIR_DOWN_RIGHT
             Player(i).YOffset = PIC_Y * -1
             Player(i).XOffset = PIC_X * -1

I'll be covering everything at once so this includes NPCs.

Find
Code:
Sub HandleNpcMove(ByRef Parse() As String)

Replace the sub with
Code:
Sub HandleNpcMove(ByRef Parse() As String)
Dim i As Long, X As Long, Y As Long, Dir As Long
Dim n As Byte

     i = CLng(Parse(1))
     X = CLng(Parse(2))
     Y = CLng(Parse(3))
     Dir = CLng(Parse(4))
     n = CByte(Parse(5))

     MapNpc(i).X = X
     MapNpc(i).Y = Y
     MapNpc(i).Dir = Dir
     MapNpc(i).XOffset = 0
     MapNpc(i).YOffset = 0
     MapNpc(i).Moving = n
     
     Select Case MapNpc(i).Dir
         Case DIR_UP
             MapNpc(i).YOffset = PIC_Y
         Case DIR_DOWN
             MapNpc(i).YOffset = PIC_Y * -1
         Case DIR_LEFT
             MapNpc(i).XOffset = PIC_X
         Case DIR_RIGHT
             MapNpc(i).XOffset = PIC_X * -1
         Case DIR_UP_LEFT
             MapNpc(i).YOffset = PIC_Y
             MapNpc(i).XOffset = PIC_X
         Case DIR_UP_RIGHT
             MapNpc(i).YOffset = PIC_Y
             MapNpc(i).XOffset = PIC_X * -1
         Case DIR_DOWN_LEFT
             MapNpc(i).YOffset = PIC_Y * -1
             MapNpc(i).XOffset = PIC_X
         Case DIR_DOWN_RIGHT
             MapNpc(i).YOffset = PIC_Y * -1
             MapNpc(i).XOffset = PIC_X * -1
     End Select
End Sub


Next find
Code:
Sub ProcessMovement(ByVal Index As Long)

Replace the sub with
Code:
Sub ProcessMovement(ByVal Index As Long)
Dim MovementSpeed As Long

    ' Check if player is walking, and if so process moving them over
    If Player(Index).Moving = MOVING_WALKING Then
        MovementSpeed = WALK_SPEED
    ElseIf Player(Index).Moving = MOVING_RUNNING Then
        MovementSpeed = RUN_SPEED
    End If
   
    Select Case GetPlayerDir(Index)
        Case DIR_UP
            Player(Index).YOffset = Player(Index).YOffset - MovementSpeed
        Case DIR_DOWN
            Player(Index).YOffset = Player(Index).YOffset + MovementSpeed
        Case DIR_LEFT
            Player(Index).XOffset = Player(Index).XOffset - MovementSpeed
        Case DIR_RIGHT
            Player(Index).XOffset = Player(Index).XOffset + MovementSpeed
        Case DIR_UP_LEFT
            Player(Index).YOffset = Player(Index).YOffset - MovementSpeed
            Player(Index).XOffset = Player(Index).XOffset - MovementSpeed
        Case DIR_UP_RIGHT
            Player(Index).YOffset = Player(Index).YOffset - MovementSpeed
            Player(Index).XOffset = Player(Index).XOffset + MovementSpeed
        Case DIR_DOWN_LEFT
            Player(Index).YOffset = Player(Index).YOffset + MovementSpeed
            Player(Index).XOffset = Player(Index).XOffset - MovementSpeed
        Case DIR_DOWN_RIGHT
            Player(Index).YOffset = Player(Index).YOffset + MovementSpeed
            Player(Index).XOffset = Player(Index).XOffset + MovementSpeed
    End Select

    ' Check if completed walking over to the next tile
    If Player(Index).XOffset = 0 Then
        If Player(Index).YOffset = 0 Then
            Player(Index).Moving = 0
        End If
    End If

End Sub


Next find
Code:
Sub ProcessNpcMovement(ByVal MapNpcNum As Long)

Replace the sub with
Code:
Sub ProcessNpcMovement(ByVal MapNpcNum As Long)
    ' Check if player is walking, and if so process moving them over
    If MapNpc(MapNpcNum).Moving = MOVING_WALKING Then
        Select Case MapNpc(MapNpcNum).Dir
            Case DIR_UP
                MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset - WALK_SPEED
            Case DIR_DOWN
                MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset + WALK_SPEED
            Case DIR_LEFT
                MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset - WALK_SPEED
            Case DIR_RIGHT
                MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset + WALK_SPEED
            Case DIR_UP_LEFT
                MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset - WALK_SPEED
                MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset - WALK_SPEED
            Case DIR_UP_RIGHT
                MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset - WALK_SPEED
                MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset + WALK_SPEED
            Case DIR_DOWN_LEFT
                MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset + WALK_SPEED
                MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset - WALK_SPEED
            Case DIR_DOWN_RIGHT
                MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset + WALK_SPEED
                MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset + WALK_SPEED
        End Select
       
        ' Check if completed walking over to the next tile
        If MapNpc(MapNpcNum).XOffset = 0 Then
            If MapNpc(MapNpcNum).YOffset = 0 Then
                MapNpc(MapNpcNum).Moving = 0
            End If
        End If
    End If
End Sub


Next find
Code:
Function CanMove() As Boolean

Replace the sub with
Code:
Function CanMove() As Boolean
Dim d As Long

    CanMove = True
   
    ' Make sure they aren't trying to move when they are already moving
    If Player(MyIndex).Moving <> 0 Then
        CanMove = False
        Exit Function
    End If
   
    ' Make sure they haven't just casted a spell
    If Player(MyIndex).CastedSpell = YES Then
        If GetTickCount > Player(MyIndex).AttackTimer + 1000 Then
            Player(MyIndex).CastedSpell = NO
        Else
            CanMove = False
            Exit Function
        End If
    End If
   
    d = GetPlayerDir(MyIndex)
    If DirUp Then
        Call SetPlayerDir(MyIndex, DIR_UP)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerY(MyIndex) > 0 Then
            If CheckDirection(DIR_UP) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_UP Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Up > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
           
    If DirDown Then
        Call SetPlayerDir(MyIndex, DIR_DOWN)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerY(MyIndex) < MAX_MAPY Then
            If CheckDirection(DIR_DOWN) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_DOWN Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Down > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
               
    If DirLeft Then
        Call SetPlayerDir(MyIndex, DIR_LEFT)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerX(MyIndex) > 0 Then
            If CheckDirection(DIR_LEFT) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_LEFT Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Left > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
       
    If DirRight Then
        Call SetPlayerDir(MyIndex, DIR_RIGHT)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerX(MyIndex) < MAX_MAPX Then
            If CheckDirection(DIR_RIGHT) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_RIGHT Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Right > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
   
    If DirUpLeft Then
        Call SetPlayerDir(MyIndex, DIR_UP_LEFT)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerY(MyIndex) > 0 And GetPlayerX(MyIndex) > 0 Then
            If CheckDirection(DIR_UP_LEFT) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_UP_LEFT Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Up > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
   
    If DirUpRight Then
        Call SetPlayerDir(MyIndex, DIR_UP_RIGHT)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerY(MyIndex) > 0 And GetPlayerX(MyIndex) < Map.MapX Then
            If CheckDirection(DIR_UP_RIGHT) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_UP_RIGHT Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Up > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
   
    If DirDownLeft Then
        Call SetPlayerDir(MyIndex, DIR_DOWN_LEFT)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerY(MyIndex) < MAX_MAPY And GetPlayerX(MyIndex) > 0 Then
            If CheckDirection(DIR_DOWN_LEFT) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_DOWN_LEFT Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Down > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
   
    If DirDownRight Then
        Call SetPlayerDir(MyIndex, DIR_DOWN_RIGHT)
       
        ' Check to see if they are trying to go out of bounds
        If GetPlayerY(MyIndex) < MAX_MAPY And GetPlayerX(MyIndex) < Map.MapX Then
            If CheckDirection(DIR_DOWN_RIGHT) Then
                CanMove = False
               
                ' Set the new direction if they weren't facing that direction
                If d <> DIR_DOWN_RIGHT Then
                    Call SendPlayerDir
                End If
                Exit Function
            End If
        Else
            ' Check if they can warp to a new map
            If Map.Down > 0 Then
                Call MapEditorLeaveMap
                Call SendPlayerRequestNewMap
                GettingMap = True
            End If
            CanMove = False
            Exit Function
        End If
    End If
End Function


Next find
Code:
Function CheckDirection(ByVal Direction As Byte) As Boolean


Replace the sub with
Code:
Function CheckDirection(ByVal Direction As Byte) As Boolean
Dim X As Long, Y As Long, i As Long

    CheckDirection = False
   
    Select Case Direction
        Case DIR_UP
            X = GetPlayerX(MyIndex)
            Y = GetPlayerY(MyIndex) - 1
        Case DIR_DOWN
            X = GetPlayerX(MyIndex)
            Y = GetPlayerY(MyIndex) + 1
        Case DIR_LEFT
            X = GetPlayerX(MyIndex) - 1
            Y = GetPlayerY(MyIndex)
        Case DIR_RIGHT
            X = GetPlayerX(MyIndex) + 1
            Y = GetPlayerY(MyIndex)
        Case DIR_UP_LEFT
            X = GetPlayerX(MyIndex) - 1
            Y = GetPlayerY(MyIndex) - 1
        Case DIR_UP_RIGHT
            X = GetPlayerX(MyIndex) + 1
            Y = GetPlayerY(MyIndex) - 1
        Case DIR_DOWN_LEFT
            X = GetPlayerX(MyIndex) - 1
            Y = GetPlayerY(MyIndex) + 1
        Case DIR_DOWN_RIGHT
            X = GetPlayerX(MyIndex) + 1
            Y = GetPlayerY(MyIndex) + 1
    End Select
   
    ' Check to see if the map tile is blocked or not
    If Map.Tile(X, Y).Type = TILE_TYPE_BLOCKED Then
        CheckDirection = True
        Exit Function
    End If
                               
    ' Check to see if the key door is open or not
    If Map.Tile(X, Y).Type = TILE_TYPE_KEY Then
        ' This actually checks if its open or not
        If TempTile(X, Y).DoorOpen = NO Then
            CheckDirection = True
            Exit Function
        End If
    End If
   
    ' Check to see if a player is already on that tile
    For i = 1 To MAX_PLAYERS
        If IsPlaying(i) Then
            If GetPlayerMap(i) = GetPlayerMap(MyIndex) Then
                If GetPlayerX(i) = X Then
                    If GetPlayerY(i) = Y Then
                        CheckDirection = True
                        Exit Function
                    End If
                End If
            End If
        End If
    Next i

    ' Check to see if a npc is already on that tile
    For i = 1 To MAX_MAP_NPCS
        If MapNpc(i).Num > 0 Then
            If MapNpc(i).X = X Then
                If MapNpc(i).Y = Y Then
                    CheckDirection = True
                    Exit Function
                End If
            End If
        End If
    Next i
   
End Function

Next find this
Code:
Sub SetPlayerY(ByVal Index As Long, ByVal Y As Long)
    Player(Index).Y = Y
End Sub

Below that whole sub add
Code:
Sub SetPlayerXY(ByVal Index As Long, ByVal X As Long, ByVal Y As Long)
    Player(Index).X = X
    Player(Index).Y = Y
End Sub


Next find
Code:
Sub CheckMovement()

Replace the sub with
Code:
Sub CheckMovement()
    If IsTryingToMove Then
        If CanMove Then
            ' Check if player has the shift key down for running
            If ShiftDown Then
                Player(MyIndex).Moving = MOVING_RUNNING
            Else
                Player(MyIndex).Moving = MOVING_WALKING
            End If
       
            Select Case GetPlayerDir(MyIndex)
                Case DIR_UP
                    Call SendPlayerMove
                    Player(MyIndex).YOffset = PIC_Y
                    Call SetPlayerY(MyIndex, GetPlayerY(MyIndex) - 1)
           
                Case DIR_DOWN
                    Call SendPlayerMove
                    Player(MyIndex).YOffset = PIC_Y * -1
                    Call SetPlayerY(MyIndex, GetPlayerY(MyIndex) + 1)
           
                Case DIR_LEFT
                    Call SendPlayerMove
                    Player(MyIndex).XOffset = PIC_X
                    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) - 1)
           
                Case DIR_RIGHT
                    Call SendPlayerMove
                    Player(MyIndex).XOffset = PIC_X * -1
                    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) + 1)
                   
                Case DIR_UP_LEFT
                    Call SendPlayerMove
                    Player(MyIndex).XOffset = PIC_X
                    Player(MyIndex).YOffset = PIC_Y
                    Call SetPlayerXY(MyIndex, GetPlayerX(MyIndex) - 1, GetPlayerY(MyIndex) - 1)
                   
                Case DIR_UP_RIGHT
                    Call SendPlayerMove
                    Player(MyIndex).XOffset = PIC_X * -1
                    Player(MyIndex).YOffset = PIC_Y
                    Call SetPlayerXY(MyIndex, GetPlayerX(MyIndex) + 1, GetPlayerY(MyIndex) - 1)
                   
                Case DIR_DOWN_LEFT
                    Call SendPlayerMove
                    Player(MyIndex).XOffset = PIC_X
                    Player(MyIndex).YOffset = PIC_Y * -1
                    Call SetPlayerXY(MyIndex, GetPlayerX(MyIndex) - 1, GetPlayerY(MyIndex) + 1)
                   
                Case DIR_DOWN_RIGHT
                    Call SendPlayerMove
                    Player(MyIndex).XOffset = PIC_X * -1
                    Player(MyIndex).YOffset = PIC_Y * -1
                    Call SetPlayerXY(MyIndex, GetPlayerX(MyIndex) + 1, GetPlayerY(MyIndex) + 1)
            End Select
       
            ' Gotta check
            If Map.Tile(GetPlayerX(MyIndex), GetPlayerY(MyIndex)).Type = TILE_TYPE_WARP Then
                GettingMap = True
            End If
        End If
    End If
End Sub

Next find
Code:
Sub HandlePlayerData(ByRef Parse() As String)

Replace the sub with
Code:
Sub HandlePlayerData(ByRef Parse() As String)
Dim i As Long

     i = CLng(Parse(1))
     
     Call SetPlayerName(i, Parse(2))
     Call SetPlayerSprite(i, CLng(Parse(3)))
     Call SetPlayerMap(i, CLng(Parse(4)))
     Call SetPlayerX(i, CLng(Parse(5)))
     Call SetPlayerY(i, CLng(Parse(6)))
     Call SetPlayerDir(i, CLng(Parse(7)))
     Call SetPlayerAccess(i, CLng(Parse(8)))
     Call SetPlayerPK(i, CLng(Parse(9)))
     
     ' Check if the player is the client player, and if so reset directions
     If i = MyIndex Then
         DirUp = False
         DirDown = False
         DirLeft = False
         DirRight = False
         DirUpLeft = False
         DirUpRight = False
         DirDownLeft = False
         DirDownRight = False
     End If
     
     ' Make sure they aren't walking
     Player(i).Moving = 0
     Player(i).XOffset = 0
     Player(i).YOffset = 0
End Sub

Next find these(in GameLoop)
Code:
        ' Check to make sure they aren't trying to auto do anything
        If GetAsyncKeyState(VK_UP) >= 0 Then
            If DirUp = True Then
                DirUp = False
            End If
        End If
           
        If GetAsyncKeyState(VK_DOWN) >= 0 Then
            If DirDown = True Then
                DirDown = False
            End If
        End If
       
        If GetAsyncKeyState(VK_LEFT) >= 0 Then
            If DirLeft = True Then
                DirLeft = False
            End If
        End If
       
        If GetAsyncKeyState(VK_RIGHT) >= 0 Then
            If DirRight = True Then
                DirRight = False
            End If
        End If


Below those add
Code:
        If GetAsyncKeyState(VK_UP) >= 0 And GetAsyncKeyState(VK_LEFT) >= 0 Then
            If DirUpLeft = True Then
                DirUpLeft = False
            End If
        End If
       
        If GetAsyncKeyState(VK_UP) >= 0 And GetAsyncKeyState(VK_RIGHT) >= 0 Then
            If DirUpRight = True Then
                DirUpRight = False
            End If
        End If
       
        If GetAsyncKeyState(VK_DOWN) >= 0 And GetAsyncKeyState(VK_LEFT) >= 0 Then
            If DirDownLeft = True Then
                DirDownLeft = False
            End If
        End If
       
        If GetAsyncKeyState(VK_DOWN) >= 0 And GetAsyncKeyState(VK_RIGHT) >= 0 Then
            If DirDownRight = True Then
                DirDownRight = False
            End If
        End If

Next find
Code:
Sub CheckInput(ByVal KeyState As Byte, ByVal KeyCode As Integer, ByVal Shift As Integer)

Replace the sub with
Code:
Sub CheckInput(ByVal KeyState As Byte, ByVal KeyCode As Integer, ByVal Shift As Integer)
    If Not GettingMap Then
        If KeyState = 1 Then
            If KeyCode = vbKeyReturn Then
                Call CheckMapGetItem
            End If
            If KeyCode = vbKeyControl Then
                ControlDown = True
            End If
            If KeyCode = vbKeyUp Then
                DirUp = True
                DirDown = False
                DirLeft = False
                DirRight = False
                DirUpLeft = False
                DirUpRight = False
                DirDownLeft = False
                DirDownRight = False
            End If
            If KeyCode = vbKeyDown Then
                DirUp = False
                DirDown = True
                DirLeft = False
                DirRight = False
                DirUpLeft = False
                DirUpRight = False
                DirDownLeft = False
                DirDownRight = False
            End If
            If KeyCode = vbKeyLeft Then
                DirUp = False
                DirDown = False
                DirLeft = True
                DirRight = False
                DirUpLeft = False
                DirUpRight = False
                DirDownLeft = False
                DirDownRight = False
            End If
            If KeyCode = vbKeyRight Then
                DirUp = False
                DirDown = False
                DirLeft = False
                DirRight = True
                DirUpLeft = False
                DirUpRight = False
                DirDownLeft = False
                DirDownRight = False
            End If
            If GetAsyncKeyState(vbKeyUp) And GetAsyncKeyState(vbKeyLeft) Then
                DirUp = False
                DirDown = False
                DirLeft = False
                DirRight = False
                DirUpLeft = True
                DirUpRight = False
                DirDownLeft = False
                DirDownRight = False
            Else
                DirUpLeft = False
            End If
            If GetAsyncKeyState(vbKeyUp) And GetAsyncKeyState(vbKeyRight) Then
                DirUp = False
                DirDown = False
                DirLeft = False
                DirRight = False
                DirUpLeft = False
                DirUpRight = True
                DirDownLeft = False
                DirDownRight = False
            Else
                DirUpRight = False
            End If
            If GetAsyncKeyState(vbKeyDown) And GetAsyncKeyState(vbKeyLeft) Then
                DirUp = False
                DirDown = False
                DirLeft = False
                DirRight = False
                DirUpLeft = False
                DirUpRight = False
                DirDownLeft = True
                DirDownRight = False
            Else
                DirDownLeft = False
            End If
            If GetAsyncKeyState(vbKeyDown) And GetAsyncKeyState(vbKeyRight) Then
                DirUp = False
                DirDown = False
                DirLeft = False
                DirRight = False
                DirUpLeft = False
                DirUpRight = False
                DirDownLeft = False
                DirDownRight = True
            Else
                DirDownRight = False
            End If
            If KeyCode = vbKeyShift Then
                ShiftDown = True
            End If
        Else
            If KeyCode = vbKeyUp Then DirUp = False
            If KeyCode = vbKeyDown Then DirDown = False
            If KeyCode = vbKeyLeft Then DirLeft = False
            If KeyCode = vbKeyRight Then DirRight = False
            'If KeyCode = vbKeyUp And vbKeyLeft Then DirUpLeft = False
            'If KeyCode = vbKeyUp And vbKeyRight Then DirUpRight = False
            'If KeyCode = vbKeyDown And vbKeyLeft Then DirDownLeft = False
            'If KeyCode = vbKeyDown And vbKeyRight Then DirDownRight = False
            If KeyCode = vbKeyShift Then ShiftDown = False
            If KeyCode = vbKeyControl Then ControlDown = False
        End If
    End If
End Sub

Next find
Code:
Function IsTryingToMove() As Boolean

Replace the sub with
Code:
Function IsTryingToMove() As Boolean
    If DirUp Or DirDown Or DirLeft Or DirRight Or DirUpLeft Or DirUpRight Or DirDownLeft Or DirDownRight Then
        IsTryingToMove = True
    Else
        IsTryingToMove = False
    End If
End Function


Server Side
- Tired yet!? -

SPOILER: (click to show)
Find
Code:
Public Const DIR_RIGHT As Byte = 3

Below that add
Code:
Public Const DIR_UP_LEFT As Byte = 4
Public Const DIR_UP_RIGHT As Byte = 5
Public Const DIR_DOWN_LEFT As Byte = 6
Public Const DIR_DOWN_RIGHT As Byte = 7

Next find
Code:
Function CanAttackPlayer(ByVal Attacker As Long, ByVal Victim As Long) As Boolean

Replace the sub with
Code:
Function CanAttackPlayer(ByVal Attacker As Long, ByVal Victim As Long) As Boolean
       
    ' Check for subscript out of range
    If Not IsPlaying(Victim) Then
        Exit Function
    End If
           

    ' Check attack timer
    If GetTickCount > TempPlayer(Attacker).AttackTimer + 1000 Then
        Exit Function
    End If
           
    ' Check if at same coordinates
    Select Case GetPlayerDir(Attacker)
        Case DIR_UP
            If (GetPlayerY(Victim) + 1 = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
       
        Case DIR_DOWN
            If (GetPlayerY(Victim) - 1 = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If

        Case DIR_LEFT
            If (GetPlayerY(Victim) = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) + 1 = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
       
        Case DIR_RIGHT
            If (GetPlayerY(Victim) = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) - 1 = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
       
        Case DIR_UP_LEFT
            If (GetPlayerY(Victim) + 1 = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) + 1 = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
           
        Case DIR_UP_RIGHT
            If (GetPlayerY(Victim) + 1 = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) - 1 = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
           
        Case DIR_DOWN_LEFT
            If (GetPlayerY(Victim) - 1 = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) + 1 = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
           
        Case DIR_DOWN_RIGHT
            If (GetPlayerY(Victim) - 1 = GetPlayerY(Attacker)) Then
                If (GetPlayerX(Victim) - 1 = GetPlayerX(Attacker)) Then
                    CanAttackPlayer = True
                End If
            End If
    End Select
   
    If Not CanAttackPlayer Then
        Exit Function
    End If

    ' Make sure they have more then 0 hp
    If GetPlayerVital(Victim, Vitals.HP) <= 0 Then
        Exit Function
    End If

    ' Check to make sure that they dont have access
    If GetPlayerAccess(Attacker) > ADMIN_MONITOR Then
        Call PlayerMsg(Attacker, "You cannot attack any player for thou art an admin!", BrightBlue)
        Exit Function
    End If

    ' Check to make sure the victim isn't an admin
    If GetPlayerAccess(Victim) > ADMIN_MONITOR Then
        Call PlayerMsg(Attacker, "You cannot attack " & GetPlayerName(Victim) & "!", BrightRed)
        Exit Function
    End If

    ' Make sure attacker is high enough level
    If GetPlayerLevel(Attacker) < 10 Then
        Call PlayerMsg(Attacker, "You are below level 10, you cannot attack another player yet!", BrightRed)
        Exit Function
    End If
   
    ' Make sure victim is high enough level
    If GetPlayerLevel(Victim) < 10 Then
        Call PlayerMsg(Attacker, GetPlayerName(Victim) & " is below level 10, you cannot attack this player yet!", BrightRed)
        Exit Function
    End If

    ' Make sure they are on the same map
    If Not GetPlayerMap(Attacker) = GetPlayerMap(Victim) Then
        Exit Function
    End If
       
    ' Make sure we dont attack the player if they are switching maps
    If TempPlayer(Victim).GettingMap = YES Then
        Exit Function
    End If
 
    ' Check if map is attackable
    If Not Map(GetPlayerMap(Attacker)).Moral = MAP_MORAL_NONE Or GetPlayerPK(Victim) = NO Then
        Call PlayerMsg(Attacker, "This is a safe zone!", BrightRed)
        Exit Function
    End If
   
    CanAttackPlayer = True
 
End Function

Next find
Code:
Function CanAttackNpc(ByVal Attacker As Long, ByVal MapNpcNum As Long) As Boolean

Replace the sub with
Code:
Function CanAttackNpc(ByVal Attacker As Long, ByVal MapNpcNum As Long) As Boolean
Dim MapNum As Long, NpcNum As Long
Dim NpcX As Long, NpcY As Long

    CanAttackNpc = False
   
    ' Check for subscript out of range
    If IsPlaying(Attacker) = False Or MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Then
        Exit Function
    End If
   
    ' Check for subscript out of range
    If MapNpc(GetPlayerMap(Attacker), MapNpcNum).Num <= 0 Then
        Exit Function
    End If
   
    MapNum = GetPlayerMap(Attacker)
    NpcNum = MapNpc(MapNum, MapNpcNum).Num
   
    ' Make sure the npc isn't already dead
    If MapNpc(MapNum, MapNpcNum).Vital(Vitals.HP) <= 0 Then
        Exit Function
    End If
   
    ' Make sure they are on the same map
    If IsPlaying(Attacker) Then
        If NpcNum > 0 And GetTickCount > TempPlayer(Attacker).AttackTimer + 1000 Then
            ' Check if at same coordinates
            Select Case GetPlayerDir(Attacker)
                Case DIR_UP
                    NpcX = MapNpc(MapNum, MapNpcNum).x
                    NpcY = MapNpc(MapNum, MapNpcNum).y + 1
                Case DIR_DOWN
                    NpcX = MapNpc(MapNum, MapNpcNum).x
                    NpcY = MapNpc(MapNum, MapNpcNum).y - 1
                Case DIR_LEFT
                    NpcX = MapNpc(MapNum, MapNpcNum).x + 1
                    NpcY = MapNpc(MapNum, MapNpcNum).y
                Case DIR_RIGHT
                    NpcX = MapNpc(MapNum, MapNpcNum).x - 1
                    NpcY = MapNpc(MapNum, MapNpcNum).y
                Case DIR_UP_LEFT
                    NpcX = MapNpc(MapNum, MapNpcNum).x + 1
                    NpcY = MapNpc(MapNum, MapNpcNum).y + 1
                Case DIR_UP_RIGHT
                    NpcX = MapNpc(MapNum, MapNpcNum).x - 1
                    NpcY = MapNpc(MapNum, MapNpcNum).y + 1
                Case DIR_DOWN_LEFT
                    NpcX = MapNpc(MapNum, MapNpcNum).x + 1
                    NpcY = MapNpc(MapNum, MapNpcNum).y - 1
                Case DIR_DOWN_RIGHT
                    NpcX = MapNpc(MapNum, MapNpcNum).x - 1
                    NpcY = MapNpc(MapNum, MapNpcNum).y - 1
            End Select
           
            If NpcX = GetPlayerX(Attacker) Then
                If NpcY = GetPlayerY(Attacker) Then
                    If Npc(NpcNum).Behavior <> NPC_BEHAVIOR_FRIENDLY And Npc(NpcNum).Behavior <> NPC_BEHAVIOR_SHOPKEEPER Then
                        CanAttackNpc = True
                    Else
                        Call PlayerMsg(Attacker, "You cannot attack a " & Trim$(Npc(NpcNum).Name) & "!", BrightBlue)
                    End If
                End If
            End If
        End If
    End If
End Function

Next find
Code:
Function CanNpcAttackPlayer(ByVal MapNpcNum As Long, ByVal Index As Long) As Boolean

Replace the sub with
Code:
Function CanNpcAttackPlayer(ByVal MapNpcNum As Long, ByVal Index As Long) As Boolean
Dim MapNum As Long, NpcNum As Long
   
    CanNpcAttackPlayer = False
   
    ' Check for subscript out of range
    If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or IsPlaying(Index) = False Then
        Exit Function
    End If
   
    ' Check for subscript out of range
    If MapNpc(GetPlayerMap(Index), MapNpcNum).Num <= 0 Then
        Exit Function
    End If
   
    MapNum = GetPlayerMap(Index)
    NpcNum = MapNpc(MapNum, MapNpcNum).Num
   
    ' Make sure the npc isn't already dead
    If MapNpc(MapNum, MapNpcNum).Vital(Vitals.HP) <= 0 Then
        Exit Function
    End If
   
    ' Make sure npcs dont attack more then once a second
    If GetTickCount < MapNpc(MapNum, MapNpcNum).AttackTimer + 1000 Then
        Exit Function
    End If
   
    ' Make sure we dont attack the player if they are switching maps
    If TempPlayer(Index).GettingMap = YES Then
        Exit Function
    End If
   
    MapNpc(MapNum, MapNpcNum).AttackTimer = GetTickCount
   
    ' Make sure they are on the same map
    If IsPlaying(Index) Then
        If NpcNum > 0 Then
            ' Check if at same coordinates
            If (GetPlayerY(Index) + 1 = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) = MapNpc(MapNum, MapNpcNum).x) Then
                CanNpcAttackPlayer = True
            Else
                If (GetPlayerY(Index) - 1 = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) = MapNpc(MapNum, MapNpcNum).x) Then
                    CanNpcAttackPlayer = True
                Else
                    If (GetPlayerY(Index) = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) + 1 = MapNpc(MapNum, MapNpcNum).x) Then
                        CanNpcAttackPlayer = True
                    Else
                        If (GetPlayerY(Index) = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) - 1 = MapNpc(MapNum, MapNpcNum).x) Then
                            CanNpcAttackPlayer = True
                        Else
                            If (GetPlayerY(Index) + 1 = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) + 1 = MapNpc(MapNum, MapNpcNum).x) Then
                                CanNpcAttackPlayer = True
                            Else
                                If (GetPlayerY(Index) + 1 = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) - 1 = MapNpc(MapNum, MapNpcNum).x) Then
                                    CanNpcAttackPlayer = True
                                Else
                                    If (GetPlayerY(Index) = MapNpc(MapNum, MapNpcNum).y) - 1 And (GetPlayerX(Index) + 1 = MapNpc(MapNum, MapNpcNum).x) Then
                                        CanNpcAttackPlayer = True
                                    Else
                                        If (GetPlayerY(Index) = MapNpc(MapNum, MapNpcNum).y) - 1 And (GetPlayerX(Index) - 1 = MapNpc(MapNum, MapNpcNum).x) Then
                                            CanNpcAttackPlayer = True
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If

'            Select Case MapNpc(MapNum, MapNpcNum).Dir
'                Case DIR_UP
'                    If (GetPlayerY(Index) + 1 = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) = MapNpc(MapNum, MapNpcNum).x) Then
'                        CanNpcAttackPlayer = True
'                    End If
'
'                Case DIR_DOWN
'                    If (GetPlayerY(Index) - 1 = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) = MapNpc(MapNum, MapNpcNum).x) Then
'                        CanNpcAttackPlayer = True
'                    End If
'
'                Case DIR_LEFT
'                    If (GetPlayerY(Index) = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) + 1 = MapNpc(MapNum, MapNpcNum).x) Then
'                        CanNpcAttackPlayer = True
'                    End If
'
'                Case DIR_RIGHT
'                    If (GetPlayerY(Index) = MapNpc(MapNum, MapNpcNum).y) And (GetPlayerX(Index) - 1 = MapNpc(MapNum, MapNpcNum).x) Then
'                        CanNpcAttackPlayer = True
'                    End If
'            End Select
        End If
    End If
End Function

Next Find this sub
Code:
Sub SetPlayerY(ByVal Index As Long, ByVal y As Long)
    Player(Index).Char(TempPlayer(Index).CharNum).y = y
End Sub

Below it Add this sub
Code:
Sub SetPlayerXY(ByVal Index As Long, ByVal x As Long, ByVal y As Long)
    Player(Index).Char(TempPlayer(Index).CharNum).x = x
    Player(Index).Char(TempPlayer(Index).CharNum).y = y
End Sub

Next find
Code:
Sub PlayerMove(ByVal Index As Long, ByVal Dir As Long, ByVal Movement As Long)

Replace the sub with
Code:
Sub PlayerMove(ByVal Index As Long, ByVal Dir As Long, ByVal Movement As Long)
Dim Packet As String
Dim MapNum As Long
Dim x As Long
Dim y As Long
Dim Moved As Byte

    ' Check for subscript out of range
    If IsPlaying(Index) = False Or Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Or Movement < 1 Or Movement > 2 Then
        Exit Sub
    End If
   
    Call SetPlayerDir(Index, Dir)
   
    Moved = NO
   
    Select Case Dir
        Case DIR_UP
            ' Check to make sure not outside of boundries
            If GetPlayerY(Index) > 0 Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index) - 1).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index) - 1).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index) - 1).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index), GetPlayerY(Index) - 1) = YES) Then
                        Call SetPlayerY(Index, GetPlayerY(Index) - 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Up > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Up, GetPlayerX(Index), MAX_MAPY)
                    Moved = YES
                End If
            End If
                   
        Case DIR_DOWN
            ' Check to make sure not outside of boundries
            If GetPlayerY(Index) < MAX_MAPY Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index) + 1).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index) + 1).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index) + 1).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index), GetPlayerY(Index) + 1) = YES) Then
                        Call SetPlayerY(Index, GetPlayerY(Index) + 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Down > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Down, GetPlayerX(Index), 0)
                    Moved = YES
                End If
            End If
       
        Case DIR_LEFT
            ' Check to make sure not outside of boundries
            If GetPlayerX(Index) > 0 Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index)).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index)).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index)).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index) - 1, GetPlayerY(Index)) = YES) Then
                        Call SetPlayerX(Index, GetPlayerX(Index) - 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Left > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Left, MAX_MAPX, GetPlayerY(Index))
                    Moved = YES
                End If
            End If
       
        Case DIR_RIGHT
            ' Check to make sure not outside of boundries
            If GetPlayerX(Index) < MAX_MAPX Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index)).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index)).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index)).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index) + 1, GetPlayerY(Index)) = YES) Then
                        Call SetPlayerX(Index, GetPlayerX(Index) + 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Right > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Right, 0, GetPlayerY(Index))
                    Moved = YES
                End If
            End If
           
        Case DIR_UP_LEFT
            ' Check to make sure not outside of boundries
            If GetPlayerY(Index) > 0 And GetPlayerX(Index) > 0 Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index) - 1).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index) - 1).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index) - 1).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index) - 1, GetPlayerY(Index) - 1) = YES) Then
                        Call SetPlayerXY(Index, GetPlayerX(Index) - 1, GetPlayerY(Index) - 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Up > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Up, GetPlayerX(Index), MAX_MAPY)
                    Moved = YES
                End If
            End If
           
        Case DIR_UP_RIGHT
            ' Check to make sure not outside of boundries
            If GetPlayerY(Index) > 0 And GetPlayerX(Index) < MAX_MAPX Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index) - 1).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index) - 1).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index) - 1).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index) + 1, GetPlayerY(Index) - 1) = YES) Then
                        Call SetPlayerXY(Index, GetPlayerX(Index) + 1, GetPlayerY(Index) - 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Up > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Up, GetPlayerX(Index), MAX_MAPY)
                    Moved = YES
                End If
            End If
           
        Case DIR_DOWN_LEFT
            ' Check to make sure not outside of boundries
            If GetPlayerY(Index) < MAX_MAPY And GetPlayerX(Index) > 0 Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index) + 1).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index) + 1).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) - 1, GetPlayerY(Index) + 1).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index) - 1, GetPlayerY(Index) + 1) = YES) Then
                        Call SetPlayerXY(Index, GetPlayerX(Index) - 1, GetPlayerY(Index) + 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Down > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Down, GetPlayerX(Index), 0)
                    Moved = YES
                End If
            End If
           
        Case DIR_DOWN_RIGHT
            ' Check to make sure not outside of boundries
            If GetPlayerY(Index) < MAX_MAPY And GetPlayerX(Index) < MAX_MAPX Then
                ' Check to make sure that the tile is walkable
                If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index) + 1).Type <> TILE_TYPE_BLOCKED Then
                    ' Check to see if the tile is a key and if it is check if its opened
                    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index) + 1).Type <> TILE_TYPE_KEY Or (Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index) + 1, GetPlayerY(Index) + 1).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(GetPlayerX(Index) + 1, GetPlayerY(Index) + 1) = YES) Then
                        Call SetPlayerXY(Index, GetPlayerX(Index) + 1, GetPlayerY(Index) + 1)
                       
                        Packet = SPlayerMove & SEP_CHAR & Index & SEP_CHAR & GetPlayerX(Index) & SEP_CHAR & GetPlayerY(Index) & SEP_CHAR & GetPlayerDir(Index) & SEP_CHAR & Movement & END_CHAR
                        Call SendDataToMapBut(Index, GetPlayerMap(Index), Packet)
                        Moved = YES
                    End If
                End If
            Else
                ' Check to see if we can move them to the another map
                If Map(GetPlayerMap(Index)).Down > 0 Then
                    Call PlayerWarp(Index, Map(GetPlayerMap(Index)).Down, GetPlayerX(Index), 0)
                    Moved = YES
                End If
            End If
    End Select
       
    ' Check to see if the tile is a warp tile, and if so warp them
    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Type = TILE_TYPE_WARP Then
        MapNum = Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Data1
        x = Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Data2
        y = Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Data3
                       
        Call PlayerWarp(Index, MapNum, x, y)
        Moved = YES
    End If
   
    ' Check for key trigger open
    If Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Type = TILE_TYPE_KEYOPEN Then
        x = Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Data1
        y = Map(GetPlayerMap(Index)).Tile(GetPlayerX(Index), GetPlayerY(Index)).Data2
       
        If Map(GetPlayerMap(Index)).Tile(x, y).Type = TILE_TYPE_KEY And TempTile(GetPlayerMap(Index)).DoorOpen(x, y) = NO Then
            TempTile(GetPlayerMap(Index)).DoorOpen(x, y) = YES
            TempTile(GetPlayerMap(Index)).DoorTimer = GetTickCount
                           
            Call SendDataToMap(GetPlayerMap(Index), "mapkey" & SEP_CHAR & x & SEP_CHAR & y & SEP_CHAR & 1 & END_CHAR)
            Call MapMsg(GetPlayerMap(Index), "A door has been unlocked.", White)
        End If
    End If
   
    ' They tried to hack
    If Moved = NO Then
        Call HackingAttempt(Index, "Position Modification")
    End If
End Sub

Next Find
Code:
Function CanNpcMove(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal Dir As Byte) As Boolean

Replace the sub with
Code:
Function CanNpcMove(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal Dir As Byte) As Boolean
Dim i As Long, n As Long
Dim x As Long, y As Long

    CanNpcMove = False
   
    ' Check for subscript out of range
    If MapNum <= 0 Or MapNum > MAX_MAPS Or MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then
        Exit Function
    End If
   
    x = MapNpc(MapNum, MapNpcNum).x
    y = MapNpc(MapNum, MapNpcNum).y
   
    CanNpcMove = True
   
    Select Case Dir
        Case DIR_UP
            ' Check to make sure not outside of boundries
            If y > 0 Then
                n = Map(MapNum).Tile(x, y - 1).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y - 1) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y - 1) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
               
        Case DIR_DOWN
            ' Check to make sure not outside of boundries
            If y < MAX_MAPY Then
                n = Map(MapNum).Tile(x, y + 1).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y + 1) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y + 1) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
               
        Case DIR_LEFT
            ' Check to make sure not outside of boundries
            If x > 0 Then
                n = Map(MapNum).Tile(x - 1, y).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x - 1) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x - 1) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
               
        Case DIR_RIGHT
            ' Check to make sure not outside of boundries
            If x < MAX_MAPX Then
                n = Map(MapNum).Tile(x + 1, y).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x + 1) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x + 1) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
           
        Case DIR_UP_LEFT
            ' Check to make sure not outside of boundries
            If y > 0 And x > 0 Then
                n = Map(MapNum).Tile(x - 1, y - 1).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x - 1) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y - 1) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x - 1) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y - 1) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
           
        Case DIR_UP_RIGHT
            ' Check to make sure not outside of boundries
            If y > 0 And x < MAX_MAPX Then
                n = Map(MapNum).Tile(x + 1, y - 1).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x + 1) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y - 1) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x + 1) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y - 1) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
           
        Case DIR_DOWN_LEFT
            ' Check to make sure not outside of boundries
            If y < MAX_MAPY And x > 0 Then
                n = Map(MapNum).Tile(x - 1, y + 1).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x - 1) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y + 1) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x - 1) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y + 1) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
           
        Case DIR_DOWN_RIGHT
            ' Check to make sure not outside of boundries
            If y < MAX_MAPY And x < MAX_MAPX Then
                n = Map(MapNum).Tile(x + 1, y + 1).Type
               
                ' Check to make sure that the tile is walkable
                If n <> TILE_TYPE_WALKABLE And n <> TILE_TYPE_ITEM Then
                    CanNpcMove = False
                    Exit Function
                End If
               
                ' Check to make sure that there is not a player in the way
                For i = 1 To MAX_PLAYERS
                    If IsPlaying(i) Then
                        If (GetPlayerMap(i) = MapNum) And (GetPlayerX(i) = MapNpc(MapNum, MapNpcNum).x + 1) And (GetPlayerY(i) = MapNpc(MapNum, MapNpcNum).y + 1) Then
                            CanNpcMove = False
                            Exit Function
                        End If
                    End If
                Next i
               
                ' Check to make sure that there is not another npc in the way
                For i = 1 To MAX_MAP_NPCS
                    If (i <> MapNpcNum) And (MapNpc(MapNum, i).Num > 0) And (MapNpc(MapNum, i).x = MapNpc(MapNum, MapNpcNum).x + 1) And (MapNpc(MapNum, i).y = MapNpc(MapNum, MapNpcNum).y + 1) Then
                        CanNpcMove = False
                        Exit Function
                    End If
                Next i
            Else
                CanNpcMove = False
            End If
    End Select
End Function

Next Find
Code:
Sub NpcMove(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal Dir As Long, ByVal Movement As Long)

Replace sub with
Code:
Sub NpcMove(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal Dir As Long, ByVal Movement As Long)
Dim Packet As String

    ' Check for subscript out of range
    If MapNum <= 0 Or MapNum > MAX_MAPS Or MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Or Movement < 1 Or Movement > 2 Then
        Exit Sub
    End If
   
    MapNpc(MapNum, MapNpcNum).Dir = Dir
   
    Select Case Dir
        Case DIR_UP
            MapNpc(MapNum, MapNpcNum).y = MapNpc(MapNum, MapNpcNum).y - 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
   
        Case DIR_DOWN
            MapNpc(MapNum, MapNpcNum).y = MapNpc(MapNum, MapNpcNum).y + 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
   
        Case DIR_LEFT
            MapNpc(MapNum, MapNpcNum).x = MapNpc(MapNum, MapNpcNum).x - 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
   
        Case DIR_RIGHT
            MapNpc(MapNum, MapNpcNum).x = MapNpc(MapNum, MapNpcNum).x + 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
           
        Case DIR_UP_LEFT
            MapNpc(MapNum, MapNpcNum).x = MapNpc(MapNum, MapNpcNum).x - 1
            MapNpc(MapNum, MapNpcNum).y = MapNpc(MapNum, MapNpcNum).y - 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
           
        Case DIR_UP_RIGHT
            MapNpc(MapNum, MapNpcNum).x = MapNpc(MapNum, MapNpcNum).x + 1
            MapNpc(MapNum, MapNpcNum).y = MapNpc(MapNum, MapNpcNum).y - 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
           
        Case DIR_DOWN_LEFT
            MapNpc(MapNum, MapNpcNum).x = MapNpc(MapNum, MapNpcNum).x - 1
            MapNpc(MapNum, MapNpcNum).y = MapNpc(MapNum, MapNpcNum).y + 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
           
        Case DIR_DOWN_RIGHT
            MapNpc(MapNum, MapNpcNum).x = MapNpc(MapNum, MapNpcNum).x + 1
            MapNpc(MapNum, MapNpcNum).y = MapNpc(MapNum, MapNpcNum).y + 1
            Packet = SNpcMove & SEP_CHAR & MapNpcNum & SEP_CHAR & MapNpc(MapNum, MapNpcNum).x & SEP_CHAR & MapNpc(MapNum, MapNpcNum).y & SEP_CHAR & MapNpc(MapNum, MapNpcNum).Dir & SEP_CHAR & Movement & END_CHAR
            Call SendDataToMap(MapNum, Packet)
    End Select
End Sub

Next Find
Code:
Sub NpcDir(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal Dir As Long)

Replace sub with
Code:
Sub NpcDir(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal Dir As Long)
Dim Packet As String

    ' Check for subscript out of range
    If MapNum <= 0 Or MapNum > MAX_MAPS Or MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then
        Exit Sub
    End If
   
    MapNpc(MapNum, MapNpcNum).Dir = Dir
    Packet = SNpcDir & SEP_CHAR & MapNpcNum & SEP_CHAR & Dir & END_CHAR
    Call SendDataToMap(MapNum, Packet)
End Sub

Next Find
Code:
Sub HandlePlayerMove(ByVal Index As Long, ByRef Parse() As String)

Replace sub with
Code:
Sub HandlePlayerMove(ByVal Index As Long, ByRef Parse() As String)
Dim Dir As Long, Movement As Long

    If TempPlayer(Index).GettingMap = YES Then
        Exit Sub
    End If

    Dir = Val(Parse(1))
    Movement = Val(Parse(2))
   
    ' Prevent hacking
    If Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then
        Call HackingAttempt(Index, "Invalid Direction")
        Exit Sub
    End If
   
    ' Prevent hacking
    If Movement < 1 Or Movement > 2 Then
        Call HackingAttempt(Index, "Invalid Movement")
        Exit Sub
    End If
   
    ' Prevent player from moving if they have casted a spell
    If TempPlayer(Index).CastedSpell = YES Then
        ' Check if they have already casted a spell, and if so we can't let them move
        If GetTickCount > TempPlayer(Index).AttackTimer + 1000 Then
            TempPlayer(Index).CastedSpell = NO
        Else
            Call SendPlayerXY(Index)
            Exit Sub
        End If
    End If
   
    Call PlayerMove(Index, Dir, Movement)
End Sub

Next Find
Code:
Sub HandlePlayerDir(ByVal Index As Long, ByRef Parse() As String)

Replace sub with
Code:
Sub HandlePlayerDir(ByVal Index As Long, ByRef Parse() As String)
Dim Dir As Long

    If TempPlayer(Index).GettingMap = YES Then
        Exit Sub
    End If

    Dir = Val(Parse(1))
   
    ' Prevent hacking
    If Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then
        Call HackingAttempt(Index, "Invalid Direction")
        Exit Sub
    End If
   
    Call SetPlayerDir(Index, Dir)
    Call SendDataToMapBut(Index, GetPlayerMap(Index), "playerdir" & SEP_CHAR & Index & SEP_CHAR & GetPlayerDir(Index) & END_CHAR)
End Sub

In
Code:
Sub HandleUseItem(ByVal Index As Long, ByRef Parse() As String)

Find
Code:
Case ITEM_TYPE_KEY
                Select Case GetPlayerDir(Index)
                    Case DIR_UP
                        If GetPlayerY(Index) > 0 Then
                            x = GetPlayerX(Index)
                            y = GetPlayerY(Index) - 1
                        Else
                            Exit Sub
                        End If
                       
                    Case DIR_DOWN
                        If GetPlayerY(Index) < MAX_MAPY Then
                            x = GetPlayerX(Index)
                            y = GetPlayerY(Index) + 1
                        Else
                            Exit Sub
                        End If
                           
                    Case DIR_LEFT
                        If GetPlayerX(Index) > 0 Then
                            x = GetPlayerX(Index) - 1
                            y = GetPlayerY(Index)
                        Else
                            Exit Sub
                        End If
                           
                    Case DIR_RIGHT
                        If GetPlayerX(Index) < MAX_MAPX Then
                            x = GetPlayerX(Index) + 1
                            y = GetPlayerY(Index)
                        Else
                            Exit Sub
                        End If

Replace this bit of code with
Code:
Case ITEM_TYPE_KEY
                Select Case GetPlayerDir(Index)
                    Case DIR_UP
                        If GetPlayerY(Index) > 0 Then
                            x = GetPlayerX(Index)
                            y = GetPlayerY(Index) - 1
                        Else
                            Exit Sub
                        End If
                       
                    Case DIR_DOWN
                        If GetPlayerY(Index) < MAX_MAPY Then
                            x = GetPlayerX(Index)
                            y = GetPlayerY(Index) + 1
                        Else
                            Exit Sub
                        End If
                           
                    Case DIR_LEFT
                        If GetPlayerX(Index) > 0 Then
                            x = GetPlayerX(Index) - 1
                            y = GetPlayerY(Index)
                        Else
                            Exit Sub
                        End If
                           
                    Case DIR_RIGHT
                        If GetPlayerX(Index) < MAX_MAPX Then
                            x = GetPlayerX(Index) + 1
                            y = GetPlayerY(Index)
                        Else
                            Exit Sub
                        End If
                       
                    Case DIR_UP_LEFT
                        If GetPlayerY(Index) > 0 And GetPlayerX(Index) > 0 Then
                            x = GetPlayerX(Index) - 1
                            y = GetPlayerY(Index) - 1
                        Else
                            Exit Sub
                        End If
                       
                    Case DIR_UP_RIGHT
                        If GetPlayerY(Index) > 0 And GetPlayerX(Index) < MAX_MAPX Then
                            x = GetPlayerX(Index) + 1
                            y = GetPlayerY(Index) - 1
                        Else
                            Exit Sub
                        End If
                       
                    Case DIR_DOWN_LEFT
                        If GetPlayerY(Index) < MAX_MAPY And GetPlayerX(Index) > 0 Then
                            x = GetPlayerX(Index) - 1
                            y = GetPlayerY(Index) + 1
                        Else
                            Exit Sub
                        End If
                       
                    Case DIR_DOWN_RIGHT
                        If GetPlayerY(Index) < MAX_MAPY And GetPlayerX(Index) < MAX_MAPX Then
                            x = GetPlayerX(Index) + 1
                            y = GetPlayerY(Index) + 1
                        Else
                            Exit Sub
                        End If

Next find
Code:
Sub HandleRequestNewMap

Replace this sub with
Code:
Sub HandleRequestNewMap(ByVal Index As Long, ByRef Parse() As String)
Dim Dir As Long

    Dir = Val(Parse(1))
   
    ' Prevent hacking
    If Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then
        Call HackingAttempt(Index, "Invalid Direction")
        Exit Sub
    End If
           
    Call PlayerMove(Index, Dir, 1)
End Sub


UpdateNPCAi still needs to be done.

_________________
Image


Top
 Profile  
 
PostPosted: Tue Sep 23, 2008 5:02 am 
Offline
Persistant Poster
User avatar

Joined: Wed Nov 29, 2006 11:25 pm
Posts: 860
Location: Ayer
DFA wrote:
nice, if you don't mind, upload a blank copy of MS with this implemented so we can see it in action
thanks.


It's in the post. Look at the subtitle.

_________________
Image


Top
 Profile  
 
PostPosted: Tue Sep 23, 2008 6:25 am 
Offline
Persistant Poster
User avatar

Joined: Thu Jul 24, 2008 6:42 am
Posts: 703
Google Talk: infectiousbyte@gmail.com
I checked this out, and it's loads of fun. I really like it. Great tut.

_________________
Image
GIAKEN wrote:
Since I'm into men, not women

GIAKEN wrote:
I can't take these huge penises anymore! All that's left is shame! And blood


Top
 Profile  
 
PostPosted: Tue Sep 23, 2008 6:38 am 
Offline
Community Leader
User avatar

Joined: Sun May 28, 2006 10:29 pm
Posts: 1762
Location: Salt Lake City, UT, USA
Google Talk: Darunada@gmail.com
Do you people never sleep?

Can I check the forum every 10 minutes and not have new posts once in a while?

jeeze...

_________________
I'm on Facebook! Google Plus LinkedIn My Youtube Channel Send me an email Call me with Skype Check me out on Bitbucket Yup, I'm an EVE Online player!
Why not try my app, ColorEye, on your Android devlce?
Do you like social gaming? Fight it out in Battle Juice!

I am a professional software developer in Salt Lake City, UT.


Top
 Profile  
 
PostPosted: Tue Sep 23, 2008 7:01 am 
Offline
Persistant Poster
User avatar

Joined: Fri Aug 15, 2008 3:11 pm
Posts: 633
lol nope you cant

and thats good that there are always posts

_________________
╔╗╔═╦═╦══╦═══╗
║║║║║║║╔╗║╔═╗║
║║║║║║║╚╝║║║║║
║╚╣║║║║╔╗║╚═╝║
╚═╩╩═╩╩╝╚╩═══╝


╔╦═╦╦════╦═══╗
║║║║╠═╗╔═╣╔══╝
║║║║║║║║╚═╗
║║║║║║║║╔═╝
╚═╩═╝╚╝╚╝ ?


Top
 Profile  
 
PostPosted: Tue Sep 23, 2008 3:08 pm 
Offline
Community Leader
User avatar

Joined: Mon May 29, 2006 1:00 pm
Posts: 2538
Location: Sweden
Google Talk: johansson_tk@hotmail.com
The sprite isnt animated walking south west and north east. And a hint to people who add this is to change the walk speed for diagonal movement.

_________________
I'm on Facebook!My Youtube Channel Send me an email
Image


Top
 Profile  
 
PostPosted: Tue Sep 23, 2008 8:59 pm 
Offline
Persistant Poster
User avatar

Joined: Wed Nov 29, 2006 11:25 pm
Posts: 860
Location: Ayer
That's odd.. hmm I'll figure out what's wrong when I get home.

You downloaded the source right?

_________________
Image


Top
 Profile  
 
PostPosted: Wed Oct 01, 2008 7:30 pm 
Offline
Knowledgeable
User avatar

Joined: Fri Sep 12, 2008 11:18 pm
Posts: 176
Location: England.
TonyNooblet wrote:
That's odd.. hmm I'll figure out what's wrong when I get home.

You downloaded the source right?


Downloaded source. Doesn't seem to work. Can't move diagonally. :S

Can we have a video? Meh.


Top
 Profile  
 
PostPosted: Wed Oct 01, 2008 8:01 pm 
Offline
Community Leader
User avatar

Joined: Mon May 29, 2006 1:00 pm
Posts: 2538
Location: Sweden
Google Talk: johansson_tk@hotmail.com
Dont run the client and server. Run it from the source!

And there are a few glitches, but nothing that cant be fixed.

_________________
I'm on Facebook!My Youtube Channel Send me an email
Image


Top
 Profile  
 
PostPosted: Wed Oct 01, 2008 8:11 pm 
Offline
Knowledgeable
User avatar

Joined: Fri Sep 12, 2008 11:18 pm
Posts: 176
Location: England.
William wrote:
Dont run the client and server. Run it from the source!

And there are a few glitches, but nothing that cant be fixed.


Oh ye, =-p. Thanks.

I notice quite a few bugs. Like you can go between 2 blocks & get stuck inside block area, diagonal through them. Animation issue. All can be fixed of course. =-p


Top
 Profile  
 
PostPosted: Thu Oct 02, 2008 2:32 pm 
Offline
Community Leader
User avatar

Joined: Mon May 29, 2006 1:00 pm
Posts: 2538
Location: Sweden
Google Talk: johansson_tk@hotmail.com
If those things are fixed, and movement is slowed down diagonal. I'm pretty sure this will be used by a lot of people.

_________________
I'm on Facebook!My Youtube Channel Send me an email
Image


Top
 Profile  
 
PostPosted: Thu Oct 02, 2008 2:48 pm 
Offline
Knowledgeable
User avatar

Joined: Fri Sep 12, 2008 11:18 pm
Posts: 176
Location: England.
William wrote:
If those things are fixed, and movement is slowed down diagonal. I'm pretty sure this will be used by a lot of people.


Yep. I'd definately use it, since I plan to have it.


Top
 Profile  
 
PostPosted: Sat Oct 25, 2008 1:14 pm 
Offline
Community Leader
User avatar

Joined: Mon May 29, 2006 1:00 pm
Posts: 2538
Location: Sweden
Google Talk: johansson_tk@hotmail.com
Is this tutorial from es or did you make it yourself?

_________________
I'm on Facebook!My Youtube Channel Send me an email
Image


Top
 Profile  
 
PostPosted: Sat Oct 25, 2008 8:41 pm 
Offline
Persistant Poster
User avatar

Joined: Thu Mar 29, 2007 10:30 pm
Posts: 1510
Location: Virginia, USA
Google Talk: hpmccloud@gmail.com
Definitely doesn't feel like ES' diag. movement tutorial.

_________________
Nean wrote:
Yes harold. Give it to me.

Image
Image


Top
 Profile  
 
PostPosted: Tue Oct 28, 2008 7:26 pm 
Offline
Persistant Poster
User avatar

Joined: Wed Nov 29, 2006 11:25 pm
Posts: 860
Location: Ayer
William wrote:
Is this tutorial from es or did you make it yourself?


Made completely by me, no reference or used source.

_________________
Image


Top
 Profile  
 
PostPosted: Wed Dec 01, 2021 7:52 am 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
audiobookkeeper.rucottagenet.rueyesvision.rueyesvisions.comfactoringfee.rufilmzones.rugadwall.rugaffertape.rugageboard.rugagrule.rugallduct.rugalvanometric.rugangforeman.rugangwayplatform.rugarbagechute.rugardeningleave.rugascautery.rugashbucket.rugasreturn.rugatedsweep.rugaugemodel.rugaussianfilter.rugearpitchdiameter.ru
geartreating.rugeneralizedanalysis.rugeneralprovisions.rugeophysicalprobe.rugeriatricnurse.rugetintoaflap.rugetthebounce.ruhabeascorpus.ruhabituate.ruhackedbolt.ruhackworker.ruhadronicannihilation.ruhaemagglutinin.ruhailsquall.ruhairysphere.ruhalforderfringe.ruhalfsiblings.ruhallofresidence.ruhaltstate.ruhandcoding.ruhandportedhead.ruhandradar.ruhandsfreetelephone.ru
hangonpart.ruhaphazardwinding.ruhardalloyteeth.ruhardasiron.ruhardenedconcrete.ruharmonicinteraction.ruhartlaubgoose.ruhatchholddown.ruhaveafinetime.ruhazardousatmosphere.ruheadregulator.ruheartofgold.ruheatageingresistance.ruheatinggas.ruheavydutymetalcutting.rujacketedwall.rujapanesecedar.rujibtypecrane.rujobabandonment.rujobstress.rujogformation.rujointcapsule.rujointsealingmaterial.ru
journallubricator.rujuicecatcher.rujunctionofchannels.rujusticiablehomicide.rujuxtapositiontwin.rukaposidisease.rukeepagoodoffing.rukeepsmthinhand.rukentishglory.rukerbweight.rukerrrotation.rukeymanassurance.rukeyserum.rukickplate.rukillthefattedcalf.rukilowattsecond.rukingweakfish.rukinozones.rukleinbottle.rukneejoint.ruknifesethouse.ruknockonatom.ruknowledgestate.ru
kondoferromagnet.rulabeledgraph.rulaborracket.rulabourearnings.rulabourleasing.rulaburnumtree.rulacingcourse.rulacrimalpoint.rulactogenicfactor.rulacunarycoefficient.ruladletreatediron.rulaggingload.rulaissezaller.rulambdatransition.rulaminatedmaterial.rulammasshoot.rulamphouse.rulancecorporal.rulancingdie.rulandingdoor.rulandmarksensor.rulandreform.rulanduseratio.ru
languagelaboratory.rulargeheart.rulasercalibration.rulaserlens.rulaserpulse.rulaterevent.rulatrinesergeant.rulayabout.ruleadcoating.ruleadingfirm.rulearningcurve.ruleaveword.rumachinesensible.rumagneticequator.rumagnetotelluricfield.rumailinghouse.rumajorconcern.rumammasdarling.rumanagerialstaff.rumanipulatinghand.rumanualchoke.rumedinfobooks.rump3lists.ru
nameresolution.runaphtheneseries.runarrowmouthed.runationalcensus.runaturalfunctor.runavelseed.runeatplaster.runecroticcaries.runegativefibration.runeighbouringrights.ruobjectmodule.ruobservationballoon.ruobstructivepatent.ruoceanmining.ruoctupolephonon.ruofflinesystem.ruoffsetholder.ruolibanumresinoid.ruonesticket.rupackedspheres.rupagingterminal.rupalatinebones.rupalmberry.ru
papercoating.ruparaconvexgroup.ruparasolmonoplane.ruparkingbrake.rupartfamily.rupartialmajorant.ruquadrupleworm.ruqualitybooster.ruquasimoney.ruquenchedspark.ruquodrecuperet.rurabbetledge.ruradialchaser.ruradiationestimator.rurailwaybridge.rurandomcoloration.rurapidgrowth.rurattlesnakemaster.rureachthroughregion.rureadingmagnifier.rurearchain.rurecessioncone.rurecordedassignment.ru
rectifiersubstation.ruredemptionvalue.rureducingflange.rureferenceantigen.ruregeneratedprotein.rureinvestmentplan.rusafedrilling.rusagprofile.rusalestypelease.rusamplinginterval.rusatellitehydrology.ruscarcecommodity.ruscrapermat.ruscrewingunit.ruseawaterpump.rusecondaryblock.rusecularclergy.ruseismicefficiency.ruselectivediffuser.ruсайтsemifinishmachining.ruspicetrade.ruspysale.ru
stungun.rutacticaldiameter.rutailstockcenter.rutamecurve.rutapecorrection.rutappingchuck.rutaskreasoningtechnicalgrade.rutelangiectaticlipoma.rutelescopicdamper.ruhttp://temperateclimate.rutemperedmeasure.rutenementbuilding.rutuchkasultramaficrock.ruultraviolettesting.ru


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:08 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Econ


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:09 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
54.8


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:10 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Bett


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:12 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Bett


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:13 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Comp


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:14 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Jewe


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:15 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
What


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:16 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Fris


Top
 Profile  
 
PostPosted: Tue Dec 28, 2021 8:17 pm 
Online
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 489134
Brad


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1233 posts ]  Go to page 1, 2, 3, 4, 5 ... 50  Next

All times are UTC


Who is online

Users browsing this forum: No registered users and 49 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group