/* dbutils.c */
#include "config.h"
/*
* This file is part of TeenyMUD II.
* Copyright(C) 1993, 1994, 1995 by Jason Downs.
* All rights reserved.
*
* TeenyMUD II is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* TeenyMUD II is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file 'COPYING'); if not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
*/
#include <stdio.h>
#include <sys/types.h>
#include "conf.h"
#include "teeny.h"
#include "commands.h"
#include "teenydb.h"
#include "externs.h"
/*
* Database intensive utility routines.
*/
/*
* Returns true if player controls object.
*/
int controls(player, cause, obj)
int player, cause, obj;
{
if (obj == -3)
return(1); /* everyone controls HOME */
if (!_exists_object(player) || !_exists_object(obj))
return(0);
if (isWIZARD(player))
return(1);
return(DSC_OWNER(main_index[obj]) == DSC_OWNER(main_index[player]));
}
/*
* Returns true if object is an exit, and player controls it's
* destination.
*/
int econtrols(player, cause, object)
int player, cause, object;
{
register int indx;
if(!_exists_object(player) || !_exists_object(object))
return(0);
if((DSC_TYPE(main_index[object]) == TYP_EXIT)
&& (DSC_DESTS(main_index[object]) != (int *)NULL)) {
for(indx = 1; indx <= (DSC_DESTS(main_index[object])[0]); indx++) {
if(DSC_OWNER(main_index[DSC_DESTS(main_index[object])[indx]])
== DSC_OWNER(main_index[player]))
return(1);
}
}
return(0);
}
/*
* Returns true is object can inherit Wizard powers.
*/
int inherit_wizard(object)
int object;
{
if(!_exists_object(object) || !_exists_object(DSC_OWNER(main_index[object]))
|| (!isINHERIT(object) && !isINHERIT(DSC_OWNER(main_index[object]))))
return(0);
return(isWIZARD(DSC_OWNER(main_index[object])));
}
/*
* Change the ownership of all objects owned by `oldowner' to `newowner'.
*/
int chownall(oldowner, newowner)
register int oldowner, newowner;
{
int i, count = 0;
if (!_exists_object(oldowner) || !_exists_object(newowner)) {
logfile(LOG_ERROR, "chownall: called with bad object as an argument\n");
return (0);
}
for (i = 0; i < mudstat.total_objects; i++) {
if (main_index[i] == (struct dsc *)NULL)
continue;
if (DSC_OWNER(main_index[i]) == oldowner) {
DSC_OWNER(main_index[i]) = newowner;
count++;
}
}
return count;
}
/*
* Checks and returns true if player is over their quota.
*/
int no_quota(player, cause, quiet)
int player, cause, quiet;
{
int quota;
register int i, total;
if (!_exists_object(player) || isWIZARD(DSC_OWNER(main_index[player])))
return (0);
for (i = 0, total = 0; i < mudstat.total_objects; i++) {
if (main_index[i] == (struct dsc *) NULL)
continue;
if (DSC_OWNER(main_index[i]) == DSC_OWNER(main_index[player]))
total++;
}
if (get_int_elt(DSC_OWNER(main_index[player]), QUOTA, "a) == -1) {
logfile(LOG_ERROR, "no_quota: player #%d has a bad quota ref.", player);
return (1);
}
if (total >= quota) {
if(!quiet)
notify_player(player, cause, player,
"Sorry, you're over your building limit.", NOT_QUIET);
return (1);
}
return (0);
}
/* shove all the startup attributes into the queue. */
void handle_startup()
{
register int idx;
int aflags;
char *attr;
for(idx = 0; idx < mudstat.total_objects; idx++) {
if(main_index[idx] == (struct dsc *)NULL)
continue;
if(DSC_FLAG2(main_index[idx]) & HAS_STARTUP) {
if(attr_get(idx, STARTUP, &attr, &aflags) == -1) {
logfile(LOG_ERROR, "handle_startup: bad attributes on object #%d\n",
idx);
continue;
}
if(attr != (char *)NULL)
queue_add(idx, idx, 1, -1, attr, 0, (char **)NULL);
cache_trim();
}
}
}
/* Check to see if they should be deleted. */
void handle_autotoad(player)
int player;
{
if(!isALIVE(player) && !isGUEST(player)) {
register int idx;
char *dstr, buf[BUFFSIZ];
int aflags, asource;
if(attr_get_parent(player, DESC, &dstr, &aflags, &asource) == -1) {
logfile(LOG_ERROR, "handle_autotoad: bad attributes on object #%d\n",
player);
return;
}
if(dstr && *dstr && (asource == player))
return;
for(idx = 0; idx < mudstat.total_objects; idx++) {
if(main_index[idx] == (struct dsc *)NULL)
continue;
if((DSC_OWNER(main_index[idx]) == player) && (idx != player))
return;
}
/* If we got this far, nuke 'em 'til they glow. */
if(get_str_elt(player, NAME, &dstr) == -1)
dstr = "???";
snprintf(buf, sizeof(buf), "%s self destructs... *BOOM*!", dstr);
notify_oall(player, mudconf.player_god, player, buf, NOT_NOPUPPET);
if(recycle_obj(mudconf.player_god, mudconf.player_god, player)) {
/* log in the commands area to match @toad. */
logfile(LOG_COMMAND, "AUTOTOAD: Deleted %s(#%d).\n", dstr, player);
}
}
}