[RELEASE]ErfahrungsLager(Python und Lua)

01/14/2016 18:39 gerald500#1
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:
[Only registered and activated users can see links. Click Here To Register...]

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.
01/14/2016 20:23 ThaRielFliege#2
Danke für das Release, können bestimmt einige brauchen. Auch wenn ich das ganze über Source besser finde :)
01/14/2016 21:14 .Aphrodite#3
Verschenken? Das heißt man kann dann Leute nerven in dem man sie einfach levelt obwohl die evtl lv 55 bleiben wollen?
01/14/2016 21:34 .iBuggy#4
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 !
01/14/2016 21:51 [-Lee-]#5
Nett von dir, danke!
Finde das ganze nur etwas unnötig. Vllt findet aber der ein oder andere Gefallen daran.
01/14/2016 22:41 Endless.#6
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.
01/14/2016 23:46 rollback#7
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.
01/15/2016 10:08 Kampfzwerg!#8
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 ;)
01/15/2016 15:15 gerald500#9
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 :D

Edit:Achja ganz vergessen ihr müsst in account.account eine Spalte ExpLager erstellen und dieser int oder am besten bigint geben
01/16/2016 14:18 Shaytan #10
Die Idee ist gut bedacht allerdings würde ich dies nie nutzen.
Danke dir dennoch für das Release.