[Release]Get the skilltree

01/04/2013 10:14 .BaumKuchen#1
Vorab:
Das ganze ist lediglich für Developer bzw. jmd zu gebrauchen, die selber gerne Metin2 bezüglich etwas programmieren wollen.
Deswegen stelle ich hier auch direkt das Script zur Verfügung und mache kein allzu großes Tutorial dafür.
Nebenbei gemerkt arbeite ich an einem weiteren Tutorial bzw. der Fortsetzung von meinem 1. Tutorial.
Das ganze wird etwas länger und ausführlicher, aber auch wesentlich interessanter.

Hier erst einmal das Script, welches gut kommentiert ist, sodass es jeder verstehen sollte:
PHP Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import app

def getSkillTree
():
    
#initialize empty skillDict
    
skillDict = {}

    try:
        
#get handle and linecount of the file
        
handle = app.OpenTextFile(app.GetLocalePath() + "/skilldesc.txt")
        
count = app.GetTextFileLineCount(handle)
    
except (IOError):
        
#handle IO Exception and print it
        
_print("Could not load " + app.GetLocalePath() + "/skilldesc.txt")
    
    for 
line in xrange(count):
        
#get the current line of the file
        
line = app.GetTextFileLine(handle, line)
        
#handle the case of empty/incorrect lines
        
if not str(line).count("\t") >= 21:
            continue
        
        
#split the line up and get the requested informations
        
skillData = str(line).split("\t")
        
skillIndex = int(skillData[0])
        
skillCharacterClass = skillData[1]
        
skillName = skillData[2]
        
skillIconName = skillData[12]
        
        
#fill up the dict with the differenct character classes
        
if not skillCharacterClass in skillDict:
            
skillDict[skillCharacterClass] = {}
        
        
#fill up the different skill indices(handling the case for new skills)
        
if not skillIndex in skillDict[skillCharacterClass]:
            
skillDict[skillCharacterClass][skillIndex] = {}
        
        
#complete the actual skill information in our skillDict
        
skillDict[skillCharacterClass][skillIndex] = {
            
"NAME" : skillName,
            
"ICON" : "d:/ymir work/ui/skill/%s/%s.sub" % (skillCharacterClass.lower(), skillIconName),
            }
            
    
#return the created skillDict
    
