summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorAsheraf <acheraf1998@gmail.com>2017-11-05 00:51:34 +0000
committerAsheraf <acheraf1998@gmail.com>2017-11-18 22:45:11 +0000
commit1a4327551900db5e2ecbb754bef7c05f4edfc6dd (patch)
treef60c6951a12ba3b634f5c6b5c40f6c1b62ece349 /src/map
parent41f3237e4537d7105fb47d56b455d31cf33c155c (diff)
downloadhercules-1a4327551900db5e2ecbb754bef7c05f4edfc6dd.tar.gz
hercules-1a4327551900db5e2ecbb754bef7c05f4edfc6dd.tar.bz2
hercules-1a4327551900db5e2ecbb754bef7c05f4edfc6dd.tar.xz
hercules-1a4327551900db5e2ecbb754bef7c05f4edfc6dd.zip
Implement Homunculus autofeeding
Diffstat (limited to 'src/map')
-rw-r--r--src/map/battle.c1
-rw-r--r--src/map/battle.h2
-rw-r--r--src/map/clif.c38
-rw-r--r--src/map/clif.h14
-rw-r--r--src/map/homunculus.c7
-rw-r--r--src/map/packets.h2
6 files changed, 47 insertions, 17 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index 8983e93c9..70ebc4a08 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -7308,6 +7308,7 @@ static const struct battle_data {
{ "boarding_halter_speed", &battle_config.boarding_halter_speed, 25, 0, 100, },
{ "features/rodex", &battle_config.feature_rodex, 1, 0, 1, },
{ "features/rodex_use_accountmail", &battle_config.feature_rodex_use_accountmail, 0, 0, 1, },
+ { "features/enable_homun_autofeed", &battle_config.feature_enable_homun_autofeed, 1, 0, 1, },
};
#ifndef STATS_OPT_OUT
/**
diff --git a/src/map/battle.h b/src/map/battle.h
index 4a63887c4..f6e825e82 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -559,6 +559,8 @@ struct Battle_Config {
int feature_rodex;
int feature_rodex_use_accountmail;
+
+ int feature_enable_homun_autofeed;
};
/* criteria for battle_config.idletime_critera */
diff --git a/src/map/clif.c b/src/map/clif.c
index 1b7d94ca9..eb6b46bec 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -9030,14 +9030,15 @@ void clif_feel_hate_reset(struct map_session_data *sd)
clif->starskill(sd, "", 0, 0, 30);
}
-/// Equip window (un)tick ack (ZC_CONFIG).
+/// Send configurations (ZC_CONFIG).
/// 02d9 <type>.L <value>.L
/// type:
/// 0 = open equip window
+/// 3 = homunculus autofeeding
/// value:
/// 0 = disabled
/// 1 = enabled
-void clif_equiptickack(struct map_session_data* sd, int flag)
+void clif_zc_config(struct map_session_data* sd, int type, int flag)
{
int fd;
nullpo_retv(sd);
@@ -9045,7 +9046,7 @@ void clif_equiptickack(struct map_session_data* sd, int flag)
WFIFOHEAD(fd, packet_len(0x2d9));
WFIFOW(fd, 0) = 0x2d9;
- WFIFOL(fd, 2) = 0;
+ WFIFOL(fd, 2) = type;
WFIFOL(fd, 6) = flag;
WFIFOSET(fd, packet_len(0x2d9));
}
@@ -15929,19 +15930,32 @@ void clif_parse_ViewPlayerEquip(int fd, struct map_session_data* sd) {
clif->msgtable(sd, MSG_EQUIP_NOT_PUBLIC);
}
-void clif_parse_EquipTick(int fd, struct map_session_data* sd) __attribute__((nonnull (2)));
-/// Request to change equip window tick (CZ_CONFIG).
+void clif_parse_cz_config(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
+/// Receive configurations (CZ_CONFIG).
/// 02d8 <type>.L <value>.L
/// type:
/// 0 = open equip window
+/// 3 = homunculus autofeeding
/// value:
/// 0 = disabled
/// 1 = enabled
-void clif_parse_EquipTick(int fd, struct map_session_data* sd)
-{
- bool flag = (RFIFOL(fd,6) != 0) ? true : false;
- sd->status.show_equip = flag;
- clif->equiptickack(sd, flag);
+void clif_parse_cz_config(int fd, struct map_session_data *sd)
+{
+ int type = RFIFOL(fd, 2);
+ int flag = RFIFOL(fd, 6);
+
+ if (type == CZ_CONFIG_OPEN_EQUIPMENT_WINDOW) {
+ sd->status.show_equip = flag;
+ } else if (type == CZ_CONFIG_HOMUNCULUS_AUTOFEEDING) {
+ struct homun_data *hd;
+ hd = sd->hd;
+ nullpo_retv(hd);
+ hd->homunculus.autofeed = flag;
+ } else {
+ ShowWarning("clif_parse_cz_config: Unsupported type has been received (%d).", type);
+ return;
+ }
+ clif->zc_config(sd, type, flag);
}
void clif_parse_PartyTick(int fd, struct map_session_data* sd) __attribute__((nonnull (2)));
@@ -20305,7 +20319,7 @@ void clif_defaults(void) {
clif->mission_info = clif_mission_info;
clif->feel_hate_reset = clif_feel_hate_reset;
clif->partytickack = clif_partytickack;
- clif->equiptickack = clif_equiptickack;
+ clif->zc_config = clif_zc_config;
clif->viewequip_ack = clif_viewequip_ack;
clif->equpcheckbox = clif_equpcheckbox;
clif->displayexp = clif_displayexp;
@@ -20830,7 +20844,7 @@ void clif_defaults(void) {
clif->pAdopt_request = clif_parse_Adopt_request;
clif->pAdopt_reply = clif_parse_Adopt_reply;
clif->pViewPlayerEquip = clif_parse_ViewPlayerEquip;
- clif->pEquipTick = clif_parse_EquipTick;
+ clif->p_cz_config = clif_parse_cz_config;
clif->pquestStateAck = clif_parse_questStateAck;
clif->pmercenary_action = clif_parse_mercenary_action;
clif->pBattleChat = clif_parse_BattleChat;
diff --git a/src/map/clif.h b/src/map/clif.h
index 851c823ea..c321b99d7 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -563,7 +563,15 @@ enum clif_unittype {
CLUT_MERCNARY = 0x9,
CLUT_ELEMENTAL = 0xa,
};
-
+/**
+* Receive configuration types
+**/
+enum CZ_CONFIG {
+ CZ_CONFIG_OPEN_EQUIPMENT_WINDOW = 0,
+ // Unknown = 1,
+ CZ_CONFIG_PET_AUTOFEEDING = 2,
+ CZ_CONFIG_HOMUNCULUS_AUTOFEEDING = 3,
+};
/**
* Structures
**/
@@ -781,7 +789,7 @@ struct clif_interface {
void (*mission_info) (struct map_session_data *sd, int mob_id, unsigned char progress);
void (*feel_hate_reset) (struct map_session_data *sd);
void (*partytickack) (struct map_session_data* sd, bool flag);
- void (*equiptickack) (struct map_session_data* sd, int flag);
+ void (*zc_config) (struct map_session_data *sd, int type, int flag);
void (*viewequip_ack) (struct map_session_data* sd, struct map_session_data* tsd);
void (*equpcheckbox) (struct map_session_data* sd);
void (*displayexp) (struct map_session_data *sd, uint64 exp, char type, bool is_quest);
@@ -1302,7 +1310,7 @@ struct clif_interface {
void (*pAdopt_request) (int fd, struct map_session_data *sd);
void (*pAdopt_reply) (int fd, struct map_session_data *sd);
void (*pViewPlayerEquip) (int fd, struct map_session_data* sd);
- void (*pEquipTick) (int fd, struct map_session_data* sd);
+ void (*p_cz_config) (int fd, struct map_session_data *sd);
void (*pquestStateAck) (int fd, struct map_session_data * sd);
void (*pmercenary_action) (int fd, struct map_session_data* sd);
void (*pBattleChat) (int fd, struct map_session_data* sd);
diff --git a/src/map/homunculus.c b/src/map/homunculus.c
index ddaf3443a..9f5756885 100644
--- a/src/map/homunculus.c
+++ b/src/map/homunculus.c
@@ -683,7 +683,12 @@ int homunculus_hunger_timer(int tid, int64 tick, int id, intptr_t data) {
} else if(hd->homunculus.hunger == 75) {
clif->emotion(&hd->bl, E_OK);
}
-
+ if (battle_config.feature_enable_homun_autofeed != 0) {
+ if (hd->homunculus.autofeed) {
+ if (hd->homunculus.hunger < 30)
+ homun->feed(sd, hd);
+ }
+ }
if(hd->homunculus.hunger < 0) {
hd->homunculus.hunger = 0;
// Delete the homunculus if intimacy <= 100
diff --git a/src/map/packets.h b/src/map/packets.h
index 3fcf1648a..b95ae65cf 100644
--- a/src/map/packets.h
+++ b/src/map/packets.h
@@ -1151,7 +1151,7 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x02d5,2);
packet(0x02d6,6,clif->pViewPlayerEquip,2);
packet(0x02d7,-1);
- packet(0x02d8,10,clif->pEquipTick,6);
+ packet(0x02d8,10,clif->p_cz_config,6);
packet(0x02d9,10);
packet(0x02da,3);
packet(0x02db,-1,clif->pBattleChat,2,4);