ラベル UO の投稿を表示しています。 すべての投稿を表示
ラベル UO の投稿を表示しています。 すべての投稿を表示

2012/04/03

UOA ツール 開発 #008 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

これまでの内容で取得できたもの

・アカウント名/アカウントID

・サーバー名

・キャラ名/キャラID

・スキル(スキルID/日本語名称/英語名称/表示値/ベース/ロック状態)

スキル管理ツールに必要なデータを取得できたかと思います。

後はVBのスキル次第で好きなものが作れるかなと。


私はというと・・・保存形式をXMLにしようかと調べていたらLINQという機能があることに気づいたのですが、データ量もそれほどないしINIにしてしまおうか。。。と悩み中。まったく進みません(・ω・;

MSDNの Visual Basic における XML

スキル定義

    Public UOA_SKILL_NAME(,) As String = { _
        {"Alchemy", "錬金術"}, _
        {"Anatomy", "解剖学"}, _
        {"Animal Lore", "動物学"}, _
        {"Item ID", "アイテム鑑定"}, _
        {"Armslore", "武器学"}, _
        {"Parrying", "シールド"}, _
        {"Begging", "物乞い"}, _
        {"Blacksmithy", "鍛冶"}, _
        {"Bowcraft", "弓矢製作"}, _
        {"Peacemaking", "沈静化"}, _
        {"Camping", "キャンピング"}, _
        {"Carpentry", "大工"}, _
        {"Cartography", "地図作成"}, _
        {"Cooking", "料理"}, _
        {"Detect Hidden", "探知"}, _
        {"Discordance", "不調和"}, _
        {"Evaluate Intelligence", "知性評価"}, _
        {"Healing", "治療"}, _
        {"Fishing", "釣り"}, _
        {"Forensic Evaluation", "検死"}, _
        {"Herding", "牧羊"}, _
        {"Hiding", "潜伏"}, _
        {"Provocation", "扇動"}, _
        {"Inscription", "書写"}, _
        {"Lockpicking", "鍵開け"}, _
        {"Magery", "魔法"}, _
        {"Magic Resistance", "魔法抵抗"}, _
        {"Tactics", "戦術"}, _
        {"Snooping", "覗き"}, _
        {"Musicianship", "楽器"}, _
        {"Poisoning", "毒"}, _
        {"Archery", "アーチェリー"}, _
        {"Spirit Speak", "霊話"}, _
        {"Stealing", "窃盗"}, _
        {"Tailoring", "裁縫"}, _
        {"Animal Taming", "調教"}, _
        {"Taste ID", "味見"}, _
        {"Tinkering", "細工"}, _
        {"Tracking", "追跡"}, _
        {"Veterinary", "獣医学"}, _
        {"Swordsmanship", "ソード"}, _
        {"Mace Fighting", "メイス"}, _
        {"Fencing", "フェンシング"}, _
        {"Wrestling", "レスリング"}, _
        {"Lumberjacking", "伐採"}, _
        {"Mining", "採掘"}, _
        {"Meditation", "瞑想"}, _
        {"Stealth", "ステルス"}, _
        {"Remove Trap", "罠解除"}, _
        {"Necromancy", "ネクロマンシー"}, _
        {"Focus", "フォーカス"}, _
        {"Chivalry", "騎士道"}, _
        {"Bushido", "武士道"}, _
        {"Ninjitsu", "忍術"}, _
        {"Spellweaving", "織成呪文"}, _
        {"Mysticism", "神秘呪文"}, _
        {"Imbuing", "練成"}, _
        {"Throwing", "スローイング"} _
    }

2012/03/23

UOA ツール 開発 #007 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

スキル情報取得

取得するにあたって、スキル番号が必要だったのですが、初めは分からなかったので0~100の間を取得してみた所、練成・神秘・スローイングまで含めた0~57のIDでした。

スキル関係で取得できたのは、表示値、ベース値、ロック状態、スキル名の4種類。


尚、スキル名はUOAの設定で英語表記を使用していれば英語の名称、日本語表記を設定していれば日本語の名称が帰って来るようです。

スキルキャップも欲しかったのですが、色々試した所見当たりませんでした・・・

Form(抜粋)

    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
    Protected Overrides Sub WndProc(ByRef WMSG As Message)
        Select Case (WMSG.Msg)
            Case WM_UOA_SKILL_LEVEL
                txtLog.AppendText(String.Format("スキル値変動 No:{1} Value:{2}{0}", vbCrLf, WMSG.WParam, WMSG.LParam))
        End Select
        MyBase.WndProc(WMSG)
    End Sub
 
    Private Sub btnGetSkillDisplay_Click(sender As System.Object, e As System.EventArgs) Handles btnGetSkillDisplay.Click
        Dim Result As Integer
        For i As Integer = 0 To 100
            Result = UOALink_GetSkillDisplay(i)
            If (Result = -1) Then Exit For
            txtLog.AppendText(String.Format("SkillDisplay No:{1} Value:{2}{0}", vbCrLf, i, Result))
        Next
    End Sub
 
    Private Sub btnGetSkillBased_Click(sender As System.Object, e As System.EventArgs) Handles btnGetSkillBased.Click
        Dim Result As Integer
        For i As Integer = 0 To 100
            Result = UOALink_GetSkillBased(i)
            If (Result = -1) Then Exit For
            txtLog.AppendText(String.Format("SkillBased No:{1} Value:{2}{0}", vbCrLf, i, Result))
        Next
    End Sub
 
    Private Sub btnGetSkillLock_Click(sender As System.Object, e As System.EventArgs) Handles btnGetSkillLock.Click
        Dim Result As Integer
        For i As Integer = 0 To 100
            Result = UOALink_GetSkillLock(i)
            If (Result = -1) Then Exit For
            txtLog.AppendText(String.Format("SkillLock No:{1} Value:{2}{0}", vbCrLf, i, Result))
        Next
    End Sub
 
    Private Sub btnGetSkillName_Click(sender As System.Object, e As System.EventArgs) Handles btnGetSkillName.Click
        Dim Result As Integer
        Dim Buf As String
        For i As Integer = 0 To 100
            Result = UOALink_GetSkillName(i)
            If (Result = -1) Then Exit For
            Buf = fncGetAtomString(Result)
            txtLog.AppendText(String.Format("SkillName No:{1} Value:{2}{0}", vbCrLf, i, Buf))
        Next
    End Sub
 
    Private Sub btnMessageCheck_Click(sender As System.Object, e As System.EventArgs) Handles btnMessageCheck.Click
        Dim Result As Integer
        Dim WM As Integer = CInt(Me.txtWM.Text)
        Dim WPARAM As Integer = CInt(Me.txtWPARAM.Text)
        Dim LPARAM As Integer = CInt(Me.txtLPARAM.Text)
        Result = UOALink_SendMessage(WM_USER + WM, WPARAM, LPARAM)
        txtLog.AppendText(String.Format("WM Check WM:{1} WPARAM:{2} LPARAM:{3} RESULT:{4}{0}", vbCrLf, WM, WPARAM, LPARAM, Result))
    End Sub

Module(抜粋)

    Public Const WM_UOA_GET_SKILL As Integer = WM_USER + 203
    Public Const WM_UOA_SKILL_LEVEL As Integer = WM_USER + 306
 
    Public Const UOA_GET_SKILL_DISPLAY As Integer = 0
    Public Const UOA_GET_SKILL_BASED As Integer = 1
    Public Const UOA_GET_SKILL_LOCK As Integer = 2
    Public Const UOA_GET_SKILL_NAME As Integer = 3
 
    Public Const UOA_SKILL_STATUS_UP As Integer = 0
    Public Const UOA_SKILL_STATUS_DOWN As Integer = 1
    Public Const UOA_SKILL_STATUS_LOCK As Integer = 2
 
 
    Public Function UOALink_GetSkillDisplay(ByVal SkillNo As Integer) As Integer
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_GET_SKILL, SkillNo, UOA_GET_SKILL_DISPLAY)
        Return Result
    End Function
 
    Public Function UOALink_GetSkillBased(ByVal SkillNo As Integer) As Integer
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_GET_SKILL, SkillNo, UOA_GET_SKILL_BASED)
        Return Result
    End Function
 
    Public Function UOALink_GetSkillLock(ByVal SkillNo As Integer) As Integer
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_GET_SKILL, SkillNo, UOA_GET_SKILL_LOCK)
        Return Result
    End Function
 
    Public Function UOALink_GetSkillName(ByVal SkillNo As Integer) As Integer
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_GET_SKILL, SkillNo, UOA_GET_SKILL_NAME)
        Return Result
    End Function

