Register for your free account! | Forgot your password?

Go Back   elitepvpers > World of Warcraft > WoW Private Server > WoW PServer Hosting
You last visited: Today at 12:38

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

 

[Anleitung][ArcEmu] Korrektes Gossip und Unterfunktionen schreiben

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Apr 2015
Posts: 16
Received Thanks: 4
Lightbulb [Lua Anleitung] Korrektes Gossip und Unterfunktionen schreiben [Advanced]

Hallöchen liebe ElitePvPer!

Da ich kein Premium Mitglied bin, müsst ihr euch die Screenshot links rauskopieren, SORRY!
Sind alle von imgur

Links:

/
mehr braucht man in der regel nicht.

Vorwort:
Dies ist mein aller erstes Thema welches ich auf ElitePvPers erstelle, ich werde euch mit dieser Anleitung zeigen wie Ihr nicht nur "leichter/logischer" eure Scriptideen umsetzen könnt, sondern auch wie Ihr euren Rootserver durch Falsches Scripten nicht so sehr Auslastet was Arbeitsspeicher angeht.
________________________________
Scriptidee für die Anleitung:
Um euch weiteres zu erörtern und das Ihr den unterschied sehen und evtl auch spüren könnt, werde ich einmal einen "falschen" script machen der hacky dahingeschrieben wird und das tut was er soll (mit der konsiquens das unser arbeitsspeicher in die höhe getrieben wird) Und ich werde einmal einen "richtigen" script machen in dem ihr alle Unterschiede erkennen könnt.

Meine Idee für die Anleitung ist ein Gossip Script. Heißt soviel wie, wir erstellen ein Gossip Menü mit 3 Menüpunkten. (Buff mich, Debuff mich, Tschüss)

________________________________

Was wird zum Lua Scripten benötigt?

Hier sollte ich erwähnen das wir auf einer LuaEngine Arbeiten, was uns den Ausdruck "Scripter" verschafft, wenn wir jetzt an der LuaEngine arbeiten würden, wäre uns der Ausdruck "Programmierer" gegönnt.
Da wir ja nur sachen auf die LuaEngine draufpacken und sie nicht erweitern, brauchen wir einen Editor mit Zeilenangabe, das wir den Überblick behalten.


Zum Scripten Empfehle ich:
Zum Programmieren Empfehle ich:
________________________________

Was schreibe ich in meinen Script?
Da wir ja schon eine Idee für den Script haben, kann ich mir diese Stufe sparen.

Eure aufgabe besteht darin detailiert euren Scriptablauf im Kopf zu haben, SpellID's z.B die benutzt werden etc etc etc.

Die Einzigen Daten die ich für meinen Script brauche sind in diesem Fall unsere SpellID's 20217,1126,17,21562

________________________________

Jetzt wirds Lustig.
Also zu aller erst müssen wir ein neues Lua Dokument machen. Wir öffnen also unser Notepad++ und drücken "Strg + N" um ein Neues Dokument hinzuzufügen. Im anschluss gehen wir Oben in der Menüleiste von Notepad++ (Falls sie bei euch weg ist drückt einfach mal auf "Alt", dann sollte sie aufgehen) auf Sprachen und gehen unter den Buchstabe "L" und wählen Lua als Syntax für kommende Inhalte die wir in unser Dokument schreiben werden aus.
http://i.imgur.com/L7oCt6X.png

Als nächstes machen wir unsere funktionen ohne weitere Inhalte, das wir erstmal das Basis-Script-Layout haben.

http://i.imgur.com/vGPCHEd.png

Als nächstes tragen wir unsere Variabeln die wir benutzen möchten in die funktionen ein (Meistens wenn ihr auf Platformen die LuaEngine benutzen unterwegs seid, gibt es eine Wiki zu dem dazugehören Spiel für welches Ihr den Script machen wollt.) In unserem Fall benutzen wir die Informationen die ArcEmu uns zukommen lässt.
Code:
Variabeln
----
GOSSIP_EVENT_ON_TALK		= 1    --(pUnit, event, pPlayer)
GOSSIP_EVENT_ON_SELECT_OPTION	= 2    --(pUnit, event, pPlayer, id, intid, code)


Methoden
----
:GossipCreateMenu(npc_text, pPlayer, 0) : Creates a new NPC gossip menu with the TextID specified.
:GossipMenuAddItem(Icon, "Name", intid, code[, messagebox, gold]) : Creates a new menu item, used after registering a new menu with :GossipCreateMenu().
:GossipSendMenu(pPlayer) : Sends the gossip menu to the player.
:GossipComplete() : Completes (closes) the player's gossip window.
Das unser Script dann auch gelesen und registriert wird, müssen wir unsere Register füllen.
http://i.imgur.com/wnzdOFY.png

Soweit so gut. Unser Script funktioniert jetzt sogar schon, nur macht er nichts. Das ändern wir jetzt.

Zuerst gliedern wir alle Spells die wir benutzen möchten in ein local, dass wir diese jederzeit abrufen können anstatt sie singluarisch zeile für zeile reinschreiben.
Code:
local elitepvp = 	{
					}
Somit haben wir erfolgreich ein "pair" erstellt! Glückwunsch! Jetzt müssen wir weitere pairs in dieses pair schreiben (die pairs inmitten eines pairs nennt man ipairs)

Code:
local elitepvp = 	{
				["buffspellids"] = {20217,1126,17,21562}
					}
Im normalfall lohnt es nicht ein ipair zu erstellen wenn wir nur eine vereinzellte information vertreten möchten, da wir hier aber korrekt Lua Scripten möchten, werden wir so viel Informationen wie möglich die den Script betreffen local gliedern, denn bei jeden Script der gelesen wird, werden Generell IMMER ZUERST die local gesetzten informationen gelesen und dann erst der Script an sich...

Welche Informationen können wir noch gliedern um uns platz und arbeitsspeicher zu sparen. Die Menüpunkte, richtig.

Code:
local elitepvp = {
				["buffspellids"] = {20217,1126,17,21562}
				["menuepunkte"] =
                                {
                        { ["icon"] = 0, ["txt"] = "Buff mich", ["intid"] = 1, ["code"] = 0 },
                        { ["icon"] = 0, ["txt"] = "Debuff mich", ["intid"] = 2, ["code"] = 0 },
			{ ["icon"] = 0, ["txt"] = "Tsch\195\188ss", ["intid"] = 3, ["code"] = 0 },
                                }
			}
http://i.imgur.com/FROnUpo.png

Soooo, das war noch der einfache teil. Lasst mich aber näher auf unsere Menüpunkte gliederung eingehen....

Normalerweise würden wir 3 mal den befehl :GossipMenuAddItem() nutzen, JETZT werden diesen Befehl nur ein einziges mal benutzen und unsere Informationen die wir local gesetzt haben wiedergeben. (Ziehmlich verwirrend oder? Es spart dir aber 66,6% performance, da es statt 3 statements nur 1 gibt..)

Die Standartsyntax von :GossipMenuAddItem():

Code:
:GossipMenuAddItem(0, "Buff mich", 1, 0)
Diesen teil
Code:
0, "Buff mich", 1, 0
Haben wir durch unser elitepvp local nun deklariert als:

Code:
0, "Buff mich", 1, 0
0, "Debuff mich", 2, 0
0, "Tsch\195\188ss", 3, 0
Code:
["menuepunkte"] =
{
{ ["icon"] = 0, ["txt"] = "Buff mich", ["intid"] = 1, ["code"] = 0 },
{ ["icon"] = 0, ["txt"] = "Debuff mich", ["intid"] = 2, ["code"] = 0 },
{ ["icon"] = 0, ["txt"] = "Tsch\195\188ss", ["intid"] = 3, ["code"] = 0 },
}
Nun gehen wir wieder zum Tagesgeschäft über... Wir fangen an unseren Script zu bestücken das er endlich mal was tut.

Wir schreiben also in unsere ElitePvPAnleitung_I funktion alles rein was passieren soll wenn der Spieler diese Buffkreatur oder was auch immer ihr erstellen werdet, anspricht.

Hier in der funktion werden wir unsere Menüpunkte wiedergeben.

http://i.imgur.com/L30CEgz.png

Lasst mich genauer auf jede Zeile eingehen...

Code:
pUnit:GossipCreateMenu(99, pPlayer, 0)
Eröffnet ein Menü ohne Menüpunkte mit dem Text aus dem NPC_TEXT_ID == 99 und das event ist ja der Spieler n den meisten fällen


Code:
for k,v in ipairs(elitepvp.menuepunkte) do
Der satz ist sehr selbererklärend wenn man Englisch kann und ein wenig mit Lua zu tun hat/hatte

Für das Keyword "v" werden die informationen aus dem ipair menuepunkte in dem elitepvp pair wiedergegeben

Code:
pUnit:GossipMenuAddItem(v.icon, v.txt, v.intid, v.code)
Gibt uns die 3 Menüpunkte mit nur einer zeile

Code:
pUnit:GossipSendMenu(pPlayer)
Gibt das Gossipmenu dem Spieler wieder.

Soweit so gut.

Jetzt wollen wir ja auch noch das was passiert wenn man die Menüpunkte anklickt.

Wir sagen also unserer ElitePvPAnleitung_II Funktion auch mal hallo.

Wir greifen also auf unsere Intid 1 zu und machen genau das gleiche wie bei unseren Menüpunkten, wir suchen uns ein keyword aus für das unseren ganzen spellids vertreten werden, das wir nicht 4x die zeile :CastSpell() benutzen müssen.

Code:
if (intid == 1) then
	for _, buffen in ipairs(elitepvp.buffspellids) do
		pPlayer:CastSpell(buffen)
	end
	pUnit:GossipComplete()
end
Und genau das gleiche mit der Intid 2 nur mit dem unterschied das wir nicht Buffen sondern Debuffen möchten:

Code:
if (intid == 2) then
	for _, debuffen in ipairs(elitepvp.buffspellids) do
		pPlayer:RemoveAura(debuffen)
	end
	pUnit:GossipComplete()
end
Und bei unserer Intid 3 soll das Gossip ja nur schließen:
Code:
if (intid == 3) then
pUnit:GossipComplete()
end
Und tada, unser Script ist Fertig und das alles Ohne Memoryleak bei verwendung des Scripts.

Voller Script nochmal zum anschauen

http://i.imgur.com/2O3VP9F.png

Natürlich könnte ich jetzt noch haufenweise Checks einbauen ob der Spieler bereits gebufft ist etc etc aber das übersteigt dann das ziel welches ich hier vertreten möchte.

__________________________________



Hier nochmal ein kleines beispiel wie euer Script NICHT aussehen sollte, AUF GARKEINEN FALL, denn das ist kein offizielles Lua, es ist stumpfes befehlsgespamme:

http://i.imgur.com/8nEipDE.png


Vielleicht konnte ich bei einigen das verlangen erwecken malwieder ArcEmu auszuprobieren und richtig darauf aufzubauen wenn ihr schon Lua benutzt. Dieses Falsche LuaScripten verursacht nämlich LAGGS und INSTABILITÄT ohne ende... und das nicht nur bei ArcEmu.

Peace and Love from Pure @ Defqon-Project



DefqonPure is offline  
Old   #2
 
elite*gold: 110
Join Date: Mar 2008
Posts: 827
Received Thanks: 361
Quote:
Originally Posted by DefqonPure View Post
Hier nochmal ein kleines beispiel wie euer Script NICHT aussehen sollte, AUF GARKEINEN FALL, denn das ist kein offizielles Lua, es ist stumpfes befehlsgespamme:
http://i.imgur.com/8nEipDE.png
Mich würde es stark wundern, wenn die von dir geschriebene Methode weniger RAM oder sonstwas benutzen würde, eher im Gegenteil.
In deinem Code rufst du die Funktionen mit genau den gleichen Parametern genau so oft auf, allerdings wird bei dir durch eine Liste iteriert, welches sogar minimal mehr Ressourcen verbrauchen sollte. Immerhin iterierst du ja noch durch die Liste, was ebenfalls Rechenzeit verbraucht.

Und das mit dem "das ist kein offizielles Lua" ist riesiger Quatsch und zeigt mir, dass du keine Ahnung vom Programmieren hast. Das sind ganz normale Funktionsaufrufe und machen 1:1 das, was du mit deiner Schleife auch machst. Da passiert NICHTS anderes.
Dein Code ist lediglich einfacher zu erweitern, mehr nicht.

Abgesehen davon: Statt deinen finalen Code als Bild zu verlinken, solltest du ihn auch in einem CODE-Tag anbieten. Dann muss man ihn nicht erst abtippen.


