blob: 56c5e3d1f0e1d3447fe48aa2bddfacef29ad8615 [file] [log] [blame]
#pragma strict_types
#pragma no_clone
#pragma no_shadow
#pragma no_inherit
#pragma verbose_errors
#pragma combine_strings
//#pragma pedantic
//#pragma range_check
#pragma warn_deprecated
#define NEED_PROTOTYPES
#include <thing/properties.h>
#include <properties.h>
#include <wizlevels.h>
#include <new_skills.h>
#include <events.h>
string *valid_guilds = ({});
void create() {
seteuid(getuid(this_object()));
restore_object(GUILD_SAVEFILE);
if (!pointerp(valid_guilds))
valid_guilds=({});
}
//noetig, da nun valid_guilds eine Variable ist
public mixed QueryProp( string name )
{
if (name==P_VALID_GUILDS)
return copy(valid_guilds);
return 0;
}
nomask int beitreten() {
object pl,gilde;
string gname,ogname;
if (!(pl=this_player()) || !(gilde=previous_object()))
return 0;
// Gilden sind Blueprints.
gname=object_name(gilde);
if ((GUILD_DIR+ogname)==gname) {
write("Du bist schon in dieser Gilde.\n");
return -4;
}
if ((ogname=(string)pl->QueryProp(P_GUILD)) &&
(ogname!=(((string)pl->QueryProp(P_DEFAULT_GUILD)) || DEFAULT_GUILD))) {
write("Du bist noch in einer anderen Gilde.\n");
return -1;
}
if (gname[0..7]!=GUILD_DIR ||
member(valid_guilds,(gname=gname[8..]))<0) {
write("Diese Gilde ist leider nicht zugelassen.\n"+
"Bitte verstaendige einen Erzmagier.\n");
return -2;
}
pl->SetProp(P_GUILD,gname);
// Event Gildenwechsel triggern
EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
E_OBJECT: pl, E_PLNAME: getuid(pl),
E_ENVIRONMENT: environment(pl),
E_GUILDNAME: gname,
E_LAST_GUILDNAME: ogname ]) );
return 1;
}
static nomask void loose_ability(mixed key, mixed dat, int loss) {
mixed val;
val=mappingp(dat)?dat[SI_SKILLABILITY]:dat;
if (!intp(val) || val<=0) return;
val-=(val*loss)/100;if (val<=0) val=1;
if (mappingp(dat))
dat[SI_SKILLABILITY]=val;
else
dat=val;
}
varargs nomask int austreten(int loss) {
object pl,gilde;
string gname;
mapping skills;
if (!(pl=this_player()) || !(gilde=previous_object()))
return 0;
// Gilden muessen Blueprints sein, so. ;-)
gname=object_name(gilde);
if (gname[0..7]!=GUILD_DIR ||
((string)pl->QueryProp(P_GUILD))!=gname[8..]) {
write("Du kannst hier nicht aus einer anderen Gilde austreten.\n");
return -1;
}
if (gname[8..]==(pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
{
write("Aus dieser Gilde kannst Du nicht austreten.\n");
return -1;
}
if (loss<=0) loss=20;
skills=(mapping)pl->QueryProp(P_NEWSKILLS);
walk_mapping(skills,"loose_ability",this_object(),loss);
pl->SetProp(P_NEWSKILLS,skills);
pl->SetProp(P_GUILD,0);
// Event Gildenwechsel triggern
EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
E_OBJECT: pl, E_PLNAME: getuid(pl),
E_ENVIRONMENT: environment(pl),
E_GUILDNAME: pl->QueryProp(P_GUILD),
E_LAST_GUILDNAME: gname ]) );
// Defaultgilde ggf. neuen Titel setzen lassen.
gname = (string)pl->QueryProp(P_GUILD);
(GUILD_DIR+"/"+gname)->adjust_title(pl);
return 1;
}
nomask static int security_check()
{
if (previous_object() && geteuid(previous_object())==ROOTID)
return 1;
if (!process_call() && previous_object() && ARCH_SECURITY)
return 1;
return 0;
}
nomask int AddGuild(string gildob) {
object tp;
if (!stringp(gildob) || !sizeof(gildob) || !security_check()
|| file_size(GUILD_DIR+gildob+".c")<0)
return 0;
if (member(valid_guilds, gildob) != -1)
return 0;
valid_guilds+=({gildob});
save_object(GUILD_SAVEFILE);
return 1;
}
nomask int RemoveGuild(string gildob) {
object tp;
if (!stringp(gildob) || !sizeof(gildob)
|| !security_check())
return 0;
if (member(valid_guilds, gildob) == -1)
return 0;
valid_guilds-=({gildob});
save_object(GUILD_SAVEFILE);
return 1;
}
nomask int ValidGuild(string gildenob) {
if (!stringp(gildenob))
return 0;
return (member(valid_guilds,gildenob)>=0);
}
nomask string *_query_valid_guilds() {return copy(valid_guilds); }