src/player_c.c

Go to the documentation of this file.
00001 /*
00002  * player_c.c -- Player cache routines 
00003  */
00004 
00005 #include "copyright.h"
00006 #include "config.h"
00007 
00008 #include "mudconf.h"
00009 #include "htab.h"
00010 #include "externs.h"
00011 #include "alloc.h"
00012 #include "attrs.h"
00013 #include "db.h"
00014 #include "pcache.h"
00015 #include "rbtree.h"
00016 
00017 int compare_pcache(dbref left, dbref right)
00018 {
00019         return (left - right);
00020 }
00021 
00022 void pcache_init(void)
00023 {
00024         pcache_tree = rb_init((void *)compare_pcache, NULL);
00025         pcache_head = NULL;
00026 }
00027 
00028 static void pcache_reload1(dbref player, PCACHE * pp)
00029 {
00030         char *cp;
00031 
00032         cp = atr_get_raw(player, A_MONEY);
00033         if(cp && *cp)
00034                 pp->money = atoi(cp);
00035         else
00036                 pp->money = 0;
00037 
00038         cp = atr_get_raw(player, A_QUEUEMAX);
00039         if(cp && *cp)
00040                 pp->qmax = atoi(cp);
00041         else if(!Wizard(player))
00042                 pp->qmax = mudconf.queuemax;
00043         else
00044                 pp->qmax = -1;
00045 }
00046 
00047 PCACHE *pcache_find(dbref player)
00048 {
00049         PCACHE *pp;
00050 
00051         if(!Good_obj(player) || !OwnsOthers(player))
00052                 return NULL;
00053 
00054         pp = (PCACHE *) rb_find(pcache_tree, (void *)player);
00055         if(pp) {
00056                 pp->cflags |= PF_REF;
00057                 return pp;
00058         }
00059         pp = malloc(sizeof(PCACHE));
00060         pp->queue = 0;
00061         pp->cflags = PF_REF;
00062         pp->player = player;
00063         pcache_reload1(player, pp);
00064         pp->next = pcache_head;
00065         pcache_head = pp;
00066         rb_insert(pcache_tree, (void *)player, (void *)pp);
00067         return pp;
00068 }
00069 
00070 void pcache_reload(dbref player)
00071 {
00072         PCACHE *pp;
00073 
00074         pp = pcache_find(player);
00075         if(!pp)
00076                 return;
00077         pcache_reload1(player, pp);
00078 }
00079 
00080 static void pcache_save(PCACHE * pp)
00081 {
00082         IBUF tbuf;
00083 
00084         if(pp->cflags & PF_DEAD)
00085                 return;
00086         if(pp->cflags & PF_MONEY_CH) {
00087                 sprintf(tbuf, "%d", pp->money);
00088                 atr_add_raw(pp->player, A_MONEY, tbuf);
00089         }
00090         if(pp->cflags & PF_QMAX_CH) {
00091                 sprintf(tbuf, "%d", pp->qmax);
00092                 atr_add_raw(pp->player, A_QUEUEMAX, tbuf);
00093         }
00094         pp->cflags &= ~(PF_MONEY_CH | PF_QMAX_CH);
00095 }
00096 
00097 void pcache_trim(void)
00098 {
00099         PCACHE *pp, *pplast, *ppnext;
00100         return;
00101 
00102         pp = pcache_head;
00103         pplast = NULL;
00104         while (pp) {
00105                 if(!(pp->cflags & PF_DEAD) && (pp->queue || (pp->cflags & PF_REF))) {
00106                         pp->cflags &= ~PF_REF;
00107                         pplast = pp;
00108                         pp = pp->next;
00109                 } else {
00110                         ppnext = pp->next;
00111                         if(pplast)
00112                                 pplast->next = ppnext;
00113                         else
00114                                 pcache_head = ppnext;
00115                         if(!(pp->cflags & PF_DEAD)) {
00116                                 pcache_save(pp);
00117                                 rb_delete(pcache_tree, (void *)pp->player);
00118                         }
00119                         free(pp);
00120                         pp = ppnext;
00121                 }
00122         }
00123 }
00124 
00125 void pcache_sync(void)
00126 {
00127         PCACHE *pp;
00128 
00129         pp = pcache_head;
00130         while (pp) {
00131                 pcache_save(pp);
00132                 pp = pp->next;
00133         }
00134 }
00135 
00136 #if 0
00137 
00138 // Not used?
00139 
00140 void pcache_purge(dbref player)
00141 {
00142         PCACHE *pp;
00143 
00144         pp = rb_find(pcache_tree, player);
00145         if(!pp)
00146                 return;
00147         pp->cflags = PF_DEAD;
00148         rb_delete(pcache_tree, pp->player);
00149         free(pp);
00150 }
00151 #endif
00152 
00153 int a_Queue(dbref player, int adj)
00154 {
00155         PCACHE *pp;
00156 
00157         if(OwnsOthers(player)) {
00158                 pp = pcache_find(player);
00159                 if(pp)
00160                         pp->queue += adj;
00161                 return pp->queue;
00162         }
00163         return 0;
00164 }
00165 
00166 void s_Queue(dbref player, int val)
00167 {
00168         PCACHE *pp;
00169 
00170         if(OwnsOthers(player)) {
00171                 pp = pcache_find(player);
00172                 if(pp)
00173                         pp->queue = val;
00174         }
00175 }
00176 
00177 int QueueMax(dbref player)
00178 {
00179         PCACHE *pp;
00180         int m;
00181 
00182         m = 0;
00183         if(OwnsOthers(player)) {
00184                 pp = pcache_find(player);
00185                 if(pp) {
00186                         if(pp->qmax >= 0) {
00187                                 m = pp->qmax;
00188                         } else {
00189                                 m = mudstate.db_top + 1;
00190                                 if(m < mudconf.queuemax)
00191                                         m = mudconf.queuemax;
00192                         }
00193                 }
00194         }
00195         return m;
00196 }
00197 
00198 int Pennies(dbref obj)
00199 {
00200         char *cp;
00201 
00202         PCACHE *pp;
00203 
00204         if(OwnsOthers(obj)) {
00205                 pp = pcache_find(obj);
00206                 if(pp)
00207                         return pp->money;
00208         }
00209         cp = atr_get_raw(obj, A_MONEY);
00210         return (safe_atoi(cp));
00211 }
00212 
00213 void s_Pennies(dbref obj, int howfew)
00214 {
00215         IBUF tbuf;
00216 
00217         PCACHE *pp;
00218 
00219         if(OwnsOthers(obj)) {
00220                 pp = pcache_find(obj);
00221                 if(pp) {
00222                         pp->money = howfew;
00223                         pp->cflags |= PF_MONEY_CH;
00224                 }
00225         }
00226         sprintf(tbuf, "%d", howfew);
00227         atr_add_raw(obj, A_MONEY, tbuf);
00228 }

Generated on Mon May 28 04:25:25 2007 for BattletechMUX by  doxygen 1.4.7