From ccce839881b911308e8e81d4b3c786f5a42db4a9 Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 29 Dec 2023 16:51:43 +0100 Subject: [PATCH 01/33] Rebalance shadow cross 20221221 (#8019) * Savage Impact - Reduces cooldown from 1 second to 0.7 seconds. - Increases area of effect from 5 x 5 cells to 7 x 7 cells based on level 10. - Applies AP recovery rate by 2. * Shadow Stab - The skill will deal damage for 2 hits. - While under Cloaking Exceed buff, increases number of hit to 3 hits with higher damage per hit. - Increases factor weight of POW in skill formula while under Cloaking Exceed buff from 5 to 7. - Increases base damage from 1500%Atk to 1750%/2000%Atk per hit based on level 5. --- db/re/skill_db.yml | 31 ++++++++++++++++--------------- src/map/battle.cpp | 9 +++++++-- src/map/skill.cpp | 4 ++-- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 57e4015066..22577da187 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -37915,30 +37915,31 @@ Body: Hit: Multi_Hit HitCount: 3 Element: Weapon - SplashArea: 2 - CastCancel: true - AfterCastActDelay: 300 - Cooldown: + GiveAp: 2 + SplashArea: - Level: 1 - Time: 3000 + Area: 2 - Level: 2 - Time: 2800 + Area: 2 - Level: 3 - Time: 2600 + Area: 2 - Level: 4 - Time: 2400 + Area: 2 - Level: 5 - Time: 2200 + Area: 2 - Level: 6 - Time: 2000 + Area: 3 - Level: 7 - Time: 1800 + Area: 3 - Level: 8 - Time: 1600 + Area: 3 - Level: 9 - Time: 1400 + Area: 3 - Level: 10 - Time: 1000 + Area: 3 + CastCancel: true + AfterCastActDelay: 300 + Cooldown: 700 Requires: SpCost: - Level: 1 @@ -38056,7 +38057,7 @@ Body: IgnoreDefense: true Range: 2 Hit: Multi_Hit - HitCount: 1 + HitCount: 2 Element: Weapon GiveAp: 2 CastCancel: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 72d7cdb4d2..9775a81aa1 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5550,7 +5550,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case SHC_SHADOW_STAB: - skillratio += -100 + 300 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow; + + if( sc && sc->getSCE( SC_CLOAKINGEXCEED ) ){ + skillratio += 50 * skill_lv + 2 * sstatus->pow; + } + RE_LVL_DMOD(100); break; case SHC_IMPACT_CRATER: @@ -6694,7 +6699,7 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block break; case SHC_SHADOW_STAB: if (wd.miscflag == 2) - wd.div_ = 2; + wd.div_ = 3; break; case SHC_IMPACT_CRATER: if (sc && sc->getSCE(SC_ROLLINGCUTTER)) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 60d47ff80f..1d2e8734b4 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5251,8 +5251,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SHC_SHADOW_STAB: - if (sc && (sc->getSCE(SC_CLOAKING) || sc->getSCE(SC_CLOAKINGEXCEED))) - flag |= 2;// Flag to deal 2 hits. + if (sc && sc->getSCE(SC_CLOAKINGEXCEED)) + flag |= 2;// Flag to deal 3 hits. status_change_end(src, SC_CLOAKING); status_change_end(src, SC_CLOAKINGEXCEED); From 0fe2d0a0fe92b02989a6ef1c0f1a6640e76feaf9 Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 29 Dec 2023 20:22:44 +0100 Subject: [PATCH 02/33] Rebalance inquisitor 20221221 (#8022) * Oleum Sanctum - Reduces cooldown from 2 seconds to 1.5 seconds. - No longer require Holy Water on casting. - Reduces area of effect from 11 x 11 cells to 9 x 9 cells based on level 5. * Explosion Blaster - Adds global cool time by 1 second. - Increases SP consumption from 90 to 125 based on level 5. - Reduces area of effect from 11 x 11 cells to 9 x 9 cells based on level 5. - Reduces base damage of from 14000%Atk to 12000%Atk based on level 5. - Increases base damage against Oleum Sanctum debuff from 16000%Atk to 17600%Atk based on level 5. - Reduces factor weight of POW in skill formula (without Oleum Sanctum debuff) from 15 to 10. * Massive Flame Blaster - Adds global cool time by 0.5 seconds. - Reduces area of effect from 11 x 11 cells to 9 x 9 cells. - Increases base damage from 21500%/23000%Atk to 23000%/24500%Atk based on level 10. --- db/re/skill_db.yml | 36 +++++++++++++++++------------------- src/map/battle.cpp | 6 +++--- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 22577da187..71c57fd801 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -36370,11 +36370,11 @@ Body: - Level: 2 Area: 3 - Level: 3 - Area: 4 + Area: 3 - Level: 4 Area: 4 - Level: 5 - Area: 5 + Area: 4 CastCancel: true Duration1: - Level: 1 @@ -36387,7 +36387,7 @@ Body: Time: 6000 - Level: 5 Time: 7000 - Cooldown: 2000 + Cooldown: 1500 Requires: SpCost: - Level: 1 @@ -36400,9 +36400,6 @@ Body: Amount: 75 - Level: 5 Amount: 85 - ItemCost: - - Item: Holy_Water - Amount: 1 Status: Holy_Oil - Id: 5242 Name: IQ_SINCERE_FAITH @@ -36455,8 +36452,9 @@ Body: Hit: Single HitCount: 1 Element: Weapon - SplashArea: 5 + SplashArea: 4 CastCancel: true + AfterCastActDelay: 500 Duration1: 150000 Cooldown: 5000 Requires: @@ -36482,37 +36480,37 @@ Body: - Level: 2 Area: 3 - Level: 3 - Area: 4 + Area: 3 - Level: 4 Area: 4 - Level: 5 - Area: 5 + Area: 4 GiveAp: 4 CastCancel: true AfterCastActDelay: - Level: 1 - Time: 500 + Time: 1500 # TODO - Level: 2 - Time: 400 + Time: 1400 # TODO - Level: 3 - Time: 300 + Time: 1300 # TODO - Level: 4 - Time: 200 + Time: 1200 # TODO - Level: 5 - Time: 0 + Time: 1000 Cooldown: 700 Requires: SpCost: - Level: 1 - Amount: 70 + Amount: 105 - Level: 2 - Amount: 75 + Amount: 110 - Level: 3 - Amount: 80 + Amount: 115 - Level: 4 - Amount: 85 + Amount: 120 - Level: 5 - Amount: 90 + Amount: 125 - Id: 5245 Name: IQ_FIRST_BRAND Description: First Brand diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 9775a81aa1..28ea528733 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5444,16 +5444,16 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case IQ_MASSIVE_F_BLASTER: - skillratio += -100 + 2150 * skill_lv + 15 * sstatus->pow; + skillratio += -100 + 2300 * skill_lv + 15 * sstatus->pow; if (tstatus->race == RC_BRUTE || tstatus->race == RC_DEMON) skillratio += 150 * skill_lv; RE_LVL_DMOD(100); break; case IQ_EXPOSION_BLASTER: - skillratio += -100 + 2800 * skill_lv + 15 * sstatus->pow; + skillratio += -100 + 2400 * skill_lv + 10 * sstatus->pow; if( tsc != nullptr && tsc->getSCE( SC_HOLY_OIL ) ){ - skillratio += 400 * skill_lv; + skillratio += 350 + 1050 * skill_lv; } RE_LVL_DMOD(100); From 7999ccb215487db28b4d29f068f8016c4a6671fc Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Fri, 29 Dec 2023 22:04:42 +0100 Subject: [PATCH 03/33] Refactored login-server clif to structs (#8058) Communication between the login-server and the client is now done with structs. Moved the definition of the global reusable packet buffer to socket.hpp --- src/char/char_clif.cpp | 4 - src/common/common.vcxproj | 1 + src/common/common.vcxproj.filters | 3 + src/common/mmo.hpp | 3 + src/common/packets.hpp | 212 ++++++++++++++ src/common/socket.hpp | 30 ++ src/login/account.hpp | 6 +- src/login/loginclif.cpp | 466 +++++++++++++++++------------- src/map/clif.cpp | 3 - 9 files changed, 509 insertions(+), 219 deletions(-) create mode 100644 src/common/packets.hpp diff --git a/src/char/char_clif.cpp b/src/char/char_clif.cpp index fc547090f1..0ead36110d 100644 --- a/src/char/char_clif.cpp +++ b/src/char/char_clif.cpp @@ -30,10 +30,6 @@ using namespace rathena; -// Reuseable global packet buffer to prevent too many allocations -// Take socket.cpp::socket_max_client_packet into consideration -static int8 packet_buffer[UINT16_MAX]; - std::vector accessible_maps{ s_point_str{ MAP_PRONTERA, 273, 354 }, s_point_str{ MAP_GEFFEN, 120, 100 }, diff --git a/src/common/common.vcxproj b/src/common/common.vcxproj index 13090af7c7..4f1e7254f7 100644 --- a/src/common/common.vcxproj +++ b/src/common/common.vcxproj @@ -34,6 +34,7 @@ + diff --git a/src/common/common.vcxproj.filters b/src/common/common.vcxproj.filters index 8aff9e4471..62b42598f4 100644 --- a/src/common/common.vcxproj.filters +++ b/src/common/common.vcxproj.filters @@ -56,6 +56,9 @@ Header Files + + Header Files + Header Files diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 9959af6705..050c370209 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -116,6 +116,9 @@ typedef uint32 t_itemid; #ifndef MAX_BARTER_REQUIREMENTS #define MAX_BARTER_REQUIREMENTS 5 #endif +#ifndef WEB_AUTH_TOKEN_LENGTH + #define WEB_AUTH_TOKEN_LENGTH 16+1 +#endif enum e_enchantgrade : uint16{ ENCHANTGRADE_NONE = 0, diff --git a/src/common/packets.hpp b/src/common/packets.hpp new file mode 100644 index 0000000000..bdcf84bff2 --- /dev/null +++ b/src/common/packets.hpp @@ -0,0 +1,212 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef PACKETS_HPP +#define PACKETS_HPP + +#include +#include + +#pragma warning( push ) +#pragma warning( disable : 4200 ) + +#define DEFINE_PACKET_HEADER( name, id ) const int16 HEADER_##name = id +#define DEFINE_PACKET_ID( name, id ) DEFINE_PACKET_HEADER( name, id ) + +// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute +#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) + #pragma pack( push, 1 ) +#endif + +struct PACKET_CA_LOGIN{ + int16 packetType; + uint32 version; + char username[NAME_LENGTH]; + char password[NAME_LENGTH]; + uint8 clienttype; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_LOGIN, 0x64 ); + +#if PACKETVER >= 20170315 +struct PACKET_AC_ACCEPT_LOGIN_sub{ + uint32 ip; + uint16 port; + char name[20]; + uint16 users; + uint16 type; + uint16 new_; + uint8 unknown[128]; +} __attribute__((packed)); + +struct PACKET_AC_ACCEPT_LOGIN{ + int16 packetType; + int16 packetLength; + uint32 login_id1; + uint32 AID; + uint32 login_id2; + uint32 last_ip; + char last_login[26]; + uint8 sex; + char token[WEB_AUTH_TOKEN_LENGTH]; + PACKET_AC_ACCEPT_LOGIN_sub char_servers[]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( AC_ACCEPT_LOGIN, 0xac4 ); +#else +struct PACKET_AC_ACCEPT_LOGIN_sub{ + uint32 ip; + uint16 port; + char name[20]; + uint16 users; + uint16 type; + uint16 new_; +} __attribute__((packed)); + +struct PACKET_AC_ACCEPT_LOGIN{ + int16 packetType; + int16 packetLength; + uint32 login_id1; + uint32 AID; + uint32 login_id2; + uint32 last_ip; + char last_login[26]; + uint8 sex; + PACKET_AC_ACCEPT_LOGIN_sub char_servers[]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( AC_ACCEPT_LOGIN, 0x69 ); +#endif + +// not sure when this started +#if PACKETVER >= 20120000 +struct PACKET_AC_REFUSE_LOGIN{ + int16 packetType; + uint32 error; + char unblock_time[20]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( AC_REFUSE_LOGIN, 0x83e ); +#else +struct PACKET_AC_REFUSE_LOGIN{ + int16 packetType; + uint8 error; + char unblock_time[20]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( AC_REFUSE_LOGIN, 0x6a ); +#endif + +struct PACKET_SC_NOTIFY_BAN{ + int16 packetType; + uint8 result; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( SC_NOTIFY_BAN, 0x81 ); + +struct PACKET_CA_REQ_HASH{ + int16 packetType; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_REQ_HASH, 0x1db ); + +struct PACKET_AC_ACK_HASH{ + int16 packetType; + int16 packetLength; + char salt[]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( AC_ACK_HASH, 0x1dc ); + +struct PACKET_CA_LOGIN2{ + int16 packetType; + uint32 version; + char username[NAME_LENGTH]; + uint8 passwordMD5[16]; + uint8 clienttype; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_LOGIN2, 0x1dd ); + +struct PACKET_CA_LOGIN3{ + int16 packetType; + uint32 version; + char username[NAME_LENGTH]; + uint8 passwordMD5[16]; + uint8 clienttype; + uint8 clientinfo; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_LOGIN3, 0x1fa ); + +struct PACKET_CA_CONNECT_INFO_CHANGED{ + int16 packetType; + char name[NAME_LENGTH]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_CONNECT_INFO_CHANGED, 0x200 ); + +struct PACKET_CA_EXE_HASHCHECK{ + int16 packetType; + char hash[16]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_EXE_HASHCHECK, 0x204 ); + +struct PACKET_CA_LOGIN_PCBANG{ + int16 packetType; + uint32 version; + char username[NAME_LENGTH]; + char password[NAME_LENGTH]; + uint8 clienttype; + char ip[16]; + char mac[13]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_LOGIN_PCBANG, 0x277 ); + +struct PACKET_CA_LOGIN4{ + int16 packetType; + uint32 version; + char username[NAME_LENGTH]; + uint8 passwordMD5[16]; + uint8 clienttype; + char mac[13]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_LOGIN4, 0x27c ); + +struct PACKET_CA_LOGIN_CHANNEL{ + int16 packetType; + uint32 version; + char username[NAME_LENGTH]; + char password[NAME_LENGTH]; + uint8 clienttype; + char ip[16]; + char mac[13]; + uint8 is_gravity; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_LOGIN_CHANNEL, 0x2b0 ); + +struct PACKET_CA_SSO_LOGIN_REQ{ + int16 packetType; + int16 packetLength; + uint32 version; + uint8 clienttype; + char username[NAME_LENGTH]; + char password[27]; + char mac[17]; + char ip[15]; + char token[]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CA_SSO_LOGIN_REQ, 0x825 ); + +struct PACKET_CT_AUTH{ + int16 packetType; + uint8 unknown[66]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( CT_AUTH, 0xacf ); + +struct PACKET_TC_RESULT{ + int16 packetType; + int16 packetLength; + uint32 type; + char unknown1[20]; + char unknown2[6]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER( TC_RESULT, 0xae3 ); + +// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute +#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) + #pragma pack( pop ) +#endif + +#pragma warning( pop ) + +#endif /* PACKETS_HPP */ diff --git a/src/common/socket.hpp b/src/common/socket.hpp index 76480e4306..c072ee399c 100644 --- a/src/common/socket.hpp +++ b/src/common/socket.hpp @@ -199,4 +199,34 @@ void send_shortlist_add_fd(int fd); void send_shortlist_do_sends(); #endif +// Reuseable global packet buffer to prevent too many allocations +// Take socket.cpp::socket_max_client_packet into consideration +static int8 packet_buffer[UINT16_MAX]; + +template +bool socket_send( int fd, P& packet ){ + if( !session_isActive( fd ) ){ + return false; + } + + WFIFOHEAD( fd, sizeof( P ) ); + memcpy( WFIFOP( fd, 0 ), &packet, sizeof( P ) ); + WFIFOSET( fd, sizeof( P ) ); + + return true; +} + +template +bool socket_send( int fd, P* packet ){ + if( !session_isActive( fd ) ){ + return false; + } + + WFIFOHEAD( fd, packet->packetLength ); + memcpy( WFIFOP( fd, 0 ), packet, packet->packetLength ); + WFIFOSET( fd, packet->packetLength ); + + return true; +} + #endif /* SOCKET_HPP */ diff --git a/src/login/account.hpp b/src/login/account.hpp index 99bfd50f7e..1adeb3e0f5 100644 --- a/src/login/account.hpp +++ b/src/login/account.hpp @@ -5,13 +5,9 @@ #define ACCOUNT_HPP #include -#include // ACCOUNT_REG2_NUM +#include // ACCOUNT_REG2_NUM, WEB_AUTH_TOKEN_LENGTH #include -#ifndef WEB_AUTH_TOKEN_LENGTH -#define WEB_AUTH_TOKEN_LENGTH 16+1 -#endif - typedef struct AccountDB AccountDB; typedef struct AccountDBIterator AccountDBIterator; diff --git a/src/login/loginclif.cpp b/src/login/loginclif.cpp index 7201994da9..7155891a00 100644 --- a/src/login/loginclif.cpp +++ b/src/login/loginclif.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include //show notice #include //wfifo session @@ -31,10 +32,12 @@ * .B (SC_NOTIFY_BAN) */ static void logclif_sent_auth_result(int fd,char result){ - WFIFOHEAD(fd,3); - WFIFOW(fd,0) = 0x81; - WFIFOB(fd,2) = result; - WFIFOSET(fd,3); + PACKET_SC_NOTIFY_BAN p = {}; + + p.packetType = HEADER_SC_NOTIFY_BAN; + p.result = result; + + socket_send( fd, p ); } /** @@ -49,16 +52,6 @@ static void logclif_auth_ok(struct login_session_data* sd) { uint32 subnet_char_ip; int i; -#if PACKETVER < 20170315 - int cmd = 0x69; // AC_ACCEPT_LOGIN - int header = 47; - int size = 32; -#else - int cmd = 0xac4; // AC_ACCEPT_LOGIN3 - int header = 64; - int size = 160; -#endif - if( !global_core->is_running() ){ // players can only login while running logclif_sent_auth_result(fd,1); // server closed @@ -118,33 +111,39 @@ static void logclif_auth_ok(struct login_session_data* sd) { login_log(ip, sd->userid, 100, "login ok"); ShowStatus("Connection of the account '%s' accepted.\n", sd->userid); - WFIFOHEAD(fd,header+size*server_num); - WFIFOW(fd,0) = cmd; - WFIFOW(fd,2) = header+size*server_num; - WFIFOL(fd,4) = sd->login_id1; - WFIFOL(fd,8) = sd->account_id; - WFIFOL(fd,12) = sd->login_id2; - WFIFOL(fd,16) = 0; // in old version, that was for ip (not more used) - //memcpy(WFIFOP(fd,20), sd->lastlogin, 24); // in old version, that was for name (not more used) - memset(WFIFOP(fd,20), 0, 24); - WFIFOW(fd,44) = 0; // unknown - WFIFOB(fd,46) = sex_str2num(sd->sex); + PACKET_AC_ACCEPT_LOGIN* p = (PACKET_AC_ACCEPT_LOGIN*)packet_buffer; + + p->packetType = HEADER_AC_ACCEPT_LOGIN; + p->packetLength = sizeof( *p ); + p->login_id1 = sd->login_id1; + p->AID = sd->account_id; + p->login_id2 = sd->login_id2; + // in old version, that was for ip (not more used) + p->last_ip = 0; + // in old version, that was for last login time (not more used) + safestrncpy( p->last_login, "", sizeof( p->last_login ) ); + p->sex = sex_str2num( sd->sex ); #if PACKETVER >= 20170315 - safestrncpy( WFIFOCP( fd, 47 ), sd->web_auth_token, WEB_AUTH_TOKEN_LENGTH ); // web authentication token + safestrncpy( p->token, sd->web_auth_token, WEB_AUTH_TOKEN_LENGTH ); // web authentication token #endif + for( i = 0, n = 0; i < ARRAYLENGTH(ch_server); ++i ) { if( !session_isValid(ch_server[i].fd) ) continue; subnet_char_ip = lan_subnetcheck(ip); // Advanced subnet check [LuzZza] - WFIFOL(fd,header+n*size) = htonl((subnet_char_ip) ? subnet_char_ip : ch_server[i].ip); - WFIFOW(fd,header+n*size+4) = ntows(htons(ch_server[i].port)); // [!] LE byte order here [!] - memcpy(WFIFOP(fd,header+n*size+6), ch_server[i].name, 20); - WFIFOW(fd,header+n*size+26) = login_get_usercount( ch_server[i].users ); - WFIFOW(fd,header+n*size+28) = ch_server[i].type; - WFIFOW(fd,header+n*size+30) = ch_server[i].new_; + + PACKET_AC_ACCEPT_LOGIN_sub& char_server = p->char_servers[n]; + + char_server.ip = htonl( ( subnet_char_ip ) ? subnet_char_ip : ch_server[i].ip ); + char_server.port = ntows( htons( ch_server[i].port ) ); // [!] LE byte order here [!] + safestrncpy( char_server.name, ch_server[i].name, sizeof( char_server.name ) ); + char_server.users = login_get_usercount( ch_server[i].users ); + char_server.type = ch_server[i].type; + char_server.new_ = ch_server[i].new_; #if PACKETVER >= 20170315 - memset(WFIFOP(fd, header+n*size+32), 0, 128); // Unknown + memset( &char_server.unknown, 0, sizeof( char_server.unknown ) ); #endif + #ifdef DEBUG ShowDebug( "Sending the client (%d %d.%d.%d.%d) to char-server %s with ip %d.%d.%d.%d and port " @@ -152,9 +151,12 @@ static void logclif_auth_ok(struct login_session_data* sd) { sd->account_id, CONVIP(ip), ch_server[i].name, CONVIP((subnet_char_ip) ? subnet_char_ip : ch_server[i].ip), ch_server[i].port); #endif + n++; + p->packetLength += sizeof( char_server ); } - WFIFOSET(fd,header+size*server_num); + + socket_send( fd, p ); // create temporary auth entry login_add_auth_node( sd, ip ); @@ -165,6 +167,16 @@ static void logclif_auth_ok(struct login_session_data* sd) { data->waiting_disconnect = add_timer(gettick()+AUTH_TIMEOUT, login_waiting_disconnect_timer, sd->account_id, 0); } +static void logclif_auth_failed( int fd, int result, const char* unblock_time = "" ){ + PACKET_AC_REFUSE_LOGIN p = {}; + + p.packetType = HEADER_AC_REFUSE_LOGIN; + p.error = result; + safestrncpy( p.unblock_time, "", sizeof( p.unblock_time ) ); + + socket_send( fd, p ); +} + /** * Inform client that auth has failed. * @param sd: player session @@ -210,33 +222,18 @@ static void logclif_auth_failed(struct login_session_data* sd, int result) { if( (result == 0 || result == 1) && login_config.dynamic_pass_failure_ban ) ipban_log(ip); // log failed password attempt -#if PACKETVER >= 20120000 /* not sure when this started */ - WFIFOHEAD(fd,26); - WFIFOW(fd,0) = 0x83e; - WFIFOL(fd,2) = result; - if( result != 6 ) - memset(WFIFOP(fd,6), '\0', 20); - else { // 6 = You are prohibited to log in until %s - struct mmo_account acc; - AccountDB* accounts = login_get_accounts_db(); - time_t unban_time = ( accounts->load_str(accounts, &acc, sd->userid) ) ? acc.unban_time : 0; - timestamp2string(WFIFOCP(fd,6), 20, unban_time, login_config.date_format); - } - WFIFOSET(fd,26); -#else - WFIFOHEAD(fd,23); - WFIFOW(fd,0) = 0x6a; - WFIFOB(fd,2) = (uint8)result; - if( result != 6 ) - memset(WFIFOP(fd,3), '\0', 20); - else { // 6 = You are prohibited to log in until %s + // 6 = You are prohibited to log in until %s + if( result == 6 ){ + char unblock_time[20]; struct mmo_account acc; AccountDB* accounts = login_get_accounts_db(); - time_t unban_time = ( accounts->load_str(accounts, &acc, sd->userid) ) ? acc.unban_time : 0; - timestamp2string(WFIFOCP(fd,3), 20, unban_time, login_config.date_format); + time_t unban_time = ( accounts->load_str( accounts, &acc, sd->userid ) ) ? acc.unban_time : 0; + timestamp2string( unblock_time, sizeof( unblock_time ), unban_time, login_config.date_format ); + + logclif_auth_failed( fd, result, unblock_time ); + }else{ + logclif_auth_failed( fd, result ); } - WFIFOSET(fd,23); -#endif } /** @@ -246,9 +243,14 @@ static void logclif_auth_failed(struct login_session_data* sd, int result) { * @return 0 not enough info transmitted, 1 success */ static int logclif_parse_keepalive(int fd){ - if (RFIFOREST(fd) < 26) + PACKET_CA_CONNECT_INFO_CHANGED* p = (PACKET_CA_CONNECT_INFO_CHANGED*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p ) ){ return 0; - RFIFOSKIP(fd,26); + } + + RFIFOSKIP( fd, sizeof( *p ) ); + return 1; } @@ -259,112 +261,124 @@ static int logclif_parse_keepalive(int fd){ * @return 0 not enough info transmitted, 1 success */ static int logclif_parse_updclhash(int fd, struct login_session_data *sd){ - if (RFIFOREST(fd) < 18) + PACKET_CA_EXE_HASHCHECK* p = (PACKET_CA_EXE_HASHCHECK*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p ) ){ return 0; + } + sd->has_client_hash = 1; - memcpy(sd->client_hash, RFIFOP(fd, 2), 16); - RFIFOSKIP(fd,18); + memcpy( sd->client_hash, p->hash, sizeof( sd->client_hash ) ); + + RFIFOSKIP( fd, sizeof( *p ) ); + return 1; } -/** - * Received a connection request. - * @param fd: file descriptor to parse from (client) - * @param sd: client session - * @param command: packet type sent - * @param ip: ipv4 address (client) - * S 0064 .L .24B .24B .B - * S 0277 .L .24B .24B .B .16B .13B - * S 02b0 .L .24B .24B .B .16B .13B .B - * S 01dd .L .24B .16B .B - * S 01fa .L .24B .16B .B .B(index of the connection in the clientinfo file (+10 if the command-line contains "pc")) - * S 027c .L .24B .16B .B .13B(junk) - * S 0825 .W .L .B .24B .27B .17B .15B .(packetsize - 0x5C)B - * @param fd: fd to parse from (client fd) - * @return 0 failure, 1 success - */ -static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int command, char* ip){ - size_t packet_len = RFIFOREST(fd); - - if( (command == 0x0064 && packet_len < 55) - || (command == 0x0277 && packet_len < 84) - || (command == 0x02b0 && packet_len < 85) - || (command == 0x01dd && packet_len < 47) - || (command == 0x01fa && packet_len < 48) - || (command == 0x027c && packet_len < 60) - || (command == 0x0825 && (packet_len < 4 || packet_len < RFIFOW(fd, 2))) ) +template +int logclif_parse_reqauth_raw( int fd, login_session_data& sd, char* ip ){ + P* p = (P*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p ) ){ return 0; - else { - int result; - char username[NAME_LENGTH]; - char password[PASSWD_LENGTH]; - unsigned char passhash[16]; - uint8 clienttype; - bool israwpass = (command==0x0064 || command==0x0277 || command==0x02b0 || command == 0x0825); - - // Shinryo: For the time being, just use token as password. - if(command == 0x0825) { - char *accname = RFIFOCP(fd, 9); - char *token = RFIFOCP(fd, 0x5C); - size_t uAccLen = strlen(accname); - size_t uTokenLen = RFIFOREST(fd) - 0x5C; - - if(uAccLen > NAME_LENGTH - 1 || uAccLen == 0 || uTokenLen > NAME_LENGTH - 1 || uTokenLen == 0) - { - logclif_auth_failed(sd, 3); - return 0; - } + } - safestrncpy(username, accname, uAccLen + 1); - safestrncpy(password, token, uTokenLen + 1); - clienttype = RFIFOB(fd, 8); - } - else - { - safestrncpy(username, RFIFOCP(fd,6), NAME_LENGTH); - if( israwpass ) - { - safestrncpy(password, RFIFOCP(fd,30), PASSWD_LENGTH); - clienttype = RFIFOB(fd,54); - } - else - { - memcpy(passhash, RFIFOP(fd,30), 16); - clienttype = RFIFOB(fd,46); - } - } - RFIFOSKIP(fd,RFIFOREST(fd)); // assume no other packet was sent + safestrncpy( sd.userid, p->username, sizeof( sd.userid ) ); + sd.clienttype = p->clienttype; - sd->clienttype = clienttype; - safestrncpy(sd->userid, username, NAME_LENGTH); - if( israwpass ) - { - ShowStatus("Request for connection of %s (ip: %s)\n", sd->userid, ip); - safestrncpy(sd->passwd, password, PASSWD_LENGTH); - if( login_config.use_md5_passwds ) - MD5_String(sd->passwd, sd->passwd); - sd->passwdenc = 0; - } - else - { - ShowStatus("Request for connection (passwdenc mode) of %s (ip: %s)\n", sd->userid, ip); - bin2hex(sd->passwd, passhash, 16); // raw binary data here! - sd->passwdenc = PASSWORDENC; - } + ShowStatus( "Request for connection of %s (ip: %s)\n", sd.userid, ip ); + safestrncpy( sd.passwd, p->password, PASSWD_LENGTH ); - if( sd->passwdenc != 0 && login_config.use_md5_passwds ) - { - logclif_auth_failed(sd, 3); // send "rejected from server" - return 0; - } + if( login_config.use_md5_passwds ){ + MD5_String( sd.passwd, sd.passwd ); + } - result = login_mmo_auth(sd, false); + sd.passwdenc = 0; - if( result == -1 ) - logclif_auth_ok(sd); - else - logclif_auth_failed(sd, result); + RFIFOSKIP( fd, sizeof( *p ) ); + + int result = login_mmo_auth( &sd, false ); + + if( result == -1 ){ + logclif_auth_ok( &sd ); + }else{ + logclif_auth_failed( &sd, result ); + } + + return 1; +} + +template +int logclif_parse_reqauth_md5( int fd, login_session_data& sd, char* ip ){ + P* p = (P*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p ) ){ + return 0; + } + + safestrncpy( sd.userid, p->username, sizeof( sd.userid ) ); + sd.clienttype = p->clienttype; + + ShowStatus( "Request for connection (passwdenc mode) of %s (ip: %s)\n", sd.userid, ip ); + bin2hex( sd.passwd, p->passwordMD5, sizeof( p->passwordMD5 ) ); // raw binary data here! + + sd.passwdenc = PASSWORDENC; + + RFIFOSKIP( fd, sizeof( *p ) ); + + if( login_config.use_md5_passwds ){ + logclif_auth_failed( &sd, 3 ); // send "rejected from server" + return 0; + } + + int result = login_mmo_auth( &sd, false ); + + if( result == -1 ){ + logclif_auth_ok( &sd ); + }else{ + logclif_auth_failed( &sd, result ); } + + return 1; +} + +template +int logclif_parse_reqauth_sso( int fd, login_session_data& sd, char* ip ){ + P* p = (P*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p ) ){ + return 0; + } + + if( RFIFOREST( fd ) < p->packetLength ){ + return 0; + } + + size_t token_length = p->packetLength - sizeof( *p ); + + safestrncpy( sd.userid, p->username, sizeof( sd.userid ) ); + sd.clienttype = p->clienttype; + + ShowStatus( "Request for connection (SSO mode) of %s (ip: %s)\n", sd.userid, ip ); + // Shinryo: For the time being, just use token as password. + safestrncpy( sd.passwd, p->token, token_length ); + + if( login_config.use_md5_passwds ){ + MD5_String( sd.passwd, sd.passwd ); + } + + sd.passwdenc = 0; + + RFIFOSKIP( fd, sizeof( *p ) ); + + int result = login_mmo_auth( &sd, false ); + + if( result == -1 ){ + logclif_auth_ok( &sd ); + }else{ + logclif_auth_failed( &sd, result ); + } + return 1; } @@ -375,17 +389,25 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm * @return 1 success */ static int logclif_parse_reqkey(int fd, struct login_session_data *sd){ - RFIFOSKIP(fd,2); - { - sd->md5keylen = sizeof( sd->md5key ); - MD5_Salt(sd->md5keylen, sd->md5key); - - WFIFOHEAD(fd,4 + sd->md5keylen); - WFIFOW(fd,0) = 0x01dc; - WFIFOW(fd,2) = 4 + sd->md5keylen; - memcpy(WFIFOP(fd,4), sd->md5key, sd->md5keylen); - WFIFOSET(fd,WFIFOW(fd,2)); + PACKET_CA_REQ_HASH* p_in = (PACKET_CA_REQ_HASH*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p_in ) ){ + return 0; } + + RFIFOSKIP( fd, sizeof( *p_in ) ); + + sd->md5keylen = sizeof( sd->md5key ); + MD5_Salt( sd->md5keylen, sd->md5key ); + + PACKET_AC_ACK_HASH* p_out = (PACKET_AC_ACK_HASH*)packet_buffer; + + p_out->packetType = HEADER_AC_ACK_HASH; + p_out->packetLength = sizeof( *p_out ) + sd->md5keylen; + strncpy( p_out->salt, sd->md5key, sd->md5keylen ); + + socket_send( fd, p_out ); + return 1; } @@ -464,15 +486,23 @@ static int logclif_parse_reqcharconnec(int fd, struct login_session_data *sd, ch } int logclif_parse_otp_login( int fd, struct login_session_data* sd ){ - RFIFOSKIP( fd, 68 ); + PACKET_CT_AUTH* p_in = (PACKET_CT_AUTH*)RFIFOP( fd, 0 ); + + if( RFIFOREST( fd ) < sizeof( *p_in ) ){ + return 0; + } + + RFIFOSKIP( fd, sizeof( *p_in ) ); + + PACKET_TC_RESULT p_out = {}; + + p_out.packetType = HEADER_TC_RESULT; + p_out.packetLength = sizeof( p_out ); + p_out.type = 0; // normal login + safestrncpy( p_out.unknown1, "S1000", sizeof( p_out.unknown1 ) ); + safestrncpy( p_out.unknown2, "token", sizeof( p_out.unknown2 ) ); - WFIFOHEAD( fd, 34 ); - WFIFOW( fd, 0 ) = 0xae3; - WFIFOW( fd, 2 ) = 34; - WFIFOL( fd, 4 ) = 0; // normal login - safestrncpy( WFIFOCP( fd, 8 ), "S1000", 6 ); - safestrncpy( WFIFOCP( fd, 28 ), "token", 6 ); - WFIFOSET( fd, 34 ); + socket_send( fd, p_out ); return 1; } @@ -497,17 +527,15 @@ int logclif_parse(int fd) { return 0; } - if( sd == NULL ) - { + if( sd == nullptr ){ // Perform ip-ban check if( login_config.ipban && ipban_check(ipl) ) { ShowStatus("Connection refused: IP isn't authorised (deny/allow, ip: %s).\n", ip); login_log(ipl, "unknown", -3, "ip banned"); - WFIFOHEAD(fd,23); - WFIFOW(fd,0) = 0x6a; - WFIFOB(fd,2) = 3; // 3 = Rejected from Server - WFIFOSET(fd,23); + + logclif_auth_failed( fd, 3 ); // 3 = Rejected from Server + set_eof(fd); return 0; } @@ -522,35 +550,59 @@ int logclif_parse(int fd) { uint16 command = RFIFOW(fd,0); int next=1; - switch( command ) - { - // New alive packet: used to verify if client is always alive. - case 0x0200: next = logclif_parse_keepalive(fd); break; - // client md5 hash (binary) - case 0x0204: next = logclif_parse_updclhash(fd,sd); break; - // request client login (raw password) - case 0x0064: // S 0064 .L .24B .24B .B - case 0x0277: // S 0277 .L .24B .24B .B .16B .13B - case 0x02b0: // S 02b0 .L .24B .24B .B .16B .13B .B - // request client login (md5-hashed password) - case 0x01dd: // S 01dd .L .24B .16B .B - case 0x01fa: // S 01fa .L .24B .16B .B .B(index of the connection in the clientinfo file (+10 if the command-line contains "pc")) - case 0x027c: // S 027c .L .24B .16B .B .13B(junk) - case 0x0825: // S 0825 .W .L .B .24B .27B .17B .15B .(packetsize - 0x5C)B - next = logclif_parse_reqauth(fd, sd, command, ip); - break; - // Sending request of the coding key - case 0x01db: next = logclif_parse_reqkey(fd, sd); break; - // OTP token login - case 0x0acf: - next = logclif_parse_otp_login( fd, sd ); - break; - // Connection request of a char-server - case 0x2710: logclif_parse_reqcharconnec(fd,sd, ip); return 0; // processing will continue elsewhere - default: - ShowNotice("Abnormal end of connection (ip: %s): Unknown packet 0x%x\n", ip, command); - set_eof(fd); - return 0; + switch( command ){ + // New alive packet: used to verify if client is always alive. + case HEADER_CA_CONNECT_INFO_CHANGED: + next = logclif_parse_keepalive( fd ); + break; + // client md5 hash (binary) + case HEADER_CA_EXE_HASHCHECK: + next = logclif_parse_updclhash( fd, sd ); + break; + // request client login (raw password) + case HEADER_CA_LOGIN: + // S 0064 .L .24B .24B .B + next = logclif_parse_reqauth_raw( fd, *sd, ip ); + break; + case HEADER_CA_LOGIN_PCBANG: + // S 0277 .L .24B .24B .B .16B .13B + next = logclif_parse_reqauth_raw( fd, *sd, ip ); + break; + case HEADER_CA_LOGIN_CHANNEL: + // S 02b0 .L .24B .24B .B .16B .13B .B + next = logclif_parse_reqauth_raw( fd, *sd, ip ); + break; + // request client login (md5-hashed password) + case HEADER_CA_LOGIN2: + // S 01dd .L .24B .16B .B + next = logclif_parse_reqauth_md5( fd, *sd, ip ); + break; + case HEADER_CA_LOGIN3: + // S 01fa .L .24B .16B .B .B(index of the connection in the clientinfo file (+10 if the command-line contains "pc")) + next = logclif_parse_reqauth_md5( fd, *sd, ip ); + break; + case HEADER_CA_LOGIN4: + // S 027c .L .24B .16B .B .13B + next = logclif_parse_reqauth_md5( fd, *sd, ip ); + break; + case HEADER_CA_SSO_LOGIN_REQ: + // S 0825 .W .L .B .24B .27B .17B .15B .?B + next = logclif_parse_reqauth_sso( fd, *sd, ip ); + break; + // Sending request of the coding key + case HEADER_CA_REQ_HASH: + next = logclif_parse_reqkey( fd, sd ); + break; + // OTP token login + case HEADER_CT_AUTH: + next = logclif_parse_otp_login( fd, sd ); + break; + // Connection request of a char-server + case 0x2710: logclif_parse_reqcharconnec(fd,sd, ip); return 0; // processing will continue elsewhere + default: + ShowNotice("Abnormal end of connection (ip: %s): Unknown packet 0x%x\n", ip, command); + set_eof(fd); + return 0; } if(next==0) return 0; // avoid processing of followup packets (prev was probably incomplete) } diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 647fc9d84b..6e59564d59 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -81,9 +81,6 @@ static inline int32 client_exp(t_exp exp) { static struct eri *delay_clearunit_ers; struct s_packet_db packet_db[MAX_PACKET_DB + 1]; -// Reuseable global packet buffer to prevent too many allocations -// Take socket.cpp::socket_max_client_packet into consideration -static int8 packet_buffer[UINT16_MAX]; unsigned long color_table[COLOR_MAX]; #include "clif_obfuscation.hpp" From 11e50dec4191d57164af266accb54c023746cd3b Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 29 Dec 2023 22:54:14 +0100 Subject: [PATCH 04/33] Rebalance cardinal 20221221 (#8021) * Framen - Increases base damage from 4000%/4500%Matk to 4750%/5250%Matk based on level 5. * Arbitrium - Reduces cooldown from 1.5 seconds to 1 second. - Increases SP consumption from 112 to 125 based on level 10. - Applies AP recovery rate by 2. - Increases base damage of area damage from 12500%Matk to 17500%Matk based on level 10. - Increases factor weight of Fidus Animus skill level in skill formula of area damage from 100 to 500 based on level 10. - Increases factor weight of SPL in skill formula from 7 to 10. * Petitio - Reduces area of effect from 9 x 9 cells to 7 x 7 cells based on level 10. - Increases factor weight of Mace & Book Mastery skill level in skill formula from 100 to 500 based on level 10. --- db/re/skill_db.yml | 31 ++++++++++++++++--------------- src/map/battle.cpp | 10 +++++----- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 71c57fd801..476fad850e 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -37360,34 +37360,35 @@ Body: Hit: Single HitCount: 1 Element: Holy + GiveAp: 2 CastCancel: true CastTime: 2000 AfterCastActDelay: 500 Duration1: 20000 - Cooldown: 1500 + Cooldown: 1000 FixedCastTime: 1000 Requires: SpCost: - Level: 1 - Amount: 94 + Amount: 107 - Level: 2 - Amount: 96 + Amount: 109 - Level: 3 - Amount: 98 + Amount: 111 - Level: 4 - Amount: 100 + Amount: 113 - Level: 5 - Amount: 102 + Amount: 115 - Level: 6 - Amount: 104 + Amount: 117 - Level: 7 - Amount: 106 + Amount: 119 - Level: 8 - Amount: 108 + Amount: 121 - Level: 9 - Amount: 110 + Amount: 123 - Level: 10 - Amount: 112 + Amount: 125 Status: HandicapState_DeepSilence - Id: 5274 Name: CD_ARBITRIUM_ATK @@ -37715,19 +37716,19 @@ Body: - Level: 3 Area: 1 - Level: 4 - Area: 2 + Area: 1 - Level: 5 Area: 2 - Level: 6 Area: 2 - Level: 7 - Area: 3 + Area: 2 - Level: 8 - Area: 3 + Area: 2 - Level: 9 Area: 3 - Level: 10 - Area: 4 + Area: 3 GiveAp: 3 CastCancel: true AfterCastActDelay: 500 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 28ea528733..1528c69d1d 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5524,7 +5524,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case CD_PETITIO: - skillratio += -100 + (1050 + pc_checkskill(sd,CD_MACE_BOOK_M) * 10) * skill_lv + 5 * sstatus->pow; + skillratio += -100 + (1050 + pc_checkskill(sd,CD_MACE_BOOK_M) * 50) * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case SHC_DANCING_KNIFE: @@ -7999,13 +7999,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case CD_ARBITRIUM: - skillratio += -100 + 1000 * skill_lv + 7 * sstatus->spl; + skillratio += -100 + 1000 * skill_lv + 10 * sstatus->spl; skillratio += 10 * pc_checkskill( sd, CD_FIDUS_ANIMUS ) * skill_lv; RE_LVL_DMOD(100); break; case CD_ARBITRIUM_ATK: - skillratio += -100 + 1250 * skill_lv + 7 * sstatus->spl; - skillratio += 10 * pc_checkskill( sd, CD_FIDUS_ANIMUS ) * skill_lv; + skillratio += -100 + 1750 * skill_lv + 10 * sstatus->spl; + skillratio += 50 * pc_checkskill( sd, CD_FIDUS_ANIMUS ) * skill_lv; RE_LVL_DMOD(100); break; case CD_PNEUMATICUS_PROCELLA: @@ -8018,7 +8018,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case CD_FRAMEN: - skillratio += -100 + (800 + 5 * pc_checkskill(sd,CD_FIDUS_ANIMUS)) * skill_lv + 5 * sstatus->spl; + skillratio += -100 + (950 + 5 * pc_checkskill(sd,CD_FIDUS_ANIMUS)) * skill_lv + 5 * sstatus->spl; if (tstatus->race == RC_UNDEAD || tstatus->race == RC_DEMON) skillratio += 100 * skill_lv; RE_LVL_DMOD(100); From 23766e61c3908b97dd664f7c40f3e484fe225d2a Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 29 Dec 2023 23:57:52 +0100 Subject: [PATCH 05/33] Rebalance Windhawk 20221221 (#8020) * No Limits (Ranger) - No longer be removed by Dispell or Clearance. * Calamity Gale - Increases duration from 60 seconds to 180 seconds. - Reduces cooldown from 300 seconds to 180 seconds. Note: it was not implemented - No longer be removed when using No Limits. * Gale Storm - Reduces cooldown from 1.5 seconds to 1.2 seconds. - Increases SP consumption from 100 to 120 based on level 10. - Increases base damage from 9500%Atk to 10000%Atk based on level 5. - Reduces area of effect from 11 x 11 cells to 9 x 9 cells based on level 10. Note: CON weight was already 10 - Increases factor weight of CON in skill formula from 5 to 10. * Crescive Bolt - Increases cooldown from 0.15 seconds to 0.35 seconds. - Increases global cool time from 0.3 seconds to 0.7 seconds. - Increases base damage from 3400%Atk to 9400%Atk based on level 10. Additionnally - Removed leftover Deep Blind Trap / Solid Trap / Swift Trap / Flame Trap status ailments in `skills_db.yml` (from previous rebalance) - Corrected WH HAWK BOOMERANG and WH_HAWKBOOMERANG formula according to the Korean description of the skill. - Included WH_NATUREFRIENDLY in the damage formula of WH_HAWKRUSH and WH_HAWKBOOMERANG (x1.5 at level 5) (source: tests on KRO) Thanks to @datawulf --- db/re/skill_db.yml | 45 +++++++++++++++++++++++++-------------------- db/re/status.yml | 8 +++++--- src/map/battle.cpp | 12 ++++++++---- 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 476fad850e..031ca7c5da 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -39202,8 +39202,8 @@ Body: HitCount: 1 CastCancel: true AfterCastActDelay: 500 - Duration1: 60000 - Cooldown: 300000 + Duration1: 180000 + Cooldown: 180000 FixedCastTime: 1000 Requires: SpCost: 300 @@ -39260,38 +39260,38 @@ Body: - Level: 7 Area: 3 - Level: 8 - Area: 4 + Area: 3 - Level: 9 Area: 4 - Level: 10 - Area: 5 + Area: 4 CastCancel: true CastTime: 3500 AfterCastActDelay: 500 - Cooldown: 1500 + Cooldown: 1200 FixedCastTime: 500 Requires: SpCost: - Level: 1 - Amount: 64 + Amount: 93 - Level: 2 - Amount: 68 + Amount: 96 - Level: 3 - Amount: 72 + Amount: 99 - Level: 4 - Amount: 76 + Amount: 102 - Level: 5 - Amount: 80 + Amount: 105 - Level: 6 - Amount: 84 + Amount: 108 - Level: 7 - Amount: 88 + Amount: 111 - Level: 8 - Amount: 92 + Amount: 114 - Level: 9 - Amount: 96 + Amount: 117 - Level: 10 - Amount: 100 + Amount: 120 Weapon: Bow: true Ammo: @@ -39305,6 +39305,8 @@ Body: TargetType: Ground DamageFlags: IgnoreFlee: true + Flags: + AllowOnWarg: true Range: 1 Hit: Single HitCount: 1 @@ -39368,7 +39370,6 @@ Body: Flag: NoOverlap: true PathCheck: true - Status: Handicapstate_Deepblind - Id: 5332 Name: WH_SOLIDTRAP Description: Solid Trap @@ -39377,6 +39378,8 @@ Body: TargetType: Ground DamageFlags: IgnoreFlee: true + Flags: + AllowOnWarg: true Range: 1 Hit: Single HitCount: 1 @@ -39422,7 +39425,6 @@ Body: ItemCost: - Item: Special_Alloy_Trap Amount: 2 - Status: HandicapState_Crystallization Unit: Id: Solidtrap Range: @@ -39449,6 +39451,8 @@ Body: TargetType: Ground DamageFlags: IgnoreFlee: true + Flags: + AllowOnWarg: true Range: 1 Hit: Single HitCount: 1 @@ -39494,7 +39498,6 @@ Body: ItemCost: - Item: Special_Alloy_Trap Amount: 2 - Status: HandicapState_LightningStrike Unit: Id: Swifttrap Range: @@ -39528,9 +39531,10 @@ Body: GiveAp: 1 CastCancel: true CastTime: 800 - AfterCastActDelay: 300 + AfterCastActDelay: 700 Duration1: 10000 FixedCastTime: 200 + Cooldown: 350 Requires: SpCost: - Level: 1 @@ -39567,6 +39571,8 @@ Body: TargetType: Ground DamageFlags: IgnoreFlee: true + Flags: + AllowOnWarg: true Range: 1 Hit: Single HitCount: 1 @@ -39630,7 +39636,6 @@ Body: Flag: NoOverlap: true PathCheck: true - Status: HandicapState_Conflagration - Id: 5336 Name: BO_BIONIC_PHARMACY Description: Bionic Pharmacy diff --git a/db/re/status.yml b/db/re/status.yml index e62d4aaf35..fc9c373dd3 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -5732,6 +5732,8 @@ Body: DurationLookup: RA_UNLIMIT Flags: DisplayPc: true + NoDispell: true + NoClearance: true - Status: Kings_Grace Icon: EFST_KINGS_GRACE DurationLookup: LG_KINGS_GRACE @@ -7633,7 +7635,7 @@ Body: RemoveOnDamaged: true - Status: Handicapstate_Lightningstrike Icon: EFST_HANDICAPSTATE_LIGHTNINGSTRIKE - DurationLookup: WH_SWIFTTRAP + DurationLookup: EM_LIGHTNING_LAND States: #NoMove: true #NoCast: true @@ -7646,7 +7648,7 @@ Body: RemoveOnDamaged: true - Status: Handicapstate_Crystallization Icon: EFST_HANDICAPSTATE_CRYSTALLIZATION - DurationLookup: WH_SOLIDTRAP + DurationLookup: EM_TERRA_DRIVE States: #NoMove: true #NoCast: true @@ -7660,7 +7662,7 @@ Body: RemoveOnDamaged: true - Status: Handicapstate_Conflagration Icon: EFST_HANDICAPSTATE_CONFLAGRATION - DurationLookup: WH_FLAMETRAP + DurationLookup: EM_CONFLAGRATION Flags: BlEffect: true DisplayPc: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 1528c69d1d..bac738b533 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5627,22 +5627,26 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case WH_HAWKRUSH: skillratio += -100 + 500 * skill_lv + 5 * sstatus->con; + if (sd) + skillratio += skillratio * pc_checkskill(sd, WH_NATUREFRIENDLY) / 10; RE_LVL_DMOD(100); break; - case WH_HAWKBOOMERANG:// Affected by trait stats??? CON for sure but the other one unknown. Likely POW. [Rytech] - skillratio += -100 + 600 * skill_lv + 10 * sstatus->pow + 10 * sstatus->con; + case WH_HAWKBOOMERANG: + skillratio += -100 + 600 * skill_lv + 10 * sstatus->con; + if (sd) + skillratio += skillratio * pc_checkskill(sd, WH_NATUREFRIENDLY) / 10; if (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH) skillratio += skillratio * 50 / 100; RE_LVL_DMOD(100); break; case WH_GALESTORM: - skillratio += -100 + 950 * skill_lv + 10 * sstatus->con; + skillratio += -100 + 1000 * skill_lv + 10 * sstatus->con; RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_CALAMITYGALE) && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH)) skillratio += skillratio * 50 / 100; break; case WH_CRESCIVE_BOLT: - skillratio += -100 + 340 * skill_lv + 5 * sstatus->con; + skillratio += -100 + 400 + 900 * skill_lv + 5 * sstatus->con; RE_LVL_DMOD(100); if (sc) { if (sc->getSCE(SC_CRESCIVEBOLT)) From 756abe34d53068c6743dfd0378df7c36b1125422 Mon Sep 17 00:00:00 2001 From: Atemo Date: Sat, 30 Dec 2023 14:52:34 +0100 Subject: [PATCH 06/33] Rebalance Arch mage 20221221 (#8065) * Rain of Crystal - Reduces area of effect from 19 x 19 cells to 13 x 13 cells based on level 5. - Increases SP consumption from 100 to 125 based on level 5. * Crimson Arrow - Reduces SP consumption from 94 to 90 based on level 5. - Increases base damage of linear damage from 1500%Matk to 1750%Matk based on level 5. - Increases base damage of explosion damage from 3000%Matk to 3500%Matk based on level 5. * Storm Cannon - Reduces SP consumption from 94 to 88 based on level 5. - Increases base damage from 4750%/6250%Matk to 6000%/7500%Matk based on level 5. * Rock Down - Reduces SP consumption from 94 to 88 based on level 5. - Increases base damage from 4750%/6250%Matk to 6000%/7500%Matk based on level 5. * Frozen Slash - Increases SP consumption from 96 to 115 based on level 5. - Increases base damage from 4750%/6650%Matk to 4900%/6800%Matk based on level 5. * Destructive Hurricane - Increases cooldown from 2 seconds to 2.5 seconds. - Increases base damage from 14250%Matk to 14850%Matk based on level 5. - Reduces damage bonus from Climax level 3 from 200% to 150%. - Changes damage modifier from Climax level 5 from 50% increasing to 20% reducing. - Increases SP consumption from 132 to 186 based on level 5. * Crystal Impact - Reduces area of effect from 15 x 15 cells to 13 x 13 cells based on level 5. - Increases SP consumption from 132 to 186 based on level 5. - Reduces area of effect bonus from Climax level 5 from entire screen to 15 x 15 cells. Co-authored-by: Lemongrass3110 --- db/re/skill_db.yml | 86 +++++++++++++++++++++++----------------------- src/map/battle.cpp | 16 ++++----- src/map/skill.cpp | 2 +- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 031ca7c5da..897c4c57cf 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -35414,20 +35414,20 @@ Body: CastTime: 4000 AfterCastActDelay: 500 Duration2: 900000 - Cooldown: 2000 + Cooldown: 2500 FixedCastTime: 1500 Requires: SpCost: - Level: 1 - Amount: 108 + Amount: 170 - Level: 2 - Amount: 114 + Amount: 174 - Level: 3 - Amount: 120 + Amount: 178 - Level: 4 - Amount: 126 + Amount: 182 - Level: 5 - Amount: 132 + Amount: 186 Status: Climax_Des_Hu - Id: 5216 Name: AG_RAIN_OF_CRYSTAL @@ -35447,28 +35447,28 @@ Body: Requires: SpCost: - Level: 1 - Amount: 84 + Amount: 85 - Level: 2 - Amount: 88 + Amount: 95 - Level: 3 - Amount: 92 + Amount: 105 - Level: 4 - Amount: 96 + Amount: 115 - Level: 5 - Amount: 100 + Amount: 125 Unit: Id: Rain_Of_Crystal Range: - Level: 1 - Size: 6 + Size: 4 - Level: 2 - Size: 7 + Size: 4 - Level: 3 - Size: 8 + Size: 5 - Level: 4 - Size: 9 + Size: 5 - Level: 5 - Size: 10 + Size: 6 Interval: 500 Target: Enemy Flag: @@ -35838,15 +35838,15 @@ Body: Element: Water SplashArea: - Level: 1 - Area: 3 + Area: 4 - Level: 2 Area: 4 - Level: 3 Area: 5 - Level: 4 - Area: 6 + Area: 5 - Level: 5 - Area: 7 + Area: 6 CastCancel: true CastTime: 4000 AfterCastActDelay: 500 @@ -35856,15 +35856,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 100 + Amount: 170 - Level: 2 - Amount: 108 + Amount: 174 - Level: 3 - Amount: 116 + Amount: 178 - Level: 4 - Amount: 124 + Amount: 182 - Level: 5 - Amount: 132 + Amount: 186 Status: Climax_CryImp - Id: 5226 Name: AG_CRYSTAL_IMPACT_ATK @@ -36117,15 +36117,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 68 + Amount: 72 - Level: 2 - Amount: 74 + Amount: 76 - Level: 3 Amount: 80 - Level: 4 - Amount: 86 + Amount: 84 - Level: 5 - Amount: 92 + Amount: 88 - Id: 5234 Name: AG_STORM_CANNON Description: Storm Cannon @@ -36157,15 +36157,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 78 + Amount: 79 - Level: 2 - Amount: 82 + Amount: 79 - Level: 3 - Amount: 86 + Amount: 82 - Level: 4 - Amount: 90 + Amount: 85 - Level: 5 - Amount: 94 + Amount: 88 - Id: 5235 Name: AG_CRIMSON_ARROW Description: Crimson Arrow @@ -36197,15 +36197,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 86 + Amount: 74 - Level: 2 - Amount: 88 + Amount: 78 - Level: 3 - Amount: 90 + Amount: 82 - Level: 4 - Amount: 92 + Amount: 86 - Level: 5 - Amount: 94 + Amount: 90 - Id: 5236 Name: AG_CRIMSON_ARROW_ATK Description: Crimson Arrow Attack @@ -36262,15 +36262,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 84 + Amount: 103 - Level: 2 - Amount: 87 + Amount: 106 - Level: 3 - Amount: 90 + Amount: 109 - Level: 4 - Amount: 93 + Amount: 112 - Level: 5 - Amount: 96 + Amount: 115 - Id: 5238 Name: IQ_POWERFUL_FAITH Description: Powerful Faith diff --git a/src/map/battle.cpp b/src/map/battle.cpp index bac738b533..aeece130fd 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -7863,14 +7863,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case AG_DESTRUCTIVE_HURRICANE: - skillratio += -100 + 250 + 2800 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 600 + 2850 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_CLIMAX)) { if (sc->getSCE(SC_CLIMAX)->val1 == 3) - skillratio *= 3; + skillratio += skillratio * 150 / 100; else if (sc->getSCE(SC_CLIMAX)->val1 == 5) - skillratio += skillratio * 50 / 100; + skillratio -= skillratio * 20 / 100; } break; case AG_RAIN_OF_CRYSTAL: @@ -7951,7 +7951,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case AG_ROCK_DOWN: - skillratio += -100 + 950 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 1200 * skill_lv + 5 * sstatus->spl; if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){ skillratio += 300 * skill_lv; @@ -7960,7 +7960,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case AG_STORM_CANNON: - skillratio += -100 + 950 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 1200 * skill_lv + 5 * sstatus->spl; if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){ skillratio += 300 * skill_lv; @@ -7969,15 +7969,15 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case AG_CRIMSON_ARROW: - skillratio += -100 + 300 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 350 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; case AG_CRIMSON_ARROW_ATK: - skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; case AG_FROZEN_SLASH: - skillratio += -100 + 250 + 900 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 400 + 900 * skill_lv + 5 * sstatus->spl; if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){ skillratio += 150 + 350 * skill_lv; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 1d2e8734b4..af15215c03 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -7991,7 +7991,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_id == AG_DESTRUCTIVE_HURRICANE) splash_size = 9; // 19x19 else if(skill_id == AG_CRYSTAL_IMPACT) - splash_size = AREA_SIZE; // 29x29 - Entire screen. + splash_size = 7; // 15x15 } skill_area_temp[1] = 0; From fe9c959bf0beb229723d9a34afa663d7a5a5c034 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Sat, 30 Dec 2023 19:07:38 +0100 Subject: [PATCH 07/33] Removed flag parameter for MC_IDENTIFY (#8070) Fixes #7634 Thanks to @OptimusM and @laziem --- db/re/item_db_equip.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index ad6ad7fb7d..8ea256440e 100644 --- a/db/re/item_db_equip.yml +++ b/db/re/item_db_equip.yml @@ -78196,7 +78196,7 @@ Body: .@d = readparam(bInt)/18; .@e = readparam(bDex)/18; .@f = readparam(bLuk)/18; - skill "MC_IDENTIFY",1,0; + skill "MC_IDENTIFY",1; bonus bHit,2*.@a; bonus bMaxHPrate,2*.@a; bonus bFlee,2*.@b; @@ -96939,7 +96939,7 @@ Body: EquipLevelMin: 100 View: 1093 Script: | - skill "MC_IDENTIFY",1,0; + skill "MC_IDENTIFY",1; .@a = readparam(bStr); .@b = readparam(bAgi); .@c = readparam(bVit); @@ -96971,7 +96971,7 @@ Body: ArmorLevel: 1 EquipLevelMin: 100 Script: | - skill "MC_IDENTIFY",1,0; + skill "MC_IDENTIFY",1; .@a = readparam(bStr); .@b = readparam(bAgi); .@c = readparam(bVit); From 3756872529144ce053a9c6e36dad4096963c8d8f Mon Sep 17 00:00:00 2001 From: Vincent Stumpf Date: Sat, 30 Dec 2023 18:26:53 -0800 Subject: [PATCH 08/33] Fix token auth packet handling (#8071) It should skip the entire packet --- src/login/loginclif.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/login/loginclif.cpp b/src/login/loginclif.cpp index 7155891a00..fc8c58c1b3 100644 --- a/src/login/loginclif.cpp +++ b/src/login/loginclif.cpp @@ -361,7 +361,7 @@ int logclif_parse_reqauth_sso( int fd, login_session_data& sd, char* ip ){ ShowStatus( "Request for connection (SSO mode) of %s (ip: %s)\n", sd.userid, ip ); // Shinryo: For the time being, just use token as password. - safestrncpy( sd.passwd, p->token, token_length ); + safestrncpy( sd.passwd, p->token, token_length + 1 ); if( login_config.use_md5_passwds ){ MD5_String( sd.passwd, sd.passwd ); @@ -369,7 +369,7 @@ int logclif_parse_reqauth_sso( int fd, login_session_data& sd, char* ip ){ sd.passwdenc = 0; - RFIFOSKIP( fd, sizeof( *p ) ); + RFIFOSKIP( fd, p->packetLength ); int result = login_mmo_auth( &sd, false ); From 1c31d9c83eaec7a9f70e2d1af1378f8749b18e74 Mon Sep 17 00:00:00 2001 From: Vincent Stumpf Date: Mon, 1 Jan 2024 10:05:21 -0800 Subject: [PATCH 09/33] Make the global packet_buffer owned by common (#8073) --- src/common/socket.cpp | 4 ++++ src/common/socket.hpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/socket.cpp b/src/common/socket.cpp index c273840ee1..ef8d167502 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -47,6 +47,10 @@ #include "strlib.hpp" #include "timer.hpp" +// Reuseable global packet buffer to prevent too many allocations +// Take socket.cpp::socket_max_client_packet into consideration +int8 packet_buffer[UINT16_MAX]; + ///////////////////////////////////////////////////////////////////// #if defined(WIN32) ///////////////////////////////////////////////////////////////////// diff --git a/src/common/socket.hpp b/src/common/socket.hpp index c072ee399c..13664a1ea5 100644 --- a/src/common/socket.hpp +++ b/src/common/socket.hpp @@ -201,7 +201,7 @@ void send_shortlist_do_sends(); // Reuseable global packet buffer to prevent too many allocations // Take socket.cpp::socket_max_client_packet into consideration -static int8 packet_buffer[UINT16_MAX]; +extern int8 packet_buffer[UINT16_MAX]; template bool socket_send( int fd, P& packet ){ From f22e423677f86b4d3080e1ffee5dbfd5d1690058 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 2 Jan 2024 14:32:39 +0100 Subject: [PATCH 10/33] Rebalance Imperial Guard 20221221 (#8078) * Cross Rain - Reduces cooldown from 4.5 seconds to 2.4 seconds. - Reduces skill duration from 4.5 seconds to 2.4 seconds based on level 10. - Increases factor weight of Spear & Sword Mastery skill level in skill formula from 50/100 (Holy Shield) to 100/150 (Holy Shield) based on level 10. - Increases factor weight of SPL in skill formula from 5 to 7. - Reduces AP recovery rate from 7 to 4. * Shield Shooting - Reworks skill to dealing damage to surrounding enemies within 7 x 7 cells around the target. - Reduces cast range from 11 cells to 9 cells. - Increases factor weight of Shield Mastery skill level in skill formula from 75 to 250 based on level 5. - Increases base damage from 11900%Atk to 14900%Atk based on level 5. - Increases factor weight of POW in skill formula from 5 to 7. - Increases factor weight of shield refine rate in skill formula from 4 to 25. --- db/re/skill_db.yml | 19 ++++++++++++++++--- src/map/battle.cpp | 17 ++++++++++------- src/map/skill.cpp | 11 +++++------ 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 897c4c57cf..16998dcb44 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -37057,11 +37057,24 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack + DamageFlags: + Splash: true Range: 9 Hit: Multi_Hit HitCount: -7 Element: Weapon GiveAp: 3 + SplashArea: + - Level: 1 + Area: 2 + - Level: 2 + Area: 2 + - Level: 3 + Area: 2 + - Level: 4 + Area: 3 + - Level: 5 + Area: 3 CastCancel: true CastTime: 500 AfterCastActDelay: 500 @@ -37137,12 +37150,12 @@ Body: Hit: Single HitCount: 1 Element: Holy - GiveAp: 7 + GiveAp: 4 CastCancel: true CastTime: 1000 AfterCastActDelay: 150 - Duration1: 4500 - Cooldown: 4500 + Duration1: 2400 + Cooldown: 2400 FixedCastTime: 1500 Requires: SpCost: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index aeece130fd..ef94121760 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5496,20 +5496,23 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * i / 100; break; case IG_SHIELD_SHOOTING: - skillratio += -100 + 1400 + 2100 * skill_lv + 5 * sstatus->pow; - skillratio += skill_lv * 15 * pc_checkskill( sd, IG_SHIELD_MASTERY ); + skillratio += -100 + 650 + 2850 * skill_lv; + skillratio += 7 * sstatus->pow; + skillratio += skill_lv * 50 * pc_checkskill( sd, IG_SHIELD_MASTERY ); if (sd) { // Damage affected by the shield's weight and refine. Need official formula. [Rytech] short index = sd->equip_index[EQI_HAND_L]; if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) { skillratio += (sd->inventory_data[index]->weight * 7 / 6) / 10; - skillratio += sd->inventory.u.items_inventory[index].refine * 4; + skillratio += sd->inventory.u.items_inventory[index].refine * 25; } } RE_LVL_DMOD(100); break; case IG_OVERSLASH: - skillratio += -100 + (120 + pc_checkskill(sd, IG_SPEAR_SWORD_M) * 10) * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 160 * skill_lv; + skillratio += pc_checkskill(sd, IG_SPEAR_SWORD_M) * 25 * skill_lv; + skillratio += 7 * sstatus->pow; RE_LVL_DMOD(100); if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0) skillratio += skillratio * i / 100; @@ -7995,11 +7998,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case IG_CROSS_RAIN: if( sc && sc->getSCE( SC_HOLY_S ) ){ - skillratio += -100 + ( 450 + 10 * pc_checkskill( sd, IG_SPEAR_SWORD_M ) ) * skill_lv; + skillratio += -100 + ( 450 + 15 * pc_checkskill( sd, IG_SPEAR_SWORD_M ) ) * skill_lv; }else{ - skillratio += -100 + ( 320 + 5 * pc_checkskill( sd, IG_SPEAR_SWORD_M ) ) * skill_lv; + skillratio += -100 + ( 320 + 10 * pc_checkskill( sd, IG_SPEAR_SWORD_M ) ) * skill_lv; } - skillratio += 5 * sstatus->spl; + skillratio += 7 * sstatus->spl; RE_LVL_DMOD(100); break; case CD_ARBITRIUM: diff --git a/src/map/skill.cpp b/src/map/skill.cpp index af15215c03..13f650e490 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5218,12 +5218,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case MT_TRIPLE_LASER: skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); break; - - case IG_SHIELD_SHOOTING: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); - sc_start(src, src, SC_SHIELD_POWER, 100, skill_lv, skill_get_time(skill_id, skill_lv)); - break; case DK_DRAGONIC_AURA: case DK_STORMSLASH: case IG_GRAND_JUDGEMENT: @@ -5681,6 +5675,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case BO_EXPLOSIVE_POWDER: case BO_MAYHEMIC_THORNS: case NPC_WIDECRITICALWOUND: + case IG_SHIELD_SHOOTING: if( flag&1 ) {//Recursive invocation int sflag = skill_area_temp[0] & 0xFFF; int heal = 0; @@ -5877,6 +5872,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint // TODO: does this buff start before or after dealing damage? [Muh] sc_start( src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time2( skill_id, skill_lv ) ); break; + case IG_SHIELD_SHOOTING: + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + sc_start(src, src, SC_SHIELD_POWER, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + break; } // if skill damage should be split among targets, count them From 091a6c5401b4fc5770eadb8561aa7c4c804f4830 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 2 Jan 2024 18:09:03 +0100 Subject: [PATCH 11/33] Rebalance Troubadour & Trouvere 20221221 (#8068) * Rhythm Shooting - Increases cooldown from 0.15 seconds to 0.35 seconds. - Increases base damage from 800%/1400%Atk to 3700%/4550%Atk per hit based on level 5. - Increases factor weight of CON in skill formula from 3 to 5 (7 on targets marked with sound brand). Additionally - The effect from Rhythm Shooting does not remove SC_SOUNDBLEND anymore (written in the skill description) * Metallic Fury - Reworks skill to dealing damage to surrounding enemies around the target (9 x 9 cells based on level 5). - Increases cooldown from 0.3 seconds to 0.4 seconds. - Increases global cool time from 0.3 seconds to 0.5 seconds. - No longer remove sound brand debuff from target. (doesn't mention it changelog but it works) - Increases base damage from 11000%Matk to 13000%/18000%(targets marked with sound brand)Matk based on level 5. - Increases factor weight of SPL in skill formula (on targets marked with sound brand) from 1.5x of Stage Manner skill level to 2x of Stage Manner skill level. --- db/re/skill_db.yml | 7 ++++--- src/map/battle.cpp | 25 ++++++++++++++++--------- src/map/skill.cpp | 21 +-------------------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 16998dcb44..777f8b3234 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -40353,7 +40353,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 350 - Cooldown: 1150 + Cooldown: 350 FixedCastTime: 1000 Requires: SpCost: @@ -40396,10 +40396,11 @@ Body: - Level: 4 Area: 3 - Level: 5 - Area: 3 + Area: 4 GiveAp: 2 CastCancel: true - Cooldown: 300 + AfterCastActDelay: 500 + Cooldown: 400 Requires: SpCost: - Level: 1 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index ef94121760..78fbaae117 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5741,13 +5741,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * } break; case TR_RHYTHMSHOOTING: - skillratio += -100 + 200 + 120 * skill_lv; + skillratio += -100 + 450 + 650 * skill_lv; if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0) - skillratio += 3 * sstatus->con; + skillratio += 5 * sstatus->con; - if (tsc && tsc->getSCE(SC_SOUNDBLEND)) - skillratio += 100 + 100 * skill_lv; + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) { + if (skill_lv == 4) + skillratio += 830; // Typo in skill description ? + else + skillratio += 350 + 100 * skill_lv; + skillratio += 2 * sstatus->con; + } RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { @@ -8044,12 +8049,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += -100 + ( 570 + 20 * pc_checkskill( sd, ABC_MAGIC_SWORD_M ) ) * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; - case TR_METALIC_FURY: { - int area = skill_get_splash(skill_id, skill_lv); - int count = map_forcountinarea(skill_check_bl_sc,target->m,target->x - area,target->y - area,target->x + area,target->y + area,5,BL_MOB,SC_SOUNDBLEND); - skillratio += -100 + (2200 + 300 * count) * skill_lv + 5 * sstatus->spl; - RE_LVL_DMOD(100); + case TR_METALIC_FURY: + skillratio += -100 + 2600 * skill_lv; + // !Todo: skill affected by SPL (without SC_SOUNDBLEND) as well? + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) { + skillratio += 1000 * skill_lv; + skillratio += 2 * pc_checkskill(sd, TR_STAGE_MANNER) * sstatus->spl; } + RE_LVL_DMOD(100); break; case TR_SOUNDBLEND: skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 13f650e490..ec91b3e9d0 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2183,8 +2183,6 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint [[fallthrough]]; case WM_METALICSOUND: case WM_REVERBERATION: - case TR_RHYTHMSHOOTING: - case TR_METALIC_FURY: status_change_end(bl, SC_SOUNDBLEND); break; case EM_DIAMOND_STORM: @@ -5676,6 +5674,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case BO_MAYHEMIC_THORNS: case NPC_WIDECRITICALWOUND: case IG_SHIELD_SHOOTING: + case TR_METALIC_FURY: if( flag&1 ) {//Recursive invocation int sflag = skill_area_temp[0] & 0xFFF; int heal = 0; @@ -5895,24 +5894,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } } break; - case TR_METALIC_FURY: - { - if (flag & 1) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); - } else { - int area = skill_get_splash(skill_id, skill_lv); - int count = map_forcountinarea(skill_check_bl_sc,bl->m,bl->x - area,bl->y - area,bl->x + area,bl->y + area,5,BL_MOB,SC_SOUNDBLEND); - if (count > 0){ - map_foreachinarea(skill_area_sub, bl->m, bl->x - area, bl->y - area, bl->x + area, bl->y + area, BL_CHAR, - src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); - } else{ - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); - } - } - } - break; //Place units around target case NJ_BAKUENRYU: From 2121aa2ed79acd67d85203f0e25a1d5a9c992da9 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 2 Jan 2024 19:07:54 +0100 Subject: [PATCH 12/33] Rebalance Dragon Knight 20221221 (#8077) * Madness Crusher - Reduces SP consumption from 68 to 55 based on level 5. - Increases base damage from 4400%Atk to 8350%Atk based on level 5. - Increases factor weight of POW in skill formula from 7 to 10. * Storm Slash - Increases cooldown from 0.3 seconds to 0.35 seconds. - Reduces SP consumption from 60 to 55 based on level 5. - Increases base damage from 950%Atk to 2200%Atk per hit based on level 5. - Increases the chance to double skill damage while under Giant Growth buff from 30% to 60%. * Hack and Slasher - Increases base damage from 7300%Atk to 7700%Atk per hit based on level 10. - Reduces area of effect from 9 x 9 cells to 7 x 7 cells based on level 10. - Applies critical damage, the critical chance is the user's Cri. Co-authored-by: Lemongrass3110 --- db/re/skill_db.yml | 40 +++++++++++++++++++++------------------- src/map/battle.cpp | 8 ++++---- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 777f8b3234..fd17528296 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -35121,6 +35121,7 @@ Body: TargetType: Attack DamageFlags: Splash: true + Critical: true Range: 2 Hit: Multi_Hit HitCount: 2 @@ -35133,19 +35134,19 @@ Body: - Level: 3 Area: 1 - Level: 4 - Area: 2 + Area: 1 - Level: 5 Area: 2 - Level: 6 Area: 2 - Level: 7 - Area: 3 + Area: 2 - Level: 8 - Area: 3 + Area: 2 - Level: 9 Area: 3 - Level: 10 - Area: 4 + Area: 3 CastCancel: true AfterCastActDelay: 250 Cooldown: 700 @@ -35182,6 +35183,7 @@ Body: TargetType: Attack DamageFlags: Splash: true + Critical: true Range: 2 Hit: Multi_Hit HitCount: 2 @@ -35194,19 +35196,19 @@ Body: - Level: 3 Area: 1 - Level: 4 - Area: 2 + Area: 1 - Level: 5 Area: 2 - Level: 6 Area: 2 - Level: 7 - Area: 3 + Area: 2 - Level: 8 - Area: 3 + Area: 2 - Level: 9 Area: 3 - Level: 10 - Area: 4 + Area: 3 Requires: SpCost: 1 - Id: 5210 @@ -35258,15 +35260,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 36 + Amount: 27 - Level: 2 - Amount: 44 + Amount: 34 - Level: 3 - Amount: 52 + Amount: 41 - Level: 4 - Amount: 60 + Amount: 48 - Level: 5 - Amount: 68 + Amount: 55 Weapon: 2hSword: true 2hSpear: true @@ -35331,19 +35333,19 @@ Body: GiveAp: 2 CastCancel: true AfterCastActDelay: 500 - Cooldown: 300 + Cooldown: 350 Requires: SpCost: - Level: 1 - Amount: 40 + Amount: 35 - Level: 2 - Amount: 45 + Amount: 40 - Level: 3 - Amount: 50 + Amount: 45 - Level: 4 - Amount: 55 + Amount: 50 - Level: 5 - Amount: 60 + Amount: 55 Weapon: 2hSword: true 2hAxe: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 78fbaae117..42b4309f0d 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5401,7 +5401,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case DK_HACKANDSLASHER: case DK_HACKANDSLASHER_ATK: - skillratio += -100 + 300 + 700 * skill_lv; + skillratio += -100 + 200 + 750 * skill_lv; skillratio += 7 * sstatus->pow; RE_LVL_DMOD(100); break; @@ -5412,7 +5412,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case DK_MADNESS_CRUSHER: - skillratio += -100 + 400 + 800 * skill_lv + 7 * sstatus->pow; + skillratio += -100 + 350 + 1600 * skill_lv + 10 * sstatus->pow; if( sd != nullptr ){ int16 index = sd->equip_index[EQI_HAND_R]; @@ -5425,9 +5425,9 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio *= 2; break; case DK_STORMSLASH: - skillratio += -100 + 100 + 170 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 200 + 400 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); - if (sc && sc->getSCE(SC_GIANTGROWTH) && rnd()%100 < 30) + if (sc && sc->getSCE(SC_GIANTGROWTH) && rnd_chance(60, 100)) skillratio *= 2; break; case DK_DRAGONIC_BREATH: From ff90feaf8562fca73ca1d0c9092c8638acee8429 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 2 Jan 2024 20:39:49 +0100 Subject: [PATCH 13/33] Rebalance Meister 20221221 (#8076) Axe Stomp - Increases SP consumption from 74 to 85 based on level 5. - Increases base damage from 4600%Atk to 5150%Atk per hit based on level 5. Mighty Smash, Spark Blaster and Triple Laser are already up-to-date --- db/re/skill_db.yml | 10 +++++----- src/map/battle.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index fd17528296..bad9644639 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -38226,15 +38226,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 46 + Amount: 45 - Level: 2 - Amount: 53 + Amount: 55 - Level: 3 - Amount: 60 + Amount: 65 - Level: 4 - Amount: 67 + Amount: 75 - Level: 5 - Amount: 74 + Amount: 85 Weapon: 1hAxe: true 2hAxe: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 42b4309f0d..7748b63134 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5572,7 +5572,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case MT_AXE_STOMP: - skillratio += -100 + 350 + 850 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 400 + 950 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case MT_MIGHTY_SMASH: From 644a22c5bbeae6d7e301e59a45d379fabab2a3b9 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Fri, 5 Jan 2024 21:50:59 +0100 Subject: [PATCH 14/33] Fixed convex mirror (#8084) When the "NoSave" of SC_BOSSMAPINFO is removed, this could lead to issues after a character logs back in. Fixes #8083 Thanks to @Gyakushinn --- src/map/clif.cpp | 49 ++++++++++++----------------- src/map/clif.hpp | 2 +- src/map/packets.hpp | 13 ++++++++ src/map/status.cpp | 75 ++++++++++++++++++++++++++++++++------------- 4 files changed, 87 insertions(+), 52 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 6e59564d59..103a6fa4bf 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -17511,40 +17511,31 @@ void clif_parse_Adopt_reply(int fd, map_session_data *sd){ } -/// Convex Mirror (ZC_BOSS_INFO). -/// 0293 .B .L .L .W .W .W .W .51B +/// Convex Mirror +/// 0293 .B .L .L .W .W .W .W .51B (ZC_BOSS_INFO) /// infoType: /// BOSS_INFO_NOT = No boss on this map. /// BOSS_INFO_ALIVE = Boss is alive (position update). /// BOSS_INFO_ALIVE_WITHMSG = Boss is alive (initial announce). /// BOSS_INFO_DEAD = Boss is dead. -void clif_bossmapinfo(map_session_data *sd, struct mob_data *md, enum e_bossmap_info flag) -{ - int fd = sd->fd; +void clif_bossmapinfo( map_session_data& sd, mob_data* md, e_bossmap_info flag ){ + PACKET_ZC_BOSS_INFO p = {}; - WFIFOHEAD(fd,70); - memset(WFIFOP(fd,0),0,70); - WFIFOW(fd,0) = 0x293; + p.packetType = HEADER_ZC_BOSS_INFO; + p.type = flag; switch (flag) { case BOSS_INFO_NOT: - WFIFOB(fd,2) = BOSS_INFO_NOT; // No data required - break; - case BOSS_INFO_ALIVE: - WFIFOB(fd,2) = BOSS_INFO_ALIVE; - // Update X/Y - WFIFOL(fd,3) = md->bl.x; - WFIFOL(fd,7) = md->bl.y; break; case BOSS_INFO_ALIVE_WITHMSG: - WFIFOB(fd,2) = BOSS_INFO_ALIVE_WITHMSG; - // Current X/Y - WFIFOL(fd,3) = md->bl.x; - WFIFOL(fd,7) = md->bl.y; + [[fallthrough]]; + case BOSS_INFO_ALIVE: + + p.x = md->bl.x; + p.y = md->bl.y; break; - case BOSS_INFO_DEAD: - { + case BOSS_INFO_DEAD: { const struct TimerData * timer_data = get_timer(md->spawn_timer); unsigned int seconds; int hours, minutes; @@ -17554,18 +17545,18 @@ void clif_bossmapinfo(map_session_data *sd, struct mob_data *md, enum e_bossmap_ seconds = seconds - (60 * 60 * hours); minutes = seconds / 60; - WFIFOB(fd,2) = BOSS_INFO_DEAD; - // Add respawn info - WFIFOW(fd,11) = hours; // Hours - WFIFOW(fd,13) = minutes; // Minutes - } + + p.minHours = hours; + p.minMinutes = minutes; break; + } } - if (md != NULL) - safestrncpy(WFIFOCP(fd,19), md->db->jname.c_str(), NAME_LENGTH); + if( md != nullptr ){ + safestrncpy( p.name, md->db->jname.c_str(), sizeof( p.name ) ); + } - WFIFOSET(fd,70); + clif_send( &p, sizeof( p ), &sd.bl, SELF ); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index b535e1ac78..9155b92428 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1015,7 +1015,7 @@ void clif_Auction_message(int fd, unsigned char flag); void clif_Auction_close(int fd, unsigned char flag); void clif_parse_Auction_cancelreg(int fd, map_session_data *sd); -void clif_bossmapinfo(map_session_data *sd, struct mob_data *md, enum e_bossmap_info flag); +void clif_bossmapinfo( map_session_data& sd, mob_data* md, e_bossmap_info flag ); void clif_cashshop_show(map_session_data *sd, struct npc_data *nd); // ADOPTION diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 7f1e8482e3..57b5274ec5 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -403,6 +403,18 @@ struct PACKET_CZ_RESET_SKILL{ uint8 unknown; } __attribute__((packed)); +struct PACKET_ZC_BOSS_INFO{ + int16 packetType; + uint8 type; + uint32 x; + uint32 y; + uint16 minHours; + uint16 minMinutes; + uint16 maxHours; + uint16 maxMinutes; + char name[51]; +} __attribute__((packed)); + // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #pragma pack( pop ) @@ -430,6 +442,7 @@ DEFINE_PACKET_HEADER(ZC_NOTIFY_WEAPONITEMLIST, 0x221) DEFINE_PACKET_HEADER(ZC_ACK_WEAPONREFINE, 0x223) DEFINE_PACKET_HEADER(CZ_REQ_MAKINGITEM, 0x25b) DEFINE_PACKET_HEADER(ZC_PC_CASH_POINT_ITEMLIST, 0x287) +DEFINE_PACKET_HEADER(ZC_BOSS_INFO, 0x293) DEFINE_PACKET_HEADER(ZC_CASH_TIME_COUNTER, 0x298) DEFINE_PACKET_HEADER(ZC_CASH_ITEM_DELETE, 0x299) DEFINE_PACKET_HEADER(ZC_NOTIFY_BIND_ON_EQUIP, 0x2d3) diff --git a/src/map/status.cpp b/src/map/status.cpp index 116bdd9470..8e82c7c9dc 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -9398,6 +9398,7 @@ static int status_get_sc_interval(enum sc_type type) case SC_DEATHHURT: case SC_GRADUAL_GRAVITY: case SC_KILLING_AURA: + case SC_BOSSMAPINFO: return 1000; case SC_BURNING: case SC_PYREXIA: @@ -10977,16 +10978,21 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty } break; case SC_BOSSMAPINFO: - if( sd != NULL ) { - struct mob_data *boss_md = map_getmob_boss(bl->m); // Search for Boss on this Map + if( sd == nullptr ){ + return 0; + }else{ + // Search for Boss on this Map + mob_data* boss_md = map_getmob_boss( bl->m ); - if( boss_md == NULL ) { // No MVP on this map - clif_bossmapinfo(sd, NULL, BOSS_INFO_NOT); + // No MVP on this map + if( boss_md == nullptr ){ + clif_bossmapinfo( *sd, nullptr, BOSS_INFO_NOT ); return 0; } + val1 = boss_md->bl.id; - tick_time = 1000; // [GodLesZ] tick time - val4 = tick / tick_time; + tick_time = status_get_sc_interval( type ); + val4 = tick - tick_time; // Remaining time } break; case SC_HIDING: @@ -12974,8 +12980,28 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty } break; case SC_BOSSMAPINFO: - if (sd) - clif_bossmapinfo(sd, map_id2boss(sce->val1), BOSS_INFO_ALIVE_WITHMSG); // First Message + if( sd == nullptr ){ + return 0; + }else{ + mob_data* boss_md = map_id2boss( sce->val1 ); + + if( boss_md == nullptr ){ + return 0; + } + + // Not on same map anymore + if( sd->bl.m != boss_md->bl.m ){ + return 0; + // Boss is alive + }else if( boss_md->bl.prev != nullptr ){ + sce->val2 = 0; + clif_bossmapinfo( *sd, boss_md, BOSS_INFO_ALIVE_WITHMSG ); + // Boss is dead + }else if( boss_md->spawn_timer != INVALID_TIMER ){ + sce->val2 = 1; + clif_bossmapinfo( *sd, boss_md, BOSS_INFO_DEAD ); + } + } break; case SC_FULL_THROTTLE: case SC_MERC_HPUP: @@ -14068,22 +14094,27 @@ TIMER_FUNC(status_change_timer){ break; case SC_BOSSMAPINFO: - if( sd && --(sce->val4) >= 0 ) { - struct mob_data *boss_md = map_id2boss(sce->val1); + if( sd && sce->val4 >= 0 ){ + mob_data* boss_md = map_id2boss( sce->val1 ); - if (boss_md) { - if (sd->bl.m != boss_md->bl.m) // Not on same map anymore - return 0; - else if (boss_md->bl.prev != NULL) { // Boss is alive - Update X, Y on minimap - sce->val2 = 0; - clif_bossmapinfo(sd, boss_md, BOSS_INFO_ALIVE); - } else if (boss_md->spawn_timer != INVALID_TIMER && !sce->val2) { // Boss is dead - sce->val2 = 1; - clif_bossmapinfo(sd, boss_md, BOSS_INFO_DEAD); - } + if( boss_md == nullptr ){ + sce->val4 = 0; + break; + } + + // Not on same map anymore + if( sd->bl.m != boss_md->bl.m ){ + sce->val4 = 0; + break; + // Boss is alive - Update X, Y on minimap + }else if( boss_md->bl.prev != nullptr ){ + sce->val2 = 0; + clif_bossmapinfo( *sd, boss_md, BOSS_INFO_ALIVE ); + // Boss is dead + }else if( boss_md->spawn_timer != INVALID_TIMER && sce->val2 == 0 ){ + sce->val2 = 1; + clif_bossmapinfo( *sd, boss_md, BOSS_INFO_DEAD ); } - sc_timer_next(1000 + tick); - return 0; } break; From 360710d2f058c5c95b4c4c746c924c3b06cc8b6c Mon Sep 17 00:00:00 2001 From: Atemo Date: Sat, 6 Jan 2024 19:58:18 +0100 Subject: [PATCH 15/33] Rebalance Abyss chaser 20221221 (#8081) * Abyss Dagger - Increases cooldown from 0.3 seconds to 0.4 seconds. - Increases SP consumption from 64 to 76 based on level 5. - Increases base damage from 2600%Atk to 4600%Atk based on level 5. * Frenzy Shot - Increases cooldown from 0.2 seconds to 0.35 seconds. - Increases SP consumption from 55 to 65 based on level 10. - Increases number of hit from 1 hit to 2 hits. - Increases base damage from 4000%Atk to 6150%Atk based on level 10. - Increases factor weight of CON in skill formula from 5 to 15. * Deft Stab - Removes a chance to trigger the skill one more time. - Increases SP consumption from 62 to 72 based on level 10. - Increases cooldown from 0.3 seconds to 0.7 seconds. - Reduces base damage from 5850%Atk to 3750%Atk based on level 10. - Changes damage logic from 5 split hits to 5 cumulative hits. Co-authored-by: Lemongrass3110 --- db/re/skill_db.yml | 100 ++++++++++++++------------------------------- src/map/battle.cpp | 9 ++-- src/map/skill.cpp | 4 -- 3 files changed, 36 insertions(+), 77 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index bad9644639..f11bbedc72 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -38742,19 +38742,19 @@ Body: - Level: 4 Time: 900 - Level: 5 - Time: 300 + Time: 400 Requires: SpCost: - Level: 1 - Amount: 48 + Amount: 60 - Level: 2 - Amount: 52 + Amount: 64 - Level: 3 - Amount: 56 + Amount: 68 - Level: 4 - Amount: 60 + Amount: 72 - Level: 5 - Amount: 64 + Amount: 76 Weapon: Dagger: true 1hSword: true @@ -38951,7 +38951,7 @@ Body: Splash: true Range: 2 Hit: Multi_Hit - HitCount: -5 + HitCount: 5 Element: Weapon SplashArea: - Level: 1 @@ -38977,49 +38977,29 @@ Body: GiveAp: 3 CastCancel: true AfterCastActDelay: 500 - Cooldown: - - Level: 1 - Time: 2000 - - Level: 2 - Time: 1900 - - Level: 3 - Time: 1700 - - Level: 4 - Time: 1500 - - Level: 5 - Time: 1300 - - Level: 6 - Time: 1100 - - Level: 7 - Time: 900 - - Level: 8 - Time: 700 - - Level: 9 - Time: 500 - - Level: 10 - Time: 300 + Cooldown: 700 Requires: SpCost: - Level: 1 - Amount: 35 + Amount: 45 - Level: 2 - Amount: 38 + Amount: 48 - Level: 3 - Amount: 41 + Amount: 51 - Level: 4 - Amount: 44 + Amount: 54 - Level: 5 - Amount: 47 + Amount: 57 - Level: 6 - Amount: 50 + Amount: 60 - Level: 7 - Amount: 53 + Amount: 63 - Level: 8 - Amount: 56 + Amount: 66 - Level: 9 - Amount: 59 + Amount: 69 - Level: 10 - Amount: 62 + Amount: 72 - Id: 5321 Name: ABC_ABYSS_SQUARE Description: Abyss Square @@ -39066,54 +39046,34 @@ Body: Critical: true Range: 9 Hit: Multi_Hit - HitCount: 1 + HitCount: 2 Element: Weapon GiveAp: 1 CastCancel: true AfterCastActDelay: 500 - Cooldown: - - Level: 1 - Time: 2000 - - Level: 2 - Time: 1800 - - Level: 3 - Time: 1600 - - Level: 4 - Time: 1400 - - Level: 5 - Time: 1200 - - Level: 6 - Time: 1000 - - Level: 7 - Time: 800 - - Level: 8 - Time: 600 - - Level: 9 - Time: 400 - - Level: 10 - Time: 200 + Cooldown: 350 Requires: SpCost: - Level: 1 - Amount: 37 + Amount: 47 - Level: 2 - Amount: 39 + Amount: 49 - Level: 3 - Amount: 41 + Amount: 51 - Level: 4 - Amount: 43 + Amount: 53 - Level: 5 - Amount: 45 + Amount: 55 - Level: 6 - Amount: 47 + Amount: 57 - Level: 7 - Amount: 49 + Amount: 59 - Level: 8 - Amount: 51 + Amount: 61 - Level: 9 - Amount: 53 + Amount: 63 - Level: 10 - Amount: 55 + Amount: 65 Weapon: Bow: true Ammo: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 7748b63134..4f0e519163 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5605,7 +5605,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case ABC_ABYSS_DAGGER: - skillratio += -100 + 100 + 500 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 100 + 900 * skill_lv; + skillratio += 5 * sstatus->pow; RE_LVL_DMOD(100); break; case ABC_UNLUCKY_RUSH: @@ -5621,11 +5622,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case ABC_DEFT_STAB: - skillratio += -100 + 350 + 550 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 250 + 350 * skill_lv; + skillratio += 5 * sstatus->pow; RE_LVL_DMOD(100); break; case ABC_FRENZY_SHOT: - skillratio += -100 + 400 * skill_lv + 5 * sstatus->con; + skillratio += -100 + 150 + 600 * skill_lv; + skillratio += 15 * sstatus->con; RE_LVL_DMOD(100); break; case WH_HAWKRUSH: diff --git a/src/map/skill.cpp b/src/map/skill.cpp index ec91b3e9d0..67b85c9d44 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -4146,10 +4146,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * if (status_get_lv(src) > 29 && rnd() % 100 < 10 * status_get_lv(src) / 30) skill_addtimerskill(src, tick + dmg.amotion + skill_get_delay(skill_id, skill_lv), bl->id, 0, 0, skill_id, skill_lv, attack_type, flag|2); break; - case ABC_DEFT_STAB: - if (skill_area_temp[1] == bl->id && rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech] - skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2); - break; } } From 1f3b42c1752bcb0df107532cff5c1f9cb6a8b47b Mon Sep 17 00:00:00 2001 From: Atemo Date: Mon, 8 Jan 2024 19:46:15 +0100 Subject: [PATCH 16/33] Updated hidden garden instance (#8092) * Monsters spawn times is significantly reduced. --- npc/re/instances/HiddenGarden.txt | 137 +++++++++++++++--------------- 1 file changed, 69 insertions(+), 68 deletions(-) diff --git a/npc/re/instances/HiddenGarden.txt b/npc/re/instances/HiddenGarden.txt index 6c85e429e9..bc87ea45b4 100644 --- a/npc/re/instances/HiddenGarden.txt +++ b/npc/re/instances/HiddenGarden.txt @@ -10,6 +10,7 @@ //= 1.0 Initial release [crazyarashi] //= 1.1 Optimizations and cleanup [Everade] //= 1.2 Cleanup [Capuche] +//= 1.3 Updated monsters spawn times (significantly reduced). [Atemo] //============================================================ ba_maison,120,320,0 script #herbs_chk HIDDEN_WARP_NPC,3,3,{ @@ -1623,36 +1624,36 @@ OnSummon: 'total_mobs = 16; monster 'map_herbs$,77,197,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,51,196,"Flower Garden Watcher",20622,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,63,217,"Flower Garden Watcher",20622,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,81,195,"Flower Garden Watcher",20624,1, .@event$; monster 'map_herbs$,61,217,"Flower Garden Watcher",20622,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,57,193,"Flower Garden Watcher",20622,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,56,191,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,59,193,"Flower Garden Watcher",20626,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,59,192,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,60,222,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,58,191,"Flower Garden Watcher",20622,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,78,199,"Flower Garden Watcher",20622,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,54,192,"Flower Garden Watcher",20626,1, .@event$; monster 'map_herbs$,79,195,"Flower Garden Watcher",20622,1, .@event$; - sleep 9000; + sleep 100; monster 'map_herbs$,76,192,"Flower Garden Watcher",20626,1, .@event$; monster 'map_herbs$,51,196,"Flower Garden Watcher",20624,1, .@event$; } else { 'total_mobs = 16; monster 'map_herbs$,53,197,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,62,217,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,57,219,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,62,222,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,79,200,"Flower Garden Watcher",20623,1, .@event$; @@ -1660,14 +1661,14 @@ OnSummon: monster 'map_herbs$,80,199,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,58,193,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,56,192,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,51,191,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,51,192,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,83,199,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,83,191,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,83,196,"Flower Garden Watcher",20623,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,57,193,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,62,222,"Flower Garden Watcher",20623,1, .@event$; } @@ -1678,15 +1679,15 @@ OnSummon: monster 'map_herbs$,114,226,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,114,227,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,119,217,"Flower Garden Watcher",20624,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,118,227,"Flower Garden Watcher",20622,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,116,216,"Flower Garden Watcher",20626,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,114,215,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,114,225,"Flower Garden Watcher",20622,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,114,224,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,139,205,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,140,202,"Flower Garden Watcher",20622,1, .@event$; @@ -1708,30 +1709,30 @@ OnSummon: monster 'map_herbs$,142,205,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,145,200,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,146,201,"Flower Garden Watcher",20625,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,147,201,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,141,208,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,166,224,"Flower Garden Watcher",20625,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,171,217,"Flower Garden Watcher",20627,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,172,225,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,173,214,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,174,225,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,174,223,"Flower Garden Watcher",20627,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,170,213,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,169,219,"Flower Garden Watcher",20623,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,136,205,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,136,210,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,120,224,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,118,223,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,117,219,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,115,214,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,115,233,"Flower Garden Watcher",20623,1, .@event$; } break; @@ -1740,45 +1741,45 @@ OnSummon: 'total_mobs = 28; monster 'map_herbs$,213,205,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,202,214,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,202,213,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,210,212,"Flower Garden Watcher",20626,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,211,207,"Flower Garden Watcher",20624,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,209,214,"Flower Garden Watcher",20624,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,203,212,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,218,194,"Flower Garden Watcher",20622,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,203,196,"Flower Garden Watcher",20622,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,204,193,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,215,201,"Flower Garden Watcher",20624,1, .@event$; monster 'map_herbs$,204,193,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,205,213,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,218,208,"Flower Garden Watcher",20622,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,210,210,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,245,214,"Flower Garden Watcher",20626,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,220,192,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,248,208,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,253,208,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,253,208,"Flower Garden Watcher",20626,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,246,212,"Flower Garden Watcher",20624,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,251,210,"Flower Garden Watcher",20622,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,245,209,"Flower Garden Watcher",20626,1, .@event$; monster 'map_herbs$,222,195,"Flower Garden Watcher",20624,1, .@event$; monster 'map_herbs$,203,212,"Flower Garden Watcher",20624,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,208,213,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,219,192,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,245,209,"Flower Garden Watcher",20626,1, .@event$; @@ -1787,35 +1788,35 @@ OnSummon: 'total_mobs = 27; monster 'map_herbs$,207,194,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,217,204,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,210,210,"Flower Garden Watcher",20627,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,218,195,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,211,209,"Flower Garden Watcher",20627,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,210,211,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,207,194,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,209,214,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,216,192,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,208,211,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,214,208,"Flower Garden Watcher",20623,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,209,214,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,215,201,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,205,214,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,205,214,"Flower Garden Watcher",20625,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,220,207,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,208,213,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,202,212,"Flower Garden Watcher",20623,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,202,193,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,206,214,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,245,212,"Flower Garden Watcher",20627,1, .@event$; @@ -1849,15 +1850,15 @@ OnSummon: monster 'map_herbs$,285,210,"Flower Garden Watcher",20624,1, .@event$; monster 'map_herbs$,283,228,"Flower Garden Watcher",20624,1, .@event$; monster 'map_herbs$,294,252,"Flower Garden Watcher",20624,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,295,247,"Flower Garden Watcher",20626,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,294,245,"Flower Garden Watcher",20624,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,281,232,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,287,219,"Flower Garden Watcher",20626,1, .@event$; monster 'map_herbs$,302,239,"Flower Garden Watcher",20626,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,307,217,"Flower Garden Watcher",20622,1, .@event$; monster 'map_herbs$,300,235,"Flower Garden Watcher",20624,1, .@event$; monster 'map_herbs$,295,249,"Flower Garden Watcher",20624,1, .@event$; @@ -1873,18 +1874,18 @@ OnSummon: monster 'map_herbs$,284,236,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,283,235,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,304,240,"Flower Garden Watcher",20627,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,298,246,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,305,224,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,310,225,"Flower Garden Watcher",20627,1, .@event$; - sleep 9000; + sleep 100; monster 'map_herbs$,284,218,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,298,213,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,308,224,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,290,210,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,310,224,"Flower Garden Watcher",20627,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,308,220,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,284,211,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,284,218,"Flower Garden Watcher",20623,1, .@event$; @@ -1892,22 +1893,22 @@ OnSummon: monster 'map_herbs$,281,231,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,280,226,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,285,210,"Flower Garden Watcher",20625,1, .@event$; - sleep 6000; + sleep 100; monster 'map_herbs$,280,227,"Flower Garden Watcher",20623,1, .@event$; monster 'map_herbs$,285,234,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,283,236,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,284,233,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,284,237,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,284,239,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,293,246,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,300,247,"Flower Garden Watcher",20627,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,294,253,"Flower Garden Watcher",20627,1, .@event$; monster 'map_herbs$,302,240,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,299,255,"Flower Garden Watcher",20625,1, .@event$; monster 'map_herbs$,295,256,"Flower Garden Watcher",20625,1, .@event$; - sleep 3000; + sleep 100; monster 'map_herbs$,310,218,"Flower Garden Watcher",20623,1, .@event$; } break; From a3cb48a34108a29a9afa8406e8a260ab05aaec7d Mon Sep 17 00:00:00 2001 From: Atemo Date: Mon, 8 Jan 2024 20:24:23 +0100 Subject: [PATCH 17/33] Item DB correction/update (#8091) * Corrected item Locations * Added missing effect when autobonus is triggered for some snow and glacier enchants * Updated item Trade --- db/re/item_db_equip.yml | 43 +++++++++++++++++++++------------------- db/re/item_db_etc.yml | 26 ++++++++++++++---------- db/re/item_db_usable.yml | 1 - 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index 8ea256440e..fb9120f812 100644 --- a/db/re/item_db_equip.yml +++ b/db/re/item_db_equip.yml @@ -40827,7 +40827,7 @@ Body: Assassin: true Priest: true Locations: - Head_Low: true + Head_Top: true ArmorLevel: 1 EquipLevelMin: 70 View: 180 @@ -48957,6 +48957,7 @@ Body: Weight: 500 Defense: 5 Locations: + Head_Low: true Head_Mid: true Head_Top: true ArmorLevel: 1 @@ -49901,7 +49902,6 @@ Body: Weight: 500 Defense: 5 Locations: - Head_Low: true Head_Mid: true Head_Top: true ArmorLevel: 1 @@ -49959,6 +49959,7 @@ Body: Type: Armor Defense: 5 Locations: + Head_Mid: true Head_Top: true ArmorLevel: 1 Refineable: true @@ -64053,7 +64054,7 @@ Body: KagerouOboro: true Ninja: true Locations: - Right_Hand: true + Both_Hand: true WeaponLevel: 3 EquipLevelMin: 40 Refineable: true @@ -84118,6 +84119,7 @@ Body: Defense: 10 Slots: 1 Locations: + Head_Mid: true Head_Top: true ArmorLevel: 1 EquipLevelMin: 70 @@ -98820,6 +98822,7 @@ Body: Type: Armor Locations: Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 528 @@ -102407,8 +102410,6 @@ Body: Type: Armor Locations: Costume_Head_Top: true - Costume_Head_Mid: true - Costume_Head_Low: true ArmorLevel: 1 EquipLevelMin: 1 View: 636 @@ -103236,6 +103237,7 @@ Body: Type: Armor Locations: Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 175 @@ -103669,7 +103671,7 @@ Body: Name: Costume Prayer Cherry Blossom Type: Armor Locations: - Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 1223 @@ -107006,6 +107008,7 @@ Body: Type: Armor Locations: Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 634 @@ -107903,7 +107906,7 @@ Body: Name: Costume Unidentified Flying Poring Type: Armor Locations: - Costume_Head_Top: true + Costume_Head_Low: true ArmorLevel: 1 EquipLevelMin: 1 View: 1017 @@ -108180,7 +108183,7 @@ Body: Name: Costume Blessings Of Soul Type: Armor Locations: - Costume_Head_Low: true + Costume_Garment: true ArmorLevel: 1 EquipLevelMin: 1 Script: | @@ -147592,7 +147595,6 @@ Body: Type: Armor Locations: Costume_Head_Top: true - Costume_Head_Mid: true Costume_Head_Low: true ArmorLevel: 1 EquipLevelMin: 1 @@ -148489,6 +148491,7 @@ Body: Type: Armor Locations: Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 223 @@ -149039,7 +149042,7 @@ Body: Name: Costume War Princess Ribbon Type: Armor Locations: - Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 1583 @@ -154559,7 +154562,7 @@ Body: Name: Costume Savage Shoulder Bebe Type: Armor Locations: - Costume_Head_Top: true + Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 1915 @@ -172213,8 +172216,8 @@ Body: Trade: NoDrop: true NoTrade: true + NoSell: true NoCart: true - NoStorage: true NoGuildStorage: true NoMail: true NoAuction: true @@ -172229,8 +172232,8 @@ Body: Trade: NoDrop: true NoTrade: true + NoSell: true NoCart: true - NoStorage: true NoGuildStorage: true NoMail: true NoAuction: true @@ -174929,7 +174932,7 @@ Body: View: 666 Weight: 100 Locations: - Head_Top: true + Head_Low: true Head_Mid: true ArmorLevel: 1 EquipLevelMin: 99 @@ -174944,7 +174947,7 @@ Body: View: 693 Weight: 100 Locations: - Head_Top: true + Head_Low: true Head_Mid: true ArmorLevel: 1 EquipLevelMin: 99 @@ -174960,7 +174963,7 @@ Body: Weight: 100 Defense: 3 Locations: - Head_Top: true + Head_Low: true Head_Mid: true ArmorLevel: 1 EquipLevelMin: 99 @@ -174977,7 +174980,7 @@ Body: Defense: 3 Slots: 1 Locations: - Head_Top: true + Head_Low: true Head_Mid: true ArmorLevel: 1 EquipLevelMin: 99 @@ -174993,7 +174996,7 @@ Body: Weight: 100 Slots: 1 Locations: - Head_Top: true + Head_Low: true Head_Mid: true ArmorLevel: 1 EquipLevelMin: 99 @@ -175009,7 +175012,7 @@ Body: Weight: 100 Slots: 1 Locations: - Head_Top: true + Head_Low: true Head_Mid: true ArmorLevel: 1 EquipLevelMin: 99 @@ -225890,7 +225893,7 @@ Body: All_Third: true Fourth: true Locations: - Right_Hand: true + Both_Hand: true WeaponLevel: 4 EquipLevelMin: 150 Refineable: true diff --git a/db/re/item_db_etc.yml b/db/re/item_db_etc.yml index b253821b1f..918448891c 100644 --- a/db/re/item_db_etc.yml +++ b/db/re/item_db_etc.yml @@ -41749,6 +41749,7 @@ Body: Buy: 20 Weight: 10 Locations: + Head_Low: true Head_Mid: true Head_Top: true Flags: @@ -41763,6 +41764,7 @@ Body: Buy: 20 Weight: 10 Locations: + Head_Low: true Head_Mid: true Head_Top: true Flags: @@ -51300,6 +51302,8 @@ Body: Type: Card Weight: 10 Locations: + Head_Low: true + Head_Mid: true Head_Top: true Flags: BuyingStore: true @@ -63337,42 +63341,42 @@ Body: Type: Card SubType: Enchant Script: | - autobonus "{ bonus bAtkRate,25; bonus bVit,50; }",30,10000,BF_WEAPON; + autobonus "{ bonus bAtkRate,25; bonus bVit,50; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; - Id: 311121 AegisName: Ice_F_Orb_Sp_Int Name: Ice Magic Orb (Spell Buster) Type: Card SubType: Enchant Script: | - autobonus "{ bonus bMatkRate,25; bonus bInt,50; }",30,10000,BF_MAGIC; + autobonus "{ bonus bMatkRate,25; bonus bInt,50; }",30,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }"; - Id: 311122 AegisName: Ice_F_Orb_Fi_Dex Name: Ice Magic Orb (Firing Shot) Type: Card SubType: Enchant Script: | - autobonus "{ bonus bLongAtkRate,15; bonus bDex,50; }",30,10000,BF_WEAPON; + autobonus "{ bonus bLongAtkRate,15; bonus bDex,50; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; - Id: 311123 AegisName: Ice_F_Orb_Ov_Str Name: Ice Magic Orb (Overpower) Type: Card SubType: Enchant Script: | - autobonus "{ bonus bShortAtkRate,15; bonus bStr,50; }",30,10000,BF_WEAPON; + autobonus "{ bonus bShortAtkRate,15; bonus bStr,50; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; - Id: 311124 AegisName: Ice_F_Orb_Fa_Agi Name: Ice Magic Orb (Fatal Flash) Type: Card SubType: Enchant Script: | - autobonus "{ bonus bCritAtkRate,25; bonus bAgi,50; }",30,10000,BF_WEAPON; + autobonus "{ bonus bCritAtkRate,25; bonus bAgi,50; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; - Id: 311125 AegisName: Ice_F_Orb_Lu_Luk Name: Ice Magic Orb (Lucky Strike) Type: Card SubType: Enchant Script: | - autobonus "{ bonus2 bMagicAtkEle,Ele_All,15; bonus bLuk,50; }",30,10000,BF_MAGIC; + autobonus "{ bonus2 bMagicAtkEle,Ele_All,15; bonus bLuk,50; }",30,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }"; - Id: 311126 AegisName: Ice_F_Orb_A_Delay Name: Ice Magic Orb (Delay After Attack) @@ -70933,9 +70937,9 @@ Body: SubType: Enchant Script: | .@g = getenchantgrade(); - bonus bMaxHPrate,-5; + bonus bMaxHPrate,-5; bonus bMaxSPrate,-5; - autobonus "{ bonus bStr,50; bonus bPow,15; bonus bSta,15; }",30,10000,BF_WEAPON; + autobonus "{ bonus bStr,50; bonus bPow,15; bonus bSta,15; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; if (.@g>=ENCHANTGRADE_D) { bonus bLongAtkRate,5; bonus bShortAtkRate,5; @@ -70953,7 +70957,7 @@ Body: .@g = getenchantgrade(); bonus bMaxHPrate,-5; bonus bMaxSPrate,-5; - autobonus "{ bonus bInt,50; bonus bWis,15; bonus bSpl,15; }",30,10000,BF_MAGIC; + autobonus "{ bonus bInt,50; bonus bWis,15; bonus bSpl,15; }",30,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }"; if (.@g>=ENCHANTGRADE_D) { bonus2 bMagicAtkEle,Ele_All,5; if (.@g>=ENCHANTGRADE_C) { @@ -70969,7 +70973,7 @@ Body: .@g = getenchantgrade(); bonus bMaxHPrate,-5; bonus bMaxSPrate,-5; - autobonus "{ bonus bDex,50; bonus bCon,15; bonus bCrt,15; }",30,10000,BF_WEAPON; + autobonus "{ bonus bDex,50; bonus bCon,15; bonus bCrt,15; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; if (.@g>=ENCHANTGRADE_D) { bonus bLongAtkRate,5; bonus bShortAtkRate,5; @@ -78734,6 +78738,7 @@ Body: Trade: NoDrop: true NoTrade: true + NoSell: true NoCart: true NoStorage: true NoGuildStorage: true @@ -78746,6 +78751,7 @@ Body: Trade: NoDrop: true NoTrade: true + NoSell: true NoCart: true NoStorage: true NoGuildStorage: true diff --git a/db/re/item_db_usable.yml b/db/re/item_db_usable.yml index c20f042f95..9a8df21f0f 100644 --- a/db/re/item_db_usable.yml +++ b/db/re/item_db_usable.yml @@ -62882,7 +62882,6 @@ Body: NoDrop: true NoTrade: true NoCart: true - NoStorage: true NoGuildStorage: true NoMail: true NoAuction: true From 60dbe5a42d46a8e2af6a23ef57282b26befedbdf Mon Sep 17 00:00:00 2001 From: munkrej Date: Mon, 8 Jan 2024 21:10:11 +0100 Subject: [PATCH 18/33] Cleanup of PATK calculation (#8094) Follow up to 66dddb3 (rathena/rathena#7996) Fixes RK_DRAGONBREATH handling when DK_DRAGONIC_AURA is not skilled --- src/map/battle.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 4f0e519163..a6564c7da2 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6944,11 +6944,27 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl battle_attack_sc_bonus(&wd, src, target, skill_id, skill_lv); if (sd) { //monsters, homuns and pets have their damage computed directly - //PATK mod applies to Dragonbreaths if Dragonic Aura is skilled only - [munkrej] - if (!((skill_id == RK_DRAGONBREATH || skill_id == RK_DRAGONBREATH_WATER) && pc_checkskill( sd, DK_DRAGONIC_AURA ) == 0)) { - wd.damage = (int64)floor((float)((wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.percentAtk) * (100 + sstatus->patk) / 100 + wd.masteryAtk + bonus_damage)); - if (is_attack_left_handed(src, skill_id)) - wd.damage2 = (int64)floor((float)((wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.percentAtk2) * (100 + sstatus->patk) / 100 + wd.masteryAtk2 + bonus_damage)); + wd.damage = wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.percentAtk; + if( is_attack_left_handed( src, skill_id ) ){ + wd.damage2 = wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.percentAtk2; + } + // Apply PATK mod + // But for Dragonbreaths it only applies if Dragonic Aura is skilled + if( ( skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER ) || pc_checkskill( sd, DK_DRAGONIC_AURA ) > 0 ){ + wd.damage = (int64)floor( (float)( wd.damage * ( 100 + sstatus->patk ) / 100 ) ); + if( is_attack_left_handed( src, skill_id ) ){ + wd.damage2 = (int64)floor( (float)( wd.damage2 * ( 100 + sstatus->patk ) / 100 ) ); + } + } + // Apply MasteryATK + wd.damage += wd.masteryAtk; + if( is_attack_left_handed( src, skill_id ) ){ + wd.damage2 += wd.masteryAtk2; + } + // Apply bonus damage + wd.damage += bonus_damage; + if( is_attack_left_handed( src, skill_id ) ){ + wd.damage2 += bonus_damage; } // CritAtkRate modifier From a29e115a6206e7e5806a0b455df4e058ab85f37d Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 10 Jan 2024 23:57:51 +0100 Subject: [PATCH 19/33] Corrected CD_ARBITRIUM_ATK area of damage (#8096) * The splash area should be 9x9 according to skill description Fixed #8079 Thanks to @Jaikayray --- db/re/skill_db.yml | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index f11bbedc72..3774fdea78 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -37417,27 +37417,7 @@ Body: Hit: Single HitCount: 1 Element: Holy - SplashArea: - - Level: 1 - Area: 1 - - Level: 2 - Area: 1 - - Level: 3 - Area: 1 - - Level: 4 - Area: 2 - - Level: 5 - Area: 2 - - Level: 6 - Area: 2 - - Level: 7 - Area: 3 - - Level: 8 - Area: 3 - - Level: 9 - Area: 3 - - Level: 10 - Area: 4 + SplashArea: 4 Requires: SpCost: 1 - Id: 5275 From 96f40d9adc2274d024c19a3a94522e339d9f5c92 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 11 Jan 2024 00:47:57 +0100 Subject: [PATCH 20/33] Converted some whitespaces to tabs --- src/map/status.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/map/status.cpp b/src/map/status.cpp index 8e82c7c9dc..3c3361d21b 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -4644,20 +4644,20 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) sd->indexed_bonus.subele[ELE_HOLY] += sc->getSCE(SC_PROVIDENCE)->val2; sd->indexed_bonus.subrace[RC_DEMON] += sc->getSCE(SC_PROVIDENCE)->val2; } - if (sc->getSCE(SC_GEFFEN_MAGIC1)) { - sd->right_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; - sd->right_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; - sd->left_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; - sd->left_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; - } - if (sc->getSCE(SC_GEFFEN_MAGIC2)) { - sd->indexed_bonus.magic_addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; - sd->indexed_bonus.magic_addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; - } - if(sc->getSCE(SC_GEFFEN_MAGIC3)) { - sd->indexed_bonus.subrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC3)->val1; - sd->indexed_bonus.subrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC3)->val1; - } + if (sc->getSCE(SC_GEFFEN_MAGIC1)) { + sd->right_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + sd->right_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + sd->left_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + sd->left_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + } + if (sc->getSCE(SC_GEFFEN_MAGIC2)) { + sd->indexed_bonus.magic_addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; + sd->indexed_bonus.magic_addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; + } + if(sc->getSCE(SC_GEFFEN_MAGIC3)) { + sd->indexed_bonus.subrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC3)->val1; + sd->indexed_bonus.subrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC3)->val1; + } if(sc->getSCE(SC_ARMOR_ELEMENT_WATER)) { // This status change should grant card-type elemental resist. sd->indexed_bonus.subele[ELE_WATER] += sc->getSCE(SC_ARMOR_ELEMENT_WATER)->val1; sd->indexed_bonus.subele[ELE_EARTH] += sc->getSCE(SC_ARMOR_ELEMENT_WATER)->val2; From 360b8bc3e28c9fb107580c44a0a3a09e42ca646a Mon Sep 17 00:00:00 2001 From: Atemo Date: Thu, 11 Jan 2024 15:31:17 +0100 Subject: [PATCH 21/33] Corrected IG_GRAND_JUDGEMENT (#8095) * Moved IG_GRAND_JUDGEMENT with other splash skills in skill_castend_damage_id Co-authored-by: Lemongrass3110 Fixed #8080 Thanks to @Jaikayray --- src/map/skill.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 67b85c9d44..a2615adc88 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5214,7 +5214,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case DK_DRAGONIC_AURA: case DK_STORMSLASH: - case IG_GRAND_JUDGEMENT: case CD_EFFLIGO: case ABC_FRENZY_SHOT: case WH_HAWKRUSH: @@ -5225,8 +5224,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); if (skill_id == DK_DRAGONIC_AURA) sc_start(src, src, SC_DRAGONIC_AURA, 100, skill_lv, skill_get_time(skill_id,skill_lv)); - else if (skill_id == IG_GRAND_JUDGEMENT) - sc_start(src, src, SC_SPEAR_SCAR, 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; case SHC_ETERNAL_SLASH: @@ -5671,6 +5668,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NPC_WIDECRITICALWOUND: case IG_SHIELD_SHOOTING: case TR_METALIC_FURY: + case IG_GRAND_JUDGEMENT: if( flag&1 ) {//Recursive invocation int sflag = skill_area_temp[0] & 0xFFF; int heal = 0; @@ -5868,8 +5866,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint sc_start( src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time2( skill_id, skill_lv ) ); break; case IG_SHIELD_SHOOTING: + case IG_GRAND_JUDGEMENT: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - sc_start(src, src, SC_SHIELD_POWER, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; } From c4026c08c828ce6646b4daf9c6f89a2eae382399 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Fri, 12 Jan 2024 11:42:08 +0100 Subject: [PATCH 22/33] Some bonus ignored left_cardfix_to_right (#8097) Taken from #7024 Co-authored-by: munkrej --- src/map/status.cpp | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/map/status.cpp b/src/map/status.cpp index 3c3361d21b..fd5f3445e7 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -4503,15 +4503,19 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) skill = skill * 4; sd->right_weapon.addrace[RC_DRAGON]+=skill; - sd->left_weapon.addrace[RC_DRAGON]+=skill; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addrace[RC_DRAGON] += skill; + } sd->indexed_bonus.magic_addrace[RC_DRAGON]+=dragon_matk; sd->indexed_bonus.subrace[RC_DRAGON]+=skill; } if ((skill = pc_checkskill(sd, AB_EUCHARISTICA)) > 0) { sd->right_weapon.addrace[RC_DEMON] += skill; sd->right_weapon.addele[ELE_DARK] += skill; - sd->left_weapon.addrace[RC_DEMON] += skill; - sd->left_weapon.addele[ELE_DARK] += skill; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addrace[RC_DEMON] += skill; + sd->left_weapon.addele[ELE_DARK] += skill; + } sd->indexed_bonus.magic_addrace[RC_DEMON] += skill; sd->indexed_bonus.magic_addele[ELE_DARK] += skill; sd->indexed_bonus.subrace[RC_DEMON] += skill; @@ -4535,8 +4539,10 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) sd->right_weapon.addrace[RC_UNDEAD] += race_atk[skill - 1]; sd->right_weapon.addrace[RC_DEMON] += race_atk[skill - 1]; - sd->left_weapon.addrace[RC_UNDEAD] += race_atk[skill - 1]; - sd->left_weapon.addrace[RC_DEMON] += race_atk[skill - 1]; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addrace[RC_UNDEAD] += race_atk[skill - 1]; + sd->left_weapon.addrace[RC_DEMON] += race_atk[skill - 1]; + } sd->indexed_bonus.subrace[RC_UNDEAD] += race_def[skill - 1]; sd->indexed_bonus.subrace[RC_DEMON] += race_def[skill - 1]; } @@ -4550,7 +4556,9 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) for( uint8 size = SZ_SMALL; size < SZ_MAX; size++ ){ sd->right_weapon.addsize[size] += attack_bonus[size][skill - 1]; - sd->left_weapon.addsize[size] += attack_bonus[size][skill - 1]; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addsize[size] += attack_bonus[size][skill - 1]; + } } } if ((skill = pc_checkskill(sd, CD_FIDUS_ANIMUS)) > 0) { @@ -4580,7 +4588,9 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) for( uint8 size = SZ_SMALL; size < SZ_MAX; size++ ){ sd->right_weapon.addsize[size] += attack_bonus[size][skill - 1]; - sd->left_weapon.addsize[size] += attack_bonus[size][skill - 1]; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addsize[size] += attack_bonus[size][skill - 1]; + } } } if ((skill = pc_checkskill(sd, ABC_MAGIC_SWORD_M)) > 0 && (sd->status.weapon == W_DAGGER || sd->status.weapon == W_1HSWORD || sd->status.weapon == W_DOUBLE_DD || sd->status.weapon == W_DOUBLE_SS || sd->status.weapon == W_DOUBLE_DS || sd->status.weapon == W_DOUBLE_DA || sd->status.weapon == W_DOUBLE_SA)) { @@ -4627,8 +4637,10 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) i = sc->getSCE(SC_BASILICA)->val1 * 5; sd->right_weapon.addele[ELE_DARK] += i; sd->right_weapon.addele[ELE_UNDEAD] += i; - sd->left_weapon.addele[ELE_DARK] += i; - sd->left_weapon.addele[ELE_UNDEAD] += i; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addele[ELE_DARK] += i; + sd->left_weapon.addele[ELE_UNDEAD] += i; + } sd->indexed_bonus.magic_atk_ele[ELE_HOLY] += sc->getSCE(SC_BASILICA)->val1 * 3; } if (sc->getSCE(SC_FIREWEAPON)) @@ -4647,8 +4659,10 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) if (sc->getSCE(SC_GEFFEN_MAGIC1)) { sd->right_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; sd->right_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; - sd->left_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; - sd->left_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE( SC_GEFFEN_MAGIC1 )->val1; + sd->left_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE( SC_GEFFEN_MAGIC1 )->val1; + } } if (sc->getSCE(SC_GEFFEN_MAGIC2)) { sd->indexed_bonus.magic_addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; From 1362c7666d34e86042dbd2994f62509da9473da0 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Sat, 13 Jan 2024 01:31:04 +0100 Subject: [PATCH 23/33] Fixed RK_WINDCUTTER not ignoring def (#8102) The order of the checks was wrong and therefore the if could never be reached. Co-authored-by: munkrej --- src/map/battle.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index a6564c7da2..03e74746dd 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3240,7 +3240,11 @@ static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct #endif if (sc && sc->getSCE(SC_FUSION)) return true; - else if (skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS) + + if (skill_id == RK_WINDCUTTER && sd && sd->status.weapon == W_2HSWORD) + return true; + + if (skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS) { //Ignore Defense? if (sd && (sd->right_weapon.ignore_def_ele & (1<def_ele) || sd->right_weapon.ignore_def_ele & (1<right_weapon.ignore_def_race & (1<race) || sd->right_weapon.ignore_def_race & (1<status.weapon == W_2HSWORD) - return true; + } return nk[NK_IGNOREDEFENSE] != 0; } From 5ad81d67ea66142036fe5bbc03688c4ac80be267 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 16 Jan 2024 13:56:27 +0100 Subject: [PATCH 24/33] Corrected the boss spawn in lhz_dun_n (#8099) * Removed the use of killedrid in the script in case the killer is not a player. --- npc/re/mobs/dungeons/lhz_dun_n.txt | 75 ++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/npc/re/mobs/dungeons/lhz_dun_n.txt b/npc/re/mobs/dungeons/lhz_dun_n.txt index 590c411da1..c19e89dc86 100644 --- a/npc/re/mobs/dungeons/lhz_dun_n.txt +++ b/npc/re/mobs/dungeons/lhz_dun_n.txt @@ -9,35 +9,66 @@ // monsters killed. [Capuche] //============================================================ -lhz_dun_n,0,0 monster Eremes Guille 3208,20,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Magaleta Sorin 3209,10,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Catherine Cheiron 3210,15,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Shecil Damon 3211,20,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Harword Alt-Eisen 3212,10,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Seyren Windsor 3213,10,5000,0,"lhz_dun_n::OnRegularDead" +lhz_dun_n,0,0 monster Eremes Guille 3208,20,5000,0,"lhz_dun_n::OnRegularDead3208" +lhz_dun_n,0,0 monster Magaleta Sorin 3209,10,5000,0,"lhz_dun_n::OnRegularDead3209" +lhz_dun_n,0,0 monster Catherine Cheiron 3210,15,5000,0,"lhz_dun_n::OnRegularDead3210" +lhz_dun_n,0,0 monster Shecil Damon 3211,20,5000,0,"lhz_dun_n::OnRegularDead3211" +lhz_dun_n,0,0 monster Harword Alt-Eisen 3212,10,5000,0,"lhz_dun_n::OnRegularDead3212" +lhz_dun_n,0,0 monster Seyren Windsor 3213,10,5000,0,"lhz_dun_n::OnRegularDead3213" -lhz_dun_n,0,0 monster Randel Lawrence 3226,10,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Flamel Emule 3227,10,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Celia Alde 3228,15,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Chen Liu 3229,15,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Gertie Wie 3230,15,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Alphoccio Basil 3231,10,5000,0,"lhz_dun_n::OnRegularDead" -lhz_dun_n,0,0 monster Trentini 3232,10,5000,0,"lhz_dun_n::OnRegularDead" +lhz_dun_n,0,0 monster Randel Lawrence 3226,10,5000,0,"lhz_dun_n::OnRegularDead3226" +lhz_dun_n,0,0 monster Flamel Emule 3227,10,5000,0,"lhz_dun_n::OnRegularDead3227" +lhz_dun_n,0,0 monster Celia Alde 3228,15,5000,0,"lhz_dun_n::OnRegularDead3228" +lhz_dun_n,0,0 monster Chen Liu 3229,15,5000,0,"lhz_dun_n::OnRegularDead3229" +lhz_dun_n,0,0 monster Gertie Wie 3230,15,5000,0,"lhz_dun_n::OnRegularDead3230" +lhz_dun_n,0,0 monster Alphoccio Basil 3231,10,5000,0,"lhz_dun_n::OnRegularDead3231" +lhz_dun_n,0,0 monster Trentini 3232,10,5000,0,"lhz_dun_n::OnRegularDead3232" lhz_dun_n,0,0,0 script lhz_dun_n -1,{ end; -OnRegularDead: - .@mob_id = killedrid; +OnRegularDead3208: callsub( S_Regular, 3208 ); +OnRegularDead3209: callsub( S_Regular, 3209 ); +OnRegularDead3210: callsub( S_Regular, 3210 ); +OnRegularDead3211: callsub( S_Regular, 3211 ); +OnRegularDead3212: callsub( S_Regular, 3212 ); +OnRegularDead3213: callsub( S_Regular, 3213 ); + +OnRegularDead3226: callsub( S_Regular, 3226 ); +OnRegularDead3227: callsub( S_Regular, 3227 ); +OnRegularDead3228: callsub( S_Regular, 3228 ); +OnRegularDead3229: callsub( S_Regular, 3229 ); +OnRegularDead3230: callsub( S_Regular, 3230 ); +OnRegularDead3231: callsub( S_Regular, 3231 ); +OnRegularDead3232: callsub( S_Regular, 3232 ); + +S_Regular: + .@mob_id = getarg(0); if (.lhz_dun_n[.@mob_id] < 110 && .lhz_dun_n_boss == 0) { .lhz_dun_n[.@mob_id]++; if (.lhz_dun_n[.@mob_id] == 110) { - .@mini_boss = .@mob_id + 6 + (.@mob_id > 3213); // mini boss version ID: regular ID +6 for non-transcendent, +7 for others - monster "lhz_dun_n",0,0,"--en--",.@mini_boss,1, "lhz_dun_n::OnMiniDead"; + .@mini_boss = .@mob_id + 6 + (.@mob_id > 3219); // mini boss version ID: regular ID +6 for non-transcendent, +7 for others + monster "lhz_dun_n",0,0,"--en--",.@mini_boss,1, "lhz_dun_n::OnMiniDead" + .@mini_boss; } } end; -OnMiniDead: - .@mob_id = killedrid; + +OnMiniDead3214: callsub( S_Mini, 3214 ); +OnMiniDead3215: callsub( S_Mini, 3215 ); +OnMiniDead3216: callsub( S_Mini, 3216 ); +OnMiniDead3217: callsub( S_Mini, 3217 ); +OnMiniDead3218: callsub( S_Mini, 3218 ); +OnMiniDead3219: callsub( S_Mini, 3219 ); + +OnMiniDead3233: callsub( S_Mini, 3233 ); +OnMiniDead3234: callsub( S_Mini, 3234 ); +OnMiniDead3235: callsub( S_Mini, 3235 ); +OnMiniDead3236: callsub( S_Mini, 3236 ); +OnMiniDead3237: callsub( S_Mini, 3237 ); +OnMiniDead3238: callsub( S_Mini, 3238 ); +OnMiniDead3239: callsub( S_Mini, 3239 ); + +S_Mini: + .@mob_id = getarg(0); if (.lhz_dun_n[.@mob_id] < 4 && .lhz_dun_n_boss == 0) { .lhz_dun_n[.@mob_id]++; .@regular = .@mob_id - 6 - (.@mob_id > 3219); @@ -53,11 +84,7 @@ OnMiniDead: monster "lhz_dun_n",140,230,"--en--", F_Rand(3220,3221,3222,3223,3224,3225,3240,3241,3242,3243,3244,3245,3246),1, "lhz_dun_n::OnMyMVPDead"; mapannounce "lhz_dun_n", "Voice of Reaper: It's been a while.", bc_map; // unknown message .lhz_dun_n_boss = 1; - for ( .@i = 0; .@i < 13; ++.@i ) { - .@regular = .@mini_boss_list[.@i] - 6 - (.@mini_boss_list[.@i] > 3219); - .lhz_dun_n[.@regular] = 0; - .lhz_dun_n[.@mini_boss_list[.@i]] = 0; - } + deletearray .lhz_dun_n; } } end; From f5909c3d789a75af46d463f5a399df99c478fc89 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 17 Jan 2024 14:37:05 +0100 Subject: [PATCH 25/33] Update renewal Base exp and Job exp (#8103) * Updated Base exp * Updated job exp --- db/re/job_exp.yml | 1886 ++++++++++++++++++++++----------------------- 1 file changed, 943 insertions(+), 943 deletions(-) diff --git a/db/re/job_exp.yml b/db/re/job_exp.yml index 1b17514a6e..fdebbe6d84 100644 --- a/db/re/job_exp.yml +++ b/db/re/job_exp.yml @@ -143,201 +143,201 @@ Body: MaxBaseLevel: 99 BaseExp: - Level: 1 - Exp: 550 + Exp: 548 - Level: 2 - Exp: 900 + Exp: 894 - Level: 3 - Exp: 1500 + Exp: 1486 - Level: 4 - Exp: 2200 + Exp: 2173 - Level: 5 - Exp: 3200 + Exp: 3152 - Level: 6 - Exp: 3800 + Exp: 3732 - Level: 7 - Exp: 4200 + Exp: 4112 - Level: 8 - Exp: 4550 + Exp: 4441 - Level: 9 - Exp: 5000 + Exp: 4866 - Level: 10 - Exp: 5500 + Exp: 5337 - Level: 11 - Exp: 6000 + Exp: 5804 - Level: 12 - Exp: 6100 + Exp: 5883 - Level: 13 - Exp: 6350 + Exp: 6106 - Level: 14 - Exp: 6700 + Exp: 6424 - Level: 15 - Exp: 7350 + Exp: 7026 - Level: 16 - Exp: 8000 + Exp: 7624 - Level: 17 - Exp: 8400 + Exp: 7981 - Level: 18 - Exp: 8800 + Exp: 8336 - Level: 19 - Exp: 9200 + Exp: 8689 - Level: 20 - Exp: 9700 + Exp: 9134 - Level: 21 - Exp: 10300 + Exp: 9670 - Level: 22 - Exp: 11000 + Exp: 10296 - Level: 23 - Exp: 11800 + Exp: 11012 - Level: 24 - Exp: 13000 + Exp: 12095 - Level: 25 - Exp: 14000 + Exp: 12986 - Level: 26 - Exp: 15000 + Exp: 13872 - Level: 27 - Exp: 16000 + Exp: 14753 - Level: 28 - Exp: 17000 + Exp: 15628 - Level: 29 - Exp: 18000 + Exp: 16498 - Level: 30 - Exp: 19000 + Exp: 17362 - Level: 31 - Exp: 20000 + Exp: 18221 - Level: 32 - Exp: 21000 + Exp: 19074 - Level: 33 - Exp: 22000 + Exp: 19923 - Level: 34 - Exp: 23200 + Exp: 20947 - Level: 35 - Exp: 24000 + Exp: 21604 - Level: 36 - Exp: 26000 + Exp: 23334 - Level: 37 - Exp: 27500 + Exp: 24606 - Level: 38 - Exp: 29000 + Exp: 25871 - Level: 39 - Exp: 30000 + Exp: 26682 - Level: 40 - Exp: 31500 + Exp: 27932 - Level: 41 - Exp: 33000 + Exp: 29175 - Level: 42 - Exp: 34000 + Exp: 29969 - Level: 43 - Exp: 36000 + Exp: 31636 - Level: 44 - Exp: 37500 + Exp: 32856 - Level: 45 - Exp: 38000 + Exp: 33194 - Level: 46 - Exp: 40000 + Exp: 34836 - Level: 47 - Exp: 42000 + Exp: 36468 - Level: 48 - Exp: 44500 + Exp: 38523 - Level: 49 - Exp: 47000 + Exp: 40565 - Level: 50 - Exp: 49000 + Exp: 42165 - Level: 51 - Exp: 51000 + Exp: 43754 - Level: 52 - Exp: 53000 + Exp: 45334 - Level: 53 - Exp: 55000 + Exp: 46903 - Level: 54 - Exp: 59000 + Exp: 48463 - Level: 55 - Exp: 61500 + Exp: 50013 - Level: 56 - Exp: 61500 + Exp: 51976 - Level: 57 - Exp: 63000 + Exp: 53084 - Level: 58 - Exp: 65000 + Exp: 54605 - Level: 59 - Exp: 67000 + Exp: 56116 - Level: 60 - Exp: 69000 + Exp: 57618 - Level: 61 - Exp: 70000 + Exp: 58277 - Level: 62 - Exp: 73000 + Exp: 60593 - Level: 63 - Exp: 77000 + Exp: 63721 - Level: 64 - Exp: 80000 + Exp: 66005 - Level: 65 - Exp: 84000 + Exp: 69097 - Level: 66 - Exp: 88000 + Exp: 72171 - Level: 67 - Exp: 91000 + Exp: 74407 - Level: 68 - Exp: 95000 + Exp: 77445 - Level: 69 - Exp: 110000 + Exp: 89404 - Level: 70 - Exp: 128000 + Exp: 103722 - Level: 71 - Exp: 140000 + Exp: 113105 - Level: 72 - Exp: 155000 + Exp: 124848 - Level: 73 - Exp: 163000 + Exp: 130898 - Level: 74 - Exp: 170000 + Exp: 136110 - Level: 75 - Exp: 180000 + Exp: 143684 - Level: 76 - Exp: 188000 + Exp: 149620 - Level: 77 - Exp: 195000 + Exp: 154725 - Level: 78 - Exp: 200000 + Exp: 158216 - Level: 79 - Exp: 230000 + Exp: 175461 - Level: 80 - Exp: 260000 + Exp: 194586 - Level: 81 - Exp: 300000 + Exp: 215795 - Level: 82 - Exp: 350000 + Exp: 239316 - Level: 83 - Exp: 400000 + Exp: 265401 - Level: 84 - Exp: 480000 + Exp: 294329 - Level: 85 - Exp: 550000 + Exp: 326410 - Level: 86 - Exp: 600000 + Exp: 361988 - Level: 87 - Exp: 680000 + Exp: 401444 - Level: 88 - Exp: 750000 + Exp: 445201 - Level: 89 - Exp: 900000 + Exp: 493727 - Level: 90 - Exp: 1000000 + Exp: 547543 - Level: 91 - Exp: 1200000 + Exp: 607225 - Level: 92 - Exp: 1500000 + Exp: 673412 - Level: 93 - Exp: 1800000 + Exp: 746813 - Level: 94 - Exp: 2100000 + Exp: 828215 - Level: 95 - Exp: 2400000 + Exp: 918490 - Level: 96 - Exp: 2800000 + Exp: 1018605 - Level: 97 - Exp: 3300000 + Exp: 1129632 - Level: 98 - Exp: 4000000 + Exp: 1252761 - Level: 99 Exp: 99999999 - Jobs: @@ -366,201 +366,201 @@ Body: MaxBaseLevel: 99 BaseExp: - Level: 1 - Exp: 600 + Exp: 658 - Level: 2 - Exp: 1080 + Exp: 1073 - Level: 3 - Exp: 1800 + Exp: 1783 - Level: 4 - Exp: 2640 + Exp: 2608 - Level: 5 - Exp: 3840 + Exp: 3782 - Level: 6 - Exp: 4560 + Exp: 4478 - Level: 7 - Exp: 5040 + Exp: 4935 - Level: 8 - Exp: 5460 + Exp: 5330 - Level: 9 - Exp: 6000 + Exp: 5839 - Level: 10 - Exp: 6600 + Exp: 6404 - Level: 11 - Exp: 7200 + Exp: 6965 - Level: 12 - Exp: 7320 + Exp: 7060 - Level: 13 - Exp: 7620 + Exp: 7328 - Level: 14 - Exp: 8040 + Exp: 7708 - Level: 15 - Exp: 8820 + Exp: 8431 - Level: 16 - Exp: 9600 + Exp: 9149 - Level: 17 - Exp: 10080 + Exp: 9578 - Level: 18 - Exp: 10560 + Exp: 10004 - Level: 19 - Exp: 11040 + Exp: 10427 - Level: 20 - Exp: 12610 + Exp: 11874 - Level: 21 - Exp: 13390 + Exp: 12571 - Level: 22 - Exp: 14300 + Exp: 13385 - Level: 23 - Exp: 15340 + Exp: 14315 - Level: 24 - Exp: 16900 + Exp: 15724 - Level: 25 - Exp: 18460 + Exp: 17124 - Level: 26 - Exp: 19500 + Exp: 18034 - Level: 27 - Exp: 20800 + Exp: 19179 - Level: 28 - Exp: 22100 + Exp: 20316 - Level: 29 - Exp: 23400 + Exp: 21447 - Level: 30 - Exp: 24700 + Exp: 22571 - Level: 31 - Exp: 26000 + Exp: 23687 - Level: 32 - Exp: 27300 + Exp: 24797 - Level: 33 - Exp: 28600 + Exp: 25900 - Level: 34 - Exp: 30160 + Exp: 27231 - Level: 35 - Exp: 31200 + Exp: 28085 - Level: 36 - Exp: 33800 + Exp: 30334 - Level: 37 - Exp: 35750 + Exp: 31988 - Level: 38 - Exp: 37700 + Exp: 33632 - Level: 39 - Exp: 39000 + Exp: 34687 - Level: 40 - Exp: 44100 + Exp: 39106 - Level: 41 - Exp: 46200 + Exp: 40845 - Level: 42 - Exp: 47600 + Exp: 41956 - Level: 43 - Exp: 50400 + Exp: 44291 - Level: 44 - Exp: 52500 + Exp: 45998 - Level: 45 - Exp: 53200 + Exp: 46472 - Level: 46 - Exp: 56000 + Exp: 48771 - Level: 47 - Exp: 58800 + Exp: 51056 - Level: 48 - Exp: 62300 + Exp: 53933 - Level: 49 - Exp: 65800 + Exp: 56792 - Level: 50 - Exp: 68600 + Exp: 59031 - Level: 51 - Exp: 71400 + Exp: 61256 - Level: 52 - Exp: 74200 + Exp: 63467 - Level: 53 - Exp: 77000 + Exp: 65665 - Level: 54 - Exp: 79800 + Exp: 67848 - Level: 55 - Exp: 82600 + Exp: 70018 - Level: 56 - Exp: 86100 + Exp: 72766 - Level: 57 - Exp: 88200 + Exp: 74317 - Level: 58 - Exp: 91000 + Exp: 76447 - Level: 59 - Exp: 93800 + Exp: 78562 - Level: 60 - Exp: 103500 + Exp: 86427 - Level: 61 - Exp: 105000 + Exp: 87416 - Level: 62 - Exp: 109500 + Exp: 90889 - Level: 63 - Exp: 115500 + Exp: 95582 - Level: 64 - Exp: 120000 + Exp: 99008 - Level: 65 - Exp: 126000 + Exp: 103646 - Level: 66 - Exp: 132000 + Exp: 108256 - Level: 67 - Exp: 136500 + Exp: 111611 - Level: 68 - Exp: 142500 + Exp: 116167 - Level: 69 - Exp: 165000 + Exp: 134106 - Level: 70 - Exp: 192000 + Exp: 155583 - Level: 71 - Exp: 210000 + Exp: 169658 - Level: 72 - Exp: 232500 + Exp: 187272 - Level: 73 - Exp: 244500 + Exp: 196347 - Level: 74 - Exp: 255000 + Exp: 204165 - Level: 75 - Exp: 270000 + Exp: 215526 - Level: 76 - Exp: 282000 + Exp: 224430 - Level: 77 - Exp: 292500 + Exp: 232088 - Level: 78 - Exp: 300000 + Exp: 237325 - Level: 79 - Exp: 345000 + Exp: 257972 - Level: 80 - Exp: 416000 + Exp: 280415 - Level: 81 - Exp: 480000 + Exp: 304811 - Level: 82 - Exp: 560000 + Exp: 331329 - Level: 83 - Exp: 640000 + Exp: 360154 - Level: 84 - Exp: 768000 + Exp: 391487 - Level: 85 - Exp: 880000 + Exp: 425546 - Level: 86 - Exp: 960000 + Exp: 462568 - Level: 87 - Exp: 1088000 + Exp: 502811 - Level: 88 - Exp: 1200000 + Exp: 546555 - Level: 89 - Exp: 1440000 + Exp: 594105 - Level: 90 - Exp: 1700000 + Exp: 645792 - Level: 91 - Exp: 2040000 + Exp: 701975 - Level: 92 - Exp: 2550000 + Exp: 763046 - Level: 93 - Exp: 3060000 + Exp: 829431 - Level: 94 - Exp: 3570000 + Exp: 901591 - Level: 95 - Exp: 4080000 + Exp: 980029 - Level: 96 - Exp: 4760000 + Exp: 1065291 - Level: 97 - Exp: 5610000 + Exp: 1157971 - Level: 98 - Exp: 6800000 + Exp: 1258714 - Level: 99 Exp: 99999999 - Jobs: @@ -581,201 +581,201 @@ Body: MaxBaseLevel: 200 BaseExp: - Level: 1 - Exp: 550 + Exp: 548 - Level: 2 - Exp: 900 + Exp: 894 - Level: 3 - Exp: 1500 + Exp: 1486 - Level: 4 - Exp: 2200 + Exp: 2173 - Level: 5 - Exp: 3200 + Exp: 3152 - Level: 6 - Exp: 3800 + Exp: 3732 - Level: 7 - Exp: 4200 + Exp: 4112 - Level: 8 - Exp: 4550 + Exp: 4441 - Level: 9 - Exp: 5000 + Exp: 4866 - Level: 10 - Exp: 5500 + Exp: 5337 - Level: 11 - Exp: 6000 + Exp: 5804 - Level: 12 - Exp: 6100 + Exp: 5883 - Level: 13 - Exp: 6350 + Exp: 6106 - Level: 14 - Exp: 6700 + Exp: 6424 - Level: 15 - Exp: 7350 + Exp: 7026 - Level: 16 - Exp: 8000 + Exp: 7624 - Level: 17 - Exp: 8400 + Exp: 7981 - Level: 18 - Exp: 8800 + Exp: 8336 - Level: 19 - Exp: 9200 + Exp: 8689 - Level: 20 - Exp: 9700 + Exp: 9134 - Level: 21 - Exp: 10300 + Exp: 9670 - Level: 22 - Exp: 11000 + Exp: 10296 - Level: 23 - Exp: 11800 + Exp: 11012 - Level: 24 - Exp: 13000 + Exp: 12095 - Level: 25 - Exp: 14000 + Exp: 12986 - Level: 26 - Exp: 15000 + Exp: 13872 - Level: 27 - Exp: 16000 + Exp: 14753 - Level: 28 - Exp: 17000 + Exp: 15628 - Level: 29 - Exp: 18000 + Exp: 16498 - Level: 30 - Exp: 19000 + Exp: 17362 - Level: 31 - Exp: 20000 + Exp: 18221 - Level: 32 - Exp: 21000 + Exp: 19074 - Level: 33 - Exp: 22000 + Exp: 19923 - Level: 34 - Exp: 23200 + Exp: 20947 - Level: 35 - Exp: 24000 + Exp: 21604 - Level: 36 - Exp: 26000 + Exp: 23334 - Level: 37 - Exp: 27500 + Exp: 24606 - Level: 38 - Exp: 29000 + Exp: 25871 - Level: 39 - Exp: 30000 + Exp: 26682 - Level: 40 - Exp: 31500 + Exp: 27932 - Level: 41 - Exp: 33000 + Exp: 29175 - Level: 42 - Exp: 34000 + Exp: 29969 - Level: 43 - Exp: 36000 + Exp: 31636 - Level: 44 - Exp: 37500 + Exp: 32856 - Level: 45 - Exp: 38000 + Exp: 33194 - Level: 46 - Exp: 40000 + Exp: 34836 - Level: 47 - Exp: 42000 + Exp: 36468 - Level: 48 - Exp: 44500 + Exp: 38523 - Level: 49 - Exp: 47000 + Exp: 40565 - Level: 50 - Exp: 49000 + Exp: 42165 - Level: 51 - Exp: 51000 + Exp: 43754 - Level: 52 - Exp: 53000 + Exp: 45334 - Level: 53 - Exp: 55000 + Exp: 46903 - Level: 54 - Exp: 59000 + Exp: 48463 - Level: 55 - Exp: 61500 + Exp: 50013 - Level: 56 - Exp: 61500 + Exp: 51976 - Level: 57 - Exp: 63000 + Exp: 53084 - Level: 58 - Exp: 65000 + Exp: 54605 - Level: 59 - Exp: 67000 + Exp: 56116 - Level: 60 - Exp: 69000 + Exp: 57618 - Level: 61 - Exp: 70000 + Exp: 58277 - Level: 62 - Exp: 73000 + Exp: 60593 - Level: 63 - Exp: 77000 + Exp: 63721 - Level: 64 - Exp: 80000 + Exp: 66005 - Level: 65 - Exp: 84000 + Exp: 69097 - Level: 66 - Exp: 88000 + Exp: 72171 - Level: 67 - Exp: 91000 + Exp: 74407 - Level: 68 - Exp: 95000 + Exp: 77445 - Level: 69 - Exp: 110000 + Exp: 89404 - Level: 70 - Exp: 128000 + Exp: 103722 - Level: 71 - Exp: 140000 + Exp: 113105 - Level: 72 - Exp: 155000 + Exp: 124848 - Level: 73 - Exp: 163000 + Exp: 130898 - Level: 74 - Exp: 170000 + Exp: 136110 - Level: 75 - Exp: 180000 + Exp: 143684 - Level: 76 - Exp: 188000 + Exp: 149620 - Level: 77 - Exp: 195000 + Exp: 154725 - Level: 78 - Exp: 200000 + Exp: 158216 - Level: 79 - Exp: 230000 + Exp: 175461 - Level: 80 - Exp: 260000 + Exp: 194586 - Level: 81 - Exp: 300000 + Exp: 215795 - Level: 82 - Exp: 350000 + Exp: 239316 - Level: 83 - Exp: 400000 + Exp: 265401 - Level: 84 - Exp: 480000 + Exp: 294329 - Level: 85 - Exp: 550000 + Exp: 326410 - Level: 86 - Exp: 600000 + Exp: 361988 - Level: 87 - Exp: 680000 + Exp: 401444 - Level: 88 - Exp: 750000 + Exp: 445201 - Level: 89 - Exp: 900000 + Exp: 493727 - Level: 90 - Exp: 1000000 + Exp: 547543 - Level: 91 - Exp: 1200000 + Exp: 607225 - Level: 92 - Exp: 1500000 + Exp: 673412 - Level: 93 - Exp: 1800000 + Exp: 746813 - Level: 94 - Exp: 2100000 + Exp: 828215 - Level: 95 - Exp: 2400000 + Exp: 918490 - Level: 96 - Exp: 2800000 + Exp: 1018605 - Level: 97 - Exp: 3300000 + Exp: 1129632 - Level: 98 - Exp: 4000000 + Exp: 1252761 - Level: 99 Exp: 1272747 - Level: 100 @@ -919,7 +919,7 @@ Body: - Level: 169 Exp: 211158924 - Level: 170 - Exp: 229155105 + Exp: 228155105 - Level: 171 Exp: 246519309 - Level: 172 @@ -929,55 +929,55 @@ Body: - Level: 174 Exp: 310966207 - Level: 175 - Exp: 352013746 + Exp: 320295193 - Level: 176 - Exp: 398479560 + Exp: 329904048 - Level: 177 - Exp: 451078861 + Exp: 339801169 - Level: 178 - Exp: 510621270 + Exp: 349995204 - Level: 179 - Exp: 578023277 + Exp: 360495060 - Level: 180 - Exp: 654322349 + Exp: 371309911 - Level: 181 - Exp: 740692899 + Exp: 382449208 - Level: 182 - Exp: 838464361 + Exp: 393922684 - Level: 183 - Exp: 949141656 + Exp: 405740364 - Level: 184 - Exp: 1074428354 + Exp: 417912574 - Level: 185 - Exp: 1216252896 + Exp: 430449951 - Level: 186 - Exp: 1376798278 + Exp: 443363449 - Level: 187 - Exp: 1558535650 + Exp: 456664352 - Level: 188 - Exp: 1764262355 + Exp: 470364282 - Level: 189 - Exp: 1997144985 + Exp: 484475210 - Level: 190 - Exp: 2260768123 + Exp: 499009466 - Level: 191 - Exp: 2559189515 + Exp: 513979749 - Level: 192 - Exp: 2897002530 + Exp: 529399141 - Level: 193 - Exp: 3279406863 + Exp: 545281115 - Level: 194 - Exp: 3712288568 + Exp: 561639548 - Level: 195 - Exp: 4202310658 + Exp: 578488734 - Level: 196 - Exp: 4757015664 + Exp: 595843396 - Level: 197 - Exp: 5384941731 + Exp: 613718697 - Level: 198 - Exp: 6095754039 + Exp: 632130257 - Level: 199 - Exp: 6900363572 + Exp: 651094164 - Level: 200 Exp: 99999999 - Jobs: @@ -1035,201 +1035,201 @@ Body: MaxBaseLevel: 200 BaseExp: - Level: 1 - Exp: 600 + Exp: 658 - Level: 2 - Exp: 1080 + Exp: 1073 - Level: 3 - Exp: 1800 + Exp: 1783 - Level: 4 - Exp: 2640 + Exp: 2608 - Level: 5 - Exp: 3840 + Exp: 3782 - Level: 6 - Exp: 4560 + Exp: 4478 - Level: 7 - Exp: 5040 + Exp: 4935 - Level: 8 - Exp: 5460 + Exp: 5330 - Level: 9 - Exp: 6000 + Exp: 5839 - Level: 10 - Exp: 6600 + Exp: 6404 - Level: 11 - Exp: 7200 + Exp: 6965 - Level: 12 - Exp: 7320 + Exp: 7060 - Level: 13 - Exp: 7620 + Exp: 7328 - Level: 14 - Exp: 8040 + Exp: 7708 - Level: 15 - Exp: 8820 + Exp: 8431 - Level: 16 - Exp: 9600 + Exp: 9149 - Level: 17 - Exp: 10080 + Exp: 9578 - Level: 18 - Exp: 10560 + Exp: 10004 - Level: 19 - Exp: 11040 + Exp: 10427 - Level: 20 - Exp: 12610 + Exp: 11874 - Level: 21 - Exp: 13390 + Exp: 12571 - Level: 22 - Exp: 14300 + Exp: 13385 - Level: 23 - Exp: 15340 + Exp: 14315 - Level: 24 - Exp: 16900 + Exp: 15724 - Level: 25 - Exp: 18460 + Exp: 17124 - Level: 26 - Exp: 19500 + Exp: 18034 - Level: 27 - Exp: 20800 + Exp: 19179 - Level: 28 - Exp: 22100 + Exp: 20316 - Level: 29 - Exp: 23400 + Exp: 21447 - Level: 30 - Exp: 24700 + Exp: 22571 - Level: 31 - Exp: 26000 + Exp: 23687 - Level: 32 - Exp: 27300 + Exp: 24797 - Level: 33 - Exp: 28600 + Exp: 25900 - Level: 34 - Exp: 30160 + Exp: 27231 - Level: 35 - Exp: 31200 + Exp: 28085 - Level: 36 - Exp: 33800 + Exp: 30334 - Level: 37 - Exp: 35750 + Exp: 31988 - Level: 38 - Exp: 37700 + Exp: 33632 - Level: 39 - Exp: 39000 + Exp: 34687 - Level: 40 - Exp: 44100 + Exp: 39106 - Level: 41 - Exp: 46200 + Exp: 40845 - Level: 42 - Exp: 47600 + Exp: 41956 - Level: 43 - Exp: 50400 + Exp: 44291 - Level: 44 - Exp: 52500 + Exp: 45998 - Level: 45 - Exp: 53200 + Exp: 46472 - Level: 46 - Exp: 56000 + Exp: 48771 - Level: 47 - Exp: 58800 + Exp: 51056 - Level: 48 - Exp: 62300 + Exp: 53933 - Level: 49 - Exp: 65800 + Exp: 56792 - Level: 50 - Exp: 68600 + Exp: 59031 - Level: 51 - Exp: 71400 + Exp: 61256 - Level: 52 - Exp: 74200 + Exp: 63467 - Level: 53 - Exp: 77000 + Exp: 65665 - Level: 54 - Exp: 79800 + Exp: 67848 - Level: 55 - Exp: 82600 + Exp: 70018 - Level: 56 - Exp: 86100 + Exp: 72766 - Level: 57 - Exp: 88200 + Exp: 74317 - Level: 58 - Exp: 91000 + Exp: 76447 - Level: 59 - Exp: 93800 + Exp: 78562 - Level: 60 - Exp: 103500 + Exp: 86427 - Level: 61 - Exp: 105000 + Exp: 87416 - Level: 62 - Exp: 109500 + Exp: 90889 - Level: 63 - Exp: 115500 + Exp: 95582 - Level: 64 - Exp: 120000 + Exp: 99008 - Level: 65 - Exp: 126000 + Exp: 103646 - Level: 66 - Exp: 132000 + Exp: 108256 - Level: 67 - Exp: 136500 + Exp: 111611 - Level: 68 - Exp: 142500 + Exp: 116167 - Level: 69 - Exp: 165000 + Exp: 134106 - Level: 70 - Exp: 192000 + Exp: 155583 - Level: 71 - Exp: 210000 + Exp: 169658 - Level: 72 - Exp: 232500 + Exp: 187272 - Level: 73 - Exp: 244500 + Exp: 196347 - Level: 74 - Exp: 255000 + Exp: 204165 - Level: 75 - Exp: 270000 + Exp: 215526 - Level: 76 - Exp: 282000 + Exp: 224430 - Level: 77 - Exp: 292500 + Exp: 232088 - Level: 78 - Exp: 300000 + Exp: 237325 - Level: 79 - Exp: 345000 + Exp: 257972 - Level: 80 - Exp: 416000 + Exp: 280415 - Level: 81 - Exp: 480000 + Exp: 304811 - Level: 82 - Exp: 560000 + Exp: 331329 - Level: 83 - Exp: 640000 + Exp: 360154 - Level: 84 - Exp: 768000 + Exp: 391487 - Level: 85 - Exp: 880000 + Exp: 425546 - Level: 86 - Exp: 960000 + Exp: 462568 - Level: 87 - Exp: 1088000 + Exp: 502811 - Level: 88 - Exp: 1200000 + Exp: 546555 - Level: 89 - Exp: 1440000 + Exp: 594105 - Level: 90 - Exp: 1700000 + Exp: 645792 - Level: 91 - Exp: 2040000 + Exp: 701975 - Level: 92 - Exp: 2550000 + Exp: 763046 - Level: 93 - Exp: 3060000 + Exp: 829431 - Level: 94 - Exp: 3570000 + Exp: 901591 - Level: 95 - Exp: 4080000 + Exp: 980029 - Level: 96 - Exp: 4760000 + Exp: 1065291 - Level: 97 - Exp: 5610000 + Exp: 1157971 - Level: 98 - Exp: 6800000 + Exp: 1258714 - Level: 99 Exp: 1272747 - Level: 100 @@ -1373,7 +1373,7 @@ Body: - Level: 169 Exp: 211158924 - Level: 170 - Exp: 229155105 + Exp: 228155105 - Level: 171 Exp: 246519309 - Level: 172 @@ -1383,55 +1383,55 @@ Body: - Level: 174 Exp: 310966207 - Level: 175 - Exp: 352013746 + Exp: 320295193 - Level: 176 - Exp: 398479560 + Exp: 329904048 - Level: 177 - Exp: 451078861 + Exp: 339801169 - Level: 178 - Exp: 510621270 + Exp: 349995204 - Level: 179 - Exp: 578023277 + Exp: 360495060 - Level: 180 - Exp: 654322349 + Exp: 371309911 - Level: 181 - Exp: 740692899 + Exp: 382449208 - Level: 182 - Exp: 838464361 + Exp: 393922684 - Level: 183 - Exp: 949141656 + Exp: 405740364 - Level: 184 - Exp: 1074428354 + Exp: 417912574 - Level: 185 - Exp: 1216252896 + Exp: 430449951 - Level: 186 - Exp: 1376798278 + Exp: 443363449 - Level: 187 - Exp: 1558535650 + Exp: 456664352 - Level: 188 - Exp: 1764262355 + Exp: 470364282 - Level: 189 - Exp: 1997144985 + Exp: 484475210 - Level: 190 - Exp: 2260768123 + Exp: 499009466 - Level: 191 - Exp: 2559189515 + Exp: 513979749 - Level: 192 - Exp: 2897002530 + Exp: 529399141 - Level: 193 - Exp: 3279406863 + Exp: 545281115 - Level: 194 - Exp: 3712288568 + Exp: 561639548 - Level: 195 - Exp: 4202310658 + Exp: 578488734 - Level: 196 - Exp: 4757015664 + Exp: 595843396 - Level: 197 - Exp: 5384941731 + Exp: 613718697 - Level: 198 - Exp: 6095754039 + Exp: 632130257 - Level: 199 - Exp: 6900363572 + Exp: 651094164 - Level: 200 Exp: 99999999 - Jobs: @@ -1458,21 +1458,21 @@ Body: - Level: 9 Exp: 500 - Level: 10 - Exp: 550 - - Level: 11 Exp: 600 - - Level: 12 + - Level: 11 Exp: 700 - - Level: 13 + - Level: 12 Exp: 800 - - Level: 14 + - Level: 13 Exp: 900 - - Level: 15 + - Level: 14 Exp: 1000 - - Level: 16 + - Level: 15 Exp: 1100 - - Level: 17 + - Level: 16 Exp: 1200 + - Level: 17 + Exp: 1300 - Level: 18 Exp: 1400 - Level: 19 @@ -1638,205 +1638,205 @@ Body: - Level: 99 Exp: 1121694 - Level: 100 - Exp: 1211429 + Exp: 1206943 - Level: 101 - Exp: 1308343 + Exp: 1298670 - Level: 102 - Exp: 1413010 + Exp: 1397369 - Level: 103 - Exp: 1526050 + Exp: 1503569 - Level: 104 - Exp: 1648134 + Exp: 1617841 - Level: 105 - Exp: 1779984 + Exp: 1740797 - Level: 106 - Exp: 1922382 + Exp: 1873097 - Level: 107 - Exp: 2076172 + Exp: 2015453 - Level: 108 - Exp: 2242265 + Exp: 2168627 - Level: 109 - Exp: 2421646 + Exp: 2333443 - Level: 110 - Exp: 2615377 + Exp: 2510784 - Level: 111 - Exp: 2824607 + Exp: 2701604 - Level: 112 - Exp: 3050575 + Exp: 2906926 - Level: 113 - Exp: 3294621 + Exp: 3127852 - Level: 114 - Exp: 3558190 + Exp: 3365569 - Level: 115 - Exp: 3842845 + Exp: 3621352 - Level: 116 - Exp: 4150272 + Exp: 3896575 - Level: 117 - Exp: 4482293 + Exp: 4192714 - Level: 118 - Exp: 4840876 + Exp: 4511361 - Level: 119 - Exp: 5228146 + Exp: 4854224 - Level: 120 - Exp: 5646397 + Exp: 5223145 - Level: 121 - Exp: 6098108 + Exp: 5620104 - Level: 122 - Exp: 6585956 + Exp: 6047232 - Level: 123 - Exp: 7112832 + Exp: 6506822 - Level: 124 - Exp: 7681858 + Exp: 7001340 - Level: 125 - Exp: 8296406 + Exp: 7533442 - Level: 126 - Exp: 8960118 + Exp: 8105984 - Level: 127 - Exp: 9676927 + Exp: 8722038 - Level: 128 - Exp: 10451081 + Exp: 9384913 - Level: 129 - Exp: 11287167 + Exp: 10098167 - Level: 130 - Exp: 12190140 + Exp: 10865627 - Level: 131 - Exp: 13165351 + Exp: 11691415 - Level: 132 - Exp: 14218579 + Exp: 12579963 - Level: 133 - Exp: 15356065 + Exp: 13536040 - Level: 134 - Exp: 16584550 + Exp: 14564779 - Level: 135 - Exp: 17911314 + Exp: 15671702 - Level: 136 - Exp: 19344219 + Exp: 16862751 - Level: 137 - Exp: 20891756 + Exp: 18144320 - Level: 138 - Exp: 22563096 + Exp: 19523289 - Level: 139 - Exp: 24368143 + Exp: 21007059 - Level: 140 - Exp: 26317594 + Exp: 22603595 - Level: 141 - Exp: 28423001 + Exp: 24321468 - Level: 142 - Exp: 30696841 + Exp: 26169900 - Level: 143 - Exp: 33152588 + Exp: 28158812 - Level: 144 - Exp: 35804795 + Exp: 30298882 - Level: 145 - Exp: 38669178 + Exp: 32601597 - Level: 146 - Exp: 41762712 + Exp: 35079319 - Level: 147 - Exp: 45103728 + Exp: 37745347 - Level: 148 - Exp: 48712026 + Exp: 40613993 - Level: 149 - Exp: 52608988 + Exp: 43700657 - Level: 150 - Exp: 56817707 + Exp: 47021907 - Level: 151 - Exp: 61363123 + Exp: 50595572 - Level: 152 - Exp: 66272172 + Exp: 54440835 - Level: 153 - Exp: 71573945 + Exp: 58578338 - Level: 154 - Exp: 77299860 + Exp: 63030292 - Level: 155 - Exp: 83483848 + Exp: 67820594 - Level: 156 - Exp: 90162555 + Exp: 72974960 - Level: 157 - Exp: 97375559 + Exp: 78521056 - Level: 158 - Exp: 105165603 + Exp: 84488657 - Level: 159 - Exp: 113578851 + Exp: 90909795 - Level: 160 - Exp: 122665159 + Exp: 97818939 - Level: 161 - Exp: 132478371 + Exp: 105253178 - Level: 162 - Exp: 143076640 + Exp: 113252420 - Level: 163 - Exp: 154522771 + Exp: 121859604 - Level: 164 - Exp: 166884592 + Exp: 131120934 - Level: 165 - Exp: 177548517 + Exp: 141086125 - Level: 166 - Exp: 188893867 + Exp: 151808670 - Level: 167 - Exp: 200964185 + Exp: 163346129 - Level: 168 - Exp: 222383346 + Exp: 175760435 - Level: 169 - Exp: 234614430 + Exp: 189118228 - Level: 170 - Exp: 247518223 + Exp: 203491213 - Level: 171 - Exp: 261131725 + Exp: 218956546 - Level: 172 - Exp: 275493969 + Exp: 235597243 - Level: 173 - Exp: 290646137 + Exp: 253502633 - Level: 174 - Exp: 306631674 + Exp: 272768834 - Level: 175 - Exp: 347137718 + Exp: 293499265 - Level: 176 - Exp: 392994610 + Exp: 315805209 - Level: 177 - Exp: 444909197 + Exp: 339806405 - Level: 178 - Exp: 503681701 + Exp: 365631692 - Level: 179 - Exp: 570218053 + Exp: 377331906 - Level: 180 - Exp: 645543857 + Exp: 389406527 - Level: 181 - Exp: 730820200 + Exp: 401867536 - Level: 182 - Exp: 827361548 + Exp: 414727297 - Level: 183 - Exp: 936656008 + Exp: 427998570 - Level: 184 - Exp: 1060388266 + Exp: 441694525 - Level: 185 - Exp: 1200465555 + Exp: 455828749 - Level: 186 - Exp: 1359047054 + Exp: 470415269 - Level: 187 - Exp: 1538577169 + Exp: 485468558 - Level: 188 - Exp: 1741823213 + Exp: 501003552 - Level: 189 - Exp: 1971918059 + Exp: 517035666 - Level: 190 - Exp: 2232408434 + Exp: 533580807 - Level: 191 - Exp: 2527309588 + Exp: 550655393 - Level: 192 - Exp: 2861167184 + Exp: 568276365 - Level: 193 - Exp: 3239127369 + Exp: 586461209 - Level: 194 - Exp: 3667016094 + Exp: 605227968 - Level: 195 - Exp: 4151428920 + Exp: 624595263 - Level: 196 - Exp: 4699832680 + Exp: 644582311 - Level: 197 - Exp: 5320680577 + Exp: 665208945 - Level: 198 - Exp: 6023542481 + Exp: 686495631 - Level: 199 - Exp: 6819252442 + Exp: 708463491 - Level: 200 Exp: 99999999 - Jobs: @@ -1845,23 +1845,23 @@ Body: MaxJobLevel: 10 JobExp: - Level: 1 - Exp: 55 + Exp: 10 - Level: 2 - Exp: 90 + Exp: 18 - Level: 3 - Exp: 150 + Exp: 28 - Level: 4 - Exp: 150 + Exp: 40 - Level: 5 - Exp: 320 + Exp: 91 - Level: 6 - Exp: 380 + Exp: 151 - Level: 7 - Exp: 420 + Exp: 205 - Level: 8 - Exp: 455 + Exp: 268 - Level: 9 - Exp: 500 + Exp: 340 - Level: 10 Exp: 999999999 - Jobs: @@ -2375,23 +2375,23 @@ Body: MaxJobLevel: 10 JobExp: - Level: 1 - Exp: 12 + Exp: 11 - Level: 2 - Exp: 22 + Exp: 20 - Level: 3 - Exp: 35 + Exp: 31 - Level: 4 - Exp: 50 + Exp: 44 - Level: 5 - Exp: 113 + Exp: 100 - Level: 6 - Exp: 188 + Exp: 166 - Level: 7 - Exp: 256 + Exp: 226 - Level: 8 - Exp: 335 + Exp: 295 - Level: 9 - Exp: 425 + Exp: 374 - Level: 10 Exp: 999999999 - Jobs: @@ -2404,103 +2404,103 @@ Body: MaxJobLevel: 50 JobExp: - Level: 1 - Exp: 340 + Exp: 100 - Level: 2 - Exp: 550 + Exp: 200 - Level: 3 - Exp: 760 + Exp: 350 - Level: 4 - Exp: 990 + Exp: 550 - Level: 5 - Exp: 1250 + Exp: 800 - Level: 6 - Exp: 1600 + Exp: 1100 - Level: 7 - Exp: 1980 + Exp: 1450 - Level: 8 - Exp: 2340 + Exp: 1850 - Level: 9 - Exp: 2740 + Exp: 2300 - Level: 10 - Exp: 3140 + Exp: 2800 - Level: 11 - Exp: 3950 + Exp: 3350 - Level: 12 - Exp: 4510 + Exp: 3950 - Level: 13 - Exp: 5210 + Exp: 4600 - Level: 14 - Exp: 5950 + Exp: 5300 - Level: 15 - Exp: 7000 + Exp: 6050 - Level: 16 - Exp: 8150 + Exp: 6850 - Level: 17 - Exp: 9130 + Exp: 7700 - Level: 18 - Exp: 10220 + Exp: 8600 - Level: 19 - Exp: 11480 + Exp: 9550 - Level: 20 - Exp: 12780 + Exp: 10550 - Level: 21 - Exp: 14090 + Exp: 11600 - Level: 22 - Exp: 15560 + Exp: 12700 - Level: 23 - Exp: 16980 + Exp: 13850 - Level: 24 - Exp: 18620 + Exp: 15050 - Level: 25 - Exp: 20280 + Exp: 16300 - Level: 26 - Exp: 21780 + Exp: 17600 - Level: 27 - Exp: 24510 + Exp: 18950 - Level: 28 - Exp: 27000 + Exp: 20350 - Level: 29 - Exp: 29000 + Exp: 21800 - Level: 30 - Exp: 31000 + Exp: 23300 - Level: 31 - Exp: 36000 + Exp: 24850 - Level: 32 - Exp: 39000 + Exp: 26450 - Level: 33 - Exp: 41000 + Exp: 28100 - Level: 34 - Exp: 45000 + Exp: 29800 - Level: 35 - Exp: 49000 + Exp: 31550 - Level: 36 - Exp: 51900 + Exp: 33350 - Level: 37 - Exp: 55000 + Exp: 35200 - Level: 38 - Exp: 59450 + Exp: 37100 - Level: 39 - Exp: 64630 + Exp: 39050 - Level: 40 - Exp: 70030 + Exp: 41050 - Level: 41 - Exp: 74940 + Exp: 43100 - Level: 42 - Exp: 79800 + Exp: 45200 - Level: 43 - Exp: 84630 + Exp: 47350 - Level: 44 - Exp: 89610 + Exp: 49550 - Level: 45 - Exp: 95170 + Exp: 51800 - Level: 46 - Exp: 100420 + Exp: 54100 - Level: 47 - Exp: 107250 + Exp: 56450 - Level: 48 - Exp: 112070 + Exp: 58850 - Level: 49 - Exp: 118120 + Exp: 61300 - Level: 50 Exp: 999999999 - Jobs: @@ -2522,143 +2522,143 @@ Body: MaxJobLevel: 70 JobExp: - Level: 1 - Exp: 1803 + Exp: 1354 - Level: 2 - Exp: 2972 + Exp: 1624 - Level: 3 - Exp: 5036 + Exp: 1949 - Level: 4 - Exp: 7434 + Exp: 2339 - Level: 5 - Exp: 11312 + Exp: 2807 - Level: 6 - Exp: 13520 + Exp: 3368 - Level: 7 - Exp: 15117 + Exp: 4042 - Level: 8 - Exp: 16540 + Exp: 4850 - Level: 9 - Exp: 18350 + Exp: 5820 - Level: 10 - Exp: 21441 + Exp: 6984 - Level: 11 - Exp: 23596 + Exp: 8381 - Level: 12 - Exp: 24256 + Exp: 10057 - Level: 13 - Exp: 25461 + Exp: 12069 - Level: 14 - Exp: 27174 + Exp: 14483 - Level: 15 - Exp: 32029 + Exp: 17379 - Level: 16 - Exp: 35216 + Exp: 20855 - Level: 17 - Exp: 37349 + Exp: 25026 - Level: 18 - Exp: 39521 + Exp: 30031 - Level: 19 - Exp: 41734 + Exp: 36037 - Level: 20 - Exp: 51958 + Exp: 43245 - Level: 21 - Exp: 55721 + Exp: 51894 - Level: 22 - Exp: 60081 + Exp: 55163 - Level: 23 - Exp: 65113 + Exp: 58638 - Level: 24 - Exp: 72448 + Exp: 62333 - Level: 25 - Exp: 87216 + Exp: 66260 - Level: 26 - Exp: 93081 + Exp: 70434 - Level: 27 - Exp: 100283 + Exp: 74871 - Level: 28 - Exp: 107620 + Exp: 79588 - Level: 29 - Exp: 115094 + Exp: 84602 - Level: 30 - Exp: 135249 + Exp: 89932 - Level: 31 - Exp: 143768 + Exp: 95598 - Level: 32 - Exp: 152508 + Exp: 101620 - Level: 33 - Exp: 161343 + Exp: 108023 - Level: 34 - Exp: 171856 + Exp: 114828 - Level: 35 - Exp: 199607 + Exp: 122062 - Level: 36 - Exp: 218415 + Exp: 129752 - Level: 37 - Exp: 233368 + Exp: 137926 - Level: 38 - Exp: 248529 + Exp: 146616 - Level: 39 - Exp: 259675 + Exp: 155853 - Level: 40 - Exp: 331968 + Exp: 165671 - Level: 41 - Exp: 351261 + Exp: 176109 - Level: 42 - Exp: 365552 + Exp: 187203 - Level: 43 - Exp: 390909 + Exp: 198997 - Level: 44 - Exp: 411275 + Exp: 211534 - Level: 45 - Exp: 473857 + Exp: 224861 - Level: 46 - Exp: 503777 + Exp: 239027 - Level: 47 - Exp: 534248 + Exp: 254086 - Level: 48 - Exp: 571719 + Exp: 270093 - Level: 49 - Exp: 609886 + Exp: 287109 - Level: 50 - Exp: 674886 + Exp: 305197 - Level: 51 - Exp: 711926 + Exp: 324424 - Level: 52 - Exp: 749561 + Exp: 344863 - Level: 53 - Exp: 787957 + Exp: 366589 - Level: 54 - Exp: 826965 + Exp: 389684 - Level: 55 - Exp: 928824 + Exp: 414234 - Level: 56 - Exp: 984554 + Exp: 440331 - Level: 57 - Exp: 1022494 + Exp: 468072 - Level: 58 - Exp: 1070636 + Exp: 497561 - Level: 59 - Exp: 1119554 + Exp: 528907 - Level: 60 - Exp: 1269585 + Exp: 562228 - Level: 61 - Exp: 1307290 + Exp: 597649 - Level: 62 - Exp: 1396228 + Exp: 635300 - Level: 63 - Exp: 1512414 + Exp: 675324 - Level: 64 - Exp: 1604928 + Exp: 717870 - Level: 65 - Exp: 1830969 + Exp: 763096 - Level: 66 - Exp: 2034180 + Exp: 811171 - Level: 67 - Exp: 2211611 + Exp: 862274 - Level: 68 - Exp: 2538936 + Exp: 916598 - Level: 69 - Exp: 3105953 + Exp: 974343 - Level: 70 Exp: 999999 - Jobs: @@ -2873,103 +2873,103 @@ Body: MaxJobLevel: 50 JobExp: - Level: 1 - Exp: 112000 + Exp: 12800 - Level: 2 - Exp: 355000 + Exp: 16384 - Level: 3 - Exp: 615000 + Exp: 20971 - Level: 4 - Exp: 917000 + Exp: 26843 - Level: 5 - Exp: 1253000 + Exp: 34359 - Level: 6 - Exp: 1595000 + Exp: 43980 - Level: 7 - Exp: 2007000 + Exp: 56294 - Level: 8 - Exp: 2430000 + Exp: 72057 - Level: 9 - Exp: 2868000 + Exp: 92233 - Level: 10 - Exp: 3420000 + Exp: 118059 - Level: 11 - Exp: 3863000 + Exp: 151115 - Level: 12 - Exp: 4504000 + Exp: 193428 - Level: 13 - Exp: 4998000 + Exp: 247588 - Level: 14 - Exp: 5769000 + Exp: 316912 - Level: 15 - Exp: 6321000 + Exp: 405648 - Level: 16 - Exp: 7254000 + Exp: 519229 - Level: 17 - Exp: 7870000 + Exp: 664613 - Level: 18 - Exp: 9015000 + Exp: 850705 - Level: 19 - Exp: 9530000 + Exp: 1088903 - Level: 20 - Exp: 11072000 + Exp: 1393796 - Level: 21 - Exp: 11848000 + Exp: 1784059 - Level: 22 - Exp: 13467000 + Exp: 2283596 - Level: 23 - Exp: 14337000 + Exp: 2923003 - Level: 24 - Exp: 16243000 + Exp: 3741444 - Level: 25 - Exp: 17216000 + Exp: 4231573 - Level: 26 - Exp: 19446000 + Exp: 4785909 - Level: 27 - Exp: 20781000 + Exp: 5412863 - Level: 28 - Exp: 23070000 + Exp: 6121948 - Level: 29 - Exp: 24453000 + Exp: 6923924 - Level: 30 - Exp: 27568000 + Exp: 7830958 - Level: 31 - Exp: 29118000 + Exp: 8856813 - Level: 32 - Exp: 31820000 + Exp: 10017056 - Level: 33 - Exp: 34125000 + Exp: 11329290 - Level: 34 - Exp: 37048000 + Exp: 12813427 - Level: 35 - Exp: 40204000 + Exp: 14491986 - Level: 36 - Exp: 42972000 + Exp: 16390436 - Level: 37 - Exp: 45937000 + Exp: 18537584 - Level: 38 - Exp: 49110000 + Exp: 20966007 - Level: 39 - Exp: 52696000 + Exp: 23712554 - Level: 40 - Exp: 57158000 + Exp: 26818899 - Level: 41 - Exp: 61305000 + Exp: 30332175 - Level: 42 - Exp: 67167000 + Exp: 34305690 - Level: 43 - Exp: 72285000 + Exp: 38799735 - Level: 44 - Exp: 77647000 + Exp: 43882500 - Level: 45 - Exp: 83624000 + Exp: 49631108 - Level: 46 - Exp: 91113000 + Exp: 56132783 - Level: 47 - Exp: 98548000 + Exp: 63486178 - Level: 48 - Exp: 107630000 + Exp: 71802867 - Level: 49 - Exp: 119077000 + Exp: 81209043 - Level: 50 Exp: 999999999 - Jobs: @@ -3074,105 +3074,105 @@ Body: - Level: 48 Exp: 90120 - Level: 49 - Exp: 590120 + Exp: 99132 - Level: 50 - Exp: 600120 + Exp: 109045 - Level: 51 - Exp: 610120 + Exp: 119950 - Level: 52 - Exp: 620120 + Exp: 131945 - Level: 53 - Exp: 630120 + Exp: 145139 - Level: 54 - Exp: 640120 + Exp: 159653 - Level: 55 - Exp: 650120 + Exp: 175618 - Level: 56 - Exp: 660120 + Exp: 193180 - Level: 57 - Exp: 670120 + Exp: 212498 - Level: 58 - Exp: 680120 + Exp: 233748 - Level: 59 - Exp: 690120 + Exp: 257123 - Level: 60 - Exp: 700120 + Exp: 282835 - Level: 61 - Exp: 710120 + Exp: 311119 - Level: 62 - Exp: 720120 + Exp: 342231 - Level: 63 - Exp: 730120 + Exp: 376454 - Level: 64 - Exp: 740120 + Exp: 414099 - Level: 65 - Exp: 750120 + Exp: 455509 - Level: 66 - Exp: 760120 + Exp: 501060 - Level: 67 - Exp: 770120 + Exp: 551166 - Level: 68 - Exp: 780120 + Exp: 606282 - Level: 69 - Exp: 790120 + Exp: 617195 - Level: 70 - Exp: 800120 + Exp: 628305 - Level: 71 - Exp: 810120 + Exp: 639614 - Level: 72 - Exp: 820120 + Exp: 651127 - Level: 73 - Exp: 830120 + Exp: 662848 - Level: 74 - Exp: 840120 + Exp: 674779 - Level: 75 - Exp: 850120 + Exp: 686925 - Level: 76 - Exp: 860120 + Exp: 699290 - Level: 77 - Exp: 870120 + Exp: 711877 - Level: 78 - Exp: 880120 + Exp: 724691 - Level: 79 - Exp: 890120 + Exp: 737735 - Level: 80 - Exp: 900120 + Exp: 751014 - Level: 81 - Exp: 910120 + Exp: 764533 - Level: 82 - Exp: 920120 + Exp: 778294 - Level: 83 - Exp: 930120 + Exp: 792303 - Level: 84 - Exp: 940120 + Exp: 806565 - Level: 85 - Exp: 950120 + Exp: 821083 - Level: 86 - Exp: 960120 + Exp: 835863 - Level: 87 - Exp: 970120 + Exp: 850908 - Level: 88 - Exp: 980120 + Exp: 866224 - Level: 89 - Exp: 990120 + Exp: 881817 - Level: 90 - Exp: 1000120 + Exp: 897689 - Level: 91 - Exp: 1010120 + Exp: 913848 - Level: 92 - Exp: 1020120 + Exp: 930297 - Level: 93 - Exp: 1030120 + Exp: 947042 - Level: 94 - Exp: 1040120 + Exp: 964089 - Level: 95 - Exp: 1050120 + Exp: 981443 - Level: 96 - Exp: 1060120 + Exp: 999109 - Level: 97 - Exp: 1070120 + Exp: 1017092 - Level: 98 - Exp: 1080120 + Exp: 1035400 - Level: 99 Exp: 999999999 - Jobs: @@ -3219,7 +3219,7 @@ Body: - Level: 19 Exp: 28800 - Level: 20 - Exp: 33100 + Exp: 33300 - Level: 21 Exp: 35100 - Level: 22 @@ -3235,7 +3235,7 @@ Body: - Level: 27 Exp: 56000 - Level: 28 - Exp: 59000 + Exp: 59400 - Level: 29 Exp: 63500 - Level: 30 @@ -3328,201 +3328,201 @@ Body: MaxBaseLevel: 250 BaseExp: - Level: 1 - Exp: 600 + Exp: 658 - Level: 2 - Exp: 1080 + Exp: 1073 - Level: 3 - Exp: 1800 + Exp: 1783 - Level: 4 - Exp: 2640 + Exp: 2608 - Level: 5 - Exp: 3840 + Exp: 3782 - Level: 6 - Exp: 4560 + Exp: 4478 - Level: 7 - Exp: 5040 + Exp: 4935 - Level: 8 - Exp: 5460 + Exp: 5330 - Level: 9 - Exp: 6000 + Exp: 5839 - Level: 10 - Exp: 6600 + Exp: 6404 - Level: 11 - Exp: 7200 + Exp: 6965 - Level: 12 - Exp: 7320 + Exp: 7060 - Level: 13 - Exp: 7620 + Exp: 7328 - Level: 14 - Exp: 8040 + Exp: 7708 - Level: 15 - Exp: 8820 + Exp: 8431 - Level: 16 - Exp: 9600 + Exp: 9149 - Level: 17 - Exp: 10080 + Exp: 9578 - Level: 18 - Exp: 10560 + Exp: 10004 - Level: 19 - Exp: 11040 + Exp: 10427 - Level: 20 - Exp: 12610 + Exp: 11874 - Level: 21 - Exp: 13390 + Exp: 12571 - Level: 22 - Exp: 14300 + Exp: 13385 - Level: 23 - Exp: 15340 + Exp: 14315 - Level: 24 - Exp: 16900 + Exp: 15724 - Level: 25 - Exp: 18460 + Exp: 17124 - Level: 26 - Exp: 19500 + Exp: 18034 - Level: 27 - Exp: 20800 + Exp: 19179 - Level: 28 - Exp: 22100 + Exp: 20316 - Level: 29 - Exp: 23400 + Exp: 21447 - Level: 30 - Exp: 24700 + Exp: 22571 - Level: 31 - Exp: 26000 + Exp: 23687 - Level: 32 - Exp: 27300 + Exp: 24797 - Level: 33 - Exp: 28600 + Exp: 25900 - Level: 34 - Exp: 30160 + Exp: 27231 - Level: 35 - Exp: 31200 + Exp: 28085 - Level: 36 - Exp: 33800 + Exp: 30334 - Level: 37 - Exp: 35750 + Exp: 31988 - Level: 38 - Exp: 37700 + Exp: 33632 - Level: 39 - Exp: 39000 + Exp: 34687 - Level: 40 - Exp: 44100 + Exp: 39106 - Level: 41 - Exp: 46200 + Exp: 40845 - Level: 42 - Exp: 47600 + Exp: 41956 - Level: 43 - Exp: 50400 + Exp: 44291 - Level: 44 - Exp: 52500 + Exp: 45998 - Level: 45 - Exp: 53200 + Exp: 46472 - Level: 46 - Exp: 56000 + Exp: 48771 - Level: 47 - Exp: 58800 + Exp: 51056 - Level: 48 - Exp: 62300 + Exp: 53933 - Level: 49 - Exp: 65800 + Exp: 56792 - Level: 50 - Exp: 68600 + Exp: 59031 - Level: 51 - Exp: 71400 + Exp: 61256 - Level: 52 - Exp: 74200 + Exp: 63467 - Level: 53 - Exp: 77000 + Exp: 65665 - Level: 54 - Exp: 79800 + Exp: 67848 - Level: 55 - Exp: 82600 + Exp: 70018 - Level: 56 - Exp: 86100 + Exp: 72766 - Level: 57 - Exp: 88200 + Exp: 74317 - Level: 58 - Exp: 91000 + Exp: 76447 - Level: 59 - Exp: 93800 + Exp: 78562 - Level: 60 - Exp: 103500 + Exp: 86427 - Level: 61 - Exp: 105000 + Exp: 87416 - Level: 62 - Exp: 109500 + Exp: 90889 - Level: 63 - Exp: 115500 + Exp: 95582 - Level: 64 - Exp: 120000 + Exp: 99008 - Level: 65 - Exp: 126000 + Exp: 103646 - Level: 66 - Exp: 132000 + Exp: 108256 - Level: 67 - Exp: 136500 + Exp: 111611 - Level: 68 - Exp: 142500 + Exp: 116167 - Level: 69 - Exp: 165000 + Exp: 134106 - Level: 70 - Exp: 192000 + Exp: 155583 - Level: 71 - Exp: 210000 + Exp: 169658 - Level: 72 - Exp: 232500 + Exp: 187272 - Level: 73 - Exp: 244500 + Exp: 196347 - Level: 74 - Exp: 255000 + Exp: 204165 - Level: 75 - Exp: 270000 + Exp: 215526 - Level: 76 - Exp: 282000 + Exp: 224430 - Level: 77 - Exp: 292500 + Exp: 232088 - Level: 78 - Exp: 300000 + Exp: 237325 - Level: 79 - Exp: 345000 + Exp: 257972 - Level: 80 - Exp: 416000 + Exp: 280415 - Level: 81 - Exp: 480000 + Exp: 304811 - Level: 82 - Exp: 560000 + Exp: 331329 - Level: 83 - Exp: 640000 + Exp: 360154 - Level: 84 - Exp: 768000 + Exp: 391487 - Level: 85 - Exp: 880000 + Exp: 425546 - Level: 86 - Exp: 960000 + Exp: 462568 - Level: 87 - Exp: 1088000 + Exp: 502811 - Level: 88 - Exp: 1200000 + Exp: 546555 - Level: 89 - Exp: 1440000 + Exp: 594105 - Level: 90 - Exp: 1700000 + Exp: 645792 - Level: 91 - Exp: 2040000 + Exp: 701975 - Level: 92 - Exp: 2550000 + Exp: 763046 - Level: 93 - Exp: 3060000 + Exp: 829431 - Level: 94 - Exp: 3570000 + Exp: 901591 - Level: 95 - Exp: 4080000 + Exp: 980029 - Level: 96 - Exp: 4760000 + Exp: 1065291 - Level: 97 - Exp: 5610000 + Exp: 1157971 - Level: 98 - Exp: 6800000 + Exp: 1258714 - Level: 99 Exp: 1272747 - Level: 100 @@ -3666,7 +3666,7 @@ Body: - Level: 169 Exp: 211158924 - Level: 170 - Exp: 229155105 + Exp: 228155105 - Level: 171 Exp: 246519309 - Level: 172 @@ -3676,55 +3676,55 @@ Body: - Level: 174 Exp: 310966207 - Level: 175 - Exp: 352013746 + Exp: 320295193 - Level: 176 - Exp: 398479560 + Exp: 329904048 - Level: 177 - Exp: 451078861 + Exp: 339801169 - Level: 178 - Exp: 510621270 + Exp: 349995204 - Level: 179 - Exp: 578023277 + Exp: 360495060 - Level: 180 - Exp: 654322349 + Exp: 371309911 - Level: 181 - Exp: 740692899 + Exp: 382449208 - Level: 182 - Exp: 838464361 + Exp: 393922684 - Level: 183 - Exp: 949141656 + Exp: 405740364 - Level: 184 - Exp: 1074428354 + Exp: 417912574 - Level: 185 - Exp: 1216252896 + Exp: 430449951 - Level: 186 - Exp: 1376798278 + Exp: 443363449 - Level: 187 - Exp: 1558535650 + Exp: 456664352 - Level: 188 - Exp: 1764262355 + Exp: 470364282 - Level: 189 - Exp: 1997144985 + Exp: 484475210 - Level: 190 - Exp: 2260768123 + Exp: 499009466 - Level: 191 - Exp: 2559189515 + Exp: 513979749 - Level: 192 - Exp: 2897002530 + Exp: 529399141 - Level: 193 - Exp: 3279406863 + Exp: 545281115 - Level: 194 - Exp: 3712288568 + Exp: 561639548 - Level: 195 - Exp: 4202310658 + Exp: 578488734 - Level: 196 - Exp: 4757015664 + Exp: 595843396 - Level: 197 - Exp: 5384941731 + Exp: 613718697 - Level: 198 - Exp: 6095754039 + Exp: 632130257 - Level: 199 - Exp: 6900363572 + Exp: 651094164 - Level: 200 Exp: 653047446 - Level: 201 @@ -3766,65 +3766,65 @@ Body: - Level: 219 Exp: 691293473 - Level: 220 - Exp: 843378037 + Exp: 788074559 - Level: 221 - Exp: 1028921205 + Exp: 898404997 - Level: 222 - Exp: 1255283870 + Exp: 1024181696 - Level: 223 - Exp: 1531446321 + Exp: 1167567133 - Level: 224 - Exp: 1868364511 + Exp: 1331026531 - Level: 225 - Exp: 2279404703 + Exp: 1517370245 - Level: 226 - Exp: 2780873737 + Exp: 1729802079 - Level: 227 - Exp: 3392665959 + Exp: 1971974370 - Level: 228 - Exp: 4139052469 + Exp: 2248050781 - Level: 229 - Exp: 5049644012 + Exp: 2562777890 - Level: 230 - Exp: 6160565694 + Exp: 2921566794 - Level: 231 - Exp: 7515890146 + Exp: 3330586145 - Level: 232 - Exp: 9169385978 + Exp: 3796868205 - Level: 233 - Exp: 11186650893 + Exp: 4328429753 - Level: 234 - Exp: 13647714089 + Exp: 4934409918 - Level: 235 - Exp: 16650211188 + Exp: 5625227306 - Level: 236 - Exp: 20313257649 + Exp: 6412759128 - Level: 237 - Exp: 24782174331 + Exp: 7310545405 - Level: 238 - Exp: 30234252683 + Exp: 8334021761 - Level: 239 - Exp: 36885788273 + Exp: 9500784807 - Level: 240 - Exp: 45000661693 + Exp: 10830894679 - Level: 241 - Exp: 54900807265 + Exp: 12347219934 - Level: 242 - Exp: 66978984863 + Exp: 14075830724 - Level: 243 - Exp: 81714361532 + Exp: 16046447025 - Level: 244 - Exp: 99691521069 + Exp: 18292949608 - Level: 245 - Exp: 121623655704 + Exp: 20853962553 - Level: 246 - Exp: 148380859958 + Exp: 23773517310 - Level: 247 - Exp: 181024649148 + Exp: 27101809733 - Level: 248 - Exp: 220850071960 + Exp: 30896063095 - Level: 249 - Exp: 269437087791 + Exp: 35221511928 - Level: 250 Exp: 999999999999 - Jobs: From d3fcb66d3a032366446bb29ca1110dcd59ecda4b Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Wed, 17 Jan 2024 18:58:13 +0100 Subject: [PATCH 26/33] Fixed some memleaks (#8107) Improved memleak location reporting for parse_script --- src/map/itemdb.cpp | 2 +- src/map/npc.cpp | 5 +---- src/map/script.cpp | 5 ++--- src/map/script.hpp | 4 +++- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp index 72acad6ebc..25daa3de28 100644 --- a/src/map/itemdb.cpp +++ b/src/map/itemdb.cpp @@ -4290,7 +4290,7 @@ uint64 RandomOptionDatabase::parseBodyNode(const ryml::NodeRef& node) { return 0; if (randopt->script) { - aFree(randopt->script); + script_free_code( randopt->script ); randopt->script = nullptr; } diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 391cbbe25f..de1fa07c02 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -5159,10 +5159,7 @@ static const char* npc_parse_function(char* w1, char* w2, char* w3, char* w4, co struct script_code *oldscript = (struct script_code*)db_data2ptr(&old_data); ShowInfo("npc_parse_function: Overwriting user function [%s] (%s:%d)\n", w3, filepath, strline(buffer,start-buffer)); - script_stop_scriptinstances(oldscript); - script_free_vars(oldscript->local.vars); - aFree(oldscript->script_buf); - aFree(oldscript); + script_free_code( oldscript ); } return end; diff --git a/src/map/script.cpp b/src/map/script.cpp index 43087d8b17..bb817be7a6 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -2472,8 +2472,7 @@ void script_warning(const char* src, const char* file, int start_line, const cha /*========================================== * Analysis of the script *------------------------------------------*/ -struct script_code* parse_script(const char *src,const char *file,int line,int options) -{ +struct script_code* parse_script_( const char *src, const char *file, int line, int options, const char* src_file, int src_line, const char* src_func ){ const char *p,*tmpp; int i; struct script_code* code = NULL; @@ -2653,7 +2652,7 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o } #endif - CREATE(code,struct script_code,1); + CREATE2( code, struct script_code, 1, src_file, src_line, src_func ); code->script_buf = script_buf; code->script_size = script_size; code->local.vars = NULL; diff --git a/src/map/script.hpp b/src/map/script.hpp index 4580f54e37..3c0c6b1286 100644 --- a/src/map/script.hpp +++ b/src/map/script.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -2205,7 +2206,8 @@ void script_error(const char* src, const char* file, int start_line, const char* void script_warning(const char* src, const char* file, int start_line, const char* error_msg, const char* error_pos); bool is_number(const char *p); -struct script_code* parse_script(const char* src,const char* file,int line,int options); +struct script_code* parse_script_( const char *src, const char *file, int line, int options, const char* src_file, int src_line, const char* src_func ); +#define parse_script( src, file, line, options ) parse_script_( ( src ), ( file ), ( line ), ( options ), ALC_MARK ) void run_script(struct script_code *rootscript,int pos,int rid,int oid); bool set_reg_num(struct script_state* st, map_session_data* sd, int64 num, const char* name, const int64 value, struct reg_db *ref); From 72b3d1bf0ea90fdab7c65df38047da437a655932 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Wed, 17 Jan 2024 21:20:20 +0100 Subject: [PATCH 27/33] Initial implementation of Hyper Novice (#8101) Taken from #7024 Co-authored-by: munkrej Co-authored-by: Aleos --- db/re/skill_db.yml | 780 +++++++++++++++++++++++++++++++++++ db/re/skill_tree.yml | 86 ++++ db/re/status.yml | 28 ++ src/map/battle.cpp | 133 ++++++ src/map/script_constants.hpp | 19 +- src/map/skill.cpp | 119 +++++- src/map/skill.hpp | 3 + src/map/status.cpp | 8 + src/map/status.hpp | 9 + 9 files changed, 1181 insertions(+), 4 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 3774fdea78..c0b0afdaa4 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -41385,6 +41385,786 @@ Body: SplashArea: 6 Requires: SpCost: 1 + - Id: 5449 + Name: HN_SELFSTUDY_TATICS + Description: Self Study Tactics + MaxLevel: 10 + - Id: 5450 + Name: HN_SELFSTUDY_SOCERY + Description: Self Study Sorcery + MaxLevel: 10 + - Id: 5451 + Name: HN_DOUBLEBOWLINGBASH + Description: Double Bowling Bash + MaxLevel: 10 + Type: Weapon + TargetType: Attack + Range: 2 + Hit: Multi_Hit + HitCount: 3 + Element: Weapon + DamageFlags: + Splash: true + SplashArea: 4 + Knockback: 2 + CastCancel: true + CastTime: 300 + AfterCastActDelay: 1000 + GiveAp: 3 + Cooldown: 1000 + FixedCastTime: 200 + Duration2: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 38 + - Level: 2 + Amount: 41 + - Level: 3 + Amount: 44 + - Level: 4 + Amount: 47 + - Level: 5 + Amount: 50 + - Level: 6 + Amount: 53 + - Level: 7 + Amount: 56 + - Level: 8 + Amount: 59 + - Level: 9 + Amount: 62 + - Level: 10 + Amount: 65 + Status: Hnnoweapon + - Id: 5452 + Name: HN_MEGA_SONIC_BLOW + Description: Mega Sonic Blow + MaxLevel: 10 + Type: Weapon + TargetType: Attack + DamageFlags: + Critical: true + Range: 2 + Hit: Multi_Hit + HitCount: -8 + GiveAp: 2 + Element: Weapon + AfterCastActDelay: 500 + Cooldown: 300 + Duration2: 5000 + Requires: + SpCost: + - Level: 1 + Amount: 42 + - Level: 2 + Amount: 44 + - Level: 3 + Amount: 46 + - Level: 4 + Amount: 48 + - Level: 5 + Amount: 50 + - Level: 6 + Amount: 52 + - Level: 7 + Amount: 54 + - Level: 8 + Amount: 56 + - Level: 9 + Amount: 58 + - Level: 10 + Amount: 60 + - Id: 5453 + Name: HN_SHIELD_CHAIN_RUSH + Description: Shield Chain Rush + MaxLevel: 10 + Type: Weapon + TargetType: Attack + Range: 7 + Hit: Multi_Hit + HitCount: -5 + DamageFlags: + Splash: true + SplashArea: 4 + GiveAp: 2 + Element: Weapon + CastCancel: true + CastTime: 1200 + AfterCastActDelay: 500 + Cooldown: 300 + FixedCastTime: 300 + Duration1: 5000 + Duration2: 1200 + Requires: + SpCost: + - Level: 1 + Amount: 35 + - Level: 2 + Amount: 38 + - Level: 3 + Amount: 41 + - Level: 4 + Amount: 44 + - Level: 5 + Amount: 47 + - Level: 6 + Amount: 50 + - Level: 7 + Amount: 53 + - Level: 8 + Amount: 56 + - Level: 9 + Amount: 59 + - Level: 10 + Amount: 62 + State: Shield + Status: Shieldchainrush + - Id: 5454 + Name: HN_SPIRAL_PIERCE_MAX + Description: Spiral Pierce Max + MaxLevel: 10 + Type: Weapon + TargetType: Attack + Range: 7 + Hit: Multi_Hit + HitCount: -5 + Element: Weapon + GiveAp: 2 + CastCancel: true + CastTime: 1000 + AfterCastActDelay: 500 + Cooldown: 300 + FixedCastTime: 300 + Duration2: 2000 + Requires: + SpCost: + - Level: 1 + Amount: 37 + - Level: 2 + Amount: 39 + - Level: 3 + Amount: 41 + - Level: 4 + Amount: 43 + - Level: 5 + Amount: 45 + - Level: 6 + Amount: 47 + - Level: 7 + Amount: 49 + - Level: 8 + Amount: 51 + - Level: 9 + Amount: 53 + - Level: 10 + Amount: 55 + - Id: 5455 + Name: HN_METEOR_STORM_BUSTER + Description: Meteor Storm Buster + MaxLevel: 10 + Type: Magic + TargetType: Ground + Range: -9 + Hit: Multi_Hit + HitCount: 1 + Element: Fire + GiveAp: 3 + DamageFlags: + Splash: true + SplashArea: 2 + CastCancel: true + CastTime: 4000 + Cooldown: + - Level: 1 + Time: 2100 + - Level: 2 + Time: 2200 + - Level: 3 + Time: 2300 + - Level: 4 + Time: 2400 + - Level: 5 + Time: 2500 + - Level: 6 + Time: 2600 + - Level: 7 + Time: 2700 + - Level: 8 + Time: 2800 + - Level: 9 + Time: 2900 + - Level: 10 + Time: 3000 + FixedCastTime: 1500 + Duration1: + - Level: 1 + Time: 1000 + - Level: 2 + Time: 1000 + - Level: 3 + Time: 1500 + - Level: 4 + Time: 1500 + - Level: 5 + Time: 2000 + - Level: 6 + Time: 2000 + - Level: 7 + Time: 2000 + - Level: 8 + Time: 2500 + - Level: 9 + Time: 2500 + - Level: 10 + Time: 2500 + Duration2: 500 + Requires: + SpCost: + - Level: 1 + Amount: 74 + - Level: 2 + Amount: 78 + - Level: 3 + Amount: 82 + - Level: 4 + Amount: 86 + - Level: 5 + Amount: 90 + - Level: 6 + Amount: 94 + - Level: 7 + Amount: 98 + - Level: 8 + Amount: 102 + - Level: 9 + Amount: 106 + - Level: 10 + Amount: 110 + Unit: + Id: Dummyskill + Range: + - Level: 1 + Size: 3 + - Level: 2 + Size: 3 + - Level: 3 + Size: 3 + - Level: 4 + Size: 3 + - Level: 5 + Size: 3 + - Level: 6 + Size: 3 + - Level: 7 + Size: 3 + - Level: 8 + Size: 4 + - Level: 9 + Size: 4 + - Level: 10 + Size: 4 + Interval: 1500 + Target: Enemy + Flag: + PathCheck: true + - Id: 5456 + Name: HN_JUPITEL_THUNDER_STORM + Description: Jupitel Thunderstorm + MaxLevel: 10 + Type: Magic + TargetType: Attack + Range: 11 + Hit: Multi_Hit + HitCount: -10 + Element: Wind + GiveAp: 2 + DamageFlags: + Splash: true + SplashArea: + - Level: 1 + Area: 2 + - Level: 2 + Area: 2 + - Level: 3 + Area: 2 + - Level: 4 + Area: 2 + - Level: 5 + Area: 3 + - Level: 6 + Area: 3 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 4 + - Level: 10 + Area: 4 + CastCancel: true + CastTime: + - Level: 1 + Time: 1100 + - Level: 2 + Time: 1200 + - Level: 3 + Time: 1300 + - Level: 4 + Time: 1400 + - Level: 5 + Time: 1500 + - Level: 6 + Time: 1600 + - Level: 7 + Time: 1700 + - Level: 8 + Time: 1800 + - Level: 9 + Time: 1900 + - Level: 10 + Time: 2000 + AfterCastActDelay: 500 + Cooldown: 1800 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 75 + - Level: 2 + Amount: 80 + - Level: 3 + Amount: 85 + - Level: 4 + Amount: 90 + - Level: 5 + Amount: 95 + - Level: 6 + Amount: 100 + - Level: 7 + Amount: 105 + - Level: 8 + Amount: 110 + - Level: 9 + Amount: 115 + - Level: 10 + Amount: 120 + - Id: 5457 + Name: HN_JACK_FROST_NOVA + Description: Jack Frost Nova + MaxLevel: 10 + Type: Magic + TargetType: Ground + Range: -9 + Hit: Multi_Hit + HitCount: -2 + Element: Water + GiveAp: 3 + DamageFlags: + Splash: true + SplashArea: + - Level: 1 + Area: 3 + - Level: 2 + Area: 3 + - Level: 3 + Area: 3 + - Level: 4 + Area: 3 + - Level: 5 + Area: 3 + - Level: 6 + Area: 4 + - Level: 7 + Area: 4 + - Level: 8 + Area: 4 + - Level: 9 + Area: 4 + - Level: 10 + Area: 4 + CastCancel: true + CastTime: + - Level: 1 + Time: 1600 + - Level: 2 + Time: 1700 + - Level: 3 + Time: 1800 + - Level: 4 + Time: 1900 + - Level: 5 + Time: 2000 + - Level: 6 + Time: 2100 + - Level: 7 + Time: 2200 + - Level: 8 + Time: 2300 + - Level: 9 + Time: 2400 + - Level: 10 + Time: 2500 + AfterCastActDelay: 300 + Cooldown: 3000 + FixedCastTime: 1500 + Duration1: + - Level: 1 + Time: 900 + - Level: 2 + Time: 1200 + - Level: 3 + Time: 1500 + - Level: 4 + Time: 1800 + - Level: 5 + Time: 2100 + - Level: 6 + Time: 2400 + - Level: 7 + Time: 2700 + - Level: 8 + Time: 3000 + - Level: 9 + Time: 3300 + - Level: 10 + Time: 3600 + Duration2: 5000 + Requires: + SpCost: + - Level: 1 + Amount: 68 + - Level: 2 + Amount: 71 + - Level: 3 + Amount: 74 + - Level: 4 + Amount: 77 + - Level: 5 + Amount: 80 + - Level: 6 + Amount: 83 + - Level: 7 + Amount: 86 + - Level: 8 + Amount: 89 + - Level: 9 + Amount: 92 + - Level: 10 + Amount: 95 + Unit: + Id: JACK_FROST_NOVA + Range: + - Level: 1 + Size: 3 + - Level: 2 + Size: 3 + - Level: 3 + Size: 3 + - Level: 4 + Size: 3 + - Level: 5 + Size: 3 + - Level: 6 + Size: 4 + - Level: 7 + Size: 4 + - Level: 8 + Size: 4 + - Level: 9 + Size: 4 + - Level: 10 + Size: 4 + Interval: 300 + Target: Enemy + Flag: + PathCheck: true + Status: Mistyfrost + - Id: 5458 + Name: HN_HELLS_DRIVE + Description: Hell's Drive + MaxLevel: 10 + Type: Magic + TargetType: Self + Range: 1 + Hit: Multi_Hit + HitCount: -3 + Element: Earth + GiveAp: 2 + DamageFlags: + Splash: true + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 2 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 3 + - Level: 10 + Area: 4 + CastCancel: true + CastTime: 1200 + AfterCastActDelay: 1000 + Cooldown: + - Level: 1 + Time: 2500 + - Level: 2 + Time: 2300 + - Level: 3 + Time: 2100 + - Level: 4 + Time: 1900 + - Level: 5 + Time: 1700 + - Level: 6 + Time: 1500 + - Level: 7 + Time: 1300 + - Level: 8 + Time: 1100 + - Level: 9 + Time: 900 + - Level: 10 + Time: 700 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 71 + - Level: 2 + Amount: 74 + - Level: 3 + Amount: 77 + - Level: 4 + Amount: 80 + - Level: 5 + Amount: 83 + - Level: 6 + Amount: 86 + - Level: 7 + Amount: 89 + - Level: 8 + Amount: 92 + - Level: 9 + Amount: 95 + - Level: 10 + Amount: 98 + - Id: 5459 + Name: HN_GROUND_GRAVITATION + Description: Ground Gravitation + MaxLevel: 10 + Type: Magic + TargetType: Self + Range: -9 + Hit: Multi_Hit + HitCount: 1 + Element: Neutral + GiveAp: 5 + DamageFlags: + Splash: true + SplashArea: + - Level: 1 + Area: 2 + - Level: 2 + Area: 2 + - Level: 3 + Area: 2 + - Level: 4 + Area: 2 + - Level: 5 + Area: 3 + - Level: 6 + Area: 3 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 4 + - Level: 10 + Area: 4 + CastCancel: true + CastTime: + - Level: 1 + Time: 3000 + - Level: 2 + Time: 3000 + - Level: 3 + Time: 3000 + - Level: 4 + Time: 3200 + - Level: 5 + Time: 3500 + - Level: 6 + Time: 3800 + - Level: 7 + Time: 4100 + - Level: 8 + Time: 4400 + - Level: 9 + Time: 4700 + - Level: 10 + Time: 5000 + AfterCastActDelay: + - Level: 1 + Time: 2000 + - Level: 2 + Time: 2000 + - Level: 3 + Time: 2000 + - Level: 4 + Time: 1800 + - Level: 5 + Time: 1800 + - Level: 6 + Time: 1800 + - Level: 7 + Time: 1600 + - Level: 8 + Time: 1400 + - Level: 9 + Time: 1200 + - Level: 10 + Time: 1000 + Cooldown: 5000 + FixedCastTime: 1500 + Duration1: 5000 + Duration2: 5000 + Requires: + SpCost: + - Level: 1 + Amount: 55 + - Level: 2 + Amount: 60 + - Level: 3 + Amount: 65 + - Level: 4 + Amount: 70 + - Level: 5 + Amount: 75 + - Level: 6 + Amount: 80 + - Level: 7 + Amount: 85 + - Level: 8 + Amount: 90 + - Level: 9 + Amount: 95 + - Level: 10 + Amount: 100 + Unit: + Id: GROUND_GRAVITATION + Range: + - Level: 1 + Size: 2 + - Level: 2 + Size: 2 + - Level: 3 + Size: 2 + - Level: 4 + Size: 2 + - Level: 5 + Size: 3 + - Level: 6 + Size: 3 + - Level: 7 + Size: 3 + - Level: 8 + Size: 3 + - Level: 9 + Size: 4 + - Level: 10 + Size: 4 + Interval: 500 + Target: Enemy + Flag: + PathCheck: true + Status: Groundgravity + - Id: 5460 + Name: HN_NAPALM_VULCAN_STRIKE + Description: Napalm Vulcan Strike + MaxLevel: 10 + Type: Magic + TargetType: Attack + Range: 11 + Hit: Multi_Hit + HitCount: -7 + Element: Ghost + GiveAp: 2 + DamageFlags: + Splash: true + SplashArea: 3 + CastCancel: true + CastTime: 500 + Cooldown: 300 + AfterCastActDelay: 500 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 48 + - Level: 2 + Amount: 51 + - Level: 3 + Amount: 54 + - Level: 4 + Amount: 57 + - Level: 5 + Amount: 60 + - Level: 6 + Amount: 63 + - Level: 7 + Amount: 66 + - Level: 8 + Amount: 69 + - Level: 9 + Amount: 72 + - Level: 10 + Amount: 75 + - Id: 5461 + Name: HN_BREAKINGLIMIT + Description: Breaking Limit + MaxLevel: 1 + Type: Magic + TargetType: Self + DamageFlags: + NoDamage: true + Duration1: 300000 + Cooldown: 60000 + CastCancel: true + FixedCastTime: 1000 + Requires: + SpCost: 150 + ApCost: 150 + Status: Breakinglimit + - Id: 5462 + Name: HN_RULEBREAK + Description: Rule Break + MaxLevel: 1 + Type: Magic + TargetType: Self + DamageFlags: + NoDamage: true + Duration1: 300000 + Cooldown: 60000 + CastCancel: true + FixedCastTime: 1000 + Requires: + SpCost: 150 + ApCost: 150 + Status: Rulebreak - Id: 6001 Name: DK_DRAGONIC_BREATH Description: Dragonic Breath diff --git a/db/re/skill_tree.yml b/db/re/skill_tree.yml index 02d5d441cd..9788a49f67 100644 --- a/db/re/skill_tree.yml +++ b/db/re/skill_tree.yml @@ -7864,3 +7864,89 @@ Body: Royal_Guard: true Royal_Guard_T: true Imperial_Guard: true + - Job: Hyper_Novice + Inherit: + Novice: true + Supernovice: true + Super_Novice_E: true + Tree: + - Name: HN_SELFSTUDY_TATICS + MaxLevel: 10 + - Name: HN_SELFSTUDY_SOCERY + MaxLevel: 10 + - Name: HN_DOUBLEBOWLINGBASH + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_TATICS + Level: 5 + - Name: HN_SHIELD_CHAIN_RUSH + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_TATICS + Level: 5 + - Name: HN_METEOR_STORM_BUSTER + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_SOCERY + Level: 5 + - Name: HN_JUPITEL_THUNDER_STORM + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_SOCERY + Level: 5 + - Name: HN_JACK_FROST_NOVA + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_SOCERY + Level: 5 + - Name: HN_HELLS_DRIVE + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_SOCERY + Level: 5 + - Name: HN_MEGA_SONIC_BLOW + MaxLevel: 10 + Requires: + - Name: HN_DOUBLEBOWLINGBASH + Level: 7 + - Name: HN_SPIRAL_PIERCE_MAX + MaxLevel: 10 + Requires: + - Name: HN_SHIELD_CHAIN_RUSH + Level: 7 + - Name: HN_GROUND_GRAVITATION + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_SOCERY + Level: 5 + - Name: HN_NAPALM_VULCAN_STRIKE + MaxLevel: 10 + Requires: + - Name: HN_SELFSTUDY_SOCERY + Level: 5 + - Name: HN_BREAKINGLIMIT + MaxLevel: 1 + Requires: + - Name: HN_DOUBLEBOWLINGBASH + Level: 7 + - Name: HN_MEGA_SONIC_BLOW + Level: 7 + - Name: HN_SHIELD_CHAIN_RUSH + Level: 7 + - Name: HN_SPIRAL_PIERCE_MAX + Level: 7 + - Name: HN_RULEBREAK + MaxLevel: 1 + Requires: + - Name: HN_METEOR_STORM_BUSTER + Level: 5 + - Name: HN_JUPITEL_THUNDER_STORM + Level: 5 + - Name: HN_JACK_FROST_NOVA + Level: 5 + - Name: HN_HELLS_DRIVE + Level: 5 + - Name: HN_GROUND_GRAVITATION + Level: 5 + - Name: HN_NAPALM_VULCAN_STRIKE + Level: 5 diff --git a/db/re/status.yml b/db/re/status.yml index fc9c373dd3..5bc04d39c3 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -8753,3 +8753,31 @@ Body: NoDispell: true NoBanishingBuster: true NoClearance: true + - Status: Hnnoweapon + Icon: EFST_NOEQUIPWEAPON + DurationLookup: HN_DOUBLEBOWLINGBASH + - Status: Shieldchainrush + Icon: EFST_SHIELDCHAINRUSH + DurationLookup: HN_SHIELD_CHAIN_RUSH + CalcFlags: + Speed: true + Flags: + BossResist: true + - Status: Mistyfrost + Icon: EFST_MISTYFROST + DurationLookup: HN_JACK_FROST_NOVA + Flags: + BossResist: true + - Status: Groundgravity + Icon: EFST_GROUNDGRAVITY + DurationLookup: HN_GROUND_GRAVITATION + CalcFlags: + Speed: true + Flags: + BossResist: true + - Status: Breakinglimit + Icon: EFST_BREAKINGLIMIT + DurationLookup: HN_BREAKINGLIMIT + - Status: Rulebreak + Icon: EFST_RULEBREAK + DurationLookup: HN_RULEBREAK diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 03e74746dd..1ae1415488 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -580,6 +580,12 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d ratio += 50; #else damage += (int64)(damage * 50 / 100); +#endif + if (tsc->getSCE(SC_MISTYFROST)) +#ifdef RENEWAL + ratio += 15; +#else + damage += (int64)(damage * 15 / 100); #endif break; case ELE_EARTH: @@ -1569,6 +1575,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage *= 4; #endif + if (tsc->getSCE(SC_GROUNDGRAVITY) && flag&(BF_MAGIC|BF_WEAPON)) + damage += damage * 15 / 100; + if (tsc->getSCE(SC_SHIELDCHAINRUSH)) + damage += damage / 10; + if (tsc->getSCE(SC_AETERNA) && skill_id != PF_SOULBURN) { if (src->type != BL_MER || !skill_id) damage *= 2; // Lex Aeterna only doubles damage of regular attacks from mercenaries @@ -1831,6 +1842,36 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam status_change* sc = status_get_sc(src); if (sc && sc->count) { + if (sc->getSCE(SC_BREAKINGLIMIT)) { + switch (skill_id) { + case HN_SHIELD_CHAIN_RUSH: + case HN_DOUBLEBOWLINGBASH: + damage += damage / 2; + break; + case HN_MEGA_SONIC_BLOW: + case HN_SPIRAL_PIERCE_MAX: + damage += damage * 70 / 100; + break; + } + } + + if (sc->getSCE(SC_RULEBREAK)) { + switch (skill_id) { + case HN_METEOR_STORM_BUSTER: + case HN_GROUND_GRAVITATION: + damage += damage / 2; + break; + case HN_JUPITEL_THUNDER_STORM: + case HN_JACK_FROST_NOVA: + case HN_HELLS_DRIVE: + damage += damage * 70 / 100; + break; + case HN_NAPALM_VULCAN_STRIKE: + damage += damage * 40 / 100; + break; + } + } + if( sc->getSCE(SC_INVINCIBLE) && !sc->getSCE(SC_INVINCIBLEOFF) ) damage += damage * 75 / 100; @@ -5775,6 +5816,43 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case ABR_INFINITY_BUSTER:// Need official formula. skillratio += -100 + 50000; break; + case HN_SPIRAL_PIERCE_MAX: + skillratio += -100 + 550 + 350 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv; + skillratio += 5 * sstatus->pow; + switch (status_get_size(target)){ + case SZ_SMALL: + skillratio = skillratio * 150 / 100; + break; + case SZ_MEDIUM: + skillratio = skillratio * 130 / 100; + break; + case SZ_BIG: + skillratio = skillratio * 120 / 100; + break; + } + RE_LVL_DMOD(100); + break; + case HN_SHIELD_CHAIN_RUSH: + skillratio += -100 + 600 + 450 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv; + skillratio += 5 * sstatus->pow; + RE_LVL_DMOD(100); + break; + case HN_MEGA_SONIC_BLOW: + skillratio += -100 + 900 + 450 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 5 * skill_lv; + skillratio += 5 * sstatus->pow; + if (status_get_hp(target) < status_get_max_hp(target) / 2) + skillratio *= 2; + RE_LVL_DMOD(100); + break; + case HN_DOUBLEBOWLINGBASH: + skillratio += -100 + 150 + 250 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv; + skillratio += 5 * sstatus->pow; + RE_LVL_DMOD(100); + break; } return skillratio; } @@ -6742,6 +6820,10 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block if (sc && sc->getSCE(SC_RESEARCHREPORT)) wd.div_ = 4; break; + case HN_DOUBLEBOWLINGBASH: + if (wd.miscflag > 1) + wd.div_ += min(4, wd.miscflag); + break; } } else { bool is_long = false; @@ -8177,6 +8259,57 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case NPC_RAINOFMETEOR: skillratio += 350; // unknown ratio break; + case HN_NAPALM_VULCAN_STRIKE: + skillratio += -100 + 350 + 650 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 4 * skill_lv; + skillratio += 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case HN_JUPITEL_THUNDER_STORM: + skillratio += -100 + 1800 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 3 * skill_lv; + skillratio += 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case HN_HELLS_DRIVE: + skillratio += -100 + 1500 + 700 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 4 * skill_lv; + skillratio += 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case HN_GROUND_GRAVITATION: + if (mflag & SKILL_ALTDMG_FLAG) { + skillratio += -100 + 3000 + 1500 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 4 * skill_lv; + ad.div_ = -2; + } else { + skillratio += -100 + 800 + 700 * skill_lv; + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 2 * skill_lv; + } + skillratio += 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case HN_JACK_FROST_NOVA: + if (mflag & SKILL_ALTDMG_FLAG) { + skillratio += -100 + 200 * skill_lv; + } else { + skillratio += -100 + 400 + 500 * skill_lv; + } + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 3 * skill_lv; + skillratio += 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case HN_METEOR_STORM_BUSTER: + if (mflag & SKILL_ALTDMG_FLAG) { + skillratio += -100 + 300 + 160 * skill_lv * 2; + ad.div_ = -3; + } else { + skillratio += -100 + 450 + 160 * skill_lv; + } + skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 5 * skill_lv; + skillratio += 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; } if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element. diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 513e710f05..8ffda6775d 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1894,6 +1894,12 @@ export_constant(SC_RUSH_QUAKE1); export_constant(SC_RUSH_QUAKE2); export_constant(SC_G_LIFEPOTION); + export_constant(SC_HNNOWEAPON); + export_constant(SC_SHIELDCHAINRUSH); + export_constant(SC_MISTYFROST); + export_constant(SC_GROUNDGRAVITY); + export_constant(SC_BREAKINGLIMIT); + export_constant(SC_RULEBREAK); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); @@ -10065,12 +10071,21 @@ export_constant(UNT_LIGHTNING_LAND); export_constant(UNT_VENOM_SWAMP); export_constant(UNT_CONFLAGRATION); - export_constant(UNT_DEEPBLINDTRAP); export_constant(UNT_SOLIDTRAP); export_constant(UNT_SWIFTTRAP); export_constant(UNT_FLAMETRAP); - + export_constant(UNT_TWINKLING_GALAXY); + export_constant(UNT_STAR_CANNON); + export_constant(UNT_GRENADES_DROPPING); + export_constant(UNT_FUUMASHOUAKU); + export_constant(UNT_MISSION_BOMBARD); + export_constant(UNT_TOTEM_OF_TUTELARY); + export_constant(UNT_HYUN_ROKS_BREEZE); + export_constant(UNT_SHINKIROU); + export_constant(UNT_JACK_FROST_NOVA); + export_constant(UNT_GROUND_GRAVITATION); + export_constant(UNT_KUNAIWAIKYOKU); export_constant(UNT_GD_LEADERSHIP); export_constant(UNT_GD_GLORYWOUNDS); export_constant(UNT_GD_SOULCOLD); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index a2615adc88..60c051e4d8 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1434,6 +1434,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint break; case AS_SONICBLOW: + case HN_MEGA_SONIC_BLOW: sc_start(src,bl,SC_STUN,(2*skill_lv+10),skill_lv,skill_get_time2(skill_id,skill_lv)); break; @@ -1480,6 +1481,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint break; case WZ_METEOR: + case HN_METEOR_STORM_BUSTER: sc_start(src,bl,SC_STUN,3*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv)); break; @@ -1696,6 +1698,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint case LK_SPIRALPIERCE: case ML_SPIRALPIERCE: + case HN_SPIRAL_PIERCE_MAX: if( dstsd || ( dstmd && !status_bl_has_mode(bl,MD_STATUSIMMUNE) ) ) //Does not work on status immune sc_start(src,bl,SC_STOP,100,0,skill_get_time2(skill_id,skill_lv)); break; @@ -1729,6 +1732,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint break; case HW_NAPALMVULCAN: + case HN_NAPALM_VULCAN_STRIKE: sc_start(src,bl,SC_CURSE,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv)); break; @@ -2203,6 +2207,11 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint case MT_RUSH_QUAKE: sc_start( src, bl, SC_RUSH_QUAKE1, 100, skill_lv, skill_get_time( skill_id, skill_lv ) ); break; + case HN_SHIELD_CHAIN_RUSH: + case HN_JACK_FROST_NOVA: + case HN_GROUND_GRAVITATION: + sc_start(src, bl, skill_get_sc(skill_id), 100, 0, skill_get_time2(skill_id, skill_lv)); + break; } //end switch skill_id if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai && md->special_state.ai != AI_ABR && md->special_state.ai != AI_BIONIC) @@ -4769,6 +4778,22 @@ static TIMER_FUNC(skill_timerskill){ case NC_MAGMA_ERUPTION: skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0); break; + case HN_METEOR_STORM_BUSTER: { + int16 area = 4; + int16 tmpx = rnd_value( skl->x - area, skl->x + area ); + int16 tmpy = rnd_value( skl->y - area, skl->y + area ); + + if( map_getcell(src->m, tmpx, tmpy, CELL_CHKLANDPROTECTOR) ) { + return 0; + } + + int splash = skill_get_splash(skl->skill_id, skl->skill_lv); + + clif_skill_poseffect(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick); + map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id); + skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id)); + } + break; } } } while (0); @@ -5220,6 +5245,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case WH_HAWKBOOMERANG: case TR_ROSEBLOSSOM: case TR_RHYTHMSHOOTING: + case HN_MEGA_SONIC_BLOW: + case HN_SPIRAL_PIERCE_MAX: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); if (skill_id == DK_DRAGONIC_AURA) @@ -5669,6 +5696,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case IG_SHIELD_SHOOTING: case TR_METALIC_FURY: case IG_GRAND_JUDGEMENT: + case HN_JUPITEL_THUNDER_STORM: if( flag&1 ) {//Recursive invocation int sflag = skill_area_temp[0] & 0xFFF; int heal = 0; @@ -5739,6 +5767,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case DK_DRAGONIC_BREATH: case DK_HACKANDSLASHER: case MT_SPARK_BLASTER: + case HN_JUPITEL_THUNDER_STORM: clif_skill_nodamage(src,bl,skill_id,skill_lv,1); break; #ifdef RENEWAL @@ -6087,6 +6116,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case AG_ASTRAL_STRIKE_ATK: case AG_DESTRUCTIVE_HURRICANE_CLIMAX: case CD_ARBITRIUM: + case HN_METEOR_STORM_BUSTER: skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); break; @@ -7011,6 +7041,44 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint sc_start(src, bl, SC_VENOMIMPRESS, 100, skill_lv, skill_get_time(skill_id,skill_lv)); break; + case HN_DOUBLEBOWLINGBASH: + if (flag & 1) { + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, skill_area_temp[0] & 0xFFF); + } else { + int splash = skill_get_splash(skill_id, skill_lv); + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count); + map_foreachinrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); + sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); + } + break; + + case HN_SHIELD_CHAIN_RUSH: + if (flag & 1) { + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); + } else { + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); + sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); + } + break; + + case HN_JACK_FROST_NOVA: + case HN_HELLS_DRIVE: + case HN_GROUND_GRAVITATION: + if (flag & 1) + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); + break; + + case HN_NAPALM_VULCAN_STRIKE: + if (flag & 1) { + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); + } else { + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); + } + break; + default: ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id); clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion, @@ -7900,6 +7968,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_DAMAGE_HEAL: case NPC_RELIEVE_ON: case NPC_RELIEVE_OFF: + case HN_BREAKINGLIMIT: + case HN_RULEBREAK: clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; @@ -12792,6 +12862,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; + case HN_HELLS_DRIVE: + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 1, skill_castend_damage_id); + break; + default: { std::shared_ptr skill = skill_db.find(skill_id); ShowWarning("skill_castend_nodamage_id: missing code case for skill %s(%d)\n", skill ? skill->name : "UNKNOWN", skill_id); @@ -13529,6 +13604,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SC_ESCAPE: case SU_CN_METEOR: case NPC_RAINOFMETEOR: + case HN_METEOR_STORM_BUSTER: break; //Effect is displayed on respective switch case. default: if(skill_get_inf(skill_id)&INF_SELF_SKILL) @@ -14436,6 +14512,41 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui } break; + case HN_JACK_FROST_NOVA: + case HN_GROUND_GRAVITATION: { + if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) { + clif_skill_fail(sd,skill_id,USESKILL_FAIL,0); + return 0; + } + + int splash = skill_get_splash(skill_id, skill_lv); + + map_foreachinarea(skill_area_sub, src->m, x - splash, y - splash, x + splash, y + splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id); + skill_unitsetting(src, skill_id, skill_lv, x, y, flag); + + for (i = 1; i <= (skill_get_time(skill_id, skill_lv) / skill_get_unit_interval(skill_id)); i++) { + skill_addtimerskill(src, tick + (t_tick)i*skill_get_unit_interval(skill_id), 0, x, y, skill_id, skill_lv, 0, flag); + } + } + break; + + case HN_METEOR_STORM_BUSTER: { + if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) { + clif_skill_fail(sd,skill_id,USESKILL_FAIL,0); + return 0; + } + + int splash = skill_get_splash(skill_id, skill_lv); + + map_foreachinarea(skill_area_sub, src->m, x - splash, y - splash, x + splash, y + splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id); + skill_unitsetting(src, skill_id, skill_lv, x, y, skill_get_unit_interval(skill_id)); + + for (i = 1; i <= (skill_get_time(skill_id, skill_lv) / skill_get_time2(skill_id, skill_lv)); i++) { + skill_addtimerskill(src, tick + (t_tick)i*skill_get_time2(skill_id, skill_lv), 0, x, y, skill_id, skill_lv, 0, flag); + } + } + break; + default: ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skill_id); return 1; @@ -14775,6 +14886,7 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui case SU_CN_METEOR: case SU_CN_METEOR2: case NPC_RAINOFMETEOR: + case HN_METEOR_STORM_BUSTER: limit = flag; flag = 0; // Flag should not influence anything else for these skills break; @@ -21108,7 +21220,8 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) default: if (group->val2 == 1 && (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 || - group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR)) { + group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR || + group->skill_id == HN_METEOR_STORM_BUSTER)) { // Deal damage before expiration break; } @@ -21164,7 +21277,8 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) break; default: if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 || - group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR) { + group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR || + group->skill_id == HN_METEOR_STORM_BUSTER) { if (group->val2 == 0 && (DIFF_TICK(tick, group->tick) >= group->limit - group->interval || DIFF_TICK(tick, group->tick) >= unit->limit - group->interval)) { // Unit will expire the next interval, start dropping Meteor block_list *src = map_id2bl(group->src_id); @@ -21206,6 +21320,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) } else if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 || group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR || + group->skill_id == HN_METEOR_STORM_BUSTER || ((group->skill_id == CR_GRANDCROSS || group->skill_id == NPC_GRANDDARKNESS) && unit->val1 <= 0)) { skill_delunit(unit); return 0; diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 077fe8c959..c1ac243df3 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -39,6 +39,9 @@ class status_change; /// Used with tracking the hitcount of Earthquake for skills that can avoid the first attack #define NPC_EARTHQUAKE_FLAG 0x800 +/// To control alternative skill scalings +#define SKILL_ALTDMG_FLAG 0x10 + /// Constants to identify a skill's nk value (damage properties) /// The NK value applies only to non INF_GROUND_SKILL skills /// when determining skill castend function to invoke. diff --git a/src/map/status.cpp b/src/map/status.cpp index fd5f3445e7..f3dafd248f 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -4379,6 +4379,10 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) base_status->patk += skill * 3; base_status->smatk += skill * 3; } + if ((skill = pc_checkskill(sd, HN_SELFSTUDY_TATICS)) > 0) + base_status->patk += skill; + if ((skill = pc_checkskill(sd, HN_SELFSTUDY_SOCERY)) > 0) + base_status->smatk += skill; // 2-Handed Staff Mastery if( sd->status.weapon == W_2HSTAFF && ( skill = pc_checkskill( sd, AG_TWOHANDSTAFF ) ) > 0 ){ @@ -8012,6 +8016,10 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc val = max(val, sc->getSCE(SC_SP_SHA)->val2); if (sc->getSCE(SC_CREATINGSTAR)) val = max(val, 90); + if (sc->getSCE(SC_SHIELDCHAINRUSH)) + val = max(val, 20); + if (sc->getSCE(SC_GROUNDGRAVITY)) + val = max(val, 20); if( sd && sd->bonus.speed_rate + sd->bonus.speed_add_rate > 0 ) // Permanent item-based speedup val = max( val, sd->bonus.speed_rate + sd->bonus.speed_add_rate ); diff --git a/src/map/status.hpp b/src/map/status.hpp index 386b4bf381..fb1a3a95aa 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -1284,6 +1284,15 @@ enum sc_type : int16 { SC_RUSH_QUAKE2, SC_G_LIFEPOTION, + + // Hyper Novice + SC_HNNOWEAPON, + SC_SHIELDCHAINRUSH, + SC_MISTYFROST, + SC_GROUNDGRAVITY, + SC_BREAKINGLIMIT, + SC_RULEBREAK, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif From c8ab735348580b1a40d273953b4703ef0fa07602 Mon Sep 17 00:00:00 2001 From: Atemo Date: Thu, 18 Jan 2024 15:53:29 +0100 Subject: [PATCH 28/33] Updated Level 250/50 to 260/55 (#8108) Updated Level 250/50 to 260/55. Hp and Sp are unknown. Additionally updated Super_Novice_E job level from 50 to 70 (note: this class doesn't get additional stats by job level). --- db/pre-re/statpoint.yml | 20 + db/re/job_basepoints.yml | 800 +++++++++++++++++++++++++++++++++++++++ db/re/job_exp.yml | 76 +++- db/re/job_stats.yml | 184 +++++++++ db/re/statpoint.yml | 30 ++ src/map/map.hpp | 2 +- 6 files changed, 1108 insertions(+), 4 deletions(-) diff --git a/db/pre-re/statpoint.yml b/db/pre-re/statpoint.yml index 9b2710fda4..e05dc03c83 100644 --- a/db/pre-re/statpoint.yml +++ b/db/pre-re/statpoint.yml @@ -532,3 +532,23 @@ Body: Points: 4545 - Level: 250 Points: 4545 + - Level: 251 + Points: 4545 + - Level: 252 + Points: 4545 + - Level: 253 + Points: 4545 + - Level: 254 + Points: 4545 + - Level: 255 + Points: 4545 + - Level: 256 + Points: 4545 + - Level: 257 + Points: 4545 + - Level: 258 + Points: 4545 + - Level: 259 + Points: 4545 + - Level: 260 + Points: 4545 diff --git a/db/re/job_basepoints.yml b/db/re/job_basepoints.yml index f7575234e5..b3ef890c8a 100644 --- a/db/re/job_basepoints.yml +++ b/db/re/job_basepoints.yml @@ -19397,6 +19397,26 @@ Body: Hp: 31450 - Level: 250 Hp: 31625 + - Level: 251 + Hp: 31625 + - Level: 252 + Hp: 31625 + - Level: 253 + Hp: 31625 + - Level: 254 + Hp: 31625 + - Level: 255 + Hp: 31625 + - Level: 256 + Hp: 31625 + - Level: 257 + Hp: 31625 + - Level: 258 + Hp: 31625 + - Level: 259 + Hp: 31625 + - Level: 260 + Hp: 31625 - Jobs: Meister: true Meister2: true @@ -19503,6 +19523,26 @@ Body: Hp: 29575 - Level: 250 Hp: 29750 + - Level: 251 + Hp: 29750 + - Level: 252 + Hp: 29750 + - Level: 253 + Hp: 29750 + - Level: 254 + Hp: 29750 + - Level: 255 + Hp: 29750 + - Level: 256 + Hp: 29750 + - Level: 257 + Hp: 29750 + - Level: 258 + Hp: 29750 + - Level: 259 + Hp: 29750 + - Level: 260 + Hp: 29750 - Jobs: Shadow_Cross: true BaseHp: @@ -19608,6 +19648,26 @@ Body: Hp: 28075 - Level: 250 Hp: 28225 + - Level: 251 + Hp: 28225 + - Level: 252 + Hp: 28225 + - Level: 253 + Hp: 28225 + - Level: 254 + Hp: 28225 + - Level: 255 + Hp: 28225 + - Level: 256 + Hp: 28225 + - Level: 257 + Hp: 28225 + - Level: 258 + Hp: 28225 + - Level: 259 + Hp: 28225 + - Level: 260 + Hp: 28225 - Jobs: Arch_Mage: true BaseHp: @@ -19713,6 +19773,26 @@ Body: Hp: 24200 - Level: 250 Hp: 24375 + - Level: 251 + Hp: 24375 + - Level: 252 + Hp: 24375 + - Level: 253 + Hp: 24375 + - Level: 254 + Hp: 24375 + - Level: 255 + Hp: 24375 + - Level: 256 + Hp: 24375 + - Level: 257 + Hp: 24375 + - Level: 258 + Hp: 24375 + - Level: 259 + Hp: 24375 + - Level: 260 + Hp: 24375 - Jobs: Cardinal: true BaseHp: @@ -19818,6 +19898,26 @@ Body: Hp: 24585 - Level: 250 Hp: 24760 + - Level: 251 + Hp: 24760 + - Level: 252 + Hp: 24760 + - Level: 253 + Hp: 24760 + - Level: 254 + Hp: 24760 + - Level: 255 + Hp: 24760 + - Level: 256 + Hp: 24760 + - Level: 257 + Hp: 24760 + - Level: 258 + Hp: 24760 + - Level: 259 + Hp: 24760 + - Level: 260 + Hp: 24760 - Jobs: Windhawk: true Windhawk2: true @@ -19924,6 +20024,26 @@ Body: Hp: 25035 - Level: 250 Hp: 25185 + - Level: 251 + Hp: 25185 + - Level: 252 + Hp: 25185 + - Level: 253 + Hp: 25185 + - Level: 254 + Hp: 25185 + - Level: 255 + Hp: 25185 + - Level: 256 + Hp: 25185 + - Level: 257 + Hp: 25185 + - Level: 258 + Hp: 25185 + - Level: 259 + Hp: 25185 + - Level: 260 + Hp: 25185 - Jobs: Imperial_Guard: true Imperial_Guard2: true @@ -20030,6 +20150,26 @@ Body: Hp: 30330 - Level: 250 Hp: 30505 + - Level: 251 + Hp: 30505 + - Level: 252 + Hp: 30505 + - Level: 253 + Hp: 30505 + - Level: 254 + Hp: 30505 + - Level: 255 + Hp: 30505 + - Level: 256 + Hp: 30505 + - Level: 257 + Hp: 30505 + - Level: 258 + Hp: 30505 + - Level: 259 + Hp: 30505 + - Level: 260 + Hp: 30505 - Jobs: Biolo: true BaseHp: @@ -20135,6 +20275,26 @@ Body: Hp: 25450 - Level: 250 Hp: 25625 + - Level: 251 + Hp: 25625 + - Level: 252 + Hp: 25625 + - Level: 253 + Hp: 25625 + - Level: 254 + Hp: 25625 + - Level: 255 + Hp: 25625 + - Level: 256 + Hp: 25625 + - Level: 257 + Hp: 25625 + - Level: 258 + Hp: 25625 + - Level: 259 + Hp: 25625 + - Level: 260 + Hp: 25625 - Jobs: Abyss_Chaser: true BaseHp: @@ -20240,6 +20400,26 @@ Body: Hp: 24330 - Level: 250 Hp: 24445 + - Level: 251 + Hp: 24445 + - Level: 252 + Hp: 24445 + - Level: 253 + Hp: 24445 + - Level: 254 + Hp: 24445 + - Level: 255 + Hp: 24445 + - Level: 256 + Hp: 24445 + - Level: 257 + Hp: 24445 + - Level: 258 + Hp: 24445 + - Level: 259 + Hp: 24445 + - Level: 260 + Hp: 24445 - Jobs: Elemental_Master: true BaseHp: @@ -20345,6 +20525,26 @@ Body: Hp: 21825 - Level: 250 Hp: 21960 + - Level: 251 + Hp: 21960 + - Level: 252 + Hp: 21960 + - Level: 253 + Hp: 21960 + - Level: 254 + Hp: 21960 + - Level: 255 + Hp: 21960 + - Level: 256 + Hp: 21960 + - Level: 257 + Hp: 21960 + - Level: 258 + Hp: 21960 + - Level: 259 + Hp: 21960 + - Level: 260 + Hp: 21960 - Jobs: Inquisitor: true BaseHp: @@ -20450,6 +20650,26 @@ Body: Hp: 25955 - Level: 250 Hp: 26110 + - Level: 251 + Hp: 26110 + - Level: 252 + Hp: 26110 + - Level: 253 + Hp: 26110 + - Level: 254 + Hp: 26110 + - Level: 255 + Hp: 26110 + - Level: 256 + Hp: 26110 + - Level: 257 + Hp: 26110 + - Level: 258 + Hp: 26110 + - Level: 259 + Hp: 26110 + - Level: 260 + Hp: 26110 - Jobs: Troubadour: true BaseHp: @@ -20555,6 +20775,26 @@ Body: Hp: 25030 - Level: 250 Hp: 25180 + - Level: 251 + Hp: 25180 + - Level: 252 + Hp: 25180 + - Level: 253 + Hp: 25180 + - Level: 254 + Hp: 25180 + - Level: 255 + Hp: 25180 + - Level: 256 + Hp: 25180 + - Level: 257 + Hp: 25180 + - Level: 258 + Hp: 25180 + - Level: 259 + Hp: 25180 + - Level: 260 + Hp: 25180 - Jobs: Trouvere: true BaseHp: @@ -20660,6 +20900,26 @@ Body: Hp: 25030 - Level: 250 Hp: 25180 + - Level: 251 + Hp: 25180 + - Level: 252 + Hp: 25180 + - Level: 253 + Hp: 25180 + - Level: 254 + Hp: 25180 + - Level: 255 + Hp: 25180 + - Level: 256 + Hp: 25180 + - Level: 257 + Hp: 25180 + - Level: 258 + Hp: 25180 + - Level: 259 + Hp: 25180 + - Level: 260 + Hp: 25180 - Jobs: Sky_Emperor: true Sky_Emperor2: true @@ -20766,6 +21026,26 @@ Body: Hp: 13800 - Level: 250 Hp: 13862 + - Level: 251 + Hp: 13862 + - Level: 252 + Hp: 13862 + - Level: 253 + Hp: 13862 + - Level: 254 + Hp: 13862 + - Level: 255 + Hp: 13862 + - Level: 256 + Hp: 13862 + - Level: 257 + Hp: 13862 + - Level: 258 + Hp: 13862 + - Level: 259 + Hp: 13862 + - Level: 260 + Hp: 13862 - Jobs: Soul_Ascetic: true BaseHp: @@ -20871,6 +21151,26 @@ Body: Hp: 12500 - Level: 250 Hp: 12555 + - Level: 251 + Hp: 12555 + - Level: 252 + Hp: 12555 + - Level: 253 + Hp: 12555 + - Level: 254 + Hp: 12555 + - Level: 255 + Hp: 12555 + - Level: 256 + Hp: 12555 + - Level: 257 + Hp: 12555 + - Level: 258 + Hp: 12555 + - Level: 259 + Hp: 12555 + - Level: 260 + Hp: 12555 - Jobs: Shinkiro: true BaseHp: @@ -20976,6 +21276,26 @@ Body: Hp: 22800 - Level: 250 Hp: 22955 + - Level: 251 + Hp: 22955 + - Level: 252 + Hp: 22955 + - Level: 253 + Hp: 22955 + - Level: 254 + Hp: 22955 + - Level: 255 + Hp: 22955 + - Level: 256 + Hp: 22955 + - Level: 257 + Hp: 22955 + - Level: 258 + Hp: 22955 + - Level: 259 + Hp: 22955 + - Level: 260 + Hp: 22955 - Jobs: Shiranui: true BaseHp: @@ -21081,6 +21401,26 @@ Body: Hp: 22500 - Level: 250 Hp: 22655 + - Level: 251 + Hp: 22655 + - Level: 252 + Hp: 22655 + - Level: 253 + Hp: 22655 + - Level: 254 + Hp: 22655 + - Level: 255 + Hp: 22655 + - Level: 256 + Hp: 22655 + - Level: 257 + Hp: 22655 + - Level: 258 + Hp: 22655 + - Level: 259 + Hp: 22655 + - Level: 260 + Hp: 22655 - Jobs: Night_Watch: true BaseHp: @@ -21186,6 +21526,26 @@ Body: Hp: 26326 - Level: 250 Hp: 26467 + - Level: 251 + Hp: 26467 + - Level: 252 + Hp: 26467 + - Level: 253 + Hp: 26467 + - Level: 254 + Hp: 26467 + - Level: 255 + Hp: 26467 + - Level: 256 + Hp: 26467 + - Level: 257 + Hp: 26467 + - Level: 258 + Hp: 26467 + - Level: 259 + Hp: 26467 + - Level: 260 + Hp: 26467 - Jobs: Hyper_Novice: true BaseHp: @@ -21291,6 +21651,26 @@ Body: Hp: 5280 - Level: 250 Hp: 5285 + - Level: 251 + Hp: 5285 + - Level: 252 + Hp: 5285 + - Level: 253 + Hp: 5285 + - Level: 254 + Hp: 5285 + - Level: 255 + Hp: 5285 + - Level: 256 + Hp: 5285 + - Level: 257 + Hp: 5285 + - Level: 258 + Hp: 5285 + - Level: 259 + Hp: 5285 + - Level: 260 + Hp: 5285 - Jobs: Spirit_Handler: true BaseHp: @@ -21396,6 +21776,26 @@ Body: Hp: 31755 - Level: 250 Hp: 31947 + - Level: 251 + Hp: 31947 + - Level: 252 + Hp: 31947 + - Level: 253 + Hp: 31947 + - Level: 254 + Hp: 31947 + - Level: 255 + Hp: 31947 + - Level: 256 + Hp: 31947 + - Level: 257 + Hp: 31947 + - Level: 258 + Hp: 31947 + - Level: 259 + Hp: 31947 + - Level: 260 + Hp: 31947 - Jobs: Dragon_Knight: true Dragon_Knight2: true @@ -21502,6 +21902,26 @@ Body: Sp: 1409 - Level: 250 Sp: 1415 + - Level: 251 + Sp: 1415 + - Level: 252 + Sp: 1415 + - Level: 253 + Sp: 1415 + - Level: 254 + Sp: 1415 + - Level: 255 + Sp: 1415 + - Level: 256 + Sp: 1415 + - Level: 257 + Sp: 1415 + - Level: 258 + Sp: 1415 + - Level: 259 + Sp: 1415 + - Level: 260 + Sp: 1415 - Jobs: Meister: true Meister2: true @@ -21608,6 +22028,26 @@ Body: Sp: 1838 - Level: 250 Sp: 1845 + - Level: 251 + Sp: 1845 + - Level: 252 + Sp: 1845 + - Level: 253 + Sp: 1845 + - Level: 254 + Sp: 1845 + - Level: 255 + Sp: 1845 + - Level: 256 + Sp: 1845 + - Level: 257 + Sp: 1845 + - Level: 258 + Sp: 1845 + - Level: 259 + Sp: 1845 + - Level: 260 + Sp: 1845 - Jobs: Shadow_Cross: true BaseSp: @@ -21713,6 +22153,26 @@ Body: Sp: 1413 - Level: 250 Sp: 1420 + - Level: 251 + Sp: 1420 + - Level: 252 + Sp: 1420 + - Level: 253 + Sp: 1420 + - Level: 254 + Sp: 1420 + - Level: 255 + Sp: 1420 + - Level: 256 + Sp: 1420 + - Level: 257 + Sp: 1420 + - Level: 258 + Sp: 1420 + - Level: 259 + Sp: 1420 + - Level: 260 + Sp: 1420 - Jobs: Arch_Mage: true BaseSp: @@ -21818,6 +22278,26 @@ Body: Sp: 2503 - Level: 250 Sp: 2515 + - Level: 251 + Sp: 2515 + - Level: 252 + Sp: 2515 + - Level: 253 + Sp: 2515 + - Level: 254 + Sp: 2515 + - Level: 255 + Sp: 2515 + - Level: 256 + Sp: 2515 + - Level: 257 + Sp: 2515 + - Level: 258 + Sp: 2515 + - Level: 259 + Sp: 2515 + - Level: 260 + Sp: 2515 - Jobs: Cardinal: true BaseSp: @@ -21923,6 +22403,26 @@ Body: Sp: 2454 - Level: 250 Sp: 2465 + - Level: 251 + Sp: 2465 + - Level: 252 + Sp: 2465 + - Level: 253 + Sp: 2465 + - Level: 254 + Sp: 2465 + - Level: 255 + Sp: 2465 + - Level: 256 + Sp: 2465 + - Level: 257 + Sp: 2465 + - Level: 258 + Sp: 2465 + - Level: 259 + Sp: 2465 + - Level: 260 + Sp: 2465 - Jobs: Windhawk: true Windhawk2: true @@ -22029,6 +22529,26 @@ Body: Sp: 1393 - Level: 250 Sp: 1400 + - Level: 251 + Sp: 1400 + - Level: 252 + Sp: 1400 + - Level: 253 + Sp: 1400 + - Level: 254 + Sp: 1400 + - Level: 255 + Sp: 1400 + - Level: 256 + Sp: 1400 + - Level: 257 + Sp: 1400 + - Level: 258 + Sp: 1400 + - Level: 259 + Sp: 1400 + - Level: 260 + Sp: 1400 - Jobs: Imperial_Guard: true Imperial_Guard2: true @@ -22135,6 +22655,26 @@ Body: Sp: 1838 - Level: 250 Sp: 1845 + - Level: 251 + Sp: 1845 + - Level: 252 + Sp: 1845 + - Level: 253 + Sp: 1845 + - Level: 254 + Sp: 1845 + - Level: 255 + Sp: 1845 + - Level: 256 + Sp: 1845 + - Level: 257 + Sp: 1845 + - Level: 258 + Sp: 1845 + - Level: 259 + Sp: 1845 + - Level: 260 + Sp: 1845 - Jobs: Biolo: true BaseSp: @@ -22240,6 +22780,26 @@ Body: Sp: 2503 - Level: 250 Sp: 2515 + - Level: 251 + Sp: 2515 + - Level: 252 + Sp: 2515 + - Level: 253 + Sp: 2515 + - Level: 254 + Sp: 2515 + - Level: 255 + Sp: 2515 + - Level: 256 + Sp: 2515 + - Level: 257 + Sp: 2515 + - Level: 258 + Sp: 2515 + - Level: 259 + Sp: 2515 + - Level: 260 + Sp: 2515 - Jobs: Abyss_Chaser: true BaseSp: @@ -22345,6 +22905,26 @@ Body: Sp: 1258 - Level: 250 Sp: 1265 + - Level: 251 + Sp: 1265 + - Level: 252 + Sp: 1265 + - Level: 253 + Sp: 1265 + - Level: 254 + Sp: 1265 + - Level: 255 + Sp: 1265 + - Level: 256 + Sp: 1265 + - Level: 257 + Sp: 1265 + - Level: 258 + Sp: 1265 + - Level: 259 + Sp: 1265 + - Level: 260 + Sp: 1265 - Jobs: Elemental_Master: true BaseSp: @@ -22450,6 +23030,26 @@ Body: Sp: 2503 - Level: 250 Sp: 2515 + - Level: 251 + Sp: 2515 + - Level: 252 + Sp: 2515 + - Level: 253 + Sp: 2515 + - Level: 254 + Sp: 2515 + - Level: 255 + Sp: 2515 + - Level: 256 + Sp: 2515 + - Level: 257 + Sp: 2515 + - Level: 258 + Sp: 2515 + - Level: 259 + Sp: 2515 + - Level: 260 + Sp: 2515 - Jobs: Inquisitor: true BaseSp: @@ -22555,6 +23155,26 @@ Body: Sp: 1258 - Level: 250 Sp: 1265 + - Level: 251 + Sp: 1265 + - Level: 252 + Sp: 1265 + - Level: 253 + Sp: 1265 + - Level: 254 + Sp: 1265 + - Level: 255 + Sp: 1265 + - Level: 256 + Sp: 1265 + - Level: 257 + Sp: 1265 + - Level: 258 + Sp: 1265 + - Level: 259 + Sp: 1265 + - Level: 260 + Sp: 1265 - Jobs: Troubadour: true BaseSp: @@ -22660,6 +23280,26 @@ Body: Sp: 1458 - Level: 250 Sp: 1465 + - Level: 251 + Sp: 1465 + - Level: 252 + Sp: 1465 + - Level: 253 + Sp: 1465 + - Level: 254 + Sp: 1465 + - Level: 255 + Sp: 1465 + - Level: 256 + Sp: 1465 + - Level: 257 + Sp: 1465 + - Level: 258 + Sp: 1465 + - Level: 259 + Sp: 1465 + - Level: 260 + Sp: 1465 - Jobs: Trouvere: true BaseSp: @@ -22765,6 +23405,26 @@ Body: Sp: 1458 - Level: 250 Sp: 1465 + - Level: 251 + Sp: 1465 + - Level: 252 + Sp: 1465 + - Level: 253 + Sp: 1465 + - Level: 254 + Sp: 1465 + - Level: 255 + Sp: 1465 + - Level: 256 + Sp: 1465 + - Level: 257 + Sp: 1465 + - Level: 258 + Sp: 1465 + - Level: 259 + Sp: 1465 + - Level: 260 + Sp: 1465 - Jobs: Sky_Emperor: true Sky_Emperor2: true @@ -22871,6 +23531,26 @@ Body: Sp: 500 - Level: 250 Sp: 500 + - Level: 251 + Sp: 500 + - Level: 252 + Sp: 500 + - Level: 253 + Sp: 500 + - Level: 254 + Sp: 500 + - Level: 255 + Sp: 500 + - Level: 256 + Sp: 500 + - Level: 257 + Sp: 500 + - Level: 258 + Sp: 500 + - Level: 259 + Sp: 500 + - Level: 260 + Sp: 500 - Jobs: Soul_Ascetic: true BaseSp: @@ -22976,6 +23656,26 @@ Body: Sp: 900 - Level: 250 Sp: 900 + - Level: 251 + Sp: 900 + - Level: 252 + Sp: 900 + - Level: 253 + Sp: 900 + - Level: 254 + Sp: 900 + - Level: 255 + Sp: 900 + - Level: 256 + Sp: 900 + - Level: 257 + Sp: 900 + - Level: 258 + Sp: 900 + - Level: 259 + Sp: 900 + - Level: 260 + Sp: 900 - Jobs: Shinkiro: true BaseSp: @@ -23081,6 +23781,26 @@ Body: Sp: 1722 - Level: 250 Sp: 1730 + - Level: 251 + Sp: 1730 + - Level: 252 + Sp: 1730 + - Level: 253 + Sp: 1730 + - Level: 254 + Sp: 1730 + - Level: 255 + Sp: 1730 + - Level: 256 + Sp: 1730 + - Level: 257 + Sp: 1730 + - Level: 258 + Sp: 1730 + - Level: 259 + Sp: 1730 + - Level: 260 + Sp: 1730 - Jobs: Shiranui: true BaseSp: @@ -23186,6 +23906,26 @@ Body: Sp: 1812 - Level: 250 Sp: 1820 + - Level: 251 + Sp: 1820 + - Level: 252 + Sp: 1820 + - Level: 253 + Sp: 1820 + - Level: 254 + Sp: 1820 + - Level: 255 + Sp: 1820 + - Level: 256 + Sp: 1820 + - Level: 257 + Sp: 1820 + - Level: 258 + Sp: 1820 + - Level: 259 + Sp: 1820 + - Level: 260 + Sp: 1820 - Jobs: Night_Watch: true BaseSp: @@ -23291,6 +24031,26 @@ Body: Sp: 1356 - Level: 250 Sp: 1362 + - Level: 251 + Sp: 1362 + - Level: 252 + Sp: 1362 + - Level: 253 + Sp: 1362 + - Level: 254 + Sp: 1362 + - Level: 255 + Sp: 1362 + - Level: 256 + Sp: 1362 + - Level: 257 + Sp: 1362 + - Level: 258 + Sp: 1362 + - Level: 259 + Sp: 1362 + - Level: 260 + Sp: 1362 - Jobs: Hyper_Novice: true BaseSp: @@ -23396,6 +24156,26 @@ Body: Sp: 249 - Level: 250 Sp: 250 + - Level: 251 + Sp: 250 + - Level: 252 + Sp: 250 + - Level: 253 + Sp: 250 + - Level: 254 + Sp: 250 + - Level: 255 + Sp: 250 + - Level: 256 + Sp: 250 + - Level: 257 + Sp: 250 + - Level: 258 + Sp: 250 + - Level: 259 + Sp: 250 + - Level: 260 + Sp: 250 - Jobs: Spirit_Handler: true BaseSp: @@ -23501,3 +24281,23 @@ Body: Sp: 628 - Level: 250 Sp: 630 + - Level: 251 + Sp: 630 + - Level: 252 + Sp: 630 + - Level: 253 + Sp: 630 + - Level: 254 + Sp: 630 + - Level: 255 + Sp: 630 + - Level: 256 + Sp: 630 + - Level: 257 + Sp: 630 + - Level: 258 + Sp: 630 + - Level: 259 + Sp: 630 + - Level: 260 + Sp: 630 diff --git a/db/re/job_exp.yml b/db/re/job_exp.yml index fdebbe6d84..8b9d22f7ee 100644 --- a/db/re/job_exp.yml +++ b/db/re/job_exp.yml @@ -2870,7 +2870,7 @@ Body: - Jobs: Super_Novice_E: true Super_Baby_E: true - MaxJobLevel: 50 + MaxJobLevel: 70 JobExp: - Level: 1 Exp: 12800 @@ -2971,6 +2971,46 @@ Body: - Level: 49 Exp: 81209043 - Level: 50 + Exp: 91847428 + - Level: 51 + Exp: 103879441 + - Level: 52 + Exp: 117487647 + - Level: 53 + Exp: 132878529 + - Level: 54 + Exp: 150285617 + - Level: 55 + Exp: 169973033 + - Level: 56 + Exp: 192239500 + - Level: 57 + Exp: 217422874 + - Level: 58 + Exp: 245905271 + - Level: 59 + Exp: 278118862 + - Level: 60 + Exp: 319836691 + - Level: 61 + Exp: 367812195 + - Level: 62 + Exp: 422984024 + - Level: 63 + Exp: 486431628 + - Level: 64 + Exp: 559396372 + - Level: 65 + Exp: 632361116 + - Level: 66 + Exp: 705325860 + - Level: 67 + Exp: 778290604 + - Level: 68 + Exp: 851255348 + - Level: 69 + Exp: 924220092 + - Level: 70 Exp: 999999999 - Jobs: Super_Novice: true @@ -3325,7 +3365,7 @@ Body: Night_Watch: true Hyper_Novice: true Spirit_Handler: true - MaxBaseLevel: 250 + MaxBaseLevel: 260 BaseExp: - Level: 1 Exp: 658 @@ -3826,6 +3866,26 @@ Body: - Level: 249 Exp: 35221511928 - Level: 250 + Exp: 43181573623 + - Level: 251 + Exp: 52940609261 + - Level: 252 + Exp: 64905186953 + - Level: 253 + Exp: 79573759204 + - Level: 254 + Exp: 97557428784 + - Level: 255 + Exp: 119605407689 + - Level: 256 + Exp: 146636229826 + - Level: 257 + Exp: 179776017766 + - Level: 258 + Exp: 220405397781 + - Level: 259 + Exp: 270217017679 + - Level: 260 Exp: 999999999999 - Jobs: Dragon_Knight: true @@ -3852,7 +3912,7 @@ Body: Night_Watch: true Hyper_Novice: true Spirit_Handler: true - MaxJobLevel: 50 + MaxJobLevel: 55 JobExp: - Level: 1 Exp: 4700000 @@ -3953,4 +4013,14 @@ Body: - Level: 49 Exp: 4073145058 - Level: 50 + Exp: 4480459564 + - Level: 51 + Exp: 4928505520 + - Level: 52 + Exp: 5421356072 + - Level: 53 + Exp: 5963491679 + - Level: 54 + Exp: 6559840847 + - Level: 55 Exp: 9999999999 diff --git a/db/re/job_stats.yml b/db/re/job_stats.yml index 0e7eb9bce8..b74f08294e 100644 --- a/db/re/job_stats.yml +++ b/db/re/job_stats.yml @@ -8884,6 +8884,15 @@ Body: - Level: 50 Vit: 1 Pow: 1 + - Level: 51 + Crt: 1 + - Level: 52 + Pow: 1 + - Level: 54 + Pow: 1 + Crt: 1 + - Level: 55 + Sta: 1 - Jobs: Meister: true Meister2: true @@ -9017,6 +9026,15 @@ Body: - Level: 50 Pow: 1 Wis: 1 + - Level: 51 + Pow: 1 + - Level: 52 + Con: 1 + - Level: 53 + Sta: 1 + Wis: 1 + - Level: 55 + Pow: 1 - Jobs: Shadow_Cross: true MaxWeight: 32000 @@ -9149,6 +9167,15 @@ Body: - Level: 50 Pow: 1 Crt: 1 + - Level: 51 + Pow: 1 + - Level: 53 + Con: 1 + - Level: 54 + Sta: 1 + Crt: 1 + - Level: 55 + Crt: 1 - Jobs: Arch_Mage: true MaxWeight: 30000 @@ -9281,6 +9308,15 @@ Body: - Level: 50 Sta: 1 Wis: 1 + - Level: 52 + Spl: 1 + - Level: 53 + Con: 1 + - Level: 54 + Sta: 1 + Wis: 1 + - Level: 55 + Spl: 1 - Jobs: Cardinal: true MaxWeight: 30000 @@ -9413,6 +9449,16 @@ Body: - Level: 50 Spl: 1 Crt: 1 + - Level: 51 + Spl: 1 + - Level: 52 + Pow: 1 + - Level: 53 + Sta: 1 + - Level: 54 + Wis: 1 + - Level: 55 + Crt: 1 - Jobs: Windhawk: true Windhawk2: true @@ -9546,6 +9592,15 @@ Body: - Level: 50 Dex: 1 Con: 1 + - Level: 51 + Con: 1 + - Level: 52 + Pow: 1 + Con: 1 + - Level: 53 + Sta: 1 + - Level: 55 + Pow: 1 - Jobs: Imperial_Guard: true Imperial_Guard2: true @@ -9680,6 +9735,15 @@ Body: - Level: 50 Pow: 1 Sta: 1 + - Level: 51 + Pow: 1 + - Level: 52 + Sta: 1 + - Level: 53 + Sta: 1 + - Level: 55 + Wis: 1 + Con: 1 - Jobs: Biolo: true MaxWeight: 32000 @@ -9812,6 +9876,15 @@ Body: - Level: 50 Str: 1 Crt: 1 + - Level: 51 + Crt: 1 + - Level: 52 + Sta: 1 + - Level: 53 + Pow: 1 + Crt: 1 + - Level: 55 + Con: 1 - Jobs: Abyss_Chaser: true MaxWeight: 28000 @@ -9944,6 +10017,15 @@ Body: - Level: 50 Pow: 1 Spl: 1 + - Level: 51 + Pow: 1 + - Level: 52 + Crt: 1 + - Level: 54 + Sta: 1 + - Level: 55 + Sta: 1 + Con: 1 - Jobs: Elemental_Master: true MaxWeight: 30000 @@ -10076,6 +10158,16 @@ Body: - Level: 50 Wis: 1 Spl: 1 + - Level: 51 + Spl: 1 + - Level: 52 + Sta: 1 + - Level: 53 + Sta: 1 + - Level: 54 + Wis: 1 + - Level: 55 + Spl: 1 - Jobs: Inquisitor: true MaxWeight: 30000 @@ -10208,6 +10300,15 @@ Body: - Level: 50 Pow: 1 Wis: 1 + - Level: 51 + Pow: 1 + - Level: 52 + Sta: 1 + - Level: 53 + Sta: 1 + - Level: 55 + Pow: 1 + Wis: 1 - Jobs: Troubadour: true MaxWeight: 32000 @@ -10340,6 +10441,15 @@ Body: Con: 1 - Level: 50 Dex: 1 + - Level: 51 + Con: 1 + - Level: 52 + Spl: 1 + - Level: 53 + Sta: 1 + - Level: 55 + Pow: 1 + Con: 1 - Jobs: Trouvere: true MaxWeight: 32000 @@ -10473,6 +10583,15 @@ Body: Con: 1 - Level: 50 Agi: 1 + - Level: 51 + Con: 1 + - Level: 52 + Sta: 1 + - Level: 53 + Spl: 1 + - Level: 55 + Pow: 1 + Con: 1 - Jobs: Sky_Emperor: true MaxWeight: 42000 @@ -10607,6 +10726,14 @@ Body: - Level: 50 Pow: 1 Crt: 1 + - Level: 51 + Sta: 1 + Con: 1 + - Level: 53 + Sta: 1 + - Level: 55 + Pow: 1 + Con: 1 - Jobs: Soul_Ascetic: true MaxWeight: 42000 @@ -10730,6 +10857,16 @@ Body: - Level: 50 Wis: 1 Spl: 1 + - Level: 51 + Spl: 1 + - Level: 52 + Con: 1 + - Level: 53 + Wis: 1 + - Level: 54 + Sta: 1 + - Level: 55 + Spl: 1 - Jobs: Shinkiro: true MaxWeight: 45000 @@ -10863,6 +11000,16 @@ Body: - Level: 50 Pow: 1 Crt: 1 + - Level: 51 + Crt: 1 + - Level: 52 + Con: 1 + - Level: 53 + Wis: 1 + - Level: 54 + Sta: 1 + - Level: 55 + Sta: 1 - Jobs: Shiranui: true MaxWeight: 45000 @@ -10985,6 +11132,15 @@ Body: - Level: 50 Wis: 1 Spl: 1 + - Level: 51 + Pow: 1 + - Level: 52 + Spl: 1 + - Level: 54 + Spl: 1 + - Level: 55 + Spl: 1 + Con: 1 - Jobs: Night_Watch: true MaxWeight: 48000 @@ -11112,6 +11268,15 @@ Body: Con: 1 - Level: 50 Pow: 1 + - Level: 51 + Con: 1 + - Level: 53 + Pow: 1 + Con: 1 + - Level: 54 + Wis: 1 + - Level: 55 + Pow: 1 - Jobs: Hyper_Novice: true MaxWeight: 40000 @@ -11248,6 +11413,15 @@ Body: - Level: 50 Agi: 1 Dex: 1 + - Level: 51 + Con: 1 + - Level: 52 + Pow: 1 + Con: 1 + - Level: 53 + Sta: 1 + - Level: 55 + Spl: 1 - Jobs: Spirit_Handler: true MaxWeight: 42000 @@ -11379,3 +11553,13 @@ Body: Crt: 1 - Level: 50 Pow: 1 + - Level: 51 + Con: 1 + - Level: 52 + Pow: 1 + - Level: 53 + Spl: 1 + - Level: 54 + Wis: 1 + - Level: 55 + Sta: 1 diff --git a/db/re/statpoint.yml b/db/re/statpoint.yml index e940c4a03b..9e9d108b0e 100644 --- a/db/re/statpoint.yml +++ b/db/re/statpoint.yml @@ -582,3 +582,33 @@ Body: - Level: 250 Points: 4099 TraitPoints: 190 + - Level: 251 + Points: 4099 + TraitPoints: 193 + - Level: 252 + Points: 4099 + TraitPoints: 196 + - Level: 253 + Points: 4099 + TraitPoints: 199 + - Level: 254 + Points: 4099 + TraitPoints: 202 + - Level: 255 + Points: 4099 + TraitPoints: 209 + - Level: 256 + Points: 4099 + TraitPoints: 212 + - Level: 257 + Points: 4099 + TraitPoints: 215 + - Level: 258 + Points: 4099 + TraitPoints: 218 + - Level: 259 + Points: 4099 + TraitPoints: 221 + - Level: 260 + Points: 4099 + TraitPoints: 228 diff --git a/src/map/map.hpp b/src/map/map.hpp index b6ca95078a..13f1f29527 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -66,7 +66,7 @@ void map_msg_reload(void); #define NATURAL_HEAL_INTERVAL 500 #define MIN_FLOORITEM 2 #define MAX_FLOORITEM START_ACCOUNT_NUM -#define MAX_LEVEL 250 +#define MAX_LEVEL 260 #define MAX_DROP_PER_MAP 48 #define MAX_IGNORE_LIST 20 // official is 14 #define MAX_VENDING 12 From 51ca9c4923eedadf0ebea0577043b6af81ce2585 Mon Sep 17 00:00:00 2001 From: Ahmed Shawky <54556365+Haydrich@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:31:18 +0200 Subject: [PATCH 29/33] Added illusion Merchant (#7854) --- .../barters/enchan_illusion_dungeons.yml | 14 +++++++ npc/re/merchants/enchan_illusion_dungeons.txt | 38 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/npc/re/merchants/barters/enchan_illusion_dungeons.yml b/npc/re/merchants/barters/enchan_illusion_dungeons.yml index 9f43ae6828..d5ca64d39a 100644 --- a/npc/re/merchants/barters/enchan_illusion_dungeons.yml +++ b/npc/re/merchants/barters/enchan_illusion_dungeons.yml @@ -412,6 +412,20 @@ Body: - Index: 3 Item: IllusionStone Amount: 120 + - Name: resonance_stone_barter + Items: + - Index: 0 + Item: ILL_Piece_A + RequiredItems: + - Index: 0 + Item: IllusionStone + Amount: 10 + - Index: 1 + Item: ILL_Piece_B + RequiredItems: + - Index: 0 + Item: IllusionStone + Amount: 10 - Name: barter_ill_moonlight Items: - Index: 0 diff --git a/npc/re/merchants/enchan_illusion_dungeons.txt b/npc/re/merchants/enchan_illusion_dungeons.txt index 6b9d7cb745..853f7a1af8 100644 --- a/npc/re/merchants/enchan_illusion_dungeons.txt +++ b/npc/re/merchants/enchan_illusion_dungeons.txt @@ -14,6 +14,7 @@ //= 1.5 Added Illusion of Luanda enchanter [Capuche] //= 1.6 Added Illusion of Underwater exchange [Capuche] //= 1.7 Added Illusion of Twins enchanter [Capuche] +//= 1.8 Added Illusion Merchant [Haydrich] //============================================================ //============================================================ @@ -846,3 +847,40 @@ OnInit: setunitdata .@npc_id, UNPC_HAIRCOLOR, 6; end; } + +//============================================================ +//= Illusion Merchant +//============================================================ +- marketshop market_resonance_stone -1,100003:2000000:99999,100004:2000000:99999 +prontera,88,113,5 script Illusion Merchant#0829 HIDDEN_NPC,{ + mes "[Illusion Merchant]"; + mes "I'm selling two random optional weapon grant scrolls that I made myself. You can choose the payment method you like."; + next; + switch( select( "Purchase with Zeny.", "Purchase with Illusion Stones" )) { + case 1: + mes "[Illusion Merchant]"; + mes "I hope you like it."; + close2; + callshop "market_resonance_stone"; + end; + case 2: + mes "[Illusion Merchant]"; + mes "I hope you like it."; + close2; + callshop "resonance_stone_barter"; + end; + } +OnInit: + .@npc_id = getnpcid(0); + setunitdata .@npc_id,UNPC_CLASS, JOB_MAGE_HIGH; + setunitdata .@npc_id,UNPC_SEX,SEX_FEMALE; + setunitdata .@npc_id,UNPC_HEADTOP,142; + setunitdata .@npc_id,UNPC_HEADMIDDLE,92; + setunitdata .@npc_id,UNPC_HAIRSTYLE,2; + setunitdata .@npc_id,UNPC_HAIRCOLOR,2; + + // Restock + npcshopupdate "market_resonance_stone",100003,2000000,99999; + npcshopupdate "market_resonance_stone",100004,2000000,99999; + end; +} From 9f90e4e9e15ffcce80eb1f42cdd59badde1532ce Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 19 Jan 2024 14:35:17 +0100 Subject: [PATCH 30/33] Rebalance Hyper Novice 20221221 (#8111) * Double Bowling Bash - Reduces knock-back distance from 2 cells to 1 cell. - Increases base damage from 2650%Atk to 3200%Atk per hit based on level 10. * Mega Sonic Blow - Increases cooldown from 0.3 seconds to 0.35 seconds. - Increases base damage from 5350%Atk to 8400%Atk based on level 10. * Shield Chain Rush - Increases cooldown from 0.3 seconds to 0.35 seconds. - Increases base damage from 5100%Atk to 5700%Atk based on level 10. * Spiral Pierce Max - Increases cooldown from 0.3 seconds to 0.35 seconds. - Increases base damage from 4050%Atk to 8700%Atk based on level 10. * Hell's Drive - Increases SP consumption from 98 to 115 based on level 10. * Ground Gravitation - Increases SP consumption from 100 to 120 based on level 10. * Breaking Limit - Increases damage bonus of Mega Sonic Blow and Spiral Pierce Max from 70% to 100%. - Increases damage bonus of Double Bowling Bash and Shield Chain Rush from 50% to 70%. --- db/re/skill_db.yml | 48 +++++++++++++++++++++++----------------------- src/map/battle.cpp | 12 ++++++------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index c0b0afdaa4..3b14aefa13 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -41406,7 +41406,7 @@ Body: DamageFlags: Splash: true SplashArea: 4 - Knockback: 2 + Knockback: 1 CastCancel: true CastTime: 300 AfterCastActDelay: 1000 @@ -41451,7 +41451,7 @@ Body: GiveAp: 2 Element: Weapon AfterCastActDelay: 500 - Cooldown: 300 + Cooldown: 350 Duration2: 5000 Requires: SpCost: @@ -41492,7 +41492,7 @@ Body: CastCancel: true CastTime: 1200 AfterCastActDelay: 500 - Cooldown: 300 + Cooldown: 350 FixedCastTime: 300 Duration1: 5000 Duration2: 1200 @@ -41534,7 +41534,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 500 - Cooldown: 300 + Cooldown: 350 FixedCastTime: 300 Duration2: 2000 Requires: @@ -41942,25 +41942,25 @@ Body: Requires: SpCost: - Level: 1 - Amount: 71 + Amount: 88 - Level: 2 - Amount: 74 + Amount: 91 - Level: 3 - Amount: 77 + Amount: 94 - Level: 4 - Amount: 80 + Amount: 97 - Level: 5 - Amount: 83 + Amount: 100 - Level: 6 - Amount: 86 + Amount: 103 - Level: 7 - Amount: 89 + Amount: 106 - Level: 8 - Amount: 92 + Amount: 109 - Level: 9 - Amount: 95 + Amount: 112 - Level: 10 - Amount: 98 + Amount: 115 - Id: 5459 Name: HN_GROUND_GRAVITATION Description: Ground Gravitation @@ -42045,25 +42045,25 @@ Body: Requires: SpCost: - Level: 1 - Amount: 55 + Amount: 93 - Level: 2 - Amount: 60 + Amount: 96 - Level: 3 - Amount: 65 + Amount: 99 - Level: 4 - Amount: 70 + Amount: 102 - Level: 5 - Amount: 75 + Amount: 105 - Level: 6 - Amount: 80 + Amount: 108 - Level: 7 - Amount: 85 + Amount: 111 - Level: 8 - Amount: 90 + Amount: 114 - Level: 9 - Amount: 95 + Amount: 117 - Level: 10 - Amount: 100 + Amount: 120 Unit: Id: GROUND_GRAVITATION Range: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 1ae1415488..c5758c1775 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1846,11 +1846,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam switch (skill_id) { case HN_SHIELD_CHAIN_RUSH: case HN_DOUBLEBOWLINGBASH: - damage += damage / 2; + damage += damage * 70 / 100; break; case HN_MEGA_SONIC_BLOW: case HN_SPIRAL_PIERCE_MAX: - damage += damage * 70 / 100; + damage *= 2; break; } } @@ -5817,7 +5817,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 50000; break; case HN_SPIRAL_PIERCE_MAX: - skillratio += -100 + 550 + 350 * skill_lv; + skillratio += -100 + 700 + 800 * skill_lv; skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv; skillratio += 5 * sstatus->pow; switch (status_get_size(target)){ @@ -5834,13 +5834,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case HN_SHIELD_CHAIN_RUSH: - skillratio += -100 + 600 + 450 * skill_lv; + skillratio += -100 + 700 + 500 * skill_lv; skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv; skillratio += 5 * sstatus->pow; RE_LVL_DMOD(100); break; case HN_MEGA_SONIC_BLOW: - skillratio += -100 + 900 + 450 * skill_lv; + skillratio += -100 + 900 + 750 * skill_lv; skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 5 * skill_lv; skillratio += 5 * sstatus->pow; if (status_get_hp(target) < status_get_max_hp(target) / 2) @@ -5848,7 +5848,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case HN_DOUBLEBOWLINGBASH: - skillratio += -100 + 150 + 250 * skill_lv; + skillratio += -100 + 200 + 300 * skill_lv; skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv; skillratio += 5 * sstatus->pow; RE_LVL_DMOD(100); From 04904c0947aa62855c9beaca4989349e6f71fb0d Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 26 Jan 2024 15:00:36 +0100 Subject: [PATCH 31/33] Corrected Shrink Stuns target (#8075) Fixed #8072 Thanks to @LadyNanuia --- src/map/battle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index c5758c1775..35d15caae5 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1383,7 +1383,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe unit_set_walkdelay(target, gettick(), delay, 1); #ifdef RENEWAL if (sc->getSCE(SC_SHRINK)) - sc_start(src, target, SC_STUN, 50, skill_lv, skill_get_time2(skill_id, skill_lv)); + sc_start(target, src, SC_STUN, 50, skill_lv, skill_get_time2(skill_id, skill_lv)); #else if (sc->getSCE(SC_SHRINK) && rnd() % 100 < 5 * sce->val1) skill_blown(target, src, skill_get_blewcount(CR_SHRINK, 1), -1, BLOWN_NONE); From e965e2794b96dc2fdd4364e457ef85ea5be6557e Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 26 Jan 2024 15:02:51 +0100 Subject: [PATCH 32/33] Added null pointer checks in map_delblock (#7930) --- src/map/map.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/map/map.cpp b/src/map/map.cpp index 7b58c490a0..d2afef12cb 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -349,7 +349,7 @@ int map_addblock(struct block_list* bl) struct map_data *mapdata = map_getmapdata(m); - if (mapdata->cell == nullptr) // Player warped to a freed map. Stop them! + if (mapdata == nullptr || mapdata->cell == nullptr) // Player warped to a freed map. Stop them! return 1; if( x < 0 || x >= mapdata->xs || y < 0 || y >= mapdata->ys ) @@ -402,6 +402,8 @@ int map_delblock(struct block_list* bl) struct map_data *mapdata = map_getmapdata(bl->m); + nullpo_ret(mapdata); + pos = bl->x/BLOCK_SIZE+(bl->y/BLOCK_SIZE)*mapdata->bxs; if (bl->next) @@ -409,8 +411,10 @@ int map_delblock(struct block_list* bl) if (bl->prev == &bl_head) { //Since the head of the list, update the block_list map of [] if (bl->type == BL_MOB) { + nullpo_ret(mapdata->block_mob); mapdata->block_mob[pos] = bl->next; } else { + nullpo_ret(mapdata->block); mapdata->block[pos] = bl->next; } } else { @@ -434,6 +438,8 @@ int map_delblock(struct block_list* bl) */ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick) { + nullpo_ret(bl); + int x0 = bl->x, y0 = bl->y; status_change *sc = NULL; int moveblock = ( x0/BLOCK_SIZE != x1/BLOCK_SIZE || y0/BLOCK_SIZE != y1/BLOCK_SIZE); From c43f7b369e797e8f765fef89d082eed1a3eb1b24 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 31 Jan 2024 16:13:57 +0100 Subject: [PATCH 33/33] Archmage skill corrections (#8120) Corrections of several Archmage skills and High wizard skill HW_MAGICPOWER : AG_FROZEN_SLASH : 3 hits are displayed instead of a single hit. TargetType of 4th ground skills is now Ground. Ground skills don't trigger HW_SOULDRAIN. Skills affected : AG_VIOLENT_QUAKE_ATK AG_ALL_BLOOM_ATK AG_ALL_BLOOM_ATK2 AG_CRYSTAL_IMPACT_ATK AG_ASTRAL_STRIKE_ATK Fixed cast time of HW_MAGICPOWER is not affected by item bonus anymore. --- db/re/skill_db.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 3b14aefa13..a178f20eae 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -10125,6 +10125,7 @@ Body: FixedCastTime: 700 CastTimeFlags: IgnoreDex: true + IgnoreItemBonus: true Requires: SpCost: - Level: 1 @@ -35597,7 +35598,7 @@ Body: Description: Violent Quake Attack MaxLevel: 5 Type: Magic - TargetType: Attack + TargetType: Ground Range: 9 Hit: Single HitCount: 1 @@ -35782,7 +35783,7 @@ Body: Description: All Bloom Attack MaxLevel: 5 Type: Magic - TargetType: Attack + TargetType: Ground Range: 9 Hit: Single HitCount: 1 @@ -35802,7 +35803,7 @@ Body: Description: All Bloom Attack 2 MaxLevel: 5 Type: Magic - TargetType: Attack + TargetType: Ground Range: 9 Hit: Single HitCount: 1 @@ -35873,7 +35874,7 @@ Body: Description: Crystal Impact Attack MaxLevel: 5 Type: Magic - TargetType: Attack + TargetType: Ground DamageFlags: Splash: true Hit: Single @@ -36052,7 +36053,7 @@ Body: Description: Astral Strike Attack MaxLevel: 10 Type: Magic - TargetType: Attack + TargetType: Ground Range: 9 Hit: Single HitCount: 1 @@ -36241,8 +36242,8 @@ Body: TargetType: Self DamageFlags: Splash: true - Hit: Single - HitCount: 1 + Hit: Multi_Hit + HitCount: -3 Element: Water SplashArea: - Level: 1