1 [Script]Sistema de Quest 13/2/2012, 16:56
SkyAway
Membro V
Esse tutorial foi traduzido e modificado.
Bom,você tem duas opções,baixar o Eclipse Origins com o sistema já implantado: [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
Ou seguir o tutorial e implantar manualmente na sua source,tendo de trocar apenas alguns arquivos: [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
Foto:
[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]
Vamos começar com a Source do servidor
no modCombat,procure:
depois disso,após o else,adicione:
Procure por:
Abaixo adicione isso:
Agora procure por:
Acima adicione isso:
Agora,no modGeneral
Procure por:
Coloque isso abaixo:
Procure agora por:
Adicione isso abaixo:
Agora,procure por isso:
Adicione isso abaixo:
Agora,no modHandleData
Procure por
Adicione abaixo:
Agora,no final do modHandleData adicione isso:
Agora,no modTypes
Procure por:
Abaixo cole:
Agora,procure por isso:
Adicione isso abaixo:
Agora,no modEnumerations
Procure por:
Abaixo coloque:
Procure agora:
Adicione Abaixo:
Agora,vamos ao modPlayer
Procure por:
Cole abaixo:
Procure por:
Cole abaixo:
Procure agora por:
Cole abaixo:
Procure agora por:
Cole abaixo
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:
Abaixo,adicione:
no modEnumerations,procure por
Cole abaixo:
Agora,procure por:
Abaixo,cole:
Agora,no modHandleDate procure por:
Abaixo cole:
no final do modHandleDate cole isso:
no modInput,procure por:
abaixo,cole:
em modType,procure por:
Abaixo,cole:
Agora,procure por:
E por último cole:
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 >>>>
Bom,você tem duas opções,baixar o Eclipse Origins com o sistema já implantado: [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
Ou seguir o tutorial e implantar manualmente na sua source,tendo de trocar apenas alguns arquivos: [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
Foto:
[Tens de ter uma conta e sessão iniciada para poderes visualizar 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 >>>>