Пятница, 19 Апреля 2024, 06:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Конструкторы OnLine-игр » Квестовая система для EO 2.0 (Да, да, да. Она есть)
Квестовая система для EO 2.0
harmoxyneДата: Пятница, 30 Марта 2012, 21:00 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
И так, пока делаю свою игрулину, нашел на форуме эклипса квестовую систему... Очень проста в использовании (хоть я и пользуюсь другой), и не слишком багнутая.
И так, начнем.
- Вот так она будет выглядеть в конце нашего урока.
Code
Как это работает?
В чате нужно написать /editquest, и откроется окно редактирования

Сторона сервера
1. Добавьте modSvQuest в ваш проект.
2. В modCombat найдите
Code
If Len(Trim$(NPC(npcNum).AttackSay)) > 0 Then
, и после Else вставьте
Code
                        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

3. Там же найдите Sub PlayerAttackNpc, в ней
Code
' send death to the map
и сразу за ним вставьте
Code
Call CheckTasks(attacker, QUEST_TYPE_GOSLAY, npcNum)

В той же Sub PlayerAttackNPC найдите
Code
Call OnDeath(victim)
и вставьте после него
Code
Call CheckTasks(attacker, QUEST_TYPE_GOKILL, victim)

4.Заходим в modGeneral.
5. Ищем InitServer, и после
Code
ChkDir App.Path & "\Data\", "spells"
вставляем
Code
ChkDir App.Path & "\Data\", "quests"

6. Ищем ClearGameData, находим
Code
Call ClearAnimations
, и за ним ставим
Code
Call SetStatus("Clearing quests...")
Call ClearQuests

7. Находим LoadGameData, ищем
Code
Call LoadAnimations
и за ним вставляем
Code
Call SetStatus("Loading quests...")
Call LoadQuests

8.Заходим в modHandleData
9. Ищем
Code
HandleDataSub(CPartyLeave) = GetAddress(AddressOf HandlePartyLeave)
, и за ним вставляем
Code
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)

10. В самый конец модуля добавляем
Code
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
          
       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) & " has been canceled!", 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

11.Заходим в modTypes
12.В Private Type PlayerRec ищем
Code
Dir As Byte
, и за ним вставляем
Code
PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec

13. В Private Type NpcRec найдем
Code
Level As Long
, и за ним вставим
Code
Quest As Byte
       QuestNum As Long

14. Заходим в modEnumerations
15. Ищем
Code
SPartyVitals
, и за ним вставляем
Code
    SQuestEditor
       SUpdateQuest
       SPlayerQuest
       SQuestMessage

16.Там же ищем
Code
CPartyLeave
, и за ним вставляем
Code
    CRequestEditQuest
       CSaveQuest
       CRequestQuests
       CPlayerHandleQuest
       CQuestLogUpdate

17. Заходим в modPlayer
18. Ищем
Code
Call SendHotbar(Index)
, вставляем
Code
Call SendQuests(Index)

19.Ищем
Code
PlayerWarp
, в нем ищем
Code
TempPlayer(Index).GettingMap = YES
, и вставляем
Code
Call CheckTasks(Index, QUEST_TYPE_GOREACH, mapNum)

20. Внутри PlayerMapGetItem ищем
Code
SendActionMsg GetPlayerMap(Index), Msg, White, 1, (GetPlayerX(Index) * 32), (GetPlayerY(Index) * 32)
и за ним ставим
Code
Call CheckTasks(Index, QUEST_TYPE_GOGATHER, GetItemNum(Trim$(Item(GetPlayerInvItemNum(Index, n)).Name)))

21. Внутри CheckResource ищем
Code
SendMapSound Index, rX, rY, SoundEntity.seResource, Resource_index
, и за ним вставляем
Code
Call CheckTasks(Index, QUEST_TYPE_GOTRAIN, Resource_index)

На этом работа с сервером окончена. Совсем скоро опубликую работу с клиентом. happy

Добавлено (30.03.2012, 21:00)
---------------------------------------------
Сторона клиента
Добавьте modQuests в свой проект.
Добавьте frmEditor_Quest в свой проект.
Замените frmEditor_NPC and frmMain на те, которые будут в конце сообщения.
1. Шуруем в modGameEditors.
2. Находим NpcEditorInit, в нем
Code
txtDamage.text = NPC(EditorIndex).Damage
, и после него вставляем
Code
.chkQuest.Value = NPC(EditorIndex).Quest
           .scrlQuest.Value = NPC(EditorIndex).QuestNum

3. Заходим в modEnumerations.
4. Ищем
Code
SPartyVitals
, и за ним вставляем
Code
    SQuestEditor
       SUpdateQuest
       SPlayerQuest
       SQuestMessage

5.Ищем
Code
CPartyLeave
, и за ним вставляем
Code
    CRequestEditQuest
       CSaveQuest
       CRequestQuests
       CPlayerHandleQuest
       CQuestLogUpdate

6. Открываем modHandleData.
7.Ищем
Code
HandleDataSub(SPartyVitals) = GetAddress(AddressOf HandlePartyVitals)
и за ним вставляем
Code
    HandleDataSub(SQuestEditor) = GetAddress(AddressOf HandleQuestEditor)
       HandleDataSub(SUpdateQuest) = GetAddress(AddressOf HandleUpdateQuest)
       HandleDataSub(SPlayerQuest) = GetAddress(AddressOf HandlePlayerQuest)
       HandleDataSub(SQuestMessage) = GetAddress(AddressOf HandleQuestMessage)

8. В конец модуля добавляем
Code
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

9. Заходим в modInput
10. Ищем
Code
SendRequestEditSpell
и за ним вставляем
Code
                Case "/editquest"
                       If GetPlayerAccess(MyIndex) < ADMIN_DEVELOPER Then GoTo Continue
                       SendRequestEditQuest

11. заходим в modTypes.
12.Ищем Private Type PlayerRec, в ней
Code
Step As Byte
и за ним вставляем
Code
PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec

13. В Private Type NpcRec ищем
Code
Level As Long
и за ним добавляем
Code
    Quest As Byte
       QuestNum As Long

На этом работа с кодом окончена.
Вот по этой ссылке вы можете скачать нужные формы, которые были упомянуты в начале сообщения.
Готовый клиент, за работоспособность не отвечаю.
©Alatar


Сообщение отредактировал QNicolya - Воскресенье, 22 Апреля 2012, 11:25
issiddimaДата: Воскресенье, 15 Апреля 2012, 17:31 | Сообщение # 2
частый гость
Сейчас нет на сайте
ТОЛЬКО ВРЕМЯ ЗРЯ ПОТРАТИЛ =(

Добавлено (15.04.2012, 17:31)
---------------------------------------------
КИНЬТЕ ПРОПАТЧЕННЫЙ КЛИЕНТ УЖЕ СУДА



harmoxyneДата: Воскресенье, 22 Апреля 2012, 11:26 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
issiddima, может вам и готовую игру скинуть? dry
Во-первых, это не патч.
Во-вторых, не пишите капсом.
Во-третьих, я использую не эту систему квестом, а собственноручно написанную, и клиента с этой версией у меня нет.

Добавлено (22.04.2012, 11:26)
---------------------------------------------
Но все же, решил вас помиловать, в шапку выложил готовый клиент.

Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Конструкторы OnLine-игр » Квестовая система для EO 2.0 (Да, да, да. Она есть)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг