anpera.net
http://anpera.homeip.net/phpbb3/

NPC-Chatsystem auf PHP5-OOP
http://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=4009
Seite 1 von 4

Autor:  Auric [ Do 20 Sep, 2007 16:45 ]
Betreff des Beitrags:  NPC-Chatsystem auf PHP5-OOP

NPC-Chatsystem + Bugfix
Nachdem ja nun längere Zeit nichts wirklich neues mehr von mir hier erschienen ist, gibt es jetzt das frisch überarbeitet NPC-Chatsystem.
Nur um gleich Missverständnisse auszuschließen: Es handelt sich hier nicht um Chatbots öder ähnliches, sondern von Usern per Chat-Kommando gesteuerte Figuren.

Teff machte mich auf ein paar Fehler aufmerksam, unter anderem wurde nicht richtig abgerechnet und die Weitergabe von NPCs funktionierte nicht. Die neue Version ist nun hier verfügbar.

Doch zunächst die Vorraussetzungen:

Im Gegenzug auch gleich die Features:
(Texte in blau sind in erster Linie für den Admin interessant)
    Chatten über andere Figuren als den eigenen Charaker durch NPCs
    Eigene Bio mit Name, Spielern, Avatar und Beschreibung für jeden NPC
    Erschaffen von NPC-Figuren gegen Punkte
    Jederzeit mögliches Abändern der Werte des NPCs gegen Punkte
    Gemeinsame Nutzung der NPCs von mehreren Spielern (share)
    Cheatschutz-Systeme gegen Namenstäuschung (Danke an Harthas)
    Punkte sind Wahlweise RP-Punkte oder Donation-Points
    Frei wählbare Preise für die Änderung von Name, Bscheibung, Avatar und Share der NPCs

Und schlussendlich noch ausstehende ToDos:

    Automatische Generierung von NPCs als Kinder in -Doms Kindermod
    Standard Chat-Farben auch für NPCs
    Unterstüttzung der NPC-Anzeige schon im JS-Preview

Installation
Nachdem alle Vorrausstzungen erfüllt sind, geht es nun an die Installation.
Zunächst die Datei npc.class.php in das lib-Verzeichnis hochgeladen werden, die npc.php kommt ins LotgD-Root.
Nun muss noch folgender SQL-Query ausgeführt ...

Code:
ALTER TABLE `accounts` ADD npc BOOLEAN NOT NULL;
ALTER TABLE `commentary` ADD control TINYINT NOT NULL;

CREATE TABLE `npc` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(64) NOT NULL,
  `text` text character set utf8 collate utf8_unicode_ci,
  `ersteller` int(10) unsigned NOT NULL default '0',
  `avatar` varchar(255) default NULL,
  `vater` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB;

