Register for your free account! | Forgot your password?

You last visited: Today at 02:01

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[RELEASE]ErfahrungsLager(Python und Lua)

Discussion on [RELEASE]ErfahrungsLager(Python und Lua) within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1
 
gerald500's Avatar
 
elite*gold: 150
Join Date: Sep 2010
Posts: 1,049
Received Thanks: 275
[RELEASE]ErfahrungsLager(Python und Lua)

Hallo liebe Com wie der Titel schon sagt möchte ich euch mein selbst erstelltest und ausgedachtes Erfahrungslager mit euch teilen ich hab das auch noch nie irgendwo vorher gesehen.

Das Lager ist schon etwas älter und war nur eine Übung für mich um besser zu werden Der Code sieht demensprechend aus.....


aber es funktioniert und das ist wohl das wichtigste :-)

Nun zum Release

adden in der game.py:

ganz oben
Code:
from uiexplager import ExpLager
in der def __init__
Code:
self.ExpLager = ExpLager()
und irgendwo:
Code:
	def OpenExpLager(self):
		if self.ExpLager.Open() == 1:
			self.ExpLager.Close()
		else:
			self.ExpLager.Open()
			import constInfo
			constInfo.EXPLAGER["open"] = 1
		
	def _ExpStorageCMD(self, command):
		cmd = command.split("/")
		if cmd[0] == "QID":
			constInfo.EXPLAGER["qid"] = int(cmd[1])
		elif cmd[0] == "OPEN":
			self.OpenExpLager()
		elif cmd[0] == "QUESTCMD":
			net.SendQuestInputStringPacket(str(constInfo.EXPLAGER["questCMD"]))
		elif cmd[0] == "EXPLAGER":
			constInfo.EXPLAGER["ExpImLager"] = int(cmd[1])
constinfo:
Code:
EXPLAGER = {

	"qid" : 0,
	"questCMD" : "",
	"open" : 0,
	"ExpImLager" : 0,
}
die Restlichen Dateien sind im Anhang explager nach uiscript uiexplager nach root und die quest halt

Screen:

viel Spaß damit ich hoffe es gefällt euch wenn nicht verwendet es nicht und jammert nicht rum...

eine verbesserte Version der quest thanks to Sensi :-) :

Quote:
Originally Posted by Seחsi View Post
Captain here,
das explager läuft über den kompletten acc, man kann aber auch an andere spieler exp verkaufen (1 exp = 1 yang). Der andere spieler muss dem tausch zustimmen und darf maximal 10 einheiten vom gebenden spieler entfernt sein
*rides away on his dieded horse*



@topic
das ganze sollte so zwar funktionieren, schön geschrieben ist aber was anderes. ausserdem solltest du bei manchen sachen zur sicherheit noch prüfen, ob überhaupt etwas zurückgegeben wurde (bei querys sollte man sowas immer prüfen).

die variablennamen sind nicht immer wirklich eindeutig und auch würde ich dir empfehlen beim programmieren generell englische variablennamen zu nutzen.

im ganzen ist es aber ein nützliches release, gerade für die, die es eben nicht selbst schreiben können, weil das ganze einfach macht es machen soll und das ohne irgendwelche sicherheitslücken.

keep it up!


