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

Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir para baixo  Mensagem [Página 1 de 1]

1Sistema de Auto-Loot Empty Sistema de Auto-Loot 13/10/2012, 00:08

Matheus

Matheus
Membro V
Membro V


Ele
funciona da seguinte maneira, quando você ativa o Check Box no Cliente
ele manda uma packet ativando o Auto-Loot, ao matar um NPC se ele dropar
algo ao invez de ir para o chão e você ter que ir catar ele vem
automaticamente para seu inventario mais é claro se seu inventario tiver
espaço.

Client~Side

Começando crie na frmMirage um Check Box com nome chkAuto como na imagem em Anexo:

Sistema de Auto-Loot Scaled.php?server=3&filename=tutorialautoloot

Clique duas vezes no Check Box e adicione isso:

Código:
Call SendData("autoloot" & SEP_CHAR & chkAuto.Value & END_CHAR)

Server~Side

Procure por:

Código:
Type PlayerRec

Abaixo de:

Código:
PK As Byte

Adicione:

Código:
AutoLoot As Boolean

No final do modTypes Adicione:

Código:
Function GetPlayerAutoLoot(ByVal Index As Long) As long
    GetPlayerAutoLuut = Player(Index).Char(Player(Index).CharNum).AutoLoot
End Function

Sub SetPlayerAutoLoot(ByVal Index As string, _
  ByVal AutoLot As Boolean)
    Player(Index).Char(Player(Index).CharNum).AutoLoot = AutoLoot
End Sub

Procure por:

Código:
Case "atack"

Acima dessa Case Adicione:

Código:
Case "autoloot"
            If Val(Parse(1)) = 0 Then
                Call SetPlayerAutoLoot(Index, true)
            Else
                Call SetPlayerAutoLoot(Index, false)
            End If
            Exit Sub

Agora Procure por:

