yes and more specific like type, subtype etc.
Beiträge von Rick
-
-
Hey, I'm searching for the complete table, but I only found an incomplete one.
-
these quests are linked together, u have to complete the first one (main_quest_lv2) to begin the next (lv3).
you can see it at the beginnningquest main_quest_lv2 begin
state start begin
end
and at the end.
set_quest_state("main_quest_lv3","run") -
Watch what the state of the current quest is. When you first load the quest and than for any reasen you edit the quest and reload q, the state of some loaded quests stuck in some point.
in that case, just delete all entries with the quest name in quest table database
-
-
Code
- import app, net, ui, snd, wndMgr, musicInfo, systemSetting, localeInfo, constInfo, ime, os, uiScriptLocale
- from _weakref import proxy
- SERVER_IP = "135.125.139.75" # YOUR SERVER IP
- CH1_PORT = 13005 # PORTS
- CH2_PORT = 13105
- CH3_PORT = 13205
- CH4_PORT = 0
- PORT_AUTH = 31432
- NUME_SERVER = "Nemesis"
- class LoginWindow(ui.ScriptWindow):
- def __init__(self, stream):
- ui.ScriptWindow.__init__(self)
- net.SetPhaseWindow(net.PHASE_WINDOW_LOGIN, self)
- net.SetAccountConnectorHandler(self)
- self.stream = stream
- self.AccUse = [None, None, None, None, None, None]
- self.AccDel = [None, None, None, None, None, None]
- self.AccName = [None, None, None, None, None, None]
- self.AccSave = [None, None, None, None, None, None]
- self.Login = [None, None, None, None, None, None]
- self.SelectedChannel = [None, None, None, None, None, None]
- self.languageList = ["en","de","ro","pl","tr"]
- def __del__(self):
- ui.ScriptWindow.__del__(self)
- net.ClearPhaseWindow(net.PHASE_WINDOW_LOGIN, self)
- net.SetAccountConnectorHandler(0)
- def Open(self):
- print("TEST")
- if (False == os.path.exists('./loginsettings')):
- try:
- print("DEBUG01")
- os.mkdir("/loginsettings/")
- except OSError:
- print("EXIT")
- app.Exit
- f = open("loginsettings/loginsetting1.cfg", "a+")
- f.close()
- f = open("loginsettings/loginsetting2.cfg", "a+")
- f.close()
- f = open("loginsettings/loginsetting3.cfg", "a+")
- f.close()
- f = open("loginsettings/loginsetting4.cfg", "a+")
- f.close()
- f = open("loginsettings/loginsetting5.cfg", "a+")
- f.close()
- f = open("loginsettings/loginsetting6.cfg", "a+")
- f.close()
- self.loginFailureMsgDict={
- "ALREADY" : localeInfo.LOGIN_FAILURE_ALREAY,
- "NOID" : localeInfo.LOGIN_FAILURE_NOT_EXIST_ID,
- "WRONGPWD" : localeInfo.LOGIN_FAILURE_WRONG_PASSWORD,
- "FULL" : localeInfo.LOGIN_FAILURE_TOO_MANY_USER,
- "SHUTDOWN" : localeInfo.LOGIN_FAILURE_SHUTDOWN,
- "REPAIR" : localeInfo.LOGIN_FAILURE_REPAIR_ID,
- "BLOCK" : localeInfo.LOGIN_FAILURE_BLOCK_ID,
- "WRONGMAT" : localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER,
- "QUIT" : localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE,
- "BESAMEKEY" : localeInfo.LOGIN_FAILURE_BE_SAME_KEY,
- "NOTAVAIL" : localeInfo.LOGIN_FAILURE_NOT_AVAIL,
- "NOBILL" : localeInfo.LOGIN_FAILURE_NOBILL,
- "BLKLOGIN" : localeInfo.LOGIN_FAILURE_BLOCK_LOGIN,
- "WEBBLK" : localeInfo.LOGIN_FAILURE_WEB_BLOCK,
- }
- self.loginFailureFuncDict = {
- "WRONGPWD" : localeInfo.LOGIN_FAILURE_WRONG_PASSWORD,
- "WRONGMAT" : localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER,
- "QUIT" : app.Exit,
- }
- self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight())
- self.SetWindowName("LoginWindow")
- self.__LoadScript("UIScript/loginwindow.py")
- if musicInfo.loginMusic != "":
- snd.SetMusicVolume(systemSetting.GetMusicVolume())
- snd.FadeInMusic("BGM/" + musicInfo.loginMusic)
- snd.SetSoundVolume(systemSetting.GetSoundVolume())
- ime.AddExceptKey(91)
- ime.AddExceptKey(93)
- self.SetChannel(0)
- self.Show()
- app.ShowCursor()
- def Close(self):
- if musicInfo.loginMusic != "" and musicInfo.selectMusic != "":
- snd.FadeOutMusic("BGM/"+musicInfo.loginMusic)
- if self.stream.popupWindow:
- self.stream.popupWindow.Close()
- self.AccUse = [None, None, None, None, None, None]
- self.AccDel = [None, None, None, None, None, None]
- self.AccName = [None, None, None, None, None, None]
- self.AccSave = [None, None, None, None, None, None]
- self.Login = [None, None, None, None, None, None]
- self.SelectedChannel = [None, None, None, None, None, None]
- self.languageList = ["en","de","ro","pl","tr"]
- self.Hide()
- self.KillFocus()
- app.HideCursor()
- ime.ClearExceptKey()
- def OnConnectFailure(self):
- snd.PlaySound("sound/ui/loginfail.wav")
- self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.EmptyFunc)
- def OnHandShake(self):
- snd.PlaySound("sound/ui/loginok.wav")
- self.PopupDisplayMessage(localeInfo.LOGIN_CONNECT_SUCCESS)
- def OnLoginStart(self):
- self.PopupDisplayMessage(localeInfo.LOGIN_PROCESSING)
- def OnLoginFailure(self, error):
- try:
- loginFailureMsg = self.loginFailureMsgDict[error]
- except KeyError:
- loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN + error
- loginFailureFunc = self.loginFailureFuncDict.get(error, self.EmptyFunc)
- self.PopupNotifyMessage(loginFailureMsg, loginFailureFunc)
- snd.PlaySound("sound/ui/loginfail.wav")
- def __LoadScript(self, fileName):
- try:
- pyScrLoader = ui.PythonScriptLoader()
- pyScrLoader.LoadScriptFile(self, fileName)
- except:
- import exception
- exception.Abort("LoginWindow.__LoadScript.LoadObject")
- try:
- self.idEditLine = self.GetChild("id")
- self.pwdEditLine = self.GetChild("pwd")
- self.loginButton = self.GetChild("login_button")
- self.loginLanguageBoard = GetObject("LanguageBoard")
- self.channelButton = {
- 0 : self.GetChild("ch1"),
- 1 : self.GetChild("ch2"),
- 2 : self.GetChild("ch3"),
- 3 : self.GetChild("ch4")}
- self.AccUse[0] = self.GetChild("saved_accs_acc1_use")
- self.AccUse[1] = self.GetChild("saved_accs_acc2_use")
- self.AccUse[2] = self.GetChild("saved_accs_acc3_use")
- self.AccUse[3] = self.GetChild("saved_accs_acc4_use")
- self.AccUse[4] = self.GetChild("saved_accs_acc5_use")
- self.AccUse[5] = self.GetChild("saved_accs_acc6_use")
- self.AccDel[0] = self.GetChild("saved_accs_acc1_del")
- self.AccDel[1] = self.GetChild("saved_accs_acc2_del")
- self.AccDel[2] = self.GetChild("saved_accs_acc3_del")
- self.AccDel[3] = self.GetChild("saved_accs_acc4_del")
- self.AccDel[4] = self.GetChild("saved_accs_acc5_del")
- self.AccDel[5] = self.GetChild("saved_accs_acc6_del")
- self.AccName[0] = self.GetChild("saved_accs_acc1")
- self.AccName[1] = self.GetChild("saved_accs_acc2")
- self.AccName[2] = self.GetChild("saved_accs_acc3")
- self.AccName[3] = self.GetChild("saved_accs_acc4")
- self.AccName[4] = self.GetChild("saved_accs_acc5")
- self.AccName[5] = self.GetChild("saved_accs_acc6")
- self.AccSave[0] = self.GetChild("save_acc1")
- self.AccSave[1] = self.GetChild("save_acc2")
- self.AccSave[2] = self.GetChild("save_acc3")
- self.AccSave[3] = self.GetChild("save_acc4")
- self.AccSave[4] = self.GetChild("save_acc5")
- self.AccSave[5] = self.GetChild("save_acc6")
- self.SelectedChannel[0] = self.GetChild("selected_channel1")
- self.SelectedChannel[1] = self.GetChild("selected_channel2")
- self.SelectedChannel[2] = self.GetChild("selected_channel3")
- self.SelectedChannel[3] = self.GetChild("selected_channel4")
- self.SelectedChannel[4] = self.GetChild("selected_channel5")
- self.SelectedChannel[5] = self.GetChild("selected_channel6")
- except:
- import exception
- exception.Abort("LoginWindow.__LoadScript.BindObject")
- for (channelID, channelButtons) in self.channelButton.items():
- channelButtons.SetEvent(ui.__mem_func__(self.SetChannel), channelID)
- self.loginButton.SetEvent(ui.__mem_func__(self.__OnClickLoginButton))
- # self.exitButton.SetEvent(ui.__mem_func__(self.OnPressExitKey))
- self.idEditLine.SetReturnEvent(ui.__mem_func__(self.pwdEditLine.SetFocus))
- self.idEditLine.SetTabEvent(ui.__mem_func__(self.pwdEditLine.SetFocus))
- self.pwdEditLine.SetReturnEvent(ui.__mem_func__(self.__OnClickLoginButton))
- self.pwdEditLine.SetTabEvent(ui.__mem_func__(self.idEditLine.SetFocus))
- self.idEditLine.SetFocus()
- self.AccSave[0].SetEvent(lambda : self.__OnClickLoginSaveButton(0))
- self.AccSave[1].SetEvent(lambda : self.__OnClickLoginSaveButton(1))
- self.AccSave[2].SetEvent(lambda : self.__OnClickLoginSaveButton(2))
- self.AccSave[3].SetEvent(lambda : self.__OnClickLoginSaveButton(3))
- self.AccSave[4].SetEvent(lambda : self.__OnClickLoginSaveButton(4))
- self.AccSave[5].SetEvent(lambda : self.__OnClickLoginSaveButton(5))
- self.AccUse[0].SetEvent(lambda : self.__LoadACCInfos(0))
- self.AccUse[1].SetEvent(lambda : self.__LoadACCInfos(1))
- self.AccUse[2].SetEvent(lambda : self.__LoadACCInfos(2))
- self.AccUse[3].SetEvent(lambda : self.__LoadACCInfos(3))
- self.AccUse[4].SetEvent(lambda : self.__LoadACCInfos(4))
- self.AccUse[5].SetEvent(lambda : self.__LoadACCInfos(5))
- self.AccDel[0].SetEvent(lambda : self.__OnClickDeleteButton(0))
- self.AccDel[1].SetEvent(lambda : self.__OnClickDeleteButton(1))
- self.AccDel[2].SetEvent(lambda : self.__OnClickDeleteButton(2))
- self.AccDel[3].SetEvent(lambda : self.__OnClickDeleteButton(3))
- self.AccDel[4].SetEvent(lambda : self.__OnClickDeleteButton(4))
- self.AccDel[5].SetEvent(lambda : self.__OnClickDeleteButton(5))
- self.InitLanguageBoard()
- def InitLanguageBoard(self):
- self.Y_START = 7
- self.X_SPACE = self.Y_START
- self.WIDTH_FLAG = 36
- self.typeButtonList, groupButtonDict = [], {}
- for i in xrange(len(self.languageList)):
- bLanguage = self.languageList[i]
- groupButtonDict[i] = ui.RadioButton()
- groupButtonDict[i].SetParent(self.loginLanguageBoard)
- groupButtonDict[i].SetPosition(self.X_SPACE, 8)
- groupButtonDict[i].SetUpVisual("d:/ymir work/ui/language_system/login_language/flag_%s_norm.tga" % bLanguage)
- groupButtonDict[i].SetOverVisual("d:/ymir work/ui/language_system/login_language/flag_%s_over.tga" % bLanguage)
- groupButtonDict[i].SetDownVisual("d:/ymir work/ui/language_system/login_language/flag_%s_down.tga" % bLanguage)
- groupButtonDict[i].SAFE_SetEvent(self.OnSelectLanguageButton, bLanguage)
- groupButtonDict[i].Show()
- self.typeButtonList.append(groupButtonDict[i])
- self.X_SPACE += self.WIDTH_FLAG
- self.loginLanguageBoard.SetSize(self.Y_START + (self.WIDTH_FLAG * len(groupButtonDict)) + 4, self.loginLanguageBoard.GetHeight())
- self.ClickRadioButton(self.typeButtonList, self.getLanguageAsIndex(self.getLanguage()))
- def getLanguageAsIndex(self, bLanguage):
- for i in xrange(len(self.languageList)):
- if self.languageList[i] == bLanguage:
- return i
- def getLanguage(self):
- f = open("lang.cfg", "r")
- return f.read()
- def setLanguage(self, language):
- self.language = language
- def ClickRadioButton(self, buttonList, buttonIndex):
- try:
- selButton = buttonList[buttonIndex]
- except IndexError:
- return
- for eachButton in buttonList:
- eachButton.SetUp()
- selButton.Down()
- def OnSelectLanguageButton(self, bLanguage):
- file = open("lang.cfg", "w")
- file.write(bLanguage)
- file.close()
- if bLanguage == "en":
- file = open("locale.cfg", "w")
- file.write("10022 1250 en")
- file.close()
- dbg.LogBox("The client will restart.")
- os.system('start metin2client.exe')
- app.Exit()
- elif bLanguage == "de":
- file = open("locale.cfg", "w")
- file.write("10022 1250 de")
- file.close()
- dbg.LogBox("The client will restart.")
- os.system('start metin2client.exe')
- app.Exit()
- elif bLanguage == "ro":
- file = open("locale.cfg", "w")
- file.write("10022 1250 ro")
- file.close()
- dbg.LogBox("The client will restart.")
- os.system('start metin2client.exe')
- app.Exit()
- elif bLanguage == "pl":
- file = open("locale.cfg", "w")
- file.write("10022 1250 pl")
- file.close()
- dbg.LogBox("The client will restart.")
- os.system('start metin2client.exe')
- app.Exit()
- elif bLanguage == "tr":
- file = open("locale.cfg", "w")
- file.write("10022 1250 tr")
- file.close()
- dbg.LogBox("The client will restart.")
- os.system('start metin2client.exe')
- app.Exit()
- def SetChannel(self, ch):
- for key, button in self.channelButton.items():
- button.SetUp()
- self.channelButton[ch].Down()
- for i in range(6):
- self.SelectedChannel[i].Hide()
- self.SelectedChannel[ch].Show()
- self.stream.SetConnectInfo(SERVER_IP, self.ChannelPort(ch, 0), SERVER_IP, self.ChannelPort("LOGIN"))
- net.SetMarkServer(SERVER_IP, self.ChannelPort("LOGO"))
- app.SetGuildMarkPath("10.tga")
- app.SetGuildSymbolPath("10")
- self.__LoadACCNames()
- net.SetServerInfo(self.ChannelPort(ch, 2))
- def ChannelPort(self, ch, value=0):
- channel = {
- 0 : CH1_PORT,
- 1 : CH2_PORT,
- 2 : CH3_PORT,
- 3 : CH4_PORT,}
- if ch == "LOGIN":
- return PORT_AUTH
- elif ch == "LOGO":
- return channel[0]
- elif value == 2:
- return NUME_SERVER + ", CH%s" % (ch+1)
- else:
- return channel[ch]
- def Connect(self, id, pwd):
- if constInfo.SEQUENCE_PACKET_ENABLE:
- net.SetPacketSequenceMode()
- constInfo.LastAccount = id.lower()
- self.stream.popupWindow.Close()
- self.stream.popupWindow.Open(localeInfo.LOGIN_CONNETING, self.EmptyFunc, localeInfo.UI_CANCEL)
- self.stream.SetLoginInfo(id, pwd)
- self.stream.Connect()
- def PopupDisplayMessage(self, msg):
- self.stream.popupWindow.Close()
- self.stream.popupWindow.Open(msg)
- def PopupNotifyMessage(self, msg, func=0):
- if not func:
- func = self.EmptyFunc
- self.stream.popupWindow.Close()
- self.stream.popupWindow.Open(msg, func, localeInfo.UI_OK)
- def OnPressExitKey(self):
- if self.stream.popupWindow:
- self.stream.popupWindow.Close()
- self.stream.SetPhaseWindow(0)
- return TRUE
- def EmptyFunc(self):
- pass
- def __OnClickLoginButton(self):
- id = self.idEditLine.GetText()
- pwd = self.pwdEditLine.GetText()
- if len(id)==0:
- self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_ID, self.EmptyFunc)
- return
- if len(pwd)==0:
- self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_PASSWORD, self.EmptyFunc)
- return
- self.Connect(id, pwd)
- def __LoadACCInfos(self, accid):
- import linecache
- login = linecache.getline("loginsettings/loginsetting" + str(accid) + ".cfg", 1)
- password = linecache.getline("loginsettings/loginsetting" + str(accid) + ".cfg", 2)
- login = login.replace("\n", "")
- password = password.replace("\n", "")
- if login != "" and password != "":
- self.Connect(login, password)
- else:
- self.PopupNotifyMessage(uiScriptLocale.LOGIN_INTERFACE_NOSAVED_ACC)
- def __LoadACCNames(self):
- for i in range(6):
- fd = open( "loginsettings/loginsetting" + str(i) + ".cfg" )
- self.Login[i] = fd.readline()
- self.Login[i].replace( "\n", "" )
- fd.close()
- if self.Login[i] != "":
- self.AccName[i].SetText(str(self.Login[i]))
- self.AccUse[i].Show()
- self.AccDel[i].Show()
- self.AccSave[i].Hide()
- else:
- self.AccName[i].SetText(uiScriptLocale.LOGIN_INTERFACE_FREE_SPACE)
- self.AccSave[i].Show()
- self.AccUse[i].Hide()
- self.AccDel[i].Hide()
- def __OnClickLoginSaveButton(self, id):
- user = self.idEditLine.GetText()
- pwd = self.pwdEditLine.GetText()
- fd = open("loginsettings/loginsetting" + str(id) + ".cfg")
- self.Login[id] = fd.readline()
- self.Login[id].replace( "\n", "" )
- fd.close()
- if user == "":
- self.PopupNotifyMessage(uiScriptLocale.LOGIN_INTERFACE_PASTE_ID)
- return
- if pwd == "":
- self.PopupNotifyMessage(uiScriptLocale.LOGIN_INTERFACE_PASTE_PW)
- return
- f = open("loginsettings/loginsetting" + str(id) + ".cfg", "r+")
- f.write (user +"\n")
- f.write (pwd)
- f.close()
- self.PopupNotifyMessage(uiScriptLocale.LOGIN_INTERFACE_SAVED)
- self.__LoadACCNames()
- def __OnClickDeleteButton(self, id):
- f = open("loginsettings/loginsetting" + str(id) + ".cfg", "r+")
- check = f.readline()
- if check != "":
- f.truncate(0)
- f.close()
- self.__LoadACCNames()
- self.PopupNotifyMessage("Slot " + str(id+1) + " " + uiScriptLocale.LOGIN_INTERFACE_DELETED)
- else:
- self.PopupNotifyMessage("Slot " + str(id+1) + " " + uiScriptLocale.LOGIN_INTERFACE_ALREADY_EMPTY)
-
Hallo Leute,
ich will wieder einsteigen, habe aber lange nichts mehr gemacht und würde erstmal mit kleinen Sachen anfangen.Meine Hauptkompetenzen liegen beim Questen und Client-editing, Nebenbei lerne ich noch JS, C++.
Wer Referenzen sehen will, siehe epvp Bitte melden Sie sich an, um diesen Link zu sehen. und Bitte melden Sie sich an, um diesen Link zu sehen.. -
Laut deiner Meinung: In der Zeit wo ich diesen Thread erstellt habe, hätte ich schon mein Projekt realisiert und veröffentlicht.
-> Bin seit vor diesen Thread schon dabei
Ich Denke es gibt Erfahrungen die manche schon gemacht haben und bestimmt gibt es hilfreiche Tut's zur Analyse und Verständnis des Sources von Metin2
-
Metin2 bietet eine gute Community, hoffe nur das sie über die Jahre nicht zu sehr geschrumpft ist.
Ich hatte vor, meine Idee an den Source zu adaptieren und schritt für schritt zu lernen, somit würde ich beides gleichzeitig lernen.
Weiß aber nicht ob das mit dem Code sehr sinnvoll wäre -
Grüße euch zusammen
Ich selbst hab damals Programmieren (Lua, Python) durch Metin2 gelernt => Noa_ oder ©by Noa in epvp.
Als es mit dem Source raus kam, war ich nicht mehr aktiv und jeder hatte mit C++ angefangen.
Ich will sowas wie eine Cross-Platform "Skin" System basten und muss da in den Metin2 Source verstehen und programmieren.
Durch Lua/ Python weiß ich das der Metin2 Code, nicht ganz sauber und gut ist aber weiß überhaupt nicht wie es im Source aussieht.
Ist es ratsam durch den Source zu lernen?
Wie habt ihr das gelernt und was könntet ihr mir empfehlen? -
Ich stelle mir sowas vor(weil ich es kurz gelesen habe) wie Paysave oder Amazon Gutscheine in Euro wieder umwandeln.
Oder als Spieler, zu wenig Content oder ausgelutschte Systeme etc.
Ist das noch aktuelle Probleme oder eher die Ausnahme?
Das größte Problem welches du zum aktuellen Zeitpunkt als Betreiber eines Servers hast, ist, dass all deine Qualiy of Life Änderungen an den 'Standard' eines Aeldra's kommen muss. Natürlich, der Standard eines Aeldra's ist gut aber bei weitem nicht perfekt und auch kein Beispiel an welches man sich anlehnen sollte. Inspiration ist gut, Nachahmung geht den Bach unter.
Umcashen kannst du das ganze nie zu 100% ohne Sicherheitsbedenken das liegt einfach in der Natur der Sache, denn surprise surprise ein Metin2 P-Server ist etwas illegales. Genau so wird dich das Finanzamt also fragen woher diese Gelder stammen, Ausreden bringen da gar nichts denn sie bohren so lange bis du dich versprichst und du wirst dich versprechen & einknicken. Ganz egal wie hart auf Gangster der ein oder andere macht.Generell sollte man ja als Serverbetreiber schauen, das man sich von der Masse abhebt und die Spieler entscheiden am ende was das beste Konzept ist.
Theoretisch kann man als 3te Partie als Firma auftreten, die Aufträge bekommen um Gutscheine einzulösen, indem man die Gutscheine auf s/einer Webseite verkauft und gegen einen Aufpreis das Geld an den gläubiger auszahlt.
Du kannst als Serverinhaber ein bestimmten Betrag im Jahr/Monat verdienen ohne Gewerbe anzumelden aber als Finanzdienstleister nimmst du ja nur die Aufträge an und kannst es normal verrechnen. -
Das größte Problem ist eigentlich, dass wir keinen Standard haben in Metin2, auf den wir uns alle geeinigt haben. Es ist super schwer Tools zur Verfügung zu stellen, die unnötige Arbeit abstrahieren, da jede Source, jedes System je nach Autor seine Eigenheiten hat.
Hätten wir in der Community einen absoluten Standard, wäre viele Probleme gar nicht erst vorhanden.
Es bräuchte ja nur jmd. mit einer super Idee als erster anzufangen und bei jedem Update sich an die Normung halten.
-
Ich stelle mir sowas vor(weil ich es kurz gelesen habe) wie Paysave oder Amazon Gutscheine in Euro wieder umwandeln.
Oder als Spieler, zu wenig Content oder ausgelutschte Systeme etc.
Ist das noch aktuelle Probleme oder eher die Ausnahme?
-
Es soll ein neues Kostümsystem werden.
Im Hauptverzeichnis wird einen neuen Ordner mit dem Namen "Costumes" erstellt.Die Daten enthalten sämtliche visuelle Items (3d Modelle).
Im Spielclient kann man durch eine Gui alle Kostüme aus- und anziehen die man Besitzt ( nicht durch das Inventar!! ), diese werden einfach in einer Tabelle eingetragen.Man kann den selben Skin im Account nur einmal pro Charakter anziehen, dh. erst beim Krieger ausziehen, damit man es beim Sura anziehen kann.
Schreibt mir einfach bei Discord oder hier an und schickt mir einen Kostenvoranschlag.
-
Was man aber sagen muss, ist, dass De immer den P-Servern in einer Sache voraus ist und das ist die Beständigkeit. Kein P-Server kann dir jahrelange Sicherheit gewährleisten, De hingegen schon.
Das einzige was De den P-Servern voraus hat, ist die Lizenz an Metin2, damit können sie meistens rechtlich vorgehen. -> wenn es das jeweilige Land überhaupt juckt.
-
Du meinst, dass Metin2 weißt wie man seine Kuh richtig melkt. Ich bin zwar nicht im Team aber man muss einen Weitblick für die Entwicklung haben. Was für heute Op ist und 1 Hit versursacht, kann im nächsten Update trash sein. So könnte man es Skalieren.
Was das Botten angeht: Als Entwickler würde es mich stören, wenn die Botter die überhand gewinnen und sie keinen Spielraum für normale Spieler bieten. Das ist für mich ein destruktives Konzept.
Metin2 hat auch noch nicht sein ganzes Potenzial ausgeschöpft da es ein online Spiel ist. Das beste Beispiel ist die Community im Privatbereich, was für Ideen hier zum teil umgesetzt werdenZum botten: Sehe ich auch so, aber scheint ja zu funktionieren. Metin2 Spieler ignorieren Botter einfach und haben es oft einfacher, weil Items die gebottet wurden oft Ingame billiger angeboten werden. Somit ist es immer noch viel Yang für den Botter, weil er so gut wie unendlich Resourcen hat und gleichzeitig hat der Spieler einen super Preis erwischt, um seine Erfolgschancen zu erhöhen. Ich habe das Gefühl, dass Metin2 in eine gute Geldspirale gelangen ist, die auch für die nächsten Jahre noch wunderbar funktionieren wird.
Findest du die Ideen im Privatbereich wirklich passend zu Metin2? Gerade diese Ideen lassen alle Server generisch aussehen und wie ein Spiel was man ersetzen kann, weil es zu voll mit Kram ist den keiner unbedingt braucht. Ich sehe ziemlich selten Systeme, welche gut eingebunden sind.
So wie ich es verstanden habe, übernehmen die Botter sämtliche Bereiche ein im Spiel von low to end Zeugs aus dem Itemshop.
Die Spieler haben beim Farmen keine Chance und kaufen sich direkt Yang und damit Equipment oder uppzeugs, die billig von den Bots gefarmt werden.Also profitiert Metin2 ausschließlich von den Bots und die Spielerhaben kein bedarf am Itemshop - >Geht die Geldspirale nicht nach unten?
Ich finde die meisten Ideen im Privatbereich passen nicht zu Metin2, trotzdem finde ich es interessant zu was die Community imstande ist wenn Ressourcen auf Ideen zusammen treffen. Man müsste nur sinnvollere Sachen entwickeln. -
Seit wann sind alle Billgates die privat was Investieren?
Sind nur Gedanken die ich mit euch teilen wollte und dachte ihr wisst mehr darüber.Mich würde es nicht wundern wenn die Privatszene mehr Umsatz macht als Official
Metin2 wäre schon längst nicht mehr ein Spiel, wenn der Umsatz nicht mehrere Millionen beträgt. Metin2 ist eine Geldmaschine und die beherrschen es hundert mal besser als diese Szene.
Interessante Theorie (aber vielleicht weitgegriffen):
Ich erwähne hier einfach mal deren Anti-Cheat oder wie die es auch nennen. Ich denke, Metin2 weiß genau das deren Anti-Cheat schlecht ist. Ich glaube aber auch, dass die es mit Absicht machen. Wenn ein Spieler mit Botten Geld verdient, ist es auch profitabel für Metin2. Damit ein Botter nämlich peak Performance erreicht, muss er in den Itemshop cashen und das oft mit 10 - 20 Accounts (auch 30 - 50 Accounts sind für einen Botter nicht so viel Aufwand aufzustellen). Das Geld hat er von älteren Botting-Sessions, in denen er das verdiente Yang oder die Items für Echtgeld verkauft. Lässt also Metin2 den Spieler langgenug entbannt, damit der Spieler Profit mit den Accounts macht, kommen die Botter auch wieder und so geht es immer und immer weiter.
Leider ist Metin2 wirklich gut. Ich weiß, unpopular Opinion, aber im Kern ist Metin2 ein verdammt gutes Spiel und hat einen großen Suchtfaktor. Besonders die Erfolgsgefühle die man auch ohne cashen haben kann (Drachensteinalchemie, Bonis, Uppen usw.) sind enorm. Die neusten Systeme sind absoluter Schwachsinn und offensichtliche Geldmachmethoden, aber Metin2 ist sehr gut spielbar, wenn man sich nicht versucht ständig mit anderen zu stämmen.
Du meinst, dass Metin2 weißt wie man seine Kuh richtig melkt. Ich bin zwar nicht im Team aber man muss einen Weitblick für die Entwicklung haben. Was für heute Op ist und 1 Hit versursacht, kann im nächsten Update trash sein. So könnte man es Skalieren.
Was das Botten angeht: Als Entwickler würde es mich stören, wenn die Botter die überhand gewinnen und sie keinen Spielraum für normale Spieler bieten. Das ist für mich ein destruktives Konzept.
Metin2 hat auch noch nicht sein ganzes Potenzial ausgeschöpft da es ein online Spiel ist. Das beste Beispiel ist die Community im Privatbereich, was für Ideen hier zum teil umgesetzt werden -
Biste Billgates aus der Metinszene oder hab ich was verpasst. Ich meine wen juckt es hier in diesem Forum was DE treibt
Seit wann sind alle Billgates die privat was Investieren?
Sind nur Gedanken die ich mit euch teilen wollte und dachte ihr wisst mehr darüber.Kommt vielleicht in Off-Topic rein, aber ja. Official ist ein Witz.
Mich würde es nicht wundern wenn die Privatszene mehr Umsatz macht als Official
-
Ja, für künftige Investoren oder Partnerschaften
-
Hab mir das Video hier angeschaut Bitte melden Sie sich an, um diesen Link zu sehen., das sieht für mich so aus als hätten der Publisher aus Gier Metin2 unspielbar gemacht.