summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2018-11-14 10:44:13 -0200
committerJesusaves <cpntb1@ymail.com>2018-11-14 10:44:13 -0200
commit89659af3d41931b1da8d8ea2749c2f1eadc24ba5 (patch)
tree1d92adac8aca94dcd1e22f9f6c86396267c3c8a9 /src
parent23f4ef1bf5721647fc398579737920dab642074d (diff)
parent2e7cb5a8f05b0a57081360b08906ab23bdba88a8 (diff)
downloadevol-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.am4
-rw-r--r--src/elogin/parse.c4
-rw-r--r--src/emap/atcommand.c79
-rw-r--r--src/emap/atcommand.h12
-rw-r--r--src/emap/clif.c357
-rw-r--r--src/emap/clif.h3
-rw-r--r--src/emap/data/itemd.c2
-rw-r--r--src/emap/data/itemd.h2
-rw-r--r--src/emap/init.c9
-rw-r--r--src/emap/lang.c4
-rw-r--r--src/emap/pc.c22
-rw-r--r--src/emap/pc.h2
-rw-r--r--src/emap/script.c23
-rw-r--r--src/emap/script_buildins.c8
-rw-r--r--src/emap/send.c4
-rw-r--r--src/emap/skill.c4
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;