Aldeia RPG

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

Suporte no desenvolvimento de jogos


    [E.O 2.0] - Npc Objeto (v1.0)

    lucas100vzs
    lucas100vzs
    Iniciante
    Iniciante

    Mensagens : 34
    Créditos : 8

    [E.O 2.0] - Npc Objeto (v1.0) Empty [E.O 2.0] - Npc Objeto (v1.0)

    Mensagem por lucas100vzs Qui Jun 10, 2021 6:12 am

    Vamos abrir um leque de possibilidades baseado na imaginação de vocês agora. 
    Esse sistema, vai colocar o npc como objeto, e você poderá empurrá-lo pelo mapa quando apertar "CTRL". 
    O leque é aberto a sistemas que envolvem "Chaves, Portas, Quebra-Cabeça com Tiles que chequem a posição do npc para acontecer algo...." , enfim, vamos ao tutorial. 

    -CLIENT~SIDE- 

    Primeiramente, abra seu "Cliente.Vbp" , e em "ModConstants" , procure por:

    Spoiler:
    Public Const NPC_BEHAVIOUR_GUARD As Byte = 4

    E abaixo disto, adicione isto:

    Spoiler:
    Public Const NPC_BEHAVIOUR_OBJECT As Byte = 5

    Agora, abra a form "frmEditor_Npc" , e na sua ComboBox "cmbBehaviour" , nas propriedades, e em "List" , clique, e ao final dos itens, adicione:

    Spoiler:
    Object

    -SERVER~SIDE-
    E pronto, agora, vamos ao "Server~Side". 
    Abra seu Server.Vbp , e e em "ModConstants" , procure por:

    Spoiler:
    Public Const NPC_BEHAVIOUR_GUARD As Byte = 4

    E abaixo disto, adicione isto:

    Spoiler:
    Public Const NPC_BEHAVIOUR_OBJECT As Byte = 5


    Agora, em "ModCombat" , na "Function CanPlayerAttackNpc" , procure por esta linha:

    Spoiler:
    If Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_FRIENDLY And Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_SHOPKEEPER Then

    E substitua por esta:

    Spoiler:
    If Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_FRIENDLY And Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_SHOPKEEPER And Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_OBJECT Then

    Ainda na "Function CanPlayerAttackNpc", procure por:

    Spoiler:
    If NpcX = GetPlayerX(Attacker) Then
                    If NpcY = GetPlayerY(Attacker) Then

    E abaixo disto, adicione isto:

    Spoiler:
    'Check for objects
                            If Npc(NpcNum).Behaviour = NPC_BEHAVIOUR_OBJECT Then
                            
                                'Add the function to change npc direction to get better mechanics
                                Select Case GetPlayerDir(Attacker)
                                    Case DIR_UP
                                        If MapNpc(MapNum).Npc(MapNpcNum).Y - 1 < 0 Then
                                                CanPlayerAttackNpc = False
                                            Exit Function
                                        End If
                                        MapNpc(MapNum).Npc(MapNpcNum).X = MapNpc(MapNum).Npc(MapNpcNum).X
                                        MapNpc(MapNum).Npc(MapNpcNum).Y = MapNpc(MapNum).Npc(MapNpcNum).Y - 1
                                        SendMapNpcsTo Attacker, GetPlayerMap(Attacker)
                                    Case DIR_DOWN
                                        If MapNpc(MapNum).Npc(MapNpcNum).Y + 1 > Map(MapNum).MaxY Then
                                                CanPlayerAttackNpc = False
                                            Exit Function
                                        End If
                                        MapNpc(MapNum).Npc(MapNpcNum).X = MapNpc(MapNum).Npc(MapNpcNum).X
                                        MapNpc(MapNum).Npc(MapNpcNum).Y = MapNpc(MapNum).Npc(MapNpcNum).Y + 1
                                        SendMapNpcsTo Attacker, GetPlayerMap(Attacker)
                                    Case DIR_LEFT
                                        If MapNpc(MapNum).Npc(MapNpcNum).X - 1 < 0 Then
                                                CanPlayerAttackNpc = False
                                            Exit Function
                                        End If
                                        MapNpc(MapNum).Npc(MapNpcNum).X = MapNpc(MapNum).Npc(MapNpcNum).X - 1
                                        MapNpc(MapNum).Npc(MapNpcNum).Y = MapNpc(MapNum).Npc(MapNpcNum).Y
                                        SendMapNpcsTo Attacker, GetPlayerMap(Attacker)
                                    Case DIR_RIGHT
                                        If MapNpc(MapNum).Npc(MapNpcNum).X + 1 > Map(MapNum).MaxX Then
                                                CanPlayerAttackNpc = False
                                            Exit Function
                                        End If
                                        MapNpc(MapNum).Npc(MapNpcNum).X = MapNpc(MapNum).Npc(MapNpcNum).X + 1
                                        MapNpc(MapNum).Npc(MapNpcNum).Y = MapNpc(MapNum).Npc(MapNpcNum).Y
                                        SendMapNpcsTo Attacker, GetPlayerMap(Attacker)
                                End Select
                            
                            
                                CanPlayerAttackNpc = False
                                Exit Function
                            End If

    E por fim, em "ModServerLoop" , na SUB "UpdateMapLogic" , procure por esta linha:

    Spoiler:
    If Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_SHOPKEEPER Then

    E substitua por esta linha:

    Spoiler:
    If Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_SHOPKEEPER And Npc(NpcNum).Behaviour <> NPC_BEHAVIOUR_OBJECT Then

    E pronto, agora você tem um Npc do tipo objeto que poderá empurrar!  Indignity

    Pontos a considerar:
    - Quando eu disse para adicionar "NPC_BEHAVIOUR_OBJECT As Byte = 5" , lembre-se, se sua engine é modificada e não é a [E.O 2.0] , adicione o próximo valor da contagem de tipos de npc's;
    - O npc não ultrapassa as bordas do mapa, o que evita erros críticos e queda do seu servidor, ou seja, vem corrigido de erros;
    - Se você empurrar o npc aos limites de "x" e "y" , a única coisa que retira ele de lá, é um "respawn" do mapa ou manual pelo administrador, futuramente talvez eu adicione um add-on de tiles como tutorial para resetar ao passar em cima;
    - Você também não dá dano ao objeto, tal qual o objeto não te dá dano;
    - Talvez futuramente, eu faça e poste um add-on, para basear a direção de andar do npc, pela direção do próprio objeto, e adicione um novo pacote ou tipo de item equipado no jogador, pra indicar quando ele "Empurra" e quando ele simplesmente quer mudar a direção do objeto.

    Créditos
    Eu - lucas100vzs/Kotol

      Data/hora atual: Qua Jun 23, 2021 9:31 pm