CREATE TABLE `z_npc` (
  `user_id` int(10) unsigned NOT NULL default '0',
  `npc_id` smallint(5) unsigned NOT NULL default '0',
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB;



...Und ein paar Dateien verändert werden:

prefs.php
PHP:
// Suche:
$form=array(
"Einstellungen,title"
...
);
// Füge danach ein:
if($session['user']['npc']) {
require_once "lib/npc.class.php";
//$npcs = getUsrNPCsData($session['user']['acctid']);
$npcs = npc::getAllOf($session['user']['acctid'],false);
$text = "Der NPC den du im moment verwenden möchtest,enum";
foreach($npcs as $npc) {
$text .= ",".$npc->getId().",".$npc->getName();
}
} else {
$text = "Leider hast du noch keine NPCs,viewonly";
}
$form['akt_npc'] = $text;


lib/commentary.php
PHP:
// Suche:
# Einstellungen

// Füge danach ein:
require_once 'npc.class.php';
function beginsWith($in,$with) {
// Kleine Funktion für netteren Code by Auric
return (strtolower(substr($in,0,strlen($with)))===$with?true:false);
}


// Suche: [function Add()]

// Emotecheck
$emote = 0;
if(substr($commentary,0,2) === '::') {
$commentary = $this->coloremote.substr($commentary,2);
$emote = 1;
}
elseif(substr($commentary,0,1) === ':') {
$commentary = $this->coloremote.substr($commentary,1);
$emote = 1;
}
elseif(strtolower(substr($commentary,0,3)) === '/me') {
$commentary = $this->coloremote.substr($commentary,3);
$emote = 1;
}
elseif(strtolower(substr($commentary,0,3)) === '/em') {
$commentary = $this->color3person.substr($commentary,3);
$emote = 2;
}
elseif(strtolower(substr($commentary,0,2)) === '/x') {
$commentary = $this->color3person.substr($commentary,2);
$emote = 2;
}
elseif(strtolower(substr($commentary,0,3)) === '/ms') {
$commentary = $this->coloremote.substr($commentary,3);
$emote = 3;
}
else {
$commentary = $this->colorspeak.$commentary;
}

// Ersetze mit:

// Emotecheck
$emote = 0;
if(beginsWith($commentary,'::')) {
$commentary = $this->coloremote.substr($commentary,2);
$emote = 1;
} elseif(beginsWith($commentary,':')) {
$commentary = $this->coloremote.substr($commentary,1);
$emote = 1;
} elseif(beginsWith($commentary,'/me')) {
$commentary = $this->coloremote.substr($commentary,3);
$emote = 1;
} elseif(beginsWith($commentary,'/em')) {
$commentary = $this->color3person.substr($commentary,3);
$emote = 2;
} elseif(beginsWith($commentary,'/x')) {
$commentary = $this->color3person.substr($commentary,2);
$emote = 2;
} elseif(beginsWith($commentary,'/ms')) {
$commentary = $this->coloremote.substr($commentary,3);
$emote = 3;
// Erweiterte Überprüfung für NPCs by Auric:
} elseif(beginsWith($commentary,'/npc')) {
$commentary = $this->colornpc.substr($commentary,5);
$emote = 5;
} else {
$commentary = $this->colorspeak.$commentary;
}


// Suche: [function Insert()]
$sql = 'INSERT INTO `commentary` (`author`,`comment`,`section`,`emote`,`postdate`) '

// Ersetze mit:
$sql = 'INSERT INTO `commentary` (`author`,`comment`,`section`,`emote`,`postdate`'.($this->emote==5?',`control`':'').') '

// Suche: [function Insert()]
.'"'.$this->emote.'",'
.'NOW()'

// Füge danach ein:
.($this->emote==5?", '".npc::getActOf($author)."'":'')


// Suche:
if(NOBIO === false) {
$linktemplate = '`0<a href="bio.php?char={$LOGIN}&ret={$REQUESTURI}" style="text-decoration: none">'.endl.'`&{$NAME}`0</a>'.endl;
}
else {
$linktemplate = '{$NAME}';
}
// Ersetze mit:
if(NOBIO === false) {
$linktemplate = '`0<a href="bio.php?char={$LOGIN}&ret={$REQUESTURI}" style="text-decoration: none" title="{$STATUSRP}">'.endl.'`&{$NAME}`0</a>'.endl;
$npclinktemplate = '`0<a href="npc.php?op=bio&id={$ID}&ret={$REQUESTURI}" style="text-decoration: none">'.endl.'`&{$NPC}`0</a>'.endl;
} else {
$linktemplate = '{$NAME}';
$npclinktemplate = '{$NPC}';
}
$sea4linktemplateN = array('{$ID}','{$REQUESTURI}','{$NPC}');


// Suche:
switch($row['emote']) {

// Füge Danach ein:
case 5: // NPC-Erweiterung von Auric
$npcsql = "SELECT `id`, `name` FROM `npc` WHERE `id`=".$row["control"]." LIMIT 1";
$npcres = db_query($npcsql) or die(db_error(LINK));
$npc = db_fetch_assoc($npcres);

$rep4linktemplateN = array($npc['id'],RawURLEncode($REQUEST_URI),$npc['name']);
$row['npc'] = str_replace($sea4linktemplateN,$rep4linktemplateN,$npclinktemplate);
$npclink = str_replace($sea4linktemplateN,$rep4linktemplateN,'npc.php?op=bio&id={$ID}&ret={$REQUESTURI}');
addnav('',$npclink);
$comments[] = $prefix.str_replace($search,$replace,'`&'.$row['npc'].' '.$this->nl2paragraph($row['comment'])."`0\r\n");
break;


configuration.php
PHP:
// Suche:
"oldmail"=>"Alte Nachrichten automatisch löschen nach x Tagen. x =,int",

// Füge danach ein:

'NPC-Settings (NPC-System by Auric),title',
'NPC_CURRENCY' => 'Währung zum Kauf von NPCs,enum,dp,Donationpoints,rp,RP-Punkte',
'NPC_COST_ACTIVATE' => 'Kosten zum Freischalten des NPC-Modus (Standard RP:20; DP:100),int',
'NPC_COST_BUY' => 'Kaufpreis eines NPCs (Standard RP:20; DP:100),int',
'NPC_COST_NAME' => 'Preis zum Umbenennen eines NPCs (Standard RP:10; DP:50),int',
'NPC_COST_TEXT' => 'Preis zum Ändern der NPC-Beschreibung (Standard RP:3; DP:15),int',
'NPC_COST_AVATAR' => 'Preis zum Ändern des NPC-Avatars (Standard: 0),int',
'NPC_COST_GRANT' => 'Preis für eine NPC-Freigabe (Standard RP:12; DP:60),int',
'NPC_GRANT_MAX' => 'Maximale Anzahl von Spielern pro NPC (Standard: 5),int',

Speichern und Hochladen

Schlussendlich müsst ihr nur noch irgendwo (village.php oder so) auf die npc.php verlinken.

So, nun müsst ihr noch einmal in den Spieleinstellungen vorbeischauen und dort in den soeben angelegten Konfigurationsfeldern eure gewünschten Preise für die einzelnen Operationen angeben.

Das Wärs dann auch, euer NPC-System sollte nun lauffähig sein.
Bedenkt, das sich eure Spieler noch für einen gewissen Betrag für den NPC-Modus freischalten müssen.

Viel Spass damit,
Auric

Dateianhänge:
Dateikommentar: NPC-Chatsystem 1.2
Latin-1 (ISO-8859-1) Kodiert
(Standard)

NPC-System-latin1.zip [11.56 KIB]
168-mal heruntergeladen
Dateikommentar: NPC-Chatsystem 1.2
UTF-8 Kodiert

NPC-System-utf8.zip [11.29 KIB]
148-mal heruntergeladen

Autor:  Naria [ Do 20 Sep, 2007 17:34 ]
Betreff des Beitrags: 

Nette Idee ^^ wollte ich auch mal direkt testen... aber schienbar fehlt da die Tabelle, in der die NPCs gespeichert werden...

Zudem: Die npc.php muss irgendwo verlinkt sein, oder? Das ist in der Anleitung auch nicht erwähnt.

Autor:  Auric [ Do 20 Sep, 2007 18:48 ]
Betreff des Beitrags: 

hm... :pein:
Hatte ich ganz vergessen...

Tabellen sind jetzt drin und auch der Hinweis zum Verlinken ist dabei.

Auric

Autor:  Eliwood [ Do 20 Sep, 2007 19:54 ]
Betreff des Beitrags: 

Nur so ne Frage: Die Einstellungsnamen - Sicher, dass sie kurz genug sind? Irgendwann hatte ich mal Probleme, da LoGD 097 standardgemäss nur 10 (20?) Zeichen für den settingsnamen zulässt.

Aber eine vorzügliche Idee :) Du hast sicher nichts dagegen, wenn ich das irgendwann mal adaptiere und selbst erweitere, oder? ;)

Autor:  Naria [ Do 20 Sep, 2007 20:00 ]
Betreff des Beitrags: 

Ehm... noch nen kleiner Fehler

[php] // Suche: [function Insert()]
.'"'.$this->emote.'",'

// Füge danach ein:
.($this->emote==5?", '".npc::getActOf($author)."'":'') [/php]

nicht so, sondern
[php]
// Suche: [function Insert()]
.'"'.$this->emote.'",'
.'NOW()'

// Füge danach ein:
.($this->emote==5?", '".npc::getActOf($author)."'":'') [/php]

sonst hat es bei mir nicht funktioniert ^^

Autor:  Auric [ Do 20 Sep, 2007 20:13 ]
Betreff des Beitrags: 

@Eli: Kannst du gerne verwenden - ehrensache das ein Credit drinne bleibt, oder? ^^

und außerdem:
LoGD097******.sql hat geschrieben:
CREATE TABLE settings (
setting varchar(20) NOT NULL default '',
value varchar(255) NOT NULL default '',
PRIMARY KEY (setting)
) TYPE=MyISAM;

Das längste Feld ist bei mir das ACTIVATE mit 17 Zeichen, sollte also passen.


@ Naria: irgendwie erscheint mir der sinn nicht so ganz: das NOW() musste bei dir noch mit gelöscht werden oder wie?

