int instance_create(int owner_id, const char *name, enum instance_owner_type type) { struct map_session_data *sd = NULL; unsigned short *icptr = NULL; struct party_data *p = NULL; struct guild *g = NULL; short *iptr = NULL; int i, j; switch ( type ) { case IOT_NONE: break; case IOT_CHAR: if( ( sd = iMap->id2sd(owner_id) ) == NULL ) { ShowError("instance_create: character %d not found for instance '%s'.\n", owner_id, name); return -2; } iptr = sd->instance; icptr = &sd->instances; break; case IOT_PARTY: if( ( p = party->search(owner_id) ) == NULL ) { ShowError("instance_create: party %d not found for instance '%s'.\n", owner_id, name); return -2; } iptr = p->instance; icptr = &p->instances; break; case IOT_GUILD: if( ( g = guild->search(owner_id) ) == NULL ) { ShowError("instance_create: guild %d not found for instance '%s'.\n", owner_id, name); return -2; } iptr = g->instance; icptr = &g->instances; break; default: ShowError("instance_create: unknown type %d for owner_id %d and name %s.\n", type,owner_id,name); return -1; } if( type != IOT_NONE && *icptr ) { ARR_FIND(0, *icptr, i, strcmp(instances[iptr[i]].name,name) == 0 ); if( i != *icptr ) return -4;/* already got this instance */ } ARR_FIND(0, instance->instances, i, instances[i].state == INSTANCE_FREE); if( i == instance->instances ) RECREATE(instances, struct instance_data, ++instance->instances); instances[i].state = INSTANCE_IDLE; instances[i].id = i; instances[i].idle_timer = INVALID_TIMER; instances[i].idle_timeout = instances[i].idle_timeoutval = 0; instances[i].progress_timer = INVALID_TIMER; instances[i].progress_timeout = 0; instances[i].users = 0; instances[i].map = NULL; instances[i].num_map = 0; instances[i].owner_id = owner_id; instances[i].owner_type = type; instances[i].vars = idb_alloc(DB_OPT_RELEASE_DATA); safestrncpy( instances[i].name, name, sizeof(instances[i].name) ); if( type != IOT_NONE ) { ARR_FIND(0, *icptr, j, iptr[j] == -1); if( j == *icptr ) { switch( type ) { case IOT_CHAR: RECREATE(sd->instance, short, ++*icptr); sd->instance[sd->instances-1] = i; break; case IOT_PARTY: RECREATE(p->instance, short, ++*icptr); p->instance[p->instances-1] = i; break; case IOT_GUILD: RECREATE(g->instance, short, ++*icptr); g->instance[g->instances-1] = i; break; } } else iptr[j] = i; } clif->instance(i, 1, 0); // Start instancing window return i; }