edit:
habe die quest mal reworked, untested
Code:
quest explager begin
	state start begin
		when login begin
			explager.qcc_SendQID()
			explager.qcc_SendExpInStock()
		end
		
		when 11000.chat."Erfahrungslager" begin
			explager.qcc_OpenWindow()
			setskin(NOWINDOW)
		end
		
		when button or info begin
			local receiveFunctions = explager.getSettings().QCC.FUNCTIONS.RECEIVE
			local receivedData = explager.qcc_ReceiveData()
			
			if not receivedData.FUNCTION or not receivedData.VALUE then
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_1")
				return
			end
			
			local method = ({
				[receiveFunctions.GIVE] = explager.giveExpMenu,
				[receiveFunctions.TAKE] = explager.takeExpMenu,
				[receiveFunctions.EXCHANGE] = explager.exchangeExpMenu,
			})[receivedData.FUNCTION]
			
			if not method then
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_2")
				return
			end
			
			method(receivedData.VALUE)
		end
		
		function giveExpMenu(amount)
			if amount < 1 then
				syschat("Explager: Zum Abheben bitte die dafür vorgesehen Funktion nutzen.")
				return
			elseif amount > pc.get_exp() then
				syschat("Explager: Du hast nicht genug Exp zum einlagern.")
				return
			end
			
			pc.give_exp2(-amount)
			explager.addExpInStock(amount)
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Du hast %d Erfahrung eingezahlt.", amount))
		end
		
		function takeExpMenu(amount)
			local expInStock = explager.getExpInStock() or 0
			
			if amount < 1 then
				syschat("Explager: Zum Einzahlen bitte die dafür vorgesehen Funktion nutzen.")
				return
			elseif amount > expInStock then
				syschat("Explager: Du hast nicht genug Exp zum einlagern.")
				return
			end
			
			pc.give_exp2(amount)
			explager.removeExpInStock(amount)
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Du hast %d Erfahrung abgehoben.", amount))
		end
		
		function exchangeExpMenu(amount)
			local expInStock = explager.getExpInStock() or 0
			
			if amount < 1 then
				syschat("Explager: Du kannst einem fremden Spieler keine Erfahrung abziehen.")
				return
			elseif amount > expInStock then
				syschat("Explager: Du hast nicht genug Exp zum tauschen.")
				return
			end
			
			local exchange_settings = explager.getSettings().EXCHANGE
			local tradeGoldCost = amount * exchange_settings.RATE
			
			say(string.format("Aktuelle Exp im Lager: %d", expInStock))
			say(string.format("Zu handelnde Exp: %d", amount))
			say(string.format("Neuer Kontostand: %d", expInStock - amount))
			say(string.format("Yang erhalt: %d", tradeGoldCost))
			say("")
			say("Gib den Namen des Spielers ein, mit dem du Handeln möchtest")
			local traderName = input()
			local traderVID = find_pc_by_name(traderName)
			local myName = pc.get_name()
			local myVID = pc.get_vid()
			
			if traderVID == 0 then
				say(string.format("Der Spieler '%s' wurde nicht gefunden.", traderName))
				if select("Neue Eingabe", "Abbrechen") == 2 then return end
				
				explager.exchangeExpMenu(amount)
				return
			elseif not pc.is_near_vid(traderVID, exchange_settings.MAXRANGE)
				say(string.format("Der Spieler '%s' muss in deiner Nähe sein.", traderName))
				return
			elseif traderName == myName then
				say("Du kannst nicht mit dir selbst handeln.")
				if select("Neue Eingabe", "Abbrechen") == 2 then return end
				
				explager.exchangeExpMenu(amount)
				return
			end
			
			
			if confirm(traderVID, string.format("Möchtest du %d Exp von %s für %d Yang kaufen?", amount, myName, tradeGoldCost), exchange_settings.TRADE_ACCEPT_TIME) ~= CONFIRM_OK then
				syschat(string.format("Explager: %s hat den Handel abgelehnt.", traderName)
				return
			end
			
			if pc.select(traderVID) ~= myVID then--pc.select returns the old player vid if executed correctly
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_3")
				return
			end
			
			--trading partner
			if tradeGoldCost > pc.get_gold() then
				syschat("Explager: Du hast nicht genug Yang für den Handel.")
				
				pc.select(myVID)
				syschat(string.format("Explager: %s hat nicht genug Yangg für den Handel.", traderName))
				return
			end
			
			pc.change_money(-tradeGoldCost)
			pc.give_exp2(amount)
			
			--executing player
			pc.select(myVID)
			explager.removeExpInStock(amount)
			pc.change_money(tradeGoldCost)
			
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Der Handel mit %s war erfolgreich.", traderName))
		end
		
		function getSettings()
			return {
				DB = {
					FULL_TABLENAME = "account.account",
					EXP_STOCK_COLUMN = "explager",
					ID_COLUMN = "id",
					ID_GETTER = function() return pc.get_account_id() end,
				},
				EXCHANGE = {
					MAXRANGE = 10,
					TRADE_ACCEPT_TIME = 30,
					RATE = 1.0,--exp * rate = gold
				},
				QCC = {
					MAIN_PARAM = "EXPSTORAGE",
					SPLITCHAR = "/",
					
					FUNCTIONS = {
						RECEIVE = {
							MAIN_PARAM = "QUESTCMD",
							
							GIVE = "GIVE_EXP",
							TAKE = "TAKE_EXP",
							EXCHANGE = "SCHENK_EXP",
						},
						SEND = {
							QID = "QID",
							EXP_IN_STOCK = "EXPLAGER",
							OPEN_GUI = "OPEN",
						},
					}
				}
			}
		end
		
		function qcc_SendQID()
			local qcc_settings = explager.getSettings().QCC
			cmdchat(string.format("%s %s%s%d", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.QID, qcc_settings.SPLITCHAR, q.getcurrentquestindex()))
		end
		
		function qcc_SendExpInStock()
			local qcc_settings = explager.getSettings().QCC
			local expInStock = explager.getExpInStock() or 0
			
			cmdchat(string.format("%s %s%s%d", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.EXP_IN_STOCK, qcc_settings.SPLITCHAR, expInStock))
		end
		
		function qcc_OpenWindow()
			local qcc_settings = explager.getSettings().QCC
			cmdchat(string.format("%s %s", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.OPEN_GUI))
		end
		
		function qcc_ReceiveData()
			local qcc_settings = explager.getSettings().QCC
			
			cmdchat("getinputbegin")
			cmdchat(string.format("%s %s%s", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.RECEIVE.MAIN_PARAM, qcc_settings.SPLITCHAR))
			local cmd = split(input(), qcc_settings.SPLITCHAR)
			cmdchat("getinputend")
			
			return {FUNCTION = cmd[1], VALUE = tonumber(cmd[2])}
		end
		
		function getExpInStock()
			local db_settings = explager.getSettings().DB
			local expInStock = mysql_query(string.format("SELECT %s FROM %s WHERE %s = '%s';", db_settings.EXP_STOCK_COLUMN, db_settings.FULL_TABLENAME, db_settings.ID_COLUMN, tostring(db_settings.ID_GETTER())))
			if not expInStock or table.getn(expInStock) < 1 then
				return nil
			end
			
			return tonumber(expInStock[1][1])
		end
		
		function addExpInStock(amount)
			local db_settings = explager.getSettings().DB
			mysql_query(string.format("UPDATE %s SET %s = %s + %d WHERE %s = '%s';", db_settings.FULL_TABLENAME, db_settings.EXP_STOCK_COLUMN, db_settings.EXP_STOCK_COLUMN, amount, db_settings.ID_COLUMN, tostring(db_settings.ID_GETTER())))
		end
		
		function removeExpInStock(amount)
			explager.addExpInStock(-amount)
		end
	end
end
Edit2:
Mir ist doch noch ein exploit aufgefallen. Es wird nicht geprüft, ob der Handelspartner die benötigte anzahl an Yang hat.
Bei meiner Version ist die Abfrage nun drin.
Attached Files
File Type: rar explager.rar (3.1 KB, 57 views)
gerald500 is offline  
Thanks
6 Users
Old 01/14/2016, 20:23   #2
 
ThaRielFliege's Avatar
 
elite*gold: 0
Join Date: Sep 2015
Posts: 684
Received Thanks: 551
Danke für das Release, können bestimmt einige brauchen. Auch wenn ich das ganze über Source besser finde
ThaRielFliege is offline  
Old 01/14/2016, 21:14   #3
 
.Aphrodite's Avatar
 
elite*gold: 70
Join Date: Mar 2015
Posts: 98
Received Thanks: 116
Verschenken? Das heißt man kann dann Leute nerven in dem man sie einfach levelt obwohl die evtl lv 55 bleiben wollen?
.Aphrodite is offline  
Old 01/14/2016, 21:34   #4
 
.iBuggy's Avatar
 
elite*gold: 26
Join Date: Sep 2011
Posts: 744
Received Thanks: 86
für sowas gibts ne Anti EXP funktion =)

