summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.mailmap2
-rw-r--r--AUTHORS2
-rw-r--r--conf/battlegrounds.conf14
-rw-r--r--conf/char/char-server.conf2
-rw-r--r--conf/common/socket.conf8
-rw-r--r--conf/global/console.conf2
-rw-r--r--conf/global/sql_connection.conf2
-rw-r--r--conf/login/login-server.conf6
-rw-r--r--conf/map/battle/gm.conf7
-rw-r--r--conf/map/battle/pet.conf5
-rw-r--r--conf/messages.conf10
-rw-r--r--conf/network.conf2
-rw-r--r--db/constants.conf3
-rw-r--r--doc/constants.md3
-rw-r--r--doc/option_drop_group.md6
-rw-r--r--doc/script_commands.txt73
-rw-r--r--npc/jobs/2-1/wizard.txt17
-rw-r--r--npc/mapflag/nopet.txt78
-rw-r--r--npc/quests/quests_amatsu.txt33
-rw-r--r--npc/quests/quests_juperos.txt22
-rw-r--r--npc/quests/quests_lighthalzen.txt12
-rw-r--r--npc/quests/quests_moscovia.txt7
-rw-r--r--npc/quests/seals/god_weapon_creation.txt40
-rw-r--r--npc/quests/the_sign_quest.txt18
-rw-r--r--npc/scripts_mapflags.conf1
-rw-r--r--src/char/char.c139
-rw-r--r--src/common/packets/packets2020_len_main.h30
-rw-r--r--src/common/packets/packets2020_len_re.h63
-rw-r--r--src/common/packets/packets2020_len_zero.h30
-rw-r--r--src/config/secure.h2
-rw-r--r--src/login/login.c2
-rw-r--r--src/map/atcommand.c111
-rw-r--r--src/map/battle.c1
-rw-r--r--src/map/battle.h1
-rw-r--r--src/map/clif.c8
-rw-r--r--src/map/map.c13
-rw-r--r--src/map/map.h1
-rw-r--r--src/map/messages_main.h12
-rw-r--r--src/map/messages_re.h44
-rw-r--r--src/map/messages_zero.h12
-rw-r--r--src/map/npc.c65
-rw-r--r--src/map/packets_keys_main.h7
-rw-r--r--src/map/packets_keys_zero.h5
-rw-r--r--src/map/packets_shuffle_main.h5
-rw-r--r--src/map/packets_shuffle_re.h5
-rw-r--r--src/map/packets_shuffle_zero.h5
-rw-r--r--src/map/pc.c4
-rw-r--r--src/map/script.c6
-rw-r--r--src/map/script.h3
-rw-r--r--src/map/skill.c14
50 files changed, 601 insertions, 362 deletions
diff --git a/.mailmap b/.mailmap
index 111831380..7b038e1e3 100644
--- a/.mailmap
+++ b/.mailmap
@@ -63,7 +63,7 @@ Kenpachi <Kenpachi.Developer@gmx.de> Kenpachi Developer <Kenpachi.Developer@gmx.
<Asheraf@users.noreply.github.com> <acheraf1998@gmail.com>
<sagunkho@hotmail.com> <sagunxp@gmail.com>
<git@gumi.ca> <mekolat@users.noreply.github.com>
-
+Zopokx <zopokx@gmail.com>
diff --git a/AUTHORS b/AUTHORS
index f51704d4b..ce72fc223 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -187,7 +187,6 @@ Shido <the.keikun@gmail.com>
Shizuke <matiasdvt@hotmail.com>
sigtus <vantimothy@openmailbox.org>
sirius <fw@f-ws.de>
-Sirius <zopokx@gmail.com>
skyleo <leo-pflug@web.de>
skyleo <skyleo@skyleo.de>
smokexyz <sagunkho@hotmail.com>
@@ -215,6 +214,7 @@ Yommy <yomanda@gmail.com>
Your Name <ibrahem.h.basyone@gmail.com>
zackdreaver <zackdreaver@gmail.com>
Zarbony <justonlinegames@web.de>
+Zopokx <zopokx@gmail.com>
diff --git a/conf/battlegrounds.conf b/conf/battlegrounds.conf
index 2b4184e11..fd079c59d 100644
--- a/conf/battlegrounds.conf
+++ b/conf/battlegrounds.conf
@@ -14,8 +14,8 @@
//= arenas: ({
//= //- allowedTypes defines what kind of applications the arena will accept, setting is not case-sensitive and is ok with whitespaces
//= allowedTypes: "Solo | Party" //Arena Accepts solo and party-type joins
-//= allowedTypes: "guild|party" //Arena Accepts solo and guild-type joins
-//= allowedTypes: "All" //Arena Accepts solo, party and guild-type joins
+//= allowedTypes: "guild | party" //Arena Accepts solo and guild-type joins
+//= allowedTypes: "All" //Arena Accepts solo, party and guild-type joins
//= //- fillAnnounce (optional arena param)
//= })
battlegrounds: (
@@ -46,7 +46,7 @@ battlegrounds: (
delay_var: "Tierra_BG_Tick" /* char variable name that will store the delay for this match */
maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
- pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ pGameDuration: 20 /* time to wait for players to confirm their attendance after queueing process has finished */
},{
name: "Flavius" //must match the name in client files
event: "start#bat_b01::OnPlayerListReady"
@@ -64,7 +64,7 @@ battlegrounds: (
delay_var: "Flavius_BG_Tick" /* char variable name that will store the delay for this match */
maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
- pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ pGameDuration: 20 /* time to wait for players to confirm their attendance after queueing process has finished */
},{
name: "KVM (Level 80 and up)" //must match the name in client files
event: "KvM03_BG::OnPlayerListReady"
@@ -82,7 +82,7 @@ battlegrounds: (
delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
- pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ pGameDuration: 20 /* time to wait for players to confirm their attendance after queueing process has finished */
},{
name: "KVM (Level 60~79)" //must match the name in client files
event: "KvM03_BG::OnPlayerListReady"
@@ -100,7 +100,7 @@ battlegrounds: (
delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
- pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ pGameDuration: 20 /* time to wait for players to confirm their attendance after queueing process has finished */
},{
name: "KVM (Level 59 and below)" //must match the name in client files
event: "KvM03_BG::OnPlayerListReady"
@@ -118,7 +118,7 @@ battlegrounds: (
delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
- pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ pGameDuration: 20 /* time to wait for players to confirm their attendance after queueing process has finished */
}
)
})
diff --git a/conf/char/char-server.conf b/conf/char/char-server.conf
index a8918e705..8632aa3ad 100644
--- a/conf/char/char-server.conf
+++ b/conf/char/char-server.conf
@@ -152,7 +152,7 @@ char_configuration: {
// example: Test-test-TEST-TesT; Value: 0 not allowed (default), 1 allowed
name_ignoring_case: false
- // Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are:
+ // Manage possible letters/symbol in the name of character. Control character (0x00-0x1f) are never accepted. Possible values are:
// NOTE: Applies to character, party and guild names.
// 0: no restriction (default)
// 1: only letters/symbols in 'name_letters' option.
diff --git a/conf/common/socket.conf b/conf/common/socket.conf
index fe171336a..9367b181a 100644
--- a/conf/common/socket.conf
+++ b/conf/common/socket.conf
@@ -34,13 +34,13 @@ socket_configuration: {
// Display debug reports (When something goes wrong during the report, the report is saved.)
debug: false
- // Linux/Epoll: Maxmimum Events per cycle
+ // Linux/Epoll: Maximum Events per cycle
// Default Value:
- // (Maxmimum Supported Connections)/2
+ // (Maximum Supported Connections)/2
// NOTE: this controls the maximum collected socket-events per-cycle (call to epoll_wait())
- // for example settings this to 32 will allow up to 32 events (incomming data/new connections
+ // for example settings this to 32 will allow up to 32 events (incoming data/new connections
// per server-cycle.
- // NOTE: Recommended Settings is at least half the maxmimum supported connections
+ // NOTE: Recommended Settings is at least half the maximum supported connections
// Settings this to a lower value, may cause lags/delays
// Depending on available CPU Time
// NOTE: This Setting is only available on Linux when build using EPoll as event dispatcher!
diff --git a/conf/global/console.conf b/conf/global/console.conf
index 4865fd9b7..56213cbea 100644
--- a/conf/global/console.conf
+++ b/conf/global/console.conf
@@ -26,7 +26,7 @@
//=========================================================================
//= Server Console configuration file.
//=========================================================================
-// This file affects how ALL server consoles work, unless explictly defined
+// This file affects how ALL server consoles work, unless explicitly defined
// so in the server configuration file (See doc/global_configuration.txt
// for more information).
//=========================================================================
diff --git a/conf/global/sql_connection.conf b/conf/global/sql_connection.conf
index 7a8932f33..2441c4cee 100644
--- a/conf/global/sql_connection.conf
+++ b/conf/global/sql_connection.conf
@@ -26,7 +26,7 @@
//=========================================================================
//= SQL connection configuration file.
//=========================================================================
-// This file affects how ALL server sql connections work, unless explictly
+// This file affects how ALL server sql connections work, unless explicitly
// defined so in the server configuration file (See
// doc/global_configuration.txt for more information).
//=========================================================================
diff --git a/conf/login/login-server.conf b/conf/login/login-server.conf
index a7a30c83d..1d2792268 100644
--- a/conf/login/login-server.conf
+++ b/conf/login/login-server.conf
@@ -56,13 +56,13 @@ login_configuration: {
// for packet version >= 20170726
users_count: {
- // if false, dont show any colored strings.
+ // if false, don't show any colored strings.
// if true, show special users count numbers for coloring char servers.
send_user_count_description: true
// users counts for use different colors.
// below 'low' show green text
- // below 'medium' show oragne text
+ // below 'medium' show orange text
// below 'high' show red text
// higher 'high' show purple text
low: 200
@@ -85,7 +85,7 @@ login_configuration: {
time_allowed: 10
// Starting additional sec from now for the limited time at creation of account
- // -1: new account are created with UNlimited time (default value)
+ // -1: new account are created with unlimited time (default value)
// 0 or more: new accounts was created by addition of the value (in sec) to the actual time (to set first limited time)
start_limited_time: -1
diff --git a/conf/map/battle/gm.conf b/conf/map/battle/gm.conf
index bd5cfbef7..f0e9083d7 100644
--- a/conf/map/battle/gm.conf
+++ b/conf/map/battle/gm.conf
@@ -50,10 +50,11 @@ atcommand_max_stat_bypass: false
// Duration of the ban, in minutes (default: 5). To disable the ban, set 0.
ban_hack_trade: 5
-// requires RENEWAL_DROP to be enabled (src/map/config/renewal.h)
-// modifies @mobinfo to display the users' real drop rate as per renewal_drop formula
+// modifies @mobinfo to display the users' real drop rate as per renewal_drop formula (Note 1)
// modifies @iteminfo to not display the minimum item drop rate (since it can't tell the mob level)
-atcommand_mobinfo_type: 0
+// NOTE: requires RENEWAL_DROP to be enabled (src/map/config/renewal.h)
+// Default: false
+atcommand_mobinfo_type: false
// Ignore warpable area configuration.
// Set the minimum group id to ignore invalid cells when warping.
diff --git a/conf/map/battle/pet.conf b/conf/map/battle/pet.conf
index 3060b6e64..6d013b0ef 100644
--- a/conf/map/battle/pet.conf
+++ b/conf/map/battle/pet.conf
@@ -95,11 +95,6 @@ pet_max_stats: 99
pet_max_atk1: 500
pet_max_atk2: 1000
-// Are pets disabled during Guild Wars?
-// If set to true, pets are automatically returned to egg when entering castles during WoE times
-// and hatching is forbidden within as well.
-pet_disable_in_gvg: false
-
// Should the pet immediately be removed when its intimacy drops to 0? (Note 1)
// If set to false the pet will randomly walk around the map before being removed.
pet_remove_immediately: true
diff --git a/conf/messages.conf b/conf/messages.conf
index 98b0e0a9d..3c381142d 100644
--- a/conf/messages.conf
+++ b/conf/messages.conf
@@ -646,8 +646,10 @@
668: Shadow Chaser T
669: Summoner
-//670-853 FREE (please start using from the top if you need, leave the 670+ range for new jobs)
+//670-852 FREE (please start using from the top if you need, leave the 670+ range for new jobs)
+
+853: NoPet |
// Mapflag to disable Autoloot Commands
854: Auto loot item are disabled on this map.
@@ -667,7 +669,7 @@
863: Duel: Can't use this item in duel.
864: You cannot use this command when dead.
865: Can't create chat rooms in this area.
-866: Pets are not allowed in Guild Wars.
+866: Pets are disabled in this map.
867: You're not dead.
868: Your current memo positions are:
869: You broke the target's weapon.
@@ -694,7 +696,7 @@
886: Gained %dz.
887: %s stole an Unknown Item (id: %i).
888: %s stole %s.
-889: Experience Gained Base:%"PRIu64" (%.2f%%) Job:%"PRIu64" (%.2f%%)
+889: Experience Gained Base:%llu (%.2f%%) Job:%llu (%.2f%%)
890: [KS Warning!! - Owner : %s]
891: [Watch out! %s is trying to KS you!]
892: Growth: hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f)
@@ -913,7 +915,7 @@
1044: Autotrade Disabled
1045: Battlegrounds ON
1046: PvP Flags:
-1047: Pvp ON |
+1047: PvP ON |
1048: NoGuild |
1049: NoParty |
1050: NightmareDrop |
diff --git a/conf/network.conf b/conf/network.conf
index b355acb25..b6f1aa978 100644
--- a/conf/network.conf
+++ b/conf/network.conf
@@ -26,7 +26,7 @@ allowed: (
/*
* List here any IP ranges a char- or map-server can connect from. These ranges
- * will also be excluded from the automatic ipban in casee of password failure.
+ * will also be excluded from the automatic ipban in case of password failure.
* Any entry present in this list is also automatically included in the
* allowed IP list.
* Note: This may be a security threat. Only edit this list if you know what
diff --git a/db/constants.conf b/db/constants.conf
index 8237fed67..8adbb21cd 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -438,6 +438,7 @@ constants_db: {
mf_pairship_endable: 58
mf_nostorage: 59
mf_nogstorage: 60
+ mf_nopet: 61
comment__: "Cell Properties"
cell_walkable: 0
@@ -3758,7 +3759,7 @@ constants_db: {
MER_SWORDMAN09: 6045
MER_SWORDMAN10: 6046
- comment__: "checkquest"
+ comment__: "questprogress"
HAVEQUEST: 0
PLAYTIME: 1
HUNTING: 2
diff --git a/doc/constants.md b/doc/constants.md
index dde1647b3..d1c926c29 100644
--- a/doc/constants.md
+++ b/doc/constants.md
@@ -364,6 +364,7 @@
- `mf_pairship_endable`: 58
- `mf_nostorage`: 59
- `mf_nogstorage`: 60
+- `mf_nopet`: 61
### Cell Properties
@@ -3657,7 +3658,7 @@
- `MER_SWORDMAN09`: 6045
- `MER_SWORDMAN10`: 6046
-### checkquest
+### questprogress
- `HAVEQUEST`: 0
- `PLAYTIME`: 1
diff --git a/doc/option_drop_group.md b/doc/option_drop_group.md
index 325cf9fe2..730db53e6 100644
--- a/doc/option_drop_group.md
+++ b/doc/option_drop_group.md
@@ -1,6 +1,6 @@
# Option Drop Group Database
-## Description
+## Description
Explanation of the `db/option_drop_groups.conf` file and structure.
This database file allows the creation of groups of random options
@@ -23,7 +23,7 @@ options for each of these slots.
// Possible options for slot 1
// min/max value : int, defaults to 0
- // chance : int, 100 = 1% if not set, will be 100%/number of possibiltiies
+ // chance : int, 100 = 1% if not set, will be 100%/number of possibilities
OptionName: value
// or
OptionName: [min value, max value]
@@ -70,7 +70,7 @@ When chance is not specified in an option, it will be auto calculated by
the server as being `100%/num`, when `num` is the number of possibilities
in this option slot.
-For example, if you specify 3 possible options, all of them without
+For example, if you specify 3 possible options, all of them without
a `chance` defined, all of them will have 33.33% chance of being
picked (100%/3). If you set the chance of one of them to 50%, you
will have one option with 50% chance, and each of the others with
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index db37ef284..ee56087b2 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -3195,23 +3195,24 @@ This command sets a bunch of arrays with a complete list of whatever the
invoking character has in its inventory, including all the data needed to
recreate these items perfectly if they are destroyed. Here's what you get:
-@inventorylist_id[] - array of item ids.
-@inventorylist_idx[] - array of item inventory index.
-@inventorylist_amount[] - their corresponding item amounts.
-@inventorylist_equip[] - will return the slot the item is equipped on, if at all.
-@inventorylist_refine[] - for how much it is refined.
-@inventorylist_identify[] - whether it is identified.
-@inventorylist_attribute[] - whether it is broken.
-@inventorylist_card1[] - These four arrays contain card data for the
-@inventorylist_card2[] items. These data slots are also used to store
-@inventorylist_card3[] names inscribed on the items, so you can
-@inventorylist_card4[] explicitly check if the character owns an item
- made by a specific craftsman.
-@inventorylist_expire[] - expire time (Unix time stamp). 0 means never
- expires.
-@inventorylist_bound[] - whether it is an account bounded item or not.
-@inventorylist_favorite[] - whether it is favorite (inside favorite tab) or not.
-@inventorylist_count - the number of items in these lists.
+@inventorylist_id[] - array of item ids.
+@inventorylist_idx[] - array of item inventory index.
+@inventorylist_amount[] - their corresponding item amounts.
+@inventorylist_equip[] - will return the slot the item is equipped on, if at all.
+@inventorylist_refine[] - for how much it is refined.
+@inventorylist_identify[] - whether it is identified.
+@inventorylist_attribute[] - whether it is broken.
+@inventorylist_card1[] - These four arrays contain card data for the items.
+@inventorylist_card2[] These data slots are also used to store names inscribed
+@inventorylist_card3[] on the items, so you can explicitly check if the character
+@inventorylist_card4[] owns an item made by a specific craftsman.
+@inventorylist_expire[] - expire time (Unix time stamp). 0 means never expires.
+@inventorylist_bound[] - whether it is an account bounded item or not.
+@inventorylist_favorite[] - whether it is favorite (inside favorite tab) or not.
+@inventorylist_opt_id1~5[] - array of random option id.
+@inventorylist_opt_val1~5[] - array of random option val.
+@inventorylist_opt_param1~5[] - array of random option param.
+@inventorylist_count - the number of items in these lists.
This could be handy to save/restore a character's inventory, since no
other command returns such a complete set of data, and could also be the
@@ -3239,14 +3240,15 @@ recreate these items perfectly if they are destroyed. Here's what you get:
@cartinventorylist_refine[] - for how much it is refined.
@cartinventorylist_identify[] - whether it is identified.
@cartinventorylist_attribute[] - whether it is broken.
-@cartinventorylist_card1[] - These four arrays contain card data for the
-@cartinventorylist_card2[] items. These data slots are also used to store
-@cartinventorylist_card3[] names inscribed on the items, so you can
-@cartinventorylist_card4[] explicitly check if the character owns an item
- made by a specific craftsman.
-@cartinventorylist_expire[] - expire time (Unix time stamp). 0 means never
- expires.
+@cartinventorylist_card1[] - These four arrays contain card data for the items.
+@cartinventorylist_card2[] These data slots are also used to store names inscribed on the items,
+@cartinventorylist_card3[] so you can explicitly check if the character owns an item
+@cartinventorylist_card4[] made by a specific craftsman.
+@cartinventorylist_expire[] - expire time (Unix time stamp). 0 means never expires.
@cartinventorylist_bound - whether it is an account bound item or not.
+@inventorylist_opt_id1~5[] - array of random option id.
+@inventorylist_opt_val1~5[] - array of random option val.
+@inventorylist_opt_param1~5[] - array of random option param.
@cartinventorylist_count - the number of items in these lists.
This could be handy to save/restore a character's cart_inventory, since no
@@ -3626,7 +3628,7 @@ If the player is not found, returns -1.
*gettimetick(<type>)
Valid types are :
- 0 - server's tick (milleseconds), unsigned int, loops every ~50 days
+ 0 - server's tick (milleseconds), unsigned int, loops every ~25 days
1 - time since the start of the current day in seconds
2 - UNIX epoch time (number of seconds elapsed since 1st of January 1970)
@@ -4549,7 +4551,7 @@ Name is optional, and defaults to the attached player if omitted.
*agitcheck()
*agitcheck2()
-These function will let you check whether the server is currently in WoE
+These functions will let you check whether the server is currently in WoE
mode (or WoE SE mode if the second function is called) and will return true
if War of Emperium is on and false if it isn't.
@@ -7656,7 +7658,8 @@ In the OnBuyItem, two arrays are filled (@bought_nameid and
and the amount sold of it. Same goes for the OnSellItem label, only the
variables are named different (@sold_nameid, @sold_quantity, @sold_refine,
@sold_attribute, @sold_identify, @sold_card1, @sold_card2, @sold_card3,
-@sold_card4). An example on a shop comes with Hercules, and can be found
+@sold_card4, @sold_opt_id1~5, @sold_opt_val1~5, @sold_opt_param1~5).
+An example on a shop comes with Hercules, and can be found
in the doc/sample/npc_dynamic_shop.txt file.
This example shows how to use the labels and their set variables to create
@@ -9638,26 +9641,18 @@ This will open a book item at the specified page.
---------------------------------------
*rodex_sendmail(<char id>, "<sender name>", "<title>", "<body>"{, <zeny>{, <item1>, <amount1>{, <item2>, <amount2>{, <item3>, <amount3>{, <item4>, <amount4>{, <item5>, <amount5>}}}}}})
+*rodex_sendmail2(<char id>, "<sender name>", "<title>", "<body>"{, <zeny>{, <item1>, <amount1>, <refine1>, <attribute1>, <card0_1>, <card1_1>, <card2_1>, <card3_1>{,<item2>, <amount2>, <refine2>, <attribute2>, <card0_2>, <card1_2>, <card2_2>, <card3_2>{,<item3>, <amount3>, <refine3>, <attribute3>, <card0_3>, <card1_3>, <card2_3>, <card3_3>{,<item4>, <amount4>, <refine4>, <attribute4>, <card0_4>, <card1_4>, <card2_4>, <card3_4>{,<item5>, <amount5>, <refine5>, <attribute5>, <card0_5>, <card1_5>, <card2_5>, <card3_5>}}}}}})
+
*rodex_sendmail_acc(<account id>, "<sender name>", "<title>", "<body>"{, <zeny>{, <item1>, <amount1>{, <item2>, <amount2>{, <item3>, <amount3>{, <item4>, <amount4>{, <item5>, <amount5>}}}}}})
+*rodex_sendmail_acc2(<account id>, "<sender name>", "<title>", "<body>"{, <zeny>{, <item1>, <amount1>, <refine1>, <attribute1>, <card0_1>, <card1_1>, <card2_1>, <card3_1>{,<item2>, <amount2>, <refine2>, <attribute2>, <card0_2>, <card1_2>, <card2_2>, <card3_2>{,<item3>, <amount3>, <refine3>, <attribute3>, <card0_3>, <card1_3>, <card2_3>, <card3_3>{,<item4>, <amount4>, <refine4>, <attribute4>, <card0_4>, <card1_4>, <card2_4>, <card3_4>{,<item5>, <amount5>, <refine5>, <attribute5>, <card0_5>, <card1_5>, <card2_5>, <card3_5>}}}}}})
This will send a mail using the RoDEX mail system, in newer clients the message will be marked as a NPC mail (that you can't reply).
If items and zeny are specified, they will be added as attachments to the message.
-
For examples of usage, see /doc/sample/npc_rodex.txt
----------------------------------------
-
-*rodex_sendmail2(<char id>, "<sender name>", "<title>", "<body>"{, <zeny>{, <item1>, <amount1>, <refine1>, <attribute1>, <card0_1>, <card1_1>, <card2_1>, <card3_1>{,<item2>, <amount2>, <refine2>, <attribute2>, <card0_2>, <card1_2>, <card2_2>, <card3_2>{,<item3>, <amount3>, <refine3>, <attribute3>, <card0_3>, <card1_3>, <card2_3>, <card3_3>{,<item4>, <amount4>, <refine4>, <attribute4>, <card0_4>, <card1_4>, <card2_4>, <card3_4>{,<item5>, <amount5>, <refine5>, <attribute5>, <card0_5>, <card1_5>, <card2_5>, <card3_5>}}}}}})
-*rodex_sendmail_acc2(<account id>, "<sender name>", "<title>", "<body>"{, <zeny>{, <item1>, <amount1>, <refine1>, <attribute1>, <card0_1>, <card1_1>, <card2_1>, <card3_1>{,<item2>, <amount2>, <refine2>, <attribute2>, <card0_2>, <card1_2>, <card2_2>, <card3_2>{,<item3>, <amount3>, <refine3>, <attribute3>, <card0_3>, <card1_3>, <card2_3>, <card3_3>{,<item4>, <amount4>, <refine4>, <attribute4>, <card0_4>, <card1_4>, <card2_4>, <card3_4>{,<item5>, <amount5>, <refine5>, <attribute5>, <card0_5>, <card1_5>, <card2_5>, <card3_5>}}}}}})
-
-These are more flexible versions of rodex_sendmail and rodex_sendmail_acc.
-
-This will send a mail using the RoDEX mail system, in newer clients the message will be marked as a NPC mail (that you can't reply).
-If items and zeny are specified, they will be added as attachments to the message.
+rodex_sendmail2 and rodex_sendmail_acc2 are more flexible versions.
Check getitem2 command for more information of the extra parameters.
-For examples of usage, see /doc/sample/npc_rodex.txt
-
---------------------------------------
//=====================================
7 - Instance-Related Commands
diff --git a/npc/jobs/2-1/wizard.txt b/npc/jobs/2-1/wizard.txt
index 3814e1880..3c779f188 100644
--- a/npc/jobs/2-1/wizard.txt
+++ b/npc/jobs/2-1/wizard.txt
@@ -1527,7 +1527,7 @@ OnTimer183000:
end;
OnTimer184000:
- enablenpc "Room of Fire#Failed";
+ areawarp("job_wiz", 30, 83, 62, 115, "geffen", 120, 110);
end;
OnTimer185000:
@@ -1535,8 +1535,6 @@ OnTimer185000:
end;
OnTimer186000:
- disablenpc "Room of Fire#Failed";
- donpcevent "Room of Fire::OnDisable";
donpcevent "Arena Assistant::OnStart";
end;
}
@@ -1604,7 +1602,7 @@ OnTimer120000:
end;
OnTimer121000:
- enablenpc "Room of Fire#Failed";
+ areawarp("job_wiz", 30, 83, 62, 115, "geffen", 120, 110);
end;
OnTimer122000:
@@ -1612,21 +1610,10 @@ OnTimer122000:
end;
OnTimer123000:
- disablenpc "Room of Fire#Failed";
donpcevent "Room of Fire#Door::OnDisable";
donpcevent "Arena Assistant::OnStart";
}
-job_wiz,46,99,0 script Room of Fire#Failed FAKE_NPC,16,16,{
-OnInit:
- disablenpc "Room of Fire#Failed";
- end;
-
-OnTouch:
- warp "geffen",120,110;
- end;
-}
-
job_wiz,1,7,1 script Test Helper#wiz 1_F_01,{
end;
diff --git a/npc/mapflag/nopet.txt b/npc/mapflag/nopet.txt
new file mode 100644
index 000000000..82f9e36eb
--- /dev/null
+++ b/npc/mapflag/nopet.txt
@@ -0,0 +1,78 @@
+//================= Hercules Script =======================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2012-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Mapflag: Disable pet in map.
+//================= Current Version =======================================
+//= 1.0
+//================= Description ===========================================
+//= Players can't hatch pet in the map, existing pet will return to egg.
+//=========================================================================
+
+// GvG Arenas =============
+// guild_vs1 mapflag nopet
+// guild_vs2 mapflag nopet
+// guild_vs3 mapflag nopet
+// guild_vs4 mapflag nopet
+// guild_vs5 mapflag nopet
+
+// Guild Castles ==========
+// aldeg_cas01 mapflag nopet
+// aldeg_cas02 mapflag nopet
+// aldeg_cas03 mapflag nopet
+// aldeg_cas04 mapflag nopet
+// aldeg_cas05 mapflag nopet
+// gefg_cas01 mapflag nopet
+// gefg_cas02 mapflag nopet
+// gefg_cas03 mapflag nopet
+// gefg_cas04 mapflag nopet
+// gefg_cas05 mapflag nopet
+// payg_cas01 mapflag nopet
+// payg_cas02 mapflag nopet
+// payg_cas03 mapflag nopet
+// payg_cas04 mapflag nopet
+// payg_cas05 mapflag nopet
+// prtg_cas01 mapflag nopet
+// prtg_cas02 mapflag nopet
+// prtg_cas03 mapflag nopet
+// prtg_cas04 mapflag nopet
+// prtg_cas05 mapflag nopet
+// schg_cas01 mapflag nopet
+// schg_cas02 mapflag nopet
+// schg_cas03 mapflag nopet
+// schg_cas04 mapflag nopet
+// schg_cas05 mapflag nopet
+// arug_cas01 mapflag nopet
+// arug_cas02 mapflag nopet
+// arug_cas03 mapflag nopet
+// arug_cas04 mapflag nopet
+// arug_cas05 mapflag nopet
+
+// Novice Guild Castles ===
+// n_castle mapflag nopet
+// nguild_alde mapflag nopet
+// nguild_gef mapflag nopet
+// nguild_pay mapflag nopet
+// nguild_prt mapflag nopet
diff --git a/npc/quests/quests_amatsu.txt b/npc/quests/quests_amatsu.txt
index 3c55f91a3..504ab6032 100644
--- a/npc/quests/quests_amatsu.txt
+++ b/npc/quests/quests_amatsu.txt
@@ -399,11 +399,14 @@ OnStartArena:
enablenpc "Grandma#ama1";
enablenpc "Grandpa#ama";
warpwaitingpc "ama_test",50,83;
- donpcevent "Timer#ama::OnEnable";
+ enablenpc("Timer#ama");
+ initnpctimer("Timer#ama");
disablewaitingroomevent "Assistant#ama";
end;
OnReset:
+ stopnpctimer("Timer#ama");
+ disablenpc("Timer#ama");
enablewaitingroomevent "Assistant#ama";
end;
}
@@ -620,7 +623,6 @@ ama_test,50,100,3 script Coach#ama 4_M_JPN2,15,15,{
mes "Don't lose your high self-esteem";
mes "in the future. Farewell.";
close2;
- donpcevent "Timer#ama::OnDisable";
warp "amatsu",223,230;
disablenpc "Coach#ama";
donpcevent "Assistant#ama::OnReset";
@@ -665,7 +667,6 @@ ama_test,50,100,3 script Coach#ama 4_M_JPN2,15,15,{
setquest 8128;
warp "amatsu",223,230;
disablenpc "Coach#ama";
- donpcevent "Timer#ama::OnDisable";
donpcevent "Assistant#ama::OnReset";
end;
}
@@ -754,7 +755,6 @@ OnTouch:
changequest 8129,8130;
warp "amatsu",223,230;
disablenpc "Coach#after";
- donpcevent "Timer#ama::OnDisable";
donpcevent "Assistant#ama::OnReset";
end;
}
@@ -764,14 +764,6 @@ OnInit:
disablenpc "Timer#ama";
end;
-OnEnable:
- enablenpc "Timer#ama";
- initnpctimer;
- end;
-OnDisable:
- stopnpctimer;
- end;
-
OnTimer1000:
mapannounce "ama_test"," The Timer has been activated. You have 6 minutes. Annihilate the monsters in time! ",bc_map;
end;
@@ -788,26 +780,11 @@ OnTimer361000:
end;
OnTimer361500:
- enablenpc "backwarp#ama";
- end;
-
-OnTimer362000:
- disablenpc "backwarp#ama";
+ areawarp("ama_test", 25, 75, 80, 130, "amatsu", 115, 95);
end;
OnTimer362500:
donpcevent "Assistant#ama::OnReset";
- donpcevent "Timer#ama::OnDisable";
- end;
-}
-
-ama_test,50,100,0 script backwarp#ama FAKE_NPC,25,25,{
-OnInit:
- disablenpc "backwarp#ama";
- end;
-
-OnTouch:
- warp "amatsu",115,95;
end;
}
diff --git a/npc/quests/quests_juperos.txt b/npc/quests/quests_juperos.txt
index d120bfc27..f9120796d 100644
--- a/npc/quests/quests_juperos.txt
+++ b/npc/quests/quests_juperos.txt
@@ -4914,7 +4914,7 @@ OnTouch:
case 1:
specialeffect(EF_LIGHTSPHERE, AREA, playerattached());
close2;
- stopnpctimer;
+ stopnpctimer(1);
warp "juperos_02",130,142;
break;
case 2:
@@ -4922,7 +4922,7 @@ OnTouch:
mes "Not now!";
mes "I can't leave yet!";
close2;
- stopnpctimer;
+ stopnpctimer(1);
warp "jupe_gate",50,168;
break;
}
@@ -4930,23 +4930,7 @@ OnTouch:
OnTimer10000:
warp "juperos_02",128,278;
- enablenpc "gate#start#2";
- disablenpc "gate#start";
- end;
-}
-
-jupe_gate,50,171,0 script gate#start#2 FAKE_NPC,2,2,{
-OnInit:
- disablenpc "gate#start#2";
- end;
-
-OnTouch:
- warp "juperos_02",130,142;
- end;
-
-OnTimer2000:
- enablenpc "gate#start";
- disablenpc "gate#start#2";
+ areawarp("jupe_gate", 48, 169, 52, 173, "juperos_02", 130, 142);
end;
}
diff --git a/npc/quests/quests_lighthalzen.txt b/npc/quests/quests_lighthalzen.txt
index fe8abf473..0d83efd3c 100644
--- a/npc/quests/quests_lighthalzen.txt
+++ b/npc/quests/quests_lighthalzen.txt
@@ -9774,27 +9774,17 @@ OnTouch:
}
lhz_in01,177,44,0 script Timer_Sneak FAKE_NPC,8,12,{
-
-OnTouch:
- warp "lhz_in01",191,49;
- end;
-
-OnInit:
- disablenpc "Timer_Sneak";
- end;
-
OnEnter:
stopnpctimer;
initnpctimer;
end;
OnTimer180000:
- enablenpc "Timer_Sneak";
+ areawarp("lhz_in01", 169, 32, 185, 56, "lhz_in01", 191, 49);
end;
OnTimer190000:
stopnpctimer;
- disablenpc "Timer_Sneak";
end;
}
diff --git a/npc/quests/quests_moscovia.txt b/npc/quests/quests_moscovia.txt
index 3f44a9b0a..e0678cec9 100644
--- a/npc/quests/quests_moscovia.txt
+++ b/npc/quests/quests_moscovia.txt
@@ -1134,7 +1134,7 @@ mosk_ship,101,111,4 script rudder#ship HIDDEN_NPC,{
mes "Hey! Listen to what I am saying.";
mes "How come you go there without my";
mes "permission...";
- next;
+ close;
}
mes "[Mr. Ibanoff]";
mes "What? How did you get on";
@@ -1171,7 +1171,10 @@ S_Rud1:
mes "ever encountered! Be careful! We";
mes "must repulse these monsters!";
++$@mos1_edq;
- donpcevent "Baehideun3#ship::OnEnable";
+ if (mos_whale_edq >= 241)
+ donpcevent "Baehideun4#ship::OnEnable";
+ else
+ donpcevent "Baehideun3#ship::OnEnable";
}
mos_whale_edq = (getarg(1) == 2)?((mos_whale_edq >= 241)?((.@r != 3)?26:25):((.@r != 3)?10:11)):mos_whale_edq + 1;
close;
diff --git a/npc/quests/seals/god_weapon_creation.txt b/npc/quests/seals/god_weapon_creation.txt
index 8009bd36d..17979e51a 100644
--- a/npc/quests/seals/god_weapon_creation.txt
+++ b/npc/quests/seals/god_weapon_creation.txt
@@ -807,41 +807,15 @@ OnTimer610000:
end;
OnTimer612000:
- donpcevent "god_wep_warpmaster::OnEnable";
+ areawarp("que_god01", 130, 55, 190, 135, "prontera", 156, 324);
end;
OnTimer615000:
- donpcevent "god_wep_warpmaster::OnDisable";
donpcevent "#god_hopewarp1::OnReset";
stopnpctimer;
end;
}
-que_god01,169,82,0 script god_wep_warpmaster FAKE_NPC,{
-OnEnable:
- for(.@i = 1; .@i<=6; ++.@i)
- enablenpc "god_failwarp#"+.@i;
- end;
-OnDisable:
- for(.@i = 1; .@i<=6; ++.@i)
- disablenpc "god_failwarp#"+.@i;
- end;
-}
-
-que_god01,154,67,0 script god_failwarp#1 FAKE_NPC,4,7,{
-OnInit:
- disablenpc strnpcinfo(NPC_NAME);
- end;
-OnTouch:
- warp "prontera",156,324;
- end;
-}
-que_god01,154,82,0 duplicate(god_failwarp#1) god_failwarp#2 FAKE_NPC,4,7
-que_god01,145,99,0 duplicate(god_failwarp#1) god_failwarp#3 FAKE_NPC,9,9
-que_god01,164,99,0 duplicate(god_failwarp#1) god_failwarp#4 FAKE_NPC,9,9
-que_god01,145,118,0 duplicate(god_failwarp#1) god_failwarp#5 FAKE_NPC,9,9
-que_god01,164,118,0 duplicate(god_failwarp#1) god_failwarp#6 FAKE_NPC,9,9
-
// Original name: "Godly Item Quests Related#god"
que_god01,293,3,0 script Godly Item Quests#god 4_F_01,{
callfunc "F_GM_NPC";
@@ -864,24 +838,16 @@ que_god01,293,3,0 script Godly Item Quests#god 4_F_01,{
mes "[Use in case of emergency]";
mes "What services would you like to use?";
next;
- switch(select("Turn off Warps.", "Reset Timer.", "Reset chat room.")) {
+ switch(select("Reset Timer.", "Reset chat room.")) {
case 1:
mes "[Use in case of emergency]";
- mes "Press the 'Next' button to turn off warps.";
- next;
- donpcevent "god_wep_warpmaster::OnDisable";
- mes "[Use in case of emergency]";
- mes "You have successfully turned off warps.";
- close;
- case 2:
- mes "[Use in case of emergency]";
mes "Press the 'Next' button to reset timer.";
next;
donpcevent "Grunburti#god::OnEnable";
mes "[Use in case of emergency]";
mes "You have successfully reset timer.";
close;
- case 3:
+ case 2:
mes "[Use in case of emergency]";
mes "Please press the 'Next' button to reset the arena chat room in que_god01.";
next;
diff --git a/npc/quests/the_sign_quest.txt b/npc/quests/the_sign_quest.txt
index 5949c3558..d7db39dff 100644
--- a/npc/quests/the_sign_quest.txt
+++ b/npc/quests/the_sign_quest.txt
@@ -12317,34 +12317,18 @@ OnEnable:
end;
}
-que_sign01,196,44,0 script Warp#serin FAKE_NPC,35,35,{
-OnDisable:
-OnInit:
- disablenpc "Warp#serin";
- end;
-
-OnTouch:
- warp "niflheim",30,156;
- end;
-
-OnEnable:
- enablenpc "Warp#serin";
- end;
-}
-
que_sign01,1,0,0 script Timer#serin FAKE_NPC,{
OnStart:
initnpctimer;
end;
OnTimer600000:
- donpcevent "Warp#serin::OnEnable";
+ areawarp("que_sign01", 161, 9, 231, 79, "niflheim", 30, 156);
end;
OnTimer620000:
$@sign_w2 = 0;
donpcevent "Starter#serin::OnEnable";
- donpcevent "Warp#serin::OnDisable";
donpcevent "Serin#serin::OnEnable";
donpcevent "Dark Lord#serin::OnDisable";
donpcevent "Serin#dummy::OnDisable";
diff --git a/npc/scripts_mapflags.conf b/npc/scripts_mapflags.conf
index 084004244..74fb40610 100644
--- a/npc/scripts_mapflags.conf
+++ b/npc/scripts_mapflags.conf
@@ -58,3 +58,4 @@
"npc/mapflag/skillduration.txt",
"npc/mapflag/notomb.txt",
"npc/mapflag/private_airship.txt",
+"npc/mapflag/nopet.txt",
diff --git a/src/char/char.c b/src/char/char.c
index c61b6107a..b3de22c00 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -2535,19 +2535,39 @@ static void char_changesex(int account_id, int sex)
}
/**
- * Performs the necessary operations when changing a character's sex, such as
- * correcting the job class and unequipping items, and propagating the
- * information to the guild data.
+ * Performs the necessary operations when changing a character's gender,
+ * such as correcting the job class and unequipping items,
+ * and propagating the information to the guild data.
*
- * @param sex The new sex (SEX_MALE or SEX_FEMALE).
- * @param acc The character's account ID.
- * @param char_id The character ID.
- * @param class The character's current job class.
+ * @param sex The character's new gender (SEX_MALE or SEX_FEMALE).
+ * @param acc The character's account ID.
+ * @param char_id The character ID.
+ * @param class The character's current job class.
* @param guild_id The character's guild ID.
- */
+ *
+ **/
static void char_change_sex_sub(int sex, int acc, int char_id, int class, int guild_id)
{
- // job modification
+ struct SqlStmt *stmt = SQL->StmtMalloc(inter->sql_handle);
+
+ /** If we can't save the data, there's nothing to do. **/
+ if (stmt == NULL) {
+ SqlStmt_ShowDebug(stmt);
+ return;
+ }
+
+ const char *query_inv = "UPDATE `%s` SET `equip`='0' WHERE `char_id`=?";
+
+ /** Don't change gender if resetting the view data fails to prevent character from being unable to login. **/
+ if (SQL_ERROR == SQL->StmtPrepare(stmt, query_inv, inventory_db)
+ || SQL_ERROR == SQL->StmtBindParam(stmt, 0, SQLDT_INT32, &char_id, sizeof(char_id))
+ || SQL_ERROR == SQL->StmtExecute(stmt)) {
+ SqlStmt_ShowDebug(stmt);
+ SQL->StmtFree(stmt);
+ return;
+ }
+
+ /** Correct the job class for gender specific jobs according to the passed gender. **/
if (class == JOB_BARD || class == JOB_DANCER)
class = (sex == SEX_MALE ? JOB_BARD : JOB_DANCER);
else if (class == JOB_CLOWN || class == JOB_GYPSY)
@@ -2563,14 +2583,30 @@ static void char_change_sex_sub(int sex, int acc, int char_id, int class, int gu
else if (class == JOB_KAGEROU || class == JOB_OBORO)
class = (sex == SEX_MALE ? JOB_KAGEROU : JOB_OBORO);
- if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `equip`='0' WHERE `char_id`='%d'", inventory_db, char_id))
- Sql_ShowDebug(inter->sql_handle);
+#if PACKETVER >= 20141016
+ char gender = (sex == SEX_MALE) ? 'M' : ((sex == SEX_FEMALE) ? 'F' : 'U');
+#else
+ char gender = 'U';
+#endif
- if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `class`='%d', `weapon`='0', `shield`='0', "
- "`head_top`='0', `head_mid`='0', `head_bottom`='0' WHERE `char_id`='%d'",
- char_db, class, char_id))
- Sql_ShowDebug(inter->sql_handle);
- if (guild_id) // If there is a guild, update the guild_member data [Skotlex]
+ const char *query_char = "UPDATE `%s` SET `class`=?, `weapon`='0', `shield`='0', `head_top`='0', "
+ "`head_mid`='0', `head_bottom`='0', `robe`='0', `sex`=? WHERE `char_id`=?";
+
+ /** Don't update guild data if changing gender fails to prevent data de-synchronisation. **/
+ if (SQL_ERROR == SQL->StmtPrepare(stmt, query_char, char_db)
+ || SQL_ERROR == SQL->StmtBindParam(stmt, 0, SQLDT_INT32, &class, sizeof(class))
+ || SQL_ERROR == SQL->StmtBindParam(stmt, 1, SQLDT_ENUM, &gender, sizeof(gender))
+ || SQL_ERROR == SQL->StmtBindParam(stmt, 2, SQLDT_INT32, &char_id, sizeof(char_id))
+ || SQL_ERROR == SQL->StmtExecute(stmt)) {
+ SqlStmt_ShowDebug(stmt);
+ SQL->StmtFree(stmt);
+ return;
+ }
+
+ SQL->StmtFree(stmt);
+
+ /** Update guild member data if a guild ID was passed. **/
+ if (guild_id != 0)
inter_guild->sex_changed(guild_id, acc, char_id, sex);
}
@@ -3504,45 +3540,68 @@ static void char_ask_name_ack(int fd, int acc, const char *name, int type, int r
}
/**
- * Changes a character's sex.
- * The information is updated on database, and the character is kicked if it
- * currently is online.
+ * Changes a character's gender.
+ * The information is updated on database, and the character is kicked if it currently is online.
*
- * @param char_id The character's ID.
- * @param sex The new sex.
+ * @param char_id The character ID
+ * @param sex The character's new gender (SEX_MALE or SEX_FEMALE).
* @retval 0 in case of success.
* @retval 1 in case of failure.
- */
+ *
+ **/
static int char_changecharsex(int char_id, int sex)
{
- int class = 0, guild_id = 0, account_id = 0;
- char *data;
+ struct SqlStmt *stmt = SQL->StmtMalloc(inter->sql_handle);
- // get character data
- if (SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `account_id`,`class`,`guild_id` FROM `%s` WHERE `char_id` = '%d'", char_db, char_id)) {
- Sql_ShowDebug(inter->sql_handle);
+ /** If we can't load the data, there's nothing to do. **/
+ if (stmt == NULL) {
+ SqlStmt_ShowDebug(stmt);
return 1;
}
- if (SQL->NumRows(inter->sql_handle) != 1 || SQL_ERROR == SQL->NextRow(inter->sql_handle)) {
- SQL->FreeResult(inter->sql_handle);
+
+ const char *query = "SELECT `account_id`, `class`, `guild_id` FROM `%s` WHERE `char_id`=?";
+ int account_id = 0;
+ int class = 0;
+ int guild_id = 0;
+
+ /** Abort changing gender if there was an error while loading the data. **/
+ if (SQL_ERROR == SQL->StmtPrepare(stmt, query, char_db)
+ || SQL_ERROR == SQL->StmtBindParam(stmt, 0, SQLDT_INT32, &char_id, sizeof(char_id))
+ || SQL_ERROR == SQL->StmtExecute(stmt)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 0, SQLDT_INT32, &account_id, sizeof(account_id), NULL, NULL)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 1, SQLDT_INT32, &class, sizeof(class), NULL, NULL)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 2, SQLDT_INT32, &guild_id, sizeof(guild_id), NULL, NULL)) {
+ SqlStmt_ShowDebug(stmt);
+ SQL->StmtFree(stmt);
return 1;
}
- SQL->GetData(inter->sql_handle, 0, &data, NULL); account_id = atoi(data);
- SQL->GetData(inter->sql_handle, 1, &data, NULL); class = atoi(data);
- SQL->GetData(inter->sql_handle, 2, &data, NULL); guild_id = atoi(data);
- SQL->FreeResult(inter->sql_handle);
- if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `sex` = '%c' WHERE `char_id` = '%d'", char_db, sex == SEX_MALE ? 'M' : 'F', char_id)) {
- Sql_ShowDebug(inter->sql_handle);
+ /** Abort changing gender if no character was found. **/
+ if (SQL->StmtNumRows(stmt) < 1) {
+ ShowError("char_changecharsex: Requested non-existant character! (ID: %d)\n", char_id);
+ SQL->StmtFree(stmt);
return 1;
}
- char_change_sex_sub(sex, account_id, char_id, class, guild_id);
- // disconnect player if online on char-server
- chr->disconnect_player(account_id);
+ /** Abort changing gender if more than one character was found. **/
+ if (SQL->StmtNumRows(stmt) > 1) {
+ ShowError("char_changecharsex: There are multiple characters with identical ID! (ID: %d)\n", char_id);
+ SQL->StmtFree(stmt);
+ return 1;
+ }
+
+ /** Abort changing gender if fetching the data fails. **/
+ if (SQL_ERROR == SQL->StmtNextRow(stmt)) {
+ SqlStmt_ShowDebug(stmt);
+ SQL->StmtFree(stmt);
+ return 1;
+ }
+
+ SQL->StmtFree(stmt);
+ char_change_sex_sub(sex, account_id, char_id, class, guild_id);
+ chr->disconnect_player(account_id); // Disconnect player if online on char-server.
+ chr->changesex(account_id, sex); // Notify all mapservers about this change.
- // notify all mapservers about this change
- chr->changesex(account_id, sex);
return 0;
}
diff --git a/src/common/packets/packets2020_len_main.h b/src/common/packets/packets2020_len_main.h
index 4b7273775..215f59727 100644
--- a/src/common/packets/packets2020_len_main.h
+++ b/src/common/packets/packets2020_len_main.h
@@ -4675,5 +4675,35 @@ packetLen(0x0b79, -1)
packetLen(0x0b7a, -1)
#endif
+// Packet: 0x0b7b
+#if PACKETVER >= 20200701
+packetLen(0x0b7b, 118)
+#endif
+
+// Packet: 0x0b7c
+#if PACKETVER >= 20200701
+packetLen(0x0b7c, -1)
+#endif
+
+// Packet: 0x0b7d
+#if PACKETVER >= 20200701
+packetLen(0x0b7d, -1)
+#endif
+
+// Packet: 0x0b7e
+#if PACKETVER >= 20200701
+packetLen(0x0b7e, 60)
+#endif
+
+// Packet: 0x0b7f
+#if PACKETVER >= 20200701
+packetLen(0x0b7f, 10)
+#endif
+
+// Packet: 0x0b80
+#if PACKETVER >= 20200701
+packetLen(0x0b80, 10)
+#endif
+
#endif /* COMMON_PACKETS2020_LEN_MAIN_H */
diff --git a/src/common/packets/packets2020_len_re.h b/src/common/packets/packets2020_len_re.h
index 2c21b1c67..7296d86c5 100644
--- a/src/common/packets/packets2020_len_re.h
+++ b/src/common/packets/packets2020_len_re.h
@@ -4623,7 +4623,9 @@ packetLen(0x0b6f, 177)
#endif
// Packet: 0x0b70
-#if PACKETVER >= 20200122
+#if PACKETVER >= 20200709
+packetLen(0x0b70, -1)
+#elif PACKETVER >= 20200122
packetLen(0x0b70, 8)
#endif
@@ -4633,7 +4635,9 @@ packetLen(0x0b71, 177)
#endif
// Packet: 0x0b72
-#if PACKETVER >= 20200122
+#if PACKETVER >= 20200709
+packetLen(0x0b72, -1)
+#elif PACKETVER >= 20200122
packetLen(0x0b72, 4)
#endif
@@ -4652,5 +4656,60 @@ packetLen(0x0b74, 1026)
packetLen(0x0b75, 1026)
#endif
+// Packet: 0x0b76
+#if PACKETVER >= 20200709
+packetLen(0x0b76, 77)
+#endif
+
+// Packet: 0x0b77
+#if PACKETVER >= 20200709
+packetLen(0x0b77, -1)
+#endif
+
+// Packet: 0x0b78
+#if PACKETVER >= 20200709
+packetLen(0x0b78, -1)
+#endif
+
+// Packet: 0x0b79
+#if PACKETVER >= 20200709
+packetLen(0x0b79, -1)
+#endif
+
+// Packet: 0x0b7a
+#if PACKETVER >= 20200709
+packetLen(0x0b7a, -1)
+#endif
+
+// Packet: 0x0b7b
+#if PACKETVER >= 20200709
+packetLen(0x0b7b, 118)
+#endif
+
+// Packet: 0x0b7c
+#if PACKETVER >= 20200709
+packetLen(0x0b7c, -1)
+#endif
+
+// Packet: 0x0b7d
+#if PACKETVER >= 20200709
+packetLen(0x0b7d, -1)
+#endif
+
+// Packet: 0x0b7e
+#if PACKETVER >= 20200709
+packetLen(0x0b7e, 60)
+#endif
+
+// Packet: 0x0b7f
+#if PACKETVER >= 20200709
+packetLen(0x0b7f, 10)
+#endif
+
+// Packet: 0x0b80
+#if PACKETVER >= 20200709
+packetLen(0x0b80, 10)
+#endif
+
#endif /* COMMON_PACKETS2020_LEN_RE_H */
diff --git a/src/common/packets/packets2020_len_zero.h b/src/common/packets/packets2020_len_zero.h
index 2aa2ccc96..cba80e90c 100644
--- a/src/common/packets/packets2020_len_zero.h
+++ b/src/common/packets/packets2020_len_zero.h
@@ -4675,5 +4675,35 @@ packetLen(0x0b79, -1)
packetLen(0x0b7a, -1)
#endif
+// Packet: 0x0b7b
+#if PACKETVER >= 20200701
+packetLen(0x0b7b, 118)
+#endif
+
+// Packet: 0x0b7c
+#if PACKETVER >= 20200701
+packetLen(0x0b7c, -1)
+#endif
+
+// Packet: 0x0b7d
+#if PACKETVER >= 20200701
+packetLen(0x0b7d, -1)
+#endif
+
+// Packet: 0x0b7e
+#if PACKETVER >= 20200701
+packetLen(0x0b7e, 60)
+#endif
+
+// Packet: 0x0b7f
+#if PACKETVER >= 20200701
+packetLen(0x0b7f, 10)
+#endif
+
+// Packet: 0x0b80
+#if PACKETVER >= 20200701
+packetLen(0x0b80, 10)
+#endif
+
#endif /* COMMON_PACKETS2020_LEN_ZERO_H */
diff --git a/src/config/secure.h b/src/config/secure.h
index fd05b4a49..bcd4e022b 100644
--- a/src/config/secure.h
+++ b/src/config/secure.h
@@ -60,7 +60,7 @@
* (Secure) Optional NPC Dialog Timer
* @requirement : SECURE_NPCTIMEOUT must be enabled
* Minimum Interval Between timeout checks in seconds
- * Default: 1s
+ * Default: 1
**/
#define SECURE_NPCTIMEOUT_INTERVAL 1
diff --git a/src/login/login.c b/src/login/login.c
index 623457b8a..32c935d75 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -1758,7 +1758,7 @@ static bool login_config_read_permission_hash(const char *filename, struct confi
static void login_clear_dnsbl_servers(void)
{
while (VECTOR_LENGTH(login->config->dnsbl_servers) > 0) {
- aFree(&VECTOR_POP(login->config->dnsbl_servers));
+ aFree(VECTOR_POP(login->config->dnsbl_servers));
}
VECTOR_CLEAR(login->config->dnsbl_servers);
}
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 9d5c601bf..9fb2540ef 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -1168,17 +1168,17 @@ ACMD(item)
memset(item_name, '\0', sizeof(item_name));
- if (!strcmpi(info->command,"itembound") && (!*message || (
- sscanf(message, "\"%99[^\"]\" %12d %12d", item_name, &number, &bound) < 2 &&
- sscanf(message, "%99s %12d %12d", item_name, &number, &bound) < 2
- ))) {
- clif->message(fd, msg_fd(fd,295)); // Please enter an item name or ID (usage: @itembound <item name/ID> <quantity> <bound_type>).
+ if (!strcmpi(info->command, "itembound") && (!*message || (
+ sscanf(message, "\"%99[^\"]\" %12d %12d", item_name, &number, &bound) < 1 &&
+ sscanf(message, "%99s %12d %12d", item_name, &number, &bound) < 1
+ ))) {
+ clif->message(fd, msg_fd(fd, 295)); // Please enter an item name or ID (usage: @itembound <item name/ID> <quantity> <bound_type>).
return false;
} else if (!*message
- || ( sscanf(message, "\"%99[^\"]\" %12d", item_name, &number) < 1
- && sscanf(message, "%99s %12d", item_name, &number) < 1
- )) {
- clif->message(fd, msg_fd(fd,983)); // Please enter an item name or ID (usage: @item <item name/ID> <quantity>).
+ || (sscanf(message, "\"%99[^\"]\" %12d", item_name, &number) < 1
+ && sscanf(message, "%99s %12d", item_name, &number) < 1
+ )) {
+ clif->message(fd, msg_fd(fd, 983)); // Please enter an item name or ID (usage: @item <item name/ID> <quantity>).
return false;
}
@@ -1186,33 +1186,33 @@ ACMD(item)
number = 1;
if ((item_data = itemdb->search_name(item_name)) == NULL &&
- (item_data = itemdb->exists(atoi(item_name))) == NULL)
+ (item_data = itemdb->exists(atoi(item_name))) == NULL)
{
- clif->message(fd, msg_fd(fd,19)); // Invalid item ID or name.
+ clif->message(fd, msg_fd(fd, 19)); // Invalid item ID or name.
return false;
}
- if(!strcmpi(info->command,"itembound") ) {
- if( !(bound >= IBT_MIN && bound <= IBT_MAX) ) {
- clif->message(fd, msg_fd(fd,298)); // Invalid bound type
+ if (!strcmpi(info->command, "itembound")) {
+ if (!(bound >= IBT_MIN && bound <= IBT_MAX)) {
+ clif->message(fd, msg_fd(fd, 298)); // Invalid bound type
return false;
}
- switch( (enum e_item_bound_type)bound ) {
- case IBT_CHARACTER:
- case IBT_ACCOUNT:
- break; /* no restrictions */
- case IBT_PARTY:
- if( !sd->status.party_id ) {
- clif->message(fd, msg_fd(fd,1498)); //You can't add a party bound item to a character without party!
- return false;
- }
- break;
- case IBT_GUILD:
- if( !sd->status.guild_id ) {
- clif->message(fd, msg_fd(fd,1499)); //You can't add a guild bound item to a character without guild!
- return false;
- }
- break;
+ switch ((enum e_item_bound_type)bound) {
+ case IBT_CHARACTER:
+ case IBT_ACCOUNT:
+ break; /* no restrictions */
+ case IBT_PARTY:
+ if (!sd->status.party_id) {
+ clif->message(fd, msg_fd(fd, 1498)); //You can't add a party bound item to a character without party!
+ return false;
+ }
+ break;
+ case IBT_GUILD:
+ if (!sd->status.guild_id) {
+ clif->message(fd, msg_fd(fd, 1499)); //You can't add a guild bound item to a character without guild!
+ return false;
+ }
+ break;
}
}
@@ -1220,8 +1220,8 @@ ACMD(item)
get_count = number;
//Check if it's stackable.
if (!itemdb->isstackable2(item_data)) {
- if( bound && (item_data->type == IT_PETEGG || item_data->type == IT_PETARMOR) ) {
- clif->message(fd, msg_fd(fd,498)); // Cannot create bounded pet eggs or pet armors.
+ if (bound && (item_data->type == IT_PETEGG || item_data->type == IT_PETARMOR)) {
+ clif->message(fd, msg_fd(fd, 498)); // Cannot create bounded pet eggs or pet armors.
return false;
}
get_count = 1;
@@ -1241,7 +1241,7 @@ ACMD(item)
}
if (flag == 0)
- clif->message(fd, msg_fd(fd,18)); // Item created.
+ clif->message(fd, msg_fd(fd, 18)); // Item created.
return true;
}
@@ -1254,37 +1254,37 @@ ACMD(item2)
struct item_data *item_data;
char item_name[100];
int item_id, number = 0, bound = 0;
- int identify = 0, refine_level = 0, attr = 0;
+ int identify = 1, refine_level = 0, attr = ATTR_NONE;
int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
memset(item_name, '\0', sizeof(item_name));
- if (!strcmpi(info->command,"itembound2") && (!*message || (
+ if (!strcmpi(info->command, "itembound2") && (!*message || (
sscanf(message, "\"%99[^\"]\" %12d %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4, &bound) < 10 &&
- sscanf(message, "%99s %12d %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4, &bound) < 10 ))) {
- clif->message(fd, msg_fd(fd,296)); // Please enter all parameters (usage: @itembound2 <item name/ID> <quantity>
- clif->message(fd, msg_fd(fd,297)); // <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4> <bound_type>).
+ sscanf(message, "%99s %12d %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4, &bound) < 10))) {
+ clif->message(fd, msg_fd(fd, 296)); // Please enter all parameters (usage: @itembound2 <item name/ID> <quantity>
+ clif->message(fd, msg_fd(fd, 297)); // <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4> <bound_type>).
return false;
} else if (!*message
- || ( sscanf(message, "\"%99[^\"]\" %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4) < 9
- && sscanf(message, "%99s %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4) < 9
- )) {
- clif->message(fd, msg_fd(fd,984)); // Please enter all parameters (usage: @item2 <item name/ID> <quantity>
- clif->message(fd, msg_fd(fd,985)); // <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4>).
+ || (sscanf(message, "\"%99[^\"]\" %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4) < 1
+ && sscanf(message, "%99s %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine_level, &attr, &c1, &c2, &c3, &c4) < 1
+ )) {
+ clif->message(fd, msg_fd(fd, 984)); // Please enter all parameters (usage: @item2 <item name/ID> <quantity>
+ clif->message(fd, msg_fd(fd, 985)); // <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4>).
return false;
}
if (number <= 0)
number = 1;
- if( !strcmpi(info->command,"itembound2") && !(bound >= IBT_MIN && bound <= IBT_MAX) ) {
- clif->message(fd, msg_fd(fd,298)); // Invalid bound type
+ if (!strcmpi(info->command, "itembound2") && !(bound >= IBT_MIN && bound <= IBT_MAX)) {
+ clif->message(fd, msg_fd(fd, 298)); // Invalid bound type
return false;
}
item_id = 0;
if ((item_data = itemdb->search_name(item_name)) != NULL ||
- (item_data = itemdb->exists(atoi(item_name))) != NULL)
+ (item_data = itemdb->exists(atoi(item_name))) != NULL)
item_id = item_data->nameid;
if (item_id > 500) {
@@ -1292,11 +1292,11 @@ ACMD(item2)
int loop, get_count, i;
loop = 1;
get_count = number;
- if( !strcmpi(info->command,"itembound2") )
- bound = 1;
- if( !itemdb->isstackable2(item_data) ) {
- if( bound && (item_data->type == IT_PETEGG || item_data->type == IT_PETARMOR) ) {
- clif->message(fd, msg_fd(fd,498)); // Cannot create bounded pet eggs or pet armors.
+ if (!strcmpi(info->command, "itembound2"))
+ bound = IBT_ACCOUNT;
+ if (!itemdb->isstackable2(item_data)) {
+ if (bound && (item_data->type == IT_PETEGG || item_data->type == IT_PETARMOR)) {
+ clif->message(fd, msg_fd(fd, 498)); // Cannot create bounded pet eggs or pet armors.
return false;
}
loop = number;
@@ -1309,7 +1309,8 @@ ACMD(item2)
refine_level = 0;
} else {
identify = 1;
- refine_level = attr = 0;
+ refine_level = 0;
+ attr = ATTR_NONE;
}
refine_level = cap_value(refine_level, 0, MAX_REFINE);
for (i = 0; i < loop; i++) {
@@ -1329,9 +1330,9 @@ ACMD(item2)
}
if (flag == 0)
- clif->message(fd, msg_fd(fd,18)); // Item created.
+ clif->message(fd, msg_fd(fd, 18)); // Item created.
} else {
- clif->message(fd, msg_fd(fd,19)); // Invalid item ID or name.
+ clif->message(fd, msg_fd(fd, 19)); // Invalid item ID or name.
return false;
}
@@ -4101,6 +4102,8 @@ ACMD(mapinfo)
strcat(atcmd_output, msg_fd(fd, 1292)); // PrivateAirshipStartable |
if (map->list[m_id].flag.pairship_endable)
strcat(atcmd_output, msg_fd(fd, 1293)); // PrivateAirshipEndable |
+ if (map->list[m_id].flag.nopet != 0)
+ strcat(atcmd_output, msg_fd(fd, 853)); // NoPet |
clif->message(fd, atcmd_output);
switch (list) {
diff --git a/src/map/battle.c b/src/map/battle.c
index a0140d32b..72c3d8963 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -7139,7 +7139,6 @@ static const struct battle_data {
{ "pet_max_stats", &battle_config.pet_max_stats, 99, 0, INT_MAX, },
{ "pet_max_atk1", &battle_config.pet_max_atk1, 750, 0, INT_MAX, },
{ "pet_max_atk2", &battle_config.pet_max_atk2, 1000, 0, INT_MAX, },
- { "pet_disable_in_gvg", &battle_config.pet_no_gvg, 0, 0, 1, },
{ "pet_remove_immediately", &battle_config.pet_remove_immediately, 1, 0, 1, },
{ "skill_min_damage", &battle_config.skill_min_damage, 2|4, 0, 1|2|4, },
{ "finger_offensive_type", &battle_config.finger_offensive_type, 0, 0, 1, },
diff --git a/src/map/battle.h b/src/map/battle.h
index f4ad9c556..abf4c0f68 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -228,7 +228,6 @@ struct Battle_Config {
int pet_max_stats; //[Skotlex]
int pet_max_atk1; //[Skotlex]
int pet_max_atk2; //[Skotlex]
- int pet_no_gvg; //Disables pets in gvg. [Skotlex]
int pet_equip_required;
int pet_remove_immediately;
diff --git a/src/map/clif.c b/src/map/clif.c
index fd84961d9..f44d9a716 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -7661,8 +7661,8 @@ static void clif_sendegg(struct map_session_data *sd)
nullpo_retv(sd);
fd = sd->fd;
- if (battle_config.pet_no_gvg && map_flag_gvg2(sd->bl.m)) { //Disable pet hatching in GvG grounds during Guild Wars [Skotlex]
- clif->message(fd, msg_sd(sd, 866)); // "Pets are not allowed in Guild Wars."
+ if (map->list[sd->bl.m].flag.nopet != 0) {
+ clif->message(fd, msg_sd(sd, 866)); // "Pets are disabled in this map."
return;
}
@@ -10982,8 +10982,8 @@ static void clif_parse_LoadEndAck(int fd, struct map_session_data *sd)
// Spawn pet.
if (sd->pd != NULL) {
- if (battle_config.pet_no_gvg != 0 && map_flag_gvg2(sd->bl.m)) { // Return the pet to egg. [Skotlex]
- clif->message(sd->fd, msg_sd(sd, 866)); // "Pets are not allowed in Guild Wars."
+ if (map->list[sd->bl.m].flag.nopet != 0) { // Return the pet to egg. [Skotlex]
+ clif->message(sd->fd, msg_sd(sd, 866)); // Pets are not allowed in Guild Wars.
pet->menu(sd, 3); // Option 3 is return to egg.
} else {
pet->spawn(sd, false);
diff --git a/src/map/map.c b/src/map/map.c
index 221d60fa4..c88118b43 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -5469,6 +5469,19 @@ static bool map_zone_mf_cache(int m, char *flag, char *params)
map_zone_mf_cache_add(m, rflag);
}
}
+ } else if (strcmpi(flag, "nopet") == 0) {
+ if (state == 0) {
+ if (map->list[m].flag.nopet != 0) {
+ sprintf(rflag, "nopet\t%d", map->list[m].flag.nopet);
+ map_zone_mf_cache_add(m, rflag);
+ }
+ }
+ if (sscanf(params, "%d", &state) == 1) {
+ if (state != map->list[m].flag.nopet) {
+ sprintf(rflag, "nopet\t%d", state);
+ map_zone_mf_cache_add(m, rflag);
+ }
+ }
}
return false;
diff --git a/src/map/map.h b/src/map/map.h
index 9f17ae439..30e73960c 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -800,6 +800,7 @@ struct map_data {
unsigned pairship_endable : 1;
unsigned nostorage : 2;
unsigned nogstorage : 2;
+ unsigned nopet : 1;
uint32 noviewid; ///< noviewid (bitmask - @see enum equip_pos)
} flag;
struct point save;
diff --git a/src/map/messages_main.h b/src/map/messages_main.h
index 5c6758dbf..7dc0ff2b6 100644
--- a/src/map/messages_main.h
+++ b/src/map/messages_main.h
@@ -24,7 +24,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20200617
+Latest version: 20200701
*/
enum clif_messages {
@@ -22646,6 +22646,16 @@ DEATH: %.1f%% (basic: 100.0%%, %s: %.1f%%)
*/
MSG_ID_EEA = 0xeea,
#endif
+#if PACKETVER >= 20200701
+/*20200701 to latest
+채팅차단해제(수신거부해제)
+*/
+ MSG_ID_EEB = 0xeeb,
+/*20200701 to latest
+채팅차단(수신거부)
+*/
+ MSG_ID_EEC = 0xeec,
+#endif
};
#endif /* MAP_MESSAGES_MAIN_H */
diff --git a/src/map/messages_re.h b/src/map/messages_re.h
index e32f6b275..aa05a2e56 100644
--- a/src/map/messages_re.h
+++ b/src/map/messages_re.h
@@ -24,7 +24,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20200304
+Latest version: 20200709
*/
enum clif_messages {
@@ -13342,12 +13342,14 @@ Ghost %d
Shadow %d
*/
MSG_NAVIGATION_PROPERTY8 = 0x8de,
-/*20120417 to latest
+/*20120417 to 20200304
언데드%d
Undead %d
20130807 to 20130814
염속성%d
Ghost %d
+20200709 to latest
+불사%d
*/
MSG_NAVIGATION_PROPERTY9 = 0x8df,
/*20120417 to latest
@@ -22089,6 +22091,44 @@ DEATH: %.1f%% (basic: 100.0%%, %s: %.1f%%)
*/
MSG_ID_EE3 = 0xee3,
#endif
+#if PACKETVER >= 20200709
+/*20200709 to latest
+특성 마법 공격력이 증가되었습니다.
+*/
+ MSG_ID_EE4 = 0xee4,
+/*20200709 to latest
+스펠 인챈팅 효과가 해제되었습니다.
+*/
+ MSG_ID_EE5 = 0xee5,
+/*20200709 to latest
+프롬 디 어비스 효과가 해제되었습니다.
+*/
+ MSG_ID_EE6 = 0xee6,
+/*20200709 to latest
+특성 물리 공격력, 특성 마법 공격력 및 명중률이 증가되었습니다.
+*/
+ MSG_ID_EE7 = 0xee7,
+/*20200709 to latest
+어비스 슬레이어 효과가 해제되었습니다.
+*/
+ MSG_ID_EE8 = 0xee8,
+/*20200709 to latest
+캐릭터 생성에 제한이 있을 수 있습니다.
+*/
+ MSG_ID_EE9 = 0xee9,
+/*20200709 to latest
+월드가 포화상태입니다. 다른 월드를 이용해 주세요.
+*/
+ MSG_ID_EEA = 0xeea,
+/*20200709 to latest
+채팅차단해제(수신거부해제)
+*/
+ MSG_ID_EEB = 0xeeb,
+/*20200709 to latest
+채팅차단(수신거부)
+*/
+ MSG_ID_EEC = 0xeec,
+#endif
};
#endif /* MAP_MESSAGES_RE_H */
diff --git a/src/map/messages_zero.h b/src/map/messages_zero.h
index 732d39cea..7eca56cd9 100644
--- a/src/map/messages_zero.h
+++ b/src/map/messages_zero.h
@@ -24,7 +24,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20200617
+Latest version: 20200701
*/
enum clif_messages {
@@ -18735,6 +18735,16 @@ DEATH: %.1f%% (basic: 100.0%%, %s: %.1f%%)
*/
MSG_ID_EEA = 0xeea,
#endif
+#if PACKETVER >= 20200701
+/*20200701 to latest
+채팅차단해제(수신거부해제)
+*/
+ MSG_ID_EEB = 0xeeb,
+/*20200701 to latest
+채팅차단(수신거부)
+*/
+ MSG_ID_EEC = 0xeec,
+#endif
};
#endif /* MAP_MESSAGES_ZERO_H */
diff --git a/src/map/npc.c b/src/map/npc.c
index 055c1843b..7a3fa9c3f 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -2715,43 +2715,47 @@ static int npc_selllist_sub(struct map_session_data *sd, struct itemlist *item_l
char card_slot[NAME_LENGTH];
char opt_index_str[NAME_LENGTH];
char opt_value_str[NAME_LENGTH];
- int i, j;
+ char opt_param_str[NAME_LENGTH];
+ int i = 0;
+ int j = 0;
int key_nameid = 0;
int key_amount = 0;
int key_refine = 0;
- int key_attribute = 0;
+ int key_attribute = ATTR_NONE;
int key_identify = 0;
int key_card[MAX_SLOTS];
int key_opt_idx[MAX_ITEM_OPTIONS];
int key_opt_value[MAX_ITEM_OPTIONS];
+ int key_opt_param[MAX_ITEM_OPTIONS];
nullpo_ret(sd);
nullpo_ret(item_list);
nullpo_ret(nd);
// discard old contents
- script->cleararray_pc(sd, "@sold_nameid", (void*)0);
- script->cleararray_pc(sd, "@sold_quantity", (void*)0);
- script->cleararray_pc(sd, "@sold_refine", (void*)0);
- script->cleararray_pc(sd, "@sold_attribute", (void*)0);
- script->cleararray_pc(sd, "@sold_identify", (void*)0);
-
- for( j = 0; j < MAX_SLOTS; j++ )
- {// clear each of the card slot entries
+ script->cleararray_pc(sd, "@sold_nameid", (void *)0);
+ script->cleararray_pc(sd, "@sold_quantity", (void *)0);
+ script->cleararray_pc(sd, "@sold_refine", (void *)0);
+ script->cleararray_pc(sd, "@sold_attribute", (void *)0);
+ script->cleararray_pc(sd, "@sold_identify", (void *)0);
+
+ for (j = 0; j < MAX_SLOTS; j++) { // clear each of the card slot entries
key_card[j] = 0;
snprintf(card_slot, sizeof(card_slot), "@sold_card%d", j + 1);
- script->cleararray_pc(sd, card_slot, (void*)0);
+ script->cleararray_pc(sd, card_slot, (void *)0);
}
for (j = 0; j < MAX_ITEM_OPTIONS; j++) { // Clear Each item option entry
key_opt_idx[j] = 0;
key_opt_value[j] = 0;
+ key_opt_param[j] = 0;
- snprintf(opt_index_str, sizeof(opt_index_str), "@slot_opt_idx%d", j + 1);
- script->cleararray_pc(sd, opt_index_str, (void*)0);
-
- snprintf(opt_value_str, sizeof(opt_value_str), "@slot_opt_val%d", j + 1);
- script->cleararray_pc(sd, opt_value_str, (void*)0);
+ snprintf(opt_index_str, sizeof(opt_index_str), "@sold_opt_idx%d", j + 1);
+ script->cleararray_pc(sd, opt_index_str, (void *)0);
+ snprintf(opt_value_str, sizeof(opt_value_str), "@sold_opt_val%d", j + 1);
+ script->cleararray_pc(sd, opt_value_str, (void *)0);
+ snprintf(opt_param_str, sizeof(opt_param_str), "@sold_opt_param%d", j + 1);
+ script->cleararray_pc(sd, opt_param_str, (void *)0);
}
// save list of to be sold items
@@ -2764,32 +2768,31 @@ static int npc_selllist_sub(struct map_session_data *sd, struct itemlist *item_l
intptr_t attribute = item->attribute;
intptr_t identify = item->identify;
- script->setarray_pc(sd, "@sold_nameid", i, (void*)nameid, &key_nameid);
- script->setarray_pc(sd, "@sold_quantity", i, (void*)amount, &key_amount);
-
// process item based information into the arrays
- script->setarray_pc(sd, "@sold_refine", i, (void*)refine, &key_refine);
- script->setarray_pc(sd, "@sold_attribute", i, (void*)attribute, &key_attribute);
- script->setarray_pc(sd, "@sold_identify", i, (void*)identify, &key_identify);
+ script->setarray_pc(sd, "@sold_nameid", i, (void *)nameid, &key_nameid);
+ script->setarray_pc(sd, "@sold_quantity", i, (void *)amount, &key_amount);
+ script->setarray_pc(sd, "@sold_refine", i, (void *)refine, &key_refine);
+ script->setarray_pc(sd, "@sold_attribute", i, (void *)attribute, &key_attribute);
+ script->setarray_pc(sd, "@sold_identify", i, (void *)identify, &key_identify);
for (j = 0; j < MAX_SLOTS; j++) {
intptr_t card = item->card[j];
- // store each of the cards/special info from the item in the array
snprintf(card_slot, sizeof(card_slot), "@sold_card%d", j + 1);
- script->setarray_pc(sd, card_slot, i, (void*)card, &key_card[j]);
+ script->setarray_pc(sd, card_slot, i, (void *)card, &key_card[j]);
}
for (j = 0; j < MAX_ITEM_OPTIONS; j++) {
intptr_t opt_idx = item->option[j].index;
intptr_t opt_value = item->option[j].value;
+ intptr_t opt_param = item->option[j].param;
- snprintf(opt_index_str, sizeof(opt_index_str), "@slot_opt_idx%d", j + 1);
- script->setarray_pc(sd, opt_index_str, i, (void*)opt_idx, &key_opt_idx[j]);
-
- snprintf(opt_value_str, sizeof(opt_value_str), "@slot_opt_val%d", j + 1);
- script->setarray_pc(sd, opt_value_str, i, (void*)opt_value, &key_opt_value[j]);
+ snprintf(opt_index_str, sizeof(opt_index_str), "@sold_opt_idx%d", j + 1);
+ script->setarray_pc(sd, opt_index_str, i, (void *)opt_idx, &key_opt_idx[j]);
+ snprintf(opt_value_str, sizeof(opt_value_str), "@sold_opt_val%d", j + 1);
+ script->setarray_pc(sd, opt_value_str, i, (void *)opt_value, &key_opt_value[j]);
+ snprintf(opt_param_str, sizeof(opt_param_str), "@sold_opt_param%d", j + 1);
+ script->setarray_pc(sd, opt_param_str, i, (void *)opt_param, &key_opt_param[j]);
}
-
}
// invoke event
@@ -5239,6 +5242,8 @@ static const char *npc_parse_mapflag(const char *w1, const char *w2, const char
map->list[m].flag.nostorage = (state) ? cap_value(atoi(w4), 1, 3) : 0;
} else if (!strcmpi(w3, "nogstorage")) {
map->list[m].flag.nogstorage = (state) ? cap_value(atoi(w4), 1, 3) : 0;
+ } else if (strcmpi(w3, "nopet") == 0) {
+ map->list[m].flag.nopet = (state != 0) ? 1 : 0;
} else {
npc->parse_unknown_mapflag(mapname, w3, w4, start, buffer, filepath, retval);
}
diff --git a/src/map/packets_keys_main.h b/src/map/packets_keys_main.h
index a47b89299..ef8d39fb7 100644
--- a/src/map/packets_keys_main.h
+++ b/src/map/packets_keys_main.h
@@ -37,7 +37,7 @@
packetKeys(0x49357d72,0x22c370a1,0x5f836591);
#endif
-// 2010-11-23aRagexeRE, 2010-11-24aRagexeRE, 2010-11-24bRagexeRE, 2010-11-25aRagexeRE, 2010-11-26aRagexeRE, 2010-11-30aRagexeRE, 2010-12-07aRagexeRE, 2010-12-14aRagexeRE, 2010-12-21aRagexeRE, 2010-12-23aRagexeRE, 2010-12-28aRagexeRE, 2011-01-04aRagexeRE, 2011-01-05aRagexeRE, 2011-01-11aRagexeRE, 2011-01-18aRagexeRE, 2011-01-25aRagexeRE, 2011-01-26aRagexeRE, 2011-01-26bRagexeRE, 2011-01-31aRagexeRE, 2011-01-31bRagexeRE, 2011-01-31cRagexeRE, 2011-02-08aRagexeRE, 2011-02-15aRagexeRE, 2011-02-22aRagexeRE, 2011-02-23aRagexeRE, 2011-02-23bRagexeRE, 2011-02-24aRagexeRE, 2011-02-25aRagexeRE, 2011-02-28aRagexeRE, 2011-03-08aRagexeRE, 2011-03-09aRagexeRE, 2011-03-09bRagexeRE, 2011-03-09cRagexeRE, 2011-03-09dRagexeRE, 2011-03-15aRagexeRE, 2011-03-22aRagexeRE, 2011-03-29aRagexeRE, 2011-03-30aRagexeRE, 2011-03-30cRagexeRE, 2011-04-05aRagexeRE, 2011-04-12aRagexeRE, 2011-04-19aRagexeRE, 2011-04-20aRagexeRE, 2011-04-26aRagexeRE, 2011-04-27aRagexeRE, 2011-05-03aRagexeRE, 2011-05-11aRagexeRE, 2011-05-17bRagexeRE, 2011-05-24aRagexeRE, 2011-05-26aRagexeRE, 2011-05-31aRagexeRE, 2011-06-07aRagexeRE, 2011-06-08aRagexeRE, 2011-06-08bRagexeRE, 2011-06-08cRagexeRE, 2011-06-09aRagexeRE, 2011-06-14bRagexeRE, 2011-06-22aRagexeRE, 2011-06-28aRagexeRE, 2011-07-06aRagexeRE, 2011-07-13aRagexeRE, 2011-07-13bRagexeRE, 2011-07-13cRagexeRE, 2011-07-19aRagexeRE, 2011-07-26aRagexeRE, 2011-08-03aRagexeRE, 2011-08-03bRagexeRE, 2011-08-10aRagexeRE, 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE, 2018-04-04bRagexe, 2018-04-04cRagexeRE, 2018-04-18aRagexe, 2018-04-18bRagexeRE, 2018-04-25cRagexe, 2018-04-25cRagexeRE, 2018-05-02bRagexe, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-16cRagexeRE, 2018-05-23aRagexe, 2018-05-23aRagexeRE, 2018-05-30aRagexe, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexe, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20cRagexe, 2018-06-20dRagexeRE, 2018-06-20eRagexe, 2018-06-20eRagexeRE, 2018-06-21aRagexe, 2018-06-21aRagexeRE, 2018-07-04aRagexe, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexe, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexe, 2018-07-18cRagexeRE, 2018-08-01cRagexe, 2018-08-01cRagexeRE, 2018-08-08bRagexe, 2018-08-08bRagexeRE, 2018-08-22cRagexe, 2018-08-22cRagexeRE, 2018-08-29aRagexe, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-12dRagexeRE, 2018-09-19aRagexe, 2018-09-19aRagexeRE, 2018-10-02aRagexe, 2018-10-02aRagexeRE, 2018-10-02bRagexe, 2018-10-02bRagexeRE, 2018-10-17_02aRagexe, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexe, 2018-10-17_03aRagexeRE, 2018-10-17bRagexe, 2018-10-17bRagexeRE, 2018-10-24bRagexe, 2018-10-31aRagexe, 2018-10-31bRagexe, 2018-10-31cRagexeRE, 2018-11-07aRagexe, 2018-11-07aRagexeRE, 2018-11-14cRagexe, 2018-11-14cRagexeRE, 2018-11-14dRagexe, 2018-11-14dRagexeRE, 2018-11-21bRagexe, 2018-11-21cRagexeRE, 2018-11-28aRagexe, 2018-11-28aRagexeRE, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-05bRagexeRE, 2018-12-12aRagexe, 2018-12-12aRagexeRE, 2018-12-12bRagexe, 2018-12-12bRagexeRE, 2018-12-19bRagexe, 2018-12-19bRagexeRE, 2018-12-26aRagexe, 2018-12-26aRagexeRE, 2019-01-09aRagexe, 2019-01-09bRagexeRE, 2019-01-16bRagexe, 2019-01-16bRagexeRE, 2019-01-16cRagexe, 2019-01-16cRagexeRE, 2019-01-23dRagexe, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-20aRagexeRE, 2019-02-27aRagexe, 2019-02-27bRagexeRE, 2019-02-28aRagexe, 2019-02-28aRagexeRE, 2019-03-06bRagexe, 2019-03-06bRagexeRE, 2019-03-06cRagexe, 2019-03-06cRagexeRE, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-20aRagexeRE, 2019-03-22aRagexe, 2019-03-22aRagexeRE, 2019-03-27bRagexe, 2019-03-27bRagexeRE, 2019-04-03aRagexe, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17aRagexe, 2019-04-17cRagexeRE, 2019-04-18aRagexe, 2019-04-18aRagexeRE, 2019-05-08cRagexe, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexe, 2019-05-22bRagexeRE, 2019-05-22cRagexe, 2019-05-22cRagexeRE, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29bRagexeRE, 2019-05-29cRagexe, 2019-05-29cRagexeRE, 2019-05-30aRagexe, 2019-05-30aRagexeRE, 2019-06-05JRagexeRE, 2019-06-05KRagexe, 2019-06-05LRagexeRE, 2019-06-05fRagexe, 2019-06-05hRagexeRE, 2019-06-19bRagexe, 2019-06-19cRagexeRE, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-06-26bRagexeRE, 2019-07-03aRagexe, 2019-07-03bRagexeRE, 2019-07-17aRagexe, 2019-07-17cRagexeRE, 2019-07-17dRagexe, 2019-07-17dRagexeRE, 2019-07-24aRagexe, 2019-07-24bRagexeRE, 2019-07-31bRagexe, 2019-07-31bRagexeRE, 2019-08-02aRagexe, 2019-08-02aRagexeRE, 2019-08-07aRagexe, 2019-08-07dRagexeRE, 2019-08-21aRagexe, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE, 2019-08-28aRagexe, 2019-08-28aRagexeRE, 2019-09-04aRagexe, 2019-09-04bRagexe, 2019-09-04bRagexeRE, 2019-09-18bRagexe, 2019-09-18cRagexeRE, 2019-09-25aRagexe, 2019-09-25aRagexeRE, 2019-09-25bRagexe, 2019-09-25bRagexeRE, 2019-10-02bRagexeRE, 2019-10-02cRagexe, 2019-10-02dRagexe, 2019-10-02dRagexeRE, 2019-10-02dRagexeRE_2, 2019-10-16fRagexe, 2019-10-16fRagexeRE, 2019-10-16gRagexe, 2019-10-16gRagexeRE, 2019-10-18aRagexe, 2019-10-23aRagexe, 2019-10-23aRagexeRE, 2019-10-30bRagexeRE, 2019-10-30cRagexe, 2019-11-06aRagexe, 2019-11-06bRagexeRE, 2019-11-07aRagexe, 2019-11-07aRagexeRE, 2019-11-13cRagexe, 2019-11-13eRagexe, 2019-11-13eRagexeRE, 2019-11-20aRagexe, 2019-11-20cRagexeRE, 2019-11-20dRagexe, 2019-11-27aRagexe, 2019-11-27aRagexeRE, 2019-11-27bRagexe, 2019-12-04aRagexe, 2019-12-04aRagexeRE, 2019-12-04bRagexe, 2019-12-04bRagexeRE, 2019-12-04cRagexeRE, 2019-12-11aRagexe, 2019-12-11fRagexeRE, 2019-12-18bRagexe, 2019-12-18bRagexeRE, 2019-12-24aRagexe, 2019-12-24aRagexeRE, 2019-12-24bRagexe, 2019-12-24bRagexeRE, 2020-01-08aRagexe, 2020-01-08bRagexeRE, 2020-01-22cRagexe, 2020-01-22cRagexeRE, 2020-01-29bRagexe, 2020-01-30aRagexe, 2020-02-05aRagexe, 2020-02-05aRagexeRE, 2020-02-06aRagexe, 2020-02-12aRagexe, 2020-02-12aRagexeRE, 2020-02-19dRagexe, 2020-02-19eRagexeRE, 2020-03-04aRagexe, 2020-03-04aRagexeRE, 2020-03-18bRagexe, 2020-04-01bRagexe, 2020-04-14_6aRagexe, 2020-04-14eRagexe, 2020-05-06aRagexe, 2020-05-20bRagexe, 2020-06-03aRagexe, 2020-06-17aRagexe
+// 2010-11-23aRagexeRE, 2010-11-24aRagexeRE, 2010-11-24bRagexeRE, 2010-11-25aRagexeRE, 2010-11-26aRagexeRE, 2010-11-30aRagexeRE, 2010-12-07aRagexeRE, 2010-12-14aRagexeRE, 2010-12-21aRagexeRE, 2010-12-23aRagexeRE, 2010-12-28aRagexeRE, 2011-01-04aRagexeRE, 2011-01-05aRagexeRE, 2011-01-11aRagexeRE, 2011-01-18aRagexeRE, 2011-01-25aRagexeRE, 2011-01-26aRagexeRE, 2011-01-26bRagexeRE, 2011-01-31aRagexeRE, 2011-01-31bRagexeRE, 2011-01-31cRagexeRE, 2011-02-08aRagexeRE, 2011-02-15aRagexeRE, 2011-02-22aRagexeRE, 2011-02-23aRagexeRE, 2011-02-23bRagexeRE, 2011-02-24aRagexeRE, 2011-02-25aRagexeRE, 2011-02-28aRagexeRE, 2011-03-08aRagexeRE, 2011-03-09aRagexeRE, 2011-03-09bRagexeRE, 2011-03-09cRagexeRE, 2011-03-09dRagexeRE, 2011-03-15aRagexeRE, 2011-03-22aRagexeRE, 2011-03-29aRagexeRE, 2011-03-30aRagexeRE, 2011-03-30cRagexeRE, 2011-04-05aRagexeRE, 2011-04-12aRagexeRE, 2011-04-19aRagexeRE, 2011-04-20aRagexeRE, 2011-04-26aRagexeRE, 2011-04-27aRagexeRE, 2011-05-03aRagexeRE, 2011-05-11aRagexeRE, 2011-05-17bRagexeRE, 2011-05-24aRagexeRE, 2011-05-26aRagexeRE, 2011-05-31aRagexeRE, 2011-06-07aRagexeRE, 2011-06-08aRagexeRE, 2011-06-08bRagexeRE, 2011-06-08cRagexeRE, 2011-06-09aRagexeRE, 2011-06-14bRagexeRE, 2011-06-22aRagexeRE, 2011-06-28aRagexeRE, 2011-07-06aRagexeRE, 2011-07-13aRagexeRE, 2011-07-13bRagexeRE, 2011-07-13cRagexeRE, 2011-07-19aRagexeRE, 2011-07-26aRagexeRE, 2011-08-03aRagexeRE, 2011-08-03bRagexeRE, 2011-08-10aRagexeRE, 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE, 2018-04-04bRagexe, 2018-04-04cRagexeRE, 2018-04-18aRagexe, 2018-04-18bRagexeRE, 2018-04-25cRagexe, 2018-04-25cRagexeRE, 2018-05-02bRagexe, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-16cRagexeRE, 2018-05-23aRagexe, 2018-05-23aRagexeRE, 2018-05-30aRagexe, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexe, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20cRagexe, 2018-06-20dRagexeRE, 2018-06-20eRagexe, 2018-06-20eRagexeRE, 2018-06-21aRagexe, 2018-06-21aRagexeRE, 2018-07-04aRagexe, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexe, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexe, 2018-07-18cRagexeRE, 2018-08-01cRagexe, 2018-08-01cRagexeRE, 2018-08-08bRagexe, 2018-08-08bRagexeRE, 2018-08-22cRagexe, 2018-08-22cRagexeRE, 2018-08-29aRagexe, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-12dRagexeRE, 2018-09-19aRagexe, 2018-09-19aRagexeRE, 2018-10-02aRagexe, 2018-10-02aRagexeRE, 2018-10-02bRagexe, 2018-10-02bRagexeRE, 2018-10-17_02aRagexe, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexe, 2018-10-17_03aRagexeRE, 2018-10-17bRagexe, 2018-10-17bRagexeRE, 2018-10-24bRagexe, 2018-10-31aRagexe, 2018-10-31bRagexe, 2018-10-31cRagexeRE, 2018-11-07aRagexe, 2018-11-07aRagexeRE, 2018-11-14cRagexe, 2018-11-14cRagexeRE, 2018-11-14dRagexe, 2018-11-14dRagexeRE, 2018-11-21bRagexe, 2018-11-21cRagexeRE, 2018-11-28aRagexe, 2018-11-28aRagexeRE, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-05bRagexeRE, 2018-12-12aRagexe, 2018-12-12aRagexeRE, 2018-12-12bRagexe, 2018-12-12bRagexeRE, 2018-12-19bRagexe, 2018-12-19bRagexeRE, 2018-12-26aRagexe, 2018-12-26aRagexeRE, 2019-01-09aRagexe, 2019-01-09bRagexeRE, 2019-01-16bRagexe, 2019-01-16bRagexeRE, 2019-01-16cRagexe, 2019-01-16cRagexeRE, 2019-01-23dRagexe, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-20aRagexeRE, 2019-02-27aRagexe, 2019-02-27bRagexeRE, 2019-02-28aRagexe, 2019-02-28aRagexeRE, 2019-03-06bRagexe, 2019-03-06bRagexeRE, 2019-03-06cRagexe, 2019-03-06cRagexeRE, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-20aRagexeRE, 2019-03-22aRagexe, 2019-03-22aRagexeRE, 2019-03-27bRagexe, 2019-03-27bRagexeRE, 2019-04-03aRagexe, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17aRagexe, 2019-04-17cRagexeRE, 2019-04-18aRagexe, 2019-04-18aRagexeRE, 2019-05-08cRagexe, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexe, 2019-05-22bRagexeRE, 2019-05-22cRagexe, 2019-05-22cRagexeRE, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29bRagexeRE, 2019-05-29cRagexe, 2019-05-29cRagexeRE, 2019-05-30aRagexe, 2019-05-30aRagexeRE, 2019-06-05JRagexeRE, 2019-06-05KRagexe, 2019-06-05LRagexeRE, 2019-06-05fRagexe, 2019-06-05hRagexeRE, 2019-06-19bRagexe, 2019-06-19cRagexeRE, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-06-26bRagexeRE, 2019-07-03aRagexe, 2019-07-03bRagexeRE, 2019-07-17aRagexe, 2019-07-17cRagexeRE, 2019-07-17dRagexe, 2019-07-17dRagexeRE, 2019-07-24aRagexe, 2019-07-24bRagexeRE, 2019-07-31bRagexe, 2019-07-31bRagexeRE, 2019-08-02aRagexe, 2019-08-02aRagexeRE, 2019-08-07aRagexe, 2019-08-07dRagexeRE, 2019-08-21aRagexe, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE, 2019-08-28aRagexe, 2019-08-28aRagexeRE, 2019-09-04aRagexe, 2019-09-04bRagexe, 2019-09-04bRagexeRE, 2019-09-18bRagexe, 2019-09-18cRagexeRE, 2019-09-25aRagexe, 2019-09-25aRagexeRE, 2019-09-25bRagexe, 2019-09-25bRagexeRE, 2019-10-02bRagexeRE, 2019-10-02cRagexe, 2019-10-02dRagexe, 2019-10-02dRagexeRE, 2019-10-02dRagexeRE_2, 2019-10-16fRagexe, 2019-10-16fRagexeRE, 2019-10-16gRagexe, 2019-10-16gRagexeRE, 2019-10-18aRagexe, 2019-10-23aRagexe, 2019-10-23aRagexeRE, 2019-10-30bRagexeRE, 2019-10-30cRagexe, 2019-11-06aRagexe, 2019-11-06bRagexeRE, 2019-11-07aRagexe, 2019-11-07aRagexeRE, 2019-11-13cRagexe, 2019-11-13eRagexe, 2019-11-13eRagexeRE, 2019-11-20aRagexe, 2019-11-20cRagexeRE, 2019-11-20dRagexe, 2019-11-27aRagexe, 2019-11-27aRagexeRE, 2019-11-27bRagexe, 2019-12-04aRagexe, 2019-12-04aRagexeRE, 2019-12-04bRagexe, 2019-12-04bRagexeRE, 2019-12-04cRagexeRE, 2019-12-11aRagexe, 2019-12-11fRagexeRE, 2019-12-18bRagexe, 2019-12-18bRagexeRE, 2019-12-24aRagexe, 2019-12-24aRagexeRE, 2019-12-24bRagexe, 2019-12-24bRagexeRE, 2020-01-08aRagexe, 2020-01-08bRagexeRE, 2020-01-22cRagexe, 2020-01-22cRagexeRE, 2020-01-29bRagexe, 2020-01-30aRagexe, 2020-02-05aRagexe, 2020-02-05aRagexeRE, 2020-02-06aRagexe, 2020-02-12aRagexe, 2020-02-12aRagexeRE, 2020-02-19dRagexe, 2020-02-19eRagexeRE, 2020-03-04aRagexe, 2020-03-04aRagexeRE, 2020-03-18bRagexe, 2020-04-01bRagexe, 2020-04-14_6aRagexe, 2020-04-14eRagexe, 2020-05-06aRagexe, 2020-05-20bRagexe, 2020-06-03aRagexe, 2020-06-17aRagexe, 2020-07-01bRagexe, 2020-07-01cRagexe, 2020-07-09_sakaRagexeRE, 2020-07-15bRagexe
#if PACKETVER == 20101123 || \
PACKETVER == 20101124 || \
PACKETVER == 20101125 || \
@@ -196,7 +196,10 @@
PACKETVER == 20200506 || \
PACKETVER == 20200520 || \
PACKETVER == 20200603 || \
- PACKETVER >= 20200617
+ PACKETVER == 20200617 || \
+ PACKETVER == 20200701 || \
+ PACKETVER == 20200709 || \
+ PACKETVER >= 20200715
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
diff --git a/src/map/packets_keys_zero.h b/src/map/packets_keys_zero.h
index 4a9309bca..1aa370b56 100644
--- a/src/map/packets_keys_zero.h
+++ b/src/map/packets_keys_zero.h
@@ -30,7 +30,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero, 2018-10-24_2aRagexe_zero, 2018-11-14aRagexe_zero, 2018-11-20aRagexe_zero, 2018-11-28aRagexe_zero, 2018-12-12aRagexe_zero, 2018-12-19aRagexe_zero, 2018-12-26_2aRagexe_zero, 2019-01-16_2aRagexe_zero, 2019-01-17_1aRagexe_zero, 2019-01-30_2aRagexe_zero, 2019-02-13aRagexe_zero, 2019-02-20aRagexe_zero, 2019-02-27aRagexe_zero, 2019-03-13aRagexe_zero, 2019-03-27_2aRagexe_zero, 2019-03-27_3aRagexe_zero, 2019-04-03aRagexe_zero, 2019-04-10bRagexe_zero, 2019-04-24aRagexe_zero, 2019-05-02aRagexe_zero, 2019-05-08_2aRagexe_zero, 2019-05-08aRagexe_zero, 2019-05-15aRagexe_zero, 2019-05-29aRagexe_zero, 2019-05-30aRagexe_zero, 2019-06-05_2aRagexe_zero, 2019-06-26_2aRagexe_zero, 2019-06-26_3aRagexe_zero, 2019-07-09aRagexe_zero, 2019-07-10_3aRagexe_zero, 2019-07-17aRagexe_zero, 2019-07-24aRagexe_zero, 2019-08-14_3aRagexe_zero, 2019-08-28_2aRagexe_zero, 2019-08-28_3aRagexe_zero, 2019-09-11aRagexe_zero, 2019-09-18_2aRagexe_zero, 2019-09-18aRagexe_zero, 2019-09-25_3aRagexe_zero, 2019-09-25_5aRagexe_zero, 2019-10-08_2aRagexe_zero, 2019-10-23_2aRagexe_zero, 2019-11-06aRagexe_zero, 2019-11-13aRagexe_zero, 2019-11-27_2aRagexe_zero, 2019-11-27aRagexe_zero, 2019-12-04aRagexe_zero, 2019-12-11_2aRagexe_zero, 2019-12-24_4aRagexe_zero, 2019-12-24_5aRagexe_zero, 2020-01-15_2aRagexe_zero, 2020-01-15aRagexe_zero, 2020-01-29_2aRagexe_zero, 2020-01-29aRagexe_zero, 2020-02-12aRagexe_zero, 2020-02-26aRagexe_zero, 2020-02-26bRagexe_zero, 2020-03-04aRagexe_zero, 2020-03-18_2aRagexe_zero, 2020-04-01_2aRagexe_zero, 2020-04-14bRagexe_zero, 2020-05-06aRagexe_zero, 2020-05-20_5aRagexe_zero, 2020-06-03_2aRagexe_zero, 2020-06-17aRagexe_zero
+// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero, 2018-10-24_2aRagexe_zero, 2018-11-14aRagexe_zero, 2018-11-20aRagexe_zero, 2018-11-28aRagexe_zero, 2018-12-12aRagexe_zero, 2018-12-19aRagexe_zero, 2018-12-26_2aRagexe_zero, 2019-01-16_2aRagexe_zero, 2019-01-17_1aRagexe_zero, 2019-01-30_2aRagexe_zero, 2019-02-13aRagexe_zero, 2019-02-20aRagexe_zero, 2019-02-27aRagexe_zero, 2019-03-13aRagexe_zero, 2019-03-27_2aRagexe_zero, 2019-03-27_3aRagexe_zero, 2019-04-03aRagexe_zero, 2019-04-10bRagexe_zero, 2019-04-24aRagexe_zero, 2019-05-02aRagexe_zero, 2019-05-08_2aRagexe_zero, 2019-05-08aRagexe_zero, 2019-05-15aRagexe_zero, 2019-05-29aRagexe_zero, 2019-05-30aRagexe_zero, 2019-06-05_2aRagexe_zero, 2019-06-26_2aRagexe_zero, 2019-06-26_3aRagexe_zero, 2019-07-09aRagexe_zero, 2019-07-10_3aRagexe_zero, 2019-07-17aRagexe_zero, 2019-07-24aRagexe_zero, 2019-08-14_3aRagexe_zero, 2019-08-28_2aRagexe_zero, 2019-08-28_3aRagexe_zero, 2019-09-11aRagexe_zero, 2019-09-18_2aRagexe_zero, 2019-09-18aRagexe_zero, 2019-09-25_3aRagexe_zero, 2019-09-25_5aRagexe_zero, 2019-10-08_2aRagexe_zero, 2019-10-23_2aRagexe_zero, 2019-11-06aRagexe_zero, 2019-11-13aRagexe_zero, 2019-11-27_2aRagexe_zero, 2019-11-27aRagexe_zero, 2019-12-04aRagexe_zero, 2019-12-11_2aRagexe_zero, 2019-12-24_4aRagexe_zero, 2019-12-24_5aRagexe_zero, 2020-01-15_2aRagexe_zero, 2020-01-15aRagexe_zero, 2020-01-29_2aRagexe_zero, 2020-01-29aRagexe_zero, 2020-02-12aRagexe_zero, 2020-02-26aRagexe_zero, 2020-02-26bRagexe_zero, 2020-03-04aRagexe_zero, 2020-03-18_2aRagexe_zero, 2020-04-01_2aRagexe_zero, 2020-04-14bRagexe_zero, 2020-05-06aRagexe_zero, 2020-05-20_5aRagexe_zero, 2020-06-03_2aRagexe_zero, 2020-06-17aRagexe_zero, 2020-07-01_2aRagexe_zero, 2020-07-01aRagexe_zero
#if PACKETVER == 20171018 || \
PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
@@ -115,7 +115,8 @@
PACKETVER == 20200506 || \
PACKETVER == 20200520 || \
PACKETVER == 20200603 || \
- PACKETVER >= 20200617
+ PACKETVER == 20200617 || \
+ PACKETVER >= 20200701
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
diff --git a/src/map/packets_shuffle_main.h b/src/map/packets_shuffle_main.h
index 0af118437..fc28a12a9 100644
--- a/src/map/packets_shuffle_main.h
+++ b/src/map/packets_shuffle_main.h
@@ -3345,7 +3345,7 @@
packet(0x0969,clif->pSearchStoreInfoNextPage,0);
#endif
-// 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-28bRagexe, 2018-04-04bRagexe, 2018-04-18aRagexe, 2018-04-25cRagexe, 2018-05-02bRagexe, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-23aRagexe, 2018-05-30aRagexe, 2018-06-05bRagexe, 2018-06-20cRagexe, 2018-06-20eRagexe, 2018-06-21aRagexe, 2018-07-04aRagexe, 2018-07-18bRagexe, 2018-07-18cRagexe, 2018-08-01cRagexe, 2018-08-08bRagexe, 2018-08-22cRagexe, 2018-08-29aRagexe, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-19aRagexe, 2018-10-02aRagexe, 2018-10-02bRagexe, 2018-10-17_02aRagexe, 2018-10-17_03aRagexe, 2018-10-17bRagexe, 2018-10-24bRagexe, 2018-10-31aRagexe, 2018-10-31bRagexe, 2018-11-07aRagexe, 2018-11-14cRagexe, 2018-11-14dRagexe, 2018-11-21bRagexe, 2018-11-28aRagexe, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-12aRagexe, 2018-12-12bRagexe, 2018-12-19bRagexe, 2018-12-26aRagexe, 2019-01-09aRagexe, 2019-01-16bRagexe, 2019-01-16cRagexe, 2019-01-23dRagexe, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-27aRagexe, 2019-02-28aRagexe, 2019-03-06bRagexe, 2019-03-06cRagexe, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-22aRagexe, 2019-03-27bRagexe, 2019-04-03aRagexe, 2019-04-17aRagexe, 2019-04-18aRagexe, 2019-05-08cRagexe, 2019-05-22bRagexe, 2019-05-22cRagexe, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29cRagexe, 2019-05-30aRagexe, 2019-06-05fRagexe, 2019-06-05KRagexe, 2019-06-19bRagexe, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-07-03aRagexe, 2019-07-17aRagexe, 2019-07-17dRagexe, 2019-07-24aRagexe, 2019-07-31bRagexe, 2019-08-02aRagexe, 2019-08-07aRagexe, 2019-08-21aRagexe, 2019-08-28aRagexe, 2019-09-04aRagexe, 2019-09-04bRagexe, 2019-09-18bRagexe, 2019-09-25aRagexe, 2019-09-25bRagexe, 2019-10-02cRagexe, 2019-10-02dRagexe, 2019-10-16fRagexe, 2019-10-16gRagexe, 2019-10-18aRagexe, 2019-10-23aRagexe, 2019-10-30cRagexe, 2019-11-06aRagexe, 2019-11-07aRagexe, 2019-11-13cRagexe, 2019-11-13eRagexe, 2019-11-20aRagexe, 2019-11-20dRagexe, 2019-11-27aRagexe, 2019-11-27bRagexe, 2019-12-04aRagexe, 2019-12-04bRagexe, 2019-12-11aRagexe, 2019-12-18bRagexe, 2019-12-24aRagexe, 2019-12-24bRagexe, 2020-01-08aRagexe, 2020-01-22cRagexe, 2020-01-29bRagexe, 2020-01-30aRagexe, 2020-02-05aRagexe, 2020-02-06aRagexe, 2020-02-12aRagexe, 2020-02-19dRagexe, 2020-03-04aRagexe, 2020-03-18bRagexe, 2020-04-01bRagexe, 2020-04-14_6aRagexe, 2020-04-14eRagexe, 2020-05-06aRagexe, 2020-05-20bRagexe, 2020-06-03aRagexe, 2020-06-17aRagexe
+// 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-28bRagexe, 2018-04-04bRagexe, 2018-04-18aRagexe, 2018-04-25cRagexe, 2018-05-02bRagexe, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-23aRagexe, 2018-05-30aRagexe, 2018-06-05bRagexe, 2018-06-20cRagexe, 2018-06-20eRagexe, 2018-06-21aRagexe, 2018-07-04aRagexe, 2018-07-18bRagexe, 2018-07-18cRagexe, 2018-08-01cRagexe, 2018-08-08bRagexe, 2018-08-22cRagexe, 2018-08-29aRagexe, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-19aRagexe, 2018-10-02aRagexe, 2018-10-02bRagexe, 2018-10-17_02aRagexe, 2018-10-17_03aRagexe, 2018-10-17bRagexe, 2018-10-24bRagexe, 2018-10-31aRagexe, 2018-10-31bRagexe, 2018-11-07aRagexe, 2018-11-14cRagexe, 2018-11-14dRagexe, 2018-11-21bRagexe, 2018-11-28aRagexe, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-12aRagexe, 2018-12-12bRagexe, 2018-12-19bRagexe, 2018-12-26aRagexe, 2019-01-09aRagexe, 2019-01-16bRagexe, 2019-01-16cRagexe, 2019-01-23dRagexe, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-27aRagexe, 2019-02-28aRagexe, 2019-03-06bRagexe, 2019-03-06cRagexe, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-22aRagexe, 2019-03-27bRagexe, 2019-04-03aRagexe, 2019-04-17aRagexe, 2019-04-18aRagexe, 2019-05-08cRagexe, 2019-05-22bRagexe, 2019-05-22cRagexe, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29cRagexe, 2019-05-30aRagexe, 2019-06-05fRagexe, 2019-06-05KRagexe, 2019-06-19bRagexe, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-07-03aRagexe, 2019-07-17aRagexe, 2019-07-17dRagexe, 2019-07-24aRagexe, 2019-07-31bRagexe, 2019-08-02aRagexe, 2019-08-07aRagexe, 2019-08-21aRagexe, 2019-08-28aRagexe, 2019-09-04aRagexe, 2019-09-04bRagexe, 2019-09-18bRagexe, 2019-09-25aRagexe, 2019-09-25bRagexe, 2019-10-02cRagexe, 2019-10-02dRagexe, 2019-10-16fRagexe, 2019-10-16gRagexe, 2019-10-18aRagexe, 2019-10-23aRagexe, 2019-10-30cRagexe, 2019-11-06aRagexe, 2019-11-07aRagexe, 2019-11-13cRagexe, 2019-11-13eRagexe, 2019-11-20aRagexe, 2019-11-20dRagexe, 2019-11-27aRagexe, 2019-11-27bRagexe, 2019-12-04aRagexe, 2019-12-04bRagexe, 2019-12-11aRagexe, 2019-12-18bRagexe, 2019-12-24aRagexe, 2019-12-24bRagexe, 2020-01-08aRagexe, 2020-01-22cRagexe, 2020-01-29bRagexe, 2020-01-30aRagexe, 2020-02-05aRagexe, 2020-02-06aRagexe, 2020-02-12aRagexe, 2020-02-19dRagexe, 2020-03-04aRagexe, 2020-03-18bRagexe, 2020-04-01bRagexe, 2020-04-14_6aRagexe, 2020-04-14eRagexe, 2020-05-06aRagexe, 2020-05-20bRagexe, 2020-06-03aRagexe, 2020-06-17aRagexe, 2020-07-01bRagexe, 2020-07-01cRagexe
#if PACKETVER == 20140611 || \
PACKETVER == 20150225 || \
PACKETVER == 20180315 || \
@@ -3444,7 +3444,8 @@
PACKETVER == 20200506 || \
PACKETVER == 20200520 || \
PACKETVER == 20200603 || \
- PACKETVER >= 20200617
+ PACKETVER == 20200617 || \
+ PACKETVER >= 20200701
packet(0x0202,clif->pFriendsListAdd,2);
packet(0x022d,clif->pHomMenu,2,4);
packet(0x023b,clif->pStoragePassword,0);
diff --git a/src/map/packets_shuffle_re.h b/src/map/packets_shuffle_re.h
index 46829fec1..e7ed71a3b 100644
--- a/src/map/packets_shuffle_re.h
+++ b/src/map/packets_shuffle_re.h
@@ -9618,7 +9618,7 @@
packet(0x0969,clif->pActionRequest,2,6);
#endif
-// 2018-03-21aRagexeRE, 2018-03-28bRagexeRE, 2018-04-04cRagexeRE, 2018-04-18bRagexeRE, 2018-04-25cRagexeRE, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-16cRagexeRE, 2018-05-23aRagexeRE, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20dRagexeRE, 2018-06-20eRagexeRE, 2018-06-21aRagexeRE, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexeRE, 2018-08-01cRagexeRE, 2018-08-08bRagexeRE, 2018-08-22cRagexeRE, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-09-12dRagexeRE, 2018-09-19aRagexeRE, 2018-10-02aRagexeRE, 2018-10-02bRagexeRE, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexeRE, 2018-10-17bRagexeRE, 2018-10-31cRagexeRE, 2018-11-07aRagexeRE, 2018-11-14cRagexeRE, 2018-11-14dRagexeRE, 2018-11-21cRagexeRE, 2018-11-28aRagexeRE, 2018-12-05bRagexeRE, 2018-12-12aRagexeRE, 2018-12-12bRagexeRE, 2018-12-19bRagexeRE, 2018-12-26aRagexeRE, 2019-01-09bRagexeRE, 2019-01-16bRagexeRE, 2019-01-16cRagexeRE, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-20aRagexeRE, 2019-02-27bRagexeRE, 2019-02-28aRagexeRE, 2019-03-06bRagexeRE, 2019-03-06cRagexeRE, 2019-03-20aRagexeRE, 2019-03-22aRagexeRE, 2019-03-27bRagexeRE, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17cRagexeRE, 2019-04-18aRagexeRE, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexeRE, 2019-05-22cRagexeRE, 2019-05-29bRagexeRE, 2019-05-29cRagexeRE, 2019-05-30aRagexeRE, 2019-06-05hRagexeRE, 2019-06-05JRagexeRE, 2019-06-05LRagexeRE, 2019-06-19cRagexeRE, 2019-06-26bRagexeRE, 2019-07-03bRagexeRE, 2019-07-17cRagexeRE, 2019-07-17dRagexeRE, 2019-07-24bRagexeRE, 2019-07-31bRagexeRE, 2019-08-02aRagexeRE, 2019-08-07dRagexeRE, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE, 2019-08-28aRagexeRE, 2019-09-04bRagexeRE, 2019-09-18cRagexeRE, 2019-09-25aRagexeRE, 2019-09-25bRagexeRE, 2019-10-02bRagexeRE, 2019-10-02dRagexeRE, 2019-10-02dRagexeRE_2, 2019-10-16fRagexeRE, 2019-10-16gRagexeRE, 2019-10-23aRagexeRE, 2019-10-30bRagexeRE, 2019-11-06bRagexeRE, 2019-11-07aRagexeRE, 2019-11-13eRagexeRE, 2019-11-20cRagexeRE, 2019-11-27aRagexeRE, 2019-12-04aRagexeRE, 2019-12-04bRagexeRE, 2019-12-04cRagexeRE, 2019-12-11fRagexeRE, 2019-12-18bRagexeRE, 2019-12-24aRagexeRE, 2019-12-24bRagexeRE, 2020-01-08bRagexeRE, 2020-01-22cRagexeRE, 2020-02-05aRagexeRE, 2020-02-12aRagexeRE, 2020-02-19eRagexeRE, 2020-03-04aRagexeRE
+// 2018-03-21aRagexeRE, 2018-03-28bRagexeRE, 2018-04-04cRagexeRE, 2018-04-18bRagexeRE, 2018-04-25cRagexeRE, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-16cRagexeRE, 2018-05-23aRagexeRE, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20dRagexeRE, 2018-06-20eRagexeRE, 2018-06-21aRagexeRE, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexeRE, 2018-08-01cRagexeRE, 2018-08-08bRagexeRE, 2018-08-22cRagexeRE, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-09-12dRagexeRE, 2018-09-19aRagexeRE, 2018-10-02aRagexeRE, 2018-10-02bRagexeRE, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexeRE, 2018-10-17bRagexeRE, 2018-10-31cRagexeRE, 2018-11-07aRagexeRE, 2018-11-14cRagexeRE, 2018-11-14dRagexeRE, 2018-11-21cRagexeRE, 2018-11-28aRagexeRE, 2018-12-05bRagexeRE, 2018-12-12aRagexeRE, 2018-12-12bRagexeRE, 2018-12-19bRagexeRE, 2018-12-26aRagexeRE, 2019-01-09bRagexeRE, 2019-01-16bRagexeRE, 2019-01-16cRagexeRE, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-20aRagexeRE, 2019-02-27bRagexeRE, 2019-02-28aRagexeRE, 2019-03-06bRagexeRE, 2019-03-06cRagexeRE, 2019-03-20aRagexeRE, 2019-03-22aRagexeRE, 2019-03-27bRagexeRE, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17cRagexeRE, 2019-04-18aRagexeRE, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexeRE, 2019-05-22cRagexeRE, 2019-05-29bRagexeRE, 2019-05-29cRagexeRE, 2019-05-30aRagexeRE, 2019-06-05hRagexeRE, 2019-06-05JRagexeRE, 2019-06-05LRagexeRE, 2019-06-19cRagexeRE, 2019-06-26bRagexeRE, 2019-07-03bRagexeRE, 2019-07-17cRagexeRE, 2019-07-17dRagexeRE, 2019-07-24bRagexeRE, 2019-07-31bRagexeRE, 2019-08-02aRagexeRE, 2019-08-07dRagexeRE, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE, 2019-08-28aRagexeRE, 2019-09-04bRagexeRE, 2019-09-18cRagexeRE, 2019-09-25aRagexeRE, 2019-09-25bRagexeRE, 2019-10-02bRagexeRE, 2019-10-02dRagexeRE, 2019-10-02dRagexeRE_2, 2019-10-16fRagexeRE, 2019-10-16gRagexeRE, 2019-10-23aRagexeRE, 2019-10-30bRagexeRE, 2019-11-06bRagexeRE, 2019-11-07aRagexeRE, 2019-11-13eRagexeRE, 2019-11-20cRagexeRE, 2019-11-27aRagexeRE, 2019-12-04aRagexeRE, 2019-12-04bRagexeRE, 2019-12-04cRagexeRE, 2019-12-11fRagexeRE, 2019-12-18bRagexeRE, 2019-12-24aRagexeRE, 2019-12-24bRagexeRE, 2020-01-08bRagexeRE, 2020-01-22cRagexeRE, 2020-02-05aRagexeRE, 2020-02-12aRagexeRE, 2020-02-19eRagexeRE, 2020-03-04aRagexeRE, 2020-07-09_sakaRagexeRE
#if PACKETVER == 20180321 || \
PACKETVER == 20180328 || \
PACKETVER == 20180404 || \
@@ -9702,7 +9702,8 @@
PACKETVER == 20200205 || \
PACKETVER == 20200212 || \
PACKETVER == 20200219 || \
- PACKETVER >= 20200304
+ PACKETVER == 20200304 || \
+ PACKETVER >= 20200709
packet(0x0202,clif->pFriendsListAdd,2);
packet(0x022d,clif->pHomMenu,2,4);
packet(0x023b,clif->pStoragePassword,0);
diff --git a/src/map/packets_shuffle_zero.h b/src/map/packets_shuffle_zero.h
index 26b35c853..5ff03b264 100644
--- a/src/map/packets_shuffle_zero.h
+++ b/src/map/packets_shuffle_zero.h
@@ -37,7 +37,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero, 2018-10-24_2aRagexe_zero, 2018-11-14aRagexe_zero, 2018-11-20aRagexe_zero, 2018-11-28aRagexe_zero, 2018-12-12aRagexe_zero, 2018-12-19aRagexe_zero, 2018-12-26_2aRagexe_zero, 2019-01-16_2aRagexe_zero, 2019-01-17_1aRagexe_zero, 2019-01-30_2aRagexe_zero, 2019-02-13aRagexe_zero, 2019-02-20aRagexe_zero, 2019-02-27aRagexe_zero, 2019-03-13aRagexe_zero, 2019-03-27_2aRagexe_zero, 2019-03-27_3aRagexe_zero, 2019-04-03aRagexe_zero, 2019-04-10bRagexe_zero, 2019-04-24aRagexe_zero, 2019-05-02aRagexe_zero, 2019-05-08_2aRagexe_zero, 2019-05-08aRagexe_zero, 2019-05-15aRagexe_zero, 2019-05-29aRagexe_zero, 2019-05-30aRagexe_zero, 2019-06-05_2aRagexe_zero, 2019-06-26_2aRagexe_zero, 2019-06-26_3aRagexe_zero, 2019-07-09aRagexe_zero, 2019-07-10_3aRagexe_zero, 2019-07-17aRagexe_zero, 2019-07-24aRagexe_zero, 2019-08-14_3aRagexe_zero, 2019-08-28_2aRagexe_zero, 2019-08-28_3aRagexe_zero, 2019-09-11aRagexe_zero, 2019-09-18_2aRagexe_zero, 2019-09-18aRagexe_zero, 2019-09-25_3aRagexe_zero, 2019-09-25_5aRagexe_zero, 2019-10-08_2aRagexe_zero, 2019-10-23_2aRagexe_zero, 2019-11-06aRagexe_zero, 2019-11-13aRagexe_zero, 2019-11-27_2aRagexe_zero, 2019-11-27aRagexe_zero, 2019-12-04aRagexe_zero, 2019-12-11_2aRagexe_zero, 2019-12-24_4aRagexe_zero, 2019-12-24_5aRagexe_zero, 2020-01-15_2aRagexe_zero, 2020-01-15aRagexe_zero, 2020-01-29_2aRagexe_zero, 2020-01-29aRagexe_zero, 2020-02-12aRagexe_zero, 2020-02-26aRagexe_zero, 2020-02-26bRagexe_zero, 2020-03-04aRagexe_zero, 2020-03-18_2aRagexe_zero, 2020-04-01_2aRagexe_zero, 2020-04-14bRagexe_zero, 2020-05-06aRagexe_zero, 2020-05-20_5aRagexe_zero, 2020-06-03_2aRagexe_zero, 2020-06-17aRagexe_zero
+// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero, 2018-10-24_2aRagexe_zero, 2018-11-14aRagexe_zero, 2018-11-20aRagexe_zero, 2018-11-28aRagexe_zero, 2018-12-12aRagexe_zero, 2018-12-19aRagexe_zero, 2018-12-26_2aRagexe_zero, 2019-01-16_2aRagexe_zero, 2019-01-17_1aRagexe_zero, 2019-01-30_2aRagexe_zero, 2019-02-13aRagexe_zero, 2019-02-20aRagexe_zero, 2019-02-27aRagexe_zero, 2019-03-13aRagexe_zero, 2019-03-27_2aRagexe_zero, 2019-03-27_3aRagexe_zero, 2019-04-03aRagexe_zero, 2019-04-10bRagexe_zero, 2019-04-24aRagexe_zero, 2019-05-02aRagexe_zero, 2019-05-08_2aRagexe_zero, 2019-05-08aRagexe_zero, 2019-05-15aRagexe_zero, 2019-05-29aRagexe_zero, 2019-05-30aRagexe_zero, 2019-06-05_2aRagexe_zero, 2019-06-26_2aRagexe_zero, 2019-06-26_3aRagexe_zero, 2019-07-09aRagexe_zero, 2019-07-10_3aRagexe_zero, 2019-07-17aRagexe_zero, 2019-07-24aRagexe_zero, 2019-08-14_3aRagexe_zero, 2019-08-28_2aRagexe_zero, 2019-08-28_3aRagexe_zero, 2019-09-11aRagexe_zero, 2019-09-18_2aRagexe_zero, 2019-09-18aRagexe_zero, 2019-09-25_3aRagexe_zero, 2019-09-25_5aRagexe_zero, 2019-10-08_2aRagexe_zero, 2019-10-23_2aRagexe_zero, 2019-11-06aRagexe_zero, 2019-11-13aRagexe_zero, 2019-11-27_2aRagexe_zero, 2019-11-27aRagexe_zero, 2019-12-04aRagexe_zero, 2019-12-11_2aRagexe_zero, 2019-12-24_4aRagexe_zero, 2019-12-24_5aRagexe_zero, 2020-01-15_2aRagexe_zero, 2020-01-15aRagexe_zero, 2020-01-29_2aRagexe_zero, 2020-01-29aRagexe_zero, 2020-02-12aRagexe_zero, 2020-02-26aRagexe_zero, 2020-02-26bRagexe_zero, 2020-03-04aRagexe_zero, 2020-03-18_2aRagexe_zero, 2020-04-01_2aRagexe_zero, 2020-04-14bRagexe_zero, 2020-05-06aRagexe_zero, 2020-05-20_5aRagexe_zero, 2020-06-03_2aRagexe_zero, 2020-06-17aRagexe_zero, 2020-07-01_2aRagexe_zero, 2020-07-01aRagexe_zero
#if PACKETVER == 20171018 || \
PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
@@ -122,7 +122,8 @@
PACKETVER == 20200506 || \
PACKETVER == 20200520 || \
PACKETVER == 20200603 || \
- PACKETVER >= 20200617
+ PACKETVER == 20200617 || \
+ PACKETVER >= 20200701
packet(0x0202,clif->pFriendsListAdd,2);
packet(0x022d,clif->pHomMenu,2,4);
packet(0x023b,clif->pStoragePassword,0);
diff --git a/src/map/pc.c b/src/map/pc.c
index 242c43ba3..9cd04c96f 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -7296,8 +7296,8 @@ static bool pc_gainexp(struct map_session_data *sd, struct block_list *src, uint
if(sd->state.showexp) {
char output[256];
sprintf(output,
- msg_sd(sd, 889), // Experience Gained Base:%"PRIu64" (%.2f%%) Job:%"PRIu64" (%.2f%%)
- base_exp, nextbp * (float)100, job_exp, nextjp * (float)100);
+ msg_sd(sd, 889), // Experience Gained Base:%llu (%.2f%%) Job:%llu (%.2f%%)
+ (unsigned long long)base_exp, nextbp * 100.0f, (unsigned long long)job_exp, nextjp * 100.0f);
clif_disp_onlyself(sd, output);
}
diff --git a/src/map/script.c b/src/map/script.c
index b49844320..9372299bb 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -11272,7 +11272,8 @@ static BUILDIN(gettimetick)
case 0:
default:
//type 0:(System Ticks)
- script_pushint(st,(int)timer->gettick()); // TODO: change this to int64 when we'll support 64 bit script values
+ // Conjunction with INT_MAX is done to prevent overflow. (Script variables are signed integers.)
+ script_pushint(st, timer->gettick() & INT_MAX); // TODO: change this to int64 when we'll support 64 bit script values
break;
}
return true;
@@ -14045,6 +14046,7 @@ static BUILDIN(getmapflag)
case MF_PAIRSHIP_ENDABLE: script_pushint(st, map->list[m].flag.pairship_endable); break;
case MF_NOSTORAGE: script_pushint(st, map->list[m].flag.nostorage); break;
case MF_NOGSTORAGE: script_pushint(st, map->list[m].flag.nogstorage); break;
+ case MF_NOPET: script_pushint(st, map->list[m].flag.nopet); break;
}
}
@@ -14177,6 +14179,7 @@ static BUILDIN(setmapflag)
case MF_PAIRSHIP_ENDABLE: map->list[m].flag.pairship_endable = 1; break;
case MF_NOSTORAGE: map->list[m].flag.nostorage = cap_value(val, 0, 3); break;
case MF_NOGSTORAGE: map->list[m].flag.nogstorage = cap_value(val, 0, 3); break;
+ case MF_NOPET: map->list[m].flag.nopet = 1; break;
}
}
@@ -14270,6 +14273,7 @@ static BUILDIN(removemapflag)
case MF_NOVIEWID: map->list[m].flag.noviewid = EQP_NONE; break;
case MF_NOSTORAGE: map->list[m].flag.nostorage = 0; break;
case MF_NOGSTORAGE: map->list[m].flag.nogstorage = 0; break;
+ case MF_NOPET: map->list[m].flag.nopet = 0; break;
}
}
diff --git a/src/map/script.h b/src/map/script.h
index 4bf8c436b..60f403d2d 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -345,7 +345,8 @@ enum {
MF_PAIRSHIP_STARTABLE,
MF_PAIRSHIP_ENDABLE,
MF_NOSTORAGE,
- MF_NOGSTORAGE
+ MF_NOGSTORAGE,
+ MF_NOPET,
};
enum navigation_service {
diff --git a/src/map/skill.c b/src/map/skill.c
index 17721caff..c2a336d7e 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1649,11 +1649,15 @@ static int skill_additional_effect(struct block_list *src, struct block_list *bl
if( pc_iswug(sd) && (temp=pc->checkskill(sd,RA_WUGSTRIKE)) > 0 && rnd()%1000 <= sstatus->luk*3 )
skill->castend_damage_id(src,bl,RA_WUGSTRIKE,temp,tick,0);
// Gank
- if(dstmd && sd->weapontype != W_BOW &&
- (temp=pc->checkskill(sd,RG_SNATCHER)) > 0 &&
- (temp*15 + 55) + pc->checkskill(sd,TF_STEAL)*10 > rnd()%1000) {
- if(pc->steal_item(sd,bl,pc->checkskill(sd,TF_STEAL)))
- clif->skill_nodamage(src,bl,TF_STEAL,temp,1);
+ if (dstmd && sd->weapontype != W_BOW &&
+ (temp = pc->checkskill(sd, RG_SNATCHER)) > 0 &&
+#ifdef RENEWAL
+ (temp * 10) + pc->checkskill(sd, TF_STEAL) * 10 > rnd() % 1000) {
+#else
+ (temp * 15 + 55) + pc->checkskill(sd, TF_STEAL) * 10 > rnd() % 1000) {
+#endif
+ if (pc->steal_item(sd, bl, pc->checkskill(sd, TF_STEAL)))
+ clif->skill_nodamage(src, bl, TF_STEAL, temp, 1);
else
clif->skill_fail(sd, RG_SNATCHER, USESKILL_FAIL_LEVEL, 0, 0);
}