Kaev <3 is offline  
Thanks
1 User
Old   #3
 
elite*gold: 0
Join Date: Jan 2009
Posts: 1,149
Received Thanks: 231
Quote:
AUF GARKEINEN FALL, denn das ist kein offizielles Lua
Wieso sollte das kein offizielles Lua sein?
Delinquenz is offline  
Old   #4
 
elite*gold: 0
Join Date: Apr 2015
Posts: 16
Received Thanks: 4
Quote:
Originally Posted by Kaev <3 View Post
Mich würde es stark wundern, wenn die von dir geschriebene Methode weniger RAM oder sonstwas benutzen würde, eher im Gegenteil.
In deinem Code rufst du die Funktionen mit genau den gleichen Parametern genau so oft auf, allerdings wird bei dir durch eine Liste iteriert, welches sogar minimal mehr Ressourcen verbrauchen sollte. Immerhin iterierst du ja noch durch die Liste, was ebenfalls Rechenzeit verbraucht.

Und das mit dem "das ist kein offizielles Lua" ist riesiger Quatsch und zeigt mir, dass du keine Ahnung vom Programmieren hast. Das sind ganz normale Funktionsaufrufe und machen 1:1 das, was du mit deiner Schleife auch machst. Da passiert NICHTS anderes.
Dein Code ist lediglich einfacher zu erweitern, mehr nicht.

Abgesehen davon: Statt deinen finalen Code als Bild zu verlinken, solltest du ihn auch in einem CODE-Tag anbieten. Dann muss man ihn nicht erst abtippen.
Also zuerst reden wie Hier über Lua und nicht C++. Loops laufen schneller. IMMER.

Was ich hier mit der anleitung versuche zu deuten soll sich nicht nur auf so kleine codes beziehen, sondern auf codes die was weiß ich wie lang sind 500 oder 600 zeilen+. Da ist es vorteilhaft mit Metatabellen zu arbeiten anstatt 10000000 befehle in den script zu hauen.

Quote:
Abgesehen davon: Statt deinen finalen Code als Bild zu verlinken, solltest du ihn auch in einem CODE-Tag anbieten. Dann muss man ihn nicht erst abtippen.
Wieso sollte ich das machen? Es ist eine Anleitung und kein Release. Ich wollte dadurch verhindern das sich jemand den script schnappt und das geschriebene obendrüber ignoriert (Sinn und zweck eines Tutorials (das man es ließt und versteht und nicht rauskopiert)) aber gut das sind verschiedene meinungen. Die aufgabe eines Tutorials besteht nicht darin den endcode zu kopieren und seine infos reinzuschreiben... Dem Anleitungsverlauf folgen und mitschreiben aufgrund des verständnisses das vermittelt wird.. Keine ahnung in welcher Welt du lebst wo man Copy & Paste beim Coden betreibt. (sounds leaky to me)

Quote:
In deinem Code rufst du die Funktionen mit genau den gleichen Parametern genau so oft auf, allerdings wird bei dir durch eine Liste iteriert, welches sogar minimal mehr Ressourcen verbrauchen sollte. Immerhin iterierst du ja noch durch die Liste, was ebenfalls Rechenzeit verbraucht.
Das ist wahr. Ich wollte hier aber kein BuffNPC Script veröffentlichen, sondern eine scriptweise deutlich machen die deine resourcen beim hosten schonen kann.

Diese Methode kann dir Resourcen sparen wenn du viele Classen/Rassen checks beachten musst beim Coden, und wenn du Loops benutzt läuft der Script eben schneller. Und das wollte ich mit diesem Tutorial erörtern. Das man sich z.B 20x if und 10x else sparen kann wenn man mit Metatabellen arbeitet.

Quote:
Und das mit dem "das ist kein offizielles Lua" ist riesiger Quatsch
Unnötiges LuaEngine belasten durch undurchdachtes Coden ist für mich kein Offizielles Lua schreiben. Ende aus.

Ich bin einfach der Meinung das mal jemand was dazu schreiben sollte, da wahrscheinlich niemand das hier ließt: , ich meine.... schau dir doch mal die ganzen Public Scripts an.. ich bitte dich ( Du hast es offenbar auch nicht aufmerksam gelesen oder überhaupt nicht gelesen. ALLES WAS DU LOCAL MACHEN KANNST BEI LUA SOLLST DU LOCAL MACHEN UND HALTEN!!!!!!!!) Fertig aus mehr sag ich zu diesem thema nicht, da alles was du dagegen sagst mir nur ein bild vermittelt das du versuchst mich hier zu verscheuchen.

Das ist ja nur ein Tutorial wie du deine Performance steigern kannst wenn du diese methode jetzt bei ALLEN scripts in deiner Libary anwendest und nicht nur bei einem Code.

Quote:
Originally Posted by Delinquenz View Post
Wieso sollte das kein offizielles Lua sein?
Weil diese ganzen "LUA" scripts die im Netz rumfliegen nahezu ALLE memoryleaks verursachen. Diese Scripte sind durch Stumpfsinn ins leben gerufen und verteilt worden. Sie tun was sie sollen aber auf dem komplett falschen weg.


--------

Nur weil diese Methode nicht so weit verbreitet ist, heißt es nicht das sie nicht besser ist. Aber wenn jetzt schon mehrere leute dagegen sind, lösche ich die Anleitung wieder, da ja offenbar eh nur totaler Quatsch drinne steht XD....


DefqonPure is offline  
Old   #5
 
elite*gold: 2693
Join Date: Jul 2010
Posts: 6,449
Received Thanks: 1,224
Quote:
Originally Posted by DefqonPure View Post

Wieso sollte ich das machen? Es ist eine Anleitung und kein Release.

Weil es sonst ein anderer macht. Einige haben Vorkenntnisse, die brauchen den Quatsch oben drüber nicht und wollen gerne neue Schreibstile für ggf. Optimierungen anschauen. Ich lese mir meistens die Scripts durch und überfliege die Texte. Im Groben und Ganzen kann man vom Code her sehen, in welche Richtung es geht.

Für alle, die sich das gesamte Script anschauen wollen:

