Yardım item_names.txt item_proto.txt

  • Konuyu açan Konuyu açan trammola
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 69
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

trammola

Üye
Üye
Mesaj
108
Çözümler
3
Beğeni
12
Puan
434
Ticaret Puanı
0
gen.py:
Genişlet Daralt Kopyala
#!/usr/local/bin/python2.7
#### @martysama0134 start scripts ####
### TODO:
## clean how rawly CONFIG is shown in code
## find solution for common cores and not PORT.RANDOM ports
## separate database

from gen_settings import *

portlist={}
clearlist=[]
startlist=[]

def SlashFix(pathname):
    if v_system in ("FreeBSD", "Linux"):
        return pathname.replace("\\", "/")
    elif v_system=="Windows":
        return pathname.replace("/", "\\")
    return pathname

def CreateFolder(foldername):
    foldername = SlashFix(foldername)
    if v_system in ("FreeBSD", "Linux"):
        fShell("mkdir -p %s" % (foldername))
    elif v_system=="Windows":
        fShell("mkdir %s" % (foldername))

def CreateEmptyFile(filename):
    filename = SlashFix(filename)
    if v_system in ("FreeBSD", "Linux"):
        fShell("cat /dev/null > %s" % (filename))
    elif v_system=="Windows":
        fShell("type Nul > %s" % (filename))

def TouchFile(filename):
    filename = SlashFix(filename)
    if v_system in ("FreeBSD", "Linux"):
        fShell("touch %s" % (filename))
    elif v_system=="Windows":
        fShell("type Nul >> %s" % (filename))

def Append2File(txt, filename):
    filename = SlashFix(filename)
    fShell("echo %s >> %s" % (txt, filename))

def DeleteFile(filename):
    filename = SlashFix(filename)
    if v_system in ("FreeBSD", "Linux"):
        fShell("rm -rf %s" % (filename))
    elif v_system=="Windows":
        fShell("del /SF %s" % (filename))

def SymLinkCreate(src, dst, is_file):
    src = SlashFix(src)
    dst = SlashFix(dst)
    if v_system=="FreeBSD":
        fShell("ln -Ffnsw %s %s" % (src, dst))
    elif v_system=="Linux":
        fShell("ln -Ffns %s %s" % (src, dst))
    elif v_system=="Windows":
        if is_file:
            fShell("mklink %s %s" % (dst, src))
        else:
            fShell("mklink /D %s %s" % (dst, src))

def SymLinkCreateDir(src, dst):
    SymLinkCreate(src, dst, is_file=False)

def SymLinkCreateFile(src, dst):
    SymLinkCreate(src, dst, is_file=True)

def SymLinkCreateFileExe(src, dst):
    if v_system=="Windows":
        dst+=".exe"
    SymLinkCreate(src, dst, is_file=True)

def WriteHostConfig(szConfFile, szGameName):
    Append2File("HOSTNAME: %s" % (szGameName), "%s" % (szConfFile))

def WriteChannelConfig(szConfFile, dwChannel):
    if dwChannel==M2TYPE.NOCHAN:
        dwChannel=1
    Append2File("CHANNEL: %u" % (dwChannel), "%s" % (szConfFile))

def WriteMapConfig(szConfFile, szMapList):
    if len(szMapList.split())>=32:
        print "WARNING: MORE THAN 32 MAPS INSIDE:", szConfFile
    Append2File("MAP_ALLOW: %s" % (szMapList), "%s" % (szConfFile))

def WritePortConfig(szConfFile, wGenPort, dwType, dwPortType=None):
    if dwType==M2TYPE.DB:
        Append2File("%s = %u" % (PORT.lPORT[PORT.BIND_PORT], wGenPort), "%s" % (szConfFile))
    elif dwType==M2TYPE.CORE or dwType==M2TYPE.AUTH:
        Append2File("%s: %u" % (PORT.lPORT[dwPortType], wGenPort), "%s" % (szConfFile))

def genWriteConfig(szConfFile, tuSubConfTable):
    for val1 in tuSubConfTable:
        Append2File("%s" % ((val1[0] % val1[1])), "%s" % (szConfFile))

def genMakeConfig(szConfFile, diConfTable, bIsExtra=False, dwType=None):
    genWriteConfig(szConfFile, diConfTable["general"])
    if bIsExtra:
        genWriteConfig(szConfFile, diConfTable["extra"])
    if dwType!=None:
        genWriteConfig(szConfFile, diConfTable[dwType])

def genGetRandPort(dwType):
    wTmpPort = PORT.RANDOMI
    while(True):
        if wTmpPort in portlist:
            wTmpPort+=1
            continue
        else:
            portlist[wTmpPort]=dwType
            break
    return wTmpPort

def genGenM2List():
    from json import dumps as j_dumps
    with open("start.list", "wb") as fList: #b for unix end line
        fList.write(j_dumps(startlist, indent=4))
    with open("clear.list", "wb") as fList: #b for unix end line
        fList.write(j_dumps(clearlist, indent=4))

def genGenIpfwList():
    def Joi(mList):
        return ' '.join(str(v) for v in mList)
    szRules=CustIpfwList%(Joi(udp_yes_ports), Joi(tcp_yes_ports), Joi(tcp_nop_ports))
    with open("ipfw.rules", "wb") as fIpfw: #b for unix end line
        fIpfw.write(szRules)
        # fIpfw.write(szRules.replace("\r", ""))

def genInit():
    # clean port list
    global portlist
    portlist.clear()
    # clean start/clear list
    global startlist, clearlist
    del startlist[:]
    del clearlist[:]
    # clean ipfw list
    global udp_yes_ports,tcp_yes_ports,tcp_nop_ports
    del udp_yes_ports[:]
    del tcp_yes_ports[:]
    del tcp_nop_ports[:]

def genInitSrv(szSvr):
    #
    for val1 in ("share/data","share/locale","share/package","share/panama","share/conf","share/bin"):
        CreateFolder("%s/%s"%(szSvr, val1))
        # print "%s/%s"%(szSvr, val1)
    #
    for val1 in ("share/conf/BANIP","share/conf/CMD","share/conf/CRC","share/conf/VERSION","share/conf/state_user_count","share/bin/db","share/bin/game"):
        TouchFile("%s/%s" % (szSvr, val1))
        # print "%s/%s"%(szSvr, val1)
    #
    for val1 in ("share/conf/item_names.txt","share/conf/item_proto.txt","share/conf/mob_names.txt","share/conf/mob_proto.txt"):
        TouchFile("%s/%s" % (szSvr, val1))
        # print "%s/%s"%(szSvr, val1)
#global single server rules
genConfig = {}
genConfig["all"] = {}
#for ipfw rules
udp_yes_ports=[]
tcp_yes_ports=[]
tcp_nop_ports=[]

def genCalcParentRet(szParentName):
    return szParentName.count("/")*v_chalS

