[RELEASE] Archívum

Indította Eraman, 2017-07-11, 13:13:18

2017-07-11, 13:13:18 Utolsó szerkesztés: 2018-09-06, 05:43:57 Szerző: [MOD]Ken
Sziasztok!

Azt vettem észre, hogy rengetegen keresnek olyan funkciót, mely az összes tagot egy csoportban elrepíti bárhová.
Nos, nekem is szükségem volt rá, ezért gyorsan írtam egy egyszerűt magamnak és gondoltam megosztom veletek:

function party_warp(x,y)
if party.is_party() then
local pids = {party.get_member_pids()}
for pid in pids do
local player_name = tostring(mysql_query('SELECT name FROM player.player WHERE id="'..tonumber(pid)..'";')[1][1])
pc.select(find_pc_by_name(player_name))
pc.warp(x,y)
end
end
end


Használata pofon egyszerű. Ahogyan a pc.warp() funkciót kell használni.

például: party_warp(590500, 110500) <- [usually] démon torony

2017-07-14, 15:03:58 #1 Utolsó szerkesztés: 2017-07-14, 15:13:06 Szerző: Eraman
Egy kis könnyítés a quest íróknak.

Nexus topicja alapján csináld meg ezt:
http://metin2hungary.net/index.php/topic,199084.msg1053150.html#msg1053150

Ez után (mivel én WinSCP-t használok ezért erre írom a segítséget) ajánlom, hogy töltsd le a WinSCP-t. Van portable verzió is. Szerintem az egyik legegyszerűbben használható a csatlakozásra.

Miután meg van a WinSCP-d és sikeresen felcsatlakoztál a szerveredre, akkor végezd el a következő lépéseket:
Jobb oldali eszköztár -> Edit ->  Configure -> (Ha jól tudom egyből az Editors fül jön elő tehát semmi dolgod a navigálással kapcsolatban. Ha mégis, akkor Editors fülön belül) Katt az Internal Editor-ra -> Edit -> Jelöld ki az External editor-t és tallózd be a notepad++ executable fájlt.

Lépés 1:

Lépés2:

Lépés3:




Kész. Immár dupla kattintás a quest-re és egyből a notepad++-ban szerkesztheted/módosíthatod őket.

2017-07-16, 00:22:19 #2 Utolsó szerkesztés: 2017-07-17, 13:08:01 Szerző: Eraman
[EDIT]: Nos ahogy ígértem, átnéztem az irományom.
Nagyjából 10 perc alatt elsajátítottam a python fortélyait és kijavítottam a rendszerben a hibákat. Mellékeltem legalulra a működő questet is.

Sziasztok!

Egy nagyon finom dolgot hoztam nektek, ami nem más, mint egy gyönyörű teleport rendszer:


1. Csomagold ki:
root.eix/epk

