Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions conf/map/battle/feature.conf
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,9 @@ features: {
// This is disabled in client-side in some client versions
// Disabled by default
rodex_use_accountmail: false

// Allow Homunculus autofeeding
// true: enable (Default)
// false: disable
enable_homun_autofeed: true
}
2 changes: 2 additions & 0 deletions sql-files/main.sql
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@ CREATE TABLE IF NOT EXISTS `homunculus` (
`alive` TINYINT(2) NOT NULL DEFAULT '1',
`rename_flag` TINYINT(2) NOT NULL DEFAULT '0',
`vaporize` TINYINT(2) NOT NULL DEFAULT '0',
`autofeed` TINYINT(2) NOT NULL DEFAULT '0',
PRIMARY KEY (`homun_id`)
) ENGINE=MyISAM;

Expand Down Expand Up @@ -883,6 +884,7 @@ INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1477434595); -- 2016-10-2
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1488454834); -- 2017-03-02--11-40.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1488744559); -- 2017-03-05--08-09.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1489588190); -- 2017-03-15--14-29.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1509835214); -- 2017-11-04--10-39.sql
--
-- Table structure for table `storage`
--
Expand Down
6 changes: 6 additions & 0 deletions sql-files/upgrades/2017-11-04--10-39.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#1509835214

ALTER TABLE `homunculus`
ADD COLUMN `autofeed` TINYINT(2) NOT NULL DEFAULT '0' AFTER `vaporize`;

INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1509835214 , 'No');
1 change: 1 addition & 0 deletions sql-files/upgrades/index.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@
2017-03-02--11-40.sql
2017-03-05--08-09.sql
2017-03-15--14-29.sql
2017-11-04--10-39.sql
13 changes: 7 additions & 6 deletions src/char/int_homun.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@ bool mapif_homunculus_create(struct s_homunculus *hd)
SQL->EscapeStringLen(inter->sql_handle, esc_name, hd->name, strnlen(hd->name, NAME_LENGTH));

if (SQL_ERROR == SQL->Query(inter->sql_handle, "INSERT INTO `%s` "
"(`char_id`, `class`,`prev_class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`, `rename_flag`, `vaporize`) "
"VALUES ('%d', '%d', '%d', '%s', '%d', '%u', '%u', '%d', '%d', %d, '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
"(`char_id`, `class`,`prev_class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`, `rename_flag`, `vaporize`, `autofeed`) "
"VALUES ('%d', '%d', '%d', '%s', '%d', '%u', '%u', '%d', '%d', %d, '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
homunculus_db, hd->char_id, hd->class_, hd->prev_class, esc_name, hd->level, hd->exp, hd->intimacy, hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
hd->hp, hd->max_hp, hd->sp, hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize)) {
hd->hp, hd->max_hp, hd->sp, hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->autofeed)) {
Sql_ShowDebug(inter->sql_handle);
return false;
}
Expand All @@ -156,9 +156,9 @@ bool mapif_homunculus_save(const struct s_homunculus *hd)

SQL->EscapeStringLen(inter->sql_handle, esc_name, hd->name, strnlen(hd->name, NAME_LENGTH));

