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.
Primeiramente, abra seu "Cliente.Vbp" , e em "ModConstants" , procure por:
E abaixo disto, adicione isto:
Agora, abra a form "frmEditor_Npc" , e na sua ComboBox "cmbBehaviour" , nas propriedades, e em "List" , clique, e ao final dos itens, adicione:
Abra seu Server.Vbp , e e em "ModConstants" , procure por:
E abaixo disto, adicione isto:
Agora, em "ModCombat" , na "Function CanPlayerAttackNpc" , procure por esta linha:
E substitua por esta:
Ainda na "Function CanPlayerAttackNpc", procure por:
E abaixo disto, adicione isto:
E por fim, em "ModServerLoop" , na SUB "UpdateMapLogic" , procure por esta linha:
E substitua por esta linha:
E pronto, agora você tem um Npc do tipo objeto que poderá empurrar!
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.
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!
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