2. Töltsd le: https://mega.nz/#!XRBQVJ7Z!9DGdHGkTyjA-eEiQSMq7_zCRmNfVuMW-SxkUKu6Bydo [EDIT]
A quest legalul!!

  • Csomagold ki
  • A teleport mappában lévő fájlokat (teleport.lua kivételével) tedd a root mappába

  • 2. Nyisd meg ezt: (notepad++)
    game.py

    3. Az utolsó import alá illeszd be ezt:
    import uiteleport
    4. Keress rá erre:
    self.__ProcessPreservedServerCommand()
    5.Írd alá ezt:
    self.teleport = uiteleport.TeleportWindow()
    6.Keres rá erre:
    __ServerCommand_Build
    7.Írd alá ezt:
    "Teleport"                : self.Teleport,
    "Teleport_get_map_index" :self.__TeleportGetInfo,
    "INPUT_BLOCK_ON" : self.__Input_block_on,
    "INPUT_BLOCK_OFF" : self.__Input_block_off,


    7.1
    ÍRD!!!!!! a végére ezeket:
    def __Input_block_on(self):
    constInfo.CApiSetHide = 1

    def __Input_block_off(self):
    constInfo.CApiSetHide=0


    8.Keress rá erre:
    OpenQuestWindow(self, skin, idx):

    ezt kell látnod:
    OpenQuestWindow(self, skin, idx):
    .
    .
    .
             self.interface.OpenQuestWindow(skin, idx)


    8.1 Fölé írd ezt: [EDITED]
    def __TeleportGetInfo(self):
                    constInfo.SendString = str(self.teleport.SendToServer)
    net.SendQuestInputStringPacket(str(constInfo.SendString))


    9.Írd át erre: (ismétlem: ÍRD, NE MÁSOLD) [EDITED]
    def OpenQuestWindow(self, skin, idx):
    if constInfo.CApiSetHide == 1:
    self.__TeleportGetInfo
    constInfo.CApiSetHide = 0
    return
    else:
    self.interface.OpenQuestWindow(skin, idx)

    10. Ez utóbbi alá írd ezt:
    [TAB]def Teleport(self, getString):[NINCS WHITESPACE KARAKTER] 
    [TAB][TAB]if getString.find("index") != -1:[NINCS WHITESPACE KARAKTER] 
    [TAB][TAB][TAB] self.teleport.UpdateIndex(int(getString.split("x")[1]))[NINCS WHITESPACE KARAKTER] 
    [TAB][TAB]else:[NINCS WHITESPACE KARAKTER]
    [TAB][TAB][TAB]constInfo.CApiSetHide = 1[NINCS WHITESPACE KARAKTER] 

    11. Nyisd meg ezt:
    constinfo.py
    add hozzá ezt a két sort:
    CApiSetHide = 0
    SendString = ""

    12. Végül írjunk rá egy gombot amivel előhívhatjuk:
    Keress erre:
    __BuildKeyDict(self):
    Tekerj az utolsó hasonló kódhoz és add hozzá ezt (ha még nincs, ha van akkor Press[gomb]Key):
    onPressKeyDict[app.DIK_T][TAB][TAB][TAB]= lambda : self.__PressLKey()
    Most pedig írd meg a funkciót:
    def __PressLKey(self):
    if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
    if player.IsMountingHorse():
    net.SendChatPacket("/unmount")
    else:
    self.teleport.Open()



    Kész. Ha mindent jól csináltál, akkor játékon belül CTRL + a billentyű , amire megírtad előhozza majd ezt:


    Vagy legalábbis valami hasonlót..

    Végül pedig finomíts a melléket questen.

    Amennyiben nem sikerült, akkor az első és a legfontosabb amit leellenőrizz, hogy helyesek-e a bekezdéseid a beszúrt kódrészekben, hiszen python-ról beszélünk. Nem véletlenül írtam oda néhány részhez a tabolásokat, illetve, hogy ügyelni kell a whitespace karakterekre is.

    Amennyiben sysser-ben: (Azt hiszem) Indentation Exception-t ír, akkor ez a hiba.


    Kellemes hibakeresést!

    [EDIT]

    A quest: https://mega.nz/#!1OpAGBgI!i2qHS744oyzzPsZQoGj126XNVklhVyPIdayBUQFCBl4
    Visszafejtési kulcs:!i2qHS744oyzzPsZQoGj126XNVklhVyPIdayBUQFCBl4

    A quest -> FTP -> quest mappa -> qc és kész.



    [EDIT]: Ha az általam írt questet szeretnéd használni, akkor a hibaüzenetekkor való eltüntetéshez módosítsd a game.py-fájlodban a Teleport funkciót így:

    def Teleport(self, getString):
    if getString.find("index") != -1:
    self.teleport.UpdateIndex(int(getString.split("x")[1]))
    elif getString.find("trigger") != -1:
    self.teleport.Open()
    else:
    constInfo.SendString = str(self.teleport.SendToServer)
    constInfo.CApiSetHide = 1


    Ez után a questben minden hibaüzenet fölé (mielőtt még kiírná a játékosnak) tedd ezt:
    cmdchat("Teleport trigger")

    done.

    Forrás: Epvp




    2017-07-17, 17:54:27 #3 Utolsó szerkesztés: 2017-07-20, 19:16:00 Szerző: Eraman
    ~~~~~~~~~~~~~~~~~~~~~[TANULJUNK PYTHON-T EGYÜTT]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Sziasztok!

    Rengeteg  HOW-TO topic létezik itt,epvp-n,m2dev-en amellyel megtanulsz berakni egy mapet, 4 leltárat, újabb és újabb funkciókat,kinézeteket, de eközben szerintem kevesen mennek végig a forráskódon és értelmezgetik, hogy valójában amikor bemásolnak egy kódrészletet a topic nyitója által leírt helyre, akkor mi fog történni?

    Nos mivel sehol nem találtam python tutorialt, ezért úgy gondoltam elkezdek én egyet.
    Egyelőre még csak az alapokat fogom ennél a résznél taglalni, ami azért szükséges, hogy amikor kicsomagolsz majd egy .e** fájlt és találkozol egy .py kiterjesztésű valamivel, és teljesen véletlenül megnyitod, akkor ne ugorj ki az ablakon, csináltass új személyit, utazz el mexikóba és dobj egy atombombát a számítógépedre, hanem inkább az legyen a reakciód, hogy "Oh itt csak ez történik", "Oh itt meg csak ez".
    Amennyiben ezt a leírást hasznosnak tartjátok és későbbiekben igényt tartanátok arra, hogy metinhez készítsek kisebb leírásokat (pl. hogyan hozz létre egyszerű ablakot, eseménykezelés stb) készítsek akkor azt jelezzétek PÜ-ben egy +1-gyel vagy itt egy +1-gyel.

    Akkor kezdjük is.

    Én python 2.7-et használok. Ehhez fog tartozni a leírásom.

    Egy python program modulokból épül fel. Ez nagyjából ugyan azt jelenti, mint C-ben a .h (header) fájlok, vagy amikor java-ban beimportálsz egy külső forrást.

    A modulok szintén python kódot tartalmaznak tele függvényekkel. Ezek a modulok verziótól függhetnek, illetve bővülhetnek.Léteznek modulok, amelyek specifikusan egy adott OS-re vannak tervezve.

    A python interpreter mondja meg, hogy mely függvényeket tudsz használni alapból (modul importálása nélkül). Ezek a függvények be vannak építve a nyelvbe.
    A python interpreter  röviden és egyszerűen egy értelmező, mely megtudja határozni, hogy milyen OS-el dolgozol és az adott OS-re fordítja a kódot. Az interpreter különbözik egy hagyományos fordítótól! Ez egy olyan nyelvre fordítja a kódot, melyet bármilyen platform értelmezni tud. (ez egy mellékes infó most)

    A python értelmező által definiált alap funkciók:
    abs
    all
    any
    basestring
    bin
    bool
    bytearray
    callable
    chr
    classmethod
    cmp
    compile
    complex
    delattr
    dict
    dir
    divmod
    enumerate
    eval
    execfile
    file
    filter
    float
    format
    frozenset
    getattr
    globals
    hasattr
    hash
    help
    hex
    id
    input
    int
    isinstance
    issubclass
    iter
    len
    list
    locals
    long
    map
    max
    memoryview
    min
    next
    object
    oct
    open
    ord
    pow
    print
    property
    range
    raw_input
    reduce
    reload
    repr
    reversed
    round
    set
    setattr
    slice
    sorted
    staticmethod
    str
    sum
    super
    tuple
    type
    unichr
    unicode
    vars
    xrange
    zip
    __import__


    Beépített konstansok:

    False
    True
    None
    NotImplemented
    Ellipsis
    __debug__


    Változók létrehozása és műveletek:

    pl: x = 5
    Pythonban 4 szám változó van: int,float,long és complex
    int(x)  - x-et decimális számmá alakítja
    float(x) -x-et lebegőpontos számmá alakítja
    long(x) - x-et long számmá alakítja
    complex(x,im) - x-et komplex számmá alakítja (im alapesetben 0)

    extra:
    bin(x) - x-et bináris számmá alakítja
    hex(x) - x-et hexadecimális számmá alakítja

    Operátorok:
    x + y
    x - y
    x * y
    x / y
    x // y ->lefelé kerekített hányados
    -x
    +x
    abs(x)
    c.conjugate() -> ha c egy komplex szám, akkor a konjugáltját adja vissza
    divmod(x,y) -> két számot ad vissza. Az egyik a x//y eredménye a másik a maradék
    pow(x,y) -> x^y
    x**y -> x^y
    x | y -> bitenkénti VAGYolás
    x ^ y -> bitenkénti kizáró VAGYolás
    x & y -> bitenkénti ÉS-elés
    x << n -> x bitjeit balra tolja n értékkel
    x >> n -> x bitjeit jobbra tolja n értékkel
    ~x -> x bitjeit invertálja

    bitek hosszának meghatározása számok esetén:
    int.bit_length()
    long.bit_length()


    Iterációk:


    Ha s lista:
    x in s -> igazat ad vissza, ha x benne van s-ben.
    x not in s -> igazat ad vissza ha x nincs benne s-ben.
    s + t ->  s hozzáfűzése t-hez.
    s * n -> s hozzáadja önmagát önmagához n-szer.
    s[i] -> s-ből kiveszi az i. elemet.
    s[i:j] -> s-ből kiveszi az i-től j-ig terjedő elemeket
    s[i:j:k] -> s-ből kiveszi i-től k-ig minden j-edik elemet.
    len(s) -> a lista hossza
    min(s) -> a legkisebb elem s-ben
    max(s) -> a legnagyobb elem s-ben
    s.index(x) -> az első x elemét adja vissza s-ből
    s.count(x) -> megszámolja az összes x elemet s-ben

    Lassan elérkezünk a lényegi részhez, de még előtte néhány dologgal meg kell ismerkedni.
    Szerkezetek:

    for ciklus;

    for x in s: -> ameddig x elem található s-ben
    for i,x in s: -> ameddig x elem található s-ben i-t növeli 1-gyel

    while ciklus;

    while a: -> ameddig a esemény bekövetkezik.

    if-else ágak;

    if a:
    elif b:
    else c:

    switch-case megvalósítása (kicsit bonyolultabb);

    options = {
    0 : nulla,
    1 : egy,
    2 : ketto,
    3:  harom
    }
    def nulla()
        print "nulla"
    def ketto()
        print "ketto"
    def harom()
        print "harom"

    És ez után így lehet meghívni a funkciókat; options[num]()


    Függvények:

    Függvények létrehozása a def kulcsszóval kezdődik.
    pl:
    def elso()
    def elso(x)
    def elso(*x) -> végtelen paraméter


    Beépített kivételek (Saját kivételkezelésről talán máskor):

    AssertionError
        az assert utasítás sikertelen
    AttributeError
        Helytelen attribútumra való hivatkozás vagy értékadás.
    EOFError
        Közvetlen fájlvége, melyet input() vagy raw_input() generál.
    FloatingPointError
        sikertelen lebegőpontos számítás
    IOError
        I/O-kapcsolatos I/O mûveletek hiba.
    ImportError
        ´import'-álási hiba, nem találja a modult vagy a nevet
    IndexError
        Szekvencia indexelése nem az értéktartományon kívül esik.
    KeyError
        Nem létezõ táblaváltozó (dictionary típusú változó) kulcsra hivatkozunk.
    KeyboardInterrupt
        Felhasználó a megszakítás billentyû esetében (gyakran ´Control-C')
    MemoryError
        Kimerült visszaállíthatatlan memória.
    NameError
        Nem meghatározott lokális vagy globális név keresésekor.
    NotImplementedError
        az örökölt osztályban a megvalósítandó absztrakt metódus nem valósult meg
    OsError
        az operáció rendszerrel kapcsolatos hiba
    OverflowError
        Nagyon nagy aritmetikai mûvelet esetében.
    RuntimeError
        Elavult mindenre használható módszer; helyette definiáljunk egy alkalmas hibaüzenetet.
    StopIteration
        Egy iterator next() metódusa sehova sem mutat
    SyntaxError
        Az elemzõ szintaktikai hibát talált.
    SystemError
        Nem végzetes interpreterhiba, ún. "bug", kérjük jelentse.
    SystemExit
        ´sys.exit()' meghívásakor
    TypeError
        Beépített operátornak vagy függvénynek helytelen típust adunk át.
    UnboundLocalError
        a függvény vagy metódus megpróbál hozzáférni egy lokális változóhoz, de annak nincs értéke
    ValueError
        Argumentum hiba esetén, melyet a TypeError nem tartalmaz vagy annál pontosabban meghatározott.
    ZeroDivisionError
        Osztásnál vagy moduló mûveletnél 0 második argumentum esetében.

    Nos a lényeget azt hiszem leírtam ahhoz, hogy néhány példán keresztül elkezdhessünk programozni.
    Leírás folytatódik..



    Üzenet összefésülés: 2017-07-17, 19:04:58

    ~~~~~~~~~~~~~~~~~~~~~[TANULJUNK PYTHON-T EGYÜTT]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Írjuk meg az első programunkat. Ehhez nem kell más , mint egy notepad++ és a python 2.7
    Notepad++: https://notepad-plus-plus.org/
    x86(32bit windows) : https://www.python.org/ftp/python/2.7/python-2.7.msi
    x64(64bit windows): https://www.python.org/ftp/python/2.7/python-2.7.amd64.msi

    telepítsd őket, majd notepad++-ban F5 ->
    Az üres helyre pedig írd be ezt: C:\Python27\Lib\idlelib\idle.bat "$(FULL_CURRENT_PATH)" -> mentés

    Kész.
    Fontos dolgok amiket jó tudni: Minden blokkot ":"-al zárunk le. Ez mondja meg, hogy az adott blokk elkezdődött.
    A bekezdések nagyon fontosak! Tabolások mondják meg az if-else,def,class kulcsszóval ellátott blokkok hatókörét:
    Például:
    if esemény:
    [TAB]csak akkor következik be, ha az esemény bekövetkezik.

    if esemény:
    az eseménytől függetlenül következik be


    Hozz létre egy .py kiterjesztésű fájlt mondjuk test.py és írd bele ezt:
    print 3+5

    F5 -> indítás

    Megjelenik egy ablak a forráskóddal. Kattints az ablakba -> F5 ismét és láss csodát a konzolban 8 az eredmény.

    Most tegyük kicsit komplexabbá a feladatot (Ne ijedj meg):
    írd a test.py fájlodba  a következőt, majd F5 (továbbiakban nem írom le. F5-tel fordítod mindig):

    x = 3
    y = 5
    print x+y

    Output:
    >>>
    8

    Most pedig következzen néhány feladat. A spoilereket csak akkor nyisd le, ha elakadtál és nem tudod mit kellene tenned.
    Feladat 0: Felezz meg egy számot! Utána duplázz meg egy számot!
    Megoldás:
    [spoiler]
    x = 10
    print x/2
    print x*2
    [/spoiler]
    [spoiler]
    Másik megoldás:
    x = 10
    print x>>1
    print x<<1
    [/spoiler]
    Feladat 1: String hozzáfűzése integer változóhoz.
    Megoldás:
    [spoiler]
    Hibás megoldás:
    x = 3
    print "szoveg"+x
    [/spoiler]
    [spoiler]
    Helyes megoldás:
    x = 3
    print "szoveg" + str(x)
    [/spoiler]

    Ez azért van, mert számot nem fűzhetsz sztringhez, hiszen a +-t összeadás operátorként kezeli és sztringet nem lehet számmal összeadni.

    Feladat 2: Hozz létre egy számokból álló listát és add össze az elemeit.(Lista létrehozása: valtozo = [1,2,3...])
    Megoldás:
    [spoiler]
    osszeg = 0
    lista = [1,2,3,4,5]
    for elem in lista:
        osszeg += elem

    [/spoiler]
    [spoiler]
    Második megoldás:
    lista = [1,2,3,4,5]
    osszeg = 0
    i = 0
    while i < len(lista):
            osszeg += lista[i]
            i+=1
    print osszeg
    [/spoiler]
    [spoiler]
    Harmadik megoldas:
    print sum(lista[0:len(lista)])
    [/spoiler]
    Feladat 3: Az előző feladatot végezzük el függvény segítségével
    Megoldás:
    [spoiler]
    lista = [1,2,3,4,5]

    def listaSzamolas(lista):
            osszeg = 0
            for x in lista:
                    osszeg +=x
            return osszeg
                   
    print listaSzamolas(lista)
    [/spoiler]
    [spoiler]
    Masik megoldas:
    lista = [1,2,3,4,5]
    def listaSzamolas(lista):
            print sum(lista[0:len(lista)])
    listaSzamolas(lista)
    [/spoiler]

    Feladat 4: Keressük meg egy szöveglistában, hogy található-e benne a keresett szó.
    szöveglista létrehozása: lista = ["szoveg1","szoveg2",...]

    Megoldás:
    [spoiler]
    lista = ["Szoveg1","Szoveg2","Keresett szo","Szoveg3"]
    for x in lista:
            if x == "Keresett szo":
                    print "megtalaltam"
    [/spoiler]
    [spoiler]
    Megoldas függvénnyel (rekurzióval):
    lista = ["Szoveg1","Szoveg2","Keresett szo","Szoveg3"]
    def findInLista(lista,szoveg,i):
            if lista[i] == szoveg:
                    print "megtalaltam"
            else:
                    i+=1
                    findInLista(lista,szoveg,i)
    findInLista(lista,"Keresett szo",0)

    Ugyan ez egy veszélyes függvény jelenleg, hiszen nincs leellenőrizve, hogy valóban listát adunk-e neki paraméterül.
    [/spoiler]

    Feladat 5: Hozz létre egy függvényt mely paraméterül vár végtelen sok sztringet és fűzd őket össze. Majd írasd ki.
    Megoldás:
    [spoiler]
    a végtelen paramétert a * jelöli
    def osszefuz(*strings):
            full_string = ""
            for string in strings:
                    full_string += str(string)
            print full_string

    osszefuz("a","b","c")
    [/spoiler]
    Feladat 6: Hozd létre a saját számellenőrző és sztring ellenőrző metódusaid!
    Megoldás:
    [spoiler]
    Legegyszerűbb megoldás a szám ellenőrzésére:

    def is_number(number):
            if number == None:
                    return False
            return True if number*0 == 0 else False

    Ez itt a jól ismert rövidített if változata python-ban. (esemény?történés:történés)
    "történés if esemény else történés"
    [/spoiler]
    [spoiler]
    Legegyszerűbb megoldás a szöveg ellenőrzésére:

    def is_string(string):
            if string == None:
                    return False
            return False if (string*0) == 0 else True
    [/spoiler]


    Egyelőre legyen ennyi. Legközelebb folytatom az objektumok terén.

    2017-07-31, 19:34:42 #4 Utolsó szerkesztés: 2017-08-01, 21:59:30 Szerző: Eraman
    Sziasztok!

    Rátaláltam P3NG3R bónusz táblájára és eredeti tervem felrúgva szabad fél órámban úgy döntöttem, hogy kicsit átalakítom, majd pedig megosztom veletek:

    a fájl: https://mega.nz/#!UHATAaYY!82GYHFfGSUbBESus2KF-joGZo3YZd-FnH3jXH8RiFs8

    Berakás:
    A letöltött fájlt-> root e**/e** kicsomagolod-> a mappába bedobod.
    Ha már létezik, akkor nyugodtan felülírhatod, vagy az eredetit mentsd le, de nem fogod észre venni a különbséget.

    game.py:
    importok után:
    import uibonus

    Keresd:
    def __init__(self, stream):

    A funkció utolsó sorába illeszd:
    self.bonus_page = uibonus.BonusPage()
    Keresd:
    def __BuildKeyDict(self):

    Ha még nincs, akkor a hasonlóak közé illeszd:
    onPressKeyDict[app.DIK_F7] = lambda : self.__BonusDialog()
    amennyiben van, akkor értelem szerűen tetszőleges billentyűre rakd.

    Ezt pedig valahova a vége felé rakd be ( valamelyik funkció alá mehet is):
    def __BonusDialog(self):
    self.bonus_page.Open()


    Ha mindent így csináltál, akkor in-game : F7 és működik.

    Frissítés: Tovább gombbal automatikusan frissül valamint újrahívással.



    És igen, aki ezt végig csinálhatja jogosan kérdezheti, hogy na de a kettő között mégis mi a különbség?
    A válasz:  kinézetben semmi, a forráskódot egyszerűsítettem le.