Bu ekrana bakınca server tarafında aslında ciddi bir sorun yok. Channel’lar ve core’lar düzgün şekilde ayağa kalkmış, yani game server çalışıyor. Burada problem serverın açılmaması değil,
client’in doğru yere bağlanamaması.
Şu an yaşadığın senaryo çok net:
Oyuna giriyorsun, login oluyor, karakter seçimini geçiyor ama harita yüklenirken bağlantı kopuyor. Bu durum neredeyse her zaman
serverinfo ile game CONFIG uyumsuzluğundan çıkar.
En sık yapılan hata, serverinfo.py dosyasının doğru düzenlenip doğru yere konulmaması. Birçok client’te birden fazla serverinfo bulunabiliyor. Örneğin root içinde bir tane, locale_tr içinde bir tane daha oluyor. Client hangisini okuyorsa, senin düzenlediğin dosya o değilse yaptığın değişikliklerin hiçbir anlamı kalmıyor. O yüzden önce client’in gerçekten hangi serverinfo’yu okuduğundan emin olmak gerekiyor.
Bir diğer nokta Channel 99 meselesi. Server tarafında Channel 99 açık görünüyor. Eğer serverinfo’da Channel 99 tanımı yoksa ya da portları birebir aynı değilse, client bağlantı kurmaya çalışırken boşa düşer ve seni login ekranına atar. Bu durum özellikle event channel’ı olan files’lerde çok sık yaşanır.
Port konusu da önemli. Game CONFIG’te hangi portlar yazıyorsa, serverinfo’da da birebir aynı olmak zorunda. Bir core’un portu bile farklıysa sonuç yine aynı olur: login olur ama haritaya girmez.
Bir de IP karmaşası var. Putty’de gördüğün 192.168.1.14 iç IP. Eğer client’te dış IP yazıp server iç IP’ye bind olmuşsa veya tam tersi durum varsa, bağlantı yarıda kesilir. Test aşamasında en temiz yöntem, hem server hem client tarafında
aynı IP’yi kullanmaktır. LAN’da test ediyorsan 192.168.1.14, dışarıdan bağlanıyorsan her yerde dış IP.
Özetle:
- Server çalışıyor, crash yok
- Problem client’in bağlandığı IP/port ile serverın dinlediği IP/port’un uyuşmaması
- Yanlış serverinfo okunuyor olabilir
- Channel 99 tanımı eksik ya da portları tutmuyor olabilir
Bu tip sorunlar tamamen ayar kaynaklıdır ve çözümsüz değildir. Serverinfo.py’deki IP–port bilgilerini ve game CONFIG’teki HOSTNAME/PORT satırlarını birebir eşitlediğin anda problem ortadan kalkar.
Dosyaları çok kez kontrol ettiğim halde sorun fark edemedim.
[CODE title="serverinfo.py"]import os
import app
import localeInfo
import debugInfo
CHINA_PORT = 50000
def BuildServerList(orderList):
retMarkAddrDict = {}
retAuthAddrDict = {}
retRegion0 = {}
ridx = 1
for region, auth, mark, channels in orderList:
cidx = 1
channelDict = {}
for channel in channels:
key = ridx * 10 + cidx
channel["key"] = key
channelDict[cidx] = channel
cidx += 1
region["channel"] = channelDict
retRegion0[ridx] = region
retAuthAddrDict[ridx] = auth
retMarkAddrDict[ridx*10] = mark
ridx += 1
return retRegion0, retAuthAddrDict, retMarkAddrDict
app.ServerName = None
SMALL_SERVER_SELECT_LIST = True # 6 Channels
if app.ENABLE_SERVER_SELECT_RENEWAL:
STATE_NONE = localeInfo.CHANNEL_STATUS_OFFLINE
STATE_DICT = {
0 : localeInfo.CHANNEL_STATUS_OFFLINE,
1 : localeInfo.CHANNEL_STATUS_VACANT,
2 : localeInfo.CHANNEL_STATUS_RECOMMENDED,
3 : localeInfo.CHANNEL_STATUS_BUSY,
4 : localeInfo.CHANNEL_STATUS_FULL,
}
STATE_REVERSE_DICT = {}
STATE_COLOR_DICT = { "..." : 0xffdadada } # 퍼블리셔에서 channel상태에 ...을 유지하도 있어서 문제가 발생.
STATE_COLOR_LIST = [ 0xffffffff, 0xffdadada, 0xff00ff00, 0xffffc000, 0xffff0000 ]
idx = 0
for key, value in STATE_DICT.items():
STATE_REVERSE_DICT[value] = key
STATE_COLOR_DICT[value] = STATE_COLOR_LIST[idx % len(STATE_COLOR_LIST)]
idx += 1
SERVER_STATE_DICT = {
"NONE" : 0,
"NEW" : 1,
"SPECIAL" : 2,
"CLOSE" : 3
}
if not app.ENABLE_SERVER_SELECT_RENEWAL:
if app.ENABLE_CHANNEL_LIST:
STATE_NONE = "Offline"
STATE_DICT = { 0 : "Offline", 1 : "Available", 2 : "Busy", 3 : "Full" }
STATE_COLOR_DICT = { "Offline" : 0xffdadada, "Available" : 0xff00ff00, "Busy" : 0xffffff00, "Full" : 0xffff0000}
else:
STATE_NONE = "..."
STATE_DICT = {
0 : "....",
1 : "NORM",
2 : "BUSY",
3 : "FULL"
}
SERVER01_CHANNEL_DICT = {
1 : {
"key" : 11,
"name" : "CH-1 ",
"ip" : "192.168.1.14",
"tcp_port" : 12101,
"udp_port" : 12101,
"state" : STATE_NONE,
'count' : 0,
},
2 : {
"key" : 12,
"name" : "CH-2 ",
"ip" : "192.168.1.14",
"tcp_port" : 12201,
"udp_port" : 12201,
"state" : STATE_NONE,
'count' : 0,
},
}
SERVER02_CHANNEL_DICT = {
1 : {
"key" : 11,
"name" : "CH-1 ",
"ip" : "192.168.1.14",
"tcp_port" : 12101,
"udp_port" : 12101,
"state" : STATE_NONE,
'count' : 0,
},
2 : {
"key" : 12,
"name" : "CH-2 ",
"ip" : "192.168.1.14",
"tcp_port" : 12201,
"udp_port" : 12201,
"state" : STATE_NONE,
'count' : 0,
},
3 : {
"key" : 13,
"name" : "CH-3 ",
"ip" : "192.168.1.14",
"tcp_port" : 12301,
"udp_port" : 12301,
"state" : STATE_NONE,
'count' : 0,
},
4 : {
"key" : 14,
"name" : "CH-4 ",
"ip" : "192.168.1.14",
"tcp_port" : 12401,
"udp_port" : 12401,
"state" : STATE_NONE,
'count' : 0,
},
}
SERVER03_CHANNEL_DICT = {
1 : {
"key" : 11,
"name" : "CH-1 ",
"ip" : "192.168.1.14",
"tcp_port" : 12101,
"udp_port" : 12101,
"state" : STATE_NONE,
'count' : 0,
},
2 : {
"key" : 12,
"name" : "CH-2 ",
"ip" : "192.168.1.14",
"tcp_port" : 12201,
"udp_port" : 12201,
"state" : STATE_NONE,
'count' : 0,
},
3 : {
"key" : 13,
"name" : "CH-3 ",
"ip" : "192.168.1.14",
"tcp_port" : 12301,
"udp_port" : 12301,
"state" : STATE_NONE,
'count' : 0,
},
4 : {
"key" : 14,
"name" : "CH-4 ",
"ip" : "192.168.1.14",
"tcp_port" : 12401,
"udp_port" : 12401,
"state" : STATE_NONE,
'count' : 0,
},
}
REGION_NAME_DICT = {
0 : "Europe",
}
REGION_AUTH_SERVER_DICT = {
0 : {
1 : {
"ip" : "192.168.1.14",
"port" : 11150,
},
2 : {
"ip" : "192.168.1.14",
"port" : 11150,
},
3 : {
"ip" : "192.168.1.14",
"port" : 11150,
},
}
}
REGION_DICT = {
0 : {
1 : {
"name" : "Test Server",
"channel" : SERVER01_CHANNEL_DICT,
"state" : "NEW|SPECIAL",
"flag" : "ALL",
},
2 : {
"name" : "OmegaWin32",
"channel" : SERVER02_CHANNEL_DICT,
"state" : "SPECIAL",
"flag" : "EU",
},
3 : {
"name" : "OmegaBSD",
"channel" : SERVER03_CHANNEL_DICT,
"state" : "SPECIAL",
"flag" : "SP6",
},
},
}
MARKADDR_DICT = {
10 : {
"ip" : "192.168.1.14",
"tcp_port" : 12101,
"mark" : "10.tga",
"symbol_path" : "10",
},
20 : {
"ip" : "192.168.1.14",
"tcp_port" : 12101,
"mark" : "10.tga",
"symbol_path" : "10",
},
30 : {
"ip" : "192.168.1.14",
"tcp_port" : 12101,
"mark" : "10.tga",
"symbol_path" : "10",
},
}
TESTADDR = {
"ip" : "192.168.1.14",
"tcp_port" : 50000,
"udp_port" : 50000,
}
[/CODE]
[CODE title="game config.txt"]HOSTNAME: ch1_game1
CHANNEL: 1
PORT: 12101
P2P_PORT: 12110
DB_PORT: 11000
DB_ADDR: localhost
MAP_ALLOW: 1 3 4 5 6 21 23 24 25 26 41 43 44 45 46 91 92 93 107 112 201
# 1 metin2_map_a1
# 3 metin2_map_a3
# 4 metin2_map_guild_01
# 5 metin2_map_monkey_dungeon_11
# 6 metin2_guild_village_01
# 21 metin2_map_b1
# 23 metin2_map_b3
# 24 metin2_map_guild_02
# 25 metin2_map_monkey_dungeon_12
# 26 metin2_guild_village_02
# 41 metin2_map_c1
# 43 metin2_map_c3
# 44 metin2_map_guild_03
# 45 metin2_map_monkey_dungeon_13
# 46 metin2_guild_village_03
# 91 metin2_map_e1_01
# 92 metin2_map_e1_02
# 93 metin2_map_e1_03
# 107 metin2_map_monkey_dungeon
# 112 metin2_map_duel
# 201 metin2_map_pvp_arena
TABLE_POSTFIX:
ITEM_ID_RANGE: 100000001 200000000
PASSES_PER_SEC: 25
SAVE_EVENT_SECOND_CYCLE: 180
PING_EVENT_SECOND_CYCLE: 180
PLAYER_SQL: localhost mt2 mt2!@# player
COMMON_SQL: localhost mt2 mt2!@# common
LOG_SQL: localhost mt2 mt2!@# log
LOCALE_SERVICE: uk
TEST_SERVER: 1
VIEW_RANGE: 8000
MAX_LEVEL: 120
POPUP_NOTICE_URL: http://62.171.146.112/docs/
[/CODE]