Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] Metin2 Launcher + Autopatcher By Axor


Axor

Rekomendowane odpowiedzi

Opublikowano

Witam wszystkich, napisałem ostatnio launchera z autopatcherem w Visual Basic 2010. Wszystko zrobione od początku, bez żadnego szablonu, z bardzo prostą konfiguracją. Aktualizacja polega na sprawdzeniu czy w pliku w folderze z Metinem zapisana jest taka sama data co w automatycznie pobranym pliku update.txt (nazwy można zmieniać), jeśli nie to rozpoczyna się pobieranie określonych plików. Program jest w miarę zabezpieczony przed błędami spowodowanymi brakiem plików czy dostępu do Internetu. W najbliższym czasie postaram się wrzucić skompilowany przykład i może coś ulepszyć. A i przydało by się przetestować ;)

Bardzo proszę o wszelakie komentarze, uwagi, pomysły, czy zauważone błędy (będą plusy). Najlepiej jakby znalazł się jakiś znawca :P

Uczyni mnie to lepszym człowiekiem programistą :)

Mam nadzieję, że komuś się to przyda. Oto i kod z przykładowymi ustawieniami:

 

Public Class Launcher

 

'--------------------------------------------------

'-------Metin2 Launcher + Autopatcher by Axor------

'--------------------------------------------------

 

'--------------------------------------------------

'-------------------KONFIGURACJA-------------------

'--------------------------------------------------

 

'--------------------------------------------------

'------------------Tytuły okienek------------------

'--------------------------------------------------

Public Const app_title = "Tytuł okienka"

Public Const title_norm = "Tytuł komunikatów"

Public Const title_error = "Tytuł komunikatów o błędach"

 

'--------------------------------------------------

'-------------------Nazwy plików-------------------

'--------------------------------------------------

Public Const file_client = "spolszczenie.exe"

Public Const file_config = "config.exe"

Public Const file_last_update = "last_update.txt"

Public Const file_update = "update.txt"

 

'--------------------------------------------------

'--------------------Adresy URL--------------------

'--------------------------------------------------

Public Const url_patch = "http://www.serwer.com/patch/"

Public Const url_update = "http://www.serwer.com/launcher/update.txt"

Public Const url_website = "http://www.serwer.com/index.html"

 

'--------------------------------------------------

'---------------------Przyciski--------------------

'--------------------------------------------------

Public Const button_config = "Opcje gry"

Public Const button_quit = "Wyjście"

Public Const button_start = "Uruchom grę"

Public Const button_website = "Strona WWW"

 

'--------------------------------------------------

'---------------------Komunikaty-------------------

'--------------------------------------------------

Public Const msg_completed = "Aktualizacja zakończona."

Public Const msg_confirm = "Na pewno?"

Public Const msg_failed = "Aktualizacja nie powiodła się."

Public Const msg_file_not_found = "Nie znaleziono pliku"

Public Const msg_no_connection = "Brak połączenia z Internetem."

Public Const msg_nothing_new = "Klient nie wymaga aktualizacji."

Public Const msg_question = "Pobrać najnowszego patcha?"

 

'--------------------------------------------------

'------------------Opcje pobierania----------------

'--------------------------------------------------

Public Const connection_timeout = 30000

Public Const bIndex = False

Public Const bBGM = True

Public Const bEffect = False

Public Const bETC = True

Public Const bGuild = False

Public Const bIcon = True

Public Const bItem = False

Public Const bLocale = True

Public Const bMonster = False

Public Const bNPC = False

Public Const bPC = False

Public Const bProperty = False

Public Const bPsyco = False

Public Const bRoot = True

Public Const bSeason = False

Public Const bSound = False

Public Const bTerrain = True

Public Const bTextureSet = False

Public Const bTree = False

Public Const bUILoading = True

Public Const bUIScript = False

Public Const bZone = False

 

 

'--------------------------------------------------

'----------------------ZMIENNE---------------------

'--------------------------------------------------

Public msgboxres As Integer

Public lustring, ustring As String

 

 

'--------------------------------------------------

'----------------------FUNKCJE---------------------

