summaryrefslogtreecommitdiff
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
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/
-rw-r--r--conf/atcommand.conf1
-rw-r--r--conf/groups.conf1
-rw-r--r--conf/messages.conf15
-rw-r--r--doc/atcommands.txt10
-rw-r--r--src/map/atcommand.c114
-rw-r--r--src/map/pc.c15
-rw-r--r--src/map/pc.h2
7 files changed, 154 insertions, 4 deletions
diff --git a/conf/atcommand.conf b/conf/atcommand.conf
index fc2a1af73..df4972067 100644
--- a/conf/atcommand.conf
+++ b/conf/atcommand.conf
@@ -56,6 +56,7 @@ aliases: {
accinfo: ["accountinfo"]
itemreset: ["clearinventory"]
channel: ["main"]
+ autoloottype: ["aloottype"]
}
/* List of commands that should not be logged at all */
diff --git a/conf/groups.conf b/conf/groups.conf
index 7c97352dc..9403e34f6 100644
--- a/conf/groups.conf
+++ b/conf/groups.conf
@@ -120,6 +120,7 @@ groups: (
noks: true
autoloot: true
alootid: true
+ autoloottype: true
autotrade: true
request: true
go: true
diff --git a/conf/messages.conf b/conf/messages.conf
index 3a16d8054..ae96152f0 100644
--- a/conf/messages.conf
+++ b/conf/messages.conf
@@ -1532,5 +1532,20 @@
1487: Character cannot be disguised while in monster form.
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 -<type name or ID>.
+1492: Autolooting item type: '%s' {%d}
+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 +<type name or ID>". To remove an item type, use "@aloottype -<type name or ID>".
+1496: Type List: healing = 0, usable = 2, etc = 3, weapon = 4, armor = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10
+1497: "@aloottype reset" will clear your autoloottype list.
+1498: Your autoloottype list is empty.
+1499: Item types on your autoloottype list:
+1500: Your autoloottype list has been reset.
+
+
//Custom translations
import: conf/import/msg_conf.txt
diff --git a/doc/atcommands.txt b/doc/atcommands.txt
index 42b085cd6..c70570d8c 100644
--- a/doc/atcommands.txt
+++ b/doc/atcommands.txt
@@ -337,6 +337,16 @@ By default, 10 items can be autolooted at one time.
---------------------------------------
+@autoloottype <+/- type name/ID>
+@autoloottype reset
+
+Starts or stops autolooting a specified item type.
+Type List: healing = 0, usable = 2, etc = 3, weapon = 4, armor = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10
+Typing "reset" will clear the autoloot item list.
+
+---------------------------------------
+
+
@mobsearch <monster name>
Locates and displays the position of a certain mob on the current map.
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.