From 3ced983fc5d26f69896ce62230c48d6e2faa04fd Mon Sep 17 00:00:00 2001 From: gumi Date: Mon, 1 Oct 2018 20:25:42 -0400 Subject: fix setting char/account variables of another player --- src/map/script.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'src/map/script.c') diff --git a/src/map/script.c b/src/map/script.c index b787d0138..094e32127 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3361,6 +3361,18 @@ static void set_reg_pc_ref_str(struct script_state *st, struct reg_db *n, int64 ers_free(pc->str_reg_ers, p); } } + + if (!pc->reg_load && p != NULL) { + struct DBIterator *iter = db_iterator(map->pc_db); + + for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) { + if (sd != NULL && n == &sd->regs) { + sd->vars_dirty = true; // tell char server to update our vars! + break; + } + } + dbi_destroy(iter); + } } static void set_reg_pc_ref_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) @@ -3398,13 +3410,25 @@ static void set_reg_pc_ref_num(struct script_state *st, struct reg_db *n, int64 if (!pc->reg_load) { p->flag.update = 1; } - p->flag.type = 1; + p->flag.type = 0; if(n->vars->put(n->vars, DB->i642key(num), DB->ptr2data(p), &prev)) { p = DB->data2ptr(&prev); ers_free(pc->num_reg_ers, p); } } + + if (!pc->reg_load && p != NULL) { + struct DBIterator *iter = db_iterator(map->pc_db); + + for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) { + if (sd != NULL && n == &sd->regs) { + sd->vars_dirty = true; // tell char server to update our vars! + break; + } + } + dbi_destroy(iter); + } } static void set_reg_npcscope_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) @@ -20698,7 +20722,7 @@ static BUILDIN(getvariableofpc) } if (!sd->regs.vars) - sd->regs.vars = i64db_alloc(DB_OPT_RELEASE_DATA); + sd->regs.vars = i64db_alloc(DB_OPT_BASE); script->push_val(st->stack, C_NAME, reference_getuid(data), &sd->regs); return true; -- cgit v1.2.3-60-g2f50 From 191a266c155085d467e7c73c5553159b5556fdfc Mon Sep 17 00:00:00 2001 From: gumi Date: Mon, 1 Oct 2018 20:50:27 -0400 Subject: use the regular pc->setregistry to set vars of another char this will prevent further errors, and will allow setting special variables such as `#CASHPOINTS` --- src/map/script.c | 115 ++++++------------------------------------------------- 1 file changed, 12 insertions(+), 103 deletions(-) (limited to 'src/map/script.c') diff --git a/src/map/script.c b/src/map/script.c index 094e32127..422085c42 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3316,119 +3316,28 @@ static void set_reg_npcscope_str(struct script_state *st, struct reg_db *n, int6 static void set_reg_pc_ref_str(struct script_state *st, struct reg_db *n, int64 num, const char *name, const char *str) { - struct script_reg_str *p = NULL; - unsigned int index = script_getvaridx(num); - - nullpo_retv(n); - - if ((p = i64db_get(n->vars, num)) != NULL) { - if (str[0]) { - if (p->value) { - aFree(p->value); - } else if (index) { - script->array_update(n, num, false); - } - p->value = aStrdup(str); - } else { - p->value = NULL; - if (index) { - script->array_update(n, num, true); - } - } - - if (!pc->reg_load) { - p->flag.update = 1; - } - } else if (str[0]) { - struct DBData prev; - if (index) { - script->array_update(n, num, false); - } - - p = ers_alloc(pc->str_reg_ers, struct script_reg_str); - p->value = aStrdup(str); - - if (!pc->reg_load) { - p->flag.update = 1; - } - p->flag.type = 1; + struct DBIterator *iter = db_iterator(map->pc_db); - if(n->vars->put(n->vars, DB->i642key(num), 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 != NULL) { - struct DBIterator *iter = db_iterator(map->pc_db); - - for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) { - if (sd != NULL && n == &sd->regs) { - sd->vars_dirty = true; // tell char server to update our vars! - break; - } + for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) { + if (sd != NULL && n == &sd->regs) { + pc->setregistry_str(sd, num, str); + break; } - dbi_destroy(iter); } + dbi_destroy(iter); } static void set_reg_pc_ref_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) { - struct script_reg_num *p = NULL; - unsigned int index = script_getvaridx(num); - - nullpo_retv(n); - - if ((p = i64db_get(n->vars, num)) != NULL) { - if (val) { - if (!p->value && index) { - script->array_update(n, num, false); - } - p->value = val; - } else { - p->value = 0; - if (index) { - script->array_update(n, num, true); - } - } - - if (!pc->reg_load) { - p->flag.update = 1; - } - } else if (val) { - struct DBData prev; - if (index) { - script->array_update(n, num, false); - } - - p = ers_alloc(pc->num_reg_ers, struct script_reg_num); - p->value = val; - - if (!pc->reg_load) { - p->flag.update = 1; - } - p->flag.type = 0; - - if(n->vars->put(n->vars, DB->i642key(num), DB->ptr2data(p), &prev)) { - p = DB->data2ptr(&prev); - ers_free(pc->num_reg_ers, p); - } - } + struct DBIterator *iter = db_iterator(map->pc_db); - if (!pc->reg_load && p != NULL) { - struct DBIterator *iter = db_iterator(map->pc_db); - - for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) { - if (sd != NULL && n == &sd->regs) { - sd->vars_dirty = true; // tell char server to update our vars! - break; - } + for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) { + if (sd != NULL && n == &sd->regs) { + pc->setregistry(sd, num, val); + break; } - dbi_destroy(iter); } + dbi_destroy(iter); } static void set_reg_npcscope_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) -- cgit v1.2.3-60-g2f50