'--------------------------------------------------

Public Function MissingFile(ByVal filename As String) As String

filename = msg_file_not_found & CStr(Chr(32)) & filename

Return (filename)

End Function

 

Public Function PackDest(ByVal packname As String, ByVal epk As Boolean) As String

packname = "pack/" & packname

If epk = True Then packname = packname & ".epk" Else packname = packname & ".eix"

Return (packname)

End Function

 

Public Function PackURL(ByVal packname As String, ByVal epk As Boolean) As String

packname = url_patch & packname

If epk = True Then packname = packname & ".epk" Else packname = packname & ".eix"

Return (packname)

End Function

 

 

'--------------------------------------------------

'------------------RESZTA PROGRAMU-----------------

'--------------------------------------------------

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If My.Computer.FileSystem.FileExists(file_client) = False Then

msgboxres = MsgBox(MissingFile(file_client), MsgBoxStyle.Exclamation, title_error)

ElseIf Shell(file_client, AppWinStyle.NormalFocus) = 0 Then

msgboxres = MsgBox(MissingFile(file_client), MsgBoxStyle.Exclamation, title_error)

End If

End Sub

 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

If My.Computer.FileSystem.FileExists(file_config) = False Then

msgboxres = MsgBox(MissingFile(file_config), MsgBoxStyle.Exclamation, title_error)

ElseIf Shell(file_config, AppWinStyle.NormalFocus) = 0 Then

msgboxres = MsgBox(MissingFile(file_config), MsgBoxStyle.Exclamation, title_error)

End If

End Sub

 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

If My.Computer.Network.IsAvailable() = False Then msgboxres = MsgBox(msg_no_connection, MsgBoxStyle.Exclamation, title_error) Else Process.Start(url_website)

End Sub

 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

If MsgBox(msg_confirm, 36, title_norm) = 6 Then Me.Close()

End Sub

 

Private Sub Launcher_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If My.Computer.Network.IsAvailable() = False Then

msgboxres = MsgBox(msg_no_connection, MsgBoxStyle.Exclamation, title_error)

Me.Close()

Else

Me.Text = app_title

Button1.Text = button_start

Button2.Text = button_config

Button3.Text = button_website

Button4.Text = button_quit

WebBrowser.Refresh()

If My.Computer.FileSystem.FileExists(file_last_update) = False Then

msgboxres = MsgBox(MissingFile(file_last_update), MsgBoxStyle.Exclamation, title_error)

Else

My.Computer.Network.DownloadFile(url_update, file_update, "", "", False, connection_timeout, True)

FileOpen(1, file_update, OpenMode.Input, OpenAccess.Read, OpenShare.LockReadWrite, 8)

Input(1, ustring)

FileClose(1)

FileOpen(2, file_last_update, OpenMode.Input, OpenAccess.Read, OpenShare.LockReadWrite, 8)

Input(2, lustring)

FileClose(2)

If ustring = lustring Then

msgboxres = MsgBox(msg_nothing_new, MsgBoxStyle.Information, title_norm)

ElseIf MsgBox(msg_question, 36, title_norm) = 6 Then

If bIndex = True Then My.Computer.Network.DownloadFile((url_patch & "Index"), ("pack/Index"), "", "", False, connection_timeout, True)

If bBGM = True Then

