void do_copyover(void) { LIST_ITERATOR *sock_i = newListIterator(socket_list); SOCKET_DATA *sock = NULL; FILE *fp; char buf[100]; char control_buf[20]; char port_buf[20]; if ((fp = fopen(COPYOVER_FILE, "w+")) == NULL) return; sprintf(buf, "\n\r <*> The world starts spinning <*>\n\r"); // For each playing descriptor, save its character and account ITERATE_LIST(sock, sock_i) { compressEnd(sock, sock->compressing, FALSE); // kick off anyone who hasn't yet logged in a character if (!socketGetChar(sock) || !socketGetAccount(sock) || !charGetRoom(socketGetChar(sock))) { text_to_socket(sock, "\r\nSorry, we are rebooting. Come back in a few minutes.\r\n"); close_socket(sock, FALSE); } // save account and player info to file else { fprintf(fp, "%d %s %s %s\n", sock->control, accountGetName(sock->account), charGetName(sock->player), sock->hostname); // save the player save_player(sock->player); save_account(sock->account); text_to_socket(sock, buf); } } deleteListIterator(sock_i);
// // try performing a mobile load, based on the reset data we have bool try_reset_load_mobile(RESET_DATA *reset, void *initiator, int initiator_type, const char *locale) { const char *fullkey = get_fullkey_relative(resetGetArg(reset), locale); PROTO_DATA *proto = worldGetType(gameworld, "mproto", fullkey); // if there's no prototype, break out if(proto == NULL || protoIsAbstract(proto)) return FALSE; // see if we're already at our max if(resetGetMax(reset) != 0 && count_chars(NULL, mobile_list, NULL, fullkey, FALSE) >= resetGetMax(reset)) return FALSE; if(initiator_type == INITIATOR_ROOM && resetGetRoomMax(reset) != 0 && (count_chars(NULL, roomGetCharacters(initiator), NULL, fullkey, FALSE) >= resetGetRoomMax(reset))) return FALSE; CHAR_DATA *mob = protoMobRun(proto); if(mob == NULL) return FALSE; // to the room if(initiator_type == INITIATOR_ROOM) char_to_room(mob, initiator); // to a seat else if(initiator_type == INITIATOR_ON_OBJ) { if(!objIsType(initiator, "furniture") || objGetRoom(initiator)==NULL) { extract_mobile(mob); return FALSE; } char_to_room(mob, objGetRoom(initiator)); char_to_furniture(mob, initiator); charSetPos(mob, POS_SITTING); } // after an object else if(initiator_type == INITIATOR_THEN_OBJ) { if(objGetRoom(initiator) == NULL) { extract_mobile(mob); return FALSE; } char_to_room(mob, objGetRoom(initiator)); } // after another mob else if(initiator_type == INITIATOR_THEN_MOB) char_to_room(mob, charGetRoom(initiator)); // we shouldn't get this far else { extract_mobile(mob); return FALSE; } // now, run all of our followup stuff resetRunOn(reset->on, mob, INITIATOR_ON_MOB, locale); resetRunOn(reset->in, mob, INITIATOR_IN_MOB, locale); resetRunOn(reset->then, mob, INITIATOR_THEN_MOB, locale); return TRUE; }
// // handles "find" and "purge" in one function bool try_reset_old_mobile(RESET_DATA *reset, void *initiator,int initiator_type, int reset_cmd, const char *locale) { const char *fullkey = get_fullkey_relative(resetGetArg(reset), locale); CHAR_DATA *mob = NULL; // is it the room? if(initiator_type == INITIATOR_ROOM) mob = find_char(NULL, roomGetCharacters(initiator),1, NULL, fullkey, FALSE); // is it furniture? else if(initiator_type == INITIATOR_ON_OBJ) mob = find_char(NULL, objGetUsers(initiator), 1, NULL, fullkey, FALSE); // after an object else if(initiator_type == INITIATOR_THEN_OBJ) { if(objGetRoom(initiator) == NULL) return FALSE; mob = find_char(NULL, roomGetCharacters(objGetRoom(initiator)), 1, NULL, fullkey, FALSE); } // after another mob else if(initiator_type == INITIATOR_THEN_MOB) mob = find_char(NULL, roomGetCharacters(charGetRoom(initiator)), 1, NULL, fullkey, FALSE); // if we didn't find it, return FALSE if(mob == NULL) return FALSE; // if we found it, do the reset of the commands resetRunOn(reset->on, mob, INITIATOR_ON_MOB, locale); resetRunOn(reset->in, mob, INITIATOR_IN_MOB, locale); resetRunOn(reset->then, mob, INITIATOR_THEN_MOB, locale); // if this is a purge and it wasn't our initiator, kill it // if we purge our initiator, we might run into some problems if(mob != initiator && reset_cmd == RESET_PURGE_MOBILE) extract_mobile(mob); return TRUE; }
// // try performing an object load, based on the reset data we have bool try_reset_load_object(RESET_DATA *reset, void *initiator, int initiator_type, const char *locale) { const char *fullkey = get_fullkey_relative(resetGetArg(reset), locale); PROTO_DATA *proto = worldGetType(gameworld, "oproto", fullkey); // if there's no prototype, break out if(proto == NULL || protoIsAbstract(proto)) return FALSE; // see if we're already at our max if(resetGetMax(reset) != 0 && count_objs(NULL, object_list, NULL, fullkey, FALSE) >= resetGetMax(reset)) return FALSE; if(initiator_type == INITIATOR_ROOM && resetGetRoomMax(reset) != 0 && (count_objs(NULL, roomGetContents(initiator), NULL, fullkey, FALSE) >= resetGetRoomMax(reset))) return FALSE; OBJ_DATA *obj = protoObjRun(proto); if(obj == NULL) return FALSE; // to the room if(initiator_type == INITIATOR_ROOM) obj_to_room(obj, initiator); // inside of the object else if(initiator_type == INITIATOR_IN_OBJ) obj_to_obj(obj, initiator); // to inventory else if(initiator_type == INITIATOR_IN_MOB) obj_to_char(obj, initiator); // equip the mobile else if(initiator_type == INITIATOR_ON_MOB) { // see if we can equip it bool equipped = (objIsType(obj, "worn") && try_equip(initiator, obj, NULL, wornGetPositions(obj))); // we failed! Extract the object if(!equipped) { extract_obj(obj); return FALSE; } } // we're being loaded after a mobile was loaded... let's go to the same room else if(initiator_type == INITIATOR_THEN_MOB) obj_to_room(obj, charGetRoom(initiator)); // we're being loaded after an object was loaded... let's go wherever it went else if(initiator_type == INITIATOR_THEN_OBJ) { if(objGetRoom(initiator)) obj_to_room(obj, objGetRoom(initiator)); else if(objGetContainer(initiator)) obj_to_obj(obj, objGetContainer(initiator)); else if(objGetCarrier(initiator)) obj_to_char(obj, objGetCarrier(initiator)); else if(objGetWearer(initiator)) { bool equipped = (objIsType(obj, "worn") && try_equip(objGetWearer(initiator), obj, NULL, wornGetPositions(obj))); // we failed! Extract the object if(!equipped) { extract_obj(obj); return FALSE; } } } // hmmm... we shouldn't get this far else { extract_obj(obj); return FALSE; } // now, run all of our stuff resetRunOn(reset->on, obj, INITIATOR_ON_OBJ, locale); resetRunOn(reset->in, obj, INITIATOR_IN_OBJ, locale); resetRunOn(reset->then, obj, INITIATOR_THEN_OBJ, locale); return TRUE; }
const char *get_smart_locale(CHAR_DATA *ch) { const char *locale = get_script_locale(); if(locale == NULL && charGetRoom(ch) != NULL) locale = get_key_locale(roomGetClass(charGetRoom(ch))); return locale; }