ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
(Generate patch)

Comparing deliantra/server/common/friend.C (file contents):
Revision 1.4 by root, Sun Sep 3 00:18:39 2006 UTC vs.
Revision 1.8 by pippijn, Sat Jan 6 14:42:28 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines