[E.O 2.0] MAPOBJ Implementação + Projétil animado Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

Aldeia RPG
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

[E.O 2.0] MAPOBJ Implementação + Projétil animado

2 participantes

Ir para baixo

[E.O 2.0] MAPOBJ Implementação + Projétil animado Empty [E.O 2.0] MAPOBJ Implementação + Projétil animado

Mensagem por Kotol Qua Abr 19, 2023 5:14 pm

Bem haviam me pedido um projétil usando o sistema de animação da engine, no entanto esse sistema vem um pouco mais que quem sabe se eu tiver tempo, adiciono uns "add-on's" com objetos temporários no mapa, etc...(dá até pra brincar de fazer um SandBox se usar bem da lógica dos códigos..Inovação pro sistema de casa aí de jogadores, switch...)

O que o sistema faz? 
Projétil por animação. Mas melhorado, já que é uma variável (limitei a 30) de projéteis no mapa. O sistema atual que vi, deixa o projétil como recurso do "TempPlayer" , já eu criei um recurso em "MapObj" que como eu citei, dá pra expandir esse "MapObj" para objetos com duração de tempo, vida, que interage se movendo por matriz pré-definida ou por 'trigger' , até por "scriptStates".
-Projétil é enviado ao jogador que entra no mapa;
-Dono do projétil se sair do mapa enquanto seu projétil tem "range" ele é limpo;
-Animações pelo cliente -> Ao invés de toda movimentação ser um "SendAnimation" consumindo o servidor, deixamos o check de posição/valores no servidor, e o cliente se vira com a animação (como se virava, mas agora sem exigir do servidor);
-Tile Block = Limpar projétil e não deixar ultrapassar;
-X/Y com jogador ou NPC = Ataque;

Mas sem mais delongas, vamos ao tutorial que é bem rapidinho.

Abra seu "Server.Vbp" e crie um módulo novo e o nomeie de "ModMapObj". Agora, dentro desse módulo, adicione isto:

Spoiler:

Agora em "ModGeneral" , na "Public Sub ClearGameData" , abaixo de:

Código:
Call SetStatus("Clearing animations...")

Adicione isto:
Código:
Call SetStatus("Limpando Index dos projeteis do mapa...")
    Call ClearMapProjs


Agora, em "ModServerLoop" na "Sub ServerLoop" , procure por esta parte:
Código:
' HoT and DoT logic
                    For X = 1 To MAX_DOTS
                        HandleDoT_Player i, X
                        HandleHoT_Player i, X
                    Next

Logo abaixo adicione isto:
Código:
For X = 1 To MAX_MAPS
                        'Check for projectile
                        If GetTotalMapProjs(X) Then
                            HandleMapProjectile X
                        End If
                    Next


Agora, em "ModEnumerations" , na Enumeração "Public Enum ServerPackets" , antes de:
Código:
' Make sure SMSG_COUNT is below everything else
    smsg_count
End Enum

Enumere com isso:
Código:
SMapProj


Agora aqui é bem livre porque é onde você vai criar seu projétil, seja ele atrelado ao item ou ao seu ataque. Para liberdade eu atrelei ao ataque básico, então, em "ModHandleData" na "SubHandleAttack", procure por:
Código:
If MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Sub
 (Ou seja o último check de 'Subscript' da packet recebida do cliente)

E abaixo adicione isto:
Código:
'Testing
    CreateMapProj GetPlayerMap(Index), Index, 1, GetPlayerX(Index), GetPlayerY(Index), 4, GetPlayerDir(Index), 500

Nesse caso vai criar um projétil:
Animação Número: 1
Range: 4
Velocidade: 500ms = 0.5s por tile

Agora vamos para o cliente. Abra-o também e crie um módulo novo de nome "ModMapObj" e dentro dele adicone isto:

Spoiler:

Agora, em "ModGamelogic' , na "Public Sub GameLoop" , abaixo de:
Código:
 ' *** Start GameLoop ***
    Do While InGame
        Tick = GetTickCount                            ' Set the inital tick
        ElapsedTime = Tick - FrameTime                 ' Set the time difference for time-based movement
        FrameTime = Tick                               ' Set the time second loop time to the first.

Adicione isto:
Código:
'Check for projectiles
        For i = 1 To MAX_MAP_PROJECTILES
            If MapObj.MapProjectile(i).ProjOwner > 0 Then
                HandleMapProjectile
            End If
        Next


Agora, em "ModHandleData", na "Public Sub InitMessages" , abaixo de:
Código:
HandleDataSub(SPartyVitals) = GetAddress(AddressOf HandlePartyVitals)

Adicione isto:
Código:
HandleDataSub(SMapProj) = GetAddress(AddressOf HandleMapProj)

E ainda em "ModHandleData" ao final, adicione isto:
Código:
Private Sub HandleMapProj(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddR As Long, ByVal ExtraVar As Long)
Dim i As Long
Dim Buffer As clsBuffer
    
    ' If debug mode, handle error then exit out
    If Options.Debug = 1 Then On Error GoTo errorhandler
    
    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()
    For i = 1 To MAX_MAP_PROJECTILES
         With MapObj.MapProjectile(i)
             .ProjOwner = Buffer.ReadLong
             .ProjAnim = Buffer.ReadLong
             .ProjX = Buffer.ReadLong
             .ProjY = Buffer.ReadLong
             .ProjDir = Buffer.ReadLong
             .ProjRange = Buffer.ReadLong
             .ProjSpeed = Buffer.ReadLong
             .ProjTimer = 0
             If .ProjOwner > 0 Then
                CreateMapProj .ProjOwner, .ProjAnim, .ProjX, .ProjY, .ProjRange, .ProjDir, .ProjSpeed
             Else
                EraseMapProj i
             End If
         End With
     Next
    Set Buffer = Nothing
    
    ' Error handler
    Exit Sub
errorhandler:
    HandleError "HandleMapProj", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
    Err.Clear
    Exit Sub
End Sub

Agora, em "ModEnumerations" , na enumeração "Public Enum ServerPackets" , antes de:
Código:
' Make sure SMSG_COUNT is below everything else
    SMsg_count
End Enum

Adicione isto:
Código:
SMapProj

E pronto! Agora você tem um sistema de projétil por animação mais dinâmico logicamente e mais aberto a novas possibilidades! Qualquer dúvida ou sugestão, pode mandar!

Créditos
Kotol 
Kotol
Kotol
Moderador Local
Moderador Local

Mensagens : 77
Créditos : 17

Valentine e Souza gostam desta mensagem

Ir para o topo Ir para baixo

[E.O 2.0] MAPOBJ Implementação + Projétil animado Empty Re: [E.O 2.0] MAPOBJ Implementação + Projétil animado

Mensagem por Souza Qui Abr 20, 2023 9:10 am

Meu amigo, você é um anjo 😇
Muito obrigado <3

Souza
Novato
Novato

Mensagens : 9
Créditos : 0

Kotol gosta desta mensagem

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos