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
in der def __init__
und irgendwo:
constinfo:
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...]
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
Code:
self.ExpLager = ExpLager()
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])
Code:
EXPLAGER = {
"qid" : 0,
"questCMD" : "",
"open" : 0,
"ExpImLager" : 0,
}
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:
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
Edit2: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
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.