Makers Brasil
Bem Vindos a Maker´s Brasil (um forum para criação de servidores 2D e 3D)Nos desejamos boa sorte no seu projeto!

Sistema de Quest

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Sistema de Quest

Mensagem por Ricardo XD em Sab Set 10, 2011 6:31 am

Antes de Coemçar o tutorial quero agradecer de mais a Alatar, por disbonibilziar esse brilhante sistema.

Imagem do Sistema(Na versão Inglesa)

[img width=587 height=457][Você precisa estar registrado e conectado para ver este link.]

Começando

Baixe a form de edição de quest (Download)

Servidor

Primeiramente adicione a modSvQuest no servidor. Agora procure por:

Código:
If NPC(npcNum).Behaviour <> NPC_BEHAVIOUR_FRIENDLY And NPC(npcNum).Behaviour <> NPC_BEHAVIOUR_SHOPKEEPER Then


Troque para:

Código:
If NPC(npcNum).Behaviour <> NPC_BEHAVIOUR_FRIENDLY And NPC(npcNum).Behaviour <> NPC_BEHAVIOUR_SHOPKEEPER And NPC(npcNum).Behaviour <> NPC_BEHAVIOUR_QUEST Then


Obs.: Existem 2 desse codigo substitua os dois

Procure por:

Código:
If Len(Trim$(NPC(npcNum).AttackSay)) > 0 Then


Acima do codigos, apos o Else adicione:

Código:
                        If NPC(npcNum).Behaviour = NPC_BEHAVIOUR_QUEST Then
                            Call ShowQuest(attacker, NPC(npcNum).QuestNum)
                            Exit Function
                        End If
                        If NPC(npcNum).Behaviour = NPC_BEHAVIOUR_FRIENDLY Then
                            Call CheckTasks(attacker, QUEST_TYPE_GOTALK, npcNum)
                            Call CheckTasks(attacker, QUEST_TYPE_GOGIVE, npcNum)
                            Call CheckTasks(attacker, QUEST_TYPE_GOGET, npcNum)
                        End If


Em SubPlayerAttackNpc, procure:

Código:
' send death to the map


Acima adicione:

Código:
Call CheckTasks(attacker, QUEST_TYPE_GOSLAY, npcNum)


Na Sub PlayerAttackNpc, procure por:

Código:
Call OnDeath(victim)


Acima adicione:

Código:
Call CheckTasks(attacker, QUEST_TYPE_GOKILL, 0)


Em InitServe procure por:

Código:
ChkDir App.Path & "\Data\", "spells"


Abaixo adicione:

Código:
ChkDir App.Path & "\Data\", "quests"


Em ClearGameData procure por:

Código:
Call ClearAnimations


Abaixo adicione:

Código:
Call SetStatus("Clearing quests...")
Call ClearQuests


Em LoadGameData procure por:

Código:
Call LoadAnimations


Abaixo adicione:

Código:
Call SetStatus("Loading quests...")
Call LoadQuests


Em modHandleData procure por:

Código:
HandleDataSub(CPartyLeave) = GetAddress(AddressOf HandlePartyLeave)


Abaixo adicione:

Código:
    HandleDataSub(CRequestEditQuest) = GetAddress(AddressOf HandleRequestEditQuest)
    HandleDataSub(CSaveQuest) = GetAddress(AddressOf HandleSaveQuest)
    HandleDataSub(CRequestQuests) = GetAddress(AddressOf HandleRequestQuests)
    HandleDataSub(CPlayerHandleQuest) = GetAddress(AddressOf HandlePlayerHandleQuest)
    HandleDataSub(CQuestLogUpdate) = GetAddress(AddressOf HandleQuestLogUpdate)


No final do modhandledata adicione:

