Suporte ao desenvolvimento de jogos!


    [EO 2.3] 8 Direções

    Compartilhe
    avatar
    Itukakitu
    Novato
    Novato

    Mensagens : 4
    Créditos : 2

    [EO 2.3] 8 Direções

    Mensagem por Itukakitu em Qua Ago 01, 2018 8:55 pm

    Oi, esse tutorial não é meu. Todos os créditos há seus devidos autores

    Esse tutorial foi testado na EO 2.3, talvez funcione em outras versões

    Client-Side

    Primeiro vá para modGlobals e encontre

    Código:
    Public DirRight as boolean

    Adicione abaixo dele

    Código:
    Public DirUpLeft As Boolean


    Public DirUpRight As Boolean


    Public DirDownLeft As Boolean


    Public DirDownRight As Boolean


    Em modInput no sub sub CheckKeys

    Código:
    If GetAsyncKeyState(VK_UP) >= 0 Then DirUp = False


    E adicione acima disso

    Código:
    If GetAsyncKeyState(VK_UP) >= 0 And GetAsyncKeyState(VK_LEFT) >= 0 Then DirUpLeft = False

    If GetAsyncKeyState(VK_UP) >= 0 And GetAsyncKeyState(VK_RIGHT) >= 0 Then DirUpRight = False

    If GetAsyncKeyState(VK_DOWN) >= 0 And GetAsyncKeyState(VK_LEFT) >= 0 Then DirDownLeft = False

    If GetAsyncKeyState(VK_DOWN) >= 0 And GetAsyncKeyState(VK_RIGHT) >= 0 Then DirDownRight = False


    No mesmo módulo, substitua o CheckInputKeys sub por este

    Código:
    Public Sub CheckInputKeys()



    ' If debug mode, handle error then exit out





    If Options.Debug = 1 Then On Error GoTo errorhandler





    If GetKeyState(vbKeyShift) < 0 Then





    ShiftDown = True





    Else





    ShiftDown = False





    End If





    If GetKeyState(vbKeyReturn) < 0 Then





    CheckMapGetItem





    End If





    If GetKeyState(vbKeyControl) < 0 Then





    ControlDown = True





    Else





    ControlDown = False





    End If





    'Move Up Left





    If GetAsyncKeyState(VK_UP) < 0 And GetAsyncKeyState(VK_LEFT) < 0 Then





    DirUp = False





    DirDown = False





    DirLeft = False





    DirRight = False





    DirUpLeft = True





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = False





    Exit Sub





    Else





    DirUpLeft = False





    End If





    'Move Up Right





    If GetAsyncKeyState(VK_UP) < 0 And GetAsyncKeyState(VK_RIGHT) < 0 Then





    DirUp = False





    DirDown = False





    DirLeft = False





    DirRight = False





    DirUpLeft = False





    DirUpRight = True





    DirDownLeft = False





    DirDownRight = False





    Exit Sub





    Else





    DirUpRight = False





    End If





    'Move Down Left





    If GetAsyncKeyState(VK_DOWN) < 0 And GetAsyncKeyState(VK_LEFT) < 0 Then





    DirUp = False





    DirDown = False





    DirLeft = False





    DirRight = False





    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = True





    DirDownRight = False





    Exit Sub





    Else





    DirDownLeft = False





    End If





    'Move Down Right





    If GetAsyncKeyState(VK_DOWN) < 0 And GetAsyncKeyState(VK_RIGHT) < 0 Then





    DirUp = False





    DirDown = False





    DirLeft = False





    DirRight = False





    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = True





    Exit Sub





    Else





    DirDownRight = False





    End If





    'Move Up





    If GetAsyncKeyState(VK_UP) < 0 Then





    DirUp = True





    DirDown = False





    DirLeft = False





    DirRight = False





    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = False





    Exit Sub





    Else





    DirUp = False





    End If





    'Move Right





    If GetAsyncKeyState(VK_RIGHT) < 0 Then





    DirUp = False





    DirDown = False





    DirLeft = False





    DirRight = True





    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = False





    Exit Sub





    Else





    DirRight = False





    End If





    'Move down





    If GetAsyncKeyState(VK_DOWN) < 0 Then





    DirUp = False





    DirDown = True





    DirLeft = False





    DirRight = False





    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = False





    Exit Sub





    Else





    DirDown = False





    End If





    'Move left





    If GetAsyncKeyState(VK_LEFT) < 0 Then





    DirUp = False





    DirDown = False





    DirLeft = True





    DirRight = False





    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = False





    Exit Sub





    Else





    DirLeft = False





    End If





    ' Error handler





    Exit Sub





    errorhandler:





    HandleError "CheckInputKeys", "modInput", Err.Number, Err.Description, Err.Source, Err.HelpContext





    Err.Clear





    Exit Sub





    End Sub


    Agora em modConstants encontrar

    Código:
    Public Const DIR_RIGHT As Byte = 3


    E adicione diretamente abaixo dele

    Código:
    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


    Em modGameLogic no sub CanMove encontrar

    Código:
    d = GetPlayerDir(MyIndex)


    E adicione abaixo dele

    Código:
    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) 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 And Map.Left > 0 Then





    Call MapEditorLeaveMap





    Call SendPlayerRequestNewMap





    GettingMap = True





    CanMoveNow = False





    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.MaxX Then





    If CheckDirection(DIR_UP) 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 And Map.Right > 0 Then





    Call MapEditorLeaveMap





    Call SendPlayerRequestNewMap





    GettingMap = True





    CanMoveNow = False





    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) < Map.MaxY And GetPlayerX(MyIndex) > 0 Then





    If CheckDirection(DIR_DOWN) 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 And Map.Left > 0 Then





    Call MapEditorLeaveMap





    Call SendPlayerRequestNewMap





    GettingMap = True





    CanMoveNow = False





    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) < Map.MaxY And GetPlayerX(MyIndex) < Map.MaxX Then





    If CheckDirection(DIR_DOWN) 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 And Map.Right > 0 Then





    Call MapEditorLeaveMap





    Call SendPlayerRequestNewMap





    GettingMap = True





    CanMoveNow = False





    End If





    CanMove = False





    Exit Function





    End If





    End If




    No mesmo módulo, mas na função CheckDirection procure


    Código:
    Case DIR_RIGHT





    x = GetPlayerX(MyIndex) + 1





    y = GetPlayerY(MyIndex)




    Adicione dois novos casos abaixo dele


    Código:
    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




    no sub CheckMovement encontrar


    Código:
    Case DIR_RIGHT





    Call SendPlayerMove





    Player(MyIndex).XOffset = PIC_X * -1





    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) + 1)




    Adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    Call SendPlayerMove





    Player(MyIndex).YOffset = PIC_Y





    Call SetPlayerY(MyIndex, GetPlayerY(MyIndex) - 1)





    Player(MyIndex).XOffset = PIC_X





    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) - 1)





    Case DIR_UP_RIGHT





    Call SendPlayerMove





    Player(MyIndex).YOffset = PIC_Y





    Call SetPlayerY(MyIndex, GetPlayerY(MyIndex) - 1)





    Player(MyIndex).XOffset = PIC_X * -1





    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) + 1)





    Case DIR_DOWN_LEFT





    Call SendPlayerMove





    Player(MyIndex).YOffset = PIC_Y * -1





    Call SetPlayerY(MyIndex, GetPlayerY(MyIndex) + 1)





    Player(MyIndex).XOffset = PIC_X





    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) - 1)





    Case DIR_DOWN_RIGHT





    Call SendPlayerMove





    Player(MyIndex).YOffset = PIC_Y * -1





    Call SetPlayerY(MyIndex, GetPlayerY(MyIndex) + 1)





    Player(MyIndex).XOffset = PIC_X * -1





    Call SetPlayerX(MyIndex, GetPlayerX(MyIndex) + 1)




    Agora em modHandleData no sub HandlePlayerMove encontrar


    Código:
    Case DIR_RIGHT





    Player(i).XOffset = PIC_X * -1




    Adicione diretamente abaixo dele


    Código:
    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




    Em modGameLogic no sub ProcessMovement procure


    Código:
    Case DIR_RIGHT





    Player(Index).XOffset = Player(Index).XOffset + MovementSpeed





    If Player(Index).XOffset > 0 Then Player(Index).XOffset = 0




    E adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    Player(Index).YOffset = Player(Index).YOffset - MovementSpeed





    If Player(Index).YOffset < 0 Then Player(Index).YOffset = 0





    Player(Index).XOffset = Player(Index).XOffset - MovementSpeed





    If Player(Index).XOffset < 0 Then Player(Index).XOffset = 0





    Case DIR_UP_RIGHT





    Player(Index).YOffset = Player(Index).YOffset - MovementSpeed





    If Player(Index).YOffset < 0 Then Player(Index).YOffset = 0





    Player(Index).XOffset = Player(Index).XOffset + MovementSpeed





    If Player(Index).XOffset > 0 Then Player(Index).XOffset = 0





    Case DIR_DOWN_LEFT





    Player(Index).YOffset = Player(Index).YOffset + MovementSpeed





    If Player(Index).YOffset > 0 Then Player(Index).YOffset = 0





    Player(Index).XOffset = Player(Index).XOffset - MovementSpeed





    If Player(Index).XOffset < 0 Then Player(Index).XOffset = 0





    Case DIR_DOWN_RIGHT





    Player(Index).YOffset = Player(Index).YOffset + MovementSpeed





    If Player(Index).YOffset > 0 Then Player(Index).YOffset = 0





    Player(Index).XOffset = Player(Index).XOffset + MovementSpeed





    If Player(Index).XOffset > 0 Then Player(Index).XOffset = 0




    no mesmo sub encontrar


    Código:
    If GetPlayerDir(Index) = DIR_RIGHT Or GetPlayerDir(Index) = DIR_DOWN Then




    E substitua-o por este


    Código:
    If GetPlayerDir(Index) = DIR_RIGHT Or GetPlayerDir(Index) = DIR_DOWN Or GetPlayerDir(Index) = DIR_DOWN_LEFT Or GetPlayerDir(Index) = DIR_DOWN_RIGHT Then




    Exatamente abaixo deste sub no sub ProcessNpcMovement procure


    Código:
    Case DIR_RIGHT





    MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset + ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).XOffset > 0 Then MapNpc(MapNpcNum).XOffset = 0




    Adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset - ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).YOffset < 0 Then MapNpc(MapNpcNum).YOffset = 0





    MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset - ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).XOffset < 0 Then MapNpc(MapNpcNum).XOffset = 0





    Case DIR_UP_RIGHT





    MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset - ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).YOffset < 0 Then MapNpc(MapNpcNum).YOffset = 0





    MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset + ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).XOffset > 0 Then MapNpc(MapNpcNum).XOffset = 0





    Case DIR_DOWN_LEFT





    MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset + ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).YOffset > 0 Then MapNpc(MapNpcNum).YOffset = 0





    MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset - ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).XOffset < 0 Then MapNpc(MapNpcNum).XOffset = 0





    Case DIR_DOWN_RIGHT





    MapNpc(MapNpcNum).YOffset = MapNpc(MapNpcNum).YOffset + ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).YOffset > 0 Then MapNpc(MapNpcNum).YOffset = 0





    MapNpc(MapNpcNum).XOffset = MapNpc(MapNpcNum).XOffset + ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))





    If MapNpc(MapNpcNum).XOffset > 0 Then MapNpc(MapNpcNum).XOffset = 0








    Em modDirectDraw7 sob o sub-BltPlayer encontrar





    Case DIR_LEFT





    spritetop = 1




    E adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    spritetop = 3





    Case DIR_UP_RIGHT





    spritetop = 3





    Case DIR_DOWN_LEFT





    spritetop = 0





    Case DIR_DOWN_RIGHT





    spritetop = 0




    no mesmo sub encontrar


    Código:
    Case DIR_RIGHT





    If (Player(Index).XOffset < -8) Then anim = Player(Index).Step




    E adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    If (Player(Index).YOffset > 8) And (Player(Index).XOffset > 8) Then anim = Player(Index).Step





    Case DIR_UP_RIGHT





    If (Player(Index).YOffset > 8) And (Player(Index).XOffset < -8) Then anim = Player(Index).Step





    Case DIR_DOWN_LEFT





    If (Player(Index).YOffset < -8) And (Player(Index).XOffset > 8) Then anim = Player(Index).Step





    Case DIR_DOWN_RIGHT





    If (Player(Index).YOffset < -8) And (Player(Index).XOffset < -8) Then anim = Player(Index).Step




    Em sub BltNpc encontrar


    Código:
    Case DIR_RIGHT





    If (MapNpc(MapNpcNum).XOffset < -8) Then anim = MapNpc(MapNpcNum).Step




    Adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    If (MapNpc(MapNpcNum).YOffset > 8) And (MapNpc(MapNpcNum).XOffset > 8) Then anim = MapNpc(MapNpcNum).Step





    Case DIR_UP_RIGHT





    If (MapNpc(MapNpcNum).YOffset > 8) And (MapNpc(MapNpcNum).XOffset < -8) Then anim = MapNpc(MapNpcNum).Step





    Case DIR_DOWN_LEFT





    If (MapNpc(MapNpcNum).YOffset < -8) And (MapNpc(MapNpcNum).XOffset > 8) Then anim = MapNpc(MapNpcNum).Step





    Case DIR_DOWN_RIGHT





    If (MapNpc(MapNpcNum).YOffset < -8) And (MapNpc(MapNpcNum).XOffset < -8) Then anim = MapNpc(MapNpcNum).Step




    no mesmo mod encontrar
    Adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





    spritetop = 3





    Case DIR_UP_RIGHT





    spritetop = 3





    Case DIR_DOWN_LEFT





    spritetop = 0





    Case DIR_DOWN_RIGHT





    spritetop = 0




    Em modGameLogic na função IsTryingToMove encontrar


    Código:
    If DirUp Or DirDown Or DirLeft Or DirRight Then



    E substitua-o por


    Código:
    If DirUp Or DirDown Or DirLeft Or DirRight Or DirUpLeft Or DirUpRight Or DirDownLeft Or DirDownRight Then




    Em modHandleData no sub HandlePlayerData encontrar


    Código:
    DirRight = False




    Adicione abaixo dele


    Código:
    DirUpLeft = False





    DirUpRight = False





    DirDownLeft = False





    DirDownRight = False




    Client-Side terminado

     --Server-Side--

    Em modConstants encontrar


    Código:
    Public Const DIR_RIGHT As Byte = 3



    Adicione abaixo dele


    Código:
    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




    em modGameLogic em sub CanNpcMove procure


    Código:
    If mapnum <= 0 Or mapnum > MAX_MAPS Or mapNpcNum <= 0 Or mapNpcNum > MAX_MAP_NPCS Or Dir < DIR_UP Or Dir > DIR_RIGHT Then




    Substitua-o por


    Código:
    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



    no mesmo sub encontrar


    Código:
    Select Case Dir



    e adicione abaixo dele


    Código:
    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 And n <> TILE_TYPE_NPCSPAWN Then





       CanNpcMove = False





       Exit Function





       End If





       ' Check to make sure that there is not a player in the way





       For i = 1 To Player_HighIndex





       If IsPlaying(i) Then





       If (GetPlayerMap(i) = mapnum) And (GetPlayerX(i) = MapNpc(mapnum).Npc(mapNpcNum).x - 1) And (GetPlayerY(i) = MapNpc(mapnum).Npc(mapNpcNum).y - 1) Then





       CanNpcMove = False





       Exit Function





       End If





       End If





       Next





       ' 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).Npc(i).Num > 0) And (MapNpc(mapnum).Npc(i).x = MapNpc(mapnum).Npc(mapNpcNum).x - 1) And (MapNpc(mapnum).Npc(i).y = MapNpc(mapnum).Npc(mapNpcNum).y - 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Next





       ' Directional blocking





       If isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_UP + 1) And isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_LEFT + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Else





       CanNpcMove = False





       End If





       Case DIR_UP_RIGHT





       ' Check to make sure not outside of boundries





       If y > 0 And x < Map(mapnum).MaxX 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 And n <> TILE_TYPE_NPCSPAWN Then





       CanNpcMove = False





       Exit Function





       End If





       ' Check to make sure that there is not a player in the way





       For i = 1 To Player_HighIndex





       If IsPlaying(i) Then





       If (GetPlayerMap(i) = mapnum) And (GetPlayerX(i) = MapNpc(mapnum).Npc(mapNpcNum).x + 1) And (GetPlayerY(i) = MapNpc(mapnum).Npc(mapNpcNum).y - 1) Then





       CanNpcMove = False





       Exit Function





       End If





       End If





       Next





       ' 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).Npc(i).Num > 0) And (MapNpc(mapnum).Npc(i).x = MapNpc(mapnum).Npc(mapNpcNum).x + 1) And (MapNpc(mapnum).Npc(i).y = MapNpc(mapnum).Npc(mapNpcNum).y - 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Next





       ' Directional blocking





       If isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_UP + 1) And isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_RIGHT + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Else





       CanNpcMove = False





       End If





       Case DIR_DOWN_LEFT





       ' Check to make sure not outside of boundries





       If y < Map(mapnum).MaxY 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 And n <> TILE_TYPE_NPCSPAWN Then





       CanNpcMove = False





       Exit Function





       End If





       ' Check to make sure that there is not a player in the way





       For i = 1 To Player_HighIndex





       If IsPlaying(i) Then





       If (GetPlayerMap(i) = mapnum) And (GetPlayerX(i) = MapNpc(mapnum).Npc(mapNpcNum).x - 1) And (GetPlayerY(i) = MapNpc(mapnum).Npc(mapNpcNum).y + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       End If





       Next





       ' 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).Npc(i).Num > 0) And (MapNpc(mapnum).Npc(i).x = MapNpc(mapnum).Npc(mapNpcNum).x - 1) And (MapNpc(mapnum).Npc(i).y = MapNpc(mapnum).Npc(mapNpcNum).y + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Next





       ' Directional blocking





       If isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_DOWN + 1) And isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_LEFT + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Else





       CanNpcMove = False





       End If





       Case DIR_DOWN_RIGHT





       ' Check to make sure not outside of boundries





       If y < Map(mapnum).MaxY And x < Map(mapnum).MaxX 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 And n <> TILE_TYPE_NPCSPAWN Then





       CanNpcMove = False





       Exit Function





       End If





       ' Check to make sure that there is not a player in the way





       For i = 1 To Player_HighIndex





       If IsPlaying(i) Then





       If (GetPlayerMap(i) = mapnum) And (GetPlayerX(i) = MapNpc(mapnum).Npc(mapNpcNum).x + 1) And (GetPlayerY(i) = MapNpc(mapnum).Npc(mapNpcNum).y + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       End If





       Next





       ' 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).Npc(i).Num > 0) And (MapNpc(mapnum).Npc(i).x = MapNpc(mapnum).Npc(mapNpcNum).x + 1) And (MapNpc(mapnum).Npc(i).y = MapNpc(mapnum).Npc(mapNpcNum).y + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Next





       ' Directional blocking





       If isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_DOWN + 1) And isDirBlocked(Map(mapnum).Tile(MapNpc(mapnum).Npc(mapNpcNum).x, MapNpc(mapnum).Npc(mapNpcNum).y).DirBlock, DIR_RIGHT + 1) Then





       CanNpcMove = False





       Exit Function





       End If





       Else





       CanNpcMove = False





       End If




    no mesmo módulo em sub NpcMove procure


    Código:
    If mapnum <= 0 Or mapnum > MAX_MAPS Or mapNpcNum <= 0 Or mapNpcNum > MAX_MAP_NPCS Or Dir < DIR_UP Or Dir > DIR_RIGHT Or movement < 1 Or movement > 2 Then




    e substitua-o por


    Código:
    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




    No mesmo sub encontrar


    Código:
    Select Case Dir




    adicione abaixo dele


    Código:
    Case DIR_UP_LEFT





       MapNpc(mapnum).Npc(mapNpcNum).y = MapNpc(mapnum).Npc(mapNpcNum).y - 1





       MapNpc(mapnum).Npc(mapNpcNum).x = MapNpc(mapnum).Npc(mapNpcNum).x - 1





       Set buffer = New clsBuffer





       buffer.WriteLong SNpcMove





       buffer.WriteLong mapNpcNum





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).x





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).y





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).Dir





       buffer.WriteLong movement





       SendDataToMap mapnum, buffer.ToArray()





       Set buffer = Nothing





       Case DIR_UP_RIGHT





       MapNpc(mapnum).Npc(mapNpcNum).y = MapNpc(mapnum).Npc(mapNpcNum).y - 1





       MapNpc(mapnum).Npc(mapNpcNum).x = MapNpc(mapnum).Npc(mapNpcNum).x + 1





       Set buffer = New clsBuffer





       buffer.WriteLong SNpcMove





       buffer.WriteLong mapNpcNum





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).x





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).y





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).Dir





       buffer.WriteLong movement





       SendDataToMap mapnum, buffer.ToArray()





       Set buffer = Nothing





       Case DIR_DOWN_LEFT





       MapNpc(mapnum).Npc(mapNpcNum).y = MapNpc(mapnum).Npc(mapNpcNum).y + 1





       MapNpc(mapnum).Npc(mapNpcNum).x = MapNpc(mapnum).Npc(mapNpcNum).x - 1





       Set buffer = New clsBuffer





       buffer.WriteLong SNpcMove





       buffer.WriteLong mapNpcNum





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).x





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).y





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).Dir





       buffer.WriteLong movement





       SendDataToMap mapnum, buffer.ToArray()





       Set buffer = Nothing





       Case DIR_DOWN_RIGHT





       MapNpc(mapnum).Npc(mapNpcNum).y = MapNpc(mapnum).Npc(mapNpcNum).y + 1





       MapNpc(mapnum).Npc(mapNpcNum).x = MapNpc(mapnum).Npc(mapNpcNum).x + 1





       Set buffer = New clsBuffer





       buffer.WriteLong SNpcMove





       buffer.WriteLong mapNpcNum





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).x





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).y





       buffer.WriteLong MapNpc(mapnum).Npc(mapNpcNum).Dir





       buffer.WriteLong movement





       SendDataToMap mapnum, buffer.ToArray()





       Set buffer = Nothing




    em modHandleData no sub HandlePlayerMove procure


    Código:
    If Dir < DIR_UP Or Dir > DIR_RIGHT Then




    e substitua-o por


    Código:
    If Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then




    no mesmo módulo no sub HandlePlayerDir encontrar


    Código:
    If Dir < DIR_UP Or Dir > DIR_RIGHT Then




    e substitua-o por


    Código:
    If Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then




    no sub HandleRequestNewMap encontrar


    Código:
    If Dir < DIR_UP Or Dir > DIR_RIGHT Then




    e substitua-o por


    Código:
    If Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Then




    em modServerLoop no sub UpdateMapLogic procure


    Código:
    Select Case i





       Case 0





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       Case 1





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       Case 2





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       Case 3





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End Select




    e substituí-lo com este


    Código:
    Select Case i





       Case 0





       ' Up Left





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_LEFT) Then





       Call NpcMove(mapnum, x, DIR_UP_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Up right





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_UP_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Left





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_LEFT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Right





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       Case 1





       ' Up Left





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_LEFT) Then





       Call NpcMove(mapnum, x, DIR_UP_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Up right





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_UP_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Left





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_LEFT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Right





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       Case 2





       ' Up Left





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_LEFT) Then





       Call NpcMove(mapnum, x, DIR_UP_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Up right





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_UP_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Left





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_LEFT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Right





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       Case 3





       ' Up Left





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_LEFT) Then





       Call NpcMove(mapnum, x, DIR_UP_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Up right





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_UP_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_UP_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Left





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x > TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_LEFT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Down Right





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If MapNpc(mapnum).Npc(x).x < TargetX Then





       If CanNpcMove(mapnum, x, DIR_DOWN_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_DOWN_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End If





       ' Left





       If MapNpc(mapnum).Npc(x).x > TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_LEFT) Then





       Call NpcMove(mapnum, x, DIR_LEFT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Right





       If MapNpc(mapnum).Npc(x).x < TargetX And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_RIGHT) Then





       Call NpcMove(mapnum, x, DIR_RIGHT, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Up





       If MapNpc(mapnum).Npc(x).y > TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_UP) Then





       Call NpcMove(mapnum, x, DIR_UP, MOVING_WALKING)





       didwalk = True





       End If





       End If





       ' Down





       If MapNpc(mapnum).Npc(x).y < TargetY And Not didwalk Then





       If CanNpcMove(mapnum, x, DIR_DOWN) Then





       Call NpcMove(mapnum, x, DIR_DOWN, MOVING_WALKING)





       didwalk = True





       End If





       End If





       End Select




    no modPlayer no sub PlayerMove procure


    Código:
    If IsPlaying(index) = False Or Dir < DIR_UP Or Dir > DIR_RIGHT Or movement < 1 Or movement > 2 Then




    substitua-o por


    Código:
    If IsPlaying(index) = False Or Dir < DIR_UP Or Dir > DIR_DOWN_RIGHT Or movement < 1 Or movement > 2 Then

    no mesmo sub encontrar
    Código:
    Select Case Dir

    abaixo adicionar

    Código:
    Case DIR_UP_LEFT





       ' Check to make sure not outside of boundries





       If GetPlayerY(index) > 0 Or GetPlayerX(index) > 0 Then





       ' Check to make sure that the tile is walkable





       If Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_UP + 1) And Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_LEFT + 1) Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) - 1, GetPlayerY(index) - 1).Type <> TILE_TYPE_BLOCKED Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) - 1, GetPlayerY(index) - 1).Type <> TILE_TYPE_RESOURCE 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 SetPlayerY(index, GetPlayerY(index) - 1)





       Call SetPlayerX(index, GetPlayerX(index) - 1)





       SendPlayerMove index, movement, sendToSelf





       Moved = YES





       End If





       End If





       End If





       End If





       Else





       ' Check to see if we can move them to the another map





       If Map(GetPlayerMap(index)).Up > 0 And Map(GetPlayerMap(index)).Left > 0 Then





       NewMapY = Map(Map(GetPlayerMap(index)).Up).MaxY





       Call PlayerWarp(index, Map(GetPlayerMap(index)).Up, GetPlayerX(index), NewMapY)





       Moved = YES





       ' clear their target





       TempPlayer(index).target = 0





       TempPlayer(index).targetType = TARGET_TYPE_NONE





       SendTarget index





       End If





       End If





       Case DIR_UP_RIGHT





       ' Check to make sure not outside of boundries





       If GetPlayerY(index) > 0 Or GetPlayerX(index) < Map(mapnum).MaxX Then





       ' Check to make sure that the tile is walkable





       If Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_UP + 1) And Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_RIGHT + 1) Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) + 1, GetPlayerY(index) - 1).Type <> TILE_TYPE_BLOCKED Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) + 1, GetPlayerY(index) - 1).Type <> TILE_TYPE_RESOURCE 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 SetPlayerY(index, GetPlayerY(index) - 1)





       Call SetPlayerX(index, GetPlayerX(index) + 1)





       SendPlayerMove index, movement, sendToSelf





       Moved = YES





       End If





       End If





       End If





       End If





       Else





       ' Check to see if we can move them to the another map





       If Map(GetPlayerMap(index)).Up > 0 And Map(GetPlayerMap(index)).Right > 0 Then





       NewMapY = Map(Map(GetPlayerMap(index)).Up).MaxY





       Call PlayerWarp(index, Map(GetPlayerMap(index)).Up, GetPlayerX(index), NewMapY)





       Moved = YES





       ' clear their target





       TempPlayer(index).target = 0





       TempPlayer(index).targetType = TARGET_TYPE_NONE





       SendTarget index





       End If





       End If





       Case DIR_DOWN_LEFT





       ' Check to make sure not outside of boundries





       If GetPlayerY(index) < Map(mapnum).MaxY Or GetPlayerX(index) > 0 Then





       ' Check to make sure that the tile is walkable





       If Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_DOWN + 1) And Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_LEFT + 1) Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) - 1, GetPlayerY(index) + 1).Type <> TILE_TYPE_BLOCKED Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) - 1, GetPlayerY(index) + 1).Type <> TILE_TYPE_RESOURCE 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 SetPlayerY(index, GetPlayerY(index) + 1)





       Call SetPlayerX(index, GetPlayerX(index) - 1)





       SendPlayerMove index, movement, sendToSelf





       Moved = YES





       End If





       End If





       End If





       End If





       Else





       ' Check to see if we can move them to the another map





       If Map(GetPlayerMap(index)).Down > 0 And Map(GetPlayerMap(index)).Left > 0 Then





       Call PlayerWarp(index, Map(GetPlayerMap(index)).Down, GetPlayerX(index), 0)





       Moved = YES





       ' clear their target





       TempPlayer(index).target = 0





       TempPlayer(index).targetType = TARGET_TYPE_NONE





       SendTarget index





       End If





       End If





       Case DIR_DOWN_RIGHT





       ' Check to make sure not outside of boundries





       If GetPlayerY(index) < Map(mapnum).MaxY Or GetPlayerX(index) < Map(mapnum).MaxX Then





       ' Check to make sure that the tile is walkable





       If Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_DOWN + 1) And Not isDirBlocked(Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).DirBlock, DIR_RIGHT + 1) Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) + 1, GetPlayerY(index) + 1).Type <> TILE_TYPE_BLOCKED Then





       If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) + 1, GetPlayerY(index) + 1).Type <> TILE_TYPE_RESOURCE 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 SetPlayerY(index, GetPlayerY(index) + 1)





       Call SetPlayerX(index, GetPlayerX(index) + 1)





       SendPlayerMove index, movement, sendToSelf





       Moved = YES





       End If





       End If





       End If





       End If





       Else





       ' Check to see if we can move them to the another map





       If Map(GetPlayerMap(index)).Down > 0 And Map(GetPlayerMap(index)).Right > 0 Then





       Call PlayerWarp(index, Map(GetPlayerMap(index)).Down, GetPlayerX(index), 0)





       Moved = YES





       ' clear their target





       TempPlayer(index).target = 0





       TempPlayer(index).targetType = TARGET_TYPE_NONE





       SendTarget index





       End If





       End If


    no sub ForcePlayerMove substitua todo o sub com este

    Código:
    Sub ForcePlayerMove(ByVal index As Long, ByVal movement As Long, ByVal Direction As Long)





       If Direction < DIR_UP Or Direction > DIR_DOWN_RIGHT Then Exit Sub





       If movement < 1 Or movement > 2 Then Exit Sub





       Select Case Direction





       Case DIR_UP





       If GetPlayerY(index) = 0 Then Exit Sub





       Case DIR_LEFT





       If GetPlayerX(index) = 0 Then Exit Sub





       Case DIR_DOWN





       If GetPlayerY(index) = Map(GetPlayerMap(index)).MaxY Then Exit Sub





       Case DIR_RIGHT





       If GetPlayerX(index) = Map(GetPlayerMap(index)).MaxX Then Exit Sub





       Case DIR_UP_LEFT





       If GetPlayerY(index) = 0 And GetPlayerX(index) = 0 Then Exit Sub





       Case DIR_UP_RIGHT





       If GetPlayerY(index) = 0 And GetPlayerX(index) = Map(GetPlayerMap(index)).MaxX Then Exit Sub





       Case DIR_DOWN_LEFT





       If GetPlayerY(index) = Map(GetPlayerMap(index)).MaxY And GetPlayerX(index) = 0 Then Exit Sub





       Case DIR_DOWN_RIGHT





       If GetPlayerY(index) = Map(GetPlayerMap(index)).MaxY And GetPlayerX(index) = Map(GetPlayerMap(index)).MaxX Then Exit Sub





       End Select





       PlayerMove index, Direction, movement, True





    End Sub


    no sub UseItem ache

    Código:
    Case DIR_RIGHT





       If GetPlayerX(index) < Map(GetPlayerMap(index)).MaxX Then





       x = GetPlayerX(index) + 1





       y = GetPlayerY(index)





       Else





       Exit Sub





       End If


    adicione abaixo dele

    Código:
    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) < Map(GetPlayerMap(index)).MaxX Then





       x = GetPlayerX(index) + 1





       y = GetPlayerY(index) - 1





       Else





       Exit Sub





       End If





       Case DIR_DOWN_LEFT





       If GetPlayerY(index) < Map(GetPlayerMap(index)).MaxY 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) < Map(GetPlayerMap(index)).MaxY And GetPlayerX(index) > 0 Then





       x = GetPlayerX(index) + 1





       y = GetPlayerY(index) + 1





       Else





       Exit Sub





       End If


    em modCombat no sub CanPlayerAttackNpc procure

    Código:
    Select Case GetPlayerDir(attacker)





       Case DIR_UP





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y + 1





       Case DIR_DOWN





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y - 1





       Case DIR_LEFT





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x + 1





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y





       Case DIR_RIGHT





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x - 1





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y





       End Select


    e substitua-o por

    Código:
    Select Case GetPlayerDir(attacker)





       Case DIR_UP, DIR_UP_LEFT, DIR_UP_RIGHT





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y + 1





       Case DIR_DOWN, DIR_DOWN_LEFT, DIR_DOWN_RIGHT





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y - 1





       Case DIR_LEFT





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x + 1





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y





       Case DIR_RIGHT





       NpcX = MapNpc(mapnum).Npc(mapNpcNum).x - 1





       NpcY = MapNpc(mapnum).Npc(mapNpcNum).y





       End Select


    no sub CanPlayerAttackPlayer encontrar

    Código:
    Select Case GetPlayerDir(attacker)





       Case DIR_UP





       If Not ((GetPlayerY(victim) + 1 = GetPlayerY(attacker)) And (GetPlayerX(victim) = GetPlayerX(attacker))) Then Exit Function





       Case DIR_DOWN





       If Not ((GetPlayerY(victim) - 1 = GetPlayerY(attacker)) And (GetPlayerX(victim) = GetPlayerX(attacker))) Then Exit Function





       Case DIR_LEFT





       If Not ((GetPlayerY(victim) = GetPlayerY(attacker)) And (GetPlayerX(victim) + 1 = GetPlayerX(attacker))) Then Exit Function





       Case DIR_RIGHT





       If Not ((GetPlayerY(victim) = GetPlayerY(attacker)) And (GetPlayerX(victim) - 1 = GetPlayerX(attacker))) Then Exit Function





       Case Else





       Exit Function





       End Select

    e substitua-o por

    Código:
    Select Case GetPlayerDir(attacker)





       Case DIR_UP, DIR_UP_LEFT, DIR_UP_RIGHT





       If Not ((GetPlayerY(victim) + 1 = GetPlayerY(attacker)) And (GetPlayerX(victim) = GetPlayerX(attacker))) Then Exit Function





       Case DIR_DOWN, DIR_DOWN_LEFT, DIR_DOWN_RIGHT





       If Not ((GetPlayerY(victim) - 1 = GetPlayerY(attacker)) And (GetPlayerX(victim) = GetPlayerX(attacker))) Then Exit Function





       Case DIR_LEFT





       If Not ((GetPlayerY(victim) = GetPlayerY(attacker)) And (GetPlayerX(victim) + 1 = GetPlayerX(attacker))) Then Exit Function





       Case DIR_RIGHT





       If Not ((GetPlayerY(victim) = GetPlayerY(attacker)) And (GetPlayerX(victim) - 1 = GetPlayerX(attacker))) Then Exit Function





       Case Else





       Exit Function





       End Select



    É isso aí! Eu pensei que nunca ia acaba

    Creditos: Criar e Disponibilizar o tutorial blwcrow
    avatar
    Profane ~
    Administrador
    Administrador

    Mensagens : 728
    Créditos : 125

    Re: [EO 2.3] 8 Direções

    Mensagem por Profane ~ em Qui Ago 02, 2018 1:03 pm

    Agora sim, arrumado e bunito.

    Parabéns e obrigado por nos trazer esse sistema.

    Para os que interessam em passar para o DX8; as apenas pequenas modificações que precisam ser feitas, como por exemplo ao inves de aplicar as mudanças na BLTPlayer, a mudança é feita numa DrawPlayer (que é a versão dx8 da Blt)

    Continue nos trazendo mais sistemas Old Gallaxy < 3

    Att


    _________________
    "If you don't belong here, just build a place where you do."

      Data/hora atual: Ter Out 23, 2018 10:36 am