ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.9
Committed: Mon Jan 8 01:19:02 2007 UTC (17 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.8: +9 -8 lines
Log Message:
more preperations for player eviction

File Contents

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