blob: a4073eb5d18176fed3f4ee8960f9ced5d0a025c2 [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() {
Arathorn74690302021-08-07 15:27:30 +020036 object pl = this_player();
37 object gilde = previous_object();
MG Mud User88f12472016-06-24 23:31:02 +020038
Arathorn74690302021-08-07 15:27:30 +020039 if (!objectp(pl) || !objectp(gilde))
MG Mud User88f12472016-06-24 23:31:02 +020040 return 0;
MG Mud User88f12472016-06-24 23:31:02 +020041
Arathorn74690302021-08-07 15:27:30 +020042 // Gilden sind Blueprints.
43 string gname = object_name(gilde);
44 string ogname = ({string})pl->QueryProp(P_GUILD);
45
46 if (GUILD_DIR+ogname == gname) {
MG Mud User88f12472016-06-24 23:31:02 +020047 write("Du bist schon in dieser Gilde.\n");
48 return -4;
49 }
50
Arathorn74690302021-08-07 15:27:30 +020051 if (ogname &&
Vaniondb7851b2020-03-10 21:52:34 +010052 (ogname!=((({string})pl->QueryProp(P_DEFAULT_GUILD)) || DEFAULT_GUILD))) {
MG Mud User88f12472016-06-24 23:31:02 +020053 write("Du bist noch in einer anderen Gilde.\n");
54 return -1;
55 }
56 if (gname[0..7]!=GUILD_DIR ||
57 member(valid_guilds,(gname=gname[8..]))<0) {
58 write("Diese Gilde ist leider nicht zugelassen.\n"+
59 "Bitte verstaendige einen Erzmagier.\n");
60 return -2;
61 }
bugfixd94d0932020-04-08 11:27:13 +020062 ({string})pl->SetProp(P_GUILD,gname);
MG Mud User88f12472016-06-24 23:31:02 +020063 // Event Gildenwechsel triggern
bugfixd94d0932020-04-08 11:27:13 +020064 ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
MG Mud User88f12472016-06-24 23:31:02 +020065 E_OBJECT: pl, E_PLNAME: getuid(pl),
66 E_ENVIRONMENT: environment(pl),
67 E_GUILDNAME: gname,
68 E_LAST_GUILDNAME: ogname ]) );
69
70 return 1;
71}
72
73static nomask void loose_ability(mixed key, mixed dat, int loss) {
74 mixed val;
75
76 val=mappingp(dat)?dat[SI_SKILLABILITY]:dat;
77 if (!intp(val) || val<=0) return;
78 val-=(val*loss)/100;if (val<=0) val=1;
79 if (mappingp(dat))
80 dat[SI_SKILLABILITY]=val;
81 else
82 dat=val;
83}
84
85varargs nomask int austreten(int loss) {
86 object pl,gilde;
87 string gname;
88 mapping skills;
89
90 if (!(pl=this_player()) || !(gilde=previous_object()))
91 return 0;
92 // Gilden muessen Blueprints sein, so. ;-)
93 gname=object_name(gilde);
94 if (gname[0..7]!=GUILD_DIR ||
Vaniondb7851b2020-03-10 21:52:34 +010095 (({string})pl->QueryProp(P_GUILD))!=gname[8..]) {
MG Mud User88f12472016-06-24 23:31:02 +020096 write("Du kannst hier nicht aus einer anderen Gilde austreten.\n");
97 return -1;
98 }
bugfixd94d0932020-04-08 11:27:13 +020099 if (gname[8..]==(({string})pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
MG Mud User88f12472016-06-24 23:31:02 +0200100 {
101 write("Aus dieser Gilde kannst Du nicht austreten.\n");
102 return -1;
103 }
104 if (loss<=0) loss=20;
Vaniondb7851b2020-03-10 21:52:34 +0100105 skills=({mapping})pl->QueryProp(P_NEWSKILLS);
MG Mud User88f12472016-06-24 23:31:02 +0200106 walk_mapping(skills,"loose_ability",this_object(),loss);
bugfixd94d0932020-04-08 11:27:13 +0200107 ({mapping})pl->SetProp(P_NEWSKILLS,skills);
108 ({string})pl->SetProp(P_GUILD,0);
MG Mud User88f12472016-06-24 23:31:02 +0200109 // Event Gildenwechsel triggern
bugfixd94d0932020-04-08 11:27:13 +0200110 ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
MG Mud User88f12472016-06-24 23:31:02 +0200111 E_OBJECT: pl, E_PLNAME: getuid(pl),
112 E_ENVIRONMENT: environment(pl),
bugfixd94d0932020-04-08 11:27:13 +0200113 E_GUILDNAME: ({string})pl->QueryProp(P_GUILD),
MG Mud User88f12472016-06-24 23:31:02 +0200114 E_LAST_GUILDNAME: gname ]) );
115
116 // Defaultgilde ggf. neuen Titel setzen lassen.
Vaniondb7851b2020-03-10 21:52:34 +0100117 gname = ({string})pl->QueryProp(P_GUILD);
bugfixd94d0932020-04-08 11:27:13 +0200118 ({void})(GUILD_DIR+"/"+gname)->adjust_title(pl);
MG Mud User88f12472016-06-24 23:31:02 +0200119
120 return 1;
121}
122
123nomask static int security_check()
124{
125 if (previous_object() && geteuid(previous_object())==ROOTID)
126 return 1;
127 if (!process_call() && previous_object() && ARCH_SECURITY)
128 return 1;
129 return 0;
130}
131
132nomask int AddGuild(string gildob) {
MG Mud User88f12472016-06-24 23:31:02 +0200133 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) {
MG Mud User88f12472016-06-24 23:31:02 +0200144 if (!stringp(gildob) || !sizeof(gildob)
145 || !security_check())
146 return 0;
147 if (member(valid_guilds, gildob) == -1)
148 return 0;
149 valid_guilds-=({gildob});
150
151 save_object(GUILD_SAVEFILE);
152 return 1;
153}
154
155nomask int ValidGuild(string gildenob) {
156 if (!stringp(gildenob))
157 return 0;
158
159 return (member(valid_guilds,gildenob)>=0);
160}
161
162nomask string *_query_valid_guilds() {return copy(valid_guilds); }
163