def genMain(oSub={}, szParentName=[]):
    global genConfig
    global startlist, clearlist
    global udp_yes_ports, tcp_yes_ports, tcp_nop_ports
    if not oSub:
        oSub=M2S
        genInit()
    for v1 in oSub:
        k1=v1["name"]
        listTmpParentName=list(szParentName)    # list() to bypass variable passed by reference to value
        listTmpParentName.append(k1)
        szTmpParentName=("/".join(listTmpParentName))
        # DeleteFile("%s" % szTmpParentName) # completely unsafe
        CreateFolder("%s" % szTmpParentName)
        # print szTmpParentName
        if v1["type"]==M2TYPE.DB:
            k1s=genConfig["active"]
            #logs make paths
            CreateFolder("%s/%s/%s/cores" % (k1s, v_lognS, szTmpParentName))
            CreateFolder("%s/%s/%s/log" % (k1s, v_lognS, szTmpParentName))
            TouchFile("%s/%s/%s/PTS" % (k1s, v_lognS, szTmpParentName))
            #logs sym paths
            SymLinkCreateDir("../%s/%s/cores" % (v_lognS, szTmpParentName), "%s/cores" % (szTmpParentName))
            SymLinkCreateDir("../%s/%s/log" % (v_lognS, szTmpParentName), "%s/log" % (szTmpParentName))
            SymLinkCreateFile("../%s/%s/PTS" % (v_lognS, szTmpParentName), "%s/PTS" % (szTmpParentName))
            szDbName="%s-%s"%(genConfig["active"], k1)
            SymLinkCreateFileExe("../share/bin/db", "%s/%s" % (szTmpParentName,szDbName))
            #start/logs track
            startlist.append(
                {
                    "path":szTmpParentName,
                    "name":szDbName,
                    "type":M2TYPE.DB,
                    "chan":M2TYPE.NOCHAN,
                    "serv":genConfig["active"],
                }
            )
            clearlist.append(
                {
                    "path":"%s/%s/%s"%(k1s, v_lognS, szTmpParentName),
                    "type":M2TYPE.DB,
                    "chan":M2TYPE.NOCHAN,
                    "serv":genConfig["active"],
                }
            )
            #@item/mob protos .txt
            SymLinkCreateFile("../share/conf/item_names.txt", "%s/item_names.txt" % (szTmpParentName))
            SymLinkCreateFile("../share/conf/item_proto.txt", "%s/item_proto.txt" % (szTmpParentName))
            SymLinkCreateFile("../share/conf/mob_names.txt", "%s/mob_names.txt" % (szTmpParentName))
            SymLinkCreateFile("../share/conf/mob_proto.txt", "%s/mob_proto.txt" % (szTmpParentName))
            #@CONFIG details
            CreateEmptyFile("%s/conf.txt"%(szTmpParentName))
            genMakeConfig("%s/conf.txt"%szTmpParentName, v1["config"], genConfig["all"][genConfig["active"]]["isextra"])
            if v1["port"]==PORT.RANDOM:
                genConfig["all"][genConfig["active"]]["db_port"]=genGetRandPort(v1["type"])
            else:
                genConfig["all"][genConfig["active"]]["db_port"]=v1["port"]
            WritePortConfig("%s/conf.txt"%szTmpParentName, genConfig["all"][genConfig["active"]]["db_port"], v1["type"], PORT.BIND_PORT)
            #add to ipfw rules
            tcp_nop_ports.append(genConfig["all"][genConfig["active"]]["db_port"])
        elif v1["type"]==M2TYPE.CHANFOLDER or v1["type"]==M2TYPE.CHANNEL:
            if v1["type"]==M2TYPE.CHANNEL:
                genConfig["all"][genConfig["active"]]["chan"]=v1["chan"]
            if v1["type"]==M2TYPE.CHANFOLDER:
                genConfig["all"][genConfig["active"]]["mark"]="%s/mark"%szTmpParentName
                CreateFolder("%s" % genConfig["all"][genConfig["active"]]["mark"])
            genMain(v1["sub"], listTmpParentName)
        elif v1["type"]==M2TYPE.SERVER:
            genInitSrv(szTmpParentName)
            genConfig["active"]=v1["name"]
            genConfig["all"][v1["name"]]={}
            genConfig["all"][v1["name"]]["isextra"]=v1["isextra"]
            genConfig["all"][v1["name"]]["mark"]="%s/mark"%szTmpParentName
            genMain(v1["sub"], listTmpParentName)
        elif v1["type"]==M2TYPE.AUTH or v1["type"]==M2TYPE.CORE:
            k1s=genConfig["active"]
            #logs make paths
            CreateFolder("%s/%s/%s/cores" % (k1s, v_lognS, szTmpParentName))
            CreateFolder("%s/%s/%s/log" % (k1s, v_lognS, szTmpParentName))
            TouchFile("%s/%s/%s/PTS" % (k1s, v_lognS, szTmpParentName))
            #logs sym paths
            gCPR=genCalcParentRet(szTmpParentName)
            SymLinkCreateDir("%s%s/%s/cores" % (gCPR,v_lognS,szTmpParentName), "%s/cores" % (szTmpParentName))
            SymLinkCreateDir("%s%s/%s/log" % (gCPR,v_lognS,szTmpParentName), "%s/log" % (szTmpParentName))
            SymLinkCreateFile("%s%s/%s/PTS" % (gCPR,v_lognS,szTmpParentName), "%s/PTS" % (szTmpParentName))
            #dirs sym paths
            SymLinkCreateDir("%sshare/data" % (gCPR), "%s/data" % (szTmpParentName))
            SymLinkCreateDir("%sshare/locale" % (gCPR), "%s/locale" % (szTmpParentName))
            SymLinkCreateDir("%sshare/package" % (gCPR), "%s/package" % (szTmpParentName))
            SymLinkCreateDir("%sshare/panama" % (gCPR), "%s/panama" % (szTmpParentName))
            #files sym paths
            SymLinkCreateFile("%sshare/conf/CMD" % (gCPR), "%s/CMD" % (szTmpParentName))
            SymLinkCreateFile("%sshare/conf/CRC" % (gCPR), "%s/CRC" % (szTmpParentName))
            SymLinkCreateFile("%sshare/conf/VERSION" % (gCPR), "%s/VERSION" % (szTmpParentName))
            SymLinkCreateFile("%sshare/conf/state_user_count" % (gCPR), "%s/state_user_count" % (szTmpParentName))
            if v1["type"]==M2TYPE.AUTH:
                SymLinkCreateFile("%sshare/conf/BANIP" % (gCPR), "%s/BANIP" % (szTmpParentName))
            if v1["type"]==M2TYPE.AUTH:
                szGameName="%s-%s"%(genConfig["active"], k1)
            else:
                szGameName="%s-ch%u-%s"%(genConfig["active"], genConfig["all"][genConfig["active"]]["chan"], k1)
            #mark sym path
            if v1["type"]==M2TYPE.CORE:
                gCPR2=genCalcParentRet(genConfig["all"][genConfig["active"]]["mark"])
                SymLinkCreateDir("%smark" % gCPR2, "%s/mark" % (szTmpParentName))
            #core sym path
            SymLinkCreateFileExe("%sshare/bin/game" % (gCPR), "%s/%s" % (szTmpParentName, szGameName))
            #start/logs track
            if v1["type"]==M2TYPE.AUTH:
                kh1=M2TYPE.NOCHAN
            else:
                kh1=genConfig["all"][genConfig["active"]]["chan"]
            startlist.append(
                {
                    "path":szTmpParentName,
                    "name":szGameName,
                    "type":v1["type"],
                    "chan":kh1,
                    "serv":genConfig["active"],
                }
            )
            clearlist.append(
                {
                    "path":"%s/%s/%s"%(k1s, v_lognS, szTmpParentName),
                    "type":v1["type"],
                    "chan":kh1,
                    "serv":genConfig["active"],
                }
            )
            #@CONFIG details
            CreateEmptyFile("%s/CONFIG" % (szTmpParentName))
            genMakeConfig("%s/CONFIG"%szTmpParentName, v1["config"], genConfig["all"][genConfig["active"]]["isextra"], v1["type"])
            WriteHostConfig("%s/CONFIG"%szTmpParentName, szGameName)
            WriteChannelConfig("%s/CONFIG"%szTmpParentName, kh1)
            if not v1["type"]==M2TYPE.AUTH:
                WriteMapConfig("%s/CONFIG"%szTmpParentName, v1["maps"])
            # w/o array, only if
            wTmpPort={}
            # PORT process
            if v1["port"]==PORT.RANDOM:
                wTmpPort[PORT.PORT]=genGetRandPort(v1["type"])
            else:
                wTmpPort[PORT.PORT]=v1["port"]
            WritePortConfig("%s/CONFIG"%szTmpParentName, wTmpPort[PORT.PORT], v1["type"], PORT.PORT)
            # P2P_PORT process
            if v1["p2p_port"]==PORT.RANDOM:
                wTmpPort[PORT.P2P_PORT]=genGetRandPort(v1["type"])
            else:
                wTmpPort[PORT.P2P_PORT]=v1["p2p_port"]
            WritePortConfig("%s/CONFIG"%szTmpParentName, wTmpPort[PORT.P2P_PORT], v1["type"], PORT.P2P_PORT)
            # DB_PORT process
            wTmpPort[PORT.DB_PORT]=genConfig["all"][genConfig["active"]]["db_port"]
            WritePortConfig("%s/CONFIG"%szTmpParentName, wTmpPort[PORT.DB_PORT], v1["type"], PORT.DB_PORT)
            #add to ipfw rules
            if v1["type"]==M2TYPE.AUTH:
                udp_yes_ports.append(wTmpPort[PORT.PORT])
            tcp_yes_ports.append(wTmpPort[PORT.PORT])
            tcp_nop_ports.append(wTmpPort[PORT.P2P_PORT])
            pass
        else:
            print "unrecognized type %u"%v1["type"]
    #end