ダウンロード

開いたら File→Download で保存することができます。

UOA_Tool.#007.zip

2012/03/22

UOA ツール 開発 #006 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

アカウント名、キャラ名

前回の続きですが、今度はアカウント名とキャラ名をuo.cfgから取得する処理。

キャラクターがログアウトしたらuo.cfgを読み込んで名称を取得しようという考えです。

微妙にハマったのが、INIファイル読み込みだからと思ってGetProfileString使った所、uo.cfgにはセクション([xxx]ようなもの)が無くて、うまく読めなかった感じ。(結構ネット調べたんですが見つからなかったので、分かる方いたら教えて下さい・・・)

結局は正規表現で無理やり抜き出し(・・;

そもそもINIファイルじゃないっ って話かもしれませんが。

Form(抜粋)

    Private AcctName As String = ""
    Private PlayerName As String = ""
    Private UO_Path As String = ""
 
    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
    Protected Overrides Sub WndProc(ByRef WMSG As Message)
        Select Case (WMSG.Msg)
            Case WM_UOA_LOGOUT
                AcctName = UO_GetAcctID(UO_Path)
                PlayerName = UO_GetPlayerName(UO_Path)
                txtLog.AppendText(String.Format("AcctName:{1} AcctID:{2}{0}", vbCrLf, AcctName, AcctID))
                txtLog.AppendText(String.Format("PlayerName:{1} PlayerID:{2}{0}", vbCrLf, PlayerName, CharaID))
        End Select
        MyBase.WndProc(WMSG)
    End Sub
 
    Private Sub txtUOPath_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtUOPath.TextChanged
        UO_Path = txtUOPath.Text
    End Sub

Module(抜粋)

    Public Const UOCFG_ACCTID As String = "AcctID"
    Public Const UOCFG_PLAYERNAME As String = "PlayerName"
 
    Public Function UO_GetAcctID(ByVal strFilePath As String) As String
        Dim Result As String = ""
 
        If (strFilePath.Trim = "") Then Return Result
        If Not (System.IO.File.Exists(strFilePath)) Then Return Result
 
        Dim sr As New System.IO.StreamReader(strFilePath)
        Dim buf As String = sr.ReadToEnd()
        sr.Close()
 
        Dim reg As New System.Text.RegularExpressions.Regex( _
            String.Format("{0}=[A-Z0-9]+", UOCFG_ACCTID), _
            System.Text.RegularExpressions.RegexOptions.IgnoreCase)
        Dim match As System.Text.RegularExpressions.Match = reg.Match(buf)
 
        If (match.Success) Then
            Dim ValueArray() As String = match.Value.Split("=")
            If (Not IsNothing(ValueArray(1))) Then
                Result = ValueArray(1)
            End If
        End If
 
        Return Result
 
    End Function
 
    Public Function UO_GetPlayerName(ByVal strFilePath As String) As String
        Dim Result As String = ""
 
        If (strFilePath.Trim = "") Then Return Result
        If Not (System.IO.File.Exists(strFilePath)) Then Return Result
 
        Dim sr As New System.IO.StreamReader(strFilePath)
        Dim buf As String = sr.ReadToEnd()
        sr.Close()
 
        Dim reg As New System.Text.RegularExpressions.Regex( _
            String.Format("{0}=[A-Z0-9]+", UOCFG_PLAYERNAME), _
            System.Text.RegularExpressions.RegexOptions.IgnoreCase)
        Dim match As System.Text.RegularExpressions.Match = reg.Match(buf)
 
        If (match.Success) Then
            Dim ValueArray() As String = match.Value.Split("=")
            If (Not IsNothing(ValueArray(1))) Then
                Result = ValueArray(1)
            End If
        End If
 
        Return Result
    End Function

ダウンロード

開いたら File→Download で保存することができます。

UOA_Tool.#006.zip

2012/03/16

UOA ツール 開発 #005 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

シャード名、アカウント情報、キャラ情報

シャード名は普通に取得することができましたが、キャラ名やアカウント名は取得できなくて、UOAの管理しているIDとして取得できました。

UO.cfgにアカウント名、キャラ名が *ログアウト時* に保存されますが、クライアントが異常終了したときは保存されないと思うので若干問題が出そうです(・・;

ユーザーIDとやらも取得できましたがこちらは、パーティ関連で使うらしいので今回は必要なかったかもでした。

Form(抜粋)

    Private ShadeName As String = ""
    Private AcctID As Integer = 0
    Private UserID As Integer = 0
    Private CharaID As Integer = 0
 
    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
    Protected Overrides Sub WndProc(ByRef WMSG As Message)
        Select Case (WMSG.Msg)
            Case WM_UOA_LOGON
                CharaID = WMSG.WParam
                UserID = UOALink_GetUserID()
                AcctID = UOALink_GetAcctID()
                ShadeName = UOALink_GetShadeName()
                txtLog.AppendText(String.Format("ログインしました{0}", vbCrLf))
                txtLog.AppendText(String.Format(" ShadeName:{1} AcctID:{2} CharaID:{3} UserID:{4}{0}", vbCrLf, AcctID, CharaID, UserID))
                txtLog.AppendText(String.Format("{0}", vbCrLf))
 
            Case WM_UOA_LOGOUT
                CharaID = 0
                UserID = 0
                AcctID = 0
                ShadeName = ""
                txtLog.AppendText(String.Format("ログアウトしました{0}", vbCrLf))
                txtLog.AppendText(String.Format("{0}", vbCrLf))
 
        End Select
        MyBase.WndProc(WMSG)
    End Sub

Module(抜粋)

    Public Const WM_UOA_GET_USER_ID As Integer = WM_USER + 210
    Public Const WM_UOA_GET_SHARD_NAME As Integer = WM_USER + 211
    Public Const WM_UOA_GET_ACCOUNT_IDENTIFIER As Integer = WM_USER + 216
    Public Const WM_UOA_LOGON As Integer = WM_USER + 303
    Public Const WM_UOA_LOGOUT As Integer = WM_USER + 308
 
    Public Function UOALink_GetShadeName() As String
        Dim Result As Integer
        Dim Buf As String = ""
        Result = UOALink_SendMessage(WM_UOA_GET_SHARD_NAME, 0, 0)
        If (Result <> 0) Then
            Buf = fncGetAtomString(Result)
        End If
        Return Buf
    End Function
 
    Public Function UOALink_GetAcctID() As Integer
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_GET_ACCOUNT_IDENTIFIER, 0, 0)
        Return Result
    End Function
 
    Public Function UOALink_GetUserID() As Integer
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_GET_USER_ID, 0, 0)
        Return Result
    End Function

