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

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

1 [Script]Sistema de Quest em 13/2/2012, 16:56

SkyAway

avatar
Membro V
Membro V
Esse tutorial foi traduzido e modificado.

Bom,você tem duas opções,baixar o Eclipse Origins com o sistema já implantado: [Você precisa estar registrado e conectado para ver este link.]
Ou seguir o tutorial e implantar manualmente na sua source,tendo de trocar apenas alguns arquivos: [Você precisa estar registrado e conectado para ver este link.]

Foto:
[Você precisa estar registrado e conectado para ver esta imagem.]

Vamos começar com a Source do servidor
no modCombat,procure:
Código:
If Len(Trim$(NPC(npcNum).AttackSay)) > 0 Then

depois disso,após o else,adicione:
Código:
                    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)
                           
                            If NPC(npcNum).Quest = YES Then
                                If CanStartQuest(attacker, NPC(npcNum).QuestNum) Then
                                    'if can start show the request message (chat1)
                                    QuestMessage attacker, NPC(npcNum).QuestNum, Trim$(Quest(NPC(npcNum).QuestNum).Chat(1)), NPC(npcNum).QuestNum
                                    Exit Function
                                End If
                                If QuestInProgress(attacker, NPC(npcNum).QuestNum) Then
                                    'if the quest is in progress show the meanwhile message (chat2)
                                    PlayerMsg attacker, Trim$(NPC(npcNum).Name) + ": " + Trim$(Quest(NPC(npcNum).QuestNum).Chat(2)), BrightGreen
                                    'QuestMessage attacker, NPC(npcNum).QuestNum, Trim$(Quest(NPC(npcNum).QuestNum).Chat(2)), 0
                                    Exit Function
                                End If
                            End If
                        End If

Procure por:
Código:
' send death to the map

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

Agora procure por:
Código:
Call OnDeath(victim)

Acima adicione isso:
Código:
Call CheckTasks(attacker, QUEST_TYPE_GOKILL, victim)

Agora,no modGeneral

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

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

Procure agora por:
Código:
Call ClearAnimations

Adicione isso abaixo:
Código:
Call SetStatus("Escaneando missões...")
Call ClearQuests

Agora,procure por isso:
Código:
Call LoadAnimations

Adicione isso abaixo:
Código:
Call SetStatus("Carregando missões...")
Call LoadQuests

Agora,no modHandleData

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

Adicione abaixo:
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)

Agora,no final do modHandleData adicione isso:
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) & " salvou missão #" & 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, i 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
        'Add item on start
        If Quest(QuestNum).QuestGiveItem > 0 And Quest(QuestNum).QuestGiveItem < MAX_ITEMS Then
            If Quest(QuestNum).QuestGiveItemValue > 0 And Quest(QuestNum).QuestGiveItemValue < MAX_INV Then 'ToDo: stuff with currency
                GiveInvItem Index, Quest(QuestNum).QuestGiveItem, Quest(QuestNum).QuestGiveItemValue
            End If
        End If
       
    ElseIf Order = 2 Then
        Player(Index).PlayerQuest(QuestNum).Status = QUEST_NOT_STARTED '2
        Player(Index).PlayerQuest(QuestNum).ActualTask = 1
        Player(Index).PlayerQuest(QuestNum).CurrentCount = 0
        PlayerMsg Index, Trim$(Quest(QuestNum).Name) & " foi cancelada!", BrightGreen
    End If
   
    SavePlayer Index
    SendPlayerData Index
    SendPlayerQuests Index
   
    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

Agora,no modTypes

Procure por:
Código:
Dir As Byte

Abaixo cole:
PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec

Agora,procure por isso:
Código:
Level As Long

Adicione isso abaixo:
Código:
Quest As Byte
    QuestNum As Long


Agora,no modEnumerations

Procure por:
Código:
SPartyVitals

Abaixo coloque:
Código:
    SQuestEditor
    SUpdateQuest
    SPlayerQuest
    SQuestMessage

Procure agora:
Código:
CPartyLeave

Adicione Abaixo:
Código:
    CRequestEditQuest
    CSaveQuest
    CRequestQuests
    CPlayerHandleQuest
    CQuestLogUpdate

Agora,vamos ao modPlayer

Procure por:
Código:
Call SendHotbar(Index)

Cole abaixo:
Código:
Call SendQuests(Index)

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

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

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

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

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

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


Agora no CLIENTE !!!
adicione modQuests para seu projeto
adicione frmEditor_Quest para seu projeto.
Troque seu frmEditor_NPC e frmMain pelo que estava no arquivo em que baixou...

Agora,no modGameEditors,procure:
Código:
.txtDamage.text = NPC(EditorIndex).Damage

Abaixo,adicione:
Código:
.chkQuest.Value = NPC(EditorIndex).Quest
        .scrlQuest.Value = NPC(EditorIndex).QuestNum

no modEnumerations,procure por
Código:
SPartyVitals

Cole abaixo:
Código:
    SQuestEditor
    SUpdateQuest
    SPlayerQuest
    SQuestMessage

Agora,procure por:
Código:
CPartyLeave

Abaixo,cole:
Código:
    CRequestEditQuest
    CSaveQuest
    CRequestQuests
    CPlayerHandleQuest
    CQuestLogUpdate


Agora,no modHandleDate procure por:
Código:
HandleDataSub(SPartyVitals) = GetAddress(AddressOf HandlePartyVitals)

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


no final do modHandleDate cole isso:
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.lblQuestName = Trim$(Quest(QuestNum).Name)
    frmMain.lblQuestSay = Message
    frmMain.picQuestDialogue.Visible = True
   
    If QuestNumForStart > 0 And QuestNumForStart <= MAX_QUESTS Then
        frmMain.lblQuestAccept.Visible = True
        frmMain.lblQuestAccept.Tag = QuestNumForStart
    End If
       
    Set Buffer = Nothing
End Sub

no modInput,procure por:
Código:
SendRequestEditSpell

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


em modType,procure por:
Código:
Step As Byte

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

Agora,procure por:
Código:
Level As Long

E por último cole:
Código:
    Quest As Byte
    QuestNum As Long

Bom,é um tutorial bem grande,e levou um bom tempo para modificar e traduzir tudo =)
Qualquer problema poste aqui...

Creditos:

Alatar - Por fazer
Terabin - Por traduzir
Ricardo - Por Postar na MMORPGBR
SkyAway - Postar na ExplosionRPGMaker






GOSTOU DA + 1 CRED SÓ CLICA NO + ALI DO LADO >>>>



É Meu Fan ? Me Odeia ? Me Ama ? Então usa isso !!!
[Você precisa estar registrado e conectado para ver esta imagem.]
Ver perfil do usuário

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

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