KONZEPT:
Unique-Daemon
AUTOR:
Archon@Wunderland (09.11.1999)
EINLEITUNG:
Ab und zu haette man gerne Objekte, die in ihrer Anzahl
begrenzt sind oder einzelne Objekte, die nach einer gewissen
Zeit automatisch kaputt gehen. Dies alles ermoeglicht der
Unique-Daemon.
BESCHREIBUNG:
Um die Funktionalitaet zu nutzen, muss man das Objekt beim
Daemon (z.Z.: /global/daemon/unique.c) anmelden. Beim Anmelden
wird die Anzahl der maximalen Klone dieses Objektes uebergeben.
Sind nun schon so viele Objekte dieses Typs angemeldet, wird
eine 0 zurueckgeliefert, und man kann selbst das Objekt
zerstoeren (Unbedingt in einem call_out wie im Beispiel angegeben!).
Weiterhin hat man die Moeglichkeit eine Zeitspanne
zu uebergeben, nach der das Objekt zerstoert werden soll. Hier-
bei kann dieser Zeitpunkt gleich beim clonen, aber auch erst
spaeter festgelegt werden (so kann der Countdown zum Bsp beim
ersten Kontakt mit einem Spieler gestartet werden, bei NPCs
hingegen unbegrenzt sein). Ist der Zeitpunkt der Zerstoerung
erreicht, wird wie folgt verfahren: Ist das Environment des
Objektes nicht lebendig, so wird das Objekt mit einer Meldung
im Environment (zu 90% ein Raum) zerstoert. Ist es hingegen
ein Living, wird ueberprueft, ob dieser Interaktiv ist. Wenn
ja, wird mit einer Meldung an den Spieler das Objekt zerstoert.
Ist der Spieler hingegen gerade netztot, so wird das Objekt
zwar aus dem Zaehler der aktiven Objekten entfernt aber erst
beim naechsten Einloggen des Spieler mit einer Meldung an
diesen wirklich zerstoert.
BEISPIEL:
#include <daemon/unique.h>
#include <moving.h>
nosave int move_till_countdown = 2;
void create()
{
if (!clonep()) return;
::create();
// UNIQUED ist der Daemon als Define. Biett NIE den Pfad
// direkt angeben! es soll maximal 3 Objekte geben - es
// wird keine Zeitspanne bis zur Zerstoerung festgeleg
if (!UNIQUED->RegisterUnique(3,0)) call_out("remove",0);
// wie lange soll das Objekt bestehen
// die Prop wird gesetzt, um sie spaeter hier zu verwenden
SetProp(P_MAXTIME_UNIQUE, 86400);
}
// Zur Erkennung ab wann die Zerstoerungs-Uhr loslaufen soll
// bieten sich zwei Methoden an. Die einfachere und sichere
// erlaubt einfach eine Bewegung ohne die Uhr zu starten (das
// Objekt landet in einem Npc); bei der zweiten Bewegung, also
// wenn das Monster stirbt oder man ihm sonstwie das Ding abluchst
// wird die Zeit gestartet. Vor allem kann auch kein anderer NPC
// das Ding nehmen (zB Gefaehrten) ohne die Uhr zu starten.
int move(mixed dest, int method) {
int ret;
ret = ::move(dest, method);
if (ret >= MOVE_OK && move_till_countdown) {
if (move_till_countdown == 1) {
int zeit;
zeit = QueryProp(P_MAXTIME_UNIQUE);
UNIQUED->SetTime(ME, zeit / 2 + random(zeit / 2) + 1);
}
move_till_countdown -= 1;
}
return ret;
}
// Die zweite Methode startet wirklich nur, wenn das Ding im
// Inventar eines Spieler gelandet ist (nur eine davon ist
// einzubauen!)
int move(mixed dest, int method) {
int ret;
ret = ::move(dest, method);
if (ret >= MOVE_OK && move_till_countdown) {
if (sizeof(filter(all_environment(), #'query_once_interactive))) {
int zeit;
zeit = QueryProp(P_MAXTIME_UNIQUE);
UNIQUED->SetTime(ME, zeit / 2 + random(zeit / 2) + 1);
move_till_countdown = 0;
}
}
return ret;
}
WICHTIGSTE FUNKTIONEN:
int RegisterUnique(int maxzahl,int maxtime);
//Meldet ein Objekt beim Master an
//Rueckgabe 0: wenn Maxzahl<=Anzahl angemeldete Objekte
// 1: sonst
//ist maxtime == 0 dann wird das Objekt nie
//automatisch zerstoert
int SetTime(object ob,int maxtime);
//Startet den Countdown (auch Neustart moeglich)
//Ob wird am Zeitpunkt time()+maxtime automatisch zerstoert
int ItemAnzahlUnique(string filename);
//Die Anzahl der Klons dieses Objekts werden geliefert
void ItemAbmeldenUnique(object item);
//Ein Objekt beim Master wieder abgemeldet
SIEHE AUCH:
|