ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.16
Committed: Sun Jul 1 05:00:17 2007 UTC (16 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_2, rel-2_3
Changes since 1.15: +11 -12 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.16 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 pippijn 1.10 *
4 root 1.14 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5     * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.10 *
8 root 1.16 * Crossfire TRT 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 3 of the License, or
11     * (at your option) any later version.
12 pippijn 1.10 *
13 root 1.16 * 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 pippijn 1.10 *
18 root 1.16 * You should have received a copy of the GNU General Public License
19     * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 root 1.14 *
21     * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 pippijn 1.10 */
23 elmex 1.1
24     #include <global.h>
25    
26     /*
27     * Add a new friendly object to the linked list of friendly objects.
28     * No checking to see if the object is already in the linked list is done.
29     */
30 root 1.5 void
31     add_friendly_object (object *op)
32     {
33 root 1.9 op->flag [FLAG_FRIENDLY] = 1;
34    
35 root 1.5 objectlink *ol;
36 elmex 1.1
37 root 1.5 /* Add some error checking. This shouldn't happen, but the friendly
38     * object list usually isn't very long, and remove_friendly_object
39     * won't remove it either. Plus, it is easier to put a breakpoint in
40     * the debugger here and see where the problem is happening.
41     */
42 root 1.9 for (ol = first_friendly_object; ol; ol = ol->next)
43 root 1.5 {
44     if (ol->ob == op)
45     {
46 root 1.15 LOG (llevError | logBacktrace, "add_friendly_object: Trying to add object already on list (%s)\n", &op->name);
47 root 1.5 return;
48 root 1.2 }
49 elmex 1.1 }
50    
51 root 1.5 ol = first_friendly_object;
52     first_friendly_object = get_objectlink ();
53     first_friendly_object->ob = op;
54     first_friendly_object->next = ol;
55 elmex 1.1 }
56    
57     /*
58     * Removes the specified object from the linked list of friendly objects.
59     */
60 root 1.5 void
61     remove_friendly_object (object *op)
62     {
63     objectlink *obj;
64 elmex 1.1
65 root 1.5 CLEAR_FLAG (op, FLAG_FRIENDLY);
66 elmex 1.1
67 root 1.11 if (op->type == GOLEM
68     && op->owner
69     && op->owner->contr
70 root 1.12 && op->owner->contr->golem == op)
71     op->owner->contr->golem = 0;
72 root 1.11
73 root 1.5 if (!first_friendly_object)
74     {
75     LOG (llevError, "remove_friendly_object called with empty friendly list, remove ob=%s\n", &op->name);
76     return;
77     }
78 root 1.9
79 root 1.5 /* if the first object happens to be the one, processing is pretty
80     * easy.
81     */
82     if (first_friendly_object->ob == op)
83     {
84     obj = first_friendly_object;
85     first_friendly_object = obj->next;
86 root 1.7 delete obj;
87 elmex 1.1 }
88 root 1.5 else
89     {
90     objectlink *prev = first_friendly_object;
91    
92 root 1.9 for (obj = first_friendly_object->next; obj; obj = obj->next)
93 root 1.5 {
94     if (obj->ob == op)
95     break;
96 root 1.11
97 root 1.5 prev = obj;
98 root 1.2 }
99 root 1.7
100 root 1.5 if (obj)
101     {
102     prev->next = obj->next;
103 root 1.7 delete obj;
104 root 1.2 }
105 elmex 1.1 }
106     }
107    
108     /*
109 root 1.9 * Dumps all friendly objects.
110 elmex 1.1 */
111 root 1.5 void
112     dump_friendly_objects (void)
113     {
114     objectlink *ol;
115 elmex 1.1
116 root 1.9 for (ol = first_friendly_object; ol; ol = ol->next)
117 root 1.5 LOG (llevError, "%s (%d)\n", &ol->ob->name, ol->ob->count);
118 elmex 1.1 }
119    
120     /* New function, MSW 2000-1-14
121     * It traverses the friendly list removing objects that should not be here
122     * (ie, do not have friendly flag set, freed, etc)
123     */
124 root 1.5 void
125     clean_friendly_list (void)
126     {
127     objectlink *obj, *prev = NULL, *next;
128     int count = 0;
129    
130 root 1.7 for (obj = first_friendly_object; obj; obj = next)
131 root 1.5 {
132     next = obj->next;
133 root 1.7 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY))
134 root 1.5 {
135     if (prev)
136 root 1.7 prev->next = obj->next;
137 root 1.5 else
138 root 1.7 first_friendly_object = obj->next;
139    
140 root 1.5 count++;
141 root 1.7 delete obj;
142 root 1.2 }
143 root 1.5 else
144 root 1.7 /* If we removed the object, then prev is still valid. */
145 root 1.5 prev = obj;
146 elmex 1.1 }
147 root 1.7
148 root 1.5 if (count)
149     LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
150 elmex 1.1 }
151    
152     /* Checks if the given object is already in the friendly list or not
153     * Lauwenmark - 31/07/05
154     */
155 root 1.5 int
156     is_friendly (const object *op)
157 elmex 1.1 {
158 root 1.5 objectlink *ol;
159 elmex 1.1
160 root 1.9 for (ol = first_friendly_object; ol; ol = ol->next)
161 root 1.5 if (ol->ob == op)
162     return 1;
163 elmex 1.1
164 root 1.5 return 0;
165 elmex 1.1 }
166 root 1.9