API Basic GameEvents ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
AddHandler UO.JournalEntry / client events
ClassicUO โข Basic
AddHandler๋ก ์ ์ ๋ ํญ๋ชฉ, ์บ๋ฆญํฐ ์์ ๋ฐ ์ฐ๊ฒฐ ์ํ ๋ณํ๋ฅผ ๊ตฌ๋ ํฉ๋๋ค. ์ด UO. ์ด๋ฆ์ ํจ์๊ฐ ์๋ ์ด๋ฒคํธ์ด๋ฏ๋ก ๊ดํธ๋ก ํธ์ถํ๊ฑฐ๋ RaiseEvent๋ก ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
์ ํํ ๊ตฌ๋ฌธ
AddHandler UO.JournalEntry, AddressOf OnJournal
Sub OnJournal(ByVal text As String, ByVal serial As Integer, ByVal name As String, ByVal hue As Integer)
AddHandler UO.HitPointsChanged, AddressOf OnHits
AddHandler UO.ManaChanged, AddressOf OnMana
AddHandler UO.StaminaChanged, AddressOf OnStamina
Sub OnHits(ByVal current As Integer, ByVal previous As Integer)
Sub OnMana(ByVal current As Integer, ByVal previous As Integer)
Sub OnStamina(ByVal current As Integer, ByVal previous As Integer)
AddHandler UO.ConnectionChanged, AddressOf OnConnection
Sub OnConnection(ByVal online As Boolean)
RemoveHandler UO.JournalEntry, AddressOf OnJournal
๋งค๊ฐ๋ณ์
Handler / AddressOfโ ํ์ฌ ๋ก๋ํ ์คํฌ๋ฆฝํธ์ Sub๋ฅผ AddressOf๋ก ์ ๋ฌํ์ธ์. ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ByVal์ ๋ช ์ํ๊ณ ์๋ช ์ ํ์๊ณผ ์์๋ฅผ ๋ง์ถฐ์ผ ํฉ๋๋ค. Function, Optional, ParamArray์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ฝ๋ฐฑ์ ํ์ฉํ์ง ์์ต๋๋ค.text / serial / name / hueโ JournalEntry๋ text String, serial Integer(์ถ์ฒ ID, ์์ผ๋ฉด 0), name String, hue Integer(UO ์์กฐ ์ธ๋ฑ์ค, RGB ์๋)๋ฅผ ์ ๋ฌํฉ๋๋ค. Serial์ ์์ดํ ๊ทธ๋ํฝ/type์ด ์๋๋๋ค. ๋ฌธ์์ด์ ๋น์ด ์์ ์ ์์ต๋๋ค. ์ ๋ ํญ๋ชฉ ์ฌ์ฌ์ฉ ์ ์ ๊ฐ์ ๋ณต์ฌํ๋ฉฐ ๊ตฌ๋ ์ดํ ์ ํญ๋ชฉ๋ง ์ ๋ฌํฉ๋๋ค. ๋ก์ปฌ ๋ฉ์์ง๋ ํฌํจ๋ฉ๋๋ค.current / previousโ HitPointsChanged/ManaChanged/StaminaChanged์ current์ previous๋ ํ์ฌ์ ์ด์ ์ ๋ ํฌ์ธํธ ์์ธ Integer์ ๋๋ค. ๋ฐฑ๋ถ์จ์ด๋ Boolean์ด ์๋๋๋ค. ํด๋ผ์ด์ธํธ ๊ฐฑ์ ๋ง๋ค ๋น๊ตํ๋ฏ๋ก ์ค๊ฐ ๋ณํ๊ฐ ํฉ์ณ์ง ์ ์์ต๋๋ค. ์ด๊ธฐ ์ํ์ ์บ๋ฆญํฐ ๋ณ๊ฒฝ์ ์ ๊ธฐ์ค์ ๋ง๋ค๋ฉฐ ์์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.onlineโ ConnectionChanged์ online์ Boolean์ ๋๋ค. True/1์ ํด๋ผ์ด์ธํธ ์ธ๊ณ์ ํ๋ ์ด์ด์ ์ง๋๊ฐ ์์, False/0์ ์์์ ๋ปํฉ๋๋ค. ์๊ฒฉ ์์ผ ์ ์ ์ฌ๋ถ ๊ฒ์ฌ๊ฐ ์๋๋ฉฐ ์ด๊ธฐ ์ด๋ฒคํธ๋ ์ฌ์ํ์ง ์์ต๋๋ค.RemoveHandlerโ RemoveHandler๋ ๋ง์ง๋ง์ผ๋ก ์ผ์นํ๋ ๊ตฌ๋ ์ ์ ๊ฑฐํฉ๋๋ค. ์ค๋ณต์ ๋ฑ๋ก ์์๋๋ก ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ฉ๋๋ค. ํ์ฌ ๋ฉ์์ง๋ ๊ณ ์ ๋ ์ฒ๋ฆฌ๊ธฐ ๋ชฉ๋ก์ ์ฌ์ฉํ๋ฉฐ ๋ณ๊ฒฝ์ ๋ค์ ๋ฉ์์ง์ ์ ์ฉ๋ฉ๋๋ค. ๋ง์ง๋ง ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ๊ฑฐํ๋ฉด ํ๊ฐ ํด์ ๋ฉ๋๋ค.
๋ฐํ๊ฐ
AddHandler, RemoveHandler์ Sub๋ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค(Unit). ๊ฒฐ๊ณผ๋ ๊ณต์ Module ํ๋์ ์ ์ฅํ์ธ์. online๊ณผ ๋ ผ๋ฆฌ ์กฐ๊ฑด๋ง 1/0 = True/False์ ๋๋ค. serial, hue, ์์ ํฌ์ธํธ ๋ฐ State.changes๋ ID ๋๋ ์๋์ ๋๋ค.
๋์
- ํด๋ผ์ด์ธํธ๋ ๋ณต์ฌํ ๋ฐ์ดํฐ๋ง ํ์ ๋ฃ์ต๋๋ค. ์ฒ๋ฆฌ๊ธฐ๋ ์คํฌ๋ฆฝํธ์ ์ค๋ ๋์์ ๋ฌธ์ฅ ์ฌ์ด ๋ฐ Wait, Sleep, UO.Wait, Wait Until ์ค์ ์คํ๋๋ฉฐ ๋์์ ๊ฒน์น์ง ์์ต๋๋ค. ๊ฒ์ฌ ๊ฐ๊ฒฉ์ ์ต์ 25 ms, ํ๋น ์ด๋ฒคํธ๋ณ ์ต๋ 16๊ฐ ๋ฉ์์ง์ ๋๋ค. ๊ธด ๋ค์ดํฐ๋ธ ํธ์ถ์ ์ ๋ฌ์ ์ง์ฐํฉ๋๋ค.
- ์ผ์ ์ ์ง ์ค์๋ ์คํํ์ง ์๊ณ ๋ฉ์์ง๋ฅผ ์์ต๋๋ค. Stop์ ์ทจ์ํ๊ณ ๊ตฌ๋ ์ ํด์ ํ๋ฉฐ Catch๋ก ๊ธด๊ธ ์ค์ง๋ฅผ ์ผํฌ ์ ์์ต๋๋ค. ์ต์์ ํ๋ก์์ ๋ฐํ์ด๋ ์ค๋ฅ ์ ํด๋ผ์ด์ธํธ ๊ตฌ๋ ์ ์ญ์ ํ๊ณ ์ ์คํ์ ๋จ๊ธฐ์ง ์์ต๋๋ค. IDE๋ฅผ ๋ซ์๋ ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ๋ ๊ณ์๋ฉ๋๋ค. ์ฐ๊ฒฐ ํด์ ์๋ ์ผ์ ์ ์ง๋ ์ฌ๊ฐ๊น์ง ์ด๋ฒคํธ๋ฅผ ์ง์ฐํฉ๋๋ค.
- ์ด๋ฒคํธ๋ณ ํ ํ๋๋ 256๊ฐ์ ๋๋ค. ์ด๊ณผํ๋ฉด ์ก์ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ ํด๋น ๊ตฌ๋ ์ ๋นํ์ฑํํฉ๋๋ค. ์ฒ๋ฆฌ๊ธฐ ์ค๋ฅ๋ ๊ตฌ๋ ์ ๋๊ณ ๊ฐ์ ๋ฉ์์ง์ ๋๋จธ์ง ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๊ฑด๋๋๋๋ค. Catch/Finally ํ ๋ค์ ๊ตฌ๋ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ ๋ ๋ฉ์์ง๋ฅผ ๊ฐ์ ์ ๋์ ๋ค์ ์ถ๋ ฅํ์ง ๋ง์ธ์.
- ์ด ๋ค์ฏ ์ด๋ฒคํธ๋ Basic IDE๊ฐ ์ผ์ง Full์์ ์ง์๋ฉ๋๋ค. ๋ค๋ฅธ ์ด๋ฒคํธ, ํจํท ๊ตฌ๋ , Handles ๋ฐ WithEvents๋ ํฌํจํ์ง ์์ต๋๋ค. ์คํฌ๋ฆฝํธ ์ ์ธ ์ด๋ฒคํธ๋ Basic.Events๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์์
1. ์ ์ ๋ ๋ฉ์์ง ์ฐพ๊ธฐ
# OnJournal์ ๋ค ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ ์ฒด IsReadyMessage ํจ์๋ InStr > 0์ผ๋ก ๋ฌธ๊ตฌ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ๋ก์ปฌ ๋ฉ์์ง๊ฐ State.message๋ฅผ ์ค์ ํ๋ฉฐ Wait Until์ ์ต๋ 5000 ms ํ ํ์์์ ์ค๋ฅ๋ฅผ ๋
๋๋ค. Finally์์ ํด์ ํฉ๋๋ค. Main์ "ready: ore"๋ฅผ ๋ฐํํฉ๋๋ค.
Option Explicit On
Module State
Public Dim matched As Boolean = False
Public Dim message As String = ""
End Module
Function IsReadyMessage(ByVal text As String) As Boolean
Return InStr(text, "ready: ore") > 0
End Function
Sub OnJournal(ByVal text As String, ByVal serial As Integer, ByVal name As String, ByVal hue As Integer)
If IsReadyMessage(text) Then
State.message = text
State.matched = True
End If
End Sub
Sub Main()
AddHandler UO.JournalEntry, AddressOf OnJournal
Try
UO.AddToJournal("ready: ore")
Wait Until State.matched Timeout 5000
Finally
RemoveHandler UO.JournalEntry, AddressOf OnJournal
End Try
Return State.message
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
OnJournal์ ๋ค ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ ์ฒด IsReadyMessage ํจ์๋ InStr > 0์ผ๋ก ๋ฌธ๊ตฌ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ๋ก์ปฌ ๋ฉ์์ง๊ฐ State.message๋ฅผ ์ค์ ํ๋ฉฐ Wait Until์ ์ต๋ 5000 ms ํ ํ์์์ ์ค๋ฅ๋ฅผ ๋ ๋๋ค. Finally์์ ํด์ ํฉ๋๋ค. Main์ "ready: ore"๋ฅผ ๋ฐํํฉ๋๋ค.
2. ์์ ๊ด์ฐฐ
# ์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ current/previous๋ฅผ ์ ์ฒด Remember ํ๋ก์์ ์ ์ ๋ฌํฉ๋๋ค. State.changes๋ ์๋ฆผ ์, State.last๋ SP:58:60 ๊ฐ์ ๋ง์ง๋ง ๋ฌธ์์ด์
๋๋ค. Wait(250) ํ ์ต๋ 5000 ms ๋ณํ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์์ผ๋ฉด ํ์์์์
๋๋ค. Finally๊ฐ ์ธ ๊ตฌ๋
์ ํด์ ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ Boolean ์๋ String์
๋๋ค.
Option Explicit On
Module State
Public Dim changes As Integer = 0
Public Dim last As String = ""
End Module
Sub Remember(ByVal label As String, ByVal current As Integer, ByVal previous As Integer)
State.changes += 1
State.last = label & ":" & CStr(current) & ":" & CStr(previous)
End Sub
Sub OnHits(ByVal current As Integer, ByVal previous As Integer)
Remember("HP", current, previous)
End Sub
Sub OnMana(ByVal current As Integer, ByVal previous As Integer)
Remember("MP", current, previous)
End Sub
Sub OnStamina(ByVal current As Integer, ByVal previous As Integer)
Remember("SP", current, previous)
End Sub
Sub Main()
AddHandler UO.HitPointsChanged, AddressOf OnHits
AddHandler UO.ManaChanged, AddressOf OnMana
AddHandler UO.StaminaChanged, AddressOf OnStamina
Try
Wait(250)
Wait Until State.changes > 0 Timeout 5000
Finally
RemoveHandler UO.HitPointsChanged, AddressOf OnHits
RemoveHandler UO.ManaChanged, AddressOf OnMana
RemoveHandler UO.StaminaChanged, AddressOf OnStamina
End Try
Return State.last
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ current/previous๋ฅผ ์ ์ฒด Remember ํ๋ก์์ ์ ์ ๋ฌํฉ๋๋ค. State.changes๋ ์๋ฆผ ์, State.last๋ SP:58:60 ๊ฐ์ ๋ง์ง๋ง ๋ฌธ์์ด์ ๋๋ค. Wait(250) ํ ์ต๋ 5000 ms ๋ณํ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์์ผ๋ฉด ํ์์์์ ๋๋ค. Finally๊ฐ ์ธ ๊ตฌ๋ ์ ํด์ ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ Boolean ์๋ String์ ๋๋ค.
3. ์ฐ๊ฒฐ ๊ด์ฐฐ
# OnConnection์ Boolean online์ ๋ฐ์ Wait(1000) ๋์ ์ ํ ์๋ฅผ ์
๋๋ค. Finally์์ ํด์ ํ๊ณ Main์ ํ์๋ฅผ ๋ฐํํฉ๋๋ค. 0์ ๋ณํ ์์, 1์ ํ ๋ฒ์ด์ง True๊ฐ ์๋๋๋ค. State.online์ ๋ง์ง๋ง์ผ๋ก ๋ฐ์ ์ํ์ด๋ฉฐ ์ด๊ธฐ ์กฐํ๊ฐ ์๋๋๋ค.
Option Explicit On
Module State
Public Dim changes As Integer = 0
Public Dim online As Boolean = False
End Module
Sub OnConnection(ByVal online As Boolean)
State.online = online
State.changes += 1
End Sub
Sub Main()
AddHandler UO.ConnectionChanged, AddressOf OnConnection
Try
Wait(1000)
Finally
RemoveHandler UO.ConnectionChanged, AddressOf OnConnection
End Try
Return State.changes
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
OnConnection์ Boolean online์ ๋ฐ์ Wait(1000) ๋์ ์ ํ ์๋ฅผ ์ ๋๋ค. Finally์์ ํด์ ํ๊ณ Main์ ํ์๋ฅผ ๋ฐํํฉ๋๋ค. 0์ ๋ณํ ์์, 1์ ํ ๋ฒ์ด์ง True๊ฐ ์๋๋๋ค. State.online์ ๋ง์ง๋ง์ผ๋ก ๋ฐ์ ์ํ์ด๋ฉฐ ์ด๊ธฐ ์กฐํ๊ฐ ์๋๋๋ค.