blob: 2954ce8fc23f554ffccd280e2577cbe00ff7fecb [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
Vaniondb7851b2020-03-10 21:52:34 +010049 if ((ogname=({string})pl->QueryProp(P_GUILD)) &&
50 (ogname!=((({string})pl->QueryProp(P_DEFAULT_GUILD)) || DEFAULT_GUILD))) {
MG Mud User88f12472016-06-24 23:31:02 +020051 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 }
bugfixd94d0932020-04-08 11:27:13 +020060 ({string})pl->SetProp(P_GUILD,gname);
MG Mud User88f12472016-06-24 23:31:02 +020061 // Event Gildenwechsel triggern
bugfixd94d0932020-04-08 11:27:13 +020062 ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
MG Mud User88f12472016-06-24 23:31:02 +020063 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 ||
Vaniondb7851b2020-03-10 21:52:34 +010093 (({string})pl->QueryProp(P_GUILD))!=gname[8..]) {
MG Mud User88f12472016-06-24 23:31:02 +020094 write("Du kannst hier nicht aus einer anderen Gilde austreten.\n");
95 return -1;
96 }
bugfixd94d0932020-04-08 11:27:13 +020097 if (gname[8..]==(({string})pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
MG Mud User88f12472016-06-24 23:31:02 +020098 {
99 write("Aus dieser Gilde kannst Du nicht austreten.\n");
100 return -1;
101 }
102 if (loss<=0) loss=20;
Vaniondb7851b2020-03-10 21:52:34 +0100103 skills=({mapping})pl->QueryProp(P_NEWSKILLS);
MG Mud User88f12472016-06-24 23:31:02 +0200104 walk_mapping(skills,"loose_ability",this_object(),loss);
bugfixd94d0932020-04-08 11:27:13 +0200105 ({mapping})pl->SetProp(P_NEWSKILLS,skills);
106 ({string})pl->SetProp(P_GUILD,0);
MG Mud User88f12472016-06-24 23:31:02 +0200107 // Event Gildenwechsel triggern
bugfixd94d0932020-04-08 11:27:13 +0200108 ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
MG Mud User88f12472016-06-24 23:31:02 +0200109 E_OBJECT: pl, E_PLNAME: getuid(pl),
110 E_ENVIRONMENT: environment(pl),
bugfixd94d0932020-04-08 11:27:13 +0200111 E_GUILDNAME: ({string})pl->QueryProp(P_GUILD),
MG Mud User88f12472016-06-24 23:31:02 +0200112 E_LAST_GUILDNAME: gname ]) );
113
114 // Defaultgilde ggf. neuen Titel setzen lassen.
Vaniondb7851b2020-03-10 21:52:34 +0100115 gname = ({string})pl->QueryProp(P_GUILD);
bugfixd94d0932020-04-08 11:27:13 +0200116 ({void})(GUILD_DIR+"/"+gname)->adjust_title(pl);
MG Mud User88f12472016-06-24 23:31:02 +0200117
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) {
MG Mud User88f12472016-06-24 23:31:02 +0200131 if (!stringp(gildob) || !sizeof(gildob) || !security_check()
132 || file_size(GUILD_DIR+gildob+".c")<0)
133 return 0;
134 if (member(valid_guilds, gildob) != -1)
135 return 0;
136 valid_guilds+=({gildob});
137 save_object(GUILD_SAVEFILE);
138 return 1;
139}
140
141nomask int RemoveGuild(string gildob) {
MG Mud User88f12472016-06-24 23:31:02 +0200142 if (!stringp(gildob) || !sizeof(gildob)
143 || !security_check())
144 return 0;
145 if (member(valid_guilds, gildob) == -1)
146 return 0;
147 valid_guilds-=({gildob});
148
149 save_object(GUILD_SAVEFILE);
150 return 1;
151}
152
153nomask int ValidGuild(string gildenob) {
154 if (!stringp(gildenob))
155 return 0;
156
157 return (member(valid_guilds,gildenob)>=0);
158}
159
160nomask string *_query_valid_guilds() {return copy(valid_guilds); }
161