1 Sistema de Auto-Loot 13/10/2012, 00:08
Matheus
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:
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)