Implemented basic script commands to apply options to equipped item.

This commit is contained in:
Jittapan Pluemsumran 2016-08-15 17:04:06 +07:00
parent da21013254
commit 8deabb157a
No known key found for this signature in database
GPG Key ID: CE430096446F41D9
5 changed files with 161 additions and 10 deletions

View File

@ -9172,5 +9172,45 @@ Requires client 2015-05-13aRagEXE or newer.
--------------------------------------- ---------------------------------------
*getrandomoptinfo(<type>);
Returns value of an attribute of current random option.
Valid attributes are:
ROA_ID - ID of current option
ROA_VALUE - Value field of current option
ROA_PARAM - Param field of current option
This script command is intended for using in random option scripts.
---------------------------------------
*getequiprandomoption(<equipment indice>,<index>,<type>{,<char id>});
Returns value of an attribute of a random option on an equipped item.
For valid equipment indices, see `getequipid` command reference.
index parameter can be 0 to MAX_ITEM_RDM_OPT-1 (default 0-4).
For valid attribute types, see `getrandomoptinfo` command reference.
---------------------------------------
*setrandomoption(<equipment indice>,<index>,<id>,<value>,<param>{,<char id>});
Sets <index+1>th random option for equipment equipped at <equipment indice>
to <id>, <value> and <param>.
For valid equipment indices, see `getequipid` command reference.
index parameter can be 0 to MAX_ITEM_RDM_OPT-1 (default 0-4).
ID - ID of random option. See db/const.txt for constants.
Value - Value of random option
Param - Parameter of random option
---------------------------------------
Whew. Whew.
That's about all of them. That's about all of them.

View File

@ -21536,16 +21536,25 @@ BUILDIN_FUNC(hateffect){
**/ **/
BUILDIN_FUNC(getrandomoptinfo) { BUILDIN_FUNC(getrandomoptinfo) {
struct map_session_data *sd; struct map_session_data *sd;
int param = script_getnum(st, 1); int val;
int param = script_getnum(st, 2);
if ((sd = script_rid2sd(st)) != NULL && current_equip_item_index && current_equip_item_index > -1 && sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].id) { if ((sd = script_rid2sd(st)) != NULL && current_equip_item_index && current_equip_item_index > -1 && sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].id) {
if (param == ROA_VALUE) switch (param) {
script_pushint(st, sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].value); case ROA_ID:
else if (param == ROA_PARAM) val = sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].id;
script_pushint(st, sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].param); break;
else { case ROA_VALUE:
ShowWarning("buildin_getrandomoptinfo: Unknown parameter %d.", param); val = sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].value;
return SCRIPT_CMD_FAILURE; break;
case ROA_PARAM:
val = sd->status.inventory[current_equip_item_index].option[current_equip_opt_index].param;
break;
default:
ShowWarning("buildin_getrandomoptinfo: Invalid attribute type %d (Max %d).\n", param, MAX_ITEM_RDM_OPT);
val = 0;
break;
} }
script_pushint(st, val);
} }
else { else {
script_pushint(st, 0); script_pushint(st, 0);
@ -21553,6 +21562,104 @@ BUILDIN_FUNC(getrandomoptinfo) {
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
/**
* Retrieves a random option on an equipped item.
* getequiprandomoption(<equipment indice>,<index>,<type>{,<char id>});
* @author [secretdataz]
*/
BUILDIN_FUNC(getequiprandomoption) {
struct map_session_data *sd;
int val;
short i = -1;
int pos = script_getnum(st, 2);
int index = script_getnum(st, 3);
int type = script_getnum(st, 4);
if (!script_charid2sd(5, sd))
script_pushint(st, -1);
return SCRIPT_CMD_FAILURE;
if (index < 0 || index >= MAX_ITEM_RDM_OPT) {
ShowError("buildin_getequiprandomoption: Invalid random option index %d.\n", index);
script_pushint(st, -1);
return SCRIPT_CMD_FAILURE;
}
if (equip_index_check(pos))
i = pc_checkequip(sd, equip_bitmask[pos]);
if (i < 0) {
ShowError("buildin_getequiprandomoption: No item equipped at pos %d (CID=%d/AID=%d).\n", pos, sd->status.char_id, sd->status.account_id);
script_pushint(st, -1);
return SCRIPT_CMD_FAILURE;
}
switch (type) {
case ROA_ID:
val = sd->status.inventory[i].option[index].id;
break;
case ROA_VALUE:
val = sd->status.inventory[i].option->value;
break;
case ROA_PARAM:
val = sd->status.inventory[i].option->param;
break;
default:
ShowWarning("buildin_getequiprandomoption: Invalid attribute type %d (Max %d).\n", type, MAX_ITEM_RDM_OPT);
val = 0;
break;
}
script_pushint(st, val);
return SCRIPT_CMD_SUCCESS;
}
/**
* Adds a random option on a random option slot on an equipped item and overwrites
* existing random option in the process.
* setrandomoption(<equipment indice>,<index>,<id>,<value>,<param>{,<char id>});
* @author [secretdataz]
*/
BUILDIN_FUNC(setrandomoption) {
struct map_session_data *sd;
struct s_random_opt_data *opt;
int pos, index, id, value, param, ep;
int i = -1;
if (!script_charid2sd(7, sd))
return SCRIPT_CMD_FAILURE;
pos = script_getnum(st, 2);
index = script_getnum(st, 3);
id = script_getnum(st, 4);
value = script_getnum(st, 5);
param = script_getnum(st, 6);
if ((opt = itemdb_randomopt_exists((short)id)) == NULL) {
ShowError("buildin_setrandomoption: Random option ID %d does not exists.\n", id);
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
if (index < 0 || index >= MAX_ITEM_RDM_OPT) {
ShowError("buildin_setrandomoption: Invalid random option index %d.\n", index);
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
if (equip_index_check(pos))
i = pc_checkequip(sd, equip_bitmask[pos]);
if (i >= 0) {
ep = sd->status.inventory[i].equip;
log_pick_pc(sd, LOG_TYPE_SCRIPT, -1, &sd->status.inventory[i]);
pc_unequipitem(sd, i, 2);
sd->status.inventory[i].option[index].id = id;
sd->status.inventory[i].option[index].value = value;
sd->status.inventory[i].option[index].param = param;
clif_delitem(sd, i, 1, 3);
log_pick_pc(sd, LOG_TYPE_SCRIPT, -1, &sd->status.inventory[i]);
clif_additem(sd, i, 1, 0);
pc_equipitem(sd, i, ep);
script_pushint(st, 1);
return SCRIPT_CMD_SUCCESS;
}
ShowError("buildin_setrandomoption: No item equipped at pos %d (CID=%d/AID=%d).\n", pos, sd->status.char_id, sd->status.account_id);
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
#include "../custom/script.inc" #include "../custom/script.inc"
// declarations that were supposed to be exported from npc_chat.c // declarations that were supposed to be exported from npc_chat.c
@ -22133,6 +22240,8 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(recalculatestat,""), BUILDIN_DEF(recalculatestat,""),
BUILDIN_DEF(hateffect,"ii"), BUILDIN_DEF(hateffect,"ii"),
BUILDIN_DEF(getrandomoptinfo, "i"), BUILDIN_DEF(getrandomoptinfo, "i"),
BUILDIN_DEF(getequiprandomoption, "iii?"),
BUILDIN_DEF(setrandomoption,"iiiii?"),
#include "../custom/script_def.inc" #include "../custom/script_def.inc"

View File

@ -637,7 +637,8 @@ enum navigation_service {
}; };
enum random_option_attribute { enum random_option_attribute {
ROA_VALUE = 0, ROA_ID = 0,
ROA_VALUE,
ROA_PARAM, ROA_PARAM,
}; };
/** /**

View File

@ -3110,6 +3110,7 @@
export_constant(MOBG_ClassChange); export_constant(MOBG_ClassChange);
/* random option attributes */ /* random option attributes */
export_constant(ROA_ID);
export_constant(ROA_VALUE); export_constant(ROA_VALUE);
export_constant(ROA_PARAM); export_constant(ROA_PARAM);