Skip to content

Commit

Permalink
add script->array_get_num_member function
Browse files Browse the repository at this point in the history
this function makes it simpler to get a value from a number script
array, saving users from needing to handle the stack directly
  • Loading branch information
guilherme-gm committed Oct 15, 2023
1 parent 0ade2bb commit 8178f1a
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/map/script.c
Original file line number Diff line number Diff line change
Expand Up @@ -3641,6 +3641,24 @@ static void script_array_update(struct reg_db *src, int64 num, bool empty)
}
}

/**
* Given the array array_data, fetches the number value at index.
*
* @param st executing script state
* @param array_data script_data containing the array paramter to have an index fetched from
* @param index index to be fetched
* @returns the value in this index. if the index is not set, 0 is returned (like in the script engine)
*/
static int32 script_array_get_num_member(struct script_state *st, struct script_data *array_data, int index)
{
uint32 id = reference_getid(array_data);

int32 value = (int32) h64BPTRSIZE(script->get_val2(st, reference_uid(id, index), reference_getref(array_data)));
script_removetop(st, -1, 0);

return value;
}

static void set_reg_npcscope_str(struct script_state *st, struct reg_db *n, int64 num, const char *name, const char *str)
{
if (n)
Expand Down Expand Up @@ -30368,6 +30386,7 @@ void script_defaults(void)
script->array_src = script_array_src;
script->array_update = script_array_update;
script->array_add_member = script_array_add_member;
script->array_get_num_member = script_array_get_num_member;
script->array_remove_member = script_array_remove_member;
script->array_delete = script_array_delete;
script->array_size = script_array_size;
Expand Down
1 change: 1 addition & 0 deletions src/map/script.h
Original file line number Diff line number Diff line change
Expand Up @@ -1097,6 +1097,7 @@ struct script_interface {
void (*array_delete) (struct reg_db *src, struct script_array *sa);
void (*array_remove_member) (struct reg_db *src, struct script_array *sa, unsigned int idx);
void (*array_add_member) (struct script_array *sa, unsigned int idx);
int32 (*array_get_num_member) (struct script_state *st, struct script_data *array_data, int index);
unsigned int (*array_size) (struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref);
unsigned int (*array_highest_key) (struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref);
int (*array_free_db) (union DBKey key, struct DBData *data, va_list ap);
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/HPMHooking/HPMHooking.Defs.inc
Original file line number Diff line number Diff line change
Expand Up @@ -8166,6 +8166,8 @@ typedef void (*HPMHOOK_pre_script_array_remove_member) (struct reg_db **src, str
typedef void (*HPMHOOK_post_script_array_remove_member) (struct reg_db *src, struct script_array *sa, unsigned int idx);
typedef void (*HPMHOOK_pre_script_array_add_member) (struct script_array **sa, unsigned int *idx);
typedef void (*HPMHOOK_post_script_array_add_member) (struct script_array *sa, unsigned int idx);
typedef int32 (*HPMHOOK_pre_script_array_get_num_member) (struct script_state **st, struct script_data **array_data, int *index);
typedef int32 (*HPMHOOK_post_script_array_get_num_member) (int32 retVal___, struct script_state *st, struct script_data *array_data, int index);
typedef unsigned int (*HPMHOOK_pre_script_array_size) (struct script_state **st, struct map_session_data **sd, const char **name, struct reg_db **ref);
typedef unsigned int (*HPMHOOK_post_script_array_size) (unsigned int retVal___, struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref);
typedef unsigned int (*HPMHOOK_pre_script_array_highest_key) (struct script_state **st, struct map_session_data **sd, const char **name, struct reg_db **ref);
Expand Down
4 changes: 4 additions & 0 deletions src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
Original file line number Diff line number Diff line change
Expand Up @@ -6094,6 +6094,8 @@ struct {
struct HPMHookPoint *HP_script_array_remove_member_post;
struct HPMHookPoint *HP_script_array_add_member_pre;
struct HPMHookPoint *HP_script_array_add_member_post;
struct HPMHookPoint *HP_script_array_get_num_member_pre;
struct HPMHookPoint *HP_script_array_get_num_member_post;
struct HPMHookPoint *HP_script_array_size_pre;
struct HPMHookPoint *HP_script_array_size_post;
struct HPMHookPoint *HP_script_array_highest_key_pre;
Expand Down Expand Up @@ -13629,6 +13631,8 @@ struct {
int HP_script_array_remove_member_post;
int HP_script_array_add_member_pre;
int HP_script_array_add_member_post;
int HP_script_array_get_num_member_pre;
int HP_script_array_get_num_member_post;
int HP_script_array_size_pre;
int HP_script_array_size_post;
int HP_script_array_highest_key_pre;
Expand Down
1 change: 1 addition & 0 deletions src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
Original file line number Diff line number Diff line change
Expand Up @@ -3120,6 +3120,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->array_delete, HP_script_array_delete) },
{ HP_POP(script->array_remove_member, HP_script_array_remove_member) },
{ HP_POP(script->array_add_member, HP_script_array_add_member) },
{ HP_POP(script->array_get_num_member, HP_script_array_get_num_member) },
{ HP_POP(script->array_size, HP_script_array_size) },
{ HP_POP(script->array_highest_key, HP_script_array_highest_key) },
{ HP_POP(script->array_free_db, HP_script_array_free_db) },
Expand Down
27 changes: 27 additions & 0 deletions src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
Original file line number Diff line number Diff line change
Expand Up @@ -81263,6 +81263,33 @@ void HP_script_array_add_member(struct script_array *sa, unsigned int idx) {
}
return;
}
int32 HP_script_array_get_num_member(struct script_state *st, struct script_data *array_data, int index) {
int hIndex = 0;
int32 retVal___ = 0;
if (HPMHooks.count.HP_script_array_get_num_member_pre > 0) {
int32 (*preHookFunc) (struct script_state **st, struct script_data **array_data, int *index);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_script_array_get_num_member_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_script_array_get_num_member_pre[hIndex].func;
retVal___ = preHookFunc(&st, &array_data, &index);
}
if (*HPMforce_return) {
*HPMforce_return = false;
return retVal___;
}
}
{
retVal___ = HPMHooks.source.script.array_get_num_member(st, array_data, index);
}
if (HPMHooks.count.HP_script_array_get_num_member_post > 0) {
int32 (*postHookFunc) (int32 retVal___, struct script_state *st, struct script_data *array_data, int index);
for (hIndex = 0; hIndex < HPMHooks.count.HP_script_array_get_num_member_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_script_array_get_num_member_post[hIndex].func;
retVal___ = postHookFunc(retVal___, st, array_data, index);
}
}
return retVal___;
}
unsigned int HP_script_array_size(struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref) {
int hIndex = 0;
unsigned int retVal___ = 0;
Expand Down

0 comments on commit 8178f1a

Please sign in to comment.