blob: 1529a913f7339a0688a3dc956da4342d26dc0f2c [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 }
Arathorna64ce1a2023-04-23 23:26:25 +020099 if (gname[8..]==(({string})pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD)
100 &&
101 query_verb()!="selbstloeschung")
MG Mud User88f12472016-06-24 23:31:02 +0200102 {
103 write("Aus dieser Gilde kannst Du nicht austreten.\n");
104 return -1;
105 }
106 if (loss<=0) loss=20;
Vaniondb7851b2020-03-10 21:52:34 +0100107 skills=({mapping})pl->QueryProp(P_NEWSKILLS);
MG Mud User88f12472016-06-24 23:31:02 +0200108 walk_mapping(skills,"loose_ability",this_object(),loss);
bugfixd94d0932020-04-08 11:27:13 +0200109 ({mapping})pl->SetProp(P_NEWSKILLS,skills);
110 ({string})pl->SetProp(P_GUILD,0);
MG Mud User88f12472016-06-24 23:31:02 +0200111 // Event Gildenwechsel triggern
bugfixd94d0932020-04-08 11:27:13 +0200112 ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
MG Mud User88f12472016-06-24 23:31:02 +0200113 E_OBJECT: pl, E_PLNAME: getuid(pl),
114 E_ENVIRONMENT: environment(pl),
bugfixd94d0932020-04-08 11:27:13 +0200115 E_GUILDNAME: ({string})pl->QueryProp(P_GUILD),
MG Mud User88f12472016-06-24 23:31:02 +0200116 E_LAST_GUILDNAME: gname ]) );
117
118 // Defaultgilde ggf. neuen Titel setzen lassen.
Vaniondb7851b2020-03-10 21:52:34 +0100119 gname = ({string})pl->QueryProp(P_GUILD);
bugfixd94d0932020-04-08 11:27:13 +0200120 ({void})(GUILD_DIR+"/"+gname)->adjust_title(pl);
MG Mud User88f12472016-06-24 23:31:02 +0200121
122 return 1;
123}
124
125nomask static int security_check()
126{
127 if (previous_object() && geteuid(previous_object())==ROOTID)
128 return 1;
129 if (!process_call() && previous_object() && ARCH_SECURITY)
130 return 1;
131 return 0;
132}
133
134nomask int AddGuild(string gildob) {
MG Mud User88f12472016-06-24 23:31:02 +0200135 if (!stringp(gildob) || !sizeof(gildob) || !security_check()
136 || file_size(GUILD_DIR+gildob+".c")<0)
137 return 0;
138 if (member(valid_guilds, gildob) != -1)
139 return 0;
140 valid_guilds+=({gildob});
141 save_object(GUILD_SAVEFILE);
142 return 1;
143}
144
145nomask int RemoveGuild(string gildob) {
MG Mud User88f12472016-06-24 23:31:02 +0200146 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