Código:
Sub HandleRequestEditQuest(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer

    ' Prevent hacking
    If GetPlayerAccess(Index) < ADMIN_DEVELOPER Then
        Exit Sub
    End If

    Set Buffer = New clsBuffer
    Buffer.WriteLong SQuestEditor
    SendDataTo Index, Buffer.ToArray()
    Set Buffer = Nothing
End Sub

Sub HandleSaveQuest(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim n As Long
    Dim Buffer As clsBuffer
    Dim QuestSize As Long
    Dim QuestData() As Byte
    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()

    ' Prevent hacking
    If GetPlayerAccess(Index) < ADMIN_DEVELOPER Then
        Exit Sub
    End If

    n = Buffer.ReadLong 'CLng(Parse(1))

    If n < 0 Or n > MAX_QUESTS Then
        Exit Sub
    End If
   
    ' Update the Quest
    QuestSize = LenB(Quest(n))
    ReDim QuestData(QuestSize - 1)
    QuestData = Buffer.ReadBytes(QuestSize)
    CopyMemory ByVal VarPtr(Quest(n)), ByVal VarPtr(QuestData(0)), QuestSize
    Set Buffer = Nothing
   
    ' Save it
    Call SendUpdateQuestToAll(n)
    Call SaveQuest(n)
    Call AddLog(GetPlayerName(Index) & " saved Quest #" & n & ".", ADMIN_LOG)
End Sub

Sub HandleRequestQuests(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    SendQuests Index
End Sub

Sub HandlePlayerHandleQuest(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
    Dim QuestNum As Long, Order As Long
   
    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()
    QuestNum = Buffer.ReadLong
    Order = Buffer.ReadLong '1 = accept, 2 = cancel
   
    If Order = 1 Then
        Player(Index).PlayerQuest(QuestNum).Status = QUEST_STARTED '1
        Player(Index).PlayerQuest(QuestNum).ActualTask = 1
        Player(Index).PlayerQuest(QuestNum).CurrentCount = 0
        PlayerMsg Index, "New quest accepted: " & Trim$(Quest(QuestNum).Name) & "!", BrightGreen
    ElseIf Order = 2 Then
        Player(Index).PlayerQuest(QuestNum).Status = QUEST_NOT_STARTED '2
        PlayerMsg Index, Trim$(Quest(QuestNum).Name) & " has been canceled!", BrightGreen
    End If
   
    SavePlayer Index
    SendPlayerData Index
    SendPlayerQuest Index, QuestNum
   
    Set Buffer = Nothing
End Sub

Sub HandleQuestLogUpdate(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    SendPlayerQuests Index
End Sub


Em modTypes, na Private Type PlayerRec procure por:

Código:
Dir As Byte


Abaixo adicione:

Código:
PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec


Em Private Type NpcRec, procure por:

Código:
Level As Long


Abaixo adicione:

Código:
QuestNum As Long


Em modTypes procure por:

Código:
SPartyVitals


Abaixo adicione:

Código:
    SQuestEditor
    SUpdateQuest
    SPlayerQuest
    SQuestMessage


Agora procure por:

Código:
CPartyLeave


Abaixo adicione:

Código:
    CRequestEditQuest
    CSaveQuest
    CRequestQuests
    CPlayerHandleQuest
    CQuestLogUpdate


Em modPlayer procure por:

Código:
Call SendHotbar(Index)


Abaixo adicione:

Código:
Call SendQuests(Index)


Em PlayerWarp ache:

Código:
TempPlayer(Index).GettingMap = YES


Abaixo adicione:

Código:
Call CheckTasks(Index, QUEST_TYPE_GOREACH, mapNum)


Em PlayerMapGetItem procure por:

Código:
SendActionMsg GetPlayerMap(Index), Msg, White, 1, (GetPlayerX(Index) * 32), (GetPlayerY(Index) * 32)


Abaixo adicione:

Código:
Call CheckTasks(Index, QUEST_TYPE_GOGATHER, GetItemNum(Trim$(Item(GetPlayerInvItemNum(Index, n)).Name)))


Em CheckResource procure:

Código:
SendMapSound Index, rX, rY, SoundEntity.seResource, Resource_index


Abaixo adicione:

Código:
Call CheckTasks(Index, QUEST_TYPE_GOTRAIN, Resource_index)


Client~Side

Adicione o modQuest e frmEditor_Quest ao seu projeto. E altere frmEditor_NPC e frmMain pelos qu estão no pack

Em modGmaeLogic na NpcEditorInit procure por:

Código:
.txtDamage.text = NPC(EditorIndex).Damage


Abaixo adicione:

Código:
.scrlQuest.Value = NPC(EditorIndex).QuestNum


Em modEnumerations procure por:

Código:
SPartyVitals


Abaixo adicione:

Código:
SQuestEditor
    SUpdateQuest
    SPlayerQuest
    SQuestMessage


Procure por:

Código:
CPartyLeave


Abaixo adicione:

Código:
CRequestEditQuest
    CSaveQuest
    CRequestQuests
    CPlayerHandleQuest
    CQuestLogUpdate


Em modHandleData procure por:

Código:
HandleDataSub(SPartyVitals) = GetAddress(AddressOf HandlePartyVitals)


Abaixo adicione:

Código:
    HandleDataSub(SQuestEditor) = GetAddress(AddressOf HandleQuestEditor)
    HandleDataSub(SUpdateQuest) = GetAddress(AddressOf HandleUpdateQuest)
    HandleDataSub(SPlayerQuest) = GetAddress(AddressOf HandlePlayerQuest)
    HandleDataSub(SQuestMessage) = GetAddress(AddressOf HandleQuestMessage)


No final desse mod adicione:

Código:
Private Sub HandleQuestEditor()
    Dim i As Long
   
    With frmEditor_Quest
        Editor = EDITOR_TASKS
        .lstIndex.Clear

        ' Add the names
        For i = 1 To MAX_QUESTS
            .lstIndex.AddItem i & ": " & Trim$(Quest(i).Name)
        Next

        .Show
        .lstIndex.ListIndex = 0
        QuestEditorInit
    End With

End Sub

Private Sub HandleUpdateQuest(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim n As Long
    Dim Buffer As clsBuffer
    Dim QuestSize As Long
    Dim QuestData() As Byte
    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()
    n = Buffer.ReadLong
    ' Update the Quest
    QuestSize = LenB(Quest(n))
    ReDim QuestData(QuestSize - 1)
    QuestData = Buffer.ReadBytes(QuestSize)
    CopyMemory ByVal VarPtr(Quest(n)), ByVal VarPtr(QuestData(0)), QuestSize
    Set Buffer = Nothing
End Sub

Private Sub HandlePlayerQuest(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
    Dim i As Long

    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()
       
    For i = 1 To MAX_QUESTS
        Player(MyIndex).PlayerQuest(i).Status = Buffer.ReadLong
        Player(MyIndex).PlayerQuest(i).ActualTask = Buffer.ReadLong
        Player(MyIndex).PlayerQuest(i).CurrentCount = Buffer.ReadLong
    Next
   
    RefreshQuestLog
   
    Set Buffer = Nothing
End Sub

Private Sub HandleQuestMessage(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
    Dim i As Long, QuestNum As Long, QuestNumForStart As Long
    Dim Message As String
   
    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()
    QuestNum = Buffer.ReadLong
    Message = Trim$(Buffer.ReadString)
    QuestNumForStart = Buffer.ReadLong
   
    frmMain.lblQuestNameVisual = Trim$(Quest(QuestNum).Name)
    frmMain.lblQuestSay = Message
    frmMain.picQuestSpeech.Visible = True
   
    If QuestNumForStart > 0 And QuestNumForStart <= MAX_QUESTS Then
        frmMain.lblQuestAccept.Visible = True
        frmMain.lblQuestAccept.Tag = QuestNumForStart
    End If
   
    LoadQuestLogPage
    ShowQuestLogPage 1
   
    Set Buffer = Nothing
End Sub


Em modInput procure por:

Código:
SendRequestEditSpell


Abaixo adicione:

Código:
Case "/editquest"
                    If GetPlayerAccess(MyIndex) < ADMIN_DEVELOPER Then GoTo Continue
                    SendRequestEditQuest


Em moTypes na Private Type PlayerRec procure por:

Código:
Step As Byte


Abaixo adicione:

Código:
PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec


Em Private Type NpcRec procure por:

Código:
Level As Long


Abaixo adicione:

Código:
QuestNum As Long


Na frmQuest_Editor troca a Form_Load para:

Código:
Private Sub Form_Load()
    scrlTotalTasks.Max = MAX_TASKS
    scrlNPC.Max = MAX_NPCS
    scrlItem.Max = MAX_ITEMS
    scrlMap.Max = MAX_MAPS
    scrlResource.Max = MAX_RESOURCES
    scrlAmount.Max = MAX_BYTE
    scrlReq(1).Max = MAX_LEVELS
    scrlReq(2).Max = MAX_ITEMS
    scrlReq(3).Max = MAX_QUESTS
    scrlItemRew.Max = MAX_ITEMS
    scrlItemRewValue.Max = MAX_BYTE  'can also be changed to any number under 32767 (For larger cash rewards)
    scrlItemNum(0).Max = MAX_ITEMS
    scrlItemNum(1).Max = MAX_ITEMS
    scrlItemValue(0).Max = MAX_BYTE 'can also be changed to any number under 32767
    scrlItemValue(1).Max = MAX_BYTE 'can also be changed to any number under 32767 (the max integer)
End Sub


Creditos:

Ricardo - Tradução
Alatar - Pelos sistemas
Alguns membros da Toucht Death - Correção de outros bugs
avatar
Ricardo XD
Sentinela
Sentinela

Mensagens : 29
Estrelas Makers : 139
Creditos : 19
Data de inscrição : 19/03/2011
Idade : 18
Localização : Minha Casa

Voltar ao Topo Ir em baixo

Re: Sistema de Quest

Mensagem por spectrus em Sab Set 10, 2011 6:07 pm

lol muito bom
Sistema completíssimo!


Divulgue nosso Forum!
[Você precisa estar registrado e conectado para ver este link.]
Código:
[url=http://makersbrasil.forumeiros.com/]
src="http://img841.imageshack.us/img841/9522/92324935.png"
border="0">[/url]



E meu fan? entao use:

Código:
[img]http://www.baixa.la/arquivos/3908525_imagem.gif[/img]

Sign:
Spoiler:



avatar
spectrus
Administrador
Administrador

Mensagens : 299
Estrelas Makers : 1466
Creditos : 49
Data de inscrição : 01/01/2011
Idade : 23
Localização : V.da conquista bahia

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum