blob: 56c5e3d1f0e1d3447fe48aa2bddfacef29ad8615 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#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
18string *valid_guilds = ({});
19
20void 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
28public mixed QueryProp( string name )
29{
30 if (name==P_VALID_GUILDS)
31 return copy(valid_guilds);
32 return 0;
33}
34
35nomask 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
71static 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
83varargs 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
121nomask 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
130nomask 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
143nomask 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
157nomask int ValidGuild(string gildenob) {
158 if (!stringp(gildenob))
159 return 0;
160
161 return (member(valid_guilds,gildenob)>=0);
162}
163
164nomask string *_query_valid_guilds() {return copy(valid_guilds); }
165