O sistema de drop de itens nos npcs são lindos, mas vamos adicionar "MultiDrop" + Qualidade de vida visual pra quem está editando, fazendo mais entendível e abrindo leques. Vamos nos aproveitar do tutorial pra recursos (já que um levou pra outro...)
Vamos lá, primeiro vamos fazer a parte do cliente, portanto abra seu "client.vbp" , e na "FrmEditor_Npc" , na parte física, crie:
1x Label, Caption: Holding Items
1x ListBox, Name: lstItems
1x ComboBox, Name: cmbItems / Text: No Itens
1x CommandButton, Name: cmdAddItem / Caption: Add
1x TextBox, Name : txtAmount / Text: 1
1x Label, Caption: Amount
1x TextBox, Name: txtDrop / Text: 0
1x Label, Caption: Drop Percent
Ficará mais ou menos a exemplo assim:
Agora em "ModTypes" , procure pela "Private Type NpcRec" , e declare um TIPO: descendo, antes do primeiro "EndType" , adicione isso:
*ATENÇÃO*
Agora, em "ModCombat" , na "Public Sub PlayerAttackNpc" , procure por isso :
Vamos lá, primeiro vamos fazer a parte do cliente, portanto abra seu "client.vbp" , e na "FrmEditor_Npc" , na parte física, crie:
1x Label, Caption: Holding Items
1x ListBox, Name: lstItems
1x ComboBox, Name: cmbItems / Text: No Itens
1x CommandButton, Name: cmdAddItem / Caption: Add
1x TextBox, Name : txtAmount / Text: 1
1x Label, Caption: Amount
1x TextBox, Name: txtDrop / Text: 0
1x Label, Caption: Drop Percent
Ficará mais ou menos a exemplo assim:
Agora, dê dois cliques no "cmdAddItem" e adicione isso:
- Spoiler:
- Dim tmpString() As StringDim itemnum As Long
Dim X As Long, tmpIndex As Long
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
' exit out if needed
If Not cmbItems.ListCount > 0 Then Exit Sub
If Not lstItems.ListCount > 0 Then Exit Sub
' set the combo box properly
tmpString = Split(cmbItems.List(cmbItems.ListIndex))
' make sure it's not a clear
If Not cmbItems.List(cmbItems.ListIndex) = "No Items" Then
Npc(EditorIndex).HoldingItem(lstItems.ListIndex + 1) = cmbItems.ListIndex
Npc(EditorIndex).HoldingItemAmount(lstItems.ListIndex + 1) = txtAmount.text
Npc(EditorIndex).HoldingItemDropRate(lstItems.ListIndex + 1) = txtDrop.text
Else
Npc(EditorIndex).HoldingItem(lstItems.ListIndex + 1) = 0
Npc(EditorIndex).HoldingItemAmount(lstItems.ListIndex + 1) = 0
Npc(EditorIndex).HoldingItemDropRate(lstItems.ListIndex + 1) = 0
End If
' re-load the list
tmpIndex = lstItems.ListIndex
lstItems.Clear
For X = 1 To MAX_NPC_HOLDING_ITEMS
If Npc(EditorIndex).HoldingItem(X) > 0 Then
lstItems.AddItem X & ": " & Npc(EditorIndex).HoldingItemAmount(X) & "x " & Trim$(Item(Npc(EditorIndex).HoldingItem(X)).Name) & " :" & Npc(EditorIndex).HoldingItemDropRate(X) & "%"
Else
lstItems.AddItem X & ": No Items"
End If
Next
lstItems.ListIndex = tmpIndex
' Error handler
Exit Sub
errorhandler:
HandleError "cmbAddItem_Click", "frmEditor_Npc", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.ClearExit Sub
Agora, dê dois cliques no "txtAmount" e adicione isso:
- Spoiler:
- If Not Len(txtAmount.text) > 0 Then Exit Sub
If Not IsNumeric(txtAmount.text) Then Exit Sub
Agora dê dois cliques no "txtDrop" e adicione isso:
- Spoiler:
- If Not Len(txtDrop.text) >= 0 Then Exit Sub
If Not IsNumeric(txtDrop.text) Then Exit Sub
Agora, em "ModGameEditors", na "Public Sub NpcEditorInit()" , procure por isso:
- Spoiler:
- ' find the sound we have setIf .cmbSound.ListCount >= 0 Then
For i = 0 To .cmbSound.ListCount
If .cmbSound.List(i) = Trim$(Npc(EditorIndex).sound) Then
.cmbSound.ListIndex = i
SoundSet = True
End If
Next
If Not SoundSet Or .cmbSound.ListIndex = -1 Then .cmbSound.ListIndex = 0End If
E abaixo disto, adicione isso:
- Spoiler:
- ' Holding Items.cmbItems.Clear
.cmbItems.AddItem "No Items"
If .cmbItems.ListCount >= 0 Then
For i = 1 To MAX_ITEMS
.cmbItems.AddItem (Trim$(Item(i).Name))
Next
End If
' cache list
.lstItems.Clear
For i = 1 To MAX_NPC_HOLDING_ITEMS
If Npc(EditorIndex).HoldingItem(i) > 0 Then
.lstItems.AddItem i & ": " & Npc(EditorIndex).HoldingItemAmount(i) & "x " & Trim$(Item(Npc(EditorIndex).HoldingItem(i)).Name) & " :" & Npc(EditorIndex).HoldingItemDropRate(i) & "%"
Else
.lstItems.AddItem i & ": " & "No Items"
End If
Next.lstItems.ListIndex = 0
Agora, em "ModConstants" , no final adicione isso:
- Spoiler:
- Public Const MAX_NPC_HOLDING_ITEMS As Long = 10
Agora em "ModTypes" , procure pela "Private Type NpcRec" , e declare um TIPO: descendo, antes do primeiro "EndType" , adicione isso:
- Spoiler:
- HoldingItem(1 To MAX_NPC_HOLDING_ITEMS) As LongHoldingItemAmount(1 To MAX_NPC_HOLDING_ITEMS) As LongHoldingItemDropRate(1 To MAX_NPC_HOLDING_ITEMS) As Double
E pronto, ~Client Side~ finalizado! Vamos ao ~Server Side~.
Portanto, abra seu 'server.vbp' , e no final de "ModConstants" , adicione isso:
- Spoiler:
- Public Const MAX_NPC_HOLDING_ITEMS As Long = 10
Agora em "ModTypes" , procure pela "Private Type NpcRec" , e declare um TIPO: descendo, antes do primeiro "EndType" , adicione isso:
- Spoiler:
HoldingItem(1 To MAX_NPC_HOLDING_ITEMS) As Long
HoldingItemAmount(1 To MAX_NPC_HOLDING_ITEMS) As Long
HoldingItemDropRate(1 To MAX_NPC_HOLDING_ITEMS) As Double
*ATENÇÃO*
Agora, em "ModCombat" , na "Public Sub PlayerAttackNpc" , procure por isso :
- Spoiler:
- 'Drop the goods if they get itn = Int(Rnd * Npc(npcNum).DropChance) + 1
If n = 1 Then
Call SpawnItem(Npc(npcNum).DropItem, Npc(npcNum).DropItemValue, mapNum, MapNpc(mapNum).Npc(mapNpcNum).x, MapNpc(mapNum).Npc(mapNpcNum).y)End If
E abaixo disto, adicione isso:
- Spoiler:
- 'Drop ItemDim d As Long
For d = 1 To MAX_NPC_HOLDING_ITEMS
If Npc(NpcNum).HoldingItem(d) > 0 Then
i = Npc(NpcNum).HoldingItemDropRate(d)
n = Rnd * 100 + 1
If n <= i Then
'Make adjust on editor!!!!
Call SpawnItem(Npc(NpcNum).HoldingItem(d), Npc(NpcNum).HoldingItemAmount(d), MapNum, MapNpc(MapNum).Npc(MapNpcNum).x, MapNpc(MapNum).Npc(MapNpcNum).y)
End If
End IfNext
*ATENÇÃO* : O tutorial não sobrepõe o sistema antigo de drop que vem na máquina ou deleta, então, fica a sua escolha deixar ou tirar posteriormente, já que agora você tem um sistema de drop de até 10 itens diferentes e com chances de drop diferentes(e quantidade) para cada um.
E pronto!! Qualquer bug ou dúvida, estou por aqui!
~Créditos~
Kotol