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: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