MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // ModifySkill-Beispiel fuer einem Spell. Erlaeuterung auf man-Page |
| 2 | // und im Objekt selbst |
| 3 | inherit "/std/thing"; |
| 4 | #include <new_skills.h> |
| 5 | #include <properties.h> |
| 6 | #include <wizlevels.h> |
| 7 | #include <break_string.h> |
| 8 | |
| 9 | static int skillset(string str); |
| 10 | static int skillunset(string str); |
| 11 | |
| 12 | void create() { |
| 13 | if(!clonep(this_object())) { |
| 14 | set_next_reset(-1); |
| 15 | return; |
| 16 | } |
| 17 | |
| 18 | ::create(); |
| 19 | set_next_reset(7200); |
| 20 | |
| 21 | SetProp(P_NAME, "Skillbeispiel"); |
| 22 | SetProp(P_SHORT, "Eine Skillbeispiel"); |
| 23 | SetProp(P_LONG, break_string( |
| 24 | "Mit \"skillset\" kann man sich den Skill (eigentlich Spell) " |
| 25 | "\"fnrx\" setzen.\n"+ |
| 26 | "Durch \"skillunset\" wird der Skill geloescht.\n" |
| 27 | "Das zaehlt deshalb als Spell, weil er kleingeschrieben und " |
| 28 | "damit direkt vom Spieler (also dir) als Kommando via UseSpell() " |
| 29 | "ausfuehrbar ist.", 78, 0, BS_LEAVE_MY_LFS)); |
| 30 | SetProp(P_GENDER, NEUTER); |
| 31 | AddId(({"beispiel", "skillbeispiel", "spellbeispiel", |
| 32 | "skill", "spell"})); |
| 33 | |
| 34 | AddCmd("skillset", #'skillset); |
| 35 | AddCmd("skillunset", #'skillunset); |
| 36 | } |
| 37 | |
| 38 | // Testfunktion, weil im Code dazu aufgefordert wird, das Objekt auch |
| 39 | // mal zu wegzulegen. Spieler sollten nicht an sich herumfummeln. |
| 40 | private static int _checkLearner(object pl) { |
| 41 | if(!IS_LEARNER(this_player())) { |
| 42 | notify_fail("Du bist kein Magier, deshalb geht das nicht.\n"); |
| 43 | call_out(#'remove, 1); |
| 44 | return 0; |
| 45 | } |
| 46 | return 1; |
| 47 | } |
| 48 | |
| 49 | static int skillset(string str) { |
| 50 | if(!_checkLearner(this_player())) |
| 51 | return 0; |
| 52 | |
| 53 | if(this_player()->QuerySkill("fnrx")) { |
| 54 | notify_fail("Du kannst den Skill schon.\n"); |
| 55 | return 0; |
| 56 | } |
| 57 | |
| 58 | this_player()->ModifySkill("fnrx", |
| 59 | ([SI_CLOSURE: function int (object caster, string skill, mapping sinf) { |
| 60 | caster->LearnSkill("fnrx", 1); |
| 61 | tell_object(caster, "Peng! Dein Skillwert steigt auf "+ |
| 62 | caster->QuerySkillAbility("fnrx")+".\n"); |
| 63 | return 1; |
| 64 | }, |
| 65 | SI_SKILLABILITY: 8432]), 100, "ANY"); |
| 66 | tell_object(this_player(), break_string( |
| 67 | "Der Skill ist gesetzt. Tipp doch ein paar Mal \"fnrx\" und schau den " |
| 68 | "Code unter "+load_name(this_object())+" an, damit du siehst, dass der " |
| 69 | "Skill jetzt nur aus einem Eintrag in dir und einer ueber UseSpell() " |
| 70 | "gerufenen Funktion in diesem Objekt besteht. Der Skill ist kein " |
| 71 | "Kommando in einem anderen Objekt.\n\n" |
| 72 | "Wenn du dieses Objekt weglegst, funktioniert also alles weiter. " |
| 73 | "Zerstoerst du aber das Objekt (oder dich mit \"ende\", funktioniert " |
| 74 | "die Skillfunktion nicht mehr.\n" |
| 75 | "Schau dir auch xeval this_player()->QuerySkill(\"fnrx\") an.", 78, 0, |
| 76 | BS_LEAVE_MY_LFS)); |
| 77 | return 1; |
| 78 | } |
| 79 | |
| 80 | // Here be dragons! |
| 81 | // Bitte benutzt die folgende Art von Manipulation der Skills nur dann, |
| 82 | // wenn ihr genau wisst, was ihr tut. In anderen Worten: NICHT MACHEN! |
| 83 | // Und wenn, dann NUR AM EIGENEN MAGIEROBJEKT, NICHT AN SPIELERN! |
| 84 | static int skillunset(string str) { |
| 85 | if(!_checkLearner(this_player())) |
| 86 | return 0; |
| 87 | |
| 88 | // per Query() das Mapping an der _query_*-Fun vorbei direkt holen |
| 89 | mapping skills = this_player()->Query(P_NEWSKILLS); |
| 90 | // ... und manipulieren (wirkt sich wegen Referenz direkt aus) |
| 91 | if(mappingp(skills) && mappingp(skills["ANY"]) && |
| 92 | member(skills["ANY"], "fnrx")) { |
| 93 | efun::m_delete(skills["ANY"], "fnrx"); |
| 94 | tell_object(this_player(), "Erledigt.\n"); |
| 95 | } else |
| 96 | tell_object(this_player(), "Nichts zu erledigen.\n"); |
| 97 | |
| 98 | return 1; |
| 99 | } |
| 100 | |
| 101 | void reset() { |
| 102 | remove(); |
| 103 | } |