2010年12月17日星期五

RevEmu 改名器(連編寫教學)

名: RevEmu 改名器
狀態: 已完成
開發平台: VB.net 2008
使用地方: PC, Left 4 Dead 2
程式開發日期: 2010年12月16日
程式推出日期: 2010年12月17日
程式最後更新: 2010年12月17日
版本總數: 1



此程式為乂囧乂(vLan: gordon7803)所委託而製作的程式
如此程式引起任何問題或損失, 本人不會負責



RevEmu 改名器使用方法:
請將exe放進與rev.ini同一個資料夾
然後啟動程式

程式目的:
用戶透過此程式可以修改rev.ini

(下載: http://u.115.com/file/f615f8370a , 如無法下載請通知)

編寫教學:

此程式於vb 2008.net下開發
其他版本可能有所不同

以下只為參考方法
可能會有其他方法達到相同效果


所需材料: rev.ini 樣本



[Emulator]

Language = tChinese

SteamClient = True

SteamUser = "Playername"


[steamclient]

PlayerName = "Playername"

目標: 
修改語言:
Language = tChinese
一行是儲存語言設定, tChinese代表繁體中文, sChinese代表簡體中文, English 代表英文
修改名稱:
PlayerName = "Playername"
一行是儲存玩家名稱設定



首先建立一個新專案
於form1中先建立3個控件,
分別為1個 ListBox , 用作選擇語言, 命名language_list
1個TextBox, 用作輸入名稱, 命名name_textbox
1個按鈕, 讓用戶按下它來儲存, 命名save_btn



圖1: 用戶介面







其他的可以暫時不建立

然後雙擊form1畫面, 進入程式碼設計畫面及增加Form1_Load的副程序(sub(routine))

首先定義一個區域變數:
在Form1_Load前, Public Class Form1後輸入

 Dim run_path As String = ""

run_path 會用作儲存此程式的執行路徑


程式會在啟動後會前先讀取rev.ini, 將現有數值變成預設值 (如圖1般, 語言和名稱都已有數值)
如果找不到rev.ini, 程式便會結束



1       run_path = (Application.ExecutablePath.Remove(Application.ExecutablePath.LastIndexOf("\") + 1))
2       If My.Computer.FileSystem.FileExists(run_path & "rev.ini") Then
3           Dim file_string As String = My.Computer.FileSystem.ReadAllText(run_path & "rev.ini", 
System.Text.Encoding.UTF8).Replace(Chr(10), "")
4           For i = 0 To file_string.Split(Environment.NewLine).Length - 1
5               If file_string.Split(Environment.NewLine)(i).StartsWith("Language =") Then
6                   If file_string.Split(Environment.NewLine)(i).EndsWith("english") Then
7                       Me.language_list.SelectedIndex = 0
8                   ElseIf file_string.Split(Environment.NewLine)(i).EndsWith("sChinese") Then
9                       Me.language_list.SelectedIndex = 1
10                  ElseIf file_string.Split(Environment.NewLine)(i).EndsWith("tChinese") Then
11                      Me.language_list.SelectedIndex = 2
12                  End If
13              ElseIf file_string.Split(Environment.NewLine)(i).StartsWith("PlayerName =") Then
14                  Me.name_textbox.Text = Trim(file_string.Split(Environment.NewLine)(i).Split("=")(1)).Replace("""", "")
15              End If
16          Next
17        Else
18          MessageBox.Show("找不到rev.ini", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error)
19          Me.Close()
20      End If

run_path = (Application.ExecutablePath.Remove(Application.ExecutablePath.LastIndexOf("\") + 1))
這行為將此程式的執行路徑(即啟動程式時, 程式放置的位置)剪走程式名後, 儲存在run_path變數中
例如程式位置為C:\Documents and Settings\RevEmu_namer.exe
run_path就會是C:\Documents and Settings\

第2行就是檢查run_path中有沒有rev.ini這個檔案
第3行就是在檢查到有rev.ini存在時, 讀取這個檔案內容, 並把它儲在變數file_string中
第4-16行是逐行讀取檔案中的文字, 當該行的開頭是Language = 時, 將=後的字會因應相關數值, 改變language_list已選取的值
而該行開頭是PlayerName =, 則會將=後的字, 並刪除"這個符號後, 然後將它設定為name_textbox.text
第18-19行是在找不到rev.ini時執行的指令



編寫載入form1的動作後, 就是編寫save_btn儲存按鈕被按下後就做的動作


1       If Me.name_textbox.Text.Length > 0 Then
            If My.Computer.FileSystem.FileExists(run_path & "rev.ini") Then
                Dim file_string As String = My.Computer.FileSystem.ReadAllText(run_path & "rev.ini"
System.Text.Encoding.UTF8).Replace(Chr(10), "")
                Dim file_line As Array = file_string.Split(Environment.NewLine)
                For i = 0 To file_line.Length - 1
6                   If file_line(i).StartsWith("Language =") Then
                        If Me.language_list.SelectedIndex = 0 Then
                            file_line(i) = "Language = english"
                        ElseIf Me.language_list.SelectedIndex = 1 Then
                            file_line(i) = "Language = sChinese"
11                       ElseIf Me.language_list.SelectedIndex = 2 Then
                            file_line(i) = "Language = tChinese"
                        End If
                    ElseIf file_line(i).StartsWith("PlayerName =") Then
                        file_line(i) = "PlayerName = """ & Me.name_textbox.Text & """"
16                  End If
                Next
                Dim result_string As String = ""
                For i = 0 To file_line.Length - 1
                    result_string += file_line(i) & Environment.NewLine
21              Next
                Try
                    My.Computer.FileSystem.WriteAllText(run_path & "rev.ini"
result_string, False, System.Text.Encoding.UTF8)
                Catch ex As Exception
                    MessageBox.Show("儲存失敗, 原因: " & ex.Message)
26                  Return
                End Try
                MessageBox.Show("已儲存!")
            Else
                MessageBox.Show("找不到rev.ini, 儲存失敗!")
31          End If
        Else
            MessageBox.Show("請輸入名稱")
        End If

第1行是用作檢查name_textbox有沒有輸入文字, 沒有的話跳至第33行
第2行就是檢查有沒有rev.ini這個檔案
第3行是讀取rev.ini的內容, 並讀儲至file_string
第4行是將file_string, 以換行符號作分隔, 分成array, 儲存至file_line變數中
第5-17行會逐行檢查file_line
第6行會檢查該行字是不是以Language =作開頭
第7-12行會因應language_list中被選取的值作出動作, 並作該行改成指定的值(8,10,12行)
第14行會檢查該行字是不是PlayerName =作開頭
第15行會將該行改成PlayerName = "(名)", 另外, "PlayerName = """" 中有4個引號, 頭尾代表字串, 中間的2個"代表 「"」, 與chr(34)有類似功能
第18行是定義一個字串, 用作儲存要寫進rev.ini的文字
第19-21行就是將已修改的file_line, 逐行寫進result_string中, 每行會有換行符號(Environment.NewLine)分隔
第22行的try 是與第24行的catch, 第27行的end try一起用, 用作避免因try區塊中(第23行)的指令發生錯誤, 導致程式被強制結束, 而catch區塊(第25,26行)是在錯誤發生時被呼叫的, 第25行是用到messagebox顯示錯誤的資訊 (ex.Message), 而第26行是用跳出副程序, 即不再執行save_btn被按下的動作
第28, 30, 33行是因應該事件而出示的messagebox



這樣, 程式就已完成了

按下F5試試看!


沒有留言:

發佈留言