Code:
local elitepvp = {
				["buffspellids"] = {20217,1126,17,21562}
				["menuepunkte"] =
                                {
                        { ["icon"] = 0, ["txt"] = "Buff mich", ["intid"] = 1, ["code"] = 0 },
                        { ["icon"] = 0, ["txt"] = "Debuff mich", ["intid"] = 2, ["code"] = 0 },
			{ ["icon"] = 0, ["txt"] = "Tsch\195\188ss", ["intid"] = 3, ["code"] = 0 },
                                }
			}

function ElitePvPAnleitung_I(pUnit, event, pPlayer)			
pUnit:GossipCreateMenu(99, pPlayer, 0)
for k,v n ipairs(elitepvp.menuepunkte) do
	pUnit:GossipMenuAddItem(v.icon, v.txt, v.initd, v.code)
	end
	pUnit:GossipSendMenu(pPlayer)
end

function ElitePvPAnleitung_II(pUnit, event, pPlayer, id, initd, code)
if (initd == 1) then
	for _, buffen in ipairs(elitepvp.buffspellids) do
		pPlayer:CastSpell(buffen)
	end
	pUnit:GossipComplete()
end

if (initd == 2) then
	for _, debuffen in ipairs(elitepvp.buffspellids) do
		pPlayer:RemoveAura(debuffen)
	end
	pUnit:GossipComplete()
end

if (initd ==3 ) then
pUnit:GossipComplete()
end
end


RegisterUnitGossipEvent(NPC_ID, 1, "ElitePvPAnleitung_I")
RegisterUnitGossipEvent(NPC_ID, 2, "ElitePvPAnleitung_II")

Und wie man es nicht machen sollte lt. TE:

Code:
function ElitePvPAnleitung_I(pUnit, event, pPlayer)			
pUnit:GossipCreateMenu(99, pPlayer, 0)
pUnit:GossipMenuAddItem(0, "Buff mich", 1, 0)
pUnit:GossipMenuAddItem(0, "Debuff mich", 2, 0)
pUnit:GossipMenuAddItem(0, "Tsch\195\188ss", 3, 0)
pUnit:GossipSendmenu(pPlayer)
end

function ElitePvPAnleitung_II(pUnit, event, pPlayer, id, initd, code)
if (initd == 1) then
pPlayer:CastSpell(20217)
pPlayer:CastSpell(1126)
pPlayer:CastSpell(17)
pPlayer:CastSpell(21562)
pUnit:GossipComplete()
end

if (initd == 2) then
pPlayer:RemoveAura(20217)
pPlayer:RemoveAura(1126)
pPlayer:RemoveAura(17)
pPlayer:RemoveAura(21562)
pUnit:GossipComplete()
end

if (initd == 3) then
pUnit:GossipComplete()
end
end


RegisterUnitGossipEvent(NPC_ID, 1, "ElitePvPAnleitung_I")
RegisterUnitGossipEvent(NPC_ID, 2, "ElitePvPAnleitung_II")
°"Crazy"° is offline  
Old   #6
 
elite*gold: 0
Join Date: Apr 2015
Posts: 16
Received Thanks: 4
Quote:
Originally Posted by °"Crazy"° View Post
Weil es sonst ein anderer macht. Einige haben Vorkenntnisse, die brauchen den Quatsch oben drüber nicht und wollen gerne neue Schreibstile für ggf. Optimierungen anschauen. Ich lese mir meistens die Scripts durch und überfliege die Texte. Im Groben und Ganzen kann man vom Code her sehen, in welche Richtung es geht.

Für alle, die sich das gesamte Script anschauen wollen:

Code:
local elitepvp = {
				["buffspellids"] = {20217,1126,17,21562}
				["menuepunkte"] =
                                {
                        { ["icon"] = 0, ["txt"] = "Buff mich", ["intid"] = 1, ["code"] = 0 },
                        { ["icon"] = 0, ["txt"] = "Debuff mich", ["intid"] = 2, ["code"] = 0 },
						{ ["icon"] = 0, ["txt"] = "Tsch\195\188ss", ["intid"] = 3, ["code"] = 0 },
                                }
			}

function ElitePvPAnleitung_I(pUnit, event, pPlayer)			
pUnit:GossipCreateMenu(99, pPlayer, 0)
for k,v n ipairs(elitepvp.menuepunkte) do
	pUnit:GossipMenuAddItem(v.icon, v.txt, v.initd, v.code)
	end
	pUnit:GossipSendMenu(pPlayer)
end

function ElitePvPAnleitung_II(pUnit, event, pPlayer, id, initd, code)
if (initd == 1) then
	for _, buffen in ipairs(elitepvp.buffspellids) do
		pPlayer:CastSpell(buffen)
	end
	pUnit:GossipComplete()
end

if (initd == 2) then
	for _, debuffen in ipairs(elitepvp.buffspellids) do
		pPlayer:RemoveAura(debuffen)
	end
	pUnit:GossipComplete()
end

if (initd ==3 ) then
pUnit:GossipComplete()
end
end


RegisterUnitGossipEvent(NPC_ID, 1, "ElitePvPAnleitung_I")
RegisterUnitGossipEvent(NPC_ID, 2, "ElitePvPAnleitung_II")

Und wie man es nicht machen sollte lt. TE:

Code:
function ElitePvPAnleitung_I(pUnit, event, pPlayer)			
pUnit:GossipCreateMenu(99, pPlayer, 0)
pUnit:GossipMenuAddItem(0, "Buff mich", 1, 0)
pUnit:GossipMenuAddItem(0, "Debuff mich", 2, 0)
pUnit:GossipMenuAddItem(0, "Tsch\195\188ss", 3, 0)
pUnit:GossipSendmenu(pPlayer)
end

function ElitePvPAnleitung_II(pUnit, event, pPlayer, id, initd, code)
if (initd == 1) then
pPlayer:CastSpell(20217)
pPlayer:CastSpell(1126)
pPlayer:CastSpell(17)
pPlayer:CastSpell(21562)
pUnit:GossipComplete()
end

if (initd == 2) then
pPlayer:RemoveAura(20217)
pPlayer:RemoveAura(1126)
pPlayer:RemoveAura(17)
pPlayer:RemoveAura(21562)
pUnit:GossipComplete()
end

if (initd == 3) then
pUnit:GossipComplete()
end
end


RegisterUnitGossipEvent(NPC_ID, 1, "ElitePvPAnleitung_I")
RegisterUnitGossipEvent(NPC_ID, 2, "ElitePvPAnleitung_II")
Oh, mal jemand der nichts gegen mein Tutorial sagt. Ich danke dir.


