diff options
author | Jesusaves <cpntb1@ymail.com> | 2018-11-14 10:44:13 -0200 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2018-11-14 10:44:13 -0200 |
commit | 89659af3d41931b1da8d8ea2749c2f1eadc24ba5 (patch) | |
tree | 1d92adac8aca94dcd1e22f9f6c86396267c3c8a9 /src | |
parent | 23f4ef1bf5721647fc398579737920dab642074d (diff) | |
parent | 2e7cb5a8f05b0a57081360b08906ab23bdba88a8 (diff) | |
download | evol-hercules-89659af3d41931b1da8d8ea2749c2f1eadc24ba5.tar.gz evol-hercules-89659af3d41931b1da8d8ea2749c2f1eadc24ba5.tar.bz2 evol-hercules-89659af3d41931b1da8d8ea2749c2f1eadc24ba5.tar.xz evol-hercules-89659af3d41931b1da8d8ea2749c2f1eadc24ba5.zip |
[Server Plugin] Hercules Update (resync)
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/elogin/parse.c | 4 | ||||
-rw-r--r-- | src/emap/atcommand.c | 79 | ||||
-rw-r--r-- | src/emap/atcommand.h | 12 | ||||
-rw-r--r-- | src/emap/clif.c | 357 | ||||
-rw-r--r-- | src/emap/clif.h | 3 | ||||
-rw-r--r-- | src/emap/data/itemd.c | 2 | ||||
-rw-r--r-- | src/emap/data/itemd.h | 2 | ||||
-rw-r--r-- | src/emap/init.c | 9 | ||||
-rw-r--r-- | src/emap/lang.c | 4 | ||||
-rw-r--r-- | src/emap/pc.c | 22 | ||||
-rw-r--r-- | src/emap/pc.h | 2 | ||||
-rw-r--r-- | src/emap/script.c | 23 | ||||
-rw-r--r-- | src/emap/script_buildins.c | 8 | ||||
-rw-r--r-- | src/emap/send.c | 4 | ||||
-rw-r--r-- | src/emap/skill.c | 4 |
16 files changed, 396 insertions, 143 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 68828fe..d17cc8a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -136,11 +136,11 @@ MAP_SRC = emap/atcommand.c \ # need remove -Wno-unused -SHARED_CFLAGS = ${CFLAGS} -O3 -pipe -ffast-math -std=c99 -Wall -Wextra -Wno-sign-compare -Wno-unused -fno-omit-frame-pointer \ +SHARED_CFLAGS = ${CFLAGS} -O3 -pipe -ffast-math -std=c11 -Wall -Wextra -Wno-sign-compare -Wno-unused -fno-omit-frame-pointer \ -DPCRE_SUPPORT -I../../.. -I../../../../3rdparty \ -DPACKETVER=20150513 \ -DevolPacketOffset=0 -SHARED_LDFLAGS = -avoid-version -Wl,--no-undefined +SHARED_LDFLAGS = -lm -avoid-version -Wl,--no-undefined if ENABLE_STATIC_BUILD SHARED_CFLAGS += "-static-libgcc" diff --git a/src/elogin/parse.c b/src/elogin/parse.c index 7ecdf13..b6e4b5d 100644 --- a/src/elogin/parse.c +++ b/src/elogin/parse.c @@ -35,7 +35,7 @@ void login_parse_version(int fd) clientVersion = RFIFOL(fd, 2); // check for minimal supported version - if (clientVersion < 17) + if (clientVersion < 19) { lclif->login_error(fd, 5); return; @@ -60,7 +60,7 @@ bool elogin_client_login_pre(int *fdPtr, safestrncpy(username, RFIFOP(fd, 6), NAME_LENGTH); int len = (int)safestrnlen(username, NAME_LENGTH); // check for minimal supported version - if (clientVersion < 17) + if (clientVersion < 19) { lclif->login_error(fd, 5); hookStop(); diff --git a/src/emap/atcommand.c b/src/emap/atcommand.c index e37a320..e7f97b3 100644 --- a/src/emap/atcommand.c +++ b/src/emap/atcommand.c @@ -68,7 +68,7 @@ const char* eatcommand_msgfd_pre(int *fdPtr, return lang_pctrans(atcommand->msg_table[0][msg_number], sd); } -bool jump_iterate(struct map_session_data *sd, bool forward) +static bool eatcommand_jump_iterate(struct map_session_data *sd, bool forward) { struct SessionExt *session_ext = session_get_bysd(sd); @@ -78,21 +78,16 @@ bool jump_iterate(struct map_session_data *sd, bool forward) struct map_session_data *pl_sd = map->id2sd(session_ext->jump_iterate_id); struct map_session_data *buff_sd = NULL; - bool has_next = false; int fd = NULL != pl_sd ? pl_sd->fd : sd->fd; - int user_count = map->getusers(); - - if (user_count == 1) - { - session_ext->jump_iterate_id = 0; - clif->message(sd->fd, "You are alone at map server!"); - return true; - } + bool has_skipped = false; + int start_fd = fd; int max_counter = sockt->fd_max; do { + bool has_next = false; + if (forward) { fd++; @@ -108,37 +103,37 @@ bool jump_iterate(struct map_session_data *sd, bool forward) { fd = (forward ? -1 : sockt->fd_max + 1); } - else + else if (sockt->session_is_active(fd)) { - if (sockt->session_is_active(fd)) + buff_sd = sockt->session[fd]->session_data; + + if ( + NULL != buff_sd && + ( + (sd == buff_sd) || + (map->list[buff_sd->bl.m].flag.nowarpto && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE)) || + (sd->bl.m == buff_sd->bl.m && sd->bl.x == buff_sd->bl.x && sd->bl.y == buff_sd->bl.y) + ) + ) { - buff_sd = sockt->session[fd]->session_data; - - if (NULL != buff_sd) + if (sd != buff_sd) { - if ( - (sd == buff_sd) || - (map->list[buff_sd->bl.m].flag.nowarpto && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE)) - ) - { - buff_sd = NULL; - } - else if (sd->bl.m == buff_sd->bl.m && sd->bl.x == buff_sd->bl.x && sd->bl.y == buff_sd->bl.y) - { - if (user_count == 2) { - return true; - } - - buff_sd = NULL; - } + has_skipped = true; } + + buff_sd = NULL; } } --max_counter; - } while (NULL == buff_sd && (max_counter >= 0)); + } while ((NULL == buff_sd) && (fd != start_fd) && (max_counter >= 0)); - if (NULL != buff_sd) + if (NULL == buff_sd && !has_skipped) + { + session_ext->jump_iterate_id = 0; + clif->message(sd->fd, "You are alone at map server!"); + } + else if (NULL != buff_sd) { char message[80]; @@ -149,11 +144,9 @@ bool jump_iterate(struct map_session_data *sd, bool forward) clif->message(sd->fd, message); session_ext->jump_iterate_id = buff_sd->bl.id; - - return true; } - return false; + return true; } ACMD2(setSkill) @@ -223,12 +216,12 @@ ACMD2(slide) ACMD3(hugo) { - return jump_iterate(sd, true); + return eatcommand_jump_iterate(sd, true); } ACMD3(linus) { - return jump_iterate(sd, false); + return eatcommand_jump_iterate(sd, false); } ACMD1(mapExit) @@ -242,6 +235,18 @@ ACMD1(mapExit) return true; } +ACMD0(log) +{ + return true; +} + +ACMD4(tee) +{ + clif->disp_overhead(&sd->bl, message, AREA_CHAT_WOC, NULL); + + return true; +} + // 100 - terminate all servers // 101 - restart all servers // 102 - restart char and map servers diff --git a/src/emap/atcommand.h b/src/emap/atcommand.h index 24e4a4c..5b8588b 100644 --- a/src/emap/atcommand.h +++ b/src/emap/atcommand.h @@ -9,6 +9,10 @@ const char* eatcommand_msgsd_pre(struct map_session_data **sdPtr, const char* eatcommand_msgfd_pre(int *fdPtr, int *msgPtr); +#define ACMD0(x) bool atcommand_ ## x (const int fd __attribute__ ((unused)), \ + struct map_session_data* sd __attribute__ ((unused)), \ + const char* command __attribute__ ((unused)), \ + const char* message __attribute__ ((unused)), struct AtCommandInfo *info __attribute__ ((unused))) #define ACMD1(x) bool atcommand_ ## x (const int fd __attribute__ ((unused)), \ struct map_session_data* sd __attribute__ ((unused)), \ const char* command __attribute__ ((unused)), \ @@ -23,6 +27,11 @@ const char* eatcommand_msgfd_pre(int *fdPtr, const char* command __attribute__ ((unused)), \ const char* message __attribute__ ((unused)), \ struct AtCommandInfo *info __attribute__ ((unused))) +#define ACMD4(x) bool atcommand_ ## x (const int fd __attribute__ ((unused)), \ + struct map_session_data* sd, \ + const char* command __attribute__ ((unused)), \ + const char* message, \ + struct AtCommandInfo *info __attribute__ ((unused))) ACMD2(setSkill); ACMD2(slide); @@ -30,6 +39,7 @@ ACMD3(hugo); ACMD3(linus); ACMD1(mapExit); ACMD1(serverExit); - +ACMD0(log); +ACMD4(tee); #endif // EVOL_MAP_ATCOMMAND diff --git a/src/emap/clif.c b/src/emap/clif.c index a5ff9cb..4892549 100644 --- a/src/emap/clif.c +++ b/src/emap/clif.c @@ -16,9 +16,15 @@ #include "common/cbasetypes.h" #include "common/random.h" #include "common/timer.h" +#include "map/battle.h" +#include "map/elemental.h" +#include "map/homunculus.h" #include "map/guild.h" #include "map/mob.h" #include "map/npc.h" +#include "map/mercenary.h" +#include "map/party.h" +#include "map/pet.h" #include "map/pc.h" #include "map/quest.h" @@ -35,6 +41,8 @@ #include "emap/struct/mapdext.h" #include "emap/struct/sessionext.h" +#include <math.h> + extern bool isInit; extern char global_npc_str[1001]; @@ -187,9 +195,267 @@ void eclif_quest_add(TBL_PC *sd, hookStop(); } +// legacy eclif_charnameack_legacy start +// clientVersion <= 24 +// + +unsigned int eget_percentage(const unsigned int A, const unsigned int B); +unsigned int eget_percentage(const unsigned int A, const unsigned int B) +{ + double result; + + if( B == 0 ) + { + ShowError("get_percentage(): division by zero! (A=%u,B=%u)\n", A, B); + return ~0U; + } + + result = 100 * ((double)A / (double)B); + + if( result > UINT_MAX ) + { + ShowError("get_percentage(): result percentage too high! (A=%u,B=%u,result=%g)\n", A, B, result); + return UINT_MAX; + } + + return (unsigned int)floor(result); +} + +// ZC_ACK_REQNAMEALL / ZC_ACK_REQNAMEALL2 +struct packet_reqnameall_legacy_ack { + uint16 packet_id; + int32 gid; + char name[NAME_LENGTH]; + char party_name[NAME_LENGTH]; + char guild_name[NAME_LENGTH]; + char position_name[NAME_LENGTH]; +} __attribute__((packed)); + +/// Updates the object's (bl) name on client. +/// 0095 <id>.L <char name>.24B (ZC_ACK_REQNAME) +/// 0195 <id>.L <char name>.24B <party name>.24B <guild name>.24B <position name>.24B (ZC_ACK_REQNAMEALL) +/// 0A30 <id>.L <char name>.24B <party name>.24B <guild name>.24B <position name>.24B <title id>.L (ZC_ACK_REQNAMEALL2) +static void eclif_charnameack_legacy(int fd, struct block_list *bl) +{ + struct packet_reqnameall_legacy_ack packet; + memset(&packet, 0, sizeof(struct packet_reqnameall_legacy_ack)); + int len = sizeof(struct packet_reqnameall_legacy_ack); + + nullpo_retv(bl); + + packet.packet_id = reqName; + packet.gid = bl->id; + + switch(bl->type) { + case BL_PC: + { + const struct map_session_data *ssd = BL_UCCAST(BL_PC, bl); + const struct party_data *p = NULL; + const struct guild *g = NULL; + int ps = -1; + + if (ssd->fakename[0] != '\0' || ssd->status.guild_id > 0 || ssd->status.party_id > 0 || ssd->status.title_id > 0) { + packet.packet_id = 0x195; //reqNameAllType; + } + + //Requesting your own "shadow" name. [Skotlex] + if (ssd->fd == fd && ssd->disguise != -1) { + packet.gid = -bl->id; + } + + if (ssd->fakename[0] != '\0') { + memcpy(packet.name, ssd->fakename, NAME_LENGTH); + break; + } + +//#if PACKETVER >= 20150503 +// // Title System [Dastgir/Hercules] +// if (ssd->status.title_id > 0) { +// packet.title_id = ssd->status.title_id; +// } +//#endif + + memcpy(packet.name, ssd->status.name, NAME_LENGTH); + + if (ssd->status.party_id != 0) { + p = party->search(ssd->status.party_id); + } + if (ssd->status.guild_id != 0) { + if ((g = ssd->guild) != NULL) { + int i; + ARR_FIND(0, g->max_member, i, g->member[i].account_id == ssd->status.account_id && g->member[i].char_id == ssd->status.char_id); + if (i < g->max_member) + ps = g->member[i].position; + } + } + + if (!battle->bc->display_party_name && g == NULL) { + // do not display party unless the player is also in a guild + p = NULL; + } + + if (p == NULL && g == NULL) + break; + + if (p != NULL) { + memcpy(packet.party_name, p->party.name, NAME_LENGTH); + } + + if (g != NULL && ps >= 0 && ps < MAX_GUILDPOSITION) { + memcpy(packet.guild_name, g->name,NAME_LENGTH); + memcpy(packet.position_name, g->position[ps].name, NAME_LENGTH); + } + } + break; + //[blackhole89] + case BL_HOM: + memcpy(packet.name, BL_UCCAST(BL_HOM, bl)->homunculus.name, NAME_LENGTH); + break; + case BL_MER: + memcpy(packet.name, BL_UCCAST(BL_MER, bl)->db->name, NAME_LENGTH); + break; + case BL_PET: + memcpy(packet.name, BL_UCCAST(BL_PET, bl)->pet.name, NAME_LENGTH); + break; + case BL_NPC: + memcpy(packet.name, BL_UCCAST(BL_NPC, bl)->name, NAME_LENGTH); + break; + case BL_MOB: + { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + + memcpy(packet.name, md->name, NAME_LENGTH); + if (md->guardian_data && md->guardian_data->g) { + packet.packet_id = 0x195; //reqNameAllType; + memcpy(packet.guild_name, md->guardian_data->g->name, NAME_LENGTH); + memcpy(packet.position_name, md->guardian_data->castle->castle_name, NAME_LENGTH); + + } else if (battle->bc->show_mob_info) { + char mobhp[50], *str_p = mobhp; + packet.packet_id = 0x195; //reqNameAllType; + if (battle->bc->show_mob_info&4) + str_p += sprintf(str_p, "Lv. %d | ", md->level); + if (battle->bc->show_mob_info&1) + str_p += sprintf(str_p, "HP: %u/%u | ", md->status.hp, md->status.max_hp); + if (battle->bc->show_mob_info&2) + str_p += sprintf(str_p, "HP: %u%% | ", eget_percentage(md->status.hp, md->status.max_hp)); + //Even thought mobhp ain't a name, we send it as one so the client + //can parse it. [Skotlex] + if (str_p != mobhp) { + *(str_p-3) = '\0'; //Remove trailing space + pipe. + memcpy(packet.party_name, mobhp, NAME_LENGTH); + } + } + } + break; + case BL_CHAT: +#if 0 //FIXME: Clients DO request this... what should be done about it? The chat's title may not fit... [Skotlex] + memcpy(packet.name, BL_UCCAST(BL_CHAT, bl)->title, NAME_LENGTH); + break; +#endif + return; + case BL_ELEM: + memcpy(packet.name, BL_UCCAST(BL_ELEM, bl)->db->name, NAME_LENGTH); + break; + default: + ShowError("clif_charnameack: bad type %u(%d)\n", bl->type, bl->id); + return; + } + + if (packet.packet_id == reqName) { + len = sizeof(struct packet_reqname_ack); + } + // if no recipient specified just update nearby clients + // if no recipient specified just update nearby clients + if (fd == 0) { + clif->send(&packet, len, bl, AREA); + } else { + struct map_session_data *sd = sockt->session_is_valid(fd) ? sockt->session[fd]->session_data : NULL; + if (sd != NULL) { + clif->send(&packet, len, &sd->bl, SELF); + } else { + clif->send(&packet, len, bl, SELF); + } + } +} + +//Used to update when a char leaves a party/guild. [Skotlex] +//Needed because when you send a 0x95 packet, the client will not remove the cached party/guild info that is not sent. +static void eclif_charnameupdate_legacy(struct map_session_data *ssd) +{ + int ps = -1; + struct party_data *p = NULL; + struct guild *g = NULL; + struct packet_reqnameall_legacy_ack packet; + memset(&packet, 0, sizeof(struct packet_reqnameall_legacy_ack)); + + nullpo_retv(ssd); + + if (ssd->fakename[0]) + return; //No need to update as the party/guild was not displayed anyway. + + packet.packet_id = 0x195; //reqNameAllType; + packet.gid = ssd->bl.id; + + memcpy(packet.name, ssd->status.name, NAME_LENGTH); + + if (!battle->bc->display_party_name) { + if (ssd->status.party_id > 0 && ssd->status.guild_id > 0 && (g = ssd->guild) != NULL) + p = party->search(ssd->status.party_id); + } else { + if (ssd->status.party_id > 0) + p = party->search(ssd->status.party_id); + } + + if (ssd->status.guild_id > 0 && (g = ssd->guild) != NULL) { + int i; + ARR_FIND(0, g->max_member, i, g->member[i].account_id == ssd->status.account_id && g->member[i].char_id == ssd->status.char_id); + if( i < g->max_member ) ps = g->member[i].position; + } + + if (p != NULL) + memcpy(packet.party_name, p->party.name, NAME_LENGTH); + + if (g != NULL && ps >= 0 && ps < MAX_GUILDPOSITION) { + memcpy(packet.guild_name, g->name,NAME_LENGTH); + memcpy(packet.position_name, g->position[ps].name, NAME_LENGTH); + } + +//#if PACKETVER >= 20150503 +// // Achievement System [Dastgir/Hercules] +// if (ssd->status.title_id > 0) { +// packet.title_id = ssd->status.title_id; +// } +//#endif + + // Update nearby clients + clif->send(&packet, sizeof(packet), &ssd->bl, AREA); +} + +// +// clientVersion <= 24 +// legacy eclif_charnameack_legacy end + void eclif_charnameack_pre(int *fdPtr, struct block_list **blPtr) { + eclif_charnameack_pre_sub(fdPtr, blPtr); + if (hookStopped()) + return; + + struct SessionExt *data = session_get(*fdPtr); + if (!data) + return; + if (data->clientVersion <= 24) + { + eclif_charnameack_legacy(*fdPtr, *blPtr); + hookStop(); + } +} + +void eclif_charnameack_pre_sub(int *fdPtr, + struct block_list **blPtr) +{ struct block_list *bl = *blPtr; if (!bl) { @@ -297,6 +563,18 @@ void eclif_charnameack_pre(int *fdPtr, } } +void eclif_charnameupdate_pre(struct map_session_data **ssdPtr) +{ + struct SessionExt *data = session_get_bysd(*ssdPtr); + if (!data) + return; + if (data->clientVersion <= 24) + { + eclif_charnameupdate_legacy(*ssdPtr); + hookStop(); + } +} + #define equipPos(index, field) \ equip = sd->equip_index[index]; \ if (equip >= 0) \ @@ -476,31 +754,14 @@ void eclif_sendlook_pre(struct block_list **blPtr, eclif_handle_invisible_map(bl, *target); } -bool eclif_send_pre(const void **bufPtr, +bool eclif_send_pre(const void **bufPtr __attribute__ ((unused)), int *len __attribute__ ((unused)), struct block_list **blPtr, enum send_target *type) { struct block_list *bl = *blPtr; - const void *buf = *bufPtr; if (*type == SELF) { - if (*len >= 2) - { - const int packet = RBUFW (buf, 0); - if (packet == 0x9cb) - { - struct map_session_data *sd = BL_CAST(BL_PC, bl); - struct SessionExt *data = session_get_bysd(sd); - if (!data) - return true; - if (data->clientVersion < 19) - { // not sending new packet to old clients - hookStop(); - return true; - } - } - } return true; } eclif_handle_invisible_map(bl, *type); @@ -519,7 +780,7 @@ void eclif_set_unit_idle_pre(struct block_list **blPtr, eclif_handle_invisible_map(bl, *target); } -int eclif_send_actual_pre(int *fd, +int eclif_send_actual_pre(int *fd __attribute__ ((unused)), void **bufPtr, int *len) { @@ -534,39 +795,12 @@ int eclif_send_actual_pre(int *fd, hookStop(); return 0; } - if (packet == 0xb1e + evolPacketOffset) - { - struct SessionExt *data = session_get(*fd); - if (!data) - return 0; - if (data->clientVersion < 18) - { // not sending new packets to old clients -// ShowWarning("skip packet %d\n", packet); - hookStop(); - return 0; - } - } if (packet == 0x7fb) { - struct SessionExt *data = session_get(*fd); - if (!data) - return 0; - if (data->clientVersion >= 18) - { // not sending old packets to new clients - hookStop(); - return 0; - } - } - if (packet == 0x9cb) - { - struct SessionExt *data = session_get(*fd); - if (!data) - return 0; - if (data->clientVersion < 19) - { // not sending new packets to old clients - hookStop(); - return 0; - } + // not sending old packets to new clients + // probably useless? + hookStop(); + return 0; } } return 0; @@ -1020,11 +1254,6 @@ void eclif_skillinfoblock_pre(struct map_session_data **sdPtr) { struct map_session_data *sd = *sdPtr; nullpo_retv(sd); - struct SessionExt *data = session_get_bysd(sd); - if (!data) - return; - if (data->clientVersion < 18) - return; int fd = sd->fd; if (!fd) @@ -1088,13 +1317,6 @@ void eclif_addskill_pre(struct map_session_data **sdPtr, struct map_session_data *sd = *sdPtr; nullpo_retv(sd); int id = *idPtr; - - struct SessionExt *data = session_get_bysd(sd); - if (!data) - return; - if (data->clientVersion < 18) - return; - int fd = sd->fd; if (!fd) { @@ -1147,12 +1369,6 @@ void eclif_skillinfo_pre(struct map_session_data **sdPtr, struct map_session_data *sd = *sdPtr; nullpo_retv(sd); - struct SessionExt *data = session_get_bysd(sd); - if (!data) - return; - if (data->clientVersion < 18) - return; - int skill_id = *skill_idPtr; int idx = skill->get_index(skill_id); Assert_retv(idx >= 0 && idx < MAX_SKILL_DB); @@ -1216,11 +1432,6 @@ void eclif_parse_WalkToXY(int fd, if (unit->walktoxy(&sd->bl, x, y, 4) && sd->ud.state.change_walk_target == 1) { - struct SessionExt *data = session_get_bysd(sd); - if (!data) - return; - if (data->clientVersion < 18) - return; send_walk_fail(sd->fd, x, y); } } diff --git a/src/emap/clif.h b/src/emap/clif.h index ef09b07..3a563fd 100644 --- a/src/emap/clif.h +++ b/src/emap/clif.h @@ -11,6 +11,9 @@ void eclif_quest_add_pre(TBL_PC **sdPtr, struct quest **qdPtr); void eclif_charnameack_pre(int *fdPtr, struct block_list **blPtr); +void eclif_charnameack_pre_sub(int *fdPtr, + struct block_list **blPtr); +void eclif_charnameupdate_pre(struct map_session_data **ssdPtr); void eclif_getareachar_unit_post(TBL_PC *sd, struct block_list *bl); bool eclif_spawn_post(bool retVal, diff --git a/src/emap/data/itemd.c b/src/emap/data/itemd.c index a97903c..15b143b 100644 --- a/src/emap/data/itemd.c +++ b/src/emap/data/itemd.c @@ -18,7 +18,7 @@ #include "emap/data/itemd.h" #include "emap/struct/itemdext.h" -struct ItemdExt *itemd_get_by_item(struct item *item) +struct ItemdExt *itemd_get_by_item(const struct item *item) { if (!item) return NULL; diff --git a/src/emap/data/itemd.h b/src/emap/data/itemd.h index abb07b0..9ec6099 100644 --- a/src/emap/data/itemd.h +++ b/src/emap/data/itemd.h @@ -4,7 +4,7 @@ #ifndef EVOL_MAP_ITEMD #define EVOL_MAP_ITEMD -struct ItemdExt *itemd_get_by_item(struct item *item); +struct ItemdExt *itemd_get_by_item(const struct item *item); struct ItemdExt *itemd_get(struct item_data *item); struct ItemdExt *itemd_create(void); diff --git a/src/emap/init.c b/src/emap/init.c index 510d40b..a12e1c5 100644 --- a/src/emap/init.c +++ b/src/emap/init.c @@ -16,6 +16,8 @@ #include "common/socket.h" #include "common/strlib.h" #include "common/timer.h" +#include "map/achievement.h" +#include "map/battle.h" #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" @@ -103,6 +105,8 @@ HPExport void plugin_init (void) addAtcommand("serverexit", serverExit); addAtcommand("hugo", hugo); addAtcommand("linus", linus); + addAtcommand("tee", tee); + addAtcommand("log", log); addCPCommand("serverexit", serverExit); @@ -253,6 +257,7 @@ HPExport void plugin_init (void) addHookPre(clif, quest_send_list, eclif_quest_send_list_pre); addHookPre(clif, quest_add, eclif_quest_add_pre); addHookPre(clif, charnameack, eclif_charnameack_pre); + addHookPre(clif, charnameupdate, eclif_charnameupdate_pre); addHookPre(clif, getareachar_item, eclif_getareachar_item_pre); addHookPre(clif, dropflooritem, eclif_dropflooritem_pre); addHookPre(clif, disp_message, eclif_disp_message_pre); @@ -361,8 +366,8 @@ HPExport void plugin_init (void) itemdb->isidentified = eitemdb_isidentified; itemdb->isidentified2 = eitemdb_isidentified2; - langScriptId = script->add_str("Lang"); - mountScriptId = script->add_str("mount"); + langScriptId = script->add_variable("Lang"); + mountScriptId = script->add_variable("mount"); isInit = true; } diff --git a/src/emap/lang.c b/src/emap/lang.c index fcef241..a05c568 100644 --- a/src/emap/lang.c +++ b/src/emap/lang.c @@ -211,7 +211,7 @@ int lang_getId(const char *str) char *str2 = NULL; int f; - if ((str2 = strchr(str, '.'))) + if ((str2 = (char*)strchr(str, '.'))) *str2 = 0; for (f = 0; f < MAX_LANGS && lang_langs[f]; f ++) @@ -223,7 +223,7 @@ int lang_getId(const char *str) } } - if ((str2 = strchr(str1, '_'))) + if ((str2 = (char*)strchr(str1, '_'))) *str2 = 0; for (f = 0; f < MAX_LANGS && lang_langs[f]; f ++) diff --git a/src/emap/pc.c b/src/emap/pc.c index afea705..cd8ef2f 100644 --- a/src/emap/pc.c +++ b/src/emap/pc.c @@ -14,6 +14,7 @@ #include "common/socket.h" #include "common/strlib.h" #include "common/timer.h" +#include "map/achievement.h" #include "map/chrif.h" #include "map/homunculus.h" #include "map/elemental.h" @@ -410,7 +411,7 @@ int epc_setnewpc_post(int retVal, int epc_additem_post(int retVal, struct map_session_data *sd, - struct item *item_data, + const struct item *item_data, int amount __attribute__ ((unused)), e_log_pick_type log_type __attribute__ ((unused))) { @@ -733,6 +734,11 @@ bool epc_adoption_pre(struct map_session_data **p1_sdPtr, pc->skill(p1_sd, WE_CALLBABY, 1, SKILL_GRANT_PERMANENT); pc->skill(p2_sd, WE_CALLBABY, 1, SKILL_GRANT_PERMANENT); + // Achievements [Smokexyz/Hercules] + achievement->validate_adopt(p1_sd, true); // Parent 1 + achievement->validate_adopt(p2_sd, true); // Parent 2 + achievement->validate_adopt(b_sd, false); // Baby + hookStop(); return true; } @@ -833,13 +839,13 @@ int epc_jobchange(struct map_session_data *sd, { // changing from 1st to 2nd job sd->change_level_2nd = sd->status.job_level; - pc_setglobalreg(sd, script->add_str("jobchange_level"), sd->change_level_2nd); + pc_setglobalreg(sd, script->add_variable("jobchange_level"), sd->change_level_2nd); } else if ((job & JOBL_THIRD) != 0 && (sd->job & JOBL_THIRD) == 0) { // changing from 2nd to 3rd job sd->change_level_3rd = sd->status.job_level; - pc_setglobalreg(sd, script->add_str("jobchange_level_3rd"), sd->change_level_3rd); + pc_setglobalreg(sd, script->add_variable("jobchange_level_3rd"), sd->change_level_3rd); } */ @@ -854,8 +860,8 @@ int epc_jobchange(struct map_session_data *sd, clif->deleteskill(sd, sd->cloneskill_id); } sd->cloneskill_id = 0; - pc_setglobalreg(sd, script->add_str("CLONE_SKILL"), 0); - pc_setglobalreg(sd, script->add_str("CLONE_SKILL_LV"), 0); + pc_setglobalreg(sd, script->add_variable("CLONE_SKILL"), 0); + pc_setglobalreg(sd, script->add_variable("CLONE_SKILL_LV"), 0); } if(sd->reproduceskill_id) @@ -869,8 +875,8 @@ int epc_jobchange(struct map_session_data *sd, clif->deleteskill(sd, sd->reproduceskill_id); } sd->reproduceskill_id = 0; - pc_setglobalreg(sd, script->add_str("REPRODUCE_SKILL"),0); - pc_setglobalreg(sd, script->add_str("REPRODUCE_SKILL_LV"),0); + pc_setglobalreg(sd, script->add_variable("REPRODUCE_SKILL"),0); + pc_setglobalreg(sd, script->add_variable("REPRODUCE_SKILL_LV"),0); } /* @@ -1012,6 +1018,8 @@ int epc_jobchange(struct map_session_data *sd, quest->questinfo_refresh(sd); + achievement->validate_jobchange(sd); // Achievements [Smokexyz/Hercules] + return 0; } diff --git a/src/emap/pc.h b/src/emap/pc.h index 4d227b4..d5c59bf 100644 --- a/src/emap/pc.h +++ b/src/emap/pc.h @@ -61,7 +61,7 @@ int epc_setnewpc_post(int retVal, int epc_additem_post(int retVal, struct map_session_data *sd, - struct item *item_data, + const struct item *item_data, int amount, e_log_pick_type log_type); diff --git a/src/emap/script.c b/src/emap/script.c index 4bc427b..236461b 100644 --- a/src/emap/script.c +++ b/src/emap/script.c @@ -10,6 +10,7 @@ #include "common/HPMi.h" #include "common/memmgr.h" #include "common/nullpo.h" +#include "map/achievement.h" #include "map/npc.h" #include "map/pc.h" #include "map/script.h" @@ -410,7 +411,7 @@ void escript_run_use_script_pre(struct map_session_data **sdPtr, const int oid = *oidPtr; if (oid == 0) { - pc->setreg(sd, script->add_str("@useType"), 0); + pc->setreg(sd, script->add_variable("@useType"), 0); script->current_item_id = itemData->nameid; script->run(itemData->script, 0, sd->bl.id, oid); script->current_item_id = 0; @@ -425,11 +426,11 @@ void escript_run_use_script_pre(struct map_session_data **sdPtr, return; } - pc->setreg(sd, script->add_str("@useType"), data->tmpUseType); + pc->setreg(sd, script->add_variable("@useType"), data->tmpUseType); script->current_item_id = itemData->nameid; script->run(itemData->script, 0, sd->bl.id, oid); script->current_item_id = 0; - pc->setreg(sd, script->add_str("@useType"), 0); + pc->setreg(sd, script->add_variable("@useType"), 0); data->tmpUseType = 0; } hookStop(); @@ -444,11 +445,11 @@ void script_run_item_amount_script(TBL_PC *sd, return; script->current_item_id = itemId; - pc->setreg(sd, script->add_str("@itemId"), itemId); - pc->setreg(sd, script->add_str("@itemAmount"), amount); + pc->setreg(sd, script->add_variable("@itemId"), itemId); + pc->setreg(sd, script->add_variable("@itemAmount"), amount); script->run(itemScript, 0, sd->bl.id, npc->fake_nd->bl.id); - pc->setreg(sd, script->add_str("@itemId"), 0); - pc->setreg(sd, script->add_str("@itemAmount"), 0); + pc->setreg(sd, script->add_variable("@itemId"), 0); + pc->setreg(sd, script->add_variable("@itemAmount"), 0); script->current_item_id = 0; } @@ -461,10 +462,10 @@ void script_run_card_script(TBL_PC *sd, return; script->current_item_id = itemId; - pc->setreg(sd, script->add_str("@itemId"), itemId); - pc->setreg(sd, script->add_str("@cardId"), cardId); + pc->setreg(sd, script->add_variable("@itemId"), itemId); + pc->setreg(sd, script->add_variable("@cardId"), cardId); script->run(itemScript, 0, sd->bl.id, npc->fake_nd->bl.id); - pc->setreg(sd, script->add_str("@itemId"), 0); - pc->setreg(sd, script->add_str("@cardId"), 0); + pc->setreg(sd, script->add_variable("@itemId"), 0); + pc->setreg(sd, script->add_variable("@cardId"), 0); script->current_item_id = 0; } diff --git a/src/emap/script_buildins.c b/src/emap/script_buildins.c index 78fb940..78b9ac6 100644 --- a/src/emap/script_buildins.c +++ b/src/emap/script_buildins.c @@ -11,6 +11,7 @@ #include "common/memmgr.h" #include "common/utils.h" #include "common/timer.h" +#include "map/achievement.h" #include "map/chat.h" #include "map/chrif.h" #include "map/instance.h" @@ -1094,6 +1095,9 @@ BUILDIN(failedRefIndex) if (sd->status.inventory[n].nameid <= 0 || sd->status.inventory[n].amount <= 0) return false; + // Call before changing refine to 0. + achievement->validate_refine(sd, n, false); + sd->status.inventory[n].refine = 0; if (sd->status.inventory[n].equip) pc->unequipitem(sd, n, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); @@ -1124,6 +1128,9 @@ BUILDIN(downRefIndex) clif->delitem(sd, n, 1, DELITEM_MATERIALCHANGE); logs->pick_pc(sd, LOG_TYPE_SCRIPT, 1, &sd->status.inventory[n], sd->inventory_data[n]); clif->additem(sd, n, 1, 0); + + achievement->validate_refine(sd, n, false); // Achievements [Smokexyz/Hercules] + clif->misceffect(&sd->bl, 2); return true; } @@ -1152,6 +1159,7 @@ BUILDIN(successRefIndex) logs->pick_pc(sd, LOG_TYPE_SCRIPT, 1, &sd->status.inventory[n],sd->inventory_data[n]); clif->additem(sd, n, 1, 0); clif->misceffect(&sd->bl, 3); + achievement->validate_refine(sd, n, true); // Achievements [Smokexyz/Hercules] if (sd->status.inventory[n].refine == 10 && sd->status.inventory[n].card[0] == CARD0_FORGE && diff --git a/src/emap/send.c b/src/emap/send.c index b6f3d92..dd9d7ac 100644 --- a/src/emap/send.c +++ b/src/emap/send.c @@ -144,6 +144,7 @@ void send_mapmask_brodcast(const int map, const int mask) struct block_list bl; char buf[10]; + memset(&bl, 0, sizeof(bl)); bl.m = map; WBUFW (buf, 0) = 0xb02 + evolPacketOffset; WBUFL (buf, 2) = mask; @@ -308,6 +309,7 @@ void send_changemusic_brodcast(const int map, const char *music) const int sz = (int)strlen(music) + 5; char *buf; + memset(&bl, 0, sizeof(bl)); CREATE(buf, char, sz); bl.m = map; WBUFW (buf, 0) = 0xb05 + evolPacketOffset; @@ -525,7 +527,7 @@ void send_homun_exp(struct homun_data *hd, const int fd = hd->master->fd; struct SessionExt *data = session_get(fd); - if (!data || data->clientVersion < 18) + if (!data) return; WFIFOHEAD(fd, 10); diff --git a/src/emap/skill.c b/src/emap/skill.c index a45792f..20e4a82 100644 --- a/src/emap/skill.c +++ b/src/emap/skill.c @@ -59,8 +59,8 @@ int eskill_check_condition_castend_post(int retVal, struct event_data* ev = node->data; if (ev) { - pc->setreg(sd, script->add_str("@skillId"), skill_id); - pc->setreg(sd, script->add_str("@skillLv"), skill_lv); + pc->setreg(sd, script->add_variable("@skillId"), skill_id); + pc->setreg(sd, script->add_variable("@skillLv"), skill_lv); script->run(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); } node = node->next; |