if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_id`='%d', `class`='%d',`prev_class`='%d',`name`='%s',`level`='%d',`exp`='%u',`intimacy`='%u',`hunger`='%d', `str`='%d', `agi`='%d', `vit`='%d', `int`='%d', `dex`='%d', `luk`='%d', `hp`='%d',`max_hp`='%d',`sp`='%d',`max_sp`='%d',`skill_point`='%d', `rename_flag`='%d', `vaporize`='%d' WHERE `homun_id`='%d'",
if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_id`='%d', `class`='%d',`prev_class`='%d',`name`='%s',`level`='%d',`exp`='%u',`intimacy`='%u',`hunger`='%d', `str`='%d', `agi`='%d', `vit`='%d', `int`='%d', `dex`='%d', `luk`='%d', `hp`='%d',`max_hp`='%d',`sp`='%d',`max_sp`='%d',`skill_point`='%d', `rename_flag`='%d', `vaporize`='%d', `autofeed`='%d' WHERE `homun_id`='%d'",
homunculus_db, hd->char_id, hd->class_, hd->prev_class, esc_name, hd->level, hd->exp, hd->intimacy, hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
hd->hp, hd->max_hp, hd->sp, hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->hom_id)) {
hd->hp, hd->max_hp, hd->sp, hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->autofeed, hd->hom_id)) {
Sql_ShowDebug(inter->sql_handle);
flag = false;
} else {
Expand Down Expand Up @@ -196,7 +196,7 @@ bool mapif_homunculus_load(int homun_id, struct s_homunculus* hd)
nullpo_ret(hd);
memset(hd, 0, sizeof(*hd));

if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `homun_id`,`char_id`,`class`,`prev_class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize` FROM `%s` WHERE `homun_id`='%d'", homunculus_db, homun_id) )
if (SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `homun_id`,`char_id`,`class`,`prev_class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize`, `autofeed` FROM `%s` WHERE `homun_id`='%d'", homunculus_db, homun_id))
{
Sql_ShowDebug(inter->sql_handle);
return false;
Expand Down Expand Up @@ -236,6 +236,7 @@ bool mapif_homunculus_load(int homun_id, struct s_homunculus* hd)
SQL->GetData(inter->sql_handle, 19, &data, NULL); hd->skillpts = atoi(data);
SQL->GetData(inter->sql_handle, 20, &data, NULL); hd->rename_flag = atoi(data);
SQL->GetData(inter->sql_handle, 21, &data, NULL); hd->vaporize = atoi(data);
SQL->GetData(inter->sql_handle, 22, &data, NULL); hd->autofeed = atoi(data);
SQL->FreeResult(inter->sql_handle);

hd->intimacy = cap_value(hd->intimacy, 0, 100000);
Expand Down
1 change: 1 addition & 0 deletions src/common/mmo.h
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,7 @@ struct s_homunculus { //[orn]
int luk_value;

int8 spiritball; //for homun S [lighta]
int autofeed;
};

struct s_mercenary {
Expand Down
1 change: 1 addition & 0 deletions src/map/battle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
/**
Expand Down
2 changes: 2 additions & 0 deletions src/map/battle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
38 changes: 26 additions & 12 deletions src/map/clif.c
Original file line number Diff line number Diff line change
Expand Up @@ -9030,22 +9030,23 @@ 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);
fd = sd->fd;

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));
}
Expand Down Expand Up @@ -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)));
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
14 changes: 11 additions & 3 deletions src/map/clif.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
**/
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
7 changes: 6 additions & 1 deletion src/map/homunculus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/map/packets.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions src/plugins/HPMHooking/HPMHooking.Defs.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1174,8 +1174,8 @@ typedef void (*HPMHOOK_pre_clif_feel_hate_reset) (struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_feel_hate_reset) (struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_partytickack) (struct map_session_data **sd, bool *flag);
typedef void (*HPMHOOK_post_clif_partytickack) (struct map_session_data *sd, bool flag);
typedef void (*HPMHOOK_pre_clif_equiptickack) (struct map_session_data **sd, int *flag);
typedef void (*HPMHOOK_post_clif_equiptickack) (struct map_session_data *sd, int flag);
typedef void (*HPMHOOK_pre_clif_zc_config) (struct map_session_data **sd, int *type, int *flag);
typedef void (*HPMHOOK_post_clif_zc_config) (struct map_session_data *sd, int type, int flag);
typedef void (*HPMHOOK_pre_clif_viewequip_ack) (struct map_session_data **sd, struct map_session_data **tsd);
typedef void (*HPMHOOK_post_clif_viewequip_ack) (struct map_session_data *sd, struct map_session_data *tsd);
typedef void (*HPMHOOK_pre_clif_equpcheckbox) (struct map_session_data **sd);
Expand Down Expand Up @@ -2132,8 +2132,8 @@ typedef void (*HPMHOOK_pre_clif_pAdopt_reply) (int *fd, struct map_session_data
typedef void (*HPMHOOK_post_clif_pAdopt_reply) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_pViewPlayerEquip) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_pViewPlayerEquip) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_pEquipTick) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_pEquipTick) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_p_cz_config) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_p_cz_config) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_pquestStateAck) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_pquestStateAck) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_pmercenary_action) (int *fd, struct map_session_data **sd);
Expand Down
16 changes: 8 additions & 8 deletions src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
Original file line number Diff line number Diff line change
Expand Up @@ -810,8 +810,8 @@ struct {
struct HPMHookPoint *HP_clif_feel_hate_reset_post;
struct HPMHookPoint *HP_clif_partytickack_pre;
struct HPMHookPoint *HP_clif_partytickack_post;
struct HPMHookPoint *HP_clif_equiptickack_pre;
struct HPMHookPoint *HP_clif_equiptickack_post;
struct HPMHookPoint *HP_clif_zc_config_pre;
struct HPMHookPoint *HP_clif_zc_config_post;
struct HPMHookPoint *HP_clif_viewequip_ack_pre;
struct HPMHookPoint *HP_clif_viewequip_ack_post;
struct HPMHookPoint *HP_clif_equpcheckbox_pre;
Expand Down Expand Up @@ -1768,8 +1768,8 @@ struct {
struct HPMHookPoint *HP_clif_pAdopt_reply_post;
struct HPMHookPoint *HP_clif_pViewPlayerEquip_pre;
struct HPMHookPoint *HP_clif_pViewPlayerEquip_post;
struct HPMHookPoint *HP_clif_pEquipTick_pre;
struct HPMHookPoint *HP_clif_pEquipTick_post;
struct HPMHookPoint *HP_clif_p_cz_config_pre;
struct HPMHookPoint *HP_clif_p_cz_config_post;
struct HPMHookPoint *HP_clif_pquestStateAck_pre;
struct HPMHookPoint *HP_clif_pquestStateAck_post;
struct HPMHookPoint *HP_clif_pmercenary_action_pre;
Expand Down Expand Up @@ -7009,8 +7009,8 @@ struct {
int HP_clif_feel_hate_reset_post;
int HP_clif_partytickack_pre;
int HP_clif_partytickack_post;
int HP_clif_equiptickack_pre;
int HP_clif_equiptickack_post;
int HP_clif_zc_config_pre;
int HP_clif_zc_config_post;
int HP_clif_viewequip_ack_pre;
int HP_clif_viewequip_ack_post;
int HP_clif_equpcheckbox_pre;
Expand Down Expand Up @@ -7967,8 +7967,8 @@ struct {
int HP_clif_pAdopt_reply_post;
int HP_clif_pViewPlayerEquip_pre;
int HP_clif_pViewPlayerEquip_post;
int HP_clif_pEquipTick_pre;
int HP_clif_pEquipTick_post;
int HP_clif_p_cz_config_pre;
int HP_clif_p_cz_config_post;
int HP_clif_pquestStateAck_pre;
int HP_clif_pquestStateAck_post;
int HP_clif_pmercenary_action_pre;
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->mission_info, HP_clif_mission_info) },
{ HP_POP(clif->feel_hate_reset, HP_clif_feel_hate_reset) },
{ HP_POP(clif->partytickack, HP_clif_partytickack) },
{ HP_POP(clif->equiptickack, HP_clif_equiptickack) },
{ HP_POP(clif->zc_config, HP_clif_zc_config) },
{ HP_POP(clif->viewequip_ack, HP_clif_viewequip_ack) },
{ HP_POP(clif->equpcheckbox, HP_clif_equpcheckbox) },
{ HP_POP(clif->displayexp, HP_clif_displayexp) },
Expand Down Expand Up @@ -906,7 +906,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->pAdopt_request, HP_clif_pAdopt_request) },
{ HP_POP(clif->pAdopt_reply, HP_clif_pAdopt_reply) },
{ HP_POP(clif->pViewPlayerEquip, HP_clif_pViewPlayerEquip) },
{ HP_POP(clif->pEquipTick, HP_clif_pEquipTick) },
{ HP_POP(clif->p_cz_config, HP_clif_p_cz_config) },
{ HP_POP(clif->pquestStateAck, HP_clif_pquestStateAck) },
{ HP_POP(clif->pmercenary_action, HP_clif_pmercenary_action) },
{ HP_POP(clif->pBattleChat, HP_clif_pBattleChat) },
Expand Down
Loading