Ich bin immernoch der meinung das Lesen bildet.. Mag vielleicht Oldschool sein aber es ist meine meinung.... Aber die darf ja jeder für sich hegen nichtwahr?
DefqonPure is offline  
Old   #7
 
elite*gold: 2693
Join Date: Jul 2010
Posts: 6,449
Received Thanks: 1,224
Quote:
Originally Posted by DefqonPure View Post
Oh, mal jemand der nichts gegen mein Tutorial sagt. Ich danke dir.
Nicht dafür. Dennoch bitte ich Dich, folgendes lieber rauszunehmen:

Quote:
Originally Posted by DefqonPure View Post
[CENTER]Hallöchen liebe ElitePvPer!
Vorvorwort:
Rechtschreibfehler dürfen behalten werden!
Falls fragen auftreten sollten, meine skype adresse ist: skriptkrieger
Falls Skype nicht gegeben ist könnt Ihr mir hier eine PM hinterlassen.
Falls Ihr anfragen auf weitere Anleitungen bezüglich Scripten oder Coden habt, gerne per PM auflisten
Bei sowas machst du Dich gleich unbeliebt. 14, keine Hobbys und ggf. Hauptschule, das ist der klassische Trend, den man im Kopf hat. Zudem sind Kontaktdaten auch Fehl am Platze, denn hier ist ein Forum zum Diskutieren. Bei Fragen sollen alle mit ins Boot geholt werden, um ggf. andere Leute, die auch vor diesem Fehler stehen, zu helfen.


Quote:
Ich bin immernoch der meinung das Lesen bildet.. Mag vielleicht Oldschool sein aber es ist meine meinung.... Aber die darf ja jeder für sich hegen nichtwahr?
Für Neulinge muss man es Idiotensicher schreiben. Man fängt erstmal bewusst falsch an, damit man die Grundmechaniken kapiert. Danach kommen die If - Then - Else bzw. loops, um den höheren Schmalz zu aktivieren. So habe ich auch bewusst mich entwickelt, denn ohne Grundlage bzw. ohne es kapiert zu haben, muss man einen anderen Weg finden.
°"Crazy"° is offline  
Old   #8
 
elite*gold: 115
Join Date: May 2010
Posts: 206
Received Thanks: 89
Herzlich willkommen DefqonPure im WoW-P-Server-Bereich auf epvpers, dem einzigen Ort im Internet wo jeder den größten und längsten hat und alle anderen ohnehin keine Ahnung haben.
Hier triffst du viele Leute die alles können, ganz besonders Kritik verteilen :-)

Alles in allem stimme ich mit deinen Aussagen zum größten Teil überein. Der kleine verschwindende Teil mit dem ich nicht mit dir übereinstimme ist die LUAEngine (oder auch Arcemu LUA-Engine).

Arcemu hat gegen Ende 2010 die "LUABridge" eingeführt (also bei Arcemu gibt es zwei wege LUA-Scripts einzubinden.).

Der Vorteil der LUABridge fragst du nun? Ganz einfach:
Die LUABridge war für den effektiveren gebrauch von Resourcen für "große" Scripts gedacht gewesen. Hierzu wurde ein modularer Aufbau der einzelnen script vorgesehen. (Ich bin mir ziemlich sicher, dass du mit den Erklärungen auf den Wiki-Seiten gut bedient bist).
Warum die LUABridge sich nicht durchgesetzt hat? Auch ganz einfach. Script-kiddies waren mit dem modularem Aufbau überfordert und da es dazu leider nicht so viele Dinge im Internet gab (Welche man sich einfach kopieren konte) verlief sich das ganze im Sand.

----------------------------Gedankenstrich.

Noch so nebenbei, wundere dich nicht über Leute die dich immer und immer wieder merkwürdig beäugen weil du ArcEmu benutzt. Es gehört sich bei den meisten zum guten Ton natürlich nur das beste vom besten zu nehmen, Mangos.... ähhh ich meine Trinity ;-).
Tulba is offline  
Old   #9
 
elite*gold: 110
Join Date: Mar 2008
Posts: 827
Received Thanks: 361
Quote:
Originally Posted by DefqonPure View Post
Also zuerst reden wie Hier über Lua und nicht C++. Loops laufen schneller. IMMER.

Was ich hier mit der anleitung versuche zu deuten soll sich nicht nur auf so kleine codes beziehen, sondern auf codes die was weiß ich wie lang sind 500 oder 600 zeilen+. Da ist es vorteilhaft mit Metatabellen zu arbeiten anstatt 10000000 befehle in den script zu hauen.
Wie ich bereits gesagt habe: Der Code ist einfacher zu erweitern. Dagegen habe ich nie etwas gesagt.


Quote:
Originally Posted by DefqonPure View Post
Wieso sollte ich das machen? Es ist eine Anleitung und kein Release. Ich wollte dadurch verhindern das sich jemand den script schnappt und das geschriebene obendrüber ignoriert (Sinn und zweck eines Tutorials (das man es ließt und versteht und nicht rauskopiert)) aber gut das sind verschiedene meinungen. Die aufgabe eines Tutorials besteht nicht darin den endcode zu kopieren und seine infos reinzuschreiben... Dem Anleitungsverlauf folgen und mitschreiben aufgrund des verständnisses das vermittelt wird.. Keine ahnung in welcher Welt du lebst wo man Copy & Paste beim Coden betreibt. (sounds leaky to me)
Crazy hat erklärt warum.

Quote:
Originally Posted by DefqonPure View Post
Das ist wahr. Ich wollte hier aber kein BuffNPC Script veröffentlichen, sondern eine scriptweise deutlich machen die deine resourcen beim hosten schonen kann.

Diese Methode kann dir Resourcen sparen wenn du viele Classen/Rassen checks beachten musst beim Coden, und wenn du Loops benutzt läuft der Script eben schneller. Und das wollte ich mit diesem Tutorial erörtern. Das man sich z.B 20x if und 10x else sparen kann wenn man mit Metatabellen arbeitet.
Ich habe nie von einem Buff-NPC gesprochen.
Das Tabellen Ressourcen schonen können ist wahr, allerdings sind bei ordentlicher Programmierung auch keine 20 If-Bedingungen benötigt.
Aber alleine wegen der Übersicht würde ich ebenfalls zu Tabellen greifen.