My.Computer.Network.DownloadFile(PackURL("BGM", True), PackDest("BGM", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("BGM", False), PackDest("BGM", False), "", "", False, connection_timeout, True)

End If

If bEffect = True Then

My.Computer.Network.DownloadFile(PackURL("Effect", True), PackDest("Effect", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Effect", False), PackDest("Effect", False), "", "", False, connection_timeout, True)

End If

If bETC = True Then

My.Computer.Network.DownloadFile(PackURL("ETC", True), PackDest("ETC", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("ETC", False), PackDest("ETC", False), "", "", False, connection_timeout, True)

End If

If bGuild = True Then

My.Computer.Network.DownloadFile(PackURL("guild", True), PackDest("guild", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("guild", False), PackDest("guild", False), "", "", False, connection_timeout, True)

End If

If bIcon = True Then

My.Computer.Network.DownloadFile(PackURL("icon", True), PackDest("icon", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("icon", False), PackDest("icon", False), "", "", False, connection_timeout, True)

End If

If bItem = True Then

My.Computer.Network.DownloadFile(PackURL("item", True), PackDest("item", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("item", False), PackDest("item", False), "", "", False, connection_timeout, True)

End If

If bLocale = True Then

My.Computer.Network.DownloadFile(PackURL("locale_pl", True), PackDest("locale_pl", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("locale_pl", False), PackDest("locale_pl", False), "", "", False, connection_timeout, True)

End If

If bMonster = True Then

My.Computer.Network.DownloadFile(PackURL("Monster", True), PackDest("Monster", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Monster", False), PackDest("Monster", False), "", "", False, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("monster2", True), PackDest("monster2", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("monster2", False), PackDest("monster2", False), "", "", False, connection_timeout, True)

End If

If bNPC = True Then

My.Computer.Network.DownloadFile(PackURL("NPC", True), PackDest("NPC", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("NPC", False), PackDest("NPC", False), "", "", False, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("npc2", True), PackDest("npc2", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("npc2", False), PackDest("npc2", False), "", "", False, connection_timeout, True)

End If

If bPC = True Then

My.Computer.Network.DownloadFile(PackURL("PC", True), PackDest("PC", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("PC", False), PackDest("PC", False), "", "", False, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("pc2", True), PackDest("pc2", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("pc2", False), PackDest("pc2", False), "", "", False, connection_timeout, True)

End If

If bProperty = True Then

My.Computer.Network.DownloadFile(PackURL("Property", True), PackDest("Property", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Property", False), PackDest("Property", False), "", "", False, connection_timeout, True)

End If

If bPsyco = True Then

My.Computer.Network.DownloadFile(PackURL("Psyco", True), PackDest("Psyco", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Psyco", False), PackDest("Psyco", False), "", "", False, connection_timeout, True)

End If

If bRoot = True Then

My.Computer.Network.DownloadFile(PackURL("root", True), PackDest("root", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("root", False), PackDest("root", False), "", "", False, connection_timeout, True)

End If

If bSeason = True Then

My.Computer.Network.DownloadFile(PackURL("season", True), PackDest("season", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("season", False), PackDest("season", False), "", "", False, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("season2", True), PackDest("season2", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("season2", False), PackDest("season2", False), "", "", False, connection_timeout, True)

End If

If bSound = True Then

My.Computer.Network.DownloadFile(PackURL("Sound", True), PackDest("Sound", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Sound", False), PackDest("Sound", False), "", "", False, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("sound2", True), PackDest("sound2", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("sound2", False), PackDest("sound2", False), "", "", False, connection_timeout, True)

End If

If bTerrain = True Then

My.Computer.Network.DownloadFile(PackURL("Terrain", True), PackDest("Terrain", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Terrain", False), PackDest("Terrain", False), "", "", False, connection_timeout, True)

End If

If bTextureSet = True Then

My.Computer.Network.DownloadFile(PackURL("textureset", True), PackDest("textureset", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("textureset", False), PackDest("textureset", False), "", "", False, connection_timeout, True)

End If

If bTree = True Then

My.Computer.Network.DownloadFile(PackURL("Tree", True), PackDest("Tree", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Tree", False), PackDest("Tree", False), "", "", False, connection_timeout, True)

End If

If bUILoading = True Then

My.Computer.Network.DownloadFile(PackURL("uiloading", True), PackDest("uiloading", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("uiloading", False), PackDest("uiloading", False), "", "", False, connection_timeout, True)

End If

If bUIScript = True Then

My.Computer.Network.DownloadFile(PackURL("uiscript", True), PackDest("uiscript", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("uiscript", False), PackDest("uiscript", False), "", "", False, connection_timeout, True)

End If

If bZone = True Then

My.Computer.Network.DownloadFile(PackURL("Zone", True), PackDest("Zone", True), "", "", True, connection_timeout, True)

My.Computer.Network.DownloadFile(PackURL("Zone", False), PackDest("Zone", False), "", "", False, connection_timeout, True)

End If

FileOpen(3, file_last_update, OpenMode.Output, OpenAccess.Write, OpenShare.LockReadWrite, 8)

Print(3, ustring)

FileClose(3)

My.Computer.FileSystem.DeleteFile(file_update)

msgboxres = MsgBox(msg_completed, MsgBoxStyle.Information, title_norm)

End If

End If

End If

End Sub

End Class

 

Opublikowano

nie wiem jak z tego mam zrobic autopatchera ale i tak mi nie potrzebny

+ dla ciebie za wysilek

 

;Script by ziuto
;Source-code Autoit v3
$User = InputBox("Twoj nick", "Podaj swoj nick", "tu go wpisz")
If $User = "ziuto" Then
$gui = GUICreate("User " & $User, 175, 100, -1, -1, 0x00080000)
$button_lubie_cie = GUICtrlCreateButton("Sam sie lubie", 50, 10)
$button_dam_ci_5_gwiazdek = GUICtrlCreateButton("Dam sobie 5 gwiazdek", 30, 40)
ElseIf $User <> "ziuto" Then
MsgBox(0, "Powitanie", "Siema " & $User)
$gui = GUICreate("User " & $User, 175, 100, -1, -1, 0x00080000)
$button_lubie_cie = GUICtrlCreateButton("Lubie cie ziuto", 47, 10)
$button_dam_ci_5_gwiazdek = GUICtrlCreateButton("Dam ci 5 gwiazdek ziuto", 25, 40)
EndIf
GUISetState(@SW_SHOW, $gui)
While $User = "ziuto"
$msg = GUIGetMsg()
Select
Case $msg = -3
ExitLoop
Case $msg = $button_lubie_cie
MsgBox(0, "Lubie sie", "Sam sie lubie :o")
Case $msg = $button_dam_ci_5_gwiazdek
MsgBox(0, "Dam sobie 5 gwiadek", "Ze bym to ja mogl sam sobie dac")
EndSelect
WEnd
While $User <> "ziuto"
$msg = GUIGetMsg()
Select
Case $msg = -3
ExitLoop
Case $msg = $button_lubie_cie
MsgBox(0, "Lubie cie", "A za co ?")
InputBox("A za co ?", "Za co mnie lubisz ?", "???")
MsgBox(0, "Za to", "Aha" & @CRLF & "Dobrze to wiedziec xD" & @CRLF & "Nq")
ShellExecute("http://www.mpcforum.pl/")
ExitLoop
Case $msg = $button_dam_ci_5_gwiazdek
ShellExecute("http://www.mpcforum.pl/user/259390-ziuto/")
EndSelect
WEnd


Opublikowano

@UP

Musisz mieć Visual Basic, jak nie potrzebujesz to lepiej nie pobieraj, bo trwa to strasznie długo :)

 

Dzięki za plusy, niedługo postaram się dokładnie opisać, co można z tym zrobić, w końcu basic nie jest zbyt popularny. Czekam także na dalsze opinie, pomysły, poprawki itp. :)

Opublikowano

a mozesz to jakos zedytowac ze jak klikne rozpocznij grę to zacznie szukac aktualizacji jak jej nie ma to wlacza gre jak jest to patchuje i wlacza gre[tak jak na pl]

211c73cd6486beb.gif

Minecraft

odkrywcai.pngwolftamer.png

Odkrywca

Wolfer:Lubie pieski:P

Jeżeli jesteś człowiek to kliknij na obrazek:

baner6.gif

Opublikowano

A nie jest lepiej tak jak teraz jest? Sprawdzanie i aktualizacja następuje po odpaleniu programu. Ale jak chcesz to mogę też taką wersję zrobić, po prostu chciałem, żeby to działało inaczej niż w zwykłym Metinie :P

Także jak będę miał czas na dodanie gotowców to zrobię też tak.

Opublikowano

nom dobre i to ale ja bym wolal gdy klikne ;)

211c73cd6486beb.gif

Minecraft

odkrywcai.pngwolftamer.png

Odkrywca

Wolfer:Lubie pieski:P

Jeżeli jesteś człowiek to kliknij na obrazek:

baner6.gif

  • 2 tygodnie później...
Opublikowano

@refresh

Refreshuje póki się jeszcze da, może będzie nowa wersja, żeby w przypadku przerwania pobierania nie uszkadzało poprzedniego pliku.

Opublikowano

Otworzyć spoiler, mistrzu :D

Jeżeli nie umiesz tego skompilować, to możesz wysłać mi wszystkie wartości jakie chcesz ustawić (część KONFIGURACJA w kodzie) i adres strony lub obrazka, który ma się wyświetlać, a ja ci wysyłam gotowca.

  • 2 tygodnie później...
Opublikowano

Mistrzu powiedz mi jedno.

Co ja mam zrobić aby mi patchował najnowsze pliki ten updater? :)

Ogólnie dobra robota, tylko wyjaśnij mi co mam zrobić poza wklejeniem kodu i zrobienia obrazu ? ...

Opublikowano

@2xUP

Musisz zmienić wartości w części KONFIGURACJA na swoje, program będzie pobierał wszystkie pliki jeżeli plik last_update.txt w folderze klienta jest różny od pliku update.txt na serwerze o podanym adresie. Jeżeli robiłeś już cokolwiek w VB to nie powinieneś mieć większych problemów.

Opublikowano

yyy a Kompilatora nie masz ?? czy nie umiesz bo  co widze nie umieja nawet kompilowac 

Wiem kto jest swój, a kto zwykły pedał
Intel Xeon E5 1650 v2 16GB Ram 1 TB SSD 2x D500 3GB

 

Opublikowano

@UP

Chodzi ci o te pliki, które są w kliencie 2010, a w 2008 ich nie ma? Na razie mój program ich nie pobierze, musiałbym dopisać kilka linijek :)

Wszystkie pliki pobierają się z jednego folderu na serwerze do folderu pack i zastępują te poprzednie.

 

A to jest do wszystkich, którzy nie wiedzą lub nie są pewni jak to dokładnie działa, może będzie mniej pytań :)

Public Const url_patch = "http://www.serwer.com/patch/"
Public Const url_update = "http://www.serwer.com/launcher/update.txt"
Public Const url_website = "http://www.serwer.com/index.html"

1. Folder na serwerze, stąd pliki są pobierane.

2. Plik na serwerze (domyślnie update.txt, można zmienić). Jeśli jego zawartość różni się od pliku (last_update.txt, też można zmienić) w głównym folderze klienta, rozpoczyna się pobieranie.

3. Link do strony, która otworzy się po kliknięciu przycisku.

Public Const file_client = "spolszczenie.exe"
Public Const file_config = "config.exe"
Public Const file_last_update = "last_update.txt"
Public Const file_update = "update.txt"

1. spolszczenie.exe zmienić na swoje spolszczenie.

2. config.exe raczej nie zmieniać (chyba że ktoś ma własny program do ustawiania opcji gry ;)).

3. last_update.txt to nazwa pliku w głównym folderze klienta.

4. update.txt to nazwa pliku na serwerze.

Wszystkie pliki pobierane są od razu do folderu pack (zastępują poprzednie).

Opublikowano

o KURDE AXOR TY JESTES MOIM KURWA BOGIEM xD

Możesz to wyrazić w inny sposób, np. w sporej ilości moich ulubionych znaczków na MPC (+) :D

 

a tak serio, bardzo fajny ten autoupdater.

jakbys mogl to zrob w VB i wrzuc na hosting jako demo :) albo filmik >???

Czyli? Mam zrobić patcher dla swojego priva, filmik przedstawiający działanie (pełen akcji :D) czy filmik o konfiguracji i kompilacji? Być może niedługo będę pomagał przy dedyku, to będziesz mógł na nim zagrać i wypróbować ten autopatcher :)

Opublikowano

Żebyś ty widział (a może raczej słyszał) moją reakcję na ten widok :D

Jak dajesz New Project to co potem klikasz?

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...