aboutsummaryrefslogtreecommitdiff
path: root/src/room.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-02-12 21:54:42 -0500
committerFranklin Wei <git@fwei.tk>2016-02-16 20:42:49 -0500
commitb110e7e0c519cc9575f8d224f0f75aca0d73946f (patch)
treec3f33326a5e4822f2251e8d7370294096ab2eba4 /src/room.c
parenta006044fbcb3355f0fa063720e7c41f4971894a0 (diff)
downloadnetcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.zip
netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.tar.gz
netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.tar.bz2
netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.tar.xz
support multiple objects sharing the same name
Diffstat (limited to 'src/room.c')
-rw-r--r--src/room.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/src/room.c b/src/room.c
index 58563a8..9a92588 100644
--- a/src/room.c
+++ b/src/room.c
@@ -19,6 +19,7 @@
#include "globals.h"
#include "hash.h"
+#include "multimap.h"
#include "server.h"
#include "room.h"
#include "userdb.h"
@@ -35,7 +36,10 @@ bool room_user_add(room_id id, struct child_data *child)
if(child->user)
{
/* hash_insert returns NULL on success */
- return !hash_insert(room->users, child->user, child);
+ bool ret = !hash_insert(room->users, child->user, child);
+ if(room->data.hook_enter)
+ room->data.hook_enter(id, child);
+ return ret;
}
else
return false;
@@ -46,7 +50,12 @@ bool room_user_del(room_id id, struct child_data *child)
struct room_t *room = room_get(id);
if(child->user)
- return hash_remove(room->users, child->user);
+ {
+ bool ret = hash_remove(room->users, child->user);
+ if(room->data.hook_leave)
+ room->data.hook_leave(id, child);
+ return ret;
+ }
else
return false;
}
@@ -56,7 +65,7 @@ void room_free(struct room_t *room)
hash_free(room->users);
room->users = NULL;
- hash_free(room->objects);
+ multimap_free(room->objects);
room->objects = NULL;
hash_free(room->verbs);
@@ -68,30 +77,42 @@ void room_free(struct room_t *room)
bool room_obj_add(room_id room, struct object_t *obj)
{
- return !hash_insert(room_get(room)->objects, obj->name, obj);
+ return !multimap_insert(room_get(room)->objects, obj->name, obj);
}
-struct object_t *room_obj_iterate(room_id room, void **save)
+const struct multimap_list *room_obj_iterate(room_id room, void **save, size_t *n_pairs)
{
if(room != ROOM_NONE)
- return hash_iterate(room_get(room)->objects, save, NULL);
+ return multimap_iterate(room_get(room)->objects, save, n_pairs);
else
- return hash_iterate(NULL, save, NULL);
+ return multimap_iterate(NULL, save, n_pairs);
+}
+
+const struct multimap_list *room_obj_get(room_id room, const char *name)
+{
+ return multimap_lookup(room_get(room)->objects, name, NULL);
}
-struct object_t *room_obj_get(room_id room, const char *name)
+const struct multimap_list *room_obj_get_size(room_id room, const char *name, size_t *n_objs)
{
- return hash_lookup(room_get(room)->objects, name);
+ return multimap_lookup(room_get(room)->objects, name, n_objs);
}
size_t room_obj_count(room_id room)
{
- return hash_size(room_get(room)->objects);
+ return multimap_size(room_get(room)->objects);
}
bool room_obj_del(room_id room, const char *name)
{
- return hash_remove(room_get(room)->objects, name);
+ return multimap_delete_all(room_get(room)->objects, name);
+}
+
+bool room_obj_del_id(room_id room, const char *name, obj_id id)
+{
+ struct object_t tmp;
+ tmp.id = id;
+ return multimap_delete(room_get(room)->objects, name, &tmp);
}
#define OBJMAP_SIZE 8
@@ -102,8 +123,8 @@ void room_init_maps(struct room_t *room)
{
room->users = hash_init((userdb_size() / 2) + 1, hash_djb, compare_strings);
- room->objects = hash_init(OBJMAP_SIZE, hash_djb, compare_strings);
- hash_setfreedata_cb(room->objects, obj_free);
+ room->objects = multimap_init(OBJMAP_SIZE, hash_djb, compare_strings_nocase, obj_compare);
+ multimap_setfreedata_cb(room->objects, obj_free);
room->verbs = hash_init(VERBMAP_SZ,
hash_djb,