def genList(bIsVerbose=False):
    if bIsVerbose:
        print "startlist:"
        for i in startlist:
            print "---", i, "---"
        print "clearlist:"
        for i in clearlist:
            print "---", i, "---"
        print "udp_yes_ports:"
        for i in udp_yes_ports:
            print "---", i, "---"
        print "tcp_yes_ports:"
        for i in tcp_yes_ports:
            print "---", i, "---"
        print "tcp_nop_ports:"
        for i in tcp_nop_ports:
            print "---", i, "---"
    genGenM2List()
    genGenIpfwList()

def genGen():
    genMain()
    genList(True)


if __name__ == "__main__":
    genGen()
#
gen_settings.py:
Genişlet Daralt Kopyala
#### @martysama0134 start scripts ####
from platform import system as p_system
v_system = p_system()

from subprocess import check_output as sp_co, call as sp_call, CalledProcessError as sp_CalledProcessError
def fShell(szCmd, bRet=False):
    try:
        if bRet:
            return sp_co(szCmd, shell=True)[:-1]    # remove final \n
        else:
            return sp_call(szCmd, shell=True)
    except sp_CalledProcessError:
        return -1

if v_system=="FreeBSD":
    v_admusrS=fShell("ifconfig em0 | grep -Eo 'inet ([0-9]{1,3}\.){3}([0-9]{1,3})' | awk '{print $2}'", True)
elif v_system=="Linux":
    v_admusrS=fShell("ifconfig eth0 | grep -Eo 'inet addr:([0-9]{1,3}\.){3}([0-9]{1,3})' | awk -F':' '{print $2}'", True)
elif v_system=="Windows":
    v_admusrS="127.0.0.1"

v_admpwdS='58948HG83H4G8H84G'                #adminpage_password
v_svrhstS='localhost'                        #host for sql connections
v_svrdttS='metin2 ASSBDAS!#FSABFASI!#JYXYXKAFAF'                            #user&pwd for sql connections
v_svrdtaS="%s %s"%(v_svrhstS, v_svrdttS)    #host, user and pwd for db sql connections

v_dbhstS='127.0.0.1'#default hostname for db
v_dbipS=30000        #default port for db (the others will be automatically calculated)
v_lognS='logs'        #name of the all_log path
v_chanS='channel/'        #name of the channel path
v_chalS='../'        #workaround that should be equivalent to $v_charS paths per ../

M2SD = {
    "account":        "account",
    "common":        "common",
    "hotbackup":    "hotbackup",
    "log":            "log",
    "player":        "player",
}

class M2TYPE:
    SERVER, DB, AUTH, CHANFOLDER, CHANNEL, CORE = xrange(6)
    NOCHAN = 0

class PORT:
    RANDOMI = v_dbipS    # a random port will start from such value
    RANDOM = 0
    PORT, P2P_PORT, DB_PORT, BIND_PORT = xrange(4)
    lPORT = ("PORT", "P2P_PORT", "DB_PORT", "BIND_PORT")

