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 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 SetStatus("Clearing quests...") Call ClearQuests 7. Находим LoadGameData, ищем и за ним вставляем 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 PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec 13. В Private Type NpcRec найдем , и за ним вставим Code Quest As Byte QuestNum As Long 14. Заходим в modEnumerations 15. Ищем , и за ним вставляем Code SQuestEditor SUpdateQuest SPlayerQuest SQuestMessage 16.Там же ищем , и за ним вставляем Code CRequestEditQuest CSaveQuest CRequestQuests CPlayerHandleQuest CQuestLogUpdate 17. Заходим в modPlayer 18. Ищем Code Call SendHotbar(Index) , вставляем Code Call SendQuests(Index) 19.Ищем , в нем ищем 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) На этом работа с сервером окончена. Совсем скоро опубликую работу с клиентом.
Добавлено (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 SQuestEditor SUpdateQuest SPlayerQuest SQuestMessage 5.Ищем , и за ним вставляем 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 Case "/editquest" If GetPlayerAccess(MyIndex) < ADMIN_DEVELOPER Then GoTo Continue SendRequestEditQuest 11. заходим в modTypes. 12.Ищем Private Type PlayerRec, в ней и за ним вставляем Code PlayerQuest(1 To MAX_QUESTS) As PlayerQuestRec 13. В Private Type NpcRec ищем и за ним добавляем 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, может вам и готовую игру скинуть? Во-первых, это не патч. Во-вторых, не пишите капсом. Во-третьих, я использую не эту систему квестом, а собственноручно написанную, и клиента с этой версией у меня нет.Добавлено (22.04.2012, 11:26) --------------------------------------------- Но все же, решил вас помиловать, в шапку выложил готовый клиент.
|
|
| |