[EO Dx8] Alatar's Quest System v1.2

Hello all, i edited the Alatar’s Quest System to work in Dx8 Eclipse (nightly eclipse), there are few edits, but the code is basically the same so all credits are for Alatar and for jcsnider (because he helped me with some hints for text rendering in Dx8).

This is the original source tutorial made for EO 2.0: http://www.touchofde…est-system-v12/

To open the quest editor type /editquest

You can download a version with the Quest System already integrated to Nightly Eclipse here:

http://www.mediafire…209v4kuht4tdntb

Or add the quest system manually following this guide:

(Sorry if my english isn’t the best)

First of all, download the extra files here and add them to your project (make a backup of frmMain and frmEditor_Npc): http://www.freemmorp…6a525aca133.zip

Server side:

Add modSvQuests.bas to your project

modCombat

find:

If Len(Trim$(NPC(npcNum).AttackSay)) > 0 Then

add above, after the else:


If NPC(npcNum).Behaviour = NPC_BEHAVIOUR_FRIENDLY Or NPC(npcNum).Behaviour = NPC_BEHAVIOUR_SHOPKEEPER 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 Player(attacker).PlayerQuest(NPC(npcNum).Quest).Status = QUEST_COMPLETED Then

If Quest(NPC(npcNum).Quest).Repeat = YES Then

Player(attacker).PlayerQuest(NPC(npcNum).Quest).Status = QUEST_COMPLETED_BUT

Exit Function

End If

End If

If CanStartQuest(attacker, NPC(npcNum).QuestNum) Then

'if can start show the request message (speech1)

QuestMessage attacker, NPC(npcNum).QuestNum, Trim$(Quest(NPC(npcNum).QuestNum).Speech(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 (speech2)

QuestMessage attacker, NPC(npcNum).QuestNum, Trim$(Quest(NPC(npcNum).QuestNum).Speech(2)), 0

Exit Function

End If

End If

End If

in Sub PlayerAttackNpc find

' send death to the map

add this above:

Call CheckTasks(attacker, QUEST_TYPE_GOSLAY, npcNum)

in the same sub, find

Call OnDeath(victim)

and add this above:

Call CheckTasks(attacker, QUEST_TYPE_GOKILL, victim)

modGeneral

in InitServer find

ChkDir App.Path & "\Data\", "spells"

add below:

ChkDir App.Path & "\Data\", "quests"

In ClearGameData find:

Call ClearAnimations

add this below:

Call SetStatus("Clearing quests...")

Call ClearQuests

In LoadGameData find:

Call LoadAnimations

then add this below:

Call SetStatus("Loading quests...")

Call LoadQuests

modHandleData

Find:

HandleDataSub(CPartyLeave) = GetAddress(AddressOf HandlePartyLeave)

under that add:


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)

and at the end of the module add this:

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, i As Long, n As Long

Dim RemoveStartItems As Boolean

Set Buffer = New clsBuffer

Buffer.WriteBytes Data()

QuestNum = Buffer.ReadLong

Order = Buffer.ReadLong '1 = accept quest, 2 = cancel quest

If Order = 1 Then

RemoveStartItems = False

'Alatar v1.2

For i = 1 To MAX_QUESTS_ITEMS

If Quest(QuestNum).GiveItem(i).Item > 0 Then

If FindOpenInvSlot(Index, Quest(QuestNum).RewardItem(i).Item) = 0 Then

PlayerMsg Index, "You have no inventory space. Please delete something to take the quest.", BrightRed

RemoveStartItems = True

Exit For

Else

If Item(Quest(QuestNum).GiveItem(i).Item).Type = ITEM_TYPE_CURRENCY Then

GiveInvItem Index, Quest(QuestNum).GiveItem(i).Item, Quest(QuestNum).GiveItem(i).Value

Else

For n = 1 To Quest(QuestNum).GiveItem(i).Value

If FindOpenInvSlot(Index, Quest(QuestNum).GiveItem(i).Item) = 0 Then

PlayerMsg Index, "You have no inventory space. Please delete something to take the quest.", BrightRed

RemoveStartItems = True

Exit For

Else

GiveInvItem Index, Quest(QuestNum).GiveItem(i).Item, 1

End If

Next

End If

End If

End If

Next

If RemoveStartItems = False Then 'this means everything went ok

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

End If

'/alatar v1.2

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

RemoveStartItems = True 'avoid exploits

PlayerMsg Index, Trim$(Quest(QuestNum).Name) & " has been canceled!", BrightGreen

End If

If RemoveStartItems = True Then

For i = 1 To MAX_QUESTS_ITEMS

If Quest(QuestNum).GiveItem(i).Item > 0 Then

If HasItem(Index, Quest(QuestNum).GiveItem(i).Item) > 0 Then

If Item(Quest(QuestNum).GiveItem(i).Item).Type = ITEM_TYPE_CURRENCY Then

TakeInvItem Index, Quest(QuestNum).GiveItem(i).Item, Quest(QuestNum).GiveItem(i).Value

Else

For n = 1 To Quest(QuestNum).GiveItem(i).Value

TakeInvItem Index, Quest(QuestNum).GiveItem(i).Item, 1

Next

End If

End If

End If

Next

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

modTypes

In Private Type PlayerRec, find:

Dir As Byte

paste this under that:

PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec

In Private Type NpcRec, find:

Level As Long

paste:


Quest As Byte

QuestNum As Long

modEnumerations

find:

SPartyVitals

paste:


SQuestEditor

SUpdateQuest

SPlayerQuest

SQuestMessage

find:

CPartyLeave

paste:


CRequestEditQuest

CSaveQuest

CRequestQuests

CPlayerHandleQuest

CQuestLogUpdate

modPlayer

find:

Call SendHotbar(Index)

paste:

Call SendQuests(Index)

In PlayerWarp, find:


' if same map then just send their co-ordinates

If mapNum = GetPlayerMap(Index) Then

SendPlayerXYToMap Index

paste above the End If:

Call CheckTasks(Index, QUEST_TYPE_GOREACH, mapNum)

then in the same sub find:

TempPlayer(Index).GettingMap = YES

paste:

Call CheckTasks(Index, QUEST_TYPE_GOREACH, mapNum)

In PlayerMapGetItem, find:

SendActionMsg GetPlayerMap(Index), Msg, White, 1, (GetPlayerX(Index) * 32), (GetPlayerY(Index) * 32)

paste:

Call CheckTasks(Index, QUEST_TYPE_GOGATHER, GetItemNum(Trim$(Item(GetPlayerInvItemNum(Index, n)).Name)))

In CheckResource find:

SendMapSound Index, rX, rY, SoundEntity.seResource, Resource_index

paste:

Call CheckTasks(Index, QUEST_TYPE_GOTRAIN, Resource_index)

Client side:

**Add the modQuests and frmEditor_Quest to your project.

Replace frmMain and frmEditor_NPC with the new ones. (First make a backup of the Main form and NPC form!!)** If you don’t want to change this forms, go to the end of this message.

Add the graphics files inside the main GUI folder (the buttons inside the buttons folder)

modGameEditors

In NpcEditorInit find:

.txtDamage.text = NPC(EditorIndex).Damage

add:


.chkQuest.Value = NPC(EditorIndex).Quest

.scrlQuest.Value = NPC(EditorIndex).QuestNum

modEnumerations

find:

SPartyVitals

paste:


SQuestEditor

SUpdateQuest

SPlayerQuest

SQuestMessage

find:

CPartyLeave

add:


CRequestEditQuest

CSaveQuest

CRequestQuests

CPlayerHandleQuest

CQuestLogUpdate

modHandleData

find:

HandleDataSub(SPartyVitals) = GetAddress(AddressOf HandlePartyVitals)

add:


HandleDataSub(SQuestEditor) = GetAddress(AddressOf HandleQuestEditor)

HandleDataSub(SUpdateQuest) = GetAddress(AddressOf HandleUpdateQuest)

HandleDataSub(SPlayerQuest) = GetAddress(AddressOf HandlePlayerQuest)

HandleDataSub(SQuestMessage) = GetAddress(AddressOf HandleQuestMessage)

at the end of the module, paste this:

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.lblQuestSubtitle = "Info:"

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

modInput

find:

SendRequestEditSpell

paste below:

Case "/editquest"

If GetPlayerAccess(MyIndex) < ADMIN_DEVELOPER Then GoTo Continue

SendRequestEditQuest

modTypes

In Private Type PlayerRec, find:

Step As Byte

Paste:

PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec

In Private Type NpcRec, find:

Level As Long

paste:

Quest As Byte

QuestNum As Long

modText

In DrawNpcName find this:

RenderText Font_Default, Name, TextX, TextY, color, 0

paste this below:

 Dim i As Long

For i = 1 To MAX_QUESTS

'check if the npc is the next task to any quest: [?] symbol

If Quest(i).Name <> "" Then

If Player(MyIndex).PlayerQuest(i).Status = QUEST_STARTED Then

If Quest(i).Task(Player(MyIndex).PlayerQuest(i).ActualTask).NPC = npcNum Then

Name = "[?]"

TextX = ConvertMapX(MapNpc(Index).x * PIC_X) + MapNpc(Index).xOffset + (PIC_X \ 2) - getWidth(Font_Default, (Trim$(Name)))

If NPC(npcNum).Sprite < 1 Or NPC(npcNum).Sprite > NumCharacters Then

TextY = ConvertMapY(MapNpc(Index).y * PIC_Y) + MapNpc(Index).yOffset - 16

Else

TextY = ConvertMapY(MapNpc(Index).y * PIC_Y) + MapNpc(Index).yOffset - (Tex_Character(NPC(npcNum).Sprite).Height / 4)

End If

RenderText Font_Default, Name, TextX, TextY, Yellow

Exit For

End If

End If

'check if the npc is the starter to any quest: [!] symbol

'can accept the quest as a new one?

If Player(MyIndex).PlayerQuest(i).Status = QUEST_NOT_STARTED Or Player(MyIndex).PlayerQuest(i).Status = QUEST_COMPLETED_BUT Then

'the npc gives this quest?

If NPC(npcNum).QuestNum = i Then

Name = "[!]"

TextX = ConvertMapX(MapNpc(Index).x * PIC_X) + MapNpc(Index).xOffset + (PIC_X \ 2) - getWidth(Font_Default, (Trim$(Name)))

If NPC(npcNum).Sprite < 1 Or NPC(npcNum).Sprite > NumCharacters Then

TextY = ConvertMapY(MapNpc(Index).y * PIC_Y) + MapNpc(Index).yOffset - 16

Else

TextY = ConvertMapY(MapNpc(Index).y * PIC_Y) + MapNpc(Index).yOffset - (Tex_Character(NPC(npcNum).Sprite).Height / 4)

End If

RenderText Font_Default, Name, TextX, TextY, Yellow

Exit For

End If

End If

End If

Next

modConstants

find:

Public Const MAX_MAINBUTTONS As Long = 6

change the 6 for 7 (if you added more buttons you need to change it to the next one)

modGeneral

In LoadGUI find:

frmMain.picHotbar.Picture = LoadPicture(App.Path & "\data files\graphics\gui\main\hotbar.jpg")

add below:

frmMain.picQuestLog.Picture = LoadPicture(App.Path & "\data files\graphics\gui\main\questlog.jpg")

frmMain.picQuestDialogue.Picture = LoadPicture(App.Path & "\data files\graphics\gui\main\questdialogue.jpg")

In cacheButtons find:


' main - party

With MainButton(6)

.fileName = "party"

.state = 0 ' normal

End With

add below:


' main - quest

With MainButton(7)

.fileName = "quest"

.state = 0 ' normal

End With

Form Work (only if you don’t want to add the frmMain and/or the frmEditor_Npc)

frmEditor_Npc

Add a checkbox (chkQuest), a scrollbar (scrlQuest) and a label (lblQuest). They should look like this. I added a frame (called fraQuest) but is not nescesary :

then paste this inside the code of the form:

'ALATAR

Private Sub chkQuest_Click()

NPC(EditorIndex).Quest = chkQuest.Value

End Sub

Private Sub scrlQuest_Change()

lblQuest = scrlQuest.Value

NPC(EditorIndex).QuestNum = scrlQuest.Value

End Sub

'/ALATAR

frmMain

add to your project the two pictureboxes added to the attachments and add this subs anywhere in frmMain:


'ALATAR

'QuestDialogue:

Private Sub lblQuestAccept_Click()

PlayerHandleQuest CLng(lblQuestAccept.Tag), 1

picQuestDialogue.Visible = False

lblQuestAccept.Visible = False

lblQuestAccept.Tag = vbNullString

lblQuestSay = "-"

RefreshQuestLog

End Sub

Private Sub lblQuestExtra_Click()

RunQuestDialogueExtraLabel

End Sub

Private Sub lblQuestClose_Click()

picQuestDialogue.Visible = False

lblQuestExtra.Visible = False

lblQuestAccept.Visible = False

lblQuestAccept.Tag = vbNullString

lblQuestSay = "-"

End Sub

'QuestLog:

'Private Sub picQuestButton_Click()

' 'Need to be replaced with imgButton(X) and a proper image

' UpdateQuestLog

' picQuestLog.Visible = Not picQuestLog.Visible

' PlaySound Sound_Buttonclick

'End Sub

Private Sub imgQuestButton_Click(Index As Integer)

If Trim$(lstQuestLog.Text) = vbNullString Then Exit Sub

LoadQuestlogBox Index

End Sub

'/ALATAR

Then create a new imgButton (copy and paste any of the others) and set the index to 7 (only if you didn’t added new buttons), then replace the Private Sub imgButton_Click with this…again this will work ONLY if you have 7 buttons (the 6 originals and the Quest button)

Private Sub imgButton_Click(Index As Integer)

Dim Buffer As clsBuffer

Dim i As Long

' If debug mode, handle error then exit out

If Options.Debug = 1 Then On Error GoTo errorhandler

Select Case Index

Case 1

If Not picInventory.Visible Then

' show the window

picInventory.Visible = True

picCharacter.Visible = False

picSpells.Visible = False

picOptions.Visible = False

picParty.Visible = False

frmMain.picInventory.Refresh

picQuestLog.Visible = False

' play sound

PlaySound Sound_Buttonclick, -1, -1

End If

Case 2

If Not picSpells.Visible Then

' send packet

Set Buffer = New clsBuffer

Buffer.WriteLong CSpells

SendData Buffer.ToArray()

Set Buffer = Nothing

' show the window

picSpells.Visible = True

picInventory.Visible = False

picCharacter.Visible = False

picOptions.Visible = False

picParty.Visible = False

picQuestLog.Visible = False

' play sound

PlaySound Sound_Buttonclick, -1, -1

End If

Case 3

If Not picCharacter.Visible Then

' send packet

SendRequestPlayerData

' show the window

picCharacter.Visible = True

picInventory.Visible = False

picSpells.Visible = False

picOptions.Visible = False

picParty.Visible = False

picQuestLog.Visible = False

' play sound

PlaySound Sound_Buttonclick, -1, -1

' Render

frmMain.picCharacter.Refresh

frmMain.picFace.Refresh

End If

Case 4

If Not picOptions.Visible Then

' show the window

picCharacter.Visible = False

picInventory.Visible = False

picSpells.Visible = False

picOptions.Visible = True

picParty.Visible = False

picQuestLog.Visible = False

' play sound

PlaySound Sound_Buttonclick, -1, -1

End If

Case 5

If myTargetType = TARGET_TYPE_PLAYER And myTarget <> MyIndex Then

SendTradeRequest

' play sound

PlaySound Sound_Buttonclick, -1, -1

Else

AddText "Invalid trade target.", BrightRed

End If

Case 6

' show the window

picCharacter.Visible = False

picInventory.Visible = False

picSpells.Visible = False

picOptions.Visible = False

picParty.Visible = True

picQuestLog.Visible = False

' play sound

PlaySound Sound_Buttonclick, -1, -1

'Alatar v1.2

Case 7 'QuestLog

picCharacter.Visible = False

picInventory.Visible = False

picSpells.Visible = False

picOptions.Visible = False

picParty.Visible = False

picQuestLog.Visible = True

UpdateQuestLog

PlaySound Sound_Buttonclick, -1, -1

'/Alatar v1.2

End Select

' Error handler

Exit Sub

errorhandler:

HandleError "imgButton_Click", "frmMain", Err.Number, Err.Description, Err.Source, Err.HelpContext

Err.Clear

Exit Sub

End Sub

I think that’s all, please tell me if you find some bugs or something is missing.

Now you need to integrate it with the event system so events can process differently based on quest progress. Along with the ability to begin and end quests via events 😉

Anyways, good work and keep it up!

OMG thank you thank you! Your my hero.

well, idk how to do that, i’m not very skilled with vb6, but i’ll check that and try to figure it out

Update: Added a new part for the tutorial if you don’t want to replace the frmMain and/or the frmEditor_NPC (i think i didn’t missed nothing about the form work)

You should do what alatars does and make download with it already installed for people who dont have vb6

maybe later i’ll do that 😉

Is that works in ES:DE? 😄
sorry for the dumb Question but what is ES?

and since when EO is V3.0 o.O

Open Client -> Login error in server

Run-time error ‘9’:
Subscript out of range

Debug -> Sub CheckTasks -> modSvQuests

Line: If TaskType = Quest(i).Task(Player(Index).PlayerQuest(i).ActualTask).Order Then

ES = Event System, and v3.0 is just jcsnider Nightly Eclipse: http://www.touchofdeathforums.com/smf2/index.php/topic,80930.0.html

you added old quests or accounts to the game? maybe that’s causing the error. I have no errors in my game (i’ll upload a version with the quest system if you want to download)

I erased everything from the server, it worked.

Very good, congratulations.

ES for Event System is kinda tricky to use, because ES stands for Eclipse Stable too. (its outdated but it can mislead people)

added a download with Nightly Eclipse and the Quest System integrated and working!

Its not for CS:DE right? please answer me 🙂

i remaked the code for Nightly Eclipse, but idk if this will work in CS:DE (i think no)

Alatar’s quest system works with CS:DE, it just requires some D3D8 understanding to render the quest system to a GUI ingame.

Hey…I did in Server Side all you said then press Server.exe and an error pop-up please respond!

*I press make Server.exe

what error appears?

I know i made it to work already i just cant find a way to render this Listbox 😕 (and for some resond the quests doesnt save, i can do it all over again after server restart)

Are work for Dragon Eclipse???

Log in to reply