summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorDastgir Pojee <dastgirpojee@rocketmail.com>2013-10-18 10:57:06 +0530
committerDastgir Pojee <dastgirpojee@rocketmail.com>2013-10-18 10:57:06 +0530
commite322c69d27d3db8c7141d27fa8baf0745de2eae4 (patch)
tree3ad6511427ba3d99ed4befbd1c8c4400558a6319 /src/map
parent9128feccf3bddda94a7f8a170305565416815b40 (diff)
downloadhercules-e322c69d27d3db8c7141d27fa8baf0745de2eae4.tar.gz
hercules-e322c69d27d3db8c7141d27fa8baf0745de2eae4.tar.bz2
hercules-e322c69d27d3db8c7141d27fa8baf0745de2eae4.tar.xz
hercules-e322c69d27d3db8c7141d27fa8baf0745de2eae4.zip
Since our neighbours added it, we too wanted this feature. Topic:http://hercules.ws/board/topic/2540-add-rathena-new-aloot-type/
Diffstat (limited to 'src/map')
-rw-r--r--src/map/atcommand.c114
-rw-r--r--src/map/pc.c15
-rw-r--r--src/map/pc.h2
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.