Quote:
Originally Posted by DefqonPure View Post
Unnötiges LuaEngine belasten durch undurchdachtes Coden ist für mich kein Offizielles Lua schreiben. Ende aus.
Es geht eben darum, dass es LUA NICHT unnötig "belastet", wie du es behauptest. Was "belastet" LUA wohl mehr, 5 Funktionsaufrufe mit normaler Parameterübergabe oder das iterieren einer Tabelle, aus welcher die Daten geholt werden müssen und erst dann als Parameter übergeben werden müssen.
Wie ich bereits geschrieben hatte: Die Anzahl der Funktionsaufrufe ist die gleiche, allerdings verbraucht das Iterieren der Schleife minimal mehr Ressourcen als wenn ich nur die Funktion aufrufe. Besonders bei einer solch kleinen Anzahl.
Aber auch hier gilt: Wegen der Übersicht und Erweiterbarkeit würde ich es genau so machen. Das dies performanter ist, Arbeitsspeicher schont oder sonstwas ist allerdings nicht wahr. Und gerade für Anfänger, für welche dieses Tutorial gedacht ist, sollte man nicht mit irgendwelchen Aussagen, die nicht einmal stimmen, verwirren.

Quote:
Originally Posted by DefqonPure View Post
Ich bin einfach der Meinung das mal jemand was dazu schreiben sollte, da wahrscheinlich niemand das hier ließt: , ich meine.... schau dir doch mal die ganzen Public Scripts an.. ich bitte dich ( Du hast es offenbar auch nicht aufmerksam gelesen oder überhaupt nicht gelesen. ALLES WAS DU LOCAL MACHEN KANNST BEI LUA SOLLST DU LOCAL MACHEN UND HALTEN!!!!!!!!) Fertig aus mehr sag ich zu diesem thema nicht, da alles was du dagegen sagst mir nur ein bild vermittelt das du versuchst mich hier zu verscheuchen.
Ich möchte dich absolut nicht verscheuchen, finde es sogar gut, dass sich auch mal einige andere Programmierer zu Wort melden. Wenn du aber Unsinn erzählst, kannst du damit rechnen, dass ich dich korrigieren werde.

Wo habe ich denn gesagt, dass ich diese Variable nicht im lokalen Scope unterbringen würde? Das dies performanter ist, ist mir klar und habe ich auch nie abgestritten.

Quote:
Originally Posted by DefqonPure View Post
Das ist ja nur ein Tutorial wie du deine Performance steigern kannst wenn du diese methode jetzt bei ALLEN scripts in deiner Libary anwendest und nicht nur bei einem Code.
Es steigert eben nicht die Performance. Es steigert die Übersicht und erleichtert das Erweitern des Scripts. Und dafür ist es auch ein schönes Beispiel.

Quote:
Originally Posted by DefqonPure View Post
Weil diese ganzen "LUA" scripts die im Netz rumfliegen nahezu ALLE memoryleaks verursachen. Diese Scripte sind durch Stumpfsinn ins leben gerufen und verteilt worden. Sie tun was sie sollen aber auf dem komplett falschen weg.
Dann zeig mir doch mal ein öffentliches Script, welches deiner Meinung nach einen memory leak verursacht. Mir ist momentan keines bekannt. Und es gibt etliche Wege etwas zu programmieren. Etwas als falsch anzusehen, nur, weil es nicht deinem Programmierstil entspricht, ist einfach nur schwachsinnig.
Leider findet man dieses Phänomen häufig bei Programmierern, "mein Code ist eh viel besser als der von Anderen, ich schreib es einfach selbst". Und genau das ist oftmals der falsche Ansatz in diesem Bereich.

Quote:
Originally Posted by DefqonPure View Post
Nur weil diese Methode nicht so weit verbreitet ist, heißt es nicht das sie nicht besser ist. Aber wenn jetzt schon mehrere leute dagegen sind, lösche ich die Anleitung wieder, da ja offenbar eh nur totaler Quatsch drinne steht XD....
Es ist eine schöne Anleitung, für einen leicht erweiterbaren und übersichtlichen Code. Ich habe auch nie behauptet, dass dieses Tutorial schlecht sei. Ich will nur die Unwahrheiten aufklären.


__________________________________________________

Quote:
Originally Posted by Tulba
erzlich willkommen DefqonPure im WoW-P-Server-Bereich auf epvpers, dem einzigen Ort im Internet wo jeder den größten und längsten hat und alle anderen ohnehin keine Ahnung haben.
Hier triffst du viele Leute die alles können, ganz besonders Kritik verteilen :-)

Alles in allem stimme ich mit deinen Aussagen zum größten Teil überein. Der kleine verschwindende Teil mit dem ich nicht mit dir übereinstimme ist die LUAEngine (oder auch Arcemu LUA-Engine).

Arcemu hat gegen Ende 2010 die "LUABridge" eingeführt (also bei Arcemu gibt es zwei wege LUA-Scripts einzubinden.).

Der Vorteil der LUABridge fragst du nun? Ganz einfach:
Die LUABridge war für den effektiveren gebrauch von Resourcen für "große" Scripts gedacht gewesen. Hierzu wurde ein modularer Aufbau der einzelnen script vorgesehen. (Ich bin mir ziemlich sicher, dass du mit den Erklärungen auf den Wiki-Seiten gut bedient bist).
Warum die LUABridge sich nicht durchgesetzt hat? Auch ganz einfach. Script-kiddies waren mit dem modularem Aufbau überfordert und da es dazu leider nicht so viele Dinge im Internet gab (Welche man sich einfach kopieren konte) verlief sich das ganze im Sand.

----------------------------Gedankenstrich.

