00001
00002
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
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 }