Dokumentation zu: uniqued(WL)

HR Image


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:


Start » Magierhandbuch » Docu » Konzepte » Uniqued Letzte Generierung: 16.04.2009, 21:44
Email an: mud@wl.mud.de
Valid HTML 4.01!