M2CONFIG = {
    "db": {
        "general": (
            ("SQL_ACCOUNT = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["account"], v_svrdttS)),
            ("SQL_COMMON = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["common"], v_svrdttS)),
            ("SQL_PLAYER = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["player"], v_svrdttS)),
            ("SQL_HOTBACKUP = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["hotbackup"], v_svrdttS)),
            ("TABLE_POSTFIX = \\\"%s\\\"", ("")),
            # ("BIND_PORT = %s", (v_dbipS,)),
            # ("DB_SLEEP_MSEC = 10", ()),
            ("CLIENT_HEART_FPS = %u", (25)),
            # ("HASH_PLAYER_LIFE_SEC = %u", (600)),
            ("PLAYER_ID_START = %u", (1000)),
            ("PLAYER_DELETE_LEVEL_LIMIT = %u", (70)),
            # ("PLAYER_DELETE_LEVEL_LIMIT_LOWER = %u", (15)),
            ("ITEM_ID_RANGE = %u %u ", (100000000, 200000000)),
            # ("BACKUP_LIMIT_SEC = %u", (3600)),
            ("DISABLE_HOTBACKUP = %u", (True)),
            ("LOCALE = %s", ("latin1")),
        ),
        "extra": (
            ("PROTO_FROM_DB = %u", (False)),
            ("MIRROR2DB = %u", (True)),
            # ("BIND_IP = %u", (192.168.0.190)),
        )
    },
    "core": {
        M2TYPE.AUTH: (
            ("AUTH_SERVER: %s", ("master")),
            ("PLAYER_SQL: %s %s", (v_svrdtaS, M2SD["account"])),
        ),
        M2TYPE.CORE: (
            ("PLAYER_SQL: %s %s", (v_svrdtaS, M2SD["player"])),
        ),
        "general": (
            # ("TABLE_POSTFIX: %s", ("")),
            # ("ITEM_ID_RANGE: %u %u", (5000001, 10000000)),
            ("VIEW_RANGE: %u", (10000)),
            ("PASSES_PER_SEC: %u", (25)),
            ("SAVE_EVENT_SECOND_CYCLE: %u", (180)),
            ("PING_EVENT_SECOND_CYCLE: %u", (180)),
            ("DB_ADDR: %s", (v_dbhstS)),
            ("COMMON_SQL: %s %s", (v_svrdtaS, M2SD["common"])),
            ("LOG_SQL: %s %s", (v_svrdtaS, M2SD["log"])),
            # ("TEST_SERVER: %d", (True)),
            # ("PK_SERVER: %d", (True)),
            ("ADMINPAGE_IP1: %s", (v_admusrS)),
            ("ADMINPAGE_PASSWORD: %s", (v_admpwdS)),
            ("MAX_LEVEL: %u", (120)),
        ),
        "extra": (
            # ("CHECK_VERSION_SERVER: %u", (True)),
            # ("CHECK_VERSION_VALUE: %u", (1215955205)),
            ("CHANGE_ATTR_TIME_LIMIT: %u", (False)),
            ("EMOTION_MASK_REQUIRE: %u", (False)),
            ("PRISM_ITEM_REQUIRE: %u", (False)),
            ("SHOP_PRICE_3X_TAX: %u", (False)),
            ("ENABLE_GLOBAL_SHOUT: %u", (1)),
            ("GLOBAL_SHOUT: %u", (True)),
            ("ITEM_COUNT_LIMIT: %u", (250)),
            ("STATUS_POINT_GET_LEVEL_LIMIT: %u", (120)),
            ("STATUS_POINT_SET_MAX_VALUE: %u", (90)),
            ("SHOUT_LIMIT_LEVEL: %u", (15)),
            ("SHOUT_LIMIT_TIME: %u", (5)),
            ("DB_LOG_LEVEL: %u", (1)),
            ("EMPIRE_LANGUAGE_CHECK: %u", (True)),
            # ("ITEM_DESTROY_TIME_AUTOGIVE: %u", (15)),
            # ("ITEM_DESTROY_TIME_DROPITEM: %u", (5)),
            # ("ITEM_DESTROY_TIME_DROPGOLD: %u", (15)),
            ("PK_PROTECT_LEVEL: %u", (20)),
            ("ADDSTONE_FAILURE0: %u", (80)),
            ("ADDSTONE_FAILURE1: %u", (70)),
            ("ADDSTONE_FAILURE2: %u", (60)),
            ("ADDSTONE_FAILURE3: %u", (50)),
            ("ADDSTONE_FAILURE4: %u", (40)),
            ("START_GOLD: %u", (500)),
            #("HACKSHIELD_ENABLE: %u", (1)),
            #("CHECK_MULTIHACK: %u", (1)),
            ("TRADE_EFFECT: %u", (1)),
            ("ATTR_ALWAYS_5_ADD: %u", (1)),
            ("PROTECT_NORMAL_PLAYER: %u", (1)),
            ("DISABLE_PRISM_ITEM: %u", (0)),
            #("BLOCK_CHAR_CREATION: %u", (0)),
            ("SKILLBOOK_NEED_EXP: %u", (20000)),
            ("SKILLBOOK_NEXTREAD_MIN: %u", (28800)),
            ("SKILLBOOK_NEXTREAD_MAX: %u", (43200)),
            ("BLOCK_POTIONS_IN_DUELL: %u", (1)),
            ("IMMUN_RATE: %u", (100)),
            ("MAX_ADDON_FKS: %u", (35)),
            ("MAX_ADDON_DSS: %u", (40)),
            ("PC_MAX_MOVEMENT_SPEED: %u", (200)),
            ("PC_MAX_ATTACK_SPEED: %u", (200)),
            ("MOB_MAX_MOVEMENT_SPEED: %u", (250)),
            ("MOB_MAX_ATTACK_SPEED: %u", (250)),
        ),
    },
}

COMMONCHAN=(
    {
        "name": "core1",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "1 2 3 4 6",
    },
    {
        "name": "core2",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "21 22 23 24 26",
    },
    {
        "name": "core3",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "41 42 43 44 46",
    },
    {
        "name": "core4",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "61 62 63 64 65 66 67 68 69 70 81 180 218 252 302 303 304 318",
    },
    {
        "name": "core5",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "101 103 105 110 111 114 118 119 120 121 122 123 124 125 126 127 128 253 254 255 256 257 353 354 356 403 404",
    },
    # {
        # "name": "core3",
        # "type": M2TYPE.CORE,
        # "port": PORT.RANDOM,
        # "p2p_port": PORT.RANDOM,
        # "config": M2CONFIG["core"],
        # "maps": "",
    # },
)

# PREMIUMCHAN=(
    # {
        # "name": "core1",
        # "type": M2TYPE.CORE,
        # "port": PORT.RANDOM,
        # "p2p_port": PORT.RANDOM,
        # "config": M2CONFIG["core"],
        # "maps": "1 21 41 3 23 43 4 24 44 5 25 45 108 109 112",
    # },
    # {
        # "name": "core2",
        # "type": M2TYPE.CORE,
        # "port": PORT.RANDOM,
        # "p2p_port": PORT.RANDOM,
        # "config": M2CONFIG["core"],
        # "maps": "61 62 63 64 65 66 67 68 69 70 71 72 73 206 104 193 207",
    # },
# )

CHAN99=(
    {
        "name": "core99",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "5 25 45 66 71 72 73 100 104 107 108 109 112 113 181 182 183 208 216 217 250 251 351 352 355",
    },
)

M2S=(
    {
        "name": "game",
        "type": M2TYPE.SERVER,
        "isextra": True,
        "sub": (
            {
                "name": "db",
                "type": M2TYPE.DB,
                "port": PORT.RANDOM,
                "config": M2CONFIG["db"],
            },
            {
                "name": "auth",
                "type": M2TYPE.AUTH,
                "port": PORT.RANDOM,
                "p2p_port": PORT.RANDOM,
                "config": M2CONFIG["core"],
            },
            {
                "name": "chan",
                "type": M2TYPE.CHANFOLDER,
                "sub": (
                    {
                        "name": "ch1",
                        "type": M2TYPE.CHANNEL,
                        "chan": 1,
                        "sub": COMMONCHAN,
                    },
                    {
                        "name": "ch2",
                        "type": M2TYPE.CHANNEL,
                        "chan": 2,
                        "sub": COMMONCHAN,
                    },
                    # {
                        # "name": "ch3",
                        # "type": M2TYPE.CHANNEL,
                        # "chan": 3,
                        # "sub": COMMONCHAN,
                    # },
                    # {
                        # "name": "ch4p",
                        # "type": M2TYPE.CHANNEL,
                        # "chan": 4,
                        # "sub": PREMIUMCHAN,
                    # },
                    {
                        "name": "ch99",
                        "type": M2TYPE.CHANNEL,
                        "chan": 99,
                        "sub": CHAN99,
                    },
                )
            }
        )
    },
)

CustIpfwList="""#!/bin/sh
IPF="ipfw -q add"
ipfw -q -f flush

#loopback
$IPF 10 allow all from any to any via lo0
$IPF 20 deny all from any to 127.0.0.0/8
$IPF 30 deny all from 127.0.0.0/8 to any
$IPF 40 deny tcp from any to any frag

# stateful
$IPF 50 check-state
$IPF 60 allow tcp from any to any established
$IPF 70 allow all from any to any out keep-state
$IPF 80 allow icmp from any to any

# open port ftp (20, 21), ssh (22), mail (25)
# http (80), https (443), dns (53), mysql (3306)
default_udp_yes_ports='53'
default_tcp_yes_ports='22 53 3306'
default_tcp_no_ports=''

# here auth PORTs for "NORM"/"..." thing
metin2_udp_yes_ports='%s'
# here PORTs
metin2_tcp_yes_ports='%s'
# here DB_PORTs and P2P_PORTs
metin2_tcp_no_ports='%s'

# merge lists
udp_yes_ports="$default_udp_yes_ports $metin2_udp_yes_ports"
tcp_yes_ports="$default_tcp_yes_ports $metin2_tcp_yes_ports"
tcp_nop_ports="$default_tcp_no_ports $metin2_tcp_no_ports"

# white ip list
white_sites=''

# block tcp/udp ports
for val in $tcp_nop_ports; do
    $IPF 2220 allow all from 127.0.0.0/8 to any $val
    for whitez in $white_sites; do
        $IPF 2210 allow tcp from $whitez to any $val in
        $IPF 2210 allow tcp from 127.0.0.0/8 to $whitez $val out
    done
    $IPF 2230 deny all from any to me $val
done
# unblock tcp ports
for val in $tcp_yes_ports; do
    $IPF 2200 allow tcp from any to any $val in limit src-addr 20
    $IPF 2210 allow tcp from any to any $val out
done
# unblock udp ports
for val in $udp_yes_ports; do
    $IPF 2200 allow udp from any to any $val in limit src-addr 20
    $IPF 2210 allow udp from any to any $val out
done
"""
WinSCP ile /usr/home/game/db ve /usr/home/game/share/conf klasöründe item_names.txt item_proto.txt mob_names.txt mon_proto.txt yok hali ile düzenleme yapamıyorum
yeni bir item veya yeni bir mob ekleyemiyorum yada değişklik yapamıyorum ve special_item_group.txt dosyasına yeni bir ekleme yapılmıyor bu konuda bana yardımcı olacak biri varmı acaba
admin panelinden 666 genarete yaptıktan sonra item_names.txt item_proto.txt mob_names.txt mob_proto.txt geliyor ama sysr den böyle bir hata ile karşılaşıyorum
SYSERR: Jun 17 00:22:01 :: socket_connect: HOST 127.0.0.1:30000, could not connect.
 
Son düzenleme:
gen.py:
Genişlet Daralt Kopyala
#!/usr/local/bin/python2.7
#### @martysama0134 start scripts ####
### TODO:
## clean how rawly CONFIG is shown in code
## find solution for common cores and not PORT.RANDOM ports
## separate database

from gen_settings import *

portlist={}
clearlist=[]
startlist=[]

def SlashFix(pathname):
    if v_system in ("FreeBSD", "Linux"):
        return pathname.replace("\\", "/")
    elif v_system=="Windows":
        return pathname.replace("/", "\\")
    return pathname

def CreateFolder(foldername):
    foldername = SlashFix(foldername)
    if v_system in ("FreeBSD", "Linux"):
        fShell("mkdir -p %s" % (foldername))
    elif v_system=="Windows":
        fShell("mkdir %s" % (foldername))

def CreateEmptyFile(filename):
    filename = SlashFix(filename)
    if v_system in ("FreeBSD", "Linux"):
        fShell("cat /dev/null > %s" % (filename))
    elif v_system=="Windows":
        fShell("type Nul > %s" % (filename))

def TouchFile(filename):
    filename = SlashFix(filename)
    if v_system in ("FreeBSD", "Linux"):
        fShell("touch %s" % (filename))
    elif v_system=="Windows":
        fShell("type Nul >> %s" % (filename))

def Append2File(txt, filename):
    filename = SlashFix(filename)
    fShell("echo %s >> %s" % (txt, filename))

def DeleteFile(filename):
    filename = SlashFix(filename)
    if v_system in ("FreeBSD", "Linux"):
        fShell("rm -rf %s" % (filename))
    elif v_system=="Windows":
        fShell("del /SF %s" % (filename))

def SymLinkCreate(src, dst, is_file):
    src = SlashFix(src)
    dst = SlashFix(dst)
    if v_system=="FreeBSD":
        fShell("ln -Ffnsw %s %s" % (src, dst))
    elif v_system=="Linux":
        fShell("ln -Ffns %s %s" % (src, dst))
    elif v_system=="Windows":
        if is_file:
            fShell("mklink %s %s" % (dst, src))
        else:
            fShell("mklink /D %s %s" % (dst, src))

def SymLinkCreateDir(src, dst):
    SymLinkCreate(src, dst, is_file=False)

def SymLinkCreateFile(src, dst):
    SymLinkCreate(src, dst, is_file=True)

def SymLinkCreateFileExe(src, dst):
    if v_system=="Windows":
        dst+=".exe"
    SymLinkCreate(src, dst, is_file=True)

def WriteHostConfig(szConfFile, szGameName):
    Append2File("HOSTNAME: %s" % (szGameName), "%s" % (szConfFile))

def WriteChannelConfig(szConfFile, dwChannel):
    if dwChannel==M2TYPE.NOCHAN:
        dwChannel=1
    Append2File("CHANNEL: %u" % (dwChannel), "%s" % (szConfFile))

def WriteMapConfig(szConfFile, szMapList):
    if len(szMapList.split())>=32:
        print "WARNING: MORE THAN 32 MAPS INSIDE:", szConfFile
    Append2File("MAP_ALLOW: %s" % (szMapList), "%s" % (szConfFile))

def WritePortConfig(szConfFile, wGenPort, dwType, dwPortType=None):
    if dwType==M2TYPE.DB:
        Append2File("%s = %u" % (PORT.lPORT[PORT.BIND_PORT], wGenPort), "%s" % (szConfFile))
    elif dwType==M2TYPE.CORE or dwType==M2TYPE.AUTH:
        Append2File("%s: %u" % (PORT.lPORT[dwPortType], wGenPort), "%s" % (szConfFile))

def genWriteConfig(szConfFile, tuSubConfTable):
    for val1 in tuSubConfTable:
        Append2File("%s" % ((val1[0] % val1[1])), "%s" % (szConfFile))

def genMakeConfig(szConfFile, diConfTable, bIsExtra=False, dwType=None):
    genWriteConfig(szConfFile, diConfTable["general"])
    if bIsExtra:
        genWriteConfig(szConfFile, diConfTable["extra"])
    if dwType!=None:
        genWriteConfig(szConfFile, diConfTable[dwType])

def genGetRandPort(dwType):
    wTmpPort = PORT.RANDOMI
    while(True):
        if wTmpPort in portlist:
            wTmpPort+=1
            continue
        else:
            portlist[wTmpPort]=dwType
            break
    return wTmpPort

def genGenM2List():
    from json import dumps as j_dumps
    with open("start.list", "wb") as fList: #b for unix end line
        fList.write(j_dumps(startlist, indent=4))
    with open("clear.list", "wb") as fList: #b for unix end line
        fList.write(j_dumps(clearlist, indent=4))

def genGenIpfwList():
    def Joi(mList):
        return ' '.join(str(v) for v in mList)
    szRules=CustIpfwList%(Joi(udp_yes_ports), Joi(tcp_yes_ports), Joi(tcp_nop_ports))
    with open("ipfw.rules", "wb") as fIpfw: #b for unix end line
        fIpfw.write(szRules)
        # fIpfw.write(szRules.replace("\r", ""))

def genInit():
    # clean port list
    global portlist
    portlist.clear()
    # clean start/clear list
    global startlist, clearlist
    del startlist[:]
    del clearlist[:]
    # clean ipfw list
    global udp_yes_ports,tcp_yes_ports,tcp_nop_ports
    del udp_yes_ports[:]
    del tcp_yes_ports[:]
    del tcp_nop_ports[:]

def genInitSrv(szSvr):
    #
    for val1 in ("share/data","share/locale","share/package","share/panama","share/conf","share/bin"):
        CreateFolder("%s/%s"%(szSvr, val1))
        # print "%s/%s"%(szSvr, val1)
    #
    for val1 in ("share/conf/BANIP","share/conf/CMD","share/conf/CRC","share/conf/VERSION","share/conf/state_user_count","share/bin/db","share/bin/game"):
        TouchFile("%s/%s" % (szSvr, val1))
        # print "%s/%s"%(szSvr, val1)
    #
    for val1 in ("share/conf/item_names.txt","share/conf/item_proto.txt","share/conf/mob_names.txt","share/conf/mob_proto.txt"):
        TouchFile("%s/%s" % (szSvr, val1))
        # print "%s/%s"%(szSvr, val1)
#global single server rules
genConfig = {}
genConfig["all"] = {}
#for ipfw rules
udp_yes_ports=[]
tcp_yes_ports=[]
tcp_nop_ports=[]

def genCalcParentRet(szParentName):
    return szParentName.count("/")*v_chalS

def genMain(oSub={}, szParentName=[]):
    global genConfig
    global startlist, clearlist
    global udp_yes_ports, tcp_yes_ports, tcp_nop_ports
    if not oSub:
        oSub=M2S
        genInit()
    for v1 in oSub:
        k1=v1["name"]
        listTmpParentName=list(szParentName)    # list() to bypass variable passed by reference to value
        listTmpParentName.append(k1)
        szTmpParentName=("/".join(listTmpParentName))
        # DeleteFile("%s" % szTmpParentName) # completely unsafe
        CreateFolder("%s" % szTmpParentName)
        # print szTmpParentName
        if v1["type"]==M2TYPE.DB:
            k1s=genConfig["active"]
            #logs make paths
            CreateFolder("%s/%s/%s/cores" % (k1s, v_lognS, szTmpParentName))
            CreateFolder("%s/%s/%s/log" % (k1s, v_lognS, szTmpParentName))
            TouchFile("%s/%s/%s/PTS" % (k1s, v_lognS, szTmpParentName))
            #logs sym paths
            SymLinkCreateDir("../%s/%s/cores" % (v_lognS, szTmpParentName), "%s/cores" % (szTmpParentName))
            SymLinkCreateDir("../%s/%s/log" % (v_lognS, szTmpParentName), "%s/log" % (szTmpParentName))
            SymLinkCreateFile("../%s/%s/PTS" % (v_lognS, szTmpParentName), "%s/PTS" % (szTmpParentName))
            szDbName="%s-%s"%(genConfig["active"], k1)
            SymLinkCreateFileExe("../share/bin/db", "%s/%s" % (szTmpParentName,szDbName))
            #start/logs track
            startlist.append(
                {
                    "path":szTmpParentName,
                    "name":szDbName,
                    "type":M2TYPE.DB,
                    "chan":M2TYPE.NOCHAN,
                    "serv":genConfig["active"],
                }
            )
            clearlist.append(
                {
                    "path":"%s/%s/%s"%(k1s, v_lognS, szTmpParentName),
                    "type":M2TYPE.DB,
                    "chan":M2TYPE.NOCHAN,
                    "serv":genConfig["active"],
                }
            )
            #@item/mob protos .txt
            SymLinkCreateFile("../share/conf/item_names.txt", "%s/item_names.txt" % (szTmpParentName))
            SymLinkCreateFile("../share/conf/item_proto.txt", "%s/item_proto.txt" % (szTmpParentName))
            SymLinkCreateFile("../share/conf/mob_names.txt", "%s/mob_names.txt" % (szTmpParentName))
            SymLinkCreateFile("../share/conf/mob_proto.txt", "%s/mob_proto.txt" % (szTmpParentName))
            #@CONFIG details
            CreateEmptyFile("%s/conf.txt"%(szTmpParentName))
            genMakeConfig("%s/conf.txt"%szTmpParentName, v1["config"], genConfig["all"][genConfig["active"]]["isextra"])
            if v1["port"]==PORT.RANDOM:
                genConfig["all"][genConfig["active"]]["db_port"]=genGetRandPort(v1["type"])
            else:
                genConfig["all"][genConfig["active"]]["db_port"]=v1["port"]
            WritePortConfig("%s/conf.txt"%szTmpParentName, genConfig["all"][genConfig["active"]]["db_port"], v1["type"], PORT.BIND_PORT)
            #add to ipfw rules
            tcp_nop_ports.append(genConfig["all"][genConfig["active"]]["db_port"])
        elif v1["type"]==M2TYPE.CHANFOLDER or v1["type"]==M2TYPE.CHANNEL:
            if v1["type"]==M2TYPE.CHANNEL:
                genConfig["all"][genConfig["active"]]["chan"]=v1["chan"]
            if v1["type"]==M2TYPE.CHANFOLDER:
                genConfig["all"][genConfig["active"]]["mark"]="%s/mark"%szTmpParentName
                CreateFolder("%s" % genConfig["all"][genConfig["active"]]["mark"])
            genMain(v1["sub"], listTmpParentName)
        elif v1["type"]==M2TYPE.SERVER:
            genInitSrv(szTmpParentName)
            genConfig["active"]=v1["name"]
            genConfig["all"][v1["name"]]={}
            genConfig["all"][v1["name"]]["isextra"]=v1["isextra"]
            genConfig["all"][v1["name"]]["mark"]="%s/mark"%szTmpParentName
            genMain(v1["sub"], listTmpParentName)
        elif v1["type"]==M2TYPE.AUTH or v1["type"]==M2TYPE.CORE:
            k1s=genConfig["active"]
            #logs make paths
            CreateFolder("%s/%s/%s/cores" % (k1s, v_lognS, szTmpParentName))
            CreateFolder("%s/%s/%s/log" % (k1s, v_lognS, szTmpParentName))
            TouchFile("%s/%s/%s/PTS" % (k1s, v_lognS, szTmpParentName))
            #logs sym paths
            gCPR=genCalcParentRet(szTmpParentName)
            SymLinkCreateDir("%s%s/%s/cores" % (gCPR,v_lognS,szTmpParentName), "%s/cores" % (szTmpParentName))
            SymLinkCreateDir("%s%s/%s/log" % (gCPR,v_lognS,szTmpParentName), "%s/log" % (szTmpParentName))
            SymLinkCreateFile("%s%s/%s/PTS" % (gCPR,v_lognS,szTmpParentName), "%s/PTS" % (szTmpParentName))
            #dirs sym paths
            SymLinkCreateDir("%sshare/data" % (gCPR), "%s/data" % (szTmpParentName))
            SymLinkCreateDir("%sshare/locale" % (gCPR), "%s/locale" % (szTmpParentName))
            SymLinkCreateDir("%sshare/package" % (gCPR), "%s/package" % (szTmpParentName))
            SymLinkCreateDir("%sshare/panama" % (gCPR), "%s/panama" % (szTmpParentName))
            #files sym paths
            SymLinkCreateFile("%sshare/conf/CMD" % (gCPR), "%s/CMD" % (szTmpParentName))
            SymLinkCreateFile("%sshare/conf/CRC" % (gCPR), "%s/CRC" % (szTmpParentName))
            SymLinkCreateFile("%sshare/conf/VERSION" % (gCPR), "%s/VERSION" % (szTmpParentName))
            SymLinkCreateFile("%sshare/conf/state_user_count" % (gCPR), "%s/state_user_count" % (szTmpParentName))
            if v1["type"]==M2TYPE.AUTH:
                SymLinkCreateFile("%sshare/conf/BANIP" % (gCPR), "%s/BANIP" % (szTmpParentName))
            if v1["type"]==M2TYPE.AUTH:
                szGameName="%s-%s"%(genConfig["active"], k1)
            else:
                szGameName="%s-ch%u-%s"%(genConfig["active"], genConfig["all"][genConfig["active"]]["chan"], k1)
            #mark sym path
            if v1["type"]==M2TYPE.CORE:
                gCPR2=genCalcParentRet(genConfig["all"][genConfig["active"]]["mark"])
                SymLinkCreateDir("%smark" % gCPR2, "%s/mark" % (szTmpParentName))
            #core sym path
            SymLinkCreateFileExe("%sshare/bin/game" % (gCPR), "%s/%s" % (szTmpParentName, szGameName))
            #start/logs track
            if v1["type"]==M2TYPE.AUTH:
                kh1=M2TYPE.NOCHAN
            else:
                kh1=genConfig["all"][genConfig["active"]]["chan"]
            startlist.append(
                {
                    "path":szTmpParentName,
                    "name":szGameName,
                    "type":v1["type"],
                    "chan":kh1,
                    "serv":genConfig["active"],
                }
            )
            clearlist.append(
                {
                    "path":"%s/%s/%s"%(k1s, v_lognS, szTmpParentName),
                    "type":v1["type"],
                    "chan":kh1,
                    "serv":genConfig["active"],
                }
            )
            #@CONFIG details
            CreateEmptyFile("%s/CONFIG" % (szTmpParentName))
            genMakeConfig("%s/CONFIG"%szTmpParentName, v1["config"], genConfig["all"][genConfig["active"]]["isextra"], v1["type"])
            WriteHostConfig("%s/CONFIG"%szTmpParentName, szGameName)
            WriteChannelConfig("%s/CONFIG"%szTmpParentName, kh1)
            if not v1["type"]==M2TYPE.AUTH:
                WriteMapConfig("%s/CONFIG"%szTmpParentName, v1["maps"])
            # w/o array, only if
            wTmpPort={}
            # PORT process
            if v1["port"]==PORT.RANDOM:
                wTmpPort[PORT.PORT]=genGetRandPort(v1["type"])
            else:
                wTmpPort[PORT.PORT]=v1["port"]
            WritePortConfig("%s/CONFIG"%szTmpParentName, wTmpPort[PORT.PORT], v1["type"], PORT.PORT)
            # P2P_PORT process
            if v1["p2p_port"]==PORT.RANDOM:
                wTmpPort[PORT.P2P_PORT]=genGetRandPort(v1["type"])
            else:
                wTmpPort[PORT.P2P_PORT]=v1["p2p_port"]
            WritePortConfig("%s/CONFIG"%szTmpParentName, wTmpPort[PORT.P2P_PORT], v1["type"], PORT.P2P_PORT)
            # DB_PORT process
            wTmpPort[PORT.DB_PORT]=genConfig["all"][genConfig["active"]]["db_port"]
            WritePortConfig("%s/CONFIG"%szTmpParentName, wTmpPort[PORT.DB_PORT], v1["type"], PORT.DB_PORT)
            #add to ipfw rules
            if v1["type"]==M2TYPE.AUTH:
                udp_yes_ports.append(wTmpPort[PORT.PORT])
            tcp_yes_ports.append(wTmpPort[PORT.PORT])
            tcp_nop_ports.append(wTmpPort[PORT.P2P_PORT])
            pass
        else:
            print "unrecognized type %u"%v1["type"]
    #end

def genList(bIsVerbose=False):
    if bIsVerbose:
        print "startlist:"
        for i in startlist:
            print "---", i, "---"
        print "clearlist:"
        for i in clearlist:
            print "---", i, "---"
        print "udp_yes_ports:"
        for i in udp_yes_ports:
            print "---", i, "---"
        print "tcp_yes_ports:"
        for i in tcp_yes_ports:
            print "---", i, "---"
        print "tcp_nop_ports:"
        for i in tcp_nop_ports:
            print "---", i, "---"
    genGenM2List()
    genGenIpfwList()

def genGen():
    genMain()
    genList(True)


if __name__ == "__main__":
    genGen()
#
gen_settings.py:
Genişlet Daralt Kopyala
#### @martysama0134 start scripts ####
from platform import system as p_system
v_system = p_system()

from subprocess import check_output as sp_co, call as sp_call, CalledProcessError as sp_CalledProcessError
def fShell(szCmd, bRet=False):
    try:
        if bRet:
            return sp_co(szCmd, shell=True)[:-1]    # remove final \n
        else:
            return sp_call(szCmd, shell=True)
    except sp_CalledProcessError:
        return -1

if v_system=="FreeBSD":
    v_admusrS=fShell("ifconfig em0 | grep -Eo 'inet ([0-9]{1,3}\.){3}([0-9]{1,3})' | awk '{print $2}'", True)
elif v_system=="Linux":
    v_admusrS=fShell("ifconfig eth0 | grep -Eo 'inet addr:([0-9]{1,3}\.){3}([0-9]{1,3})' | awk -F':' '{print $2}'", True)
elif v_system=="Windows":
    v_admusrS="127.0.0.1"

v_admpwdS='58948HG83H4G8H84G'                #adminpage_password
v_svrhstS='localhost'                        #host for sql connections
v_svrdttS='metin2 ASSBDAS!#FSABFASI!#JYXYXKAFAF'                            #user&pwd for sql connections
v_svrdtaS="%s %s"%(v_svrhstS, v_svrdttS)    #host, user and pwd for db sql connections

v_dbhstS='127.0.0.1'#default hostname for db
v_dbipS=30000        #default port for db (the others will be automatically calculated)
v_lognS='logs'        #name of the all_log path
v_chanS='channel/'        #name of the channel path
v_chalS='../'        #workaround that should be equivalent to $v_charS paths per ../

M2SD = {
    "account":        "account",
    "common":        "common",
    "hotbackup":    "hotbackup",
    "log":            "log",
    "player":        "player",
}

class M2TYPE:
    SERVER, DB, AUTH, CHANFOLDER, CHANNEL, CORE = xrange(6)
    NOCHAN = 0

class PORT:
    RANDOMI = v_dbipS    # a random port will start from such value
    RANDOM = 0
    PORT, P2P_PORT, DB_PORT, BIND_PORT = xrange(4)
    lPORT = ("PORT", "P2P_PORT", "DB_PORT", "BIND_PORT")

M2CONFIG = {
    "db": {
        "general": (
            ("SQL_ACCOUNT = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["account"], v_svrdttS)),
            ("SQL_COMMON = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["common"], v_svrdttS)),
            ("SQL_PLAYER = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["player"], v_svrdttS)),
            ("SQL_HOTBACKUP = \\\"%s %s %s 0\\\"", (v_svrhstS, M2SD["hotbackup"], v_svrdttS)),
            ("TABLE_POSTFIX = \\\"%s\\\"", ("")),
            # ("BIND_PORT = %s", (v_dbipS,)),
            # ("DB_SLEEP_MSEC = 10", ()),
            ("CLIENT_HEART_FPS = %u", (25)),
            # ("HASH_PLAYER_LIFE_SEC = %u", (600)),
            ("PLAYER_ID_START = %u", (1000)),
            ("PLAYER_DELETE_LEVEL_LIMIT = %u", (70)),
            # ("PLAYER_DELETE_LEVEL_LIMIT_LOWER = %u", (15)),
            ("ITEM_ID_RANGE = %u %u ", (100000000, 200000000)),
            # ("BACKUP_LIMIT_SEC = %u", (3600)),
            ("DISABLE_HOTBACKUP = %u", (True)),
            ("LOCALE = %s", ("latin1")),
        ),
        "extra": (
            ("PROTO_FROM_DB = %u", (False)),
            ("MIRROR2DB = %u", (True)),
            # ("BIND_IP = %u", (192.168.0.190)),
        )
    },
    "core": {
        M2TYPE.AUTH: (
            ("AUTH_SERVER: %s", ("master")),
            ("PLAYER_SQL: %s %s", (v_svrdtaS, M2SD["account"])),
        ),
        M2TYPE.CORE: (
            ("PLAYER_SQL: %s %s", (v_svrdtaS, M2SD["player"])),
        ),
        "general": (
            # ("TABLE_POSTFIX: %s", ("")),
            # ("ITEM_ID_RANGE: %u %u", (5000001, 10000000)),
            ("VIEW_RANGE: %u", (10000)),
            ("PASSES_PER_SEC: %u", (25)),
            ("SAVE_EVENT_SECOND_CYCLE: %u", (180)),
            ("PING_EVENT_SECOND_CYCLE: %u", (180)),
            ("DB_ADDR: %s", (v_dbhstS)),
            ("COMMON_SQL: %s %s", (v_svrdtaS, M2SD["common"])),
            ("LOG_SQL: %s %s", (v_svrdtaS, M2SD["log"])),
            # ("TEST_SERVER: %d", (True)),
            # ("PK_SERVER: %d", (True)),
            ("ADMINPAGE_IP1: %s", (v_admusrS)),
            ("ADMINPAGE_PASSWORD: %s", (v_admpwdS)),
            ("MAX_LEVEL: %u", (120)),
        ),
        "extra": (
            # ("CHECK_VERSION_SERVER: %u", (True)),
            # ("CHECK_VERSION_VALUE: %u", (1215955205)),
            ("CHANGE_ATTR_TIME_LIMIT: %u", (False)),
            ("EMOTION_MASK_REQUIRE: %u", (False)),
            ("PRISM_ITEM_REQUIRE: %u", (False)),
            ("SHOP_PRICE_3X_TAX: %u", (False)),
            ("ENABLE_GLOBAL_SHOUT: %u", (1)),
            ("GLOBAL_SHOUT: %u", (True)),
            ("ITEM_COUNT_LIMIT: %u", (250)),
            ("STATUS_POINT_GET_LEVEL_LIMIT: %u", (120)),
            ("STATUS_POINT_SET_MAX_VALUE: %u", (90)),
            ("SHOUT_LIMIT_LEVEL: %u", (15)),
            ("SHOUT_LIMIT_TIME: %u", (5)),
            ("DB_LOG_LEVEL: %u", (1)),
            ("EMPIRE_LANGUAGE_CHECK: %u", (True)),
            # ("ITEM_DESTROY_TIME_AUTOGIVE: %u", (15)),
            # ("ITEM_DESTROY_TIME_DROPITEM: %u", (5)),
            # ("ITEM_DESTROY_TIME_DROPGOLD: %u", (15)),
            ("PK_PROTECT_LEVEL: %u", (20)),
            ("ADDSTONE_FAILURE0: %u", (80)),
            ("ADDSTONE_FAILURE1: %u", (70)),
            ("ADDSTONE_FAILURE2: %u", (60)),
            ("ADDSTONE_FAILURE3: %u", (50)),
            ("ADDSTONE_FAILURE4: %u", (40)),
            ("START_GOLD: %u", (500)),
            #("HACKSHIELD_ENABLE: %u", (1)),
            #("CHECK_MULTIHACK: %u", (1)),
            ("TRADE_EFFECT: %u", (1)),
            ("ATTR_ALWAYS_5_ADD: %u", (1)),
            ("PROTECT_NORMAL_PLAYER: %u", (1)),
            ("DISABLE_PRISM_ITEM: %u", (0)),
            #("BLOCK_CHAR_CREATION: %u", (0)),
            ("SKILLBOOK_NEED_EXP: %u", (20000)),
            ("SKILLBOOK_NEXTREAD_MIN: %u", (28800)),
            ("SKILLBOOK_NEXTREAD_MAX: %u", (43200)),
            ("BLOCK_POTIONS_IN_DUELL: %u", (1)),
            ("IMMUN_RATE: %u", (100)),
            ("MAX_ADDON_FKS: %u", (35)),
            ("MAX_ADDON_DSS: %u", (40)),
            ("PC_MAX_MOVEMENT_SPEED: %u", (200)),
            ("PC_MAX_ATTACK_SPEED: %u", (200)),
            ("MOB_MAX_MOVEMENT_SPEED: %u", (250)),
            ("MOB_MAX_ATTACK_SPEED: %u", (250)),
        ),
    },
}

COMMONCHAN=(
    {
        "name": "core1",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "1 2 3 4 6",
    },
    {
        "name": "core2",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "21 22 23 24 26",
    },
    {
        "name": "core3",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "41 42 43 44 46",
    },
    {
        "name": "core4",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "61 62 63 64 65 66 67 68 69 70 81 180 218 252 302 303 304 318",
    },
    {
        "name": "core5",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "101 103 105 110 111 114 118 119 120 121 122 123 124 125 126 127 128 253 254 255 256 257 353 354 356 403 404",
    },
    # {
        # "name": "core3",
        # "type": M2TYPE.CORE,
        # "port": PORT.RANDOM,
        # "p2p_port": PORT.RANDOM,
        # "config": M2CONFIG["core"],
        # "maps": "",
    # },
)

# PREMIUMCHAN=(
    # {
        # "name": "core1",
        # "type": M2TYPE.CORE,
        # "port": PORT.RANDOM,
        # "p2p_port": PORT.RANDOM,
        # "config": M2CONFIG["core"],
        # "maps": "1 21 41 3 23 43 4 24 44 5 25 45 108 109 112",
    # },
    # {
        # "name": "core2",
        # "type": M2TYPE.CORE,
        # "port": PORT.RANDOM,
        # "p2p_port": PORT.RANDOM,
        # "config": M2CONFIG["core"],
        # "maps": "61 62 63 64 65 66 67 68 69 70 71 72 73 206 104 193 207",
    # },
# )

CHAN99=(
    {
        "name": "core99",
        "type": M2TYPE.CORE,
        "port": PORT.RANDOM,
        "p2p_port": PORT.RANDOM,
        "config": M2CONFIG["core"],
        "maps": "5 25 45 66 71 72 73 100 104 107 108 109 112 113 181 182 183 208 216 217 250 251 351 352 355",
    },
)

M2S=(
    {
        "name": "game",
        "type": M2TYPE.SERVER,
        "isextra": True,
        "sub": (
            {
                "name": "db",
                "type": M2TYPE.DB,
                "port": PORT.RANDOM,
                "config": M2CONFIG["db"],
            },
            {
                "name": "auth",
                "type": M2TYPE.AUTH,
                "port": PORT.RANDOM,
                "p2p_port": PORT.RANDOM,
                "config": M2CONFIG["core"],
            },
            {
                "name": "chan",
                "type": M2TYPE.CHANFOLDER,
                "sub": (
                    {
                        "name": "ch1",
                        "type": M2TYPE.CHANNEL,
                        "chan": 1,
                        "sub": COMMONCHAN,
                    },
                    {
                        "name": "ch2",
                        "type": M2TYPE.CHANNEL,
                        "chan": 2,
                        "sub": COMMONCHAN,
                    },
                    # {
                        # "name": "ch3",
                        # "type": M2TYPE.CHANNEL,
                        # "chan": 3,
                        # "sub": COMMONCHAN,
                    # },
                    # {
                        # "name": "ch4p",
                        # "type": M2TYPE.CHANNEL,
                        # "chan": 4,
                        # "sub": PREMIUMCHAN,
                    # },
                    {
                        "name": "ch99",
                        "type": M2TYPE.CHANNEL,
                        "chan": 99,
                        "sub": CHAN99,
                    },
                )
            }
        )
    },
)

CustIpfwList="""#!/bin/sh
IPF="ipfw -q add"
ipfw -q -f flush

#loopback
$IPF 10 allow all from any to any via lo0
$IPF 20 deny all from any to 127.0.0.0/8
$IPF 30 deny all from 127.0.0.0/8 to any
$IPF 40 deny tcp from any to any frag

# stateful
$IPF 50 check-state
$IPF 60 allow tcp from any to any established
$IPF 70 allow all from any to any out keep-state
$IPF 80 allow icmp from any to any

# open port ftp (20, 21), ssh (22), mail (25)
# http (80), https (443), dns (53), mysql (3306)
default_udp_yes_ports='53'
default_tcp_yes_ports='22 53 3306'
default_tcp_no_ports=''

# here auth PORTs for "NORM"/"..." thing
metin2_udp_yes_ports='%s'
# here PORTs
metin2_tcp_yes_ports='%s'
# here DB_PORTs and P2P_PORTs
metin2_tcp_no_ports='%s'

# merge lists
udp_yes_ports="$default_udp_yes_ports $metin2_udp_yes_ports"
tcp_yes_ports="$default_tcp_yes_ports $metin2_tcp_yes_ports"
tcp_nop_ports="$default_tcp_no_ports $metin2_tcp_no_ports"

# white ip list
white_sites=''

# block tcp/udp ports
for val in $tcp_nop_ports; do
    $IPF 2220 allow all from 127.0.0.0/8 to any $val
    for whitez in $white_sites; do
        $IPF 2210 allow tcp from $whitez to any $val in
        $IPF 2210 allow tcp from 127.0.0.0/8 to $whitez $val out
    done
    $IPF 2230 deny all from any to me $val
done
# unblock tcp ports
for val in $tcp_yes_ports; do
    $IPF 2200 allow tcp from any to any $val in limit src-addr 20
    $IPF 2210 allow tcp from any to any $val out
done
# unblock udp ports
for val in $udp_yes_ports; do
    $IPF 2200 allow udp from any to any $val in limit src-addr 20
    $IPF 2210 allow udp from any to any $val out
done
"""
WinSCP ile /usr/home/game/db ve /usr/home/game/share/conf klasöründe item_names.txt item_proto.txt mob_names.txt mon_proto.txt yok hali ile düzenleme yapamıyorum
yeni bir item veya yeni bir mob ekleyemiyorum yada değişklik yapamıyorum ve special_item_group.txt dosyasına yeni bir ekleme yapılmıyor bu konuda bana yardımcı olacak biri varmı acaba
admin panelinden 666 genarete yaptıktan sonra item_names.txt item_proto.txt mob_names.txt mob_proto.txt geliyor ama sysr den böyle bir hata ile karşılaşıyorum
SYSERR: Jun 17 00:22:01 :: socket_connect: HOST 127.0.0.1:30000, could not connect.
zaten elinde item proto mob proto vs. yoksa bu hatayı alman normal hocam 666 generate yaptığında symlink ile kısayol oluşturuyor sadece eğer dosya yoksa kısayolda oluşturmaz oluştursada boş olur anlayacağınız
 
Geri
Üst