return(skillDict) 
Beispielausgabe:
PHP Code:
{
    
'SHAMAN': {
        
106: {'NAME': 'Blitzwurf', 'ICON': 'd:/ymir work/ui/skill/shaman/noejeon.sub'},
        
107: {'NAME': 'Blitz heraufbeschwören', 'ICON': 'd:/ymir work/ui/skill/shaman/byeorak.sub'},
        
108: {'NAME': 'Blitzkralle', 'ICON': 'd:/ymir work/ui/skill/shaman/pokroe.sub'},
        
109: {'NAME': 'Kurieren', 'ICON': 'd:/ymir work/ui/skill/shaman/jeongeop.sub'},
        
110: {'NAME': 'Schnelligkeit', 'ICON': 'd:/ymir work/ui/skill/shaman/kwaesok.sub'},
        
111: {'NAME': 'Angriff+', 'ICON': 'd:/ymir work/ui/skill/shaman/jeungryeok.sub'},
        
91: {'NAME': 'Fliegender Talisman', 'ICON': 'd:/ymir work/ui/skill/shaman/bipabu.sub'},
        
92: {'NAME': 'Drachenschießen', 'ICON': 'd:/ymir work/ui/skill/shaman/yongpa.sub'},
        
93: {'NAME': 'Drachengebrüll', 'ICON': 'd:/ymir work/ui/skill/shaman/paeryong.sub'},
        
94: {'NAME': 'Segen', 'ICON': 'd:/ymir work/ui/skill/shaman/hosin.sub'},
        
95: {'NAME': 'Reflektieren', 'ICON': 'd:/ymir work/ui/skill/shaman/boho.sub'}
        
96: {'NAME': 'Hilfe des Drachen', 'ICON': 'd:/ymir work/ui/skill/shaman/gicheon.sub'},
    },
    
'WARRIOR': {
        
1: {'NAME': 'Dreiwege-Schnitt', 'ICON': 'd:/ymir work/ui/skill/warrior/samyeon.sub'},
        
2: {'NAME': 'Schwertwirbel', 'ICON': 'd:/ymir work/ui/skill/warrior/palbang.sub'},
        
3: {'NAME': 'Kampfrausch', 'ICON': 'd:/ymir work/ui/skill/warrior/jeongwi.sub'},
        
4: {'NAME': 'Aura des Schwerts', 'ICON': 'd:/ymir work/ui/skill/warrior/geomgyeong.sub'},
        
5: {'NAME': 'Sausen', 'ICON': 'd:/ymir work/ui/skill/warrior/tanhwan.sub'},
        
6: {'NAME': 'Zerschneiden', 'ICON': 'd:/ymir work/ui/skill/warrior/gihyeol.sub'},
        
16: {'NAME': 'Durchschlag', 'ICON': 'd:/ymir work/ui/skill/warrior/gigongcham.sub'},
        
17: {'NAME': 'Heftiges Schlagen', 'ICON': 'd:/ymir work/ui/skill/warrior/gyeoksan.sub'},
        
18: {'NAME': 'Stampfer', 'ICON': 'd:/ymir work/ui/skill/warrior/daejin.sub'},
        
19: {'NAME': 'Starker Körper', 'ICON': 'd:/ymir work/ui/skill/warrior/cheongeun.sub'},
        
20: {'NAME': 'Schwertschlag', 'ICON': 'd:/ymir work/ui/skill/warrior/geompung.sub'},
        
21: {'NAME': 'Blitzschlag', 'ICON': 'd:/ymir work/ui/skill/warrior/noegeom.sub'}
    },
    
'SUPPORT': {
        
121: {'NAME': 'Führung', 'ICON': 'd:/ymir work/ui/skill/support/tongsol.sub'},
        
122: {'NAME': 'Combo', 'ICON': 'd:/ymir work/ui/skill/support/combo.sub'},
        
123: {'NAME': 'Angeln', 'ICON': 'd:/ymir work/ui/skill/support/fishing.sub'},
        
124: {'NAME': 'Bergbau', 'ICON': 'd:/ymir work/ui/skill/support/mining.sub'},
        
141: {'NAME': 'HP', 'ICON': 'd:/ymir work/ui/skill/support/jeunghyul.sub'},
        
142: {'NAME': '\xb0\xfc\xc5\xeb\xc8\xb8\xc7\xc7', 'ICON': 'd:/ymir work/ui/skill/support/chultong.sub'}
    },
    
'ASSASSIN': {
        
32: {'NAME': 'Blitzangriff', 'ICON': 'd:/ymir work/ui/skill/assassin/gungsin.sub'},
        
33: {'NAME': 'Degenwirbel', 'ICON': 'd:/ymir work/ui/skill/assassin/charyun.sub'},
        
34: {'NAME': 'Tarnung', 'ICON': 'd:/ymir work/ui/skill/assassin/eunhyeong.sub'},
        
35: {'NAME': 'Giftwolke', 'ICON': 'd:/ymir work/ui/skill/assassin/sangong.sub'},
        
36: {'NAME': 'Angriffssprung', 'ICON': 'd:/ymir work/ui/skill/assassin/seomjeon.sub'},
        
46: {'NAME': 'Wiederholter Schuss', 'ICON': 'd:/ymir work/ui/skill/assassin/yeonsa.sub'},
        
47: {'NAME': 'Pfeilregen', 'ICON': 'd:/ymir work/ui/skill/assassin/gwangyeok.sub'},
        
48: {'NAME': 'Feuerpfeil', 'ICON': 'd:/ymir work/ui/skill/assassin/hwajo.sub'},
        
49: {'NAME': 'Federschreiten', 'ICON': 'd:/ymir work/ui/skill/assassin/gyeonggong.sub'},
        
50: {'NAME': 'Giftpfeil', 'ICON': 'd:/ymir work/ui/skill/assassin/gigung.sub'},
        
51: {'NAME': 'Wutausbruch', 'ICON': 'd:/ymir work/ui/skill/assassin/seomgwang.sub'},
        
31: {'NAME': 'Hinterhalt', 'ICON': 'd:/ymir work/ui/skill/assassin/amseup.sub'}
    },
    
'SURA': {
        
64: {'NAME': 'Furcht', 'ICON': 'd:/ymir work/ui/skill/sura/gongpo.sub'},
        
65: {'NAME': 'Verzauberte Rüstung', 'ICON': 'd:/ymir work/ui/skill/sura/jumagap.sub'},
        
66: {'NAME': 'Zauber aufheben', 'ICON': 'd:/ymir work/ui/skill/sura/pabeop.sub'},
        
76: {'NAME': 'Dunkler Schlag', 'ICON': 'd:/ymir work/ui/skill/sura/maryeong.sub'},
        
77: {'NAME': 'Flammenschlag', 'ICON': 'd:/ymir work/ui/skill/sura/hwayeom.sub'},
        
78: {'NAME': 'Geist der Flamme', 'ICON': 'd:/ymir work/ui/skill/sura/muyeong.sub'},
        
79: {'NAME': 'Dunkler Schutz', 'ICON': 'd:/ymir work/ui/skill/sura/heuksin.sub'},
        
80: {'NAME': 'Geisterschlag', 'ICON': 'd:/ymir work/ui/skill/sura/tusok.sub'},
        
81: {'NAME': 'Dunkler Stein', 'ICON': 'd:/ymir work/ui/skill/sura/geomhwan.sub'},
        
61: {'NAME': 'Fingerschlag', 'ICON': 'd:/ymir work/ui/skill/sura/swaeryeong.sub'},
        
62: {'NAME': 'Drachenwirbel', 'ICON': 'd:/ymir work/ui/skill/sura/yonggwon.sub'},
        
63: {'NAME': 'Verzauberte Klinge', 'ICON': 'd:/ymir work/ui/skill/sura/gwigeom.sub'}
    }
} 
Anwendungsmöglichkeiten:
Das ganze erleichtert die Orientierung vom Skillcount und Skillindex, welche zumindest für "Scripter" einen großen Unterschied darstellen.
Auch habe ich dieses Script genutzt um alle graphischen Oberflächen meines Bots Skillicon betreffend darzustellen.

