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
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 (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:
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi.epvpimg.com%2FHNuufab.png&hash=98a13cbf50bac2f33aeade094d8a39099456da37)
Lépés2:
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi.epvpimg.com%2FBMr3bab.png&hash=e81b50019934a8f15f55beb17f5789b3f90ea880)
Lépés3:
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi.epvpimg.com%2FPq4lbab.png&hash=c1eaa9197ddae6835c4ad98f8b79c3117e58e47f)
Kész. Immár dupla kattintás a quest-re és egyből a notepad++-ban szerkesztheted/módosíthatod őket.
[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:
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi.epvpimg.com%2FolzAaab.jpg&hash=308b564266a5cb04b30b82df50e1002b16a52233)
1. Csomagold ki:
root.eix/epk
2. Töltsd le: https://mega.nz/#!XRBQVJ7Z!9DGdHGkTyjA-eEiQSMq7_zCRmNfVuMW-SxkUKu6Bydo [EDIT]
A quest legalul!!
Csomagold kiA teleport mappában lévő fájlokat (teleport.lua kivételével) tedd a root mappába2. 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:
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi.epvpimg.com%2FolzAaab.jpg&hash=308b564266a5cb04b30b82df50e1002b16a52233)
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 (https://mega.nz/#!1OpAGBgI!i2qHS744oyzzPsZQoGj126XNVklhVyPIdayBUQFCBl4)
Visszafejtési kulcs:!i2qHS744oyzzPsZQoGj126XNVklhVyPIdayBUQFCBl4 (http://!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
~~~~~~~~~~~~~~~~~~~~~[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/ (https://notepad-plus-plus.org/)
x86(32bit windows) : https://www.python.org/ftp/python/2.7/python-2.7.msi (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 (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.
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 (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.