Autor:  Eliwood [ Do 20 Sep, 2007 20:20 ]
Betreff des Beitrags: 

Auric hat geschrieben:
@Eli: Kannst du gerne verwenden - ehrensache das ein Credit drinne bleibt, oder? ^^


Wie kommst du denn auf die Idee? Natürlich lösch ich es weg und schreib, dass es alleine von mir ist. Also auf Ideen kommen manche.... :D

Auric hat geschrieben:
und außerdem:
LoGD097******.sql hat geschrieben:
CREATE TABLE settings (
setting varchar(20) NOT NULL default '',
value varchar(255) NOT NULL default '',
PRIMARY KEY (setting)
) TYPE=MyISAM;

Das längste Feld ist bei mir das ACTIVATE mit 17 Zeichen, sollte also passen.


Warens also doch 20. Okay ^^

Auric hat geschrieben:
@ Naria: irgendwie erscheint mir der sinn nicht so ganz: das NOW() musste bei dir noch mit gelöscht werden oder wie?


Du hast in deiner Einbauanleitung für den Insert das NOW() übersehen und verlangst, dass der Wert für "control" direkt nach "emote" kommt - was aber nicht der Fall ist, da zuerst postdate gefüllt werden will ^^

(@Naria: Vielleicht in Zukunft die Fehler auch umschreiben.. Damit lassen sich Missverständnisse vermeiden ;) )

Autor:  Naria [ Do 20 Sep, 2007 20:20 ]
Betreff des Beitrags: 

€dit: War Eliwood doch schneller ^^. und ja... Fehlerbeschreibung.. nicht meine Stärke... :pein:


Ne, das Feld postdate existiert bei mir ja noch.

Es heißt bei dir in der Anleitung:

[php]$sql = 'INSERT INTO `commentary` (`author`,`comment`,`section`,`emote`,`postdate`'.($this->emote==5?',`control`':'').') ' [/php]
postdate steht vor dem Eintrag der zu dem NPC Addon gehört.
Bei den Values würde aber postdate nach dem Wert, der zu Control gehört eingefügt werden.

Bei mir heißt das ganze Stück jetzt so:
[php]// Eintragen
$sql = 'INSERT INTO `commentary` (`author`,`comment`,`section`,`emote`,`postdate`'.($this->emote==5?',`control`':'').') '
.'VALUES ( '
.'"'.$author.'",'
.'"'.mysql_real_escape_string(stripslashes($commentary)).'",'
.'"'.$this->section.'",'
.'"'.$this->emote.'",'
.'NOW()'
.($this->emote==5?", '".npc::getActOf($author)."'":'')
.') ';[/php]

Vorher warf er mir einen Syntaxfehler aus.

Autor:  Auric [ Do 20 Sep, 2007 20:28 ]
Betreff des Beitrags: 

Ah, jetzt verstehe ich... ist nun auch berichtigt!
Das kommt davon, wenn man immer erst am Schluss die Veränderungen heraussucht.. bei Blindheit hillft kein diff ^^

