Hello all, as a spur of the moment thing I decided to work on getting items
which shops don't "produce" to save to a file (just the vnum), which is
loaded at a reset, zone reboot, mud crash/reboot, etc. However I've hit a
roadblock and am not thinking very straight at the moment and could use a
bit of assistance... I'm submitting this here as it is (very new, tested and
crashed, early). Any help is appreciated:
** CODE **
These two functions are in shop.c:
/* Function to take a shop and mob and save any non-unique items to it
* It saves any object vnums which aren't native producing, good for crashs
*/
void save_shop_nonnative(shop_vnum shop_num, struct char_data *keeper)
{
FILE *cfile = NULL;
struct obj_data *obj, *next_obj;
sprintf(buf, "shop_item/%ld", shop_num);
if ((cfile = fopen(buf, "w")) == NULL) {
/* Create the File Then */
sprintf(buf2, "shop_item/%ld", shop_num);
if (!(cfile = fopen(buf2, "w"))) {
mudlog("SYSERR: SHP: Can't write new shop_item file.", BRF, LVL_IMPL,
TRUE);
exit(0);
}
fprintf(cfile, "#%ld\n"
"$\n", shop_num);
}
/* Loops through the keeper's item list, checks if its native or not
* if it isnt, it writes the item's VNUM to the file */
*buf = '\0';
*buf2 = '\0';
sprintf(buf2, "#%ld\n", shop_num);
for (obj = keeper->carrying; obj; obj = next_obj) {
next_obj = obj->next;
if (!shop_producing(obj, shop_num))
sprintf(buf2+strlen(buf2), "%ld\n", GET_OBJ_VNUM(obj));
}
fprintf(cfile, buf2);
fclose(cfile);
return;
}
void load_shop_nonnative(shop_vnum shop_num, struct char_data *keeper)
{
FILE *cfile = NULL;
struct obj_data *obj;
int line_num = 0, placer = 0;
sprintf(buf, "shop_item/%ld", shop_num);
/* Check to see if we have a file for this shop number */
if ((cfile = fopen(buf, "r")) == NULL)
return;
line_num += get_line(cfile, buf);
if (sscanf(buf, "#%d", &placer) != 1) {
fprintf(stderr, "Format error in shop_item %ld, line %d.\n", shop_num,
line_num);
exit(0);
}
while (buf && *buf != '$') {
line_num += get_line(cfile, buf);
if (sscanf(buf, "#%d", &placer) != 1) {
fprintf(stderr, "Format error in shop_item %ld, line %d.\n", shop_num,
line_num);
exit(0);
}
obj = read_object(placer, VIRTUAL);
if (!obj || GET_OBJ_VNUM(obj) == NOTHING) {
fprintf(stderr, "Bad Object in shop_item %ld, line %d.\n", shop_num,
line_num);
exit(0);
}
if (!shop_producing(obj, shop_num))
slide_obj(obj, keeper, shop_num);
}
return;
}
In db.c I added in all the needed includes, extern'd the shop_index and
top_shop so they would be available.
In reset_zone right after the end of the switch statement for checking for
mob, obj, etc loads I added this:
/* Parts for loading non-native items in shops, if mob
* load was true, see if this mob is a shopkeeper, if it
* is then we should try the load function */
if (mob_load == TRUE) {
for (shop_nr = 0; shop_nr <= top_shop; shop_nr++) {
if (SHOP_KEEPER(shop_nr) == mob->nr)
break;
}
if (!(shop_nr > top_shop)) {
load_shop_nonnative(shop_nr, mob);
}
}
It compiles and reboots correctly, in fact it even makes a file, however
this is what is within the file:
#3
401
400
28000
28000
23702
23702
23703
more numbers...
Item 400 is a long sword which is produced by the shop
Item 401 is a club which isn't produced (correct)
The rest is bla
And when I actually reboot the zone, it crashs right away. Something weird
in the save func must make all the gibberish, and the load function is bleh
too... Take a look at it and thanks for any help at all :)
_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST