2. Hamachi einrichten
3. Erklärung aller .txt dateien im Germany ordner
4. Erklärung des Mapordners, mops spawn, etc.
5. Erklärung des Quests Ordners
6. Erklärung der einzelnen Cores
7. Config Erklärung
8. Die Gamefile
9. Der Source
10. Logs, Syserrs und bekannte Fehler
11. Neuerungen nach der 2089 Gamefile
12. Befehle
13. Videos
14 Schlusswort
Vorwort
Ich erstelle diesen Thread, da immer wieder die gleichen Fragen gestellt werden.
Er soll die wichtigsten Fragen beantworten und neuen Usern helfen. Wer den Thread unnötig findet, soll ihn verlassen.
Er soll die wichtigsten Fragen beantworten und neuen Usern helfen. Wer den Thread unnötig findet, soll ihn verlassen.
Hamachi einrichten
Ihr braucht:
1x Virtual Box:
1x Serverfiles:
, sucht euch welche aus.
1x Filezilla:
1x Navicat:
1x Hamachi:
VirtualBox einrichten:
neu > weiter > name eingeben > Betriebsystem = Freebsd > weiter > ram zuweisen, minimum 700mb > weiter > Festplatte benutzten, .vdi der files auswählen > erzeugen > Rechtsklick > ändern > Netzwerk > Adapter1 > Angeschlossen an > Netzwerkbrücke > Hamachi Network Interface > OK > Starten > einlogen mit root PW, je nach Files unterschiedlich > sysinstall (bei neueren FreeBSD Versionen bsdinstall) > Configure > Networking > Interfaces > nein > nein > host lassen > domain lassen > IPv4 eure Hamachi ip > Name Server lassen > Ipv4 Adress Hamachip mit 100 am ende > Netmask 255.0.0.0 > OK > Yes > Cancel > Exit Install > reboot > fertig, nun ist Hamachi eingerichtet.
1x Virtual Box:
1x Serverfiles:
, sucht euch welche aus.
1x Filezilla:
1x Navicat:
1x Hamachi:
VirtualBox einrichten:
neu > weiter > name eingeben > Betriebsystem = Freebsd > weiter > ram zuweisen, minimum 700mb > weiter > Festplatte benutzten, .vdi der files auswählen > erzeugen > Rechtsklick > ändern > Netzwerk > Adapter1 > Angeschlossen an > Netzwerkbrücke > Hamachi Network Interface > OK > Starten > einlogen mit root PW, je nach Files unterschiedlich > sysinstall (bei neueren FreeBSD Versionen bsdinstall) > Configure > Networking > Interfaces > nein > nein > host lassen > domain lassen > IPv4 eure Hamachi ip > Name Server lassen > Ipv4 Adress Hamachip mit 100 am ende > Netmask 255.0.0.0 > OK > Yes > Cancel > Exit Install > reboot > fertig, nun ist Hamachi eingerichtet.
Die normale Metin2.exe oder Metin2Client.exe ist für localhosts gedacht, das heisst wenn du einen Hamachi-server hast kannst nur du damit connecten, als localhost = du, man braucht keine Surakopf.exe. Desweiteren wird sie für Rootserver als starter verwendet.
Die Surakopf.exe ist ein Starter, der das spielen auf einem Hamachi-server von aussen ermöglicht, sprich ich spiele mit meinem Client auf einem Server meines Kumpels, somit komme ich von aussen ins Spiel, was wiederum heisst Ports werden gebraucht und ich muss im Hamachinetzwerk meines Kumpels sein.
Was sind Portmaps ? Portmaps sind dazu da, um die Verbindung von aussen zu den jeweiligen Cores Datenbanken (3306,80,22) freizuschalten, damit von aussen nach innen Datenpackete versendet werden können. Wer auch immer sagte, dass Port xxxx für bspw. die Wüste ist liegt falsch, Ports sind nie für eine Map da, der Port 1102 bspw. ist für den Authserver, zuständig und das ist keine Map. Port 13000 wiederum ist dazu da um auf den Channel1(Standarmässig) connecten zu können btw. alle Maps die darauf laufen. Bei einer Core-verteilung müssen je nach dem auch neue Ports hinzgefügt werden. So viel mal zum Thema Portmap. (die genannten Ports beziehen sich auf die Standart Ports der 2010er Files)
Nun kommen wir zu der serverinfo.py, in dieser Datei wird festgelegt auf welche IP-Adresse und durch welche Ports der Client connectet beim starten. Es gibt verschiedene serverinfo.py's die wohl bekannteste für Roots und localhosts ist diese:
Mit dieser kann bei Hamachi-servern nur der localhost connecten. Was hier noch wichtig ist, die ip muss eine 100 am Schluss haben.
Dann haben wir noch die serverinfo.py für die Surakopf.exe diese sieht wie folgt aus:
Nun was stellen wir fest ? Die serverinfo.py der Surakopf.exe greifft auf die serverip.cfg und servername.cfg zu.
Folglich werden im Client auch diese 2 Dateien benötigt, natürlich mit der Hamachi-ip und dem Servername.
Die Surakopf.exe ist ein Starter, der das spielen auf einem Hamachi-server von aussen ermöglicht, sprich ich spiele mit meinem Client auf einem Server meines Kumpels, somit komme ich von aussen ins Spiel, was wiederum heisst Ports werden gebraucht und ich muss im Hamachinetzwerk meines Kumpels sein.
Was sind Portmaps ? Portmaps sind dazu da, um die Verbindung von aussen zu den jeweiligen Cores Datenbanken (3306,80,22) freizuschalten, damit von aussen nach innen Datenpackete versendet werden können. Wer auch immer sagte, dass Port xxxx für bspw. die Wüste ist liegt falsch, Ports sind nie für eine Map da, der Port 1102 bspw. ist für den Authserver, zuständig und das ist keine Map. Port 13000 wiederum ist dazu da um auf den Channel1(Standarmässig) connecten zu können btw. alle Maps die darauf laufen. Bei einer Core-verteilung müssen je nach dem auch neue Ports hinzgefügt werden. So viel mal zum Thema Portmap. (die genannten Ports beziehen sich auf die Standart Ports der 2010er Files)
Nun kommen wir zu der serverinfo.py, in dieser Datei wird festgelegt auf welche IP-Adresse und durch welche Ports der Client connectet beim starten. Es gibt verschiedene serverinfo.py's die wohl bekannteste für Roots und localhosts ist diese:
PHP Code:
import os
import app
import locale
import debugInfo
CHINA_PORT = 50000
##IP = "xx.xx.xx.xxx"
##CH1PORT = 13000
##AUTHPORT = 11002
##SERVERNAME = "Instant 2012"
if locale.IsEUROPE():
STATE_NONE = "..."
STATE_DICT = {
0 : "......",
1 : "normal",
2 : "belebt",
3 : "voll"
}
Lauling = {
1:{"key":11,"name":"CH1","ip":"xx.xx.xx.xxx","tcp_port":13000,"udp_port":13000,"state":STATE_NONE,},
}
REGION_NAME_DICT = {
0 : "GERMANY",
}
REGION_AUTH_SERVER_DICT = {
0 : {
1 : { "ip":"xx.xx.xx.xxx", "port":11020, },
}
}
REGION_DICT = {
0 : {
1 : { "name" :"Wartungsclient", "channel" : Lauling, },
},
}
MARKADDR_DICT = {
10 : { "ip" : "xx.xx.xx.xxx", "tcp_port" : 13000, "mark" : "10.tga", "symbol_path" : "10", },
}
TESTADDR = { "ip" : "xx.xx.xx.xxx", "tcp_port" : 13000, "udp_port" : 13000, }
Dann haben wir noch die serverinfo.py für die Surakopf.exe diese sieht wie folgt aus:
PHP Code:
import os
import app
import locale
import debugInfo
CHINA_PORT = 50000
CH1P = 13000
CH2P = 13002
CH3P = 13003
CH4P = 13004
AUTHP = 11002
IP = open("serverip.cfg", "r").readline()
SERVERNAME = open("servername.cfg", "r").readline()
if locale.IsEUROPE():
STATE_NONE = "..."
STATE_DICT = {
0 : "ist offline",
1 : "NORM",
2 : "BUSY",
3 : "FULL"
}
Server1 = {
1:{"key":11,"name":"CH1","ip":IP,"tcp_port":CH1P,"udp_port":CH1P,"state":STATE_NONE,},
2:{"key":12,"name":"CH2","ip":IP,"tcp_port":CH2P,"udp_port":CH2P,"state":STATE_NONE,},
3:{"key":12,"name":"CH3","ip":IP,"tcp_port":CH3P,"udp_port":CH3P,"state":STATE_NONE,},
4:{"key":12,"name":"CH4","ip":IP,"tcp_port":CH4P,"udp_port":CH4P,"state":STATE_NONE,},
}
REGION_NAME_DICT = {
0 : "GERMANY",
}
REGION_AUTH_SERVER_DICT = {
0 : {
1 : { "ip":IP, "port":AUTHP, },
}
}
REGION_DICT = {
0 : {
1 : { "name" :SERVERNAME, "channel" : Server1, },
},
}
MARKADDR_DICT = {
10 : { "ip" : IP, "tcp_port" : 13000, "mark" : "10.tga", "symbol_path" : "10", },
}
TESTADDR = { "ip" : IP, "tcp_port" : 15000, "udp_port" : 15000, }
PHP Code:
IP = open("serverip.cfg", "r").readline()
SERVERNAME = open("servername.cfg", "r").readline()
if locale.IsEUROPE():
Den germany Ordner findet ihr im Verzeichnis, usr/home/game/share/locale/germany
blend.txt Erklärung:
cube.txt Erklärung:
common_drop_item.txt Erklärung:
drop_item_group
etc_drop_item
fishing.txt
Erklärung der forkedmapindex.txt
Erklärung der group.txt
Erklärung der group_group
Die locale_string:
Die mop_drop_item.txt
Die monkey_dungeon.lua
oxquiz.lua
setting.txt
skill_power.txt
special_item_group.txt
translate.lua
Erklärung des Map Ordners:
blend.txt Erklärung:
Dies ist nur eine copy aus diesem Thread:
Bonus Name die man dort Eintragen könnte
Die kann man aus der Tabelle item_attr und item_attr_rare
Aus der ersten Zeile nehmen.
Achtet auf die Schreibweise.
**Die 5 Zahlen bestimmen den Zufall
***Die 5 Zahlen bestimmen dann den Zufall für die Anhaltsdauer der gewählten erhöhung.
Ein Beispiel dazu von mir
Achtet drauf das ihr es mit Tabs die Leerzeichen macht ansonsten könnten Fehler auftreten.
Für die jenigen die jetzt mit "Kenn ich schon" ankommen... ihr kennt es und jetzt? Was ist mit dem Rest die das noch nicht wussten?
Man beachte das Item muss den Type 27 besitzen und Flag 20
Ich würde es auch dann im Client changen halt die Item_Proto
Hier sind die ganzen Bonusnamen die ich habe.
PHP Code:
#[NAME ist nur für die bessere Verdeutlichung ,aber muss man nicht dazu schreiben]
section
item_vnum [ITEM ID]
apply_type [BONUS NAME]
apply_value [5x Zahlen für die Höhe des Bonus]**
apply_duration [5x Zahlen für die Anhaltsdauer]***
end
Die kann man aus der Tabelle item_attr und item_attr_rare
Aus der ersten Zeile nehmen.
Achtet auf die Schreibweise.
**Die 5 Zahlen bestimmen den Zufall
***Die 5 Zahlen bestimmen dann den Zufall für die Anhaltsdauer der gewählten erhöhung.
Ein Beispiel dazu von mir
PHP Code:
#µµ+9
section
item_vnum 19
apply_type RESIST_SWORD
apply_value 5 10 15 20 25
apply_duration 30 60 120 240 360
end
Für die jenigen die jetzt mit "Kenn ich schon" ankommen... ihr kennt es und jetzt? Was ist mit dem Rest die das noch nicht wussten?
Man beachte das Item muss den Type 27 besitzen und Flag 20
PHP Code:
MAX_HP
MAX_SP
CON
INT
STR
DEX
ATT_SPEED
MOV_SPEED
CAST_SPEED
HP_REGEN
SP_REGEN
POISON_PCT
STUN_PCT
SLOW_PCT
CRITICAL_PCT
PENETRATE_PCT
ATTBONUS_HUMAN
ATTBONUS_ANIMAL
ATTBONUS_ORC
ATTBONUS_MILGYO
ATTBONUS_UNDEAD
ATTBONUS_DEVIL
STEAL_HP
STEAL_SP
MANA_BURN_PCT
BLOCK
DODGE
RESIST_SWORD
RESIST_TWOHAND
RESIST_DAGGER
RESIST_BELL
RESIST_FAN
RESIST_BOW
RESIST_FIRE
RESIST_ELEC
RESIST_MAGIC
Hier sind die ganzen Bonusnamen die ich habe.
Ich mach es kurz und fang direkt damit an.
*Anmerkung was dies ist. Jedoch nicht nötig
**Item ID die man benötigt, danach ein Tab und die Anzahl die man benötigt
***Item ID die man erhält, danach ein Tab und die Anzahl die man erhält
Erstmal dazu ein Beispiel
die Cube bzw. den Umtausch der Items benötigt man dieses Inventar von der Kräuter Sache.
Hier mal eine Quest die man benutzen kann für ein NPC um halt dieses Kräuter Inventar zu öffnen.
PHP Code:
#Name*
section
npc NPC ID
item ITEM ID Anzahl**
reward Item ID Anzahl***
percent PROZENT ZAHL
end
**Item ID die man benötigt, danach ein Tab und die Anzahl die man benötigt
***Item ID die man erhält, danach ein Tab und die Anzahl die man erhält
Erstmal dazu ein Beispiel
PHP Code:
#Giftschwert
section
npc 9012
item 189 1
reward 279 1
percent 50
end
Hier mal eine Quest die man benutzen kann für ein NPC um halt dieses Kräuter Inventar zu öffnen.
PHP Code:
quest Cube begin
state start begin
when EUER NPC CODE.chat."Information" begin
say("Guten Tag Sir")
say("TEXT?")
say("")
wait()
setskin(NOWINDOW)
command("cube open")
end
end
end
Diese Datei ist für den alternativ Drop zuständig.
Siehe bei Erklärung der mop_drop_item.txt
Siehe bei Erklärung der mop_drop_item.txt
Diese Datei bestimmt was eine Mopgruppe dropt.
Beispiel:
Beispiel:
PHP Code:
Group Àü¿î¼®
{
Type [TAB] drop
[TAB] mob [TAB] 255
[TAB] 1 [TAB] 50199 2x[TAB] 1 [TAB] 10
}
Hier werden die Uppitems eingetragen, kann man aber auch in der mop_drop_item.txt festlegen.
In dieser Datei wird festgelegt, was die Fischen beim öffnen droppen.
Hier werden die Startpositionen der Standartmaps eingetragen.
Hier wird definiert, welche Mops aus einem Metinstein respawnen.
Beispiel:
Beispiel:
PHP Code:
Group MetinderUntoten
{
Vnum 9530
Leader zombie kid 2501
1 zombie dog 2502
2 zombie infactor 2503
}
Group MetinderUntoten2
{
Vnum 9531
Leader zombie dog 2502
1 zombie kid 2501
2 zombie infactor 2503
}
Hier könnt ihr eine Mopgruppe erstellen, welche ihr dann in einer map respawnen lassen könnt.
Beispiel:
Beispiel:
PHP Code:
Group a1_01
{
Vnum 101
1 101 1
2 171 1
}
Hier werden die Übersetzungen vom Koreanisch ins Deutsche festgelegt, Texte, welche aufgerufen werden, wenn man zbsp. ein Duell gegen Jemand macht.
PHP Code:
"%s ´ÔÀÌ ´ë·Ã¿¡¼* ½Â¸®ÇÏ¿´½À´Ï´Ù.";
"%s hat das Duell gewonnen.";
Hier werden die normalen Drops der Mops festgelegt, eine auführliche Erklärung findet ihr hier:
Ich bin mit nicht ganz sicher, denke aber dass hier die verschiedenen warps der Affendungeons festgelgt werden.
Hier werden die Fragen & Antworten des OX festgelegt.
In dieser Datei werden 2 dinge festgelegt, #1 die /go Befehle, man kann beliebig neue hinzfügen und #2 Die Musik auf die der Client beim porten auf eine Maps abgespielt werden soll.
Hier werden die Werte der Skills definiert.
Hier ein How to wie man zbsp. den Schaden vom Schwertwirbel erhöht.
Hier ein How to wie man zbsp. den Schaden vom Schwertwirbel erhöht.
hier wird definiert, was herauskommt, wenn man eine Truhe öffnet.
Beispiel:
Beispiel:
PHP Code:
Group Blauer_Tod
{
Vnum 50125
1 27991 1 20 -- Wasserstein
2 27994 1 30 -- rote perle
3 27993 1 40 -- blaue perle
4 206 1 10 -- Schnitti
6 266 1 10 -- baroni
7 3176 1 10 -- Gelbdrachentöter
8 276 1 10 -- Siri
9 4046 1 10 -- seeli
10 5136 1 10 -- schnitti
11 7196 1 10 -- dämonenfächer
12 2166 1 10 -- grossteufelbogen
}
Hier sind auch OX fragen eingetragen, jedoch auf englisch, aber was der Sinn dieser Datei ist weiss ich auch nicht
Erklärung des Map Ordners:
dieser Ordner befindet sich in diesem Pfad:
/usr/home/game/share/locale/germany/map
Hier befinden sich alle Maps.
in der Indexdatei wird der map Index bestimmt, dieser Index wiederum wird dann in der Config eines Cores eingetragen, damit die map auch geladen wird.
In einem Mapordner finden wir folgende Dateien:
Boss.txt > hier wird definiert welche Bossmops wo respawen
npc.txt > hier wird definiert, wo zbsp die Gemi respawnt
regen.txt > Hier werden die Koordinaten und vnum der Mopgruppe eingetragen, welche wir in der group.txt festgelegt haben.
server.attr > Hier werden Safezonen sowie begehbare Zonen, Fischbereiche usw. eingestellt, kann via World Editor generiert werden
setting.txt > Hier werden Infos zu der map gespeichert, wo der Server das
textureset findet, die BasisKoordinaten und anderes
stone.txt > Hier wird festgelegt, wo Steine respawnen
Town.txt > Hier werden die Koordinaten gespeichert, wenn man stirbt und wenn man Stadt neustart macht.
/usr/home/game/share/locale/germany/map
Hier befinden sich alle Maps.
in der Indexdatei wird der map Index bestimmt, dieser Index wiederum wird dann in der Config eines Cores eingetragen, damit die map auch geladen wird.
In einem Mapordner finden wir folgende Dateien:
Boss.txt > hier wird definiert welche Bossmops wo respawen
npc.txt > hier wird definiert, wo zbsp die Gemi respawnt
m 354 327 0 0 0 0 1m 100 1 9009
m > für mop
354 237 > die koodinaten auf der map
00 > kp so lassen
0 0 > ""
1ms 100 > wie lange es dauert bist der npc nach /purge wieder respawnt
1 > in welche Richtung der npc schaut
9009 > vnum des npcs
m > für mop
354 237 > die koodinaten auf der map
00 > kp so lassen
0 0 > ""
1ms 100 > wie lange es dauert bist der npc nach /purge wieder respawnt
1 > in welche Richtung der npc schaut
9009 > vnum des npcs
server.attr > Hier werden Safezonen sowie begehbare Zonen, Fischbereiche usw. eingestellt, kann via World Editor generiert werden
setting.txt > Hier werden Infos zu der map gespeichert, wo der Server das
textureset findet, die BasisKoordinaten und anderes
stone.txt > Hier wird festgelegt, wo Steine respawnen
Town.txt > Hier werden die Koordinaten gespeichert, wenn man stirbt und wenn man Stadt neustart macht.
Dieser befindet sich in diesem Pfad:
/usr/home/game/share/locale/germany/quest
hier werden alle Quests eingefügt.
hier finden wir ausserdem noch folgende Dateien:
locale_list > Hier werden alle namen der Quests eingetragen
qc > wird beim der make.sh ausgeführt
qc.core > Ein Dump-File, das vom Core beim compilen der Quest generiert wird
quest_funtcion > Hier werden die Quest Befehle aufgelistet zbsp. pc_get_exp_bonus
questlib.lua > Hier wird die Funktion des Questbefehl eingetragen
questnpc.txt > Hier werden npcs aufgelistet, die eine Questfunktion haben.
/usr/home/game/share/locale/germany/quest
hier werden alle Quests eingefügt.
hier finden wir ausserdem noch folgende Dateien:
locale_list > Hier werden alle namen der Quests eingetragen
qc > wird beim der make.sh ausgeführt
qc.core > Ein Dump-File, das vom Core beim compilen der Quest generiert wird
quest_funtcion > Hier werden die Quest Befehle aufgelistet zbsp. pc_get_exp_bonus
questlib.lua > Hier wird die Funktion des Questbefehl eingetragen
PHP Code:
function pc_get_exp_bonus(exp, text)
say_reward(text)
pc.give_exp2(exp)
set_quest_state("levelup", "run")
end
Auth > Der Authserver (auch Loginserver genannt) prüft die Logindaten des Spielers und sendet dem Client einen Sessionkey. Der Sessionkey wird dann Serverside unter den Cores verteilt. Der Client verbindet dann auf einen Core und muss den Sessionkey anstelle des Passwortes mit senden.
DB > Der Datenbank Core, hier wird alles was mit Items zu tun hat geladen.
Channel 1 > Das ist der Core für channel 1
Game99 > hier werden alle maps eingetragen, die für Events gedacht sind, das heisst wenn die map a1, also rotes Reich eingetragen ist, können sich alle user sehen, egal in welchem channel sie sich eingelogt haben.
DB > Der Datenbank Core, hier wird alles was mit Items zu tun hat geladen.
Channel 1 > Das ist der Core für channel 1
Game99 > hier werden alle maps eingetragen, die für Events gedacht sind, das heisst wenn die map a1, also rotes Reich eingetragen ist, können sich alle user sehen, egal in welchem channel sie sich eingelogt haben.
Die config ist die Datei, in der bestimmt wird was bei einem Core beim start alles geladen werden soll
Eine Standart config sieht wie folgt aus:
Eine auführliche Erklärung findet ihr hier:
Eine Standart config sieht wie folgt aus:
PHP Code:
HOSTNAME: channel1
CHANNEL: 1
PORT: 13000
P2P_PORT: 33000
DB_PORT: 15000
DB_ADDR: localhost
MAP_ALLOW: 1 3 4 5 6 7 8 9 10 11 21 23 24 25 41 43 44 45 61 62 63 64 65 66 69 70 71 72 73 104
#MAP_ALLOW: 184
TABLE_POSTFIX:
PASSES_PER_SEC: 25
SAVE_EVENT_SECOND_CYCLE: 30
PING_EVENT_SECOND_CYCLE: 180
PLAYER_SQL: 127.1.1.1 mt2core xyz123 mt2_player
COMMON_SQL: 127.1.1.1 mt2core xyz123 mt2_common
LOG_SQL: 127.1.1.1 mt2core xyz123 mt2_log
LOCALE_SERVICE: germany
MALL_URL: www.elitepvpers.com
adminpage_ip: 127.1.1.1
adminpage_ip1: 127.1.1.1
adminpage_ip2: 127.1.1.1
adminpage_ip3: 127.1.1.1
adminpage_password: keinahnung
VIEW_RANGE: 20000
CHECK_MULTIHACK: 0
MAX_LEVEL: 100
Die Gamefile ist das sogenannte Herz der Serverfiles, sie befindet sich in diesem Pfad:
/usr/home/game/share
In der Gamefile werden Dinge definiert, wie zbsp. das exp pro level, der maximale Status, die Swichzeit, die Zeit wie schnell es geht bis ein Gegenstand nach dem herunterfallen verschwindet und etliche andere Sachen.
Die Version eurer Gamefile findet ihr heraus, wenn ihr von channel1 die VERSION.txt öffnet.
Die 2010 und neueren Gamefiles haben einen sogenannten Encryption Key (in der Mt2 Szene auch Pong genannt), dies ist eine 16 stellige zahl, die auch in der Metin2.bin festgelegt wird, nur Clients, die den gleichen Encryption Key wie die Gamefile besitzen, können connecten.
Die Gamefile lässt sich auch patchen, dafür braucht man ein sogenannten Difpatcher, hier zu finden:
Eine dif ist eine Datei, in der Offsets gespeichert sind, Offsets sind Werte, welche man patchen lässt.
ein Beispiel:
Diese Hexcodes definieren, dass ein Gegenstand nach 1ner Sekunde verschwinden.
ändern wir den wert 0004D0A4: 2C 01 in 0004D0A4: 2C 02 verschwindet der Gegenstand in 2 Sekunden.
Einige difs findet ihr hier:
/usr/home/game/share
In der Gamefile werden Dinge definiert, wie zbsp. das exp pro level, der maximale Status, die Swichzeit, die Zeit wie schnell es geht bis ein Gegenstand nach dem herunterfallen verschwindet und etliche andere Sachen.
Die Version eurer Gamefile findet ihr heraus, wenn ihr von channel1 die VERSION.txt öffnet.
Die 2010 und neueren Gamefiles haben einen sogenannten Encryption Key (in der Mt2 Szene auch Pong genannt), dies ist eine 16 stellige zahl, die auch in der Metin2.bin festgelegt wird, nur Clients, die den gleichen Encryption Key wie die Gamefile besitzen, können connecten.
Die Gamefile lässt sich auch patchen, dafür braucht man ein sogenannten Difpatcher, hier zu finden:
Eine dif ist eine Datei, in der Offsets gespeichert sind, Offsets sind Werte, welche man patchen lässt.
ein Beispiel:
PHP Code:
game
0004D0A4: 2C 01
0004D0A5: 01 00
ändern wir den wert 0004D0A4: 2C 01 in 0004D0A4: 2C 02 verschwindet der Gegenstand in 2 Sekunden.
Einige difs findet ihr hier:
Der Source ist wie es der Name schon sagt, die Quelle der Gamefile.
Er besteht also aus dem gesamten Programmiercode der Game.
Metin2 verwendet hierfür C++.
Es wird unterschieden, zwischen dem Source für die Binary und dem Source welche für die Gamecore ist.
Zuerst werde ich den Gamecore source beschreiben.
Kurz und knapp die wichtigsten Infos zum Source (Gamecore).
Desweiteren werden folgende Programme benötigt:
-FTP Client (Filezilla oä)
-gmake
-makedepend
-python
Um also neue Systeme auf C++ basis zu implementieren braucht es wie schon geschrieben C++ Kentnisse, ich empfehle daher immer C++ Bücher zu lesen und ersteinmal selber ein Paar Erfahrungen mit der Sprache zu machen, indem man zbsp. eigene Tools erstellt usw. Man braucht ein gewisses Verständnis, doch das ist garnicht so schwer, hat man einmal verstanden, wie die Sprache aufgebaut ist und wie die Logik dahinter ist, ist es eigentlich ganz einfach. Dennoch braucht es gewisse Erfahrungswerte um komplett eigene Systeme einzubauen. Einige empfehlen Anhand des Source zu lernen, ich rate davon ab, der Code funktioniert wohl, hat aber einige Ungereimrheiten, desweiteren ist der Aufbau nicht wirklich erstrebenswert und auch Jahrzente veraltet.
Um eine Binary zu compilen benötigt man abgesehen vom Source Visual Studio 2013.
Es kann auch eine neuere Version verwendet werden, insofern das Toolset von 2013 integriert ist.
Jeder der schonmal mit C++ zu tun gehabt hat, wird in der Regel auch mit Visual Studio gearbeitet haben.
Die Funktionsweise ist daher auch beim Metin2 Source wie bei allen anderen Sources etc. die selbe.
Der Client Source kann nach dem das Projekt geöffnet wurde ohne weiteres komprilliert werden.
Er besteht also aus dem gesamten Programmiercode der Game.
Metin2 verwendet hierfür C++.
Es wird unterschieden, zwischen dem Source für die Binary und dem Source welche für die Gamecore ist.
Zuerst werde ich den Gamecore source beschreiben.
Kurz und knapp die wichtigsten Infos zum Source (Gamecore).
- Der Source besteht aus sogenannten Headerfile und dem Source file. Im letzteren findet sich der C++ Programmcode. Dr Header ist eine Textdatei, die Deklarationen und andere Bestandteile des Quelltextes enthält. Quelltext, der sich in einer Header-Datei befindet, ist im Allgemeinen zur Verwendung in mehreren Programmen oder mehreren Teilen eines Programmes vorgesehen.
- Im Source Ordner befindet sich die Makefile. ie Makefile definiert, mit was compiled wird, was für Libs verwendet werden und sie defniert die Befehle die für das compilen verwendet werden.In der Makefile werden auch alle einzelnen Files aufgelistet, welche zur Gamefile compiled werden.
- Wer C++ beherscht, wird demnach wunder mit dem Source vollbringen können. Mit hilfe des Sources lassen sich komplett neue Systeme integrieren und man ist im Vergleich zur oben beschrieben Hex Methode nicht durch Begrenzung eingeschrenkt, denn mit einem Hex Editor lassen sich ledliglich vorhandene Codes umschreiben, hinzufügen kann man jedoch nur mit dem Source, ausser man will auf unumständliche Libs zurück greifen.
- Je nach Source benötigt ihr zum compilen FreeBSD9.2 oder älter.
Desweiteren werden folgende Programme benötigt:
-FTP Client (Filezilla oä)
-gmake
-makedepend
-python
Um also neue Systeme auf C++ basis zu implementieren braucht es wie schon geschrieben C++ Kentnisse, ich empfehle daher immer C++ Bücher zu lesen und ersteinmal selber ein Paar Erfahrungen mit der Sprache zu machen, indem man zbsp. eigene Tools erstellt usw. Man braucht ein gewisses Verständnis, doch das ist garnicht so schwer, hat man einmal verstanden, wie die Sprache aufgebaut ist und wie die Logik dahinter ist, ist es eigentlich ganz einfach. Dennoch braucht es gewisse Erfahrungswerte um komplett eigene Systeme einzubauen. Einige empfehlen Anhand des Source zu lernen, ich rate davon ab, der Code funktioniert wohl, hat aber einige Ungereimrheiten, desweiteren ist der Aufbau nicht wirklich erstrebenswert und auch Jahrzente veraltet.
Um eine Binary zu compilen benötigt man abgesehen vom Source Visual Studio 2013.
Es kann auch eine neuere Version verwendet werden, insofern das Toolset von 2013 integriert ist.
Jeder der schonmal mit C++ zu tun gehabt hat, wird in der Regel auch mit Visual Studio gearbeitet haben.
Die Funktionsweise ist daher auch beim Metin2 Source wie bei allen anderen Sources etc. die selbe.
Der Client Source kann nach dem das Projekt geöffnet wurde ohne weiteres komprilliert werden.
In den verschiedenen Channels finden wir 2 Dateien, einmal die syserr und einmal die syslog, beide sind logfiles, Dateien in denen Informationen zum Serverablauf reingeschrieben werden.
Die syslog beinhaltet Informationen wie, welches item zuletzt auf den Boden gefallen ist etc...
Die syserr beinhaltet nur Fehlermeldungen.
Hier eine Liste bekannter Fehler und dessen Lösungen:
Der login-key ist ein unique value welches vom dbcache, auth & der game verwendet wird um einen eingeloggten Account zu identifizieren.
Die Fehlermeldung resultiert meistens aus einem falschen DBBoot-Packet.
Dieser Fehler bedeutet, dass die synchronisation zwischen Server und Client zu lange dauert bzw. zu viele versuche benötigt.
Das bedeutet, dass der jeweilige Port schon belegt und in "Aktion" ist. Einfach mal schauen jede CONFIG nachgucken, und gucken ob ein Port mehrmals belegt ist.
Verbindung zum DB Core fehlgeschlagen, port überprüfen oder vergewissern, dass der db core hochgefahren ist.
Es ist keine übersetzung zu dieser Information enthalten, einfach hinschreiben Code5bitte einem GM melden, dann könnt ihr bei dieser Aktion die richtige übersetzung herausfinden.
Erster Fehler, er kann einen Mob, der in einer regen.txt eingetragen ist nicht finden. Also, entweder jede regen.txt durchsuchen, und nach dieser mob_vnum suchen, oder einen Mob in der Datenbank hinzufügen.
Aus Fehler eins resultiert dann Fehler 2, er kann den Mob nicht spawnen, logisch oder?
Dieser Fehler entsteht bei npcs die eine quest zugewiesen haben und sich bewegen, entweder in die questnpc.txt in questordner eintragen oder per navicat in folder den eintrag in stray_dog abändern.
Passiert meistens, wenn man den mysql ordner überschreibt, hierbei kenne ich nur die Lösung mysql neu installieren.
Dies ist im normalfall kein Fehler, hier wird lediglich beschrieben, dass der Core runtergefahren wurde.
Outdoor hat keine MonsterAreaInfo, ist aber eher ein kleiner Fehler, der keine Auswirkungen ingame hat
Er versucht eine Querry in einer Tabelle auszuführen, die nicht exisistiert.
Die common_drop_item.txt ist fehlerhaft, überprüfen.
Der Chat [SA]speedy hat sich zu schnell bewegt, wir meistens durch ein schnelles Reittier ausgelöst, nicht weiter schlimm.
Die Itemidlimite wurde erreicht, öffnet die config.txt im db ordner und setzt eine 0 bei ITEM_ID_RANGE: inten dazu.
Er kann die motlist für den Mop nicht finden, einfach in Navicat bei dem betroffenen Mop bei folder den Inhalt rauslöschen.
Fehler in der Boniliste, item_attr oder item_attr_rare. Der erste Wert ist größer als der Zweite. Einfach ändern, so dass der erste Wert nicht mehr größer als der Zweite ist.
Das bedeutet, dass er ein Item, welches vorher auf diesem Charakter war nicht herstellen/laden kann. guckt nach, ob Ihr dieses Item aus der Datenbank gelöscht habt.
Bedeutet, dass er ein Item mit dieser Verbesserungs-Rolle nicht verbessern kann.
Nachschauen, ob Ihr z.B einen Fehler bei diesem Item in der Datenbank gemacht habt, oder es kann auch daran liegen, dass ein Spieler versucht hat eine 65er per Segi zur 80er uppen wollte.
Datenbank;
Der Query String ist falsch. Er muss per hex-editor geändert werden, dann funktioniert das ganze auch.
Das bedeutet, dass die item_proto einen Fehler hat, und zwar folgender;
Die Zweite Spalte, bzw. der Name dieser Spalte ist falsch, bei Euch heißt diese Spalte wahrscheinlich locale_name das darf aber nicht so sein. Ihr müsst den Namen dieser Spalte in gb2312name unbennen
Es befindet sich irgendwo in ein Konvertierungsfehler in dern mob_names.txt
Dieser Fehler kann nur in den Files nach der r_2089M erscheinen.
Der Server hat zu wenig Ram. Entweder bessere Server hosten oder bessere Coreverteilung,
Wichtiger Fixx
Einige Fehler und Lösungen wurden aus diesem Thread rauskopiert:
Die syslog beinhaltet Informationen wie, welches item zuletzt auf den Boden gefallen ist etc...
Die syserr beinhaltet nur Fehlermeldungen.
Hier eine Liste bekannter Fehler und dessen Lösungen:
PHP Code:
SetBilling: cannot find login key 452076870
Die Fehlermeldung resultiert meistens aus einem falschen DBBoot-Packet.
PHP Code:
SYSERR: Jul 29 09:33:33 :: HandshakeProcess: handshake retry limit reached! (limit 32 character !NO CHARACTER!)
PHP Code:
socket_bind: bind: Address already in use
PHP Code:
socket_connect: HOST localhost:15000, could not connect.
PHP Code:
locale_find: LOCALE_ERROR: "%s ´ÔÀº Á¢¼ÓµÇ ÀÖÁö ¾Ê½À´Ï´Ù.";
PHP Code:
regen_load: No mob data by vnum (vnum)
SpawnMob: SpawnMob: no mob data for vnum (vnum)
Aus Fehler eins resultiert dann Fehler 2, er kann den Mob nicht spawnen, logisch oder?
PHP Code:
SYSERR: Feb 26 12:44:52 :: Analyze: Handshake phase does not handle packet 3 (fd 18)
SYSERR: Feb 26 12:44:52 :: Process: SEQUENCE 4d340800 mismatch 0xaf != 0x2f header 3
SYSERR: Feb 26 12:44:52 :: Process: SEQUENCE_LOG [UNKNOWN]-------------
[003 : 0xaf]
PHP Code:
SYSERR: Feb 26 15:00:43 :: GetMoveMotionSpeed: cannot find motion (name Seon-Hae race 20095 mode 0)
PHP Code:
failed, retrying in 5 secondsmysql_real_connect: Can't connect to local MySQL server through socket '/tmp/mysql.sock
PHP Code:
SYSERR: Mar 5 03:39:41 :: hupsig: SIGHUP, SIGINT, SIGTERM signal has been received. shutting down.
PHP Code:
0305 23:25:28862 :: CMapOutdoor::Load - LoadMonsterAreaInfo ERROR
PHP Code:
SYSERR: May 2 15:25:30 :: ChildLoop: AsyncSQL: query failed: Table 'common.spam_db' doesn't exist (query: SELECT word, score FROM spam_db WHERE type='SPAM' errno: 1146)
PHP Code:
SYSERR: Aug 9 23:02:20 :: Boot: cannot load CommonDropItem: locale/germany/common_drop_item.txt
PHP Code:
SYSERR: Aug 18 02:53:34 :: PointChange: BONUS exceeded over 100!! point type: 84 name: [SA]speedy amount 300
PHP Code:
SetMaxItemID: ItemIDRange: FATAL ERROR!!! ITEM ID RANGE is not set.
PHP Code:
GetMotionFileName: Motion: ch_water_dragon have not motlist.txt vnum(2493) folder(ch_water_dragon)
PHP Code:
number_ex: number(): first argument is bigger than second argument 0 -> -1, item_attribute.cpp 375
PHP Code:
ItemLoad: cannot create item by vnum 50124 (name [GA]Haschel id ********)
PHP Code:
DoRefineWithScroll: REFINE : Unknown refine scroll item. Value0: 1
Nachschauen, ob Ihr z.B einen Fehler bei diesem Item in der Datenbank gemacht habt, oder es kann auch daran liegen, dass ein Spieler versucht hat eine 65er per Segi zur 80er uppen wollte.
Datenbank;
PHP Code:
DirectQuery: AsyncSQL::DirectQuery : mysql_query error: Column 'name' in field list is ambiguous
query: SELECT pid, name, date FROM monarch_candidacy a, player b where a.pid = b.id
PHP Code:
InitializeItemTable: query error: SELECT vnum, type, subtype, name, gb2312name, gold, shop_buy_price, weight, size, flag, wearflag, antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, limittype0, limitvalue0, limittype1, limitvalue1, applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, value0, value1, value2, value3, value4, value5 FROM item_proto ORDER BY vnum
Die Zweite Spalte, bzw. der Name dieser Spalte ist falsch, bei Euch heißt diese Spalte wahrscheinlich locale_name das darf aber nicht so sein. Ihr müsst den Namen dieser Spalte in gb2312name unbennen
PHP Code:
SYSERR: Mar 15 16:09:16 :: ChildLoop: AsyncSQL: query failed: Incorrect string value: '\xCC?moni...' for column 'locale_name' at row 1 (query: replace into mob_proto (vnum, name, locale_name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, on_click, empire, drop_item, resurrection_vnum, folder, st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, dam_multiply, summon, drain_sp, skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, skill_vnum3, skill_level3, skill_vnum4, skill_level4, sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive) values (1041, "????", "
Dieser Fehler kann nur in den Files nach der r_2089M erscheinen.
PHP Code:
swap_pager_getswapspace(12): failed
Wichtiger Fixx
Einige Fehler und Lösungen wurden aus diesem Thread rauskopiert:
Mit dem release der 34k Gamefile sind folgende Dateien dazu gekommen:
mop_proto.txt befindet sich im Ordner des DB-Cores und ersetzt die mop_proto Tabelle in MYSQL
mop_names.txt befindet sich im Ordner des DB-Cores und listet alle Namen der Mops auf
item_proto.txt befindet sich im Ordner des DB-Cores und ersetzt die item_proto Tabelle in MYSQL
item_names.txt befindet sich im Ordner des DB-Cores und listet alle Namen der Items auf.
Der Vorteil dieser txts ist es, dass man diese protos auch für den Client verwenden kann. Nachteil, man kann Änderungen nicht mehr per Querry ausführen.
Insult.txt: befindet sich im Germany Ordner. Ich glaube hier werden Wörter aufgelistet, welche im Chat zensiert werden, bin mir aber nicht sicher.
dragon_soul_table.txt: befindet sich im Germany Ordner. Hier wird festgelegt, wie das Drachenalchemie-System funktioniert.
mop_data.txt: Kommt noch...
Mit der neuen Gamefile sind folgende Erneuerungen neu dazu gekommen:
- Die item/mop_proto werden neu aus einer .txt Datei geladen, welche sich im DB Ordner befinden.
- Die Item/Mop_protos enthalten nun andere Variabeln genauere Erklärung folgt.
- Packagesystem: Zum übertragen der nennen wir es "Keys" für Type 3 und höher gepackte Archive
- Es gibt bei den neuen Files keinen "Pong" mehr.
wer die .txt protos benutzt wird in den protos Bezeichnungen wie zbsp. STUN_PC finden.
Hier kurz die Übersetzungen:
mop_proto.txt befindet sich im Ordner des DB-Cores und ersetzt die mop_proto Tabelle in MYSQL
mop_names.txt befindet sich im Ordner des DB-Cores und listet alle Namen der Mops auf
item_proto.txt befindet sich im Ordner des DB-Cores und ersetzt die item_proto Tabelle in MYSQL
item_names.txt befindet sich im Ordner des DB-Cores und listet alle Namen der Items auf.
Der Vorteil dieser txts ist es, dass man diese protos auch für den Client verwenden kann. Nachteil, man kann Änderungen nicht mehr per Querry ausführen.
Insult.txt: befindet sich im Germany Ordner. Ich glaube hier werden Wörter aufgelistet, welche im Chat zensiert werden, bin mir aber nicht sicher.
dragon_soul_table.txt: befindet sich im Germany Ordner. Hier wird festgelegt, wie das Drachenalchemie-System funktioniert.
mop_data.txt: Kommt noch...
Mit der neuen Gamefile sind folgende Erneuerungen neu dazu gekommen:
- Die item/mop_proto werden neu aus einer .txt Datei geladen, welche sich im DB Ordner befinden.
- Die Item/Mop_protos enthalten nun andere Variabeln genauere Erklärung folgt.
- Packagesystem: Zum übertragen der nennen wir es "Keys" für Type 3 und höher gepackte Archive
- Es gibt bei den neuen Files keinen "Pong" mehr.
wer die .txt protos benutzt wird in den protos Bezeichnungen wie zbsp. STUN_PC finden.
Hier kurz die Übersetzungen:
PHP Code:
MAX_HP= Tp
MAX_SP= MP
CON=Vitalität
INT=Intelligenz
STR=Stärke
DEX=Beweglichkeit
MOV_SPEED=Bewegungsgeschwindigkeit
HP_REGEN=Tp Regeneration
SP_REGEN=MP Regeneration
POISON_PCT= Vergiftungschance
STUN_PCT= Ohnmachtschance
SLOW_PCT= Verlangsamerungschance
CRITICAL_PCT= Kritischer Treffer
PENETRATE_PCT= Durchbohrender Treffer
ATTBONUS_HUMAN=Stark gg.Halbmenschen
ATTBONUS_ANIMAL= " " Tiere
ATTBONUS_ORC= " " Orks
ATTBONUS_MILGYO= " " Esoterische
ATTBONUS_UNDEAD= " " Untote
ATTBONUS_DEVIL= " " Teufel
STEAL_HP= Chance Tp zu stehlen
STEAL_SP= Chance Mp zu stehlen
RESIST_SWORD= Einhandverteidigung
RESIST_TWOHAND= Zweihandverteidigung
RESIST_DAGGER= Dolchverteidigung
RESIST_BELL=Glockenverteidigung
RESIST_FAN= Fächerverteidigung
RESIST_FIRE=Feuerwiderstand
RESIST_BOW=Pfeilwiderstand
RESIST_MAGIC= Magiewiderstand
RESIST_WIND=Windwiderstand
REFLECT_MELEE=Körperlichen Angriff reflketieren
POISON_REDUCE= Giftwiderstand
EXP_DOUBLE_BONUS=Doppelte Menge an Exp Chance
GOLD_DOUBLE_BONUS= Doppelte Menge an Yang Chance
ITEM_DROP_BONUS=Doppelte Menge an Gegentständen Chance
IMMUNE_STUN=Abwehr gegen Ohnmacht
IMMUNE_SLOW= Abwehr gegen Verlangsamen
ATT_GRADE_BONUS=Angriffswert+
6/7: ATT_BONUS_TO_MONSTER= % gegen Monster
ATT_BONUS_TO_WARRIOR= % gegen Krieger
ATT_BONUS_TO_ASSASSIN=% gegen Ninja
ATT_BONUS_TO_SURA= % gegen Sura
ATT_BONUS_TO_SHAMAN=%gegen Schamanen
RESIST_WARRIOR= Abwehr gegen Krieger
RESIST_ASSASSIN= Abwehr gegen Ninja
RESIST_SURA=Abwehr gegen Sura
RESIST_SHAMAN= Abwehr gegen Schamanen
Allgemeine Metin2 Serverfiles Befehle:
cd /usr/home/game/channel1 && ./game | einzelner Core starten
cd /usr/home/game && sh start.sh | Cores hochfahren
cd /usr/home/game && sh close.sh | Cores herunterfahren
cd /usr/home/game && sh close.sh && sh start.sh | Alternative zu reboot
cd /usr/home/game && sh clear.sh | Logs werden gelöscht
cd /usr/home/game && sh restart.sh | Das restart script wird ab jetzt ausgeführt, muss eingefügt sein
top | Listet alle Prozesse und dern Leistung auf mit q verlassen
/etc/rc.d/netif restart | Netzwerkadapter wird neu gestarten, Verbindung zur Datenbank veschnellert, nicht bei Rootserver ausführen!
rm -rf /verzeichniss | Verzeichniss wird gelöscht
cd /usr/home/game/share/germany/quest [enter] chmod 777 make.sh [enter] sh make.sh | Quest komprilieren/neu laden, es muss ausserdem im game /reload q eingegeben werden.
cd /usr/home/game/share/germany/quest && ee locale_list | Hier neue Quests eintragen
cd /usr/home [enter] tar -cvjf archivname.tar.gz game | tar.gz Archive erstellen, Backup
cd /pfad des tar.gz Archives [enter] tar zxvf archivname.tar.gz | Entpackt das tar.gz Archiv
Screen:
screen -r -x | einlogen
Strg+A | dann 1 wählen um core1 auszuwählen
Str+A dann Strg+D | screen verlassen
Str+C | core runterfahren
Source:
gmake clean | wird vor jedem neuen Compilen gemacht
gmake j -2 | game wird komprilliert die 2 steht für die core die fürs compilen verwendet werden sollen
gmake all | game sowie db werden komprilliert
cd /usr/home/game/channel1 && ./game | einzelner Core starten
cd /usr/home/game && sh start.sh | Cores hochfahren
cd /usr/home/game && sh close.sh | Cores herunterfahren
cd /usr/home/game && sh close.sh && sh start.sh | Alternative zu reboot
cd /usr/home/game && sh clear.sh | Logs werden gelöscht
cd /usr/home/game && sh restart.sh | Das restart script wird ab jetzt ausgeführt, muss eingefügt sein
top | Listet alle Prozesse und dern Leistung auf mit q verlassen
/etc/rc.d/netif restart | Netzwerkadapter wird neu gestarten, Verbindung zur Datenbank veschnellert, nicht bei Rootserver ausführen!
rm -rf /verzeichniss | Verzeichniss wird gelöscht
cd /usr/home/game/share/germany/quest [enter] chmod 777 make.sh [enter] sh make.sh | Quest komprilieren/neu laden, es muss ausserdem im game /reload q eingegeben werden.
cd /usr/home/game/share/germany/quest && ee locale_list | Hier neue Quests eintragen
cd /usr/home [enter] tar -cvjf archivname.tar.gz game | tar.gz Archive erstellen, Backup
cd /pfad des tar.gz Archives [enter] tar zxvf archivname.tar.gz | Entpackt das tar.gz Archiv
Screen:
screen -r -x | einlogen
Strg+A | dann 1 wählen um core1 auszuwählen
Str+A dann Strg+D | screen verlassen
Str+C | core runterfahren
Source:
gmake clean | wird vor jedem neuen Compilen gemacht
gmake j -2 | game wird komprilliert die 2 steht für die core die fürs compilen verwendet werden sollen
gmake all | game sowie db werden komprilliert
Video:
Danksagungen
HeavyHacker > Für seine Hilfe bei der Überarbeitung einiger Erklärungen
Einige Informationen in diesem Thread wurden kopiert, der Link zum Original sollte immer dabei sein.
Ich möchte bei Gelegenheit darauf hinweisen, dass einige Informationen möglicherweise falsch sein können, da ich davon ausgegangen bin, dass diese Erklärungen so stimmen, wobei ich mich auch getäuscht haben könnte. Falls Jemand einen Fehler sieht, bitte ich den Jenigen sich bei mir zu melden.
Der Thread wird immer wieder geupdatet.
Ich hoffe ihr schätzt meine Arbeit.
mfg
Lauling
Ich möchte bei Gelegenheit darauf hinweisen, dass einige Informationen möglicherweise falsch sein können, da ich davon ausgegangen bin, dass diese Erklärungen so stimmen, wobei ich mich auch getäuscht haben könnte. Falls Jemand einen Fehler sieht, bitte ich den Jenigen sich bei mir zu melden.
Der Thread wird immer wieder geupdatet.
Ich hoffe ihr schätzt meine Arbeit.
mfg
Lauling