Danke für das Feedback
Auric

Autor:  Squall [ Fr 21 Sep, 2007 00:47 ]
Betreff des Beitrags: 

Schade :(
Ich kann es leider nicht nutzen, bei mir läuft php4...
aber nette Arbeit, würde eine Bereicherung für jeden Server sein..und die Multieuser eindämpfen..
viele möchten ja nur einen 2Char um noch mehr RPG zu betreiben..

mfg

Autor:  rumburak [ Sa 22 Sep, 2007 13:23 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

Auric hat geschrieben:

Vorraussetzungen:
    PHP Version 5 oder höher


Wirklich sehr, sehr schade. :(
Das klingt alles sehr beeindruckend und verlockend. :shock:

Autor:  Auric [ Sa 22 Sep, 2007 23:19 ]
Betreff des Beitrags: 

Na ja, mit ein bisschen Zeit und Muße (und der hilfe von Zend Studio o.Ä.) kann man das auch auf PHP4 umschreiebn... ich habe nun keine sooo üblen neuen Features eingebaut...

Autor:  Dwyn [ So 23 Sep, 2007 16:35 ]
Betreff des Beitrags: 

Ich hab etwas ähnliches schon vor einiger Zeit gebastelt wofür ich mir die /X funktion von Eliwood als vorblild genommen habe, ich hab nur gerade keine Zeit um das aus meienr common herraus zu Filtern aber wenn ich Zeit dazu Fionde werde ich es gern mal hier Posten

ich kan ja mal ne kurze erklärung rein setzen.

mit /rp steuert man seinen nsc den man sich in der Jägerhütte erstehen kanndie Chars haben eigenden namen bio und avatar.. ich muss nur sehen ob ich es irgendwie hinkrige das auf ein standart logd zu schreiben ^^ und ob ich alles in meienn datein wieder finde XDD

Autor:  Naria [ Fr 26 Okt, 2007 16:48 ]
Betreff des Beitrags: 

Kleiner Nachtrag: In der dragon.php muss noch npc in die beiden arrays eingetragen werden, deren Schlüssel unverändert nach dem DK bestehen bleiben, ansonsten müssten sich die Spieler nach jedem DK wieder freischalten (außer wenn die NPCs nur für RP Charaktere zugelassen sind und die DKs somit ganz unterm Tisch fallen)

Autor:  vernisage [ Di 19 Feb, 2008 18:13 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

Ich find das eigentlich wirklich eine sehr schöne, feine Idee...
Gibts das auch, ohne dass man Eliwoods Bundle hat?
Hab ich nämlich nicht. Und benötige ich auch nicht, weil ich meine commentary auch schnieke find ;o)

Ich habs mal versucht, über die ganze normale Version mir das aus deiner Datei da umzupfriemeln... aber... ich schreiter schon bei

Code:
// Emotecheck
$emote = 0;
if(substr($commentary,0,2) === '::') {
$commentary = $this->coloremote.substr($commentary,2);
$emote = 1;
}
elseif(substr($commentary,0,1) === ':') {
$commentary = $this->coloremote.substr($commentary,1);
$emote = 1;
}

... usw usf


Das ist ja bei mir noch ganz "ursrpünglich" im Grunde.

Code:
if (substr($commentary,0,1)!=":" &&
substr($commentary,0,2)!="::" &&
substr($commentary,0,3)!="/me" &&
substr($commentary,0,3)!="/mes" &&
substr($commentary,0,3)!="/X" &&


Da *g* ... ich hab colorhacks von Chaosmaker und *hicks* und talkline, die auch so anfangen ;o)

Gibts da auch was für mich? Bild

Autor:  Eliwood [ Di 19 Feb, 2008 19:23 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

vernisage hat geschrieben:
Ich find das eigentlich wirklich eine sehr schöne, feine Idee...
Gibts das auch, ohne dass man Eliwoods Bundle hat?
Hab ich nämlich nicht. Und benötige ich auch nicht, weil ich meine commentary auch schnieke find ;o)


Grundsätzlich ist es natürlich möglich. Aber natürlich umso schwerer. Du müsstest an jeder Emote-Stelle auch /npc prüfen, und beim "drucken" des Kommentars die /npc-Kommentare seperat behandeln. Mein Bundle hat Code-technisch halt vieles vereinheitlicht und vereinfacht. Also auch die Emote-Behandlung.

Wird dann halt zu:
Code:
if (substr($commentary,0,1)!=":" &&
substr($commentary,0,2)!="::" &&
substr($commentary,0,3)!="/me" &&
substr($commentary,0,3)!="/mes" &&
substr($commentary,0,3)!="/X" &&
substr($commentary,0,4)!="/npc") &&


Im übrigen merk ich grad - der Code ist mehr als Fehlerhaft. Du schliesst die Klammern von substr() nirgends, und /mes hat 4 Buchstaben, also können die ersten 3 Buchstaben niemals mit den 4 Buchstaben vom /mes übereinstimmen ;)

Autor:  vernisage [ Di 19 Feb, 2008 20:45 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

Das war nur ein Auszug aus der Datei, und warum diese /mes dadrinnen ist, weiß ich nicht. Das war irgendwie schon immer da?

Und ehrlich gesagt - ich weiß nicht, was du mit dem Schließen meinst *g* 8)

Autor:  Constance [ Mi 19 Mär, 2008 13:44 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

PHP:
// Suche: [function Insert()]
$sql = 'INSERT INTO `commentary` (`author`,`comment`,`section`,`emote`,`postdate`) '

// Ersetze mit:
$sql = 'INSERT INTO `commentary` (`author`,`comment`,`section`,`emote`,`postdate`'.($this->emote==5?',`control`':'').') '

// Suche: [function Insert()]
.'"'.$this->emote.'",'
.'NOW()'

// Füge danach ein:
.($this->emote==5?", '".npc::getActOf($author)."'":'')


Bei mir scheiterts grad an dieser Stelle, würde es nämlich auch gerne für das Standardsystem umbauen, kann aber ehrlich gesagt nicht erkennen ob und wie ich das abändern müsste.

Autor:  Auric [ Mi 19 Mär, 2008 14:55 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

Für das Standardsystem ist die Sache nicht so einfach unzuschrieben, da da die Struktur ne ganz andere ist - z.B. muss man da den emotetyp auch aus dem Comment-String auslesen und so weiter. Ich hatte das mal ne weile, aber es lief nur sehr instabil, desshalb kann ich nur Das Commentary-MIO-Bundle empfehlen und suporten

Autor:  Constance [ Do 20 Mär, 2008 11:49 ]
Betreff des Beitrags:  Re: NPC-Chatsystem auf PHP5-OOP

Ich hatte das MIO-Bundle mal bei mir installiert, doch das hat aussehenstechnisch alles bei mir zerhackt, die kommentare waren zeilenmässig kilometer weit auseinander und wenn ich den abstand in der .commentary.settings von 1.5 auf 1 geändert hab dann konnt man sie nicht mehr lesen weil die zeilen sich zur hälfte überlappt haben, frag mich jetzt nicht woran das liegt, aber daher war ich nicht sehr davon begeistert und habs wieder rausgeschmissen.


Edit: Ich baus aber nochmal ein und schau mal nach ob das immer noch so verwurstelt aussieht.

ok ich weiß jetzt warum die Kommentare soweit auseinander waren, ich habe folgendes geändert

define('COMMENTARY_USEPARAGRAPHS', false); # Paragraphen <p> anstatt <br> gebrauchen

bei true wird ja eben <p> genommen und der zeilenabstand war weiter auseinander, hat sich das schonmal geklärt ^^


Achja, wo finde ich denn das RPG-Belohnungssystem von dir? ich hab zwar in der SuFu geschaut, aber vllt unter den falschen Begriffen, der sagte mir immer es gäbe zu viele Treffer daher würde der Suchbegriff ignoriert werden.

Seite 1 von 4 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/