From e322c69d27d3db8c7141d27fa8baf0745de2eae4 Mon Sep 17 00:00:00 2001 From: Dastgir Pojee Date: Fri, 18 Oct 2013 10:57:06 +0530 Subject: Since our neighbours added it, we too wanted this feature. Topic:http://hercules.ws/board/topic/2540-add-rathena-new-aloot-type/ --- src/map/atcommand.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/map/pc.c | 15 +++++-- src/map/pc.h | 2 + 3 files changed, 127 insertions(+), 4 deletions(-) (limited to 'src') 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<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 -. + return false; + } + sd->state.autolootingtype = 1; // Autoloot Activated + sd->state.autoloottype |= (1<typename(type), type); // Autolooting item type: '%s' {%d} + clif->message(fd, atcmd_output); + break; + case 2: + if (!(sd->state.autoloottype&(1<message(fd, msg_txt(1493)); // You're currently not autolooting this item type. + return false; + } + sd->state.autoloottype &= ~(1<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 +". To remove an item type, use "@aloottype -". + 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<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< Date: Thu, 31 Oct 2013 00:08:56 +0530 Subject: Several Changes to autoloottype command. --- src/map/atcommand.c | 81 ++++++++++++++++++++++++----------------------------- src/map/pc.c | 14 ++++----- src/map/pc.h | 1 - 3 files changed, 43 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/map/atcommand.c b/src/map/atcommand.c index a3b55a6a7..605572aad 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -5727,8 +5727,6 @@ 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++; @@ -5740,16 +5738,16 @@ ACMD(autolootitem) } else if (!strcmp(message,"reset")) action = 4; - } - - if (action < 3) // add or remove - { - if ((item_data = itemdb->exists(atoi(message))) == NULL) - item_data = itemdb->search_name(message); - if (!item_data) { - // No items founds in the DB with Id or Name - clif->message(fd, msg_txt(1189)); // Item not found. - return false; + + if (action < 3) // add or remove + { + if ((item_data = itemdb->exists(atoi(message))) == NULL) + item_data = itemdb->search_name(message); + if (!item_data) { + // No items founds in the DB with Id or Name + clif->message(fd, msg_txt(1189)); // Item not found. + return false; + } } } @@ -5829,11 +5827,10 @@ ACMD(autolootitem) * Aleos *------------------------------------------*/ ACMD(autoloottype){ - uint8 i = 0, action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset + int i; + uint8 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] == '+') { @@ -5846,31 +5843,30 @@ ACMD(autoloottype){ } 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; + if (action < 3) { // add or remove + if ((atoi(message) == 0) ||(strncmp(message, "healing", 3) == 0)) + type = IT_HEALING; + else if ((atoi(message) == 2) || (strncmp(message, "usable", 3) == 0)) + type = IT_USABLE; + else if ((atoi(message) == 3) || (strncmp(message, "etc", 3) == 0)) + type = IT_ETC; + else if ((atoi(message) == 4) || (strncmp(message, "weapon", 3) == 0)) + type = IT_WEAPON; + else if ((atoi(message) == 5) || (strncmp(message, "armor", 3) == 0)) + type = IT_ARMOR; + else if ((atoi(message) == 6) || (strncmp(message, "card", 3) == 0)) + type = IT_CARD; + else if ((atoi(message) == 7) || (strncmp(message, "petegg", 4) == 0)) + type = IT_PETEGG; + else if ((atoi(message) == 8) || (strncmp(message, "petarmor", 4) == 0)) + type = IT_PETARMOR; + else if ((atoi(message) == 10) || (strncmp(message, "ammo", 3) == 0)) + type = IT_AMMO; + else { + clif->message(fd, msg_txt(1489)); // Item type not found. + return false; + } } } @@ -5884,7 +5880,6 @@ ACMD(autoloottype){ clif->message(fd, msg_txt(1491)); // Your autoloottype list has all item types. You can remove some items with @autoloottype -. return false; } - sd->state.autolootingtype = 1; // Autoloot Activated sd->state.autoloottype |= (1<typename(type), type); // Autolooting item type: '%s' {%d} clif->message(fd, atcmd_output); @@ -5897,8 +5892,6 @@ ACMD(autoloottype){ sd->state.autoloottype &= ~(1<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 +". To remove an item type, use "@aloottype -". @@ -5908,18 +5901,16 @@ ACMD(autoloottype){ 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) { + for(i=0; i < IT_MAX; i++){ if (sd->state.autoloottype&(1<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; } diff --git a/src/map/pc.c b/src/map/pc.c index f3f554137..7966e49ab 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -9346,18 +9346,18 @@ void pc_overheat(struct map_session_data *sd, int val) { */ bool pc_isautolooting(struct map_session_data *sd, int nameid) { - uint8 i = 0; + int i = 0; bool j = false; - if (!sd->state.autolooting && !sd->state.autolootingtype) + if (sd->state.autoloottype && sd->state.autoloottype&(1<state.autolooting) return false; - if (sd->state.autolooting) - ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == nameid); - if (sd->state.autolootingtype && sd->state.autoloottype&(1<state.autolootid[i] == nameid); - return (i != AUTOLOOTITEM_SIZE || j ); + return (i != AUTOLOOTITEM_SIZE); } /** diff --git a/src/map/pc.h b/src/map/pc.h index bbea0e121..bb7bff375 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -162,7 +162,6 @@ struct map_session_data { 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. -- cgit v1.2.3-70-g09d2 From fa54cf57ded42d7b0b45a5025a8858a9b52a0074 Mon Sep 17 00:00:00 2001 From: Dastgir Pojee Date: Fri, 1 Nov 2013 10:27:12 +0530 Subject: Removed type_id and some unused variables from @autoloottype --- conf/messages.conf | 11 +++++------ src/map/atcommand.c | 45 +++++++++++++++++---------------------------- src/map/pc.c | 1 - 3 files changed, 22 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/conf/messages.conf b/conf/messages.conf index ae96152f0..22ed991e2 100644 --- a/conf/messages.conf +++ b/conf/messages.conf @@ -1533,14 +1533,13 @@ 1488: Transforming into monster is not allowed in Guild Wars. // @autoloottype -1489: Item type not found. 1490: You're already autolooting this item type. -1491: Your autoloottype list has all item types. You can remove some items with @autoloottype -. -1492: Autolooting item type: '%s' {%d} +1491: Item type not found. +1492: Autolooting item type: '%s' 1493: You're currently not autolooting this item type. -1494: Removed item type: '%s' {%d} from your autoloottype list. -1495: To add an item type to the list, use "@aloottype +". To remove an item type, use "@aloottype -". -1496: Type List: healing = 0, usable = 2, etc = 3, weapon = 4, armor = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10 +1494: Removed item type: '%s' from your autoloottype list. +1495: To add an item type to the list, use "@aloottype +". To remove an item type, use "@aloottype -". +1496: Type List: healing, usable, etc, weapon, armor, card, petegg, petarmor, ammo 1497: "@aloottype reset" will clear your autoloottype list. 1498: Your autoloottype list is empty. 1499: Item types on your autoloottype list: diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 605572aad..980f61ad9 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -5816,21 +5816,14 @@ ACMD(autolootitem) /*========================================== * @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 + * chriser,Aleos *------------------------------------------*/ ACMD(autoloottype){ int i; uint8 action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset enum item_types type = -1; - int ITEM_NONE = 0, ITEM_MAX = 1533; + int ITEM_NONE = 0; if (message && *message) { if (message[0] == '+') { @@ -5845,26 +5838,26 @@ ACMD(autoloottype){ action = 4; if (action < 3) { // add or remove - if ((atoi(message) == 0) ||(strncmp(message, "healing", 3) == 0)) + if (strncmp(message, "healing", 3) == 0) type = IT_HEALING; - else if ((atoi(message) == 2) || (strncmp(message, "usable", 3) == 0)) + else if (strncmp(message, "usable", 3) == 0) type = IT_USABLE; - else if ((atoi(message) == 3) || (strncmp(message, "etc", 3) == 0)) + else if (strncmp(message, "etc", 3) == 0) type = IT_ETC; - else if ((atoi(message) == 4) || (strncmp(message, "weapon", 3) == 0)) + else if (strncmp(message, "weapon", 3) == 0) type = IT_WEAPON; - else if ((atoi(message) == 5) || (strncmp(message, "armor", 3) == 0)) + else if (strncmp(message, "armor", 3) == 0) type = IT_ARMOR; - else if ((atoi(message) == 6) || (strncmp(message, "card", 3) == 0)) + else if (strncmp(message, "card", 3) == 0) type = IT_CARD; - else if ((atoi(message) == 7) || (strncmp(message, "petegg", 4) == 0)) + else if (strncmp(message, "petegg", 4) == 0) type = IT_PETEGG; - else if ((atoi(message) == 8) || (strncmp(message, "petarmor", 4) == 0)) + else if (strncmp(message, "petarmor", 4) == 0) type = IT_PETARMOR; - else if ((atoi(message) == 10) || (strncmp(message, "ammo", 3) == 0)) + else if (strncmp(message, "ammo", 3) == 0) type = IT_AMMO; else { - clif->message(fd, msg_txt(1489)); // Item type not found. + clif->message(fd, msg_txt(1491)); // Item type not found. return false; } } @@ -5876,12 +5869,8 @@ ACMD(autoloottype){ 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 -. - return false; - } sd->state.autoloottype |= (1<typename(type), type); // Autolooting item type: '%s' {%d} + sprintf(atcmd_output, msg_txt(1492), itemdb->typename(type)); // Autolooting item type: '%s' clif->message(fd, atcmd_output); break; case 2: @@ -5890,12 +5879,12 @@ ACMD(autoloottype){ return false; } sd->state.autoloottype &= ~(1<typename(type), type); // Removed item type: '%s' {%d} from your autoloottype list. + sprintf(atcmd_output, msg_txt(1494), itemdb->typename(type)); // Removed item type: '%s' from your autoloottype list. clif->message(fd, atcmd_output); break; case 3: - clif->message(fd, msg_txt(1495)); // To add an item type to the list, use "@aloottype +". To remove an item type, use "@aloottype -". - 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(1495)); // To add an item type to the list, use "@aloottype +". To remove an item type, use "@aloottype -". + clif->message(fd, msg_txt(1496)); // Type List: healing, usable, etc, weapon, armor, card, petegg, petarmor, ammo 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. @@ -5903,7 +5892,7 @@ ACMD(autoloottype){ clif->message(fd, msg_txt(1499)); // Item types on your autoloottype list: for(i=0; i < IT_MAX; i++){ if (sd->state.autoloottype&(1<typename(i), i); + sprintf(atcmd_output, " '%s'", itemdb->typename(i)); clif->message(fd, atcmd_output); } } diff --git a/src/map/pc.c b/src/map/pc.c index 7966e49ab..90a3db853 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -9347,7 +9347,6 @@ void pc_overheat(struct map_session_data *sd, int val) { bool pc_isautolooting(struct map_session_data *sd, int nameid) { int i = 0; - bool j = false; if (sd->state.autoloottype && sd->state.autoloottype&(1< Date: Sun, 3 Nov 2013 20:19:26 +0100 Subject: Allow warp duplicates without a 'facing' value - Warps don't require a facing, so their duplicates shouldn't either. - Credits to jaBote. Signed-off-by: Haru --- doc/script_commands.txt | 4 ++-- src/map/npc.c | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/doc/script_commands.txt b/doc/script_commands.txt index f2ba9f6ba..f0016b104 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -207,7 +207,7 @@ Ex: if your NPC is named 'Hunter#hunter1', it will be displayed as 'Hunter' ** Define a warp point -,,,%TAB%warp%TAB%%TAB%,,,, +,,{,}%TAB%warp%TAB%%TAB%,,,, This will define a warp NPC that will warp a player between maps, and while most arguments of that are obvious, some deserve special mention. @@ -299,7 +299,7 @@ items here. The layout used to define sale items still count, and ** Define an warp/shop/cashshop/NPC duplicate. -warp: ,,,%TAB%duplicate(