forked from eddoww/Astonia-3.5
/
expire.c
96 lines (79 loc) · 2.8 KB
/
expire.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* $Id: expire.c,v 1.2 2007/02/24 14:09:54 devel Exp $
*
* $Log: expire.c,v $
* Revision 1.2 2007/02/24 14:09:54 devel
* NWO first checkin, feb 24
*
*/
#include "server.h"
#include "log.h"
#include "timer.h"
#include "map.h"
#include "create.h"
#include "container.h"
#include "consistency.h"
#include "expire.h"
static void expire_timer(int in,int serial,int x,int y,int expire_sn)
{
if (!(it[in].flags)) return; // item was destroyed in the meantime
if (it[in].serial!=serial) return; // item was destroyed and re-created
if (it[in].x!=x || it[in].y!=y) return; // item is not where it was supposed to be
if (it[in].expire_sn!=expire_sn) return; // wrong timer instance
if (remove_item_map(in)) {
if (it[in].content) destroy_item_container(in);
free_item(in);
return;
}
//xlog("%s (%d): max=%d, cur=%d, dam=%d",it[in].name,in,it[in].max_damage,it[in].cur_damage,dam);
elog("could not expire item %s",it[in].name);
}
// set item expire for items on map
int set_expire(int in,int duration)
{
if (in<1 || in>=MAXITEM) {
elog("set_expire: got illegal item number %d",in);
return 0;
}
if (!(it[in].flags)) {
elog("set_expire: trying to expire unused item %d",in);
return 0;
}
if (it[in].flags&IF_NODECAY) return 1;
it[in].expire_sn++;
return set_timer(ticker+duration,expire_timer,in,it[in].serial,it[in].x,it[in].y,it[in].expire_sn);
}
static void expire_timer_body(int in,int serial,int x,int y,int dummy)
{
if (!(it[in].flags)) return; // item was destroyed in the meantime
if (it[in].serial!=serial) return; // item was destroyed and re-created
if (it[in].x!=x || it[in].y!=y) return; // item is not where it was supposed to be
(*(unsigned int*)(it[in].drdata+8))--;
if (container_itemcnt(in) && *(unsigned int*)(it[in].drdata+8)) {
set_timer(ticker+TICKS*5,expire_timer_body,in,it[in].serial,it[in].x,it[in].y,0);
return;
}
if (it[in].flags&IF_PLAYERBODY) ilog("expire: destroying item %s (%s) (%d), cnt=%d, pos=%d,%d",it[in].name,it[in].description,in,container_itemcnt(in),it[in].x,it[in].y);
if (remove_item_map(in)) {
if (it[in].content) destroy_item_container(in);
free_item(in);
return;
}
//xlog("%s (%d): max=%d, cur=%d, dam=%d",it[in].name,in,it[in].max_damage,it[in].cur_damage,dam);
elog("could not expire item %s",it[in].name);
}
// set item expire for items on map
int set_expire_body(int in,int duration)
{
if (in<1 || in>=MAXITEM) {
elog("set_expire: got illegal item number %d",in);
return 0;
}
if (!(it[in].flags)) {
elog("set_expire: trying to expire unused item %d",in);
return 0;
}
if (it[in].flags&IF_NODECAY) return 1;
*(unsigned int*)(it[in].drdata+8)=duration/(TICKS*5);
return set_timer(ticker+TICKS/2,expire_timer_body,in,it[in].serial,it[in].x,it[in].y,0);
}