MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | #pragma strict_types |
| 2 | #pragma no_clone |
| 3 | #pragma no_shadow |
| 4 | #pragma no_inherit |
| 5 | #pragma verbose_errors |
| 6 | #pragma combine_strings |
| 7 | //#pragma pedantic |
| 8 | //#pragma range_check |
| 9 | #pragma warn_deprecated |
| 10 | |
| 11 | #define NEED_PROTOTYPES |
| 12 | #include <thing/properties.h> |
| 13 | #include <properties.h> |
| 14 | #include <wizlevels.h> |
| 15 | #include <new_skills.h> |
| 16 | #include <events.h> |
| 17 | |
| 18 | string *valid_guilds = ({}); |
| 19 | |
| 20 | void create() { |
| 21 | seteuid(getuid(this_object())); |
| 22 | restore_object(GUILD_SAVEFILE); |
| 23 | if (!pointerp(valid_guilds)) |
| 24 | valid_guilds=({}); |
| 25 | } |
| 26 | |
| 27 | //noetig, da nun valid_guilds eine Variable ist |
| 28 | public mixed QueryProp( string name ) |
| 29 | { |
| 30 | if (name==P_VALID_GUILDS) |
| 31 | return copy(valid_guilds); |
| 32 | return 0; |
| 33 | } |
| 34 | |
| 35 | nomask int beitreten() { |
| 36 | object pl,gilde; |
| 37 | string gname,ogname; |
| 38 | |
| 39 | if (!(pl=this_player()) || !(gilde=previous_object())) |
| 40 | return 0; |
| 41 | // Gilden sind Blueprints. |
| 42 | gname=object_name(gilde); |
| 43 | |
| 44 | if ((GUILD_DIR+ogname)==gname) { |
| 45 | write("Du bist schon in dieser Gilde.\n"); |
| 46 | return -4; |
| 47 | } |
| 48 | |
| 49 | if ((ogname=(string)pl->QueryProp(P_GUILD)) && |
| 50 | (ogname!=(((string)pl->QueryProp(P_DEFAULT_GUILD)) || DEFAULT_GUILD))) { |
| 51 | write("Du bist noch in einer anderen Gilde.\n"); |
| 52 | return -1; |
| 53 | } |
| 54 | if (gname[0..7]!=GUILD_DIR || |
| 55 | member(valid_guilds,(gname=gname[8..]))<0) { |
| 56 | write("Diese Gilde ist leider nicht zugelassen.\n"+ |
| 57 | "Bitte verstaendige einen Erzmagier.\n"); |
| 58 | return -2; |
| 59 | } |
| 60 | pl->SetProp(P_GUILD,gname); |
| 61 | // Event Gildenwechsel triggern |
| 62 | EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([ |
| 63 | E_OBJECT: pl, E_PLNAME: getuid(pl), |
| 64 | E_ENVIRONMENT: environment(pl), |
| 65 | E_GUILDNAME: gname, |
| 66 | E_LAST_GUILDNAME: ogname ]) ); |
| 67 | |
| 68 | return 1; |
| 69 | } |
| 70 | |
| 71 | static nomask void loose_ability(mixed key, mixed dat, int loss) { |
| 72 | mixed val; |
| 73 | |
| 74 | val=mappingp(dat)?dat[SI_SKILLABILITY]:dat; |
| 75 | if (!intp(val) || val<=0) return; |
| 76 | val-=(val*loss)/100;if (val<=0) val=1; |
| 77 | if (mappingp(dat)) |
| 78 | dat[SI_SKILLABILITY]=val; |
| 79 | else |
| 80 | dat=val; |
| 81 | } |
| 82 | |
| 83 | varargs nomask int austreten(int loss) { |
| 84 | object pl,gilde; |
| 85 | string gname; |
| 86 | mapping skills; |
| 87 | |
| 88 | if (!(pl=this_player()) || !(gilde=previous_object())) |
| 89 | return 0; |
| 90 | // Gilden muessen Blueprints sein, so. ;-) |
| 91 | gname=object_name(gilde); |
| 92 | if (gname[0..7]!=GUILD_DIR || |
| 93 | ((string)pl->QueryProp(P_GUILD))!=gname[8..]) { |
| 94 | write("Du kannst hier nicht aus einer anderen Gilde austreten.\n"); |
| 95 | return -1; |
| 96 | } |
| 97 | if (gname[8..]==(pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD)) |
| 98 | { |
| 99 | write("Aus dieser Gilde kannst Du nicht austreten.\n"); |
| 100 | return -1; |
| 101 | } |
| 102 | if (loss<=0) loss=20; |
| 103 | skills=(mapping)pl->QueryProp(P_NEWSKILLS); |
| 104 | walk_mapping(skills,"loose_ability",this_object(),loss); |
| 105 | pl->SetProp(P_NEWSKILLS,skills); |
| 106 | pl->SetProp(P_GUILD,0); |
| 107 | // Event Gildenwechsel triggern |
| 108 | EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([ |
| 109 | E_OBJECT: pl, E_PLNAME: getuid(pl), |
| 110 | E_ENVIRONMENT: environment(pl), |
| 111 | E_GUILDNAME: pl->QueryProp(P_GUILD), |
| 112 | E_LAST_GUILDNAME: gname ]) ); |
| 113 | |
| 114 | // Defaultgilde ggf. neuen Titel setzen lassen. |
| 115 | gname = (string)pl->QueryProp(P_GUILD); |
| 116 | (GUILD_DIR+"/"+gname)->adjust_title(pl); |
| 117 | |
| 118 | return 1; |
| 119 | } |
| 120 | |
| 121 | nomask static int security_check() |
| 122 | { |
| 123 | if (previous_object() && geteuid(previous_object())==ROOTID) |
| 124 | return 1; |
| 125 | if (!process_call() && previous_object() && ARCH_SECURITY) |
| 126 | return 1; |
| 127 | return 0; |
| 128 | } |
| 129 | |
| 130 | nomask int AddGuild(string gildob) { |
| 131 | object tp; |
| 132 | |
| 133 | if (!stringp(gildob) || !sizeof(gildob) || !security_check() |
| 134 | || file_size(GUILD_DIR+gildob+".c")<0) |
| 135 | return 0; |
| 136 | if (member(valid_guilds, gildob) != -1) |
| 137 | return 0; |
| 138 | valid_guilds+=({gildob}); |
| 139 | save_object(GUILD_SAVEFILE); |
| 140 | return 1; |
| 141 | } |
| 142 | |
| 143 | nomask int RemoveGuild(string gildob) { |
| 144 | object tp; |
| 145 | |
| 146 | if (!stringp(gildob) || !sizeof(gildob) |
| 147 | || !security_check()) |
| 148 | return 0; |
| 149 | if (member(valid_guilds, gildob) == -1) |
| 150 | return 0; |
| 151 | valid_guilds-=({gildob}); |
| 152 | |
| 153 | save_object(GUILD_SAVEFILE); |
| 154 | return 1; |
| 155 | } |
| 156 | |
| 157 | nomask int ValidGuild(string gildenob) { |
| 158 | if (!stringp(gildenob)) |
| 159 | return 0; |
| 160 | |
| 161 | return (member(valid_guilds,gildenob)>=0); |
| 162 | } |
| 163 | |
| 164 | nomask string *_query_valid_guilds() {return copy(valid_guilds); } |
| 165 | |