Noch so nebenbei, wundere dich nicht über Leute die dich immer und immer wieder merkwürdig beäugen weil du ArcEmu benutzt. Es gehört sich bei den meisten zum guten Ton natürlich nur das beste vom besten zu nehmen, Mangos.... ähhh ich meine Trinity ;-).
Kritik verteilen kann ich besonders gut, korrigieren (zum Wohle der Community und aller, die auf Threads wie diese stoßen) noch besser.
Ich beäuge ihn nicht merkwürdig, weil er ArcEmu benutzt, sondern weil mir bereits etliche Male aufgefallen ist, dass Leute auf ArcEmu setzen und dann früher oder später doch zu TrinityCore/MaNGOS/CMaNGOS wechseln, weil es einfach weniger Arbeit ist und der Code besser gestaltet ist. Über das letztere kann man sich natürlich streiten. In dem Projektthread ist mir bereits aufgefallen, dass viel Customzeug geplant ist, aber es an einigen Ecken und Kanten bei ihm einfach noch an Erfahrung mangelt.
Bestes Beispiel: Er schickte mir nach meinem Post in diesem Thread eine PN, in welcher ein Link zu einer Seite war, welche sagte: For-Each-Schleifen sind in LUA bis zu 20% schneller als While-Schleifen. Was er mir damit sagen wollte? Bin mir auch nicht so ganz sicher, aber er wollte damit bestimmt auf meinen Post eingehen, in welchem ich aber nie etwas von einer Verbesserung per While-Schleife geschrieben habe.

Ich bin jetzt auch weitem nicht der beste Programmierer, aber ich kann einigen Bereichen einfach aus jahrelanger Erfahrung sprechen. Und solche Aussagen ala "Das iterieren durch eine Tabelle, aus welcher Funktionsaufrufe entstehen, verhindert memory leaks und verbraucht weniger Arbeitsspeicher als 5 normale Funktionsaufrufe hintereinander" kann ich nicht durchgehen lassen. Es ist nämlich genau das Gegenteil. Wenn nicht aufgepasst wird und man z.B. Elemente per Funktion aus der Tabelle entfernt, DANN kann ein memory leak entstehen. Und die Begründung, warum sowas wenger Arbeitsspeicher verbrauchen sollte, suche ich auch noch.
Kaev <3 is offline  
Old   #10
 
elite*gold: 115
Join Date: May 2010
Posts: 206
Received Thanks: 89
Kaev, die Aussage mit ArcEmu war generell gehalten und entgegen deiner Beobachtungen arbeite ich seit 2007 glücklich und zufrieden damit.
(Vielleicht weil ich nicht so bequem oder sogar faul bin wie andere, oder weil meine Anforderungen nicht durch Trinity gedeckt werden :-))

Ob er nun noch mehr Erfahrung braucht, kann ich nicht beurteilen. Das Einzige was ich sehr positiv finde, ist das hier mal wieder auf "hohem" niveau Diskutiert wird. (seid mal ehrlich, so eine Diskusion gab es schon seit.... ähm... Jahren nicht mehr?).
Jedoch sollte man auch andere Sichtweisen annehmen können, bzw. diese verstehen (Also das ist generell gesagt und geht hier an niemanden direkt).

Was mir immer wieder auffällt ist, dass egal wer hier "neu" ist, erstmal wird kritisiert (Jetzt mal von diesem Thema hier abgesehen, bestes Beispiel ist wohl die Servervorstellung). Es wird viel negativ angemäkelt (Ich bin da auch keine Ausnahme, ich weiß). Vielleicht sollte man nicht nur negative Dinge posten sondern auch positive, sonst sind bald alle vergrault. (Viele Leute gehen lieber auf andere Platformen weil sie ganz genau wissen, dass sie auf epvpers entweder "weggebeeft" oder ignoriert werden. Das Ziel sollte doch eher sein, dass die Leute gerne hier her kommen, weil ihnen geholfen wird bzw. sie hier das finden was sie Suchen... Eine Community).

So viel aus der Nacht :-)
Tulba is offline  
Thanks
2 Users
Old   #11
 
elite*gold: 0
Join Date: Apr 2015
Posts: 16
Received Thanks: 4
Quote:
Originally Posted by Kaev <3 View Post
Dann zeig mir doch mal ein öffentliches Script, welches deiner Meinung nach einen memory leak verursacht.
Zufälligerweise ist der Teleporter von mir aus einem anderen Forum rauskopiert um es dir deutlich zu machen was ich versucht habe in diesen ganzen Tutorial hier deutlich zu machen.

Teleporter.

Ohne Memoryleak:
Memoryleak:
DefqonPure is offline  
Old   #12
 
elite*gold: 110
Join Date: Mar 2008
Posts: 827
Received Thanks: 361
Ich glaube, dir ist nicht bewusst, was ein memory leak ist.
Ich zitiere mal den Artikel aus Wikipedia:
Quote:
Originally Posted by Wikipedia
Speicherleck (englisch memory leak, gelegentlich auch Speicherloch oder kurz memleak) bezeichnet einen Fehler in der Speicherverwaltung eines Computerprogramms, der dazu führt, dass es einen Teil des Arbeitsspeichers zwar belegt, diesen jedoch weder freigibt noch nutzt.
Das passiert zum Beispiel, wenn ich in LUA eine Tabelle erstelle und zur Laufzeit etwas entferne, der Speicher aber nicht wieder sorgfältig freigegeben wird.
Das passiert in keinem der von dir verlinkten Scripts.

Laut deinen Aussagen ist jeglicher Funktionsaufruf mit direkter Parameterübergabe ein memory leak. Ich kann dir versichern: Das ist nicht so.

EDIT: Das der untere Code natürlich wesentlich leichter zu lesen, debuggen und erweitern ist, ist natürlich klar.
Kaev <3 is offline  
Old   #13
 
elite*gold: 0
Join Date: Apr 2015
Posts: 16
Received Thanks: 4
Quote:
Originally Posted by Kaev <3 View Post
Ich glaube, dir ist nicht bewusst, was ein memory leak ist.
Ich zitiere mal den Artikel aus Wikipedia:

Das passiert zum Beispiel, wenn ich in LUA eine Tabelle erstelle und zur Laufzeit etwas entferne, der Speicher aber nicht wieder sorgfältig freigegeben wird.
Das passiert in keinem der von dir verlinkten Scripts.

Laut deinen Aussagen ist jeglicher Funktionsaufruf mit direkter Parameterübergabe ein memory leak. Ich kann dir versichern: Das ist nicht so.

EDIT: Das der untere Code natürlich wesentlich leichter zu lesen, debuggen und erweitern ist, ist natürlich klar.
Jetzt verstehe ich dein problem.

Nein. Wir reden hier über Programmierbezogenes Fehlerhaftes scripten welches den Arbeitsspeicher in die Höhe treibt.