Código:
Sub AttackNpc(ByVal Attacker As Long, _

Subistitua até o End Sub por:

Código:
Sub AttackNpc(ByVal Attacker As Long, _
  ByVal MapNpcNum As Long, _
  ByVal Damage As Long)
    Dim Name As String
    Dim Exp As Long
    Dim N As Long, i As Long, x As Long, o As Long
    Dim MapNum As Long, NpcNum As Long
    Dim ItemNum As Long, ItemValue As Long

    ' Checar por RTE9
    If IsPlaying(Attacker) = False Or MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or Damage < 0 Then
        Exit Sub
    End If

    ' Enviar esta packet, então eles podem ver a pessoa atacando.
    MapNum = GetPlayerMap(Attacker)
    NpcNum = MapNpc(MapNum, MapNpcNum).num
    Name = Trim$(Npc(NpcNum).Name)
    MapNpc(MapNum, MapNpcNum).LastAttack = GetTickCount

    If Damage >= MapNpc(MapNum, MapNpcNum).HP Then

        ' Checar por uma arma e falar dano
        Call BattleMsg(Attacker, "Você matou um(a) " & Name, BrightRed, 0)
        Dim add As String

        add = 0

        If GetPlayerWeaponSlot(Attacker) > 0 Then
            add = add + Item(GetPlayerInvItemNum(Attacker, GetPlayerWeaponSlot(Attacker))).AddEXP
        End If

        If GetPlayerArmorSlot(Attacker) > 0 Then
            add = add + Item(GetPlayerInvItemNum(Attacker, GetPlayerArmorSlot(Attacker))).AddEXP
        End If

        If GetPlayerShieldSlot(Attacker) > 0 Then
            add = add + Item(GetPlayerInvItemNum(Attacker, GetPlayerShieldSlot(Attacker))).AddEXP
        End If

        If GetPlayerHelmetSlot(Attacker) > 0 Then
            add = add + Item(GetPlayerInvItemNum(Attacker, GetPlayerHelmetSlot(Attacker))).AddEXP
        End If
                add = Mid$(add, 1, 1) & "." & Right$(add, 2)
            End If
        End If

        ' Calcular experiência dada ao atacante
        If add > 0 Then
            Exp = Npc(NpcNum).Exp + (Npc(NpcNum).Exp * Val(add))
        Else
            Exp = Npc(NpcNum).Exp
        End If

        ' Ter certeza que não dar experiência menor que 0.
        If Exp < 0 Then
            Exp = 1
        End If

        ' Checar se está em grupo, se sim, dividir experiência.
        If Player(Attacker).InParty = 0 Then
            If GetPlayerLevel(Attacker) = MAX_LEVEL Then
                Call SetPlayerExp(Attacker, Experience(MAX_LEVEL))
                Call BattleMsg(Attacker, "Você não pode mais ganhar experiência!", BrightBlue, 0)
            Else
                Call SetPlayerExp(Attacker, GetPlayerExp(Attacker) + Exp)
                Call BattleMsg(Attacker, "Você ganhou " & Exp & " de experiência.", BrightBlue, 0)
            End If

        Else
            o = 0

            For i = 1 To MAX_PARTY_MEMBERS

                If Party(Player(Attacker).PartyID).Member(i) <> Attacker Then
                    If Party(Player(Attacker).PartyID).Member(i) <> 0 Then
                        If GetPlayerMap(Attacker) = GetPlayerMap(Party(Player(Attacker).PartyID).Member(i)) Then
                            o = o + 1
                        End If
                    End If
                End If

            Next

            If GetPlayerLevel(Attacker) = MAX_LEVEL Then
                Call SetPlayerExp(Attacker, Experience(MAX_LEVEL))
                Call BattleMsg(Attacker, "Você não pode mais ganhar experiência!", BrightBlue, 0)
            Else

                If o <> 0 Then
                    Call SetPlayerExp(Attacker, GetPlayerExp(Attacker) + Int(Exp * 0.75))
                    Call BattleMsg(Attacker, "Você ganhou " &
Int(Exp * 0.75) & " de experiência e dividiu " & Int(Exp * 0.25)
 & " com seu grupo.", BrightBlue, 0)
                Else
                    Call SetPlayerExp(Attacker, GetPlayerExp(Attacker) + Exp)
                    Call BattleMsg(Attacker, "Você ganhou " & Exp
& " de experiência, mas não pôde dividir com o seu grupo.",
BrightBlue, 0)
                End If
            End If

            If o <> 0 Then

                For i = 1 To MAX_PARTY_MEMBERS

                    If Party(Player(Attacker).PartyID).Member(i)
<> Attacker And Party(Player(Attacker).PartyID).Member(i) <>
 0 Then
                        If GetPlayerLevel(Attacker) = MAX_LEVEL Then
                            Call SetPlayerExp(Party(Player(Attacker).PartyID).Member(i), Experience(MAX_LEVEL))
                            Call
BattleMsg(Party(Player(Attacker).PartyID).Member(i), "Você não pode mais
 ganhar experiência!", BrightBlue, 0)
                        Else
                            Call
SetPlayerExp(Party(Player(Attacker).PartyID).Member(i),
GetPlayerExp(Party(Player(Attacker).PartyID).Member(i)) + Int(Exp *
(0.25 / o)))
                            Call
BattleMsg(Party(Player(Attacker).PartyID).Member(i), "Você ganhou "
& Int(Exp * (0.25 / o)) & " de experiência do seu grupo.",
BrightBlue, 0)
                        End If
                    End If

                Next

            End If
        End If

        For i = 1 To MAX_NPC_DROPS

            ' Drop the goods if they get it
            N = Int(Rnd * Npc(NpcNum).ItemNPC(i).Chance) + 1

            If N = 1 Then
                If GetPlayerAutoLoot(Attacker) = False Then
                    Call SpawnItem(Npc(NpcNum).ItemNPC(i).ItemNum,
Npc(NpcNum).ItemNPC(i).ItemValue, MapNum, MapNpc(MapNum, MapNpcNum).x,
MapNpc(MapNum, MapNpcNum).y)
                Else
                    ItemNum = Npc(NpcNum).ItemNPC(i).ItemNum
                    ItemValue = Npc(NpcNum).ItemNPC(i).ItemValue
                    If ItemNum <> 0 Then
                            Call GiveItem(Attacker, Npc(NpcNum).ItemNPC(i).ItemNum, Npc(NpcNum).ItemNPC(i).ItemValue)
                                If Item(ItemNum).Type = ITEM_TYPE_CURRENCY Then
                                    Call PlayerMsg(Attacker, "Você pegou
 um(a) " & ItemValue & "" & Trim$(Item(ItemNum).Name),
Yellow)
                                    Call PlayerMsg(Attacker, "Você pegou um(a) " & Trim$(Item(ItemNum).Name), Yellow)
                                End If
                        Else
                            Call
SpawnItem(Npc(NpcNum).ItemNPC(i).ItemNum,
Npc(NpcNum).ItemNPC(i).ItemValue, MapNum, MapNpc(MapNum, MapNpcNum).x,
MapNpc(MapNum, MapNpcNum).y)
                        End If
                    Else
                    End If
                End If
            End If

        Next

        ' Agora, setar HP para 0
        MapNpc(MapNum, MapNpcNum).num = 0
        MapNpc(MapNum, MapNpcNum).SpawnWait = GetTickCount
        MapNpc(MapNum, MapNpcNum).HP = 0
        Call SendDataToMap(MapNum, "NPCDEAD" & SEP_CHAR & MapNpcNum & END_CHAR)

        ' Checar por level up!
        Call CheckPlayerLevelUp(Attacker)

        ' Checar para ver se algum membro do grupo ganhou level com a experiência
        If Player(Attacker).InParty = YES Then

            For x = 1 To MAX_PARTY_MEMBERS

                If Party(Player(Attacker).PartyID).Member(x) <> 0 Then
                    Call CheckPlayerLevelUp(Party(Player(Attacker).PartyID).Member(x))
                End If

            Next

        End If

        Call TakeFromGrid(MapNum, MapNpc(MapNum, MapNpcNum).x, MapNpc(MapNum, MapNpcNum).y)

        ' Checar se o alvo que morreu era um NPC e setar alvo para 0
          If Player(Attacker).TargetType = TARGET_TYPE_NPC And Player(Attacker).Target = MapNpcNum Then
            Player(Attacker).Target = 0
            Player(Attacker).TargetType = 0
        End If

    Else

        ' NPC não morreu, apenas fazer o dano
        MapNpc(MapNum, MapNpcNum).HP = MapNpc(MapNum, MapNpcNum).HP - Damage

        ' Checar por arma e mandar mensagem
        Call BattleMsg(Attacker, "Você atacou um(a) " & Name & " tirando " & Damage & " de dano.", White, 0)

        If N = 0 Then

            'Call PlayerMsg(Attacker, "Você atacou um(a) " & Name & " tirando " & Damage & " de dano.", White)
        Else

            'Call PlayerMsg(Attacker, "Você atacou um(a) " & Name
& " com um(a) " & Trim$(Item(n).Name) & " tirando " &
Damage & " de dano.", White)
        End If

        ' Checar se devemos mandar uma mensagem
        If MapNpc(MapNum, MapNpcNum).Target = 0 And MapNpc(MapNum, MapNpcNum).Target <> Attacker Then
            If Trim$(Npc(NpcNum).AttackSay) <> vbNullString Then
                Call PlayerMsg(Attacker, Trim$(Npc(NpcNum).Name) & " : " & Trim$(Npc(NpcNum).AttackSay), SayColor)
            End If
        End If

        ' Setar o alvo do NPC para o jogador.
        MapNpc(MapNum, MapNpcNum).Target = Attacker
        MapNpc(MapNum, MapNpcNum).TargetType = TARGET_TYPE_PLAYER

        ' Agora checar pela IA.
        If Npc(MapNpc(MapNum, MapNpcNum).num).Behavior = NPC_BEHAVIOR_GUARD Then

            For i = 1 To MAX_MAP_NPCS

                If MapNpc(MapNum, i).num = MapNpc(MapNum, MapNpcNum).num Then
                    MapNpc(MapNum, i).Target = Attacker
                    MapNpc(MapNum, i).TargetType = TARGET_TYPE_PLAYER
                End If

            Next

        End If
    End If

    'Call SendDataToMap(MapNum, "npchp" & SEP_CHAR & MapNpcNum
& SEP_CHAR & MapNpc(MapNum, MapNpcNum).HP & SEP_CHAR &
GetNpcMaxHP(MapNpc(MapNum, MapNpcNum).num) & END_CHAR)
    ' Resetar o timer de ataque
    Player(Attacker).AttackTimer = GetTickCount
