ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.1
Committed: Sun Aug 13 17:16:00 2006 UTC (17 years, 9 months ago) by elmex
Content type: text/plain
Branch: MAIN
Log Message:
Made server compile with C++.
Removed cfanim plugin and crossedit.
C++ here we come.

File Contents

# User Rev Content
1 elmex 1.1 /*
2     * static char *rcsid_friend_c =
3     * "$Id$";
4     */
5    
6     /*
7     CrossFire, A Multiplayer game for X-windows
8    
9     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10     Copyright (C) 1992 Frank Tore Johansen
11    
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; either version 2 of the License, or
15     (at your option) any later version.
16    
17     This program is distributed in the hope that it will be useful,
18     but WITHOUT ANY WARRANTY; without even the implied warranty of
19     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20     GNU General Public License for more details.
21    
22     You should have received a copy of the GNU General Public License
23     along with this program; if not, write to the Free Software
24     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25    
26     The authors can be reached via e-mail at crossfire-devel@real-time.com
27     */
28    
29     #include <global.h>
30    
31     /*
32     * Add a new friendly object to the linked list of friendly objects.
33     * No checking to see if the object is already in the linked list is done.
34     */
35    
36     void add_friendly_object(object *op) {
37     objectlink *ol;
38    
39     /* Add some error checking. This shouldn't happen, but the friendly
40     * object list usually isn't very long, and remove_friendly_object
41     * won't remove it either. Plus, it is easier to put a breakpoint in
42     * the debugger here and see where the problem is happening.
43     */
44     for (ol=first_friendly_object; ol!=NULL; ol=ol->next) {
45     if (ol->ob == op) {
46     LOG(llevError, "add_friendly_object: Trying to add object already on list (%s)\n",
47     op->name);
48     return;
49     }
50     }
51    
52     ol=first_friendly_object;
53     first_friendly_object=get_objectlink();
54     first_friendly_object->ob = op;
55     first_friendly_object->id = op->count;
56     first_friendly_object->next=ol;
57     }
58    
59     /*
60     * Removes the specified object from the linked list of friendly objects.
61     */
62    
63     void remove_friendly_object(object *op) {
64     objectlink *obj;
65    
66     CLEAR_FLAG(op,FLAG_FRIENDLY);
67    
68     if (!first_friendly_object) {
69     LOG(llevError,"remove_friendly_object called with empty friendly list, remove ob=%s\n", op->name);
70     return;
71     }
72     /* if the first object happens to be the one, processing is pretty
73     * easy.
74     */
75     if(first_friendly_object->ob==op) {
76     obj=first_friendly_object;
77     first_friendly_object=obj->next;
78     free(obj);
79     } else {
80     objectlink *prev=first_friendly_object;
81    
82     for (obj=first_friendly_object->next; obj!=NULL; obj=obj->next) {
83     if (obj->ob == op) break;
84     prev=obj;
85     }
86     if (obj) {
87     /* This should not happen. But if it does, presumably the
88     * call to remove it is still valid.
89     */
90     if (obj->id != op->count) {
91     LOG(llevError,"remove_friendly_object, tags do no match, %s, %d != %d\n",
92     op->name?op->name:"none", op->count, obj->id);
93     }
94     prev->next = obj->next;
95     free(obj);
96     }
97     }
98     }
99    
100     /*
101     * Dumps all friendly objects. Invoked in DM-mode with the G key.
102     */
103    
104     void dump_friendly_objects(void) {
105     objectlink *ol;
106    
107     for(ol=first_friendly_object;ol!=NULL;ol=ol->next)
108     LOG(llevError, "%s (%d)\n",ol->ob->name,ol->ob->count);
109     }
110    
111     /* New function, MSW 2000-1-14
112     * It traverses the friendly list removing objects that should not be here
113     * (ie, do not have friendly flag set, freed, etc)
114     */
115     void clean_friendly_list(void) {
116     objectlink *obj, *prev=NULL, *next;
117     int count=0;
118    
119     for (obj=first_friendly_object; obj!=NULL; obj=next) {
120     next=obj->next;
121     if (QUERY_FLAG(obj->ob, FLAG_FREED) ||
122     !QUERY_FLAG(obj->ob, FLAG_FRIENDLY) ||
123     (obj->id != obj->ob->count)) {
124     if (prev) {
125     prev->next = obj->next;
126     }
127     else {
128     first_friendly_object = obj->next;
129     }
130     count++;
131     free(obj);
132     }
133     /* If we removed the object, then prev is still valid. */
134     else prev=obj;
135     }
136     if (count)
137     LOG(llevDebug,"clean_friendly_list: Removed %d bogus links\n", count);
138     }
139    
140     /* Checks if the given object is already in the friendly list or not
141     * Lauwenmark - 31/07/05
142     */
143     int is_friendly(const object* op)
144     {
145     objectlink *ol;
146    
147     for(ol=first_friendly_object;ol!=NULL;ol=ol->next)
148     if (ol->ob == op)
149     return 1;
150    
151     return 0;
152     }
153