Skip to content
Permalink
Browse files

Merge pull request #2487 from guilherme-gm/201906-1-identify

Add identify/identifyidx script commands and identifyall atcommand
  • Loading branch information...
MishimaHaruna committed Jun 30, 2019
2 parents 33b0658 + b20054a commit 3fe9300612136c75678f55fd699f2f0b75899e11
Showing with 116 additions and 8 deletions.
  1. +6 −0 doc/atcommands.txt
  2. +18 −0 doc/script_commands.txt
  3. +20 −8 src/map/atcommand.c
  4. +72 −0 src/map/script.c
@@ -584,6 +584,12 @@ Opens the Identification window if any unappraised items are in your inventory.

---------------------------------------

@identifyall

Identifies all unappraised items in your inventory.

---------------------------------------

@trade <player name>

Opens the trade window with the specified player.
@@ -3368,6 +3368,24 @@ cards or if it's signed.
This will set a Hat Effect onto the player. The state field allows you to
enable (true) or disable (false) the effect on the player.

---------------------------------------

*identify(<Item ID>)

This function identifies the first <Item ID> item in attached player's inventory.

Returns -2 if an error happens, -1 if no unidentified <Item ID> was found.
Otherwise, returns the idx of the identified item.

---------------------------------------

*identifyidx(<Inventory Index>)

This will identify item at attached player's <Inventory Index> inventory index.

Returns true if the item was identified, false otherwise.
Note: If the item was already identified, it returns false.

---------------------------------------
//=====================================
2.1 - End of Item-Related Commands
@@ -6769,23 +6769,34 @@ ACMD(refreshall)
}

/*==========================================
* @identify
* @identify / @identifyall
* => GM's magnifier.
*------------------------------------------*/
ACMD(identify)
{
int num = 0;
bool identifyall = (strcmpi(info->command, "identifyall") == 0);

for (int i = 0; i < sd->status.inventorySize; i++) {
if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){
num++;
if (!identifyall) {
for (int i = 0; i < sd->status.inventorySize; i++) {
if (sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify != 1) {
num++;
}
}
}
if (num > 0) {
clif->item_identify_list(sd);
} else {
clif->message(fd,msg_fd(fd,1238)); // There are no items to appraise.
for (int i = 0; i < sd->status.inventorySize; i++) {
if (sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify != 1) {
skill->identify(sd, i);
num++;
}
}
}

if (num == 0)
clif->message(fd,msg_fd(fd,1238)); // There are no items to appraise.
else if (!identifyall)
clif->item_identify_list(sd);

return true;
}

@@ -10061,6 +10072,7 @@ static void atcommand_basecommands(void)
ACMD_DEF(refresh),
ACMD_DEF(refreshall),
ACMD_DEF(identify),
ACMD_DEF2("identifyall", identify),
ACMD_DEF(misceffect),
ACMD_DEF(mobsearch),
ACMD_DEF(cleanmap),
@@ -25515,6 +25515,75 @@ static BUILDIN(openrefineryui)
return true;
}

/**
* identify(<item id>)
* Identifies the first unidentified <item id> item on player's inventory.
* Returns -2 on error, -1 if no item to identify was found, identified idx otherwise.
*/
static BUILDIN(identify)
{
struct map_session_data *sd = script_rid2sd(st);

if (sd == NULL) {
script_pushint(st, -2);
return true;
}

int itemid = script_getnum(st, 2);
if (itemdb->exists(itemid) == NULL) {
ShowError("buildin_identify: Invalid item ID (%d)\n", itemid);
script_pushint(st, -2);
return true;
}

int idx = -1;
ARR_FIND(0, sd->status.inventorySize, idx, (sd->status.inventory[idx].nameid == itemid && sd->status.inventory[idx].identify == 0));

if (idx < 0 || idx >= sd->status.inventorySize) {
script_pushint(st, -1);
return true;
}

sd->status.inventory[idx].identify = 1;
clif->item_identified(sd, idx, 0);
script_pushint(st, idx);

return true;
}

/**
* identifyidx(idx)
* Identifies item at idx.
* Returns true if item is identified, false otherwise.
*/
static BUILDIN(identifyidx)
{
struct map_session_data *sd = script_rid2sd(st);

if (sd == NULL) {
script_pushint(st, false);
return true;
}

int idx = script_getnum(st, 2);
if (idx < 0 || idx >= sd->status.inventorySize) {
ShowError("buildin_identifyidx: Invalid inventory index (%d), expected a value between 0 and %d\n", idx, sd->status.inventorySize);
script_pushint(st, false);
return true;
}

if (sd->status.inventory[idx].nameid <= 0 || sd->status.inventory[idx].identify != 0) {
script_pushint(st, false);
return true;
}

sd->status.inventory[idx].identify = 1;
clif->item_identified(sd, idx, 0);
script_pushint(st, true);

return true;
}

/**
* Adds a built-in script function.
*
@@ -26275,6 +26344,9 @@ static void script_parse_builtin(void)
BUILDIN_DEF(openrefineryui, ""),
BUILDIN_DEF(setfavoriteitemidx, "ii"),
BUILDIN_DEF(autofavoriteitem, "ii"),

BUILDIN_DEF(identify, "i"),
BUILDIN_DEF(identifyidx, "i"),
};
int i, len = ARRAYLENGTH(BUILDIN);
RECREATE(script->buildin, char *, script->buildin_count + len); // Pre-alloc to speed up

0 comments on commit 3fe9300

Please sign in to comment.
You can’t perform that action at this time.