End Sub

É isso ai lembrando, antes de salvar teste.

Créditos? M.Dutra
Ruffy por posta aqui




Última edição por Ruffy em 13/10/2012, 02:19, editado 1 vez(es)

2Sistema de Auto-Loot Empty Re: Sistema de Auto-Loot 13/10/2012, 00:54

newbie123

newbie123
Membro Honorário III
Membro Honorário III
Ja dei a REP, a e tem uma maneira mais facil de fazer esse sistema mas mesmo assim valeu. o/

3Sistema de Auto-Loot Empty Re: Sistema de Auto-Loot 13/10/2012, 01:57

Myke ~

Myke ~
Membro Honorário I
Membro Honorário I
Esse Sistema de eu não me engano tem uns erros, que talvez alguns iniciantes não consigam arrumar.
E Cadê os Créditos do M.Dutra?

Atenciosamente ~
Papa Gates

4Sistema de Auto-Loot Empty Re: Sistema de Auto-Loot 13/10/2012, 02:01

newbie123

newbie123
Membro Honorário III
Membro Honorário III
Puts o tutorial não foi o Ruffy que fez que feio postando tutorial dos outros sem dar os creditos kkkk brinks, depois eu vou postar o mesmo sistema só que mais simples e sem erros.

5Sistema de Auto-Loot Empty Re: Sistema de Auto-Loot 13/10/2012, 02:28

Matheus

Matheus
Membro V
Membro V
Postei para ajuda novatos , para que vou cria um novo pq já tem muitos criados que pode ajuda os inicante? --' , Créditos adicionados esqueci .-.

Conteúdo patrocinado


Ver o tópico anterior Ver o tópico seguinte Ir para o topo  Mensagem [Página 1 de 1]

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