<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - IRCmud</title>
		<link>https://www.blitzforum.de/worklogs/321/</link>
		<description>Worklog von hamZta</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Thu, 25 Mar 2010 14:52:45 +0100</pubDate>
		<lastBuildDate>Thu, 25 Mar 2010 14:52:45 +0100</lastBuildDate>

		<item>
			<title>IRCmud ist tot!</title>
			<link>https://www.blitzforum.de/worklogs/321/#2228</link>
			<guid>https://www.blitzforum.de/worklogs/321/#2228</guid>
			<author>hamZta</author>
			<description>Eines vergangenen Abends, ich war gerade dabei an IRCmud weiterzuentwickeln und zu testen, st&amp;uuml;rzte der Server mit der undankbaren Meldung &amp;quot;EXCEPTION_ACCESS_VIOLATION&amp;quot; ab. Zum gesch&amp;auml;tzten 20sten Mal an besagtem Tag und ich war kurz davor BlitzMax gegen jede Wand meiner Wohnung zu werfen. Obendrein funktionierte das Datenbankmodul wieder mal nicht richtig, das machte die Sache nicht besser. Ich kam zu dem Schluss, dass BlitzMax f&amp;uuml;r das was ich vorhatte einfach nicht geeignet ist.&lt;br /&gt;&lt;br /&gt;Allerdings hatte sich schon vorher eine Idee in meinen Kopf eingenistet und nutzte die Gunst der Stunde: Ich hatte vor, IRCmud in C++ komplett neu zu schreiben und fortan mit dieser Sprache weiterzuentwickeln.&lt;br /&gt;Gesagt, getan. Nicht ganz so flott, aber doch relativ schnell hatte ich mit der Portierung begonnen, fast 80% des Codes musste ich schreiben ohne ihn richtig testen zu k&amp;ouml;nnen. Heute kann ich sagen: Es lebe IRCmud!&lt;br /&gt;&lt;br /&gt;Die Neuentwicklung hat nun fast den letzten Stand der BlitzMax-Version erreicht, ist allerdings flotter und leidet nicht an den Kinderkrankheiten die BlitzMax so mit sich bringt.&lt;br /&gt;&lt;br /&gt;Mit dem Umstieg auf C++ bedeutet das aber auch das Ende f&amp;uuml;r das Worklog hier, Regeln sind nunmal Regeln &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; Wer trotzdem immer noch daran interessiert ist und vielleicht sogar bei der Entwicklung mithelfen will der soll sich ins neue Forum begeben: &lt;a href=&quot;http://forum.ircmud.dreamfall.at&quot; target=&quot;_blank&quot;&gt;http://forum.ircmud.dreamfall.at&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vielen Dank f&amp;uuml;r die Aufmerksamkeit, ich hoffe, es finden sich noch ein paar Interessenten unter euch! &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Gr&amp;uuml;&amp;szlig;e,&lt;br /&gt;hamZta</description>
			<pubDate>Thu, 25 Mar 2010 14:52:45 +0100</pubDate>
		</item>

		<item>
			<title>Datenbanken...</title>
			<link>https://www.blitzforum.de/worklogs/321/#2170</link>
			<guid>https://www.blitzforum.de/worklogs/321/#2170</guid>
			<author>hamZta</author>
			<description>... bringen mich irgendwann ins Grab. Bis eben lief noch alles wunderbar, nur pl&amp;ouml;tzlich fiel mir auf, dass das Datenbankmodul von Brucey (BaH.DBMySQL) Prepared Statements nur noch einmal ausf&amp;uuml;hrt ... und danach stillschweigend dabei versagt. Das f&amp;uuml;hrte dazu dass sich nur ein Client einloggen konnte, die nachfolgenden hatte keine Attribute, keine Skills ... gar nichts mehr. Zur Info: Prepared Statements sind SQL-Ausdr&amp;uuml;cke die der Datenbankserver nur einmal auswerten muss, man sie aber beliebig oft aufrufen kann (/k&amp;ouml;nnen sollte. *hust*), was vor allem Geschwindigkeitsvorteile hat.&lt;br /&gt;&lt;br /&gt;Ich hatte ja schonmal Probleme mit dem Modul, anno dazumals funktionierten bei mir lokal keine Prepared Statements, nur normale, auf dem vServer von Smily genau umgekehrt, da klappten nur Prepared Statements.&lt;br /&gt;&lt;br /&gt;Ich denke ich werde Bruceys Modul mal komplett zerlegen und schauen wo es da hakt. Oder mir selbst ein Modul daf&amp;uuml;r schreiben, aber das kostet viel, viel, viel Zeit.&lt;br /&gt;&lt;br /&gt;Ansonsten habe ich heute ein kleines Framework zum Testen geschrieben, damit kann man recht simpel kleine Bots schreiben die sich automatisch einloggen und dann beliebige Aktionen durchf&amp;uuml;hren, zB:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]&lt;br /&gt;Type TTest01 Extends TTestClient&lt;br /&gt;&lt;br /&gt;	Field _firstRound:Byte&lt;br /&gt;	Field _userName:String&lt;br /&gt;	&lt;br /&gt;	Method onPrivMsg(msg:TMessage)&lt;br /&gt;		Print msg.getParam(0)&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	Method onLoggedIn()&lt;br /&gt;		SetSlot(1, &amp;quot;Hit&amp;quot;)&lt;br /&gt;		SetSlot(2, &amp;quot;Cut&amp;quot;)&lt;br /&gt;		SetSlot(3, &amp;quot;Heal&amp;quot;)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method onRegistered()&lt;br /&gt;		Login(_username, _username)&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method onArrive()&lt;br /&gt;		SetUpTimer(Rand(1000, 10000))&lt;br /&gt;		For Local c:String = EachIn _clients&lt;br /&gt;			If c.StartsWith(&amp;quot;+Wolf&amp;quot;) Or c.StartsWith(&amp;quot;+Fox&amp;quot;) Or c.StartsWith(&amp;quot;+Bear&amp;quot;) Or c.StartsWith(&amp;quot;+Boar&amp;quot;) Or c.StartsWith(&amp;quot;+Bat&amp;quot;)&lt;br /&gt;				Attack(c)&lt;br /&gt;				_firstRound = True&lt;br /&gt;				Exit&lt;br /&gt;			End If&lt;br /&gt;		Next&lt;br /&gt;		&lt;br /&gt;		If Rand(0, 100) &amp;lt; 20 Then&lt;br /&gt;			SendPrivMsg(&amp;quot;*laber* *laber* Ich bin nur ein Bot, bitte beachte mich gar nicht!&amp;quot;)&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method onTimer()&lt;br /&gt;		If _attackState = 0 &lt;br /&gt;			Local next_dir:Int = Rand(0, _directions.Length-1)&lt;br /&gt;			Move(_directions[next_dir])&lt;br /&gt;		End If&lt;br /&gt;		SetUpTimer(Rand(500, 1000))&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method onBattleTurn()&lt;br /&gt;		If _hp &amp;lt; 800 Then&lt;br /&gt;			Cast(3, _nick)&lt;br /&gt;		Else&lt;br /&gt;			If _firstRound&lt;br /&gt;				Cast(2)&lt;br /&gt;				_firstRound = False&lt;br /&gt;			Else&lt;br /&gt;				Cast(1)&lt;br /&gt;			End If&lt;br /&gt;		End If&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method onBattleWin()&lt;br /&gt;		Print &amp;quot;Battle won!&amp;quot;&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;	Method onBattleLose()&lt;br /&gt;		Print &amp;quot;Battle lost!&amp;quot;&lt;br /&gt;	End Method&lt;br /&gt;	&lt;br /&gt;End Type[/syntax]&lt;br /&gt;&lt;br /&gt;Dieser Bot wandert zuf&amp;auml;llig von Raum zu Raum. Findet er in einem Raum einen Wolf, Fuchs, B&amp;auml;r, Eber oder eine Fledermaus so greift er diese an. Die Kampf-&amp;quot;KI&amp;quot; heilt sich dabei selbst und haut anschlie&amp;szlig;end eigentlich nur noch drauf.&lt;br /&gt;Zum Testen ist das &amp;auml;u&amp;szlig;erst praktisch, weil man alleine schwer die Bedingungen herstellen kann die herrschen wenn mehrere Clients verbunden sind und Aktionen durchf&amp;uuml;hren. Ich starte also einfach die Testanwendung ein paar Mal und schon wuseln einige Helferleins herum und t&amp;ouml;ten alles was ihnen vor's Schwert kommt. Niedlich. Und praktisch.&lt;br /&gt;&lt;br /&gt;Des weiteren konnte ich damit ein paar Bugs beheben, unter anderem ...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; ... wird man bei !logout nichtmehr vom Server gekickt&lt;br /&gt;&lt;li&gt; ... setzt !logout den Clienten jetzt korrekt zur&amp;uuml;ck (vorher blieben Skills erhalten)&lt;br /&gt;&lt;li&gt; ... werden get&amp;ouml;tete NPCs jetzt auch wirklich gel&amp;ouml;scht&lt;br /&gt;&lt;li&gt; ... wurde eine Schwachstelle im Message-Parsing gefixt wodurch der Server nichtmehr so leicht gecrasht werden kann&lt;br /&gt;&lt;li&gt; ... wurde einem Spieler bei Nickwechsel zweimal die NICK-Nachricht gesandt&lt;br /&gt;&lt;li&gt; ... kann man Flederm&amp;auml;use und Eber jetzt auch wirklich angreifen &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ich hoffe, dass ich den Datenbankmist bald hinter mir habe, dann kann ich mich wieder voll auf die Entwicklung st&amp;uuml;rzen.&lt;br /&gt;&lt;br /&gt;W&amp;uuml;rde mich &amp;uuml;ber Feedback nat&amp;uuml;rlich absolut freuen! *wink* *wink*&lt;br /&gt;&lt;br /&gt;hamZta&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Mon, 01 Mar 2010 00:34:53 +0100</pubDate>
		</item>

		<item>
			<title>Einleitung</title>
			<link>https://www.blitzforum.de/worklogs/321/#2165</link>
			<guid>https://www.blitzforum.de/worklogs/321/#2165</guid>
			<author>hamZta</author>
			<description>IRCmud - Worklog&lt;br /&gt;&lt;br /&gt;Jetzt fange ich doch auch mit einem Worklog an, vielleicht interessierts ja den einen oder anderen was ich mir so beim Basteln denke.&lt;br /&gt;&lt;br /&gt;Ich fange am Besten mal damit an, wie der Server bis jetzt so funktioniert.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Server&lt;/b&gt;&lt;br /&gt;Im Hintergrund werkelt ein kleiner IRC-Server, programmiert mit BlitzMax, f&amp;uuml;r die Netzwerkkommunikation wird BNetEx verwendet.&lt;br /&gt;Dieser Server stellt das Grundger&amp;uuml;st dar, d.h. er k&amp;uuml;mmert sich um die Abwicklung des im IRC-RFC spezifizierten Standards.&lt;br /&gt;Er empf&amp;auml;ngt Nachrichten von Clients und sendet entsprechende Antworten o.&amp;auml;. zur&amp;uuml;ck. Zum Beispiel schickt er regelm&amp;auml;&amp;szlig;ig PINGs und trennt dadurch Clients die die Verbindung verloren haben vom Server. Au&amp;szlig;erdem sorgt er daf&amp;uuml;r, dass normale Nachrichten an Clients oder Channels wie gewohnt verschickt und empfangen werden.&lt;br /&gt;&lt;br /&gt;Persistente Spielerdaten wie Namen, Passw&amp;ouml;rter, erlernte  Skills etc. werden in einer MySQL-Datenbank gespeichert bzw. aus dieser beim Start geladen. W&amp;auml;hrend des Spielablaufs wird die Datenbank nicht mehr ben&amp;ouml;tigt, unter anderem aus Geschwindigkeitsgr&amp;uuml;nden. D.h. der Server l&amp;auml;dt sich alle Daten die er braucht in den RAM und arbeitet dann dort damit. Lediglich wenn sich neue Spieler einloggen wird aus der Datenbank nachgeladen.&lt;br /&gt;&lt;br /&gt;Muss der Server Spielerdaten speichern passiert dies ebenfalls nicht in der Datenbank - daf&amp;uuml;r ist ein anderer Prozess zust&amp;auml;ndig. Gespeichert werden die Daten in einer Datei in ein spezielles Verzeichnis - jeder Spieler erh&amp;auml;lt so eine Speicherdatei, benannt nach einer eindeutigen ID je Client.&lt;br /&gt;&lt;br /&gt;Im Hintergrund l&amp;auml;uft ein anderer Prozess (liebevoll Saveslave genannt), dieser schaut in regelm&amp;auml;&amp;szlig;igen Abst&amp;auml;nden ob sich derartige Dateien im Ordner befinden, liest diese aus, speichert die Daten in die Datenbank und l&amp;ouml;scht anschlie&amp;szlig;end die Datei.&lt;br /&gt;&lt;br /&gt;Dieser &amp;quot;Umweg&amp;quot; hat mehrere Vorteile: Zum einen wird der Server nicht durch Datenbankoperationen ausgebremst. Weiters kann durch diesen Weg sichergestellt werden, dass Spielerdaten auch gesichert werden wenn die Datenbank offline sein sollte - loggt sich ein Spieler ein f&amp;uuml;r den noch eine Speicherdatei existiert wird von dieser anstatt von der Datenbank geladen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Inhalt&lt;/b&gt;&lt;br /&gt;Um vom leeren Grundger&amp;uuml;st zu einer lebendigen Welt zu kommen fehlt allerdings noch der Inhalt. Ohne diesen w&amp;auml;re der Server kaum mehr (eher etwas weniger) als ein normaler IRC-Server, ohne jegliche Channel- oder Usermodes. Normales Chatten w&amp;auml;re allerdings m&amp;ouml;glich.&lt;br /&gt;F&amp;uuml;r den Inhalt wird die Scriptsprache Lua verwendet. Sie ist schnell, klein, einfach zu programmieren und noch einfacher aus BlitzMax heraus zu verwenden.&lt;br /&gt;Der Server stellt daf&amp;uuml;r &amp;uuml;ber 60 Funktionen bereit, mit denen sich allerlei Dinge anstellen lassen. In Lua sind zum Beispiel s&amp;auml;mtliche R&amp;auml;ume, Fertigkeiten und NPCs und deren Verhalten definiert - das reicht von einfachen, leeren R&amp;auml;umen &amp;uuml;ber komplizierte Zauberspr&amp;uuml;che bis hin zu  aufw&amp;auml;ndigen Bossgegnern. Um einen guten Kompromiss aus Performance und Flexibilit&amp;auml;t zu gew&amp;auml;hrleisten basiert das Ganze mehr oder weniger auf einem Event-System. Jedes Objekt (R&amp;auml;ume, NPCs und Fertigkeiten sind Objekte) definiert verschiedenste Events die vom Server dann aufgerufen werden. Betritt zum Beispiel ein Spieler einen Raum so wird das Event onJoin() des Raumes aufgerufen - aber auch das aller NPCs, damit diese darauf reagieren k&amp;ouml;nnen.&lt;br /&gt;&lt;br /&gt;&amp;Uuml;ber Charaktere (also Spieler und NPCs) wei&amp;szlig; der Server so wenig wie nur m&amp;ouml;glich - er kennt ihr Level, ihre Erfahrung und ihre Lebenspunkte, mehr allerdings nicht. Zum Beispiel Elemente, Lernpunkte oder Gold, so wie sie im aktuellen Spiel zu finden sind sind rein in Lua implementiert. Es ist also zum Beispiel m&amp;ouml;glich Spiele die ohne W&amp;auml;hrung auskommen zu entwickeln, zus&amp;auml;tzliche Attribute einzuf&amp;uuml;hren oder NPCs in Fraktionsgruppen zu unterteilen - der Fantasie sind nahezu keine Grenzen gesetzt.&lt;br /&gt;Um derlei Daten ebenfalls persistent speichern zu k&amp;ouml;nnen, ohne genau zu wissen worum es sich handelt hat jeder Client (Spieler und NPCs) einen Datenbereich mit 50 Feldern zur Verf&amp;uuml;gung. Dieser Datenbereich wird in der Datenbank gespeichert und kann beliebig beschrieben werden.&lt;br /&gt;&lt;br /&gt;Bis jetzt besteht der Server samt Inhalt (also Luascripts) aus rund 6200 Zeilen reinem Code. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiele&lt;/b&gt;&lt;br /&gt;Der momentan aufw&amp;auml;ndigste NPC ist ein &amp;quot;Firegolem&amp;quot;, mit 70 Zeilen Code. F&amp;auml;llt sein Leben im Kampf unter 90% beschw&amp;ouml;rt er einen Diener der f&amp;uuml;r ihn k&amp;auml;mpft. Stirbt dieser Diener, steigt der Golem ein paar Stufen auf und wird dadurch st&amp;auml;rker. Dasselbe tritt bei 50% nochmal auf.&lt;br /&gt;&lt;br /&gt;Ein &amp;quot;Darkwolf&amp;quot; sucht im Kampf den Raum ab und ruft einen anderen Darkwolf zu Hilfe - sofern gerade einer verf&amp;uuml;gbar ist. Dieser tritt dem Kampf bei und attackiert den Spieler.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Aussicht&lt;/b&gt;&lt;br /&gt;Neben dem Spiel soll auch eine Website daf&amp;uuml;r entwickelt werden, wo spieler sich einloggen und ihre Charaktere untersuchen k&amp;ouml;nnen. Gezeigt werden dabei Lebenspunkte, Erfahrung, Skills, etc. Au&amp;szlig;erdem soll man &amp;uuml;ber die Website Nachrichten an eingeloggte Spieler auf dem Server verschicken und empfangen k&amp;ouml;nnen.&lt;br /&gt;&lt;br /&gt;Ganz wichtig ist, dass das System durchgetestet wird. Deshalb wird es in den n&amp;auml;chsten Tagen (hoffentlich) ein paar Tests geben, die dazu f&amp;uuml;hren werden, dass ich das Spiel durchgehend auf einem Server (danke an Smily an dieser Stelle) laufen lassen kann um soviele Daten wie m&amp;ouml;glich zu sammeln. Eventuell werde ich daf&amp;uuml;r auch ein Testframework schreiben, um automatisierte Tests durchzuf&amp;uuml;hren. Da der Server momentan noch in einem Thread l&amp;auml;uft w&amp;uuml;rde ich gerne die Netzwerkperformance unter Last testen.&lt;br /&gt;&lt;br /&gt;Teilweise ausgearbeitet sind momentan Konzepte f&amp;uuml;r Gegenst&amp;auml;nde, ein Postsystem, Handel unter Spielern &amp;amp; Verkauf an NPCs, Quests, Crafting (Herstellen von Gegenst&amp;auml;nden durch Spieler) und Duelle. Das Hauptproblem  bei den meisten genannten Punkten ist es, die Inhalte durch das sehr eingeschr&amp;auml;nkte User-Interface verst&amp;auml;ndlich und einfach an den Spieler zu bringen.&lt;br /&gt;&lt;br /&gt;Damit hier nicht nur Text steht, hier ein fr&amp;uuml;hes Bild einer Karte f&amp;uuml;r das Spiel:&lt;br /&gt;&lt;a href=&quot;https://www.blitzforum.de/upload/file.php?id=8077&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=8078&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So. Wer's bis hierher geschafft hat: Gratulation und vielen Dank f&amp;uuml;r's Lesen. F&amp;uuml;r Vorschl&amp;auml;ge, Ideen und Anregungen bin ich nat&amp;uuml;rlich immer offen, einfach einen Kommentar oder eine PN schreiben!&lt;br /&gt;&lt;br /&gt;Gr&amp;uuml;&amp;szlig;e,&lt;br /&gt;hamZta&lt;br /&gt;</description>
			<pubDate>Sat, 27 Feb 2010 00:59:56 +0100</pubDate>
		</item>


	</channel>
</rss>