Und außerdem hat er es glaube ich so eingebaut dass derjenige der was bekommt bestätigen muss !
.iBuggy is offline  
Thanks
1 User
Old 01/14/2016, 21:51   #5

 
elite*gold: 192
Join Date: Aug 2009
Posts: 5,797
Received Thanks: 3,141
Nett von dir, danke!
Finde das ganze nur etwas unnötig. Vllt findet aber der ein oder andere Gefallen daran.
[-Lee-] is offline  
Thanks
1 User
Old 01/14/2016, 22:41   #6
 
Endless.'s Avatar
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,033
Received Thanks: 734
Quote:
Originally Posted by .iBuggy View Post
für sowas gibts ne Anti EXP funktion =)

Und außerdem hat er es glaube ich so eingebaut dass derjenige der was bekommt bestätigen muss !
Nein in dem Lager kannst du EXP für deinen gesammten Account speichern und wenn du z.B ein neuen Char erstellst und die EXP von der Bank nimmst, kannst du dein Char so leveln. Im Prinzip ist das genau das Selbe wie ein normales Item Lager nur das man dort EXP speichern kann und alle Chars aus dem Account EXP abheben können.
Endless. is offline  
Thanks
2 Users
Old 01/14/2016, 23:46   #7

 
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
Quote:
Originally Posted by Endless. View Post
Nein in dem Lager kannst du EXP für deinen gesammten Account speichern und wenn du z.B ein neuen Char erstellst und die EXP von der Bank nimmst, kannst du dein Char so leveln. Im Prinzip ist das genau das Selbe wie ein normales Item Lager nur das man dort EXP speichern kann und alle Chars aus dem Account EXP abheben können.
Captain here,
das explager läuft über den kompletten acc, man kann aber auch an andere spieler exp verkaufen (1 exp = 1 yang). Der andere spieler muss dem tausch zustimmen und darf maximal 10 einheiten vom gebenden spieler entfernt sein
*rides away on his dieded horse*