ダウンロード

開いたら File→Download で保存することができます。

UOA_Tool.#005.zip

2012/03/11

UOA ツール 開発 #004 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

冴えない頭で考える

坦々と機能紹介していってもつまらないので・・・既に3日坊主になりかけ(・ω・;

何かを作る方向性にしようかと思って考えたのが、スキル管理!?っぽいのを。

私はソウルストーンで入れ替えしてるとどのキャラにスキル入ってるか忘れがちで、わざわざINして確認が面倒だと思うから

サーバー別、アカウント別、キャラ別に保存しておけるのが作れたらいいなと思う。

以前スキル管理ソフトあった気がしたのだけれど探しても見当たらず、ちょうどいいので作ってみようかなと。

2012/03/07

UOA ツール 開発 #003 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

ログイン/ログアウト

1.UOAのハンドルを取得する

 FindWindowで“UOASSIST-TP-MSG-WND”を探すとハンドルを取得できる

2.UOAに自分のウィンドウハンドルを通知

 SendMessageでUOAハンドルめがけてWM_USER+200と自分のハンドルを送る

・ログアウト

1.上記2を再度行うとログアウトできる

Form(抜粋)

    Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
        Dim Result As Integer
        Result = UOALink_Login(Me.Handle)
        Select Case Result
            Case -1
                txtLog.AppendText(String.Format("UOALink_Login = {1}: UOAが見つからない{0}", vbCrLf, Result))
            Case 0
                txtLog.AppendText(String.Format("UOALink_Login = {1}: スロットが一杯{0}", vbCrLf, Result))
            Case 1
                txtLog.AppendText(String.Format("UOALink_Login = {1}: ログイン成功{0}", vbCrLf, Result))
            Case 2
                txtLog.AppendText(String.Format("UOALink_Login = {1}: ログアウト成功{0}", vbCrLf, Result))
            Case Else
                txtLog.AppendText(String.Format("UOALink_Login = {1}: 不明な戻り値{0}", vbCrLf, Result))
        End Select
    End Sub

Module(抜粋)

    Public Const UOA_CLASSNAME As String = "UOASSIST-TP-MSG-WND"
    Public UOA_hWnd As Integer
    Public Const WM_USER As Integer = &H400S
    Public Const WM_UOA_REQUEST_DATA As Integer = WM_USER + 200
 
    Public Function fncGetWindowHandle( _
    ByVal pClassName As String) As Integer
        Return FindWindow(pClassName, vbNullString)
    End Function
 
    Public Function UOALink_SendMessage( _
        ByVal WM_UOA As Integer, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer) As Integer
        Dim Result As Integer
        UOA_hWnd = fncGetWindowHandle(UOA_CLASSNAME)
        If UOA_hWnd = 0 Then
            Return -1
        End If
        Result = SendMessage(UOA_hWnd, WM_UOA, wParam, lParam)
        Return Result
    End Function
 
    Public Function UOALink_Login(ByVal hWnd As Integer, Optional ByVal GetHouse As Integer = 0) As Integer
        '' hwnd   = メッセージを受け取るウィンドウハンドル
        '' Result = -1 : UOALink_SendMessageでUOAのウィンドウが見つからないと-1を設定
        '' Result =  0 : スロットが一杯
        '' Result =  1 : ログイン
        '' Result =  2 : ログアウト
        Dim Result As Integer
        Result = UOALink_SendMessage(WM_UOA_REQUEST_DATA, hWnd, GetHouse)
        Return Result
    End Function

ダウンロード

開いたら File→Download で保存することができます。

UOA_Tool.#003.zip

2012/02/25

UOA ツール 開発 #002 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

基本な流れ

1.UOAに情報ちょうだいとお願いする(UOAにログイン)

 ↓

2.UOAにxxxを教えてとお願いする

 その場で値が戻ってくるのもあるし、

 非同期でウィンドウに通知してくるものもある。

 ↓

3.UOAに情報はもう要らないですとお願いする(UOAからログアウト)


※UOAのログイン数に制限があるので必ずログアウトはした方がいいです。

 デバック時にログインできなくなってしまったらUOA再起動という感じになります。


最低限必要なもの

FindWindow - ログインするときにUOAを見つけるのに必要

SendMessage - UOAにメッセージを送るのに必要

GlobalGetAtomName,GlobalDeleteAtom - UOAから文字列を受け取るときに必要

ウィンドウプロシージャー - 非同期で戻ってくるメッセージを受け取るのに必要



モジュールの定義がまだまだ足りないですが、

取説(UOA Infomation)と雛形(下記コード)があれば

VBが少ししか分からないという人でもある程度作れるのではないかと思う。

Form

Imports System.Runtime.InteropServices
Public Class form_name
    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
    Protected Overrides Sub WndProc(ByRef WMSG As Message)
        Select Case (WMSG.Msg)
            Case WM_UOA_RESOURCE_COUNT_FINISHED
            Case WM_UOA_SPELL_WAS_ATTEMPTED
            Case WM_UOA_LOGON
            Case WM_UOA_MAGERY_SKILL_LEVEL
            Case WM_UOA_CURRENT_INT_AND_MANA
            Case WM_UOA_SKILL_LEVEL
            Case WM_UOA_MACRO_FINISHED
            Case WM_UOA_LOGOUT
            Case WM_UOA_CURRENT_MAX_HP_AND_HP
            Case WM_UOA_CURRENT_DEX_AND_STAM
            Case WM_UOA_ADD_HOUSE_BOAT
            Case WM_UOA_FACET_LAND_INFO
            Case WM_UOA_POWER_HOUR_ENTERED
        End Select
        MyBase.WndProc(WMSG)
    End Sub
End Class

Module

Imports System.Runtime.InteropServices
Module module_name
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Function FindWindow( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Integer
    End Function
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Function SendMessage( _
        ByVal hWnd As Integer, _
        ByVal wMsg As Integer, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer) As Integer
    End Function
 
    <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Function GlobalGetAtomName( _
        ByVal nAtom As Integer, _
        ByVal lpBuffer As System.Text.StringBuilder, _
        ByVal nSize As Integer) As Integer
    End Function
 
    <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Function GlobalDeleteAtom( _
        ByVal nAtom As Integer) As Integer
    End Function
 
    Public Const UOA_CLASSNAME As String = "UOASSIST-TP-MSG-WND"
    Public UOA_hWnd As Integer
    Public Const WM_USER As Short = &H400S
    Public Const WM_UOA_REQUEST_DATA As Integer = WM_USER + 200
    Public Const WM_UOA_UCOUNT_RESOURCES As Integer = WM_USER + 201
    Public Const WM_UOA_GET_COORDS As Integer = WM_USER + 202
    Public Const WM_UOA_GET_SKILL As Integer = WM_USER + 203
    Public Const WM_UOA_GET_STAT As Integer = WM_USER + 204
    Public Const WM_UOA_SET_ACTIVE_MACRO As Integer = WM_USER + 205
    Public Const WM_UOA_PLAY_MACRO As Integer = WM_USER + 206
    Public Const WM_UOA_DISPLAY_TEXT As Integer = WM_USER + 207
    Public Const WM_UOA_REQUEST_HOUSE_BOAT_INFO As Integer = WM_USER + 208
    Public Const WM_UOA_ADD_COMMAND_LINE As Integer = WM_USER + 209
    Public Const WM_UOA_GET_USER_ID As Integer = WM_USER + 210
    Public Const WM_UOA_GET_SHARD_NAME As Integer = WM_USER + 211
    Public Const WM_UOA_ADD_USER_TO_PARTY As Integer = WM_USER + 212
    Public Const WM_UOA_GET_UO_WINDOW_HANDLE As Integer = WM_USER + 213
    Public Const WM_UOA_GET_POISON_STATUS As Integer = WM_USER + 214
    Public Const WM_UOA_SET_SKILL_LOCK As Integer = WM_USER + 215
    Public Const WM_UOA_GET_ACCOUNT_IDENTIFIER As Integer = WM_USER + 216
    Public Const WM_UOA_RESOURCE_COUNT_FINISHED As Integer = WM_USER + 301
    Public Const WM_UOA_SPELL_WAS_ATTEMPTED As Integer = WM_USER + 302
    Public Const WM_UOA_LOGON As Integer = WM_USER + 303
    Public Const WM_UOA_MAGERY_SKILL_LEVEL As Integer = WM_USER + 304
    Public Const WM_UOA_CURRENT_INT_AND_MANA As Integer = WM_USER + 305
    Public Const WM_UOA_SKILL_LEVEL As Integer = WM_USER + 306
    Public Const WM_UOA_MACRO_FINISHED As Integer = WM_USER + 307
    Public Const WM_UOA_LOGOUT As Integer = WM_USER + 308
    Public Const WM_UOA_CURRENT_MAX_HP_AND_HP As Integer = WM_USER + 309
    Public Const WM_UOA_CURRENT_DEX_AND_STAM As Integer = WM_USER + 310
    Public Const WM_UOA_ADD_HOUSE_BOAT As Integer = WM_USER + 311
    Public Const WM_UOA_DELETE_HOUSE_BOAT As Integer = WM_USER + 312
    Public Const WM_UOA_FACET_LAND_INFO As Integer = WM_USER + 313
    Public Const WM_UOA_POWER_HOUR_ENTERED As Integer = WM_USER + 314
 
    Public Function fncGetHIWORD( _
        ByVal i As Integer) As Integer
        Dim HIWORD As Integer = ((i And &HFFFF0000) \ 65536) And 65535
        Return HIWORD
    End Function
 
    Public Function fncGetLOWORD( _
        ByVal i As Integer) As Integer
        Dim LOWORD As Integer = i And 65535
        Return LOWORD
    End Function
 
    Public Function fncGetHILO( _
        ByVal HI As Integer, _
        ByVal LO As Integer) As Integer
        Dim i As Integer
        i = HI * 65536
        i = i Or (LO And 65535)
        Return i
    End Function
 
    Public Function fncGetWindowHandle( _
        ByVal pClassName As String) As Integer
        Return FindWindow(pClassName, vbNullString)
    End Function
 
    Public Function UOALink_SendMessage( _
        ByVal WM_UOA As Integer, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer) As Integer
        Dim Result As Integer
        mUOAWnd = fncGetWindowHandle(UOA_CLASSNAME)
        If mUOAWnd = 0 Then
            Return -1
        End If
        Result = SendMessage(mUOAWnd, WM_UOA, wParam, lParam)
        Return Result
    End Function
 
    Public Function fncGetAtomString( _
        ByVal nAtom As Integer) As String
        Dim tmpLength As Integer = 256
        Dim tmpString = New System.Text.StringBuilder(tmpLength)
        Dim Result As Integer
        Result = GlobalGetAtomName(nAtom, tmpString, tmpLength)
        Result = GlobalDeleteAtom(nAtom)
        Return tmpString.ToString
    End Function
End Module

ダウンロード

開いたら File→Download で保存することができます。

UOA_Tool.#002.zip

2012/02/22

UOA ツール 開発 #001 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

情報元

元となる情報は、たまたま見つけたUOAホームページの隠しページでした、ウィンドウメッセージをやり取りして情報を提供するようなことが書かれてます。

あとはスキル関連の値を調べるのが面倒で調べてたら、delphiのプロジェクトを見つけたという感じです。

できることは、

「簡単なステータス管理」

「ただのMAPツール」

「リソース管理」

「UOAマクロ実行」

「スキル管理」

「詠唱ツール」

「画面に文字表示」

「ユーザーコマンドライン追加」


リソース管理、ステータス管理、詠唱ツール、スキル管理はUO内だけでも十分だし、マクロ、MAPツールは他の高性能ツール使ったほうがよさげ・・・

画面に文字表示は・・・

 ゲームを開始してから1時間がたちました.

 ゲームを開始してから2時間がたちました..

 ゲームを開始してから3時間がたちました...

 (うざっ)

もっと実用的な管理のためだったら使えそうですね。


大してできることはないじゃないですかって感じですが、自分好みの分かりやすいツールは作れそうです。

UOAssist information(こちらはもう見れなくなってるので貼り付け。)

UOAssist Interface for Delphi

 

SourceForgeにあるので見つかると思います。

2012/02/19

UOA ツール 開発 #000 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

初めに。

ふと気づいたら、昔のツール資料がなくなっているのに気づいて、やはり忘れないようにめもめも・・・

めもめもしていくのは、MMOのウルティマオンラインのツールについてですが・・・

ちょっと古いゲームですね。。。

UOの公式ツールである「UOA」に関してのツール作成の情報となります。パケット弄ったりはしないのでチートツールにはならない!?かと思います。

簡単にいうと、UOのクライアントとのやり取りはUOAが行っているので、ちょこっと情報をもらって、外部からUOAを操作しちゃおうかなってツール。

言語はVisual Basic 2010 Expressでめもめもです。

過去に作ったツール

UO Mining Master(掘り 支援 ツール)

※火ゴキと散歩してるだけで掘ってくれるツール。。。

※狙った鉱石をちょこっと操作で集めるようなツール。。。

2010/08/20

[Wine Install]

Windowsの環境?のようなものをエミュレートして
アプリケーションが実行できるというもの

Windowsアプリを実行するのはwine
ランタイムやパッケージをインストールしてくれるのがwinetricks

-->Repository

# yum -y --enablerepo=dag install wine

・他に必要なランタイムをインストール
# yum -y install cabextract p7zip p7zip-plugins
# cd /usr/local/bin
# wget http://www.kegel.com/wine/winetricks
# chmod 755 winetricks
# winetricks gecko

・バージョン
$ wine --version
wine-1.2
$ winetricks -V
Winetricks version 20100811. (C) 2007-2009 Dan Kegel et al. LGPL.


・インストールしたいランタイムはそのまま実行すればGUIが立ち上がって一覧がでる
# winetricks

・Windowsアプリの起動、またはインストーラーの起動
$ wine xxxsetup.exe

・インストールされたものなどは下記に入っているので
 winetricksでインストールがおかしくなったら、
 このディレクトリを削除して最初からやりなおす
${HOME}/.wine/

・ネトゲを動かしてみる
# winetricks winxp
# winetricks gecko
# winetricks allfonts
# winetricks allcodecs
# winetricks d3dx9 d3dxof dinput8 directmusic directplay quartz xact
# winetricks ddr=gdi
# wine UOSAClassic_7_0_7_1.exe
・msvcrt.dllが問題あったようなので拾ってきてインストール完了

「とりあえずランタイムとかDLL全部入れておくか」とやると
あちこちで問題が出るので必要なものだけを入れるようにする。

これやってDOTNETランタイムが入らなくなりました・・・


・winetricks オプション一覧
Packages:
7zip 7-zip file archiver
adobeair Adobe AIR runtime
art2kmin MS Access 2007 runtime
atmlib Adobe Type Manager. Needed for Adobe CS4
autohotkey Autohotkey (open source gui scripting language)
cmake CMake, the cross-platform, open-source build system
colorprofile Standard RGB color profile
comctl32 MS common controls 5.80
comctl32.ocx MS comctl32.ocx and mscomctl.ocx, comctl32 wrappers for VB6
controlpad MS ActiveX Control Pad
corefonts MS Arial, Courier, Times fonts
cygwin Unix apps for Windows (needed by some build scripts)
d3dx9 MS d3dx9_??.dll (from DirectX 9 user redistributable)
d3dx9_28 MS d3dx9_28.dll
d3dx9_36 MS d3dx9_36.dll
d3dx10 MS d3dx10_??.dll (from DirectX user redistributable)
d3dxof MS d3dxof.dll (from DirectX user redistributable)
dcom98 MS DCOM (ole32, oleaut32); requires Windows 98 license, but does not check for one
dinput8 MS dinput8.dll (from DirectX 9 user redistributable)
dirac the Dirac directshow filter
directmusic MS DirectMusic (from DirectX 9 user redistributable)
directplay MS DirectPlay (from DirectX 9 user redistributable)
directx9 MS DirectX 9 user redistributable (not recommended! use d3dx9 instead)
directx9-beta MS DirectX 9 user redistributable - beta verb (not recommended! use d3dx9 instead)
divx divx video codec
dotnet11 MS .NET 1.1 (requires Windows license, but does not check for one)
dotnet20 MS .NET 2.0 (requires Windows license, but does not check for one)
dotnet20sp2 MS .NET 2.0 sp2 (requires Windows license, but does not check for one)
dotnet30 MS .NET 3.0 (requires Windows license, but does not check for one, might not work yet)
droid Droid fonts (on LCD, looks better with fontsmooth-rgb)
dxsdk_nov2006 DirectX Software Development Kit, November 2006 version
eadm EA Download Manager
eufonts Updated fonts for Romanian and Bulgarian
ffdshow ffdshow video codecs
firefox Firefox web browser
flash Adobe Flash Player ActiveX and firefox plugins
fm20 MS Forms 2.0 Object Library
fontfix Fix bad fonts which cause crash in some apps (e.g. .net).
fontsmooth-bgr Enables subpixel smoothing for BGR LCDs
fontsmooth-disable Disables font smoothing
fontsmooth-gray Enables grayscale font smoothing
fontsmooth-rgb Enables subpixel smoothing for RGB LCDs
gdiplus MS gdiplus.dll
gecko-dbg The HTML rendering Engine (Mozilla), with debugging symbols
gecko The HTML rendering Engine (Mozilla)
gfw MS Game For Windows Live (xlive.dll)
glut The glut utility library
hosts Adds empty C:\windows\system32\drivers\etc\{hosts,services} files
ie6 Microsoft Internet Explorer 6.0
ie7 Microsoft Internet Explorer 7.0
ie8 Microsoft Internet Explorer 8.0
jet40 MS Jet 4.0 Service Pack 8
kde KDE for Windows installer
liberation Red Hat Liberation fonts (Sans, Serif, Mono)
mdac25 MS MDAC 2.5: Microsoft ODBC drivers, etc.
mdac27 MS MDAC 2.7
mdac28 MS MDAC 2.8
mfc40 MS mfc40 (Microsoft Foundation Classes from Visual C++ 4)
mfc42 MS mfc42 (same as vcrun6 below)
mingw-gdb GDB for MinGW
mingw Minimalist GNU for Windows, including GCC for Windows!
mono20 mono-2.0.1
mono22 mono-2.2
mono24 mono-2.4
mono26 mono-2.6
mozillabuild Mozilla build environment
mpc Media Player Classic
mshflxgd MS Hierarchical Flex Grid Control
msi2 MS Installer 2.0
msls31 MS Line Services 3.1 (needed by native riched?)
msmask MS Masked Edit Control
mspaint MS Paint (gotta draw stick figures somehow...)
msscript MS Script Control
msxml3 MS XML version 3
msxml4 MS XML version 4
msxml6 MS XML version 6
ogg ogg filters/codecs: flac, theora, speex, vorbis, schroedinger
ole2 MS 16 bit OLE
openwatcom Open Watcom C/C++ compiler (can compile win16 code!)
pdh MS pdh.dll (Performance Data Helper)
physx NVIDIA/AGEIA PhysX runtime
psdk2003 MS Platform SDK 2003
psdkvista MS Vista SDK (does not install yet)
psdkwin7 MS Windows 7 SDK (installing just headers and c++ compiler works)
python26 Python 2.6.2 (and pywin32)
python-comtypes Python 0.6.1-1 comtypes package
quartz quartz.dll (from Directx 9 user redistributable)
quicktime72 Apple Quicktime 7.2
riched20 MS riched20 and riched32
riched30 MS riched30
richtx32 MS Rich TextBox Control 6.0
safari Apple Safari web browser
secur32 MS secur32
shockwave Adobe Shockwave Player
steam Steam Client App from Valve
tahoma MS Tahoma font (not part of corefonts)
urlmon MS urlmon.dll
usp10 MS usp10.dll (Uniscribe)
utorrent uTorrent
vb2run MS Visual Basic 2 runtime
vb3run MS Visual Basic 3 runtime
vb4run MS Visual Basic 4 runtime
vb5run MS Visual Basic 5 runtime
vb6run MS Visual Basic 6 Service Pack 6 runtime
vc2005express MS Visual C++ 2005 Express
vc2005expresssp1 MS Visual C++ 2005 Express SP1 (does not work yet)
vc2005sp1 MS Visual C++ 2005 Service Pack 1 and ATL fix (install trial 1st)
vc2005hotfix MS Visual C++ 2005 hotfixes (install sp1 1st)
vc2005trial MS Visual C++ 2005 Trial
vcrun2003 MS Visual C++ 2003 libraries (mfc71,msvcp71,msvcr71)
vcrun2005 MS Visual C++ 2005 sp1 libraries (mfc80,msvcp80,msvcr80)
vcrun2008 MS Visual C++ 2008 libraries (mfc90,msvcp90,msvcr90)
vcrun6 MS Visual C++ 6 sp4 libraries (mfc42, msvcp60, msvcrt)
vcrun6sp6 MS Visual C++ 6 sp6 libraries (mfc42, msvcp60, msvcrt; 64 MB download)
vjrun20 MS Visual J# 2.0 SE libraries (requires dotnet20)
vlc VLC media player
wenquanyi WenQuanYi CJK font (on LCD looks better with fontsmooth-rgb)
windowscodecs MS Windows Imaging Component
wininet MS wininet.dll (requires Windows license, but does not check for one)
wme9 MS Windows Media Encoder 9 (requires Windows license, but does not check for one)
wmp10 MS Windows Media Player 10 (requires Windows license, but does not check for one)
wmp9 MS Windows Media Player 9 (requires Windows license, but does not check for one)
wsh56js MS Windows scripting 5.6, jscript only, no cscript
wsh56 MS Windows Scripting Host 5.6
wsh56vb MS Windows scripting 5.6, vbscript only, no cscript
xact MS XACT Engine (x3daudio?_?.dll, xactengine?_?.dll)
xvid xvid video codec
Pseudopackages:
alldlls=builtin Force use of builtin dlls (even if loaded with absolute path) (except for msvcp80 and d3dx9_*)
alldlls=default Remove all DLL overrides
allfonts All listed fonts (corefonts, droid, eufonts, tahoma, liberation)
allcodecs All listed codecs (xvid, ffdshow)
ddr=gdi Set DirectDrawRenderer to GDI (default)
ddr=opengl Set DirectDrawRenderer to OpenGL
dsoundbug9612 Use DirectSound MaxShadowSize=0 workaround for bug #9612
fakeie6 Set registry to claim IE6sp1 is installed
forcemono Force using mono instead of .Net (for debugging)
glsl-disable Disable GLSL use by Wine Direct3D
glsl-enable Enable GLSL use by Wine Direct3D (default)
heapcheck Enable heap checking
multisampling=enabled Enable Direct3D multisampling
multisampling=disabled Disable Direct3D multisampling (default)
native_mdac Override odbc32, odbccp32 and oledb32
native_oleaut32 Override oleaut32
nocrashdialog Disable the graphical crash dialog
orm=backbuffer Registry tweak: OffscreenRenderingMode=backbuffer
orm=fbo Registry tweak: OffscreenRenderingMode=fbo (default)
orm=pbuffer Registry tweak: OffscreenRenderingMode=pbuffer
rtlm=auto Set RenderTargetLockMode to auto (default)
rtlm=disabled Set RenderTargetLockMode to disabled
rtlm=readdraw Set RenderTargetLockMode to readdraw
rtlm=readtex Set RenderTargetLockMode to readtex
rtlm=texdraw Set RenderTargetLockMode to texdraw
rtlm=textex Set RenderTargetLockMode to textex
sandbox Sandbox the wineprefix - remove links to ~
sound=alsa Set sound driver to ALSA
sound=audioio Set sound driver to AudioIO
sound=coreaudio Set sound driver to CoreAudio
sound=esd Set sound driver to Esound
sound=jack Set sound driver to Jack
sound=nas Set sound driver to Nas
sound=oss Set sound driver to OSS
sound=disabled Disable sound
strictdrawordering=enabled Enable StrictDrawOrdering (default)
strictdrawordering=disabled Disable StrictDrawOrdering
nt40 Set windows version to nt40
win98 Set windows version to Windows 98
win2k Set windows version to Windows 2000
winxp Set windows version to Windows XP
vista Set windows version to Windows Vista
win7 Set windows version to Windows 7
winver= Set windows version to default (winxp)
volnum Rename drive_c to harddiskvolume0 (needed by some installers)
mwo=force Set MouseWarpOverride to force (needded by some games
mwo=enabled Set MouseWarpOverride to enabled (default)
mwo=disable Set MouseWarpOverride to disable
npm-repack Set NonPower2Mode to repack
psm=on Set PixelShaderMode to enabled
psm=off Set PixelShaderMode to disabled
vsm-hard Set VertexShaderMode to hardware