int pc_setregistry_str(struct map_session_data *sd, int64 reg, const char *val) { struct script_reg_str *p = NULL; const char *regname = script->get_str( script_getvarid(reg) ); unsigned int index = script_getvaridx(reg); if ( !pc->reg_load && !sd->vars_ok ) { ShowError("pc_setregistry_str : refusing to set %s until vars are received.\n", regname); return 0; } if( (p = i64db_get(sd->var_db, reg) ) ) { if( val[0] ) { if( p->value ) aFree(p->value); else if ( index ) /* a entry that was deleted, so we reset */ script->array_update(&sd->array_db,reg,false); p->value = aStrdup(val); } else { p->value = NULL; if( index ) script->array_update(&sd->array_db,reg,true); } if( !pc->reg_load ) p->flag.update = 1;/* either way, it will require either delete or replace */ } else if( val[0] ) { DBData prev; if( index ) script->array_update(&sd->array_db,reg,false); p = ers_alloc(pc->str_reg_ers, struct script_reg_str); p->value = aStrdup(val); if( !pc->reg_load ) p->flag.update = 1; p->flag.type = 1; if( sd->var_db->put(sd->var_db,DB->i642key(reg),DB->ptr2data(p),&prev) ) { p = DB->data2ptr(&prev); if( p->value ) aFree(p->value); ers_free(pc->str_reg_ers, p); } } if( !pc->reg_load && p ) sd->vars_dirty = true; return 1; }