diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/atcommand.c | 114 | ||||
-rw-r--r-- | src/map/pc.c | 15 | ||||
-rw-r--r-- | src/map/pc.h | 2 |
3 files changed, 127 insertions, 4 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c index cc29fa1bb..a3b55a6a7 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -5727,6 +5727,8 @@ ACMD(autolootitem) int i; int action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset + nullpo_retr(-1, sd); + if (message && *message) { if (message[0] == '+') { message++; @@ -5813,6 +5815,117 @@ ACMD(autolootitem) } return true; } + +/*========================================== + * @autoloottype + * Flags: + * 1: IT_HEALING, 2: IT_UNKNOWN, 4: IT_USABLE, 8: IT_ETC, + * 16: IT_WEAPON, 32: IT_ARMOR, 64: IT_CARD, 128: IT_PETEGG, + * 256: IT_PETARMOR, 512: IT_UNKNOWN2, 1024: IT_AMMO, 2048: IT_DELAYCONSUME + * 262144: IT_CASH + *------------------------------------------ + * Credits: + * chriser + * Aleos + *------------------------------------------*/ +ACMD(autoloottype){ + uint8 i = 0, action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset + enum item_types type = -1; + int ITEM_NONE = 0, ITEM_MAX = 1533; + + nullpo_retr(-1, sd); + + if (message && *message) { + if (message[0] == '+') { + message++; + action = 1; + } + else if (message[0] == '-') { + message++; + action = 2; + } + else if (!strcmp(message,"reset")) + action = 4; + } + + if (action < 3) { // add or remove + if ((strncmp(message, "healing", 3) == 0) || (atoi(message) == 0)) + type = IT_HEALING; + else if ((strncmp(message, "usable", 3) == 0) || (atoi(message) == 2)) + type = IT_USABLE; + else if ((strncmp(message, "etc", 3) == 0) || (atoi(message) == 3)) + type = IT_ETC; + else if ((strncmp(message, "weapon", 3) == 0) || (atoi(message) == 4)) + type = IT_WEAPON; + else if ((strncmp(message, "armor", 3) == 0) || (atoi(message) == 5)) + type = IT_ARMOR; + else if ((strncmp(message, "card", 3) == 0) || (atoi(message) == 6)) + type = IT_CARD; + else if ((strncmp(message, "petegg", 4) == 0) || (atoi(message) == 7)) + type = IT_PETEGG; + else if ((strncmp(message, "petarmor", 4) == 0) || (atoi(message) == 8)) + type = IT_PETARMOR; + else if ((strncmp(message, "ammo", 3) == 0) || (atoi(message) == 10)) + type = IT_AMMO; + else { + clif->message(fd, msg_txt(1489)); // Item type not found. + + return false; + } + } + + switch (action) { + case 1: + if (sd->state.autoloottype&(1<<type)) { + clif->message(fd, msg_txt(1490)); // You're already autolooting this item type. + return false; + } + if (sd->state.autoloottype == ITEM_MAX) { + clif->message(fd, msg_txt(1491)); // Your autoloottype list has all item types. You can remove some items with @autoloottype -<type name or ID>. + return false; + } + sd->state.autolootingtype = 1; // Autoloot Activated + sd->state.autoloottype |= (1<<type); // Stores the type + sprintf(atcmd_output, msg_txt(1492), itemdb->typename(type), type); // Autolooting item type: '%s' {%d} + clif->message(fd, atcmd_output); + break; + case 2: + if (!(sd->state.autoloottype&(1<<type))) { + clif->message(fd, msg_txt(1493)); // You're currently not autolooting this item type. + return false; + } + sd->state.autoloottype &= ~(1<<type); + sprintf(atcmd_output, msg_txt(1494), itemdb->typename(type), type); // Removed item type: '%s' {%d} from your autoloottype list. + clif->message(fd, atcmd_output); + if (sd->state.autoloottype == ITEM_NONE) + sd->state.autolootingtype = 0; + break; + case 3: + clif->message(fd, msg_txt(1495)); // To add an item type to the list, use "@aloottype +<type name or ID>". To remove an item type, use "@aloottype -<type name or ID>". + clif->message(fd, msg_txt(1496)); // Type List: healing = 0, usable = 2, etc = 3, weapon = 4, armor = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10 + clif->message(fd, msg_txt(1497)); // "@aloottype reset" will clear your autoloottype list. + if (sd->state.autoloottype == ITEM_NONE) + clif->message(fd, msg_txt(1498)); // Your autoloottype list is empty. + else { + clif->message(fd, msg_txt(1499)); // Item types on your autoloottype list: + while (i < IT_MAX) { + if (sd->state.autoloottype&(1<<i)) { + sprintf(atcmd_output, " '%s' {%d}", itemdb->typename(i), i); + clif->message(fd, atcmd_output); + } + i++; + } + } + break; + case 4: + sd->state.autoloottype = ITEM_NONE; + sd->state.autolootingtype = 0; + clif->message(fd, msg_txt(1500)); // Your autoloottype list has been reset. + break; + } + return 0; +} + /** * No longer available, keeping here just in case it's back someday. [Ind] **/ @@ -9598,6 +9711,7 @@ void atcommand_basecommands(void) { ACMD_DEF(changelook), ACMD_DEF(autoloot), ACMD_DEF2("alootid", autolootitem), + ACMD_DEF(autoloottype), ACMD_DEF(mobinfo), ACMD_DEF(exp), ACMD_DEF(version), diff --git a/src/map/pc.c b/src/map/pc.c index 157d9e28a..f3f554137 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -9346,11 +9346,18 @@ void pc_overheat(struct map_session_data *sd, int val) { */ bool pc_isautolooting(struct map_session_data *sd, int nameid) { - int i; - if( !sd->state.autolooting ) + uint8 i = 0; + bool j = false; + + if (!sd->state.autolooting && !sd->state.autolootingtype) return false; - ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == nameid); - return (i != AUTOLOOTITEM_SIZE); + + if (sd->state.autolooting) + ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == nameid); + if (sd->state.autolootingtype && sd->state.autoloottype&(1<<itemdb_type(nameid))) + j = true; + + return (i != AUTOLOOTITEM_SIZE || j ); } /** diff --git a/src/map/pc.h b/src/map/pc.h index f770818c2..bbea0e121 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -160,7 +160,9 @@ struct map_session_data { short pmap; // Previous map on Map Change unsigned short autoloot; unsigned short autolootid[AUTOLOOTITEM_SIZE]; // [Zephyrus] + unsigned short autoloottype; unsigned int autolooting : 1; //performance-saver, autolooting state for @alootid + unsigned int autolootingtype : 1; //performance-saver, autolooting state for @autoloottype unsigned short autobonus; //flag to indicate if an autobonus is activated. [Inkfish] unsigned int gmaster_flag : 1; unsigned int prevend : 1;//used to flag wheather you've spent 40sp to open the vending or not. |