NPC Firstkill Nummern

Seit kurzem besitzt jeder (metzelbare) NPC eine eindeutige ID. Diese ID

  • wird vom Killmaster in jedem metzelbaren NPC gesetzt
  • kann im NPC über die Property P_NPC_KILL_NUM abgerufen werden. Die Property ist in /sys/npc/combat.h definiert.

Beispielweise ist die P_NPC_KILL_NUM von einem Drachen die 284.

Will man nun wissen, ob der Spieler diesen Drachen schon getötet hat, dann kann man das wie folgt realisieren:

public int test_kill(object pl) {
  if(objectp(pl) && interactive(pl)) {
   
    // Alle Kills des Spielers befinden sich in diesem
    // Bitfeld (String) direkt in Spielerobjekt
    string|int killbits = pl->GetKillBits();  

    // Noch keine Kills im Spieler gesetzt
    if(!stringp(killbits)) {
      return 0; 
    }
    // Testet auf die ID (284) unseres Drachen
    if(long_test_bit(killbits,284)) {
      
      // Drache bereits einmal getötet
      return 1;  
    } 
  }
  return 0;  // Drache noch nie getötet.
}

Man kann natürlich auch eine ganze Liste von NPCs anlegen und diese dann abfragen. Hier ein Beispiel mit einem Mapping:

protected mapping killmap = 
([
  284: "Drache 1",
  285: "Drache 2",
  400: "Drache 3",
]);

public int|int* test_kill(object pl) {
  if(objectp(pl) && interactive(pl)) {
    string|int killbits = pl->GetKillBits();

    if(!stringp(killbits)) {
      return 0; // Noch keine Kills im Spieler gesetzt
    }

    // Hier schreiben wir später unser Ergebnis rein
    int *ret = ({});

    // Durchlaeuft alle Keys des Mappings killmap
    foreach(int num:m_indices(killmap)) {

      // auf Key (num) testen
      if(long_test_bit(killbits,num)) {

        // falls bereits im Spieler gesetzt, dann in
        // einem Array eintragen, das wir später zurück
        // geben können. 
        ret += ({num});                    
      }
    }
    // Array mit allen NPCs aus killmap, die der Spieler 
    // bereits getötet hat, zurück geben.
    return num; 
  }
  return 0;
}

Ich hoffe, diese kleinen Beispiele regen etwas Eure Fantasie an. Damit kann man einige interessante Aufgaben schreiben. Ich selbst arbeite gerade an einen ‘Orden der Drachentöter’.

LG, It@Efferdland

Schreibe einen Kommentar