Erstens, diese Methode ist schneller zu schreiben
Zweitens, check mal den Zeilenunterschied (dementsprechend auch weniger lesematerial für die Engine an sich 781 zu 181 wird definitv mehr als doppelt so schnell gelesen und wiedergegeben.
Drittens und damit der letzte versuch dir was einzuleuchten.. Du sitzt nämlich ganz am anfang fest mit deinen Aussagen:

Wenn ich etwas Local mache.. Seis Spells seis Koords seis was weiß ich.
Und ich eine For schleife verwende wird ja nicht permanent ALLES wieder gegeben was im Script steht, sondern nur was der Spieler tatsächlich anwendet. Im gegensatz zur anderen methode wo immer alles zu 100% benutzt wird wenn der script aufgerufen wird ingame.


Beispiel: ( idiotischer kann ichs net beschreiben crazy )
wenn der spieler meinen teleporter verwendet, und nach em hauptmenü auf horde städte drückt, wird ALLES ANDERE AUS DEM SCRIPT WIEDER AUSGEBLENDET, solang der spieler NICHT darauf zugreift.

Entgegen zu dem anderen script wenn der spieler sich im horde menü befindet, sind die anderen sache alle aktiv und unbenutzt und rauben dir damit den Arbeitsspeicher (memoryleak) den du dir sparen kannst.

Schönen Tag
DefqonPure is offline  
Old   #14
 
elite*gold: 110
Join Date: Mar 2008
Posts: 827
Received Thanks: 361
Quote:
Originally Posted by DefqonPure View Post
Erstens, diese Methode ist schneller zu schreiben
Zweitens, check mal den Zeilenunterschied (dementsprechend auch weniger lesematerial für die Engine an sich 781 zu 181 wird definitv mehr als doppelt so schnell gelesen und wiedergegeben.
Stimme dir bei beiden Punkten zu. Natürlich werden weniger Zeilen schneller geparsed, aber bei der Geschwindigkeit der heutigen Rechner würde dieser kleine Unterschied niemanden einem Zacken abbrechen. Optimiert ist natürlich trotzdem schöner.

Quote:
Originally Posted by DefqonPure View Post
Du sitzt nämlich ganz am anfang fest mit deinen Aussagen
Das denke ich nicht.

Quote:
Originally Posted by DefqonPure View Post
Wenn ich etwas Local mache.. Seis Spells seis Koords seis was weiß ich.
Und ich eine For schleife verwende wird ja nicht permanent ALLES wieder gegeben was im Script steht, sondern nur was der Spieler tatsächlich anwendet. Im gegensatz zur anderen methode wo immer alles zu 100% benutzt wird wenn der script aufgerufen wird ingame.

Beispiel: ( idiotischer kann ichs net beschreiben crazy )
wenn der spieler meinen teleporter verwendet, und nach em hauptmenü auf horde städte drückt, wird ALLES ANDERE AUS DEM SCRIPT WIEDER AUSGEBLENDET, solang der spieler NICHT darauf zugreift.

Entgegen zu dem anderen script wenn der spieler sich im horde menü befindet, sind die anderen sache alle aktiv und unbenutzt und rauben dir damit den Arbeitsspeicher (memoryleak) den du dir sparen kannst.
Deine Tabelle liegt, dank dem Keyword local, aber im Scope des Scripts. Dieser Scope befindet sich über dem Scope der Menüfunktionen, wird somit also nicht zerstört, wenn du eine Funktion aufrufst. Und damit liegt dann auch die Tabelle weiterhin im Arbeitsspeicher, egal ob nun Untermenü bist oder nicht. Wie sollte er auch sonst an die Inhalte der Tabelle kommen?
Sobald das Script zerstört wird, wird auch der lokale Scope des Scripts zerstört. Und spätestens in diesem Fall würden auch die übergebenen Parameter ohne Tabelle zerstört werden.

Und nur, weil Funktion A und Funktion B das gleiche machen, A aber mehr RAM verbraucht, ist es nicht gleich ein memory leak. In beiden von dir genannten Fällen werden alle Ressourcen belegt und durch Zerstörung des Scopes auch wieder freigegeben. Würde Funktion A Speicher belegen, aber diesen nie benutzen und auch nie wieder freigeben, dann wäre es ein memory leak.
Kaev <3 is offline  
Old   #15
 
elite*gold: 0
Join Date: Apr 2015
Posts: 16
Received Thanks: 4
Ich kriege es echt nich in dich rein.. Gut. Bleib bei deiner meinung, ist ja gesund oder sowas. Ich kann nur das vermitteln was ICH weiß und was mir beigebracht wurde (Rochet2) --> KISS (Keep It Simple Smart)

Ich gebs auf dir irgendwas zu erklären da du immer mit was anderem kommst. AN ALLE DENEN DAS TUTORIAL GEHOLFEN HAT, würde mich über eure Kommentare und evtuelle Scriptbeispiele die ihr erstellt habt freuen


DefqonPure is offline  
Reply



« Previous Thread | Next Thread »

Similar Threads
ArcEmu Server Anleitung - 3.0.3[German/Deutsch]
VORERST: BITTE FRAGT MICH NICHT WENN IHR HILFE BRAUCHT! DAS IST NICHT VON MIR GESCHRIEBEN. BALD KOMMT EIN 3.0.9 GUIDE RAUS!! Inhalt: - 1.0...
443 Replies - WoW PServer Hosting
Anleitung: Arcemu(3.0.9,3.1.1,3.2.0) WoWPrivatserver erstellen
Hallo Leute! Ich will euch heute meine Anleitungvorstellen!Ihr werdet hier immer die neueste(n) Version(en) von Arcemu finden und deren Anleitung!....
191 Replies - WoW PServer Hosting
[Frage]Anleitung für arcemu
Hallo liebe ElitePvPers! ich suche jetz schon seit 4 stunden ein Thema wo drinne steht wie man sich ein Arcemu WoW Server auf 3.2.2a macht!!! Kennt...
1 Replies - WoW Main - Discussions / Questions
wow 3.0.9 arcemu Server Anleitung ?
Hey Leute Ich suche eine gute Anleitung für ein eigenen p server arcemu 3.0.9 ! Mit einer ziehmlich bugfreien Core,DB Freu mich auf eine schnelle...
1 Replies - WoW PServer Hosting



All times are GMT +2. The time now is 12:38.


Powered by vBulletin®
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Abuse
Copyright ©2017 elitepvpers All Rights Reserved.