Des Weiteren kündige ich hiermit einen bald herauskommenden Bot von HeavyHacker, Crank und mir an, welcher m2bob ersetzen soll sobald dieser kostenpflichtig sind.
Enthält weiterhin alle nötigen Funktionen wie Itemsteal, Rangepickup,... die essentiellen Funktionen sind soweit auch alle enthalten, aber auch hier wird es eine Premium Version geben welche z.B. einen Packet Editor/Monitor,... enthält.
Der Bot wird nicht nur auf den offiziellen Servern laufen und das hackshield bypassen sondern auch auf Pservern und braucht selten/keine Updates.
Das ganze wird als Werbeaktion für HeavyHackers kommenden Clientless Bot veranstaltet und wird von meinem Teil aus später als kompletter Open Source Bot released, was Crank und Heavy mit ihrem Part machen ist ihre Entscheidung.

Einen schönen Morgen noch
01/04/2013 10:28 Shaiine™#2
Danke BaumKuchen du schmeckst wie frisch aus dem Ofen :) Tolles Script. Weiter so :)

MfG

Shaiine™
01/04/2013 10:39 .MaisKolben™#3
Sehr nice!
Da ich mich Momentan im Python Bereich bewege, ist das ordentliches Material zum lernen :).
Und was deine "Schleichwerbung" angeht -> Hört sich interessant an.

MfG
01/04/2013 13:33 .Colossus.#4
supi....freue mich schon auf die source ;)
01/04/2013 13:42 [uLow]Beni#5
Sehe den Sinn darin nicht ganz, aber wers braucht.
Zur Werbung:
Das ende von Metin2 ist nahe O.o

Freue mich schon *.*
Freue mich auch schon auf den OpenSource Teil von dir und mal schauen wie ein echter python-profi so einen Bot entwickelt.
01/04/2013 15:49 xCPx#6
Hübsch.
Aber gehört für mich fast in kleinere Releases, da es sogesehen simple textdateiverarbeitung ist.