ach?
wissen ist wissen wo es steht :P
es lernt ja auch keiner die funktions referenz von php oder c auswendig
Beiträge von -p4n-
-
-
och ne keine mounts, da hab ich so ne kandidaten die jedes mount haben will und nervt bis sie es hat, da bau ich keine neue ein ^^
-
naja das is bei mangos au ^^
wenn ich .npc eingebe zeigt er mir die unterberehle an, zB info, add, delete
und er versteht abkürzungen
.l s = .lookup spell :S -
das is nur für hunter, nich?
weißt zufällig wie man das als normales haustier für jederman machen kann? -
könnte man nich auch n gameobject neben den geistheiler stellen das das erledigt?
also ohne quest mein ich ... -
ich kenn zwar arcemu nich, aber bei mangos gibts sogar n eigenes UI addon das die befehle kennt. is sogar recht aktuell. und dank hilfe findet man auch die syntax zu jedem befehl.
und wie schon gesagt wurde, wenn man die hälfte wirklich braucht ists viel ^^
und wer jeden tag mit sowas "spielt" merkt sich den mist auch .. zumindest bis zum nächsten update wenn mal wieder alle befehle durcheinandergewürfelt wurden xDwas mich jetzt noch interessieren würde is, gibts da noch abstufungen bei arc emu?
also mangos hat ja verschiedene gm stufen die auch unterschiedliche rechte haben. zB n GM 1 darf den server nich runterfahren, das darf nur ein admin ^^ -
*klatsch* *klatsch*
war sicher viel arbeit das abzuschreiben, oder hast es kopiert
-
glaub nicht das er sniffen wollte ^^
das ganze klingt eher nach packet injection, da gibts n projekt auf sourceforge ... nemesis
http://nemesis.sourceforge.net/
da müsste man aber wohl noch bissel basteln das es genau das tut was du willst. ob es was wirklich fertiges gibt weiß ich nich. is aber zumindest n guter anfang, packet injection is nich grad trivial ... -
Zitat von Lunatic;46289
Tjoa, da hilft nur eins wa? Weiterbilden. Ferner man will kann man da auch mit AJAX viel anstellen.ok fein, du schicks den ganzen zu testenden kram per ajax an ein script das das zeug testet und erhälst vom server ne meldung ob ok, nich, oder etwas korrigiertes. weiter bist du an der stelle noch nich.
du kannst natürlich auch das formular per xmlrequest lostreten, eingaben überprüfen korrigieren und gleich speichern oder was auch immer damit machen. was du an der stelle gegenüber dem normalen submit gewonnen hast, weiß ich nun wirklich nich. -
er hat keine 322 spieler, das is die version ^^
aber ganz ehrlich 243 wird nach einigen monaten auch extrem langweilig, wobei mir der 3.x kram bislang noch nich so gefällt. gut fahrzeuge sind mal ne hübsche abwechslung, und 3.x hat auch schöne encounter .. wenn sie funktionieren ^^
-
dann würd ich das ganze in php erledigen und den benutzer einfach darauf hinweisen das sein benutzername klein geschrieben wird. bzw noch mal ausgeben ..
javascript kann schon einiges mit strings anstellen, zB auch reguläre ausdrücke, is zwar etwas gewöhnungsbedürftig, aber es geht. was der umweg über ajax soll is mir da bissel schleierhaft.
-
du könntest n event an das form hängen und bei submit entweder prüfen ob großbuchstaben drin sind oder einfach den string im textfeld in kleinbuchstaben umwandeln.
oder ein event für das textfeld onKeypress, was ziemlich genau das wäre .. aberwas ich mich frage ist, warum?
und was soll danach damit passieren? -
hi,
wollen wir doch mal sehen obs hier wirklich so tot is ^^
für den anfang hier mal ein kurzer Text in Sachen SQL grundlagen für MaNGOS und ähnliche Emus. Im grunde ist es eh immer das gleiche man muss nur wissen wie die tabellen aufgebaut sind, der rest is nur Syntax und darum gehts im grunde ^^
[FONT="Verdana"][SIZE="3"]Wozu SQL?[/SIZE]
Natürlich kommt man auch ohne SQL-Wissen zurecht, MaNGOS updated die Struktur selbst und gefüllt wird die Datenbank von UDB oder ähnlichem. Das Resultat ist dann ein Server von der Stange. Ok wir können NPCs und Objekte ingame an anderen Orten aufstellen und einige weitere Scherze treiben. Doch irgendwann möchte man vielleicht eine "Kopie" von NPC X mit anderen Eigenschaften oder einen Boss-Mob der friedlich in der Gegend rumsteht ohne gleichzeitig den Encounter zu zerstören. An dieser Stelle kommen wir um einen direkten Eingriff in die Datenbank nicht herum.
Bleiben wir mal beim Beispiel Boss Encounter. Stellen wir uns mal vor wir wünschen uns eine etwas kleinere Version von Illidan um daraus Wachen für unsere GM-Insel zu basteln.
Dafür müssen wir Illidan erstmal finden, das erledigen wir mit der Select Anweisung:
Damit finden wir alle Datensätze bei denen der Wert des Feldes "name" mit "Illidan " beginnt. Das % dient in SQL als Platzhalter wie man das aus anderen Anwendungen vom "*" gewöhnt ist. Das Leerzeichen zwischen dem Namen und dem % ist an dieser Stelle wichtig, weil "Illidan%" würde auch "Illidanblahblub" finden, wir wissen aber das "Illidan" ein einzelnes Wort ist. Der grundlegende Aufbau einer Select-Anweisung ist folgender:
Nach dem Schlüsselwort Select folgt eine Aufzählung aller Felder die uns interessieren. will man alle Felder sehen kann man das mit einem "*" abkürzen, das ganze nennt man dann gemeinhin "blind-Select". Nach der Aufzählung sagen wir welche Tabelle wir betrachten wollen und filtern das Ganze mit einer WHERE-Klausel. Wer sich näher über Select-Anweisungen informieren möchte, sollte sich einen Abend zeit nehmen und die MySQL Dokumentation zu dem Thema lesen (is wirklich recht viel).An dieser Stelle ein paar Worte zu Datenbanken. Datenbanken sind in (in der Regel, es gibt Ausnahmen) zweidimensionalen Tabellen gegliedert. Tabellen bestehen aus mehreren Datensätzen und jeder Datensatz aus mehreren Werten. Der "Sinn" der Werte wird in der Tabellenstruktur durch einzelne Felder definiert. Welcher Wert für ein Feld gültig ist ergibt sich aus der Definition des Feldes.
Eine Datenbank kann ganz einfach mit:
erstellt werden. Man kann auch noch ein paar Optionen gleich an dieser Stelle vornehmen, ansonsten wählt das Managmentsystem den Serverstandard und erzeugt die neue Datenbank. Eine Tabelle zu erzeugen ist schon etwas komplexer, und man sollte sich in jedem Fall vorher Gedanken darüber machen was man eigentlich speichern möchte.Das erzeugt eine Tabelle mit dem Namen "tabelle1" die aus 2 Feldern besteht, "id" und "name". INT gibt an das für das Feld "id" nur ganze Zahlen zugelassen sind, für "name" sind beliebige Zeichen möglich allerdings kann das Feld nur höchstens 50 aufnehmen.
Gut zurück zu unserem Illidan Problem. Wir haben erfolgreich nach allen NPCs gesucht deren Name mit "Illidan " beginnt. An der Stelle müssten wir per .npc add schauen welcher davon der richtige ist, oder wir verlassen uns darauf das unser gesuchter der einzige mit einem Script ist. Der Scriptname steht im entsprchenden Feld im Datensatz. Gut wir können nun einfach schauen welcher davon ein script hat und alle Werte dieses Kandidaten notieren. Geht aber auch einfacher, man kann nämlich auch nach verschiedenen Werten gleichzeitig suchen.
Das sollte uns nun unseren geliebten Illidan hervorzaubern. Jetzt könnten wir Illidan schon kopieren, aber das ganze hat einen kleinen Hacken. Das Feld "entry" der Tabelle "creature_template" ist ein Primärschlüssel und hat somit nur einzigartige Werte zu beinhalten, das heißt wir können Illidan nich einfach mal so kopieren. Wir müssen das Datenbanksystem ein wenig überreden. Eine Möglichkeit wäre nur die Felder zu kopieren die nicht einzigartig sein müssen (Primärschlüssel, Unique-Index). Das ist bei der Tabelle allerdings fast abendfüllende Tipparbeit.Schneller geht es wenn wir uns eine Kopie von "creature_template" machen.
CodeCREATE TABLE ct_copy LIKE creature_template; INSERT INTO ct_copy SELECT * FROM creature_template;
Die erste Anweisung erstellt eine Tabelle "ct_copy" mit den gleichen Feldern und Eigenschaften unserer "creature_template" Tabelle. Danach wird alles aus der Tabelle "creature_template" in die Tabelle "ct_copy" kopiert. Genauer betrachtet bedeutet die Anweisung: Füge in Tabelle ct_copy alles ein was du in Tabelle creature_template findest. Man könnte natürlich auch nur den einen Illidan kopieren, dazu muss man nur das Select mit einer WHERE Klausel filtern, und die kennen wir ja schon von oben.SQLINSERT INTO ct_copy SELECT * FROM creature_template WHERE name LIKE "Illidan %" AND scriptname IS NOT NULL;
Jetzt können wir unseren Illidan in spee anpassen, das geschieht mit einer oder mehreren UPDATE Anweisungen. Dafür sollten wir uns natürlich vorher überlegen was wir überhaupt ändern wollen. Im UDB-Wiki gibt es einen Überblick über die Felder der Tabelle "creature_template", und davon KÖNNTE man praktisch alles ändern. Tun wir aber nich, sonst haben wir kein Illidan mehr übrig. Oben erwähnt wurde der Primärschlüssel, wer aufgepasst hat weiß, den müssen wir auf jeden Fall ändern. Als neuen Wert für entry sollte etwas möglichst weit weg von allen anderen Kreaturen liegen, also etwa 500.000. Dann passen wir hier noch beispielhaft den Schaden, das Script, die Größe und die Geschwindigkeit an.SQLUPDATE ct_copy SET entry=500000, mindmg=500, maxdmg =550, attackpower=170, dmg_multiplier=150 ScriptName='mob_eventai', speed = speed * 2, scale = 0.5 WHERE name LIKE "Illidan %" AND scriptname IS NOT NULL;
Nachdem wir alles angepasst haben was wir wollten, kopieren wir unseren Illidan zurück in die originale Tabelle.
Leider kann MaNGOS die creature_template nicht online neu laden, weshalb an dieser Stelle ein Neustart erforderlich ist. Ist das erledigt, können wir unseren Illidan aufstellen wo wir wollen.
[/FONT]bei interesse gibts noch mehr davon ^^
-
[FONT="Verdana"]hi,
im grunde ist es ja total einfach. window.open() und alles wird gut ..
naja gäbe es nicht popupblocker und die tatsache das popups einfach
nur nervig sind ^^die folgende methode benutzt in der kleinsten ausbaustufe javascript und etwas css.
das ganze lässt sich noch um AJAX komponenten erweitern, was hier aber
keine rolle spielen soll, AJAX tutorials gibts wie sand am meer, oder öfter.die idee hinter dem ganzen ist recht einfach, man nehme ein div-element
und missbrauche es als Popup-"fenster".
was ich in das fenster schreibe is erstmal egal, im folgenden beispiel steht
nur sinnloser text drin. man kann aber jedes html element darin unterbringen,
oder auch den inhalt des divs per AJAX nachladen.zunächst basteln wir uns mal ein kleines HTML-Beispiel, in dem wir irgendein
html-element anlegen auf das wir dann klicken um das popup zu öffnen.HTML
Alles anzeigen<?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>blub?</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <script src="test.js" type="text/javascript"></script> </head> <body> <div style="width: 100px;height: 80px; border: 1px solid red;background-color: orange; margin: 13px;" id="test">test</div> </body> </html>da wir schon wissen das wir javascript benötigen binden wir auch gleich eine
entsprechende datei mit ein.für den inhalt der datei gehen wir zunächst ein wenig borgen, ich brauch was
zuverlässiges für EventHandler (onClick ...).
was wir suchen ist Compat.addEventHandler .. google dürfte einige beispiele
liefern. des platzes wegen hab ichs hier etwas gekürzt.Code
Alles anzeigenfunction addEventHandler(element, event, handler) { var tmp, onevent; if (!element || !event ) return false; if (element.addEventListener) /*DOM-konform*/ element.addEventListener(event, handler, false); else { onevent = 'on'+event; if (element.attachEvent) /*IE*/ element.attachEvent(onevent, handler); else { /*ältere Browser*/ // eventuell schon vorhandene funktionen in die variable // tmp schieben tmp = element[onevent]; if (typeof tmp == 'function') { // gibt es tatsächlich schon einen handler // für das event den neuen "anhängen" element[onevent] = function() { tmp(); handler(); }; } else { // ansonsten einfach den aktuellen handler dem event // zuweisen element[onevent] = handler; } } } }dann basteln wir uns was kleines um tipparbeit zu sparen, wir sind ja
eigentlich faul ^^$('test') liefert somit das element mit der id "test"
als nächsten brauchen wir eine funktion, die den event handler an den
"button" hängtCodefunction initPage() { addEventHandler($('test'),'click',showPopup); } addEventHandler(window,'load',initPage);das klingt jetzt vielleicht blöd, is aber im grunde die einzig verlässliche methode.
das event window.onLoad wird erst aufgerufen, wenn der browser den
DOM-Baum fertig geparst hat. wir warten deshalb bis zu dem zeitpunkt,
weil wir dann sicher sind das alle element geladen sind und wir keine
fehlermeldung bekommen das "test" nicht vorhanden wäre.so jetzt nur noch die funktionen zum öffnen und schließen des popups.
Codefunction showPopup() { $('hideAll').style.display = 'block'; $('popup').style.display = 'block'; addEventHandler($('popup'),'click',closePopup); } function closePopup() { $('hideAll').style.display = 'none'; $('popup').style.display = 'none'; }wie man sieht wird hier einfach nur mit den style angaben der html objekte
gespielt. diese elemente gibts ja aber noch nich, also müssen wir sie noch
ins HTML einbauen.HTML
Alles anzeigen<?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>blub?</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <script src="test.js" type="text/javascript"></script> <style type="text/css"> #hideAll { width: 100%; margin: 0px; padding: 0px; height: 100%; background-color: #444; opacity: 0.9; filter:alpha(opacity=90); display: none; position: absolute; top: 0px; left: 0px; overflow: hidden; } #popup { width: 60%; height: 40%; background-color: orange; display: none; position: absolute; top: 15%; left: 10%; } </style> </head> <body> <div style="width: 100px;height: 80px; border: 1px solid red;background-color: orange; margin: 13px;" id="test">test</div> <div id="hideAll"> </div> <div id="popup">das ist das popup - klick zum schließen</div> </body> </html>was auch nicht weiter schwer ist.
hideAll "versteckt" die ursprüngliche Seite und verhindert auch das man
versehentlich etwas anderes als das popup anklickt.
hideAll wird mit position: absolut und left/top. 0px in der linken oberen
ecke des browsers ausgerichtet und mit height/width 100% über die
gesamte seite gezogen. opacity bzw filter, für IE, macht es dann noch
ein wenig transparent.
das popup wird auch absolut positioniert, wo is dann reine geschmacksfrage.
beide elemente werden erstmal mit display: none versteckt.
die funktionen stetzen den wert dann entweder für beide auf block zum
anzeigen oder wieder auf none zum verstecken.das sieht jetzt nach nem haufen aufwand wegen einem popup aus, das
problem ist hier leider, das IE nichts von addEventListener weiß, genauso
wenig wie ältere Browser.
Mit inline Events wäre man zwar schneller am ziel, die sollte man aber nicht
mehr verwenden, auch wenn sie praktisch von jedem JS fähigen browser
verstanden werden.
1) sie gehören nicht zum w3c standard und
2) mischt man damit zwangsläufig code und design, was man nicht tun soll
3) man kann nicht mehrere events an ein element hängen
4) ein event an mehrere elemente anhängen wird schnell unschön und viel tipperei.
so kann man alle gewünschten element in einer schleife durchlaufen und gut ^^viel spaß beim basteln ^^[/FONT]
-
was haben wir gelacht, erst um hilfe bitten, einen unausgegorenen versuch an quelltext posten zusammen mit einer beschreibung des programmablaufs, die nicht mal ansatzweise von den errungenschaften der logik profitiert.
UND dann sagen, "ne leute ich mach das schon richtig ihr habt ja keine ahnung was ich machen will"richtig, wahrscheinlich wolltest du 2 endlosschleifen nacheinander ausführen .. sry nur chuck norris kann 2 mal bis unendlich zählen, und der wohnt nich in deinem rechner
aber hey das letzte if tut ja zumindest das was du wolltest, aber das ist wohl eher purer zufall. blöd nur das die letzten zwei zeilen unreachable code sind. und der rest dank falsch verschachtelter while/if nich mal compilierbar is.
aber hey, wir wissen ja gar nich was du damit bezweckst ..
also sry nochmal das wir deinen thread mit unserer unwissenheit befleckt haben ...man was haben wir gelacht ...
P.S.: solche threads sind immer ein guter grund seinen account still zu legen und mit nem neuen namen zu beginnen, herr Xemnas xD
-
den letzten punkt bestreitet ja niemand, was ich aber meinte is, das selbst wenn in der datei nur eine 0 steht file() ja trotzdem ein array mit 0 liefert, das auch bei != nicht mit false "verwechselt" werden kann. und man daher hier auf === verzichten könnte.
und warum sollte ich irgend eine funktion aufrufen wenn === genau das tut was ich will?
-
naja aber der thread ersteller hat sich doch nicht gelöscht, wär doch möglich das er es liest ^^
-
könnte ich aber dann steht alles in einer zeile ne ;)
spielt jetzt zwar nich die rolle da der browser das dankt br-tag formatiert, aber wehe du schaust den quelltext der "seite" an. ich wollt zeilenumbrüche im quelltext, also denk ich sollte das schon dort sein ^^!== und != geht beides, aber === bzw !== ist typsicher
in dem fall is es wahrscheinlich egal, da ein array wohl nie vom typ boolean sein kann
aber gibt eine funktion zb im fehlerfall false zurück und ansonsten unter bestimmten umständen auch mal 0, hast du mit == oder != n kleines problem ^^
0 == false aber 0 !== false ;) -
hübscher code, nur bissel viel oder?
PHP$aFileContent = file('pfad/zur/datei.txt'); if ($aFileContent !== false) { foreach($aFileContent as $sLine) { echo rtrim($sLine,"\r\n") . '<br />' .PHP_EOL; } } else { echo 'Konnte Datei nicht öffnen.<br />'; }
bei größeren dateien dann aher fread, aber fgets is .... -
hmm den quellcode kann man nich mehr runterladen, absicht?
sieht recht statisch aus, also man kann nur 3 prozesse überwachen? ich mein bei wow reichts ja, gibt aber einige die bissel mehr zeug zum starten haben ^^
in dem anderen thread steht das du sowas versucht hast:
ich hoffe du hast das jetzt anders gemacht, ansonsten interessiert mich wie du die fehlermeldungen wegbekommst ^^