@topic
das ganze sollte so zwar funktionieren, schön geschrieben ist aber was anderes. ausserdem solltest du bei manchen sachen zur sicherheit noch prüfen, ob überhaupt etwas zurückgegeben wurde (bei querys sollte man sowas immer prüfen).

die variablennamen sind nicht immer wirklich eindeutig und auch würde ich dir empfehlen beim programmieren generell englische variablennamen zu nutzen.

im ganzen ist es aber ein nützliches release, gerade für die, die es eben nicht selbst schreiben können, weil das ganze einfach macht es machen soll und das ohne irgendwelche sicherheitslücken.

keep it up!


edit:
habe die quest mal reworked, untested
Code:
quest explager begin
	state start begin
		when login begin
			explager.qcc_SendQID()
			explager.qcc_SendExpInStock()
		end
		
		when 11000.chat."Erfahrungslager" begin
			explager.qcc_OpenWindow()
			setskin(NOWINDOW)
		end
		
		when button or info begin
			local receiveFunctions = explager.getSettings().QCC.FUNCTIONS.RECEIVE
			local receivedData = explager.qcc_ReceiveData()
			
			if not receivedData.FUNCTION or not receivedData.VALUE then
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_1")
				return
			end
			
			local method = ({
				[receiveFunctions.GIVE] = explager.giveExpMenu,
				[receiveFunctions.TAKE] = explager.takeExpMenu,
				[receiveFunctions.EXCHANGE] = explager.exchangeExpMenu,
			})[receivedData.FUNCTION]
			
			if not method then
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_2")
				return
			end
			
			method(receivedData.VALUE)
		end
		
		function giveExpMenu(amount)
			if amount < 1 then
				syschat("Explager: Zum Abheben bitte die dafür vorgesehen Funktion nutzen.")
				return
			elseif amount > pc.get_exp() then
				syschat("Explager: Du hast nicht genug Exp zum einlagern.")
				return
			end
			
			pc.give_exp2(-amount)
			explager.addExpInStock(amount)
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Du hast %d Erfahrung eingezahlt.", amount))
		end
		
		function takeExpMenu(amount)
			local expInStock = explager.getExpInStock() or 0
			
			if amount < 1 then
				syschat("Explager: Zum Einzahlen bitte die dafür vorgesehen Funktion nutzen.")
				return
			elseif amount > expInStock then
				syschat("Explager: Du hast nicht genug Exp zum einlagern.")
				return
			end
			
			pc.give_exp2(amount)
			explager.removeExpInStock(amount)
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Du hast %d Erfahrung abgehoben.", amount))
		end
		
		function exchangeExpMenu(amount)
			local expInStock = explager.getExpInStock() or 0
			
			if amount < 1 then
				syschat("Explager: Du kannst einem fremden Spieler keine Erfahrung abziehen.")
				return
			elseif amount > expInStock then
				syschat("Explager: Du hast nicht genug Exp zum tauschen.")
				return
			end
			
			local exchange_settings = explager.getSettings().EXCHANGE
			local tradeGoldCost = amount * exchange_settings.RATE
			
			say(string.format("Aktuelle Exp im Lager: %d", expInStock))
			say(string.format("Zu handelnde Exp: %d", amount))
			say(string.format("Neuer Kontostand: %d", expInStock - amount))
			say(string.format("Yang erhalt: %d", tradeGoldCost))
			say("")
			say("Gib den Namen des Spielers ein, mit dem du Handeln möchtest")
			local traderName = input()
			local traderVID = find_pc_by_name(traderName)
			local myName = pc.get_name()
			local myVID = pc.get_vid()
			
			if traderVID == 0 then
				say(string.format("Der Spieler '%s' wurde nicht gefunden.", traderName))
				if select("Neue Eingabe", "Abbrechen") == 2 then return end
				
				explager.exchangeExpMenu(amount)
				return
			elseif not pc.is_near_vid(traderVID, exchange_settings.MAXRANGE)
				say(string.format("Der Spieler '%s' muss in deiner Nähe sein.", traderName))
				return
			elseif traderName == myName then
				say("Du kannst nicht mit dir selbst handeln.")
				if select("Neue Eingabe", "Abbrechen") == 2 then return end
				
				explager.exchangeExpMenu(amount)
				return
			end
			
			
			if confirm(traderVID, string.format("Möchtest du %d Exp von %s für %d Yang kaufen?", amount, myName, tradeGoldCost), exchange_settings.TRADE_ACCEPT_TIME) ~= CONFIRM_OK then
				syschat(string.format("Explager: %s hat den Handel abgelehnt.", traderName)
				return
			end
			
			if pc.select(traderVID) ~= myVID then--pc.select returns the old player vid if executed correctly
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_3")
				return
			end
			
			--trading partner
			if tradeGoldCost > pc.get_gold() then
				syschat("Explager: Du hast nicht genug Yang für den Handel.")
				
				pc.select(myVID)
				syschat(string.format("Explager: %s hat nicht genug Yangg für den Handel.", traderName))
				return
			end
			
			pc.change_money(-tradeGoldCost)
			pc.give_exp2(amount)
			
			--executing player
			pc.select(myVID)
			explager.removeExpInStock(amount)
			pc.change_money(tradeGoldCost)
			
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Der Handel mit %s war erfolgreich.", traderName))
		end
		
		function getSettings()
			return {
				DB = {
					FULL_TABLENAME = "account.account",
					EXP_STOCK_COLUMN = "explager",
					ID_COLUMN = "id",
					ID_GETTER = function() return pc.get_account_id() end,
				},
				EXCHANGE = {
					MAXRANGE = 10,
					TRADE_ACCEPT_TIME = 30,
					RATE = 1.0,--exp * rate = gold
				},
				QCC = {
					MAIN_PARAM = "EXPSTORAGE",
					SPLITCHAR = "/",
					
					FUNCTIONS = {
						RECEIVE = {
							MAIN_PARAM = "QUESTCMD",
							
							GIVE = "GIVE_EXP",
							TAKE = "TAKE_EXP",
							EXCHANGE = "SCHENK_EXP",
						},
						SEND = {
							QID = "QID",
							EXP_IN_STOCK = "EXPLAGER",
							OPEN_GUI = "OPEN",
						},
					}
				}
			}
		end
		
		function qcc_SendQID()
			local qcc_settings = explager.getSettings().QCC
			cmdchat(string.format("%s %s%s%d", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.QID, qcc_settings.SPLITCHAR, q.getcurrentquestindex()))
		end
		
		function qcc_SendExpInStock()
			local qcc_settings = explager.getSettings().QCC
			local expInStock = explager.getExpInStock() or 0
			
			cmdchat(string.format("%s %s%s%d", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.EXP_IN_STOCK, qcc_settings.SPLITCHAR, expInStock))
		end
		
		function qcc_OpenWindow()
			local qcc_settings = explager.getSettings().QCC
			cmdchat(string.format("%s %s", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.OPEN_GUI))
		end
		
		function qcc_ReceiveData()
			local qcc_settings = explager.getSettings().QCC
			
			cmdchat("getinputbegin")
			cmdchat(string.format("%s %s%s", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.RECEIVE.MAIN_PARAM, qcc_settings.SPLITCHAR))
			local cmd = split(input(), qcc_settings.SPLITCHAR)
			cmdchat("getinputend")
			
			return {FUNCTION = cmd[1], VALUE = tonumber(cmd[2])}
		end
		
		function getExpInStock()
			local db_settings = explager.getSettings().DB
			local expInStock = mysql_query(string.format("SELECT %s FROM %s WHERE %s = '%s';", db_settings.EXP_STOCK_COLUMN, db_settings.FULL_TABLENAME, db_settings.ID_COLUMN, tostring(db_settings.ID_GETTER())))
			if not expInStock or table.getn(expInStock) < 1 then
				return nil
			end
			
			return tonumber(expInStock[1][1])
		end
		
		function addExpInStock(amount)
			local db_settings = explager.getSettings().DB
			mysql_query(string.format("UPDATE %s SET %s = %s + %d WHERE %s = '%s';", db_settings.FULL_TABLENAME, db_settings.EXP_STOCK_COLUMN, db_settings.EXP_STOCK_COLUMN, amount, db_settings.ID_COLUMN, tostring(db_settings.ID_GETTER())))
		end
		
		function removeExpInStock(amount)
			explager.addExpInStock(-amount)
		end
	end
end
Edit2:
Mir ist doch noch ein exploit aufgefallen. Es wird nicht geprüft, ob der Handelspartner die benötigte anzahl an Yang hat.
Bei meiner Version ist die Abfrage nun drin.
rollback is offline  
Thanks
5 Users
Old 01/15/2016, 10:08   #8
 
Kampfzwerg!'s Avatar
 
elite*gold: 0
Join Date: Feb 2015
Posts: 306
Received Thanks: 171
Quote:
Originally Posted by [-Lee-] View Post
Nett von dir, danke!
Finde das ganze nur etwas unnötig. Vllt findet aber der ein oder andere Gefallen daran.
finde die idee garnichtmal schlecht sehr gut für ein Prestige System
& dem einen oder anderen faulen freund der nicht gerne levelt
Kampfzwerg! is offline  
Thanks
1 User
Old 01/15/2016, 15:15   #9
 
gerald500's Avatar
 
elite*gold: 150
Join Date: Sep 2010
Posts: 1,049
Received Thanks: 275
Quote:
Originally Posted by Seחsi View Post
Captain here,
das explager läuft über den kompletten acc, man kann aber auch an andere spieler exp verkaufen (1 exp = 1 yang). Der andere spieler muss dem tausch zustimmen und darf maximal 10 einheiten vom gebenden spieler entfernt sein
*rides away on his dieded horse*



@topic
das ganze sollte so zwar funktionieren, schön geschrieben ist aber was anderes. ausserdem solltest du bei manchen sachen zur sicherheit noch prüfen, ob überhaupt etwas zurückgegeben wurde (bei querys sollte man sowas immer prüfen).

die variablennamen sind nicht immer wirklich eindeutig und auch würde ich dir empfehlen beim programmieren generell englische variablennamen zu nutzen.

im ganzen ist es aber ein nützliches release, gerade für die, die es eben nicht selbst schreiben können, weil das ganze einfach macht es machen soll und das ohne irgendwelche sicherheitslücken.

keep it up!


edit:
habe die quest mal reworked, untested
Code:
quest explager begin
	state start begin
		when login begin
			explager.qcc_SendQID()
			explager.qcc_SendExpInStock()
		end
		
		when 11000.chat."Erfahrungslager" begin
			explager.qcc_OpenWindow()
			setskin(NOWINDOW)
		end
		
		when button or info begin
			local receiveFunctions = explager.getSettings().QCC.FUNCTIONS.RECEIVE
			local receivedData = explager.qcc_ReceiveData()
			
			if not receivedData.FUNCTION or not receivedData.VALUE then
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_1")
				return
			end
			
			local method = ({
				[receiveFunctions.GIVE] = explager.giveExpMenu,
				[receiveFunctions.TAKE] = explager.takeExpMenu,
				[receiveFunctions.EXCHANGE] = explager.exchangeExpMenu,
			})[receivedData.FUNCTION]
			
			if not method then
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_2")
				return
			end
			
			method(receivedData.VALUE)
		end
		
		function giveExpMenu(amount)
			if amount < 1 then
				syschat("Explager: Zum Abheben bitte die dafür vorgesehen Funktion nutzen.")
				return
			elseif amount > pc.get_exp() then
				syschat("Explager: Du hast nicht genug Exp zum einlagern.")
				return
			end
			
			pc.give_exp2(-amount)
			explager.addExpInStock(amount)
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Du hast %d Erfahrung eingezahlt.", amount))
		end
		
		function takeExpMenu(amount)
			local expInStock = explager.getExpInStock() or 0
			
			if amount < 1 then
				syschat("Explager: Zum Einzahlen bitte die dafür vorgesehen Funktion nutzen.")
				return
			elseif amount > expInStock then
				syschat("Explager: Du hast nicht genug Exp zum einlagern.")
				return
			end
			
			pc.give_exp2(amount)
			explager.removeExpInStock(amount)
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Du hast %d Erfahrung abgehoben.", amount))
		end
		
		function exchangeExpMenu(amount)
			local expInStock = explager.getExpInStock() or 0
			
			if amount < 1 then
				syschat("Explager: Du kannst einem fremden Spieler keine Erfahrung abziehen.")
				return
			elseif amount > expInStock then
				syschat("Explager: Du hast nicht genug Exp zum tauschen.")
				return
			end
			
			local exchange_settings = explager.getSettings().EXCHANGE
			local tradeGoldCost = amount * exchange_settings.RATE
			
			say(string.format("Aktuelle Exp im Lager: %d", expInStock))
			say(string.format("Zu handelnde Exp: %d", amount))
			say(string.format("Neuer Kontostand: %d", expInStock - amount))
			say(string.format("Yang erhalt: %d", tradeGoldCost))
			say("")
			say("Gib den Namen des Spielers ein, mit dem du Handeln möchtest")
			local traderName = input()
			local traderVID = find_pc_by_name(traderName)
			local myName = pc.get_name()
			local myVID = pc.get_vid()
			
			if traderVID == 0 then
				say(string.format("Der Spieler '%s' wurde nicht gefunden.", traderName))
				if select("Neue Eingabe", "Abbrechen") == 2 then return end
				
				explager.exchangeExpMenu(amount)
				return
			elseif not pc.is_near_vid(traderVID, exchange_settings.MAXRANGE)
				say(string.format("Der Spieler '%s' muss in deiner Nähe sein.", traderName))
				return
			elseif traderName == myName then
				say("Du kannst nicht mit dir selbst handeln.")
				if select("Neue Eingabe", "Abbrechen") == 2 then return end
				
				explager.exchangeExpMenu(amount)
				return
			end
			
			
			if confirm(traderVID, string.format("Möchtest du %d Exp von %s für %d Yang kaufen?", amount, myName, tradeGoldCost), exchange_settings.TRADE_ACCEPT_TIME) ~= CONFIRM_OK then
				syschat(string.format("Explager: %s hat den Handel abgelehnt.", traderName)
				return
			end
			
			if pc.select(traderVID) ~= myVID then--pc.select returns the old player vid if executed correctly
				syschat("Explager: Etwas ist schiefgelaufen. Bitte einem Teamler melden: Fehlercode: EXPLAGER_3")
				return
			end
			
			--trading partner
			if tradeGoldCost > pc.get_gold() then
				syschat("Explager: Du hast nicht genug Yang für den Handel.")
				
				pc.select(myVID)
				syschat(string.format("Explager: %s hat nicht genug Yangg für den Handel.", traderName))
				return
			end
			
			pc.change_money(-tradeGoldCost)
			pc.give_exp2(amount)
			
			--executing player
			pc.select(myVID)
			explager.removeExpInStock(amount)
			pc.change_money(tradeGoldCost)
			
			explager.qcc_SendExpInStock()
			
			syschat(string.format("Explager: Der Handel mit %s war erfolgreich.", traderName))
		end
		
		function getSettings()
			return {
				DB = {
					FULL_TABLENAME = "account.account",
					EXP_STOCK_COLUMN = "explager",
					ID_COLUMN = "id",
					ID_GETTER = function() return pc.get_account_id() end,
				},
				EXCHANGE = {
					MAXRANGE = 10,
					TRADE_ACCEPT_TIME = 30,
					RATE = 1.0,--exp * rate = gold
				},
				QCC = {
					MAIN_PARAM = "EXPSTORAGE",
					SPLITCHAR = "/",
					
					FUNCTIONS = {
						RECEIVE = {
							MAIN_PARAM = "QUESTCMD",
							
							GIVE = "GIVE_EXP",
							TAKE = "TAKE_EXP",
							EXCHANGE = "SCHENK_EXP",
						},
						SEND = {
							QID = "QID",
							EXP_IN_STOCK = "EXPLAGER",
							OPEN_GUI = "OPEN",
						},
					}
				}
			}
		end
		
		function qcc_SendQID()
			local qcc_settings = explager.getSettings().QCC
			cmdchat(string.format("%s %s%s%d", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.QID, qcc_settings.SPLITCHAR, q.getcurrentquestindex()))
		end
		
		function qcc_SendExpInStock()
			local qcc_settings = explager.getSettings().QCC
			local expInStock = explager.getExpInStock() or 0
			
			cmdchat(string.format("%s %s%s%d", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.EXP_IN_STOCK, qcc_settings.SPLITCHAR, expInStock))
		end
		
		function qcc_OpenWindow()
			local qcc_settings = explager.getSettings().QCC
			cmdchat(string.format("%s %s", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.SEND.OPEN_GUI))
		end
		
		function qcc_ReceiveData()
			local qcc_settings = explager.getSettings().QCC
			
			cmdchat("getinputbegin")
			cmdchat(string.format("%s %s%s", qcc_settings.MAIN_PARAM, qcc_settings.FUNCTIONS.RECEIVE.MAIN_PARAM, qcc_settings.SPLITCHAR))
			local cmd = split(input(), qcc_settings.SPLITCHAR)
			cmdchat("getinputend")
			
			return {FUNCTION = cmd[1], VALUE = tonumber(cmd[2])}
		end
		
		function getExpInStock()
			local db_settings = explager.getSettings().DB
			local expInStock = mysql_query(string.format("SELECT %s FROM %s WHERE %s = '%s';", db_settings.EXP_STOCK_COLUMN, db_settings.FULL_TABLENAME, db_settings.ID_COLUMN, tostring(db_settings.ID_GETTER())))
			if not expInStock or table.getn(expInStock) < 1 then
				return nil
			end
			
			return tonumber(expInStock[1][1])
		end
		
		function addExpInStock(amount)
			local db_settings = explager.getSettings().DB
			mysql_query(string.format("UPDATE %s SET %s = %s + %d WHERE %s = '%s';", db_settings.FULL_TABLENAME, db_settings.EXP_STOCK_COLUMN, db_settings.EXP_STOCK_COLUMN, amount, db_settings.ID_COLUMN, tostring(db_settings.ID_GETTER())))
		end
		
		function removeExpInStock(amount)
			explager.addExpInStock(-amount)
		end
	end
end
Edit2:
Mir ist doch noch ein exploit aufgefallen. Es wird nicht geprüft, ob der Handelspartner die benötigte anzahl an Yang hat.
Bei meiner Version ist die Abfrage nun drin.

joa danke wie gesagt es ist schon älter und ich habs auch garnicht großartig geprüft auf lücken sondern nur auf die funktion^^

Ich editier deine quest mal rein

allerdings ist die jetzt nicht mehr so lua noob freundlich wie meine

Edit:Achja ganz vergessen ihr müsst in account.account eine Spalte ExpLager erstellen und dieser int oder am besten bigint geben
gerald500 is offline  
Thanks
1 User
Old 01/16/2016, 14:18   #10
 
Shaytan 's Avatar
 
elite*gold: 0
Join Date: Feb 2014
Posts: 478
Received Thanks: 564
Die Idee ist gut bedacht allerdings würde ich dies nie nutzen.
Danke dir dennoch für das Release.
Shaytan  is offline  
Reply


Similar Threads Similar Threads
[Python]Release ? Frage
04/22/2015 - Metin2 Private Server - 4 Replies
Hey Com, ich suche sowas fürn Inventar wo man auf den Pfeil klickt und dann fährt sich ein Fenster raus, wo Buttons drin sind für Anti-expring & Warpring usw. "Wie Gürtels system Fenster" bloß mit Buttons ? Wurde so eins schon mal Releast ? Weil ich habe dazu nichts gefunden. Falls es jemand hat kann er mir des bitte geben ? Wäre sehr nett. Habe es auch schon paar mal selber versucht zu coden, aber ohne Erfolg. Ich benutze ein 2089 Client. MFG
[RELEASE] BeltSystem Python GUI
12/26/2013 - Metin2 PServer Guides & Strategies - 26 Replies
Hello elitepvpers, Today I want to share the clientside parts of the original belt system. This is the original version so it contains new built-in variables and functions about the belt system. Those built-ins available in metin2clien_r4xxxx.exe (41200). Ehm yeah the bin_r41200 already containing the new rings method too. I collected every touched files by belt. ################################################# #################
[HOT-RELEASE] Python GUI Beta
11/25/2012 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 13 Replies
Mediafire: PGC.rar file PASS: epvp With this applcation you can create windows interface more easy for your server, hack, .... This beta version is for free but in the future .... i have many ideas :D Take it as a gift for Christmas :P Only in ENGLISH
S: python release
08/19/2012 - Metin2 Private Server - 0 Replies
suche eine release wo rechts im inventar die bonis angezeigt wird finde die nicht mehr
[Python-Release]All Pm log
04/23/2012 - Metin2 PServer Guides & Strategies - 6 Replies
This is a very simple thing, maybe to be used in combination with another.I want them in a folder called "log" are written all pm that i receive. That said, it acts in a simple, well follow the steps: 1) Create a folder "log" in the directory of the client. 2) Search: def OnRecvWhisper 3)Replace this : def OnRecvWhisper(self, mode, name, line): if mode == chat.WHISPER_TYPE_GM: self.interface.RegisterGameMasterName(name) chat.AppendWhisper(mode, name,...